PS3 [Research] Modifying the Coldboot/Gameboot Sequence (custom_render_plugin.sprx/rco)

I think the example you wrote is mostly the same i said, the difference is the delays you use can "prevent" an overlapping of animations, but if you short the dealys is pretty much the same
Code:
<Animation name="Main_Control">
<FireEvent object="anim:play_coldboot" />
<Delay time="20" />
<FireEvent object="anim:fade_wave" />
etc
etc
<FireEvent object="anim:xmb_loop" />
</Animation>
Lets say... if the "play_coldboot" have a lenght of 3 seconds it starts playing, and 20 centiseconds after it plays the "fade_wave"
At that point you have "play_coldboot" and "fade_wave" playing together

Btw, and i just realized incase this works is needed to have a good control of times, because it could happen that the line with the loop is loaded before is finished the previous animations (so you miss the end of them), not a big problem but i guess is going to happen like that :D
 
Something off topic but related:

Q-Games the makers of the XMB, Wave and visualization released an application for the PS3 that adds 24 music visualizers. These were originally available in the Pixeljunk 4AM game but then were released as a standalone application.


More info:
https://www.shacknews.com/article/80562/pixeljunk-4am-visualizers-getting-standalone-ps3-app

Anyway I decided to get this application to have a look at it, and its super interesting. :)

For example, it seems to use the exact same system as the XMB animations. For example there are files like this which looks the same as the debugGUI I was looking for in the ps3 FW:

upload_2019-9-19_15-27-14.png

Also all the same stuff seem to be used in other places too:

upload_2019-9-19_15-29-28.png



If you read the comments on here: https://blog.us.playstation.com/2013/08/08/new-ps3-visualizer-app-from-q-games-out-tuesday/ you will see that one of the guys from Q-Games answers a few questions (which is cool to see), even saying that they talked with Sony about integrating those visualizations into the PS3 FW, but Sony were not into it.

James Mielke (Q-Games) said:
08/08/2013 at 8:13 pm
We explored the possibility with SCEI (global headquarters) about such integration, but it was determined by the powers that be that Visualizer should be released as a standalone app. Although it is a music app, it will actually appear in the 'Game' category of the XMB bar, and you activate it as you would any other downloadable game. Once Visualizer has started, you can access your music library and play music just as you would with the built-in music player.
No idea why they did not release it as an app to install to the music category? That is where I moved it to :)

Anyway when I look more at the application, it seems like we might have a lot of control over this app. There are lots of things that are similar to the PS3 FW, see the particle files etc.
upload_2019-9-19_15-33-18.png

But it gets even more interesting: There are hundreds of these scripts in plain text, gamemonkey scripts I think. It looks like C or something. Its almost like the source code to all the visualizations is just there in plain text.

Some examples of gm files, there are toness of em, maybe hundreds, i have attached a few examples of the scripts.
Code:
//Devgui child
//Devgui
global g_devgui_layout = {};
global DevGuiMngLayout = function(_Name,_Func)
{     
    local opened = ?g_devgui_layout[_Name];
    local new_value = Q.SIMGUICheckBox( opened, _Name );
    if (new_value != opened)
    {
        if (opened)
        {
            g_devgui_layout[_Name].Release();
            g_devgui_layout[_Name] = null;
        }
        else
        {
            local layout = _Func();
            g_devgui_layout[_Name] = layout;
            layout.SetName(_Name);
            layout.EnableTitle( true );
        }
    }
};
global DevGuiDump = function()
{
DevGuiMngLayout(
        "HDR Param",
        function() { return Q.NewLayout( 80, 80, 700, 500, null, g_hdr_gui.Param.draw ); }
    );
/*
    DevGuiMngLayout(
        "Camera",
         function() { return Q.NewLayout(120,120,500,200,null,g_camera_gui); }
    );
*/
/*
DevGuiMngLayout(
        "Rumble Editor",
        function() { return Q.NewLayout(300,120,500,500,null,g_rumble_debug_gui); }
    );
*/
/*
if( Q.SIMGUIButton("GmDebugEntry") )
{
g_devgui_layout["GmDebugEntry"] = Q.NewLayout(120,120,300,300,null,GmDebugEntry);
g_devgui_layout["GmDebugEntry"].EnableCloseButton( true );
g_devgui_layout["GmDebugEntry"].EnableDebuggerLayout( true );
}
*/
//  HDRMenu(this);
};
Code:
/**
 * game_data.gm
 * @author paolo
 * @date   2008/12/16
 * @brief  Put here all the tables and global game variables
 */
//-------------------------------------------------------------
// In game
//-------------------------------------------------------------
//-------------------------------------------------------------
// Temp global, this is a table used to store temp global data,
// use it as you want
// it is good to avoid forgotten global variables everywhere
//-------------------------------------------------------------
global g_temp_globals = {};
//-------------------------------------------------------------
// Game parameters
//-------------------------------------------------------------
local load_params = function( a_filename )
{
system.Compile( g_script_path + "game_settings/" + a_filename, true );
WaitInit( a_filename );
return GetInitResult_Cleanup( a_filename );
};
//-------------------------------------------------------------
// Game global data
//-------------------------------------------------------------
global g_global_info =
{
    savefile_version_hi = 1,
    savefile_version_lo = 0,
    online = false,          // if true the user want go online
save_trigger = false,
save_valid_user = false,
bus_settings = {},
dsp_variation_list = {},
// Current active event list
event_list = {},
event_list_filename = "",
// PLAY SET event list
performance_event_list = {},
performance_event_list_planet_randoms = {},
performance_event_name_to_index = {},
    performance_event_list_filename = "",
visualizer_list = array(),
visualizer_list_by_planet = {},
visualizer_planet_list = array_int(),
visualizer_planet_variation_list = {},
visualizer_planet_key = {},
// parameters
params_gem_rumble = load_params( "params_gem_rumble.gm" ),
params_inputs = load_params( "params_inputs.gm" ),
params_menu = load_params( "params_menu.gm" ),
params_visualizer = load_params( "params_visualizer.gm" ),
    // saved start
    music_volume = 10,
    sfx_volume = 10,
    screen_size = 100,
    no_burn = false,
    eula_ok = g_FORCE_EULA_OK,
app_version = "01.00",
    // saved end
// Call by mainstate.gm
Release = function()
{
threadKillAll( this );
},
    // called when an option is changed
    NotifyChanged = function()
    {
        .TriggerEvent("CHANGED",this);
        local sfx_volume = clamp( 0.f, .sfx_volume/10.f, 1.f );
        local music_volume = clamp( 0.f, .music_volume/10.f, 1.f );
g_sound_mng.SetupUserVolumes( sfx_volume, music_volume );
        Q.SetWindowRescale( .screen_size/100.0f );
    },
////////////////////////////////////////////////////
// Event list
SetEventDefaultValues = function( a_event )
{
a_event.name ?= "";
a_event.unlock_list ?= {};
a_event.planet_list ?= {};
a_event.planet_random ?= false;
a_event.fadein_effect ?= false;
a_event.ambient ?= "";
a_event.dsp_preset ?= 0;
a_event.k_move_knob_mx ?= 0.0f;  a_event.k_move_knob_my ?= 0.0f;  a_event.k_move_knob_mz ?= 0.0f;  a_event.k_move_knob_mrz ?= 0.0f;
a_event.b_move_knob_mx ?= 0.0f;  a_event.b_move_knob_my ?= 0.0f;  a_event.b_move_knob_mz ?= 0.0f;  a_event.b_move_knob_mrz ?= 0.0f;
a_event.h_move_knob_mx ?= 0.0f;  a_event.h_move_knob_my ?= 0.0f;  a_event.h_move_knob_mz ?= 0.0f;  a_event.h_move_knob_mrz ?= 0.0f;
a_event.s_move_knob_mx ?= 0.0f;  a_event.s_move_knob_my ?= 0.0f;  a_event.s_move_knob_mz ?= 0.0f;  a_event.s_move_knob_mrz ?= 0.0f;
},
SetEventPlanetDefaultValues = function( a_planet )
{
a_planet.type ?= 0;
a_planet.variation ?= 0;
a_planet.fade_color ?= vector4( 1.0f );
// Overwrite planet song
a_planet.overwrite_song_enable ?= false;
a_planet.overwrite_song ?= null;
// -2: no setting, -1: random
a_planet.tracks ?= array
(
{ stem = -2 },
{ stem = -2 },
{ stem = -2 },
{ stem = -2 }
);
},
GenerateDefaultEvent = function()
{
local event = {};
.SetEventDefaultValues( event );
return event;
},
GenerateDefaultEventPlanet = function()
{
local planet = {};
.SetEventPlanetDefaultValues( planet );
return planet;
},
LoadEventList = function( a_filename )
{
local path = "/datacom/" + a_filename + ".gm";
if( Q.FileExists( path ) )
{
local result = system.Compile( path, module_debug );
@@assert( result );
WaitInit( a_filename );
local load_event_list = GetInitResult_Cleanup( a_filename );
@@assert( ?load_event_list );
.performance_event_list = {};
.performance_event_list_planet_randoms = {};
.performance_event_name_to_index = {};
foreach( index and event in load_event_list )
{
.SetEventDefaultValues( event );
@@assert( event.name != "" );
@@assert( !?.performance_event_name_to_index[ event.name ] );
.performance_event_name_to_index[ event.name ] = index;
foreach( planet in event.planet_list )
{
.SetEventPlanetDefaultValues( planet );
}
.performance_event_list[ index ] = event;
if( event.planet_random )
{
.performance_event_list_planet_randoms[ event.name ] = event.name;
}
}
.performance_event_list_filename = a_filename;
// Initialize active event list
.event_list = .performance_event_list;
.event_list_filename = .performance_event_list_filename;
._MakeEventFallback();
}
},
SaveEventList = function( a_filename )
{
local path = "/datacom/" + a_filename + ".gm";
local result = CreateGMFile( path, a_filename, .event_list, null );
@@assert( result );
},
GetEventPlanetName = function( a_event, a_planet_index )
{
local event = .GetEventSafe( a_event );
@@assert( ?event.planet_list[ a_planet_index ] );
return "MASTER_0" + ( event.planet_list[ a_planet_index ].type + 1 );
},
GetEventSafe = function( a_event )
{
a_event ?= -1; // To fallback
local event = .event_list[ a_event ];
event ?= .event_fallback;
return event;
},
GetEventPlanetSafe = function( a_event, a_planet_index )
{
a_planet_index ?= -1; // To fallback
local event = .GetEventSafe( a_event );
local planet = event.planet_list[ a_planet_index ];
planet ?= .event_fallback.planet_list[0];
return planet;
},
GetEventNumPlanets = function( a_event )
{
local event = .GetEventSafe( a_event );
return tableCount( event.planet_list );
},
GetEventIndex = function( a_event_name )
{
local event_list = .event_list;
local event_size = tableCount( event_list );
foreach ( i within 0, event_size )
{
if ( event_list[i].name != a_event_name )
{
continue;
}
return i;
}
return -1;
},
_MakeEventFallback = function()
{
// Base event is first, and all planet selectable.
.event_fallback = TableDuplicateAll( .event_list[0] );
local planet_list = {};
foreach( i within 0, g_MASTER_PLANET_MAX )
{
planet_list[i] = {};
planet_list[i].type = i;
.SetEventPlanetDefaultValues( planet_list[i] );
}
.event_fallback.name = "Fallback";
.event_fallback.planet_list = planet_list;
},
// Visualizer
GenerateVisualizerList = function()
{
local planet_key =
{
1 = "PLANET_HAIR",
2 = "PLANET_KORG",
3 = "PLANET_VORONOI",
4 = "PLANET_ODYSSEY",
5 = "PLANET_BOIDS",
6 = "PLANET_CLASSIC",
};
.visualizer_planet_key = planet_key;
local planet_order =
{
6, 1, 2, 3, 5, 4,
};
local list_by_planet = {};
foreach( event_index and event in .event_list )
{
foreach( planet_index and planet in event.planet_list )
{
list_by_planet[ planet.type ] ?= {};
local list_by_variation = list_by_planet[ planet.type ];
list_by_variation[ planet.variation ] ?=
{
event_index = event_index,
event_planet_index = planet_index,
thumbnail_name = format( "THUMBNAIL_%d_%d", ( planet.type + 1 ), planet.variation ),
visualizer_index = null,
text_key = null,
};
}
}
.visualizer_list_by_planet = list_by_planet;
// Sort
local visualizer_list = array();
local planet_list = array_int();
local planet_variation_list = {};
foreach( type in planet_order )
{
planet_list.PushBack( type );
planet_variation_list[ type ] = array_int();
local list_by_variation = list_by_planet[ type ];
local variation_number = 1;
foreach( variation and data in list_by_variation )
{
data.text_key = planet_key[ type ] + variation_number;
data.visualizer_index = visualizer_list.Size();
visualizer_list.PushBack( data );
variation_number += 1;
planet_variation_list[ type ].PushBack( variation );
}
}
.visualizer_list = visualizer_list;
.visualizer_planet_list = planet_list;
.visualizer_planet_variation_list = planet_variation_list;
/@@
print( "" );
print( "Visualizer list - raw" );
foreach( type and list_by_variation in list_by_planet )
{
foreach( variation and data in list_by_variation )
{
local text = format( "planet %d-%d = { event_index = %d, event_planet_index = %d, thumbnail_name = %s, text_key = %s }", type, variation, data.event_index, data.event_planet_index, data.thumbnail_name, data.text_key );
print( text );
}
}
print( "" );
print( "Visualizer list - ordered" );
foreach( index and data in visualizer_list )
{
local text = format( "%02d: %s = { event_index = %d, event_planet_index = %d, thumbnail_name = %s }", index, data.text_key, data.event_index, data.evebt_planet_index, data.thumbnail_name );
print( text );
}
print( "" );
@@/
},
};
foreach ( track in TrackAlphabetMaster )
{
g_global_info.bus_settings[] = { track = track, bus = {} };
}
global g_4am_Green = g_global_info.params_menu._common_color._4am_Green;
global g_4am_White = g_global_info.params_menu._common_color._4am_White;
global g_4am_CommonMessageColor = g_global_info.params_menu._common_color._4am_CommonMessageColor;
AddEventManager( g_global_info );
global LoadDspVariationList = function()
{
if( Q.FileExists( "/datacom/dsp_variation_list.gm" ) )
{
local result = system.Compile( "/datacom/dsp_variation_list.gm", module_debug );
@@assert( result );
WaitInit( "dsp_variation_list" );
g_global_info.dsp_variation_list = GetInitResult_Cleanup( "dsp_variation_list" );
@@assert( ?g_global_info.dsp_variation_list );
}
};
global SaveDspVariationList = function()
{
local result = CreateGMFile( "/datacom/dsp_variation_list.gm", "dsp_variation_list", g_global_info.dsp_variation_list, null );
@@assert( result );
};
LoadDspVariationList();
global LoadDspBusSettings = function()
{
if( Q.FileExists( "/datacom/dsp_bus_settings.gm" ) )
{
local result = system.Compile( "/datacom/dsp_bus_settings.gm", module_debug );
@@assert( result );
WaitInit( "dsp_bus_settings" );
g_global_info.bus_settings = GetInitResult_Cleanup( "dsp_bus_settings" );
@@assert( ?g_global_info.bus_settings );
}
};
global SaveDspBusSettings = function()
{
local result = CreateGMFile( "/datacom/dsp_bus_settings.gm", "dsp_bus_settings", g_global_info.bus_settings, null );
@@assert( result );
};
LoadDspBusSettings();
g_global_info.LoadEventList( g_TARGET_EVENT_LIST );
g_global_info.GenerateVisualizerList();
// Ingame config from menu
global CreateGameSettings = function()
{
local GameSettings = {};
GameSettings.Reset = function()
{
.player_max = g_PLAYER_MAX;
.event_index = null;
.event_planet_index = null;
.event_planet_index_extracted = null;
.pause = false;
.visualizer_index = 0;
.visualizer_menu_visible = false;
.visualizer_planet_type = -1;
.visualizer_planet_variation = -1;
.visualizer_planet_variation_history = {};
.visualizer_planet_history = array_int();
.visualizer_planet_history_max = 3;
};
GameSettings.IsExistInPlanetHistory = function( a_planet_type )
{
foreach( planet_type in .visualizer_planet_history )
{
if( planet_type == a_planet_type )
{
return true;
}
}
return false;
};
GameSettings.DebugPlanetHistory = function()
{
/@@
foreach( index and planet_type in .visualizer_planet_history )
{
print( format( "%d: %s", index, g_global_info.visualizer_planet_key[ planet_type ] ) );
}
@@/
};
GameSettings.Reset();
return GameSettings;
};
global g_game_settings = CreateGameSettings();

Code:
/**
 * GM_code_generator.gm
 * @author paolo
 * @date   2008/11/07
 * @brief  Generate GM source code!
 */
// Note: this is a memory hog. We'd like to be able to save levels on the PS3 if possible, so this is slightly optimized to reduce
// the amount of unnecessary string re-allocations.
// - eg: Push( constant ); Push( string ) is preferred to Push( constant+string )
global g_compressed_code = false;   // flag to turn one the compressed mode, not really readable
global g_code_ident_table = {};
global CodeIdent = function( _Indent )
{
    if (g_compressed_code)
    {
        return "";
    }
    _Indent ?= 0;
    if ( !?g_code_ident_table[ _Indent ] )
    {
        local text = "\n";
        foreach( i within 0, _Indent/4 )
        {
            text += "\t";
        }
        foreach( i within 0, _Indent%4 )
        {
            text += " ";
        }
g_code_ident_table[ _Indent ] = text;
        return text;
}
return g_code_ident_table[ _Indent ];
};
global CodeVector3 = function( _Vec, _Indent, a_file )
{ 
    a_file.PushRawText( _Vec.String() );
};
global CodeVector4 = function( _Vec, _Indent, a_file )
{
    a_file.PushRawText( _Vec.String() );
};
global CodeArrayTypesToName = {};
CodeArrayTypesToName[ typeId( array() ) ] = "array";
CodeArrayTypesToName[ typeId( array_int() ) ] = "array_int";
CodeArrayTypesToName[ typeId( array_float() ) ] = "array_float";
global CodeArray = function( _object, _Indent, a_file )
{
    _Indent ?= 0;
    if ( ?_object )
    {
        local size = _object.Size();
        //assert( size > 1 || ( size == 1 && _object[ 0 ] != typeId( 0 ) ) );    // FIXME: Because of the array(size) vs array(data,data,data,...) syntax, for 1 element array we need to output different code.
local type_name = CodeArrayTypesToName[ typeId( _object ) ];
@@assert( ?type_name );
        a_file.PushRawText( type_name );
a_file.PushRawText( "( " );
        local indent = _Indent + 4;
    foreach ( i within 0, size )
        {
            if ( i != 0 )
            {
                a_file.PushRawText( "," );
            }
            CodeForObject( _object[ i ], indent, a_file );
        }
        a_file.PushRawText( " )" );
    }
    else
    {
        a_file.PushRawText( "null" );
    }
};
/*global g_nest_checker =
{
level = 0,
Print = function( _String )
{
foreach ( i within 0, .level ) { _String = "  " + _String; }
print( _String );
},
In = function( )
{
.Print( "Nest in : level = " + .level );
.level += 1;
},
Out = function( )
{
.level -= 1;
.Print( "Nest out: level = " + .level );
},
};*/
global CodeTable = function( _object, _Indent, a_file )
{
    _Indent ?= 0;
    if ( ?_object )
    {
//g_nest_checker.In( );
a_file.PushRawText( CodeIdent( _Indent ) );
        a_file.PushRawText( "{" );
local indent = _Indent + 4;
local indent_string = CodeIdent( indent );
        // check if it is a ordered table
local ordered = TableIsOrdered( _object );
        if ( ordered )
        {
// Note: We can't use foreach here, because the runtime order may not match!
// Consider the following scenario:
//    t = { 1="yyy", 2="zzz" };
//    t[0] = "xxx";
// The table is "ordered" for foreach will iterate 1,2,0
foreach ( index within 0,tableCount( _object ) )
            {
local obj = _object[ index ];
                a_file.PushRawText( indent_string );
                CodeForObject( obj, indent, a_file );
                a_file.PushRawText( "," );
                //a_file.PushRawText( indent_string );
            }
        }
        else
        {
// sort keys by their name, because we want deterministic saving (for SVN, etc.)
//foreach( key and obj in _object )
local keys_sorted = TableGetKeysSortedByName( _object );
foreach ( index within 0,keys_sorted.Size() )
{
local key = keys_sorted[ index ];
local obj = _object[ key ];
//local test_flag = g_nest_checker.level == 1 && typeId( obj ) == typeId( table( ) );
//if ( test_flag ) { g_nest_checker.Print( "DUMPING TABLE BEGIN" ); }
                a_file.PushRawText( indent_string );
if ( IsAString( key ) && ( key.FindChars(" -+/*\\\'.\"") != 0 || ( key[0] >= '0' && key[0] <= '9' ) ) )
                {
                    a_file.PushRawText( "\"" );
                    a_file.PushRawText( Q.AsString(key) );
                    a_file.PushRawText( "\"" );
                }
                else
                {
                    a_file.PushRawText( Q.AsString(key) );
                }
                a_file.PushRawText( " = " );
                CodeForObject( obj,indent, a_file );
                a_file.PushRawText( "," );
//if ( test_flag ) { g_nest_checker.Print( "DUMPING TABLE END" ); }
            }
        }
a_file.PushRawText( CodeIdent( _Indent ) );
a_file.PushRawText( "}" );
//g_nest_checker.Out( );
    }
    else
    {
        return "null";
    }
};
global CodeInt = function( _Int, _Indent, a_file )
{
    a_file.PushRawText( _Int.String() );
};
global CodeInt64 = function( _Int, _Indent, a_file )
{
    local text = format("int64(%i,%i)",_Int.IntLo(),_Int.IntHi());
    a_file.PushRawText( text );
};
global CodeFloat = function( _Float, _Indent, a_file )
{
    a_file.PushRawText( _Float.String() );
};
global CodeString = function( _String, _Indent, a_file )
{
    a_file.PushRawText( "\"", _String, "\"" );
};
global g_code_type_jump = {};
g_code_type_jump[ typeId( 0 ) ] = CodeInt;
g_code_type_jump[ typeId( int64(0,0) ) ] = CodeInt64;
g_code_type_jump[ typeId( 0.1 ) ] = CodeFloat;
g_code_type_jump[ typeId( "" ) ] = CodeString;
g_code_type_jump[ typeId( table() ) ] = CodeTable;
g_code_type_jump[ typeId( array() ) ] = CodeArray;
g_code_type_jump[ typeId( array_int() ) ] = CodeArray;
g_code_type_jump[ typeId( array_float() ) ] = CodeArray;
g_code_type_jump[ typeId( vector4() ) ] = CodeVector4;
g_code_type_jump[ typeId( vector3() ) ] = CodeVector3;
global CodeForObject = function( _Obj, _Indent, a_file )
{ 
    if ( ?_Obj )
    {
        local func = g_code_type_jump[ typeId( _Obj ) ];
        func( _Obj, _Indent, a_file );
    }
    else
    {
        a_file.PushRawText( "null" );
    }
};
global GetGMDataHeader = function( a_name, a_global_name, a_editor, a_file )
{
if ( a_editor )
{
        a_file.PushRawText( "// Auto-generated file. Edit at your own risk!\n\n" );
}
    if ( ?a_name )
    {
        a_file.PushRawText( "StartInit(" );
        CodeForObject( a_name, null, a_file );
        a_file.PushRawText( ");\n\n" );
    }
if ( ?a_global_name )
{
        a_file.PushRawText( "global ", a_global_name, " = " );
}
else
{
        a_file.PushRawText( "local data = " );
}
};
global GetGMDataFooter = function( a_name, a_global_name, a_file )
{
    if ( ?a_name )
    {
    if ( ?a_global_name )
    {
            a_file.PushRawText( ";\n\nEndInit(" );
            CodeForObject( a_name, null, a_file );
            a_file.PushRawText( ");" );
    }
    else
    {
            a_file.PushRawText( ";\n\nEndInit(" );
            CodeForObject( a_name, null, a_file );
            a_file.PushRawText( ",data);" );
    }
    }
    else
    {
        a_file.PushRawText( ";\n\n" );
    }
};
// FIXME: Rename those helpers to GM_Serializer_* prefix to simplify finds
global CreateGMFile = function( a_filename, a_name, a_data, a_global_name )
{
    print("Generating file:",a_filename);
local file = Q.NewBinaryStreamerMemory();
if ( !file.OpenMemory( "READ_WRITE" ) )
{
return false;
}
GetGMDataHeader( a_name, a_global_name, true, file );
CodeForObject( a_data, null, file );
GetGMDataFooter( a_name, a_global_name, file );
file.WriteMemoryToFile( a_filename );
file.Close();
//@@Q.TimerCheckPoint("CreateGMFile");
return true;
};
global CreateGMFileMemory = function( a_name, a_data, a_global_name, a_file )
{
    if (!?a_file)
    {
    local a_file = Q.NewBinaryStreamerMemory();
    if ( !a_file.OpenMemory( "READ_WRITE" ) )
    {
    return;
    }
    }
GetGMDataHeader( a_name, a_global_name, true, a_file );
CodeForObject( a_data, null, a_file );
GetGMDataFooter( a_name, a_global_name, a_file );
return a_file;
};
global CreateGMString = function( a_name, a_data, a_global_name )
{
    local file = Q.NewBinaryStreamerMemory();
if ( !file.OpenMemory( "READ_WRITE" ) )
{
return null;
}
 
GetGMDataHeader( a_name, a_global_name, false, file );
CodeForObject( a_data, null, file );
GetGMDataFooter( a_name, a_global_name, file );
//@@Q.TimerCheckPoint("CreateGMString");
    file.Seek( 0 );
return file.PopRawText( file.ByteSize() );
};
global GM_Serializer_WriteBinFileFromVar = function( a_filename, a_data, a_serializer )
{
@@assert( ?a_filename && ?a_data );
a_serializer ?= Q.NewGameMonkeySerializer();
    local file = Q.NewBinaryStreamerMemory();
file.OpenMemory( "READ_WRITE" );
    a_serializer.Serialize( file, a_data );
    file.WriteMemoryToFile( a_filename );
    file.Close();
};
global GM_Serializer_ReadBinFileToVar = function( a_filename, a_serializer )
{
@@assert( ?a_filename );
a_serializer ?= Q.NewGameMonkeySerializer();
    local file = Q.NewBinaryStreamerFile();
    if ( file.OpenFile( "READ", a_filename ) )
    {
        local var = a_serializer.Serialize( file );
        file.Close();
        return var;
    } 
};
global GM_Serializer_WriteBinMemoryFromVar = function( a_data, a_serializer )
{
@@assert( ?a_data );
a_serializer ?= Q.NewGameMonkeySerializer();
    local streamer = Q.NewBinaryStreamerMemory();
    streamer.OpenMemory( "READ_WRITE" );
    a_serializer.Serialize( streamer, a_data );
return streamer;
};
global GM_Serializer_ReadBinMemoryToVar = function( a_streamer, a_serializer )
{
@@assert( ?a_streamer );
a_serializer ?= Q.NewGameMonkeySerializer();
a_streamer.Seek( 0 );
local data = a_serializer.Serialize( a_streamer );
return data;
};

So my question is: What can we do with all this? it would seem at first glance that we might be able to use some of these files to modify the FW, maybe add different effects, even if that is not possible it would seem that we can customize that application a lot... or maybe nothing there worth looking at?

I wonder would it even be possible to use these scripts to exploit the system in theory, I mean it looks like C, how much power does it have?
 

Attachments

Yep, that company was colaborating in the development of the PS3 XMB :)
I had some notes about them in wiki: https://www.psdevwiki.com/ps3/Qt_Resource_Container_(QRC)#Description
Take a look at the first link, they was "teasing" the new wave and sparkles design of firmware 3.00 even before sony published it :)
And im pretty sure they made the design of the animations that appers in the official music player
This is why they later released an standalone music player... because is mostly the same... probably the stuff they included in the standalone music player was the experiments not approved by sony... so they bought a license from sony and released it as an app

The VPO/FPO are shaders, but a lot of them belongs to "libraries" (so i guess is the kind of thing you should not modify, are like assets you can use), and im pretty sure a lot of the ones inside QRC files are exactly the same files
The way how it works is... all that FPO/VPO files in official firmware belongs to the same version of the library... and are repeated inside the different QRC files because needs to be included in them individually

Additionally to that FPO/VPO files under a "library" path... there are others that are custom... this ones are the ones we could change

And yeah... i was taking a look at that program too, lot of time ago, but at that time my knowledge about all this was more limited, so there was a lot of things i could not understand
I dont remember to find anything useful (or usable in PS3 CFW) in it, but im pretty sure it have a lot of easter eggs :)
 
@DeViL303 Nice! I actually threw an album on my USB driver earlier and was tripping out on the music visualizers. If you were on some kind of psychedelic, you'd probably jump out a window :D
 
I remember one of the visualizers inside that app was like a equalizer, with vertical bars for different frequencies moving up and down
Nothing specially awesome, but in my oppinion a lot better than the visualizers of the official music player that are too much abstract

Edit:
I mean... inside the music player you can choose 3 visualizer types, one is the earth (made with gaia.qrc), the other is the wave+particles (loading .mnu seting file from lines.qrc)

And the third.... is a combination of 3 or 5 abstract animations of some kind of "liquids", one looks like the water surface, another like a volcano, another like raining... etc... i dont like them, is the kind of situation where i would say "dudes, please put some effort in it, im sure you can do it much better"

*And the gaia is overkill
 
Last edited:
I remember one of the visualizers inside that app was like a equalizer, with vertical bars for different frequencies moving up and down
Nothing specially awesome, but in my oppinion a lot better than the visualizers of the official music player that are too much abstract

Edit:
I mean... inside the music player you can choose 3 visualizer types, one is the earth (made with gaia.qrc), the other is the wave+particles (loading .mnu seting file from lines.qrc)

And the third.... is a combination of 3 or 5 abstract animations of some kind of "liquids", one looks like the water surface, another like a volcano, another like raining... etc... i dont like them, is the kind of situation where i would say "dudes, please put some effort in it, im sure you can do it much better"

*And the gaia is overkill
it would be better if they had put the animation of Gaia up Mount Olympus along with the other Titans.:-p:D
 
it would be better if they had put the animation of Gaia up Mount Olympus along with the other Titans.:-p:D
This made me remember for some time i was considering to make a mod replacing the textures of the earth by textures of the death start (from star wars) \ó/

The alternative was to use real photos of the mars surface (taken from NASA and other space agencies webs)
Actually, the images of the gaia.qrc included in official PS3 firmwares are made by NASA satellites, they appears in the credits ;)

I decided to not do it because gaia.qrc have a huge amount of files inside it, his complexity is discouraging
DeathStar2.jpg
 
*And the gaia is overkill

Did you know that they were considering using gaia as the coldboot, that is probably one of the reasons they put so much effort into it. They even mention the fact that its a slimmed down version to fit on flash and at one stage they were thinking about making a HDD version with all the data. Shame that never happened.

Q-Games - James McLaren said:
Originally, we were working on the Gaia project (our name for the earth viewer) as a possible boot sequence for the PS3. The waving cloth background, also created by Q-Games, got the nod when the PS3 launched...

We persevered with Gaia, and this visualizer came out of that ongoing work. We've had this under our hats for a while, so it's nice to finally see it released into the wild...

What you are seeing is a slimmed-down version, due to Flash ROM restrictions, so we are happy to witness a positive reaction on various internet forums.

This representation of the earth is a 3D model with some shaders and SPU trickery going on. We tried to accurately model the earth's atmosphere and have all the correct highlights on the oceans, etc. The texture data is sourced from the NASA Blue Marble project.

They have some data that they've patched together from hundreds of satellite passes over the earth, which is really top-notch quality, as you can see. We really owe NASA a debt of gratitude for the data, as without it we wouldn't be able to produce something that looks this good.

...We'd certainly like to expand the current Earth visualizer and allow people a little bit more user control, something we've seen a few requests for on various online forums.

Perhaps a future update might include the full Blue Marble dataset, but that would need to be a hard disc-resident version...


Source: https://www.gamasutra.com/php-bin/news_index.php?story=16748

I want to try trigger it as default XMB background :)
 
https://en.wikipedia.org/wiki/Q-Games
https://www.destructoid.com/the-meaning-of-q-games-company-name-is-revealed-244255.phtml
https://www.facebook.com/notes/q-games/the-almighty-pixeljunk-faq/591758830841166?_fb_noscript=1
Where did the name "Q-Games" come from?

The "Q" in Q-Games comes from company founder Dylan Cuthbert's love of the inventor Q in the James Bond series of books and films. Just as Q from Bond's trademark was cool ideas and innovative, quirky gadgets, we'd like to be the developer know for taking off the wall ideas and making fun, interesting games.

http://www.q-games.com/en/history/page/4/
2002 October – 2003 December Authoring Tool Research and Development

PlaystationBB and XboxLive had started, but content for these services was very difficult to develop for a lot of small companies, requiring knowledge of proprietary scripting systems and other such things. Q-Games developed an authoring tool, codenamed BNAT, that allows content developers to create and edit interactive content in a similar style to Macromedia's Flash/Shockwave. This tool is set for release to US content developers this year. It was also used to layout and stylise the PSX OS.
 
Last edited:
If i did read right... the founder of the company made the first ape escape too... i guess this is where he got the money to create the company and dedicate all that effort in research and to make all that technical demos
They has been having fun and have lot of creativity :)
 
Here is a bit of a release for people to explore and learn from if they are interested. It just does what I showed in the previous video, plus it enables "unlimited" coldboot audio from hdd .

upload_2019-9-20_1-42-5.png


Patches applied:
  • Crazy particle patch (sprx) = swap specular power and delta time. (probably possible in the qrc by swapping the values)
  • Black background patch (sprx) = edit lib/moyou/back_colours0.fpo to lib/moyou/back_colours2.fpo (maybe possible in qrc too with hex edit type redirect or dds swap)
  • ac3 path changed to dev_hdd0/tmp/coldboot.ac3 and 10 minute example coldboot included
  • Quickest boot up possible.
  • 3 minute looping wave animation like seen in my last video.
  • background image can be used as normal. Classic and original setting can be used as normal
  • Custom lines.qrc
  • Side menu still takes on color settings so you can match that to theme if you want
  • Only tested on Rebug 4.84.2 REX, experimental so might have bugs, use at your own risk.
  • NOT for HEN - CFW Only!
  • EXTRA: Installs Berions Rebugification theme to dev_hdd0/theme/ and also adds a xmb_plugin_normal_rebugification.rco to dev_flash/vsh/resource/. If you want the PSN icon to match the theme then rename that to xmb_plugin_normal.rco. This is only needed if you want to replicate my XMB like seen in the video.

Its nice with this black background patch that you can still set the side menu like normal. Try silver too for the side menu, it goes well with the black.

upload_2019-9-20_1-55-56.png


Here is the video again in case anyone missed it:



DOWNLOAD (CFW Only)
 
Last edited:
Here is a bit of a release for people to explore and learn from if they are interested. It just does what I showed in the previous video, plus it enables "unlimited" coldboot audio from hdd .

View attachment 20136

Patches applied:
  • Crazy particle patch (sprx) = swap specular power and delta time. (probably possible in the qrc by swapping the values)
  • Black background patch (sprx) = edit lib/moyou/back_colours0.fpo to lib/moyou/back_colours2.fpo (maybe possible in qrc too with hex edit type redirect or dds swap)
  • ac3 path changed to dev_hdd0/tmp/coldboot.ac3 and 10 minute example coldboot included
  • Quickest boot up possible.
  • 3 minute looping wave animation like seen in my last video.
  • background image can be used as normal. Classic and original setting can be used as normal
  • Custom lines.qrc
  • Side menu still takes on color settings so you can match that to theme if you want
  • Only tested on Rebug 4.84.2 REX, experimental so might have bugs, use at your own risk.
  • NOT for HEN - CFW Only!
  • EXTRA: Installs Berions Rebugification theme to dev_hdd0/theme/ and also adds a xmb_plugin_normal_rebugification.rco to dev_flash/vsh/resource/. If you want the PSN icon to match the theme then rename that to xmb_plugin_normal.rco. This is only needed if you want to replicate my XMB.

Its nice with this black background patch that you can still set the side menu like normal. Try silver too for the side menu, it goes well with the black.

View attachment 20137

Here is the video again in case anyone missed it:



DOWNLOAD (CFW Only)


I also put the visualizer in the music category :P

is it possible to make it as a custom icon in the xmb? like putting the custom text, custom icon and etc from the rco?

i tried but i dont know the sixtaxes for it, only making it loading from a custom folder or showing it

using

<Query
class="type:x-xmb/folder-pixmap"
key="#visualizer"
attr="#visualizer"
src="xcb://localhost/query?sort=+Game:Common.titleForSort&cond=Oe+Game:Game.titleId NPEB01864"
/>

but i want it to read attributes from
<Attributes>
<Table key="visualizer">
<Pair key="icon_rsc"><String>item_tex_walkman</String></Pair>
<Pair key="title_rsc"><String>msg_visualizer</String></Pair>
<Pair key="info_rsc"><String>msg_info_visualizer_info</String></Pair>
<Table>

without beeing inside a folder.

is it possible?
 
We have full control over any apps icon and title, just edit the title in the param.sfo and use whatever icon you want as icon0. :)

To move it I just edited the param.sfo to AM.

upload_2019-9-20_15-19-44.png


Here is an icon I extracted from PS4 rcos you can use ;)

upload_2019-9-20_15-9-58.png
 

Attachments

  • ICON0.PNG
    ICON0.PNG
    12.9 KB · Views: 173
Last edited:
Note: I think my long animation is causing some freezes when entering apps. We probably need to tweak the gameboot animation or something.

Something interesting I noticed too with the Visualizer app. The way this app interacts with the FW, it calls on music_browser_plugin.sprx and rco directly, skipping the ingame XMB.

upload_2019-9-20_17-6-18.png


Really funny thing is that if you bring up the ingame XMB, and try to play some music, it will say.

upload_2019-9-20_17-9-28.png


Its a shame they could not get that little bit more XMB integration.

So i patched the param.sfo to allow background music and now it says:
upload_2019-9-20_17-14-5.png

upload_2019-9-20_17-23-2.png



:)
 
Last edited:
Playing with lines.qrc for the first time ever. Easier than I thought,:)



Wondering should i have a pulsing glow, or have it get slightly darker at night. Or switch from top to bottom over the day.

Have applied most of my patches in the qrc and rco now, so can make everything HEN compatible :)
 
Playing with lines.qrc for the first time ever. Easier than I thought,:)



Wondering should i have a pulsing glow, or have it get slightly darker at night. Or switch from top to bottom over the day.

Have applied most of my patches in the qrc and rco now, so can make everything HEN compatible :)

Yes most things you have done can be applyied to the lines.qrc as the SPRX is using the files in the lines.qrc file.

For HEN users can have RCO and lines.qrc edits to create some crazy effects while CFW users could have the SPRX, RCO and the lines edits to make some really crazy effects.

The only thing I would say when playing with the line.qrc file is to respect the values in the MNU files eg if a value is say X.XXXX make sure what you edit it to has the same number of digits. ie X.XXXX not X.XX.

A miss edited lines.qrc file can cause some major issues beyond a simple soft brick, I nearly bricked one of my PS3's with one, only a factory reset saved the PS3 and it took about 6 attempts to get factory reset to work correctly as it would keep crashing during the reset.

Heres few things for you too mess with> editing the coldboot1 folder you can trigger the old black coldboot screen> so you have the PS3 boot to black screen with a wave which them will fade into the coldboot.raf then to the XMB which looks pretty cool for a startup sequence.

gameboot3 is for the main gameboot > this will also trigger the gameboot and extra effects for HEN users without an SPRX edit, just no sound> coloured waves, particle effects > make the wave change form etc.
 
Only thing I can not do in the qrc so far is enable the debug particles (particles_quads_debug.fpo and particles_quads_debug.vpo) which is a shame. It probably is possible.

In a lot of ways i prefer to do all the patches in the sprx, as then you can use any wave, but gotta look after HEN users too.
 
Only thing I can not do in the qrc so far is enable the debug particles (particles_quads_debug.fpo and particles_quads_debug.vpo) which is a shame. It probably is possible.

In a lot of ways i prefer to do all the patches in the sprx, as then you can use any wave, but gotta look after HEN users too.
Experimental/untested, keep away from childkens
Is a mod to enable full supersampling shaders for the icon app_home/PS3_GAME
Includes a .txt tutorial that i was considering to publish, but never did before
The patch is applyed to icons.qrc but the same method should work for lines.qrc

btw, you should take a look at it, the patches you was applying in the .sprx affects both, lines.qrc and icons.qrc
So... you can enable some icons mods by patching the same .sprx

Inside icons.qrc there are 6 FPO shaders named:
icons_cheap_ss.fpo
icons_cheap_ss_no_shad.fpo
icons_full_ss.fpo
icons_full_ss_no_shad.fpo
icons_no_ss.fpo
icons_no_ss_no_shad.fpo

Im replacing:
"icons_cheap_ss.fpo" ...by... "icons_full_ss.fpo"
"icons_cheap_ss_no_shad.fpo" ...by... "icons_full_ss_no_shad.fpo"

In other words... F%$# the cheap quality

FILE: https://www.sendspace.com/file/dom06p
 

Similar threads

Back
Top