librw/skeleton/skeleton.cpp
2021-07-08 16:43:39 +02:00

193 lines
3.9 KiB
C++

#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;
}
}