mirror of https://github.com/aap/librw.git
176 lines
4.5 KiB
C++
176 lines
4.5 KiB
C++
#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;
|
|
rw::EngineOpenParams engineOpenParams;
|
|
|
|
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);
|
|
|
|
rw::RGBA clearcol = rw::makeRGBA(clear_color.x*255, clear_color.y*255, clear_color.z*255, clear_color.w*255);
|
|
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();
|
|
|
|
ImGui_ImplRW_RenderDrawLists(ImGui::GetDrawData());
|
|
|
|
Scene.camera->endUpdate();
|
|
Scene.camera->showRaster(0);
|
|
}
|
|
|
|
|
|
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;
|
|
// TODO: register when we're minimized
|
|
if(r->w == 0) r->w = 1;
|
|
if(r->h == 0) r->h = 1;
|
|
|
|
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;
|
|
}
|