diff --git a/skeleton/skeleton.cpp b/skeleton/skeleton.cpp index ad84d1a..740a3ab 100644 --- a/skeleton/skeleton.cpp +++ b/skeleton/skeleton.cpp @@ -71,6 +71,25 @@ CameraCreate(int32 width, int32 height, bool32 z) 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) { diff --git a/skeleton/skeleton.h b/skeleton/skeleton.h index 9604602..b802718 100644 --- a/skeleton/skeleton.h +++ b/skeleton/skeleton.h @@ -103,6 +103,7 @@ extern Args args; bool InitRW(void); void TerminateRW(void); Camera *CameraCreate(int32 width, int32 height, bool32 z); +void CameraDestroy(rw::Camera *cam); void CameraSize(Camera *cam, Rect *r); void SetMousePosition(int x, int y); EventStatus EventHandler(Event e, void *param); diff --git a/tools/lights/lights.cpp b/tools/lights/lights.cpp index 21786ed..78cdfc1 100644 --- a/tools/lights/lights.cpp +++ b/tools/lights/lights.cpp @@ -100,10 +100,33 @@ CreateSpotSoftLight(void) return light; } +void +DestroyLight(rw::Light **light) +{ + if(*light == nil) + return; + rw::World *world = (*light)->world; + if(world) + world->removeLight(*light); + rw::Frame *frame = (*light)->getFrame(); + if(frame){ + (*light)->setFrame(nil); + frame->destroy(); + } + + (*light)->destroy(); + *light = nil; +} + void LightsDestroy(void) { - // TODO + DestroyLight(&SpotSoftLight); + DestroyLight(&SpotLight); + DestroyLight(&PointLight); + DestroyLight(&DirectLight); + DestroyLight(&AmbientLight); + DestroyLight(&BaseAmbientLight); } void diff --git a/tools/lights/lights.h b/tools/lights/lights.h index 63a2990..5400a61 100644 --- a/tools/lights/lights.h +++ b/tools/lights/lights.h @@ -28,6 +28,7 @@ rw::Light *CreatePointLight(void); rw::Light *CreateSpotLight(void); rw::Light *CreateSpotSoftLight(void); +void LightsDestroy(void); void LightsUpdate(void); void DrawCurrentLight(void); diff --git a/tools/lights/main.cpp b/tools/lights/main.cpp index 6c8938d..f2f17e2 100644 --- a/tools/lights/main.cpp +++ b/tools/lights/main.cpp @@ -166,6 +166,31 @@ Initialize3D(void) return true; } +void +Terminate3D(void) +{ + FORLIST(lnk, World->clumps){ + rw::Clump *clump = rw::Clump::fromWorld(lnk); + World->removeClump(clump); + clump->destroy(); + } + + if(Camera){ + World->removeCamera(Camera); + sk::CameraDestroy(Camera); + Camera = nil; + } + + LightsDestroy(); + + if(World){ + World->destroy(); + World = nil; + } + + sk::TerminateRW(); +} + bool attachPlugins(void) { @@ -327,6 +352,9 @@ AppEventHandler(sk::Event e, void *param) return EVENTPROCESSED; case RWINITIALIZE: return Initialize3D() ? EVENTPROCESSED : EVENTERROR; + case RWTERMINATE: + Terminate3D(); + return EVENTPROCESSED; case PLUGINATTACH: return attachPlugins() ? EVENTPROCESSED : EVENTERROR; case KEYDOWN: