summaryrefslogtreecommitdiff
path: root/skeleton/skeleton.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'skeleton/skeleton.cpp')
-rw-r--r--skeleton/skeleton.cpp192
1 files changed, 192 insertions, 0 deletions
diff --git a/skeleton/skeleton.cpp b/skeleton/skeleton.cpp
new file mode 100644
index 0000000..a3faea6
--- /dev/null
+++ b/skeleton/skeleton.cpp
@@ -0,0 +1,192 @@
+#include <rw.h>
+#include "skeleton.h"
+
+
+namespace sk {
+
+Globals globals;
+Args args;
+
+
+bool
+InitRW(void)
+{
+ if(!rw::Engine::init())
+ return false;
+ if(AppEventHandler(sk::PLUGINATTACH, nil) == EVENTERROR)
+ return false;
+ if(!rw::Engine::open(&engineOpenParams))
+ return false;
+
+ SubSystemInfo info;
+ int i, n;
+ n = Engine::getNumSubSystems();
+ for(i = 0; i < n; i++)
+ if(Engine::getSubSystemInfo(&info, i))
+ ;//printf("subsystem: %s\n", info.name);
+ Engine::setSubSystem(n-1);
+
+ int want = -1;
+ VideoMode mode;
+ n = Engine::getNumVideoModes();
+ for(i = 0; i < n; i++)
+ if(Engine::getVideoModeInfo(&mode, i)){
+// if(mode.width == 640 && mode.height == 480 && mode.depth == 32)
+ if(mode.width == 1920 && mode.height == 1080 && mode.depth == 32)
+ want = i;
+ //printf("mode: %dx%dx%d %d\n", mode.width, mode.height, mode.depth, mode.flags);
+ }
+// if(want >= 0) Engine::setVideoMode(want);
+ Engine::getVideoModeInfo(&mode, Engine::getCurrentVideoMode());
+
+ if(mode.flags & VIDEOMODEEXCLUSIVE){
+ globals.width = mode.width;
+ globals.height = mode.height;
+ }
+
+ if(!rw::Engine::start())
+ return false;
+
+ rw::Charset::open();
+
+ rw::Image::setSearchPath("./");
+ return true;
+}
+
+void
+TerminateRW(void)
+{
+ rw::Charset::close();
+
+ // TODO: delete all tex dicts
+ rw::Engine::stop();
+ rw::Engine::close();
+ rw::Engine::term();
+}
+
+Camera*
+CameraCreate(int32 width, int32 height, bool32 z)
+{
+ Camera *cam;
+ cam = Camera::create();
+ cam->setFrame(Frame::create());
+ cam->frameBuffer = Raster::create(width, height, 0, Raster::CAMERA);
+ cam->zBuffer = Raster::create(width, height, 0, Raster::ZBUFFER);
+ return cam;
+}
+
+void
+CameraDestroy(rw::Camera *cam)
+{
+ if(cam->frameBuffer){
+ cam->frameBuffer->destroy();
+ cam->frameBuffer = nil;
+ }
+ if(cam->zBuffer){
+ cam->zBuffer->destroy();
+ cam->zBuffer = nil;
+ }
+ rw::Frame *frame = cam->getFrame();
+ if(frame){
+ cam->setFrame(nil);
+ frame->destroy();
+ }
+ cam->destroy();
+}
+
+void
+CameraSize(Camera *cam, Rect *r, float viewWindow, float aspectRatio)
+{
+ if(cam->frameBuffer){
+ cam->frameBuffer->destroy();
+ cam->frameBuffer = nil;
+ }
+ if(cam->zBuffer){
+ cam->zBuffer->destroy();
+ cam->zBuffer = nil;
+ }
+ cam->frameBuffer = Raster::create(r->w, r->h, 0, Raster::CAMERA);
+ cam->zBuffer = Raster::create(r->w, r->h, 0, Raster::ZBUFFER);
+
+ if(viewWindow != 0.0f){
+ rw::V2d vw;
+ // TODO: aspect ratio when fullscreen
+ if(r->w > r->h){
+ vw.x = viewWindow;
+ vw.y = viewWindow / ((float)r->w/r->h);
+ }else{
+ vw.x = viewWindow / ((float)r->h/r->w);
+ vw.y = viewWindow;
+ }
+ cam->setViewWindow(&vw);
+ }
+}
+
+void
+CameraMove(Camera *cam, V3d *delta)
+{
+ rw::V3d offset;
+ rw::V3d::transformVectors(&offset, delta, 1, &cam->getFrame()->matrix);
+ cam->getFrame()->translate(&offset);
+}
+
+void
+CameraPan(Camera *cam, V3d *pos, float angle)
+{
+ rw::Frame *frame = cam->getFrame();
+ rw::V3d trans = pos ? *pos : frame->matrix.pos;
+ rw::V3d negTrans = rw::scale(trans, -1.0f);
+ frame->translate(&negTrans);
+ frame->rotate(&frame->matrix.up, angle);
+ frame->translate(&trans);
+}
+
+void
+CameraTilt(Camera *cam, V3d *pos, float angle)
+{
+ rw::Frame *frame = cam->getFrame();
+ rw::V3d trans = pos ? *pos : frame->matrix.pos;
+ rw::V3d negTrans = rw::scale(trans, -1.0f);
+ frame->translate(&negTrans);
+ frame->rotate(&frame->matrix.right, angle);
+ frame->translate(&trans);
+}
+
+void
+CameraRotate(Camera *cam, V3d *pos, float angle)
+{
+ rw::Frame *frame = cam->getFrame();
+ rw::V3d trans = pos ? *pos : frame->matrix.pos;
+ rw::V3d negTrans = rw::scale(trans, -1.0f);
+ frame->translate(&negTrans);
+ frame->rotate(&frame->matrix.at, angle);
+ frame->translate(&negTrans);
+}
+
+EventStatus
+EventHandler(Event e, void *param)
+{
+ EventStatus s;
+ if (e == INITIALIZE) {
+ ImGui::CreateContext();
+ }
+
+ s = AppEventHandler(e, param);
+ if(e == QUIT){
+ globals.quit = 1;
+ return EVENTPROCESSED;
+ }
+ if(s == EVENTNOTPROCESSED)
+ switch(e){
+ case RWINITIALIZE:
+ return InitRW() ? EVENTPROCESSED : EVENTERROR;
+ case RWTERMINATE:
+ TerminateRW();
+ return EVENTPROCESSED;
+ default:
+ break;
+ }
+ return s;
+}
+
+}