2017-12-30 10:43:17 +00:00
# include <rw.h>
# include <skeleton.h>
# include <assert.h>
rw : : V3d zero = { 0.0f , 0.0f , 0.0f } ;
struct SceneGlobals {
rw : : World * world ;
rw : : Camera * camera ;
} Scene ;
2020-04-15 08:47:43 +01:00
rw : : EngineOpenParams engineOpenParams ;
2017-12-30 10:43:17 +00:00
void
Init ( void )
{
sk : : globals . windowtitle = " ImGui test " ;
sk : : globals . width = 1280 ;
sk : : globals . height = 800 ;
sk : : globals . quit = 0 ;
}
bool
attachPlugins ( void )
{
rw : : ps2 : : registerPDSPlugin ( 40 ) ;
rw : : ps2 : : registerPluginPDSPipes ( ) ;
rw : : registerMeshPlugin ( ) ;
rw : : registerNativeDataPlugin ( ) ;
rw : : registerAtomicRightsPlugin ( ) ;
rw : : registerMaterialRightsPlugin ( ) ;
rw : : xbox : : registerVertexFormatPlugin ( ) ;
rw : : registerSkinPlugin ( ) ;
rw : : registerUserDataPlugin ( ) ;
rw : : registerHAnimPlugin ( ) ;
rw : : registerMatFXPlugin ( ) ;
rw : : registerUVAnimPlugin ( ) ;
rw : : ps2 : : registerADCPlugin ( ) ;
return true ;
}
bool
InitRW ( void )
{
// rw::platform = rw::PLATFORM_D3D8;
if ( ! sk : : InitRW ( ) )
return false ;
Scene . world = rw : : World : : create ( ) ;
rw : : Light * ambient = rw : : Light : : create ( rw : : Light : : AMBIENT ) ;
ambient - > setColor ( 0.2f , 0.2f , 0.2f ) ;
Scene . world - > addLight ( ambient ) ;
rw : : V3d xaxis = { 1.0f , 0.0f , 0.0f } ;
rw : : Light * direct = rw : : Light : : create ( rw : : Light : : DIRECTIONAL ) ;
direct - > setColor ( 0.8f , 0.8f , 0.8f ) ;
direct - > setFrame ( rw : : Frame : : create ( ) ) ;
direct - > getFrame ( ) - > rotate ( & xaxis , 180.0f , rw : : COMBINEREPLACE ) ;
Scene . world - > addLight ( direct ) ;
Scene . camera = sk : : CameraCreate ( sk : : globals . width , sk : : globals . height , 1 ) ;
Scene . world - > addCamera ( Scene . camera ) ;
ImGui_ImplRW_Init ( ) ;
ImGui : : StyleColorsClassic ( ) ;
return true ;
}
void
Draw ( float timeDelta )
{
static bool show_demo_window = true ;
static bool show_another_window = false ;
static ImVec4 clear_color = ImVec4 ( 0.45f , 0.55f , 0.60f , 1.00f ) ;
2019-01-10 16:12:05 +00:00
rw : : RGBA clearcol = rw : : makeRGBA ( clear_color . x * 255 , clear_color . y * 255 , clear_color . z * 255 , clear_color . w * 255 ) ;
2017-12-30 10:43:17 +00:00
Scene . camera - > clear ( & clearcol , rw : : Camera : : CLEARIMAGE | rw : : Camera : : CLEARZ ) ;
Scene . camera - > beginUpdate ( ) ;
ImGui_ImplRW_NewFrame ( timeDelta ) ;
// 1. Show a simple window.
// Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets automatically appears in a window called "Debug".
{
static float f = 0.0f ;
ImGui : : Text ( " Hello, world! " ) ; // Some text (you can use a format string too)
ImGui : : SliderFloat ( " float " , & f , 0.0f , 1.0f ) ; // Edit 1 float as a slider from 0.0f to 1.0f
ImGui : : ColorEdit3 ( " clear color " , ( float * ) & clear_color ) ; // Edit 3 floats as a color
if ( ImGui : : Button ( " Demo Window " ) ) // Use buttons to toggle our bools. We could use Checkbox() as well.
show_demo_window ^ = 1 ;
if ( ImGui : : Button ( " Another Window " ) )
show_another_window ^ = 1 ;
ImGui : : Text ( " Application average %.3f ms/frame (%.1f FPS) " , 1000.0f / ImGui : : GetIO ( ) . Framerate , ImGui : : GetIO ( ) . Framerate ) ;
}
// 2. Show another simple window. In most cases you will use an explicit Begin/End pair to name the window.
if ( show_another_window ) {
ImGui : : Begin ( " Another Window " , & show_another_window ) ;
ImGui : : Text ( " Hello from another window! " ) ;
ImGui : : End ( ) ;
}
// 3. Show the ImGui demo window. Most of the sample code is in ImGui::ShowDemoWindow().
if ( show_demo_window ) {
ImGui : : SetNextWindowPos ( ImVec2 ( 650 , 20 ) , ImGuiCond_FirstUseEver ) ; // Normally user code doesn't need/want to call this because positions are saved in .ini file anyway. Here we just want to make the demo initial state a bit more friendly!
ImGui : : ShowDemoWindow ( & show_demo_window ) ;
}
ImGui : : EndFrame ( ) ;
ImGui : : Render ( ) ;
Scene . camera - > endUpdate ( ) ;
Scene . camera - > showRaster ( ) ;
}
void
KeyUp ( int key )
{
}
void
KeyDown ( int key )
{
switch ( key ) {
case sk : : KEY_ESC :
sk : : globals . quit = 1 ;
break ;
}
}
sk : : EventStatus
AppEventHandler ( sk : : Event e , void * param )
{
using namespace sk ;
Rect * r ;
ImGuiEventHandler ( e , param ) ;
switch ( e ) {
case INITIALIZE :
Init ( ) ;
return EVENTPROCESSED ;
case RWINITIALIZE :
return : : InitRW ( ) ? EVENTPROCESSED : EVENTERROR ;
case PLUGINATTACH :
return attachPlugins ( ) ? EVENTPROCESSED : EVENTERROR ;
case KEYDOWN :
KeyDown ( * ( int * ) param ) ;
return EVENTPROCESSED ;
case KEYUP :
KeyUp ( * ( int * ) param ) ;
return EVENTPROCESSED ;
case RESIZE :
r = ( Rect * ) param ;
sk : : globals . width = r - > w ;
sk : : globals . height = r - > h ;
// TODO: set aspect ratio
if ( Scene . camera )
sk : : CameraSize ( Scene . camera , r ) ;
break ;
case IDLE :
Draw ( * ( float * ) param ) ;
return EVENTPROCESSED ;
}
return sk : : EVENTNOTPROCESSED ;
}