#include "worldmap.h" dWorldCamera_c *dWorldCamera_c::instance = 0; dWorldCamera_c *dWorldCamera_c::build() { OSReport("Creating WorldCamera\n"); void *buffer = AllocFromGameHeap1(sizeof(dWorldCamera_c)); dWorldCamera_c *c = new(buffer) dWorldCamera_c; OSReport("Created WorldCamera @ %p\n", c); instance = c; return c; } int dWorldCamera_c::onCreate() { this->camPos = (Point3d){0.0f, 500.0f, 1000.0f}; this->camRotate = (Point3d){-40.0f, -30.0f, 0.0f}; // ZXY order camDist = 740; camY = 330; targetDist = 100; targetY = -220; return true; } int dWorldCamera_c::onDelete() { return true; } int dWorldCamera_c::onExecute() { int heldButtons = Remocon_GetButtons(GetActiveRemocon()); /*if (heldButtons & WPAD_LEFT) this->camPos.x -= 5.0f; if (heldButtons & WPAD_RIGHT) this->camPos.x += 5.0f; if (heldButtons & WPAD_UP) this->camPos.z -= 5.0f; if (heldButtons & WPAD_DOWN) this->camPos.z += 5.0f; if (heldButtons & WPAD_MINUS) this->camRotate.y -= 2.0f; if (heldButtons & WPAD_PLUS) this->camRotate.y += 2.0f;*/ /*bool change = false; if (heldButtons & WPAD_LEFT) { camDist -= 5.0f; change = true; } if (heldButtons & WPAD_RIGHT) { camDist += 5.0f; change = true; } if (heldButtons & WPAD_UP) { camY -= 5.0f; change = true; } if (heldButtons & WPAD_DOWN) { camY += 5.0f; change = true; } if (heldButtons & WPAD_MINUS) { targetDist -= 5.0f; change = true; } if (heldButtons & WPAD_PLUS) { targetDist += 5.0f; change = true; } if (heldButtons & WPAD_ONE) { targetY -= 5.0f; change = true; } if (heldButtons & WPAD_TWO) { targetY += 5.0f; change = true; } if (change) OSReport("[Cam Dist=%f Y=%f] [Target Dist=%f Y=%f]\n", camDist, camY, targetDist, targetY);*/ return true; } int dWorldCamera_c::onDraw() { // fixup camera shit GXRenderModeObj *rmode = nw4r::g3d::G3DState::GetRenderModeObj(); // 2D camera nw4r::g3d::Camera cam2d(GetCameraByID(1)); if (rmode->field_rendering != 0) cam2d.SetViewportJitter(VIGetNextField()); cam2d.SetOrtho(rmode->efbHeight, 0.0f, 0.0f, rmode->fbWidth * (IsWideScreen() ? 1.3333334f : 1.0f), -100000.0f, 100000.0f); // 3D camera nw4r::g3d::Camera cam3d(GetCameraByID(0)); if (rmode->field_rendering != 0) cam3d.SetViewportJitter(VIGetNextField()); cam3d.SetPerspective(45, (f32)rmode->viWidth / (f32)rmode->viHeight, 0.1f, 2400.0f); //cam3d.SetOrtho(rmode->efbHeight, 0.0f, 0.0f, rmode->fbWidth * (IsWideScreen() ? 1.3333334f : 1.0f), -100000.0f, 100000.0f); /*nw4r::g3d::Camera::PostureInfo posture; posture.tp = nw4r::g3d::Camera::POSTURE_ROTATE; posture.cameraRotate = this->camRotate; cam3d.SetPosition(this->camPos); cam3d.SetPosture(posture);*/ // The map is actually roughly 500x500, but I use a bigger circle in order // to give leeway for the camera // TODO: Make these vars tweakable! float angle = MTXDegToRad(90.0) - atan2(daWMPlayer_c::instance->pos.z, daWMPlayer_c::instance->pos.x); float camX = sin(angle) * camDist; float camZ = cos(angle) * camDist; float targetX = sin(angle) * targetDist; float targetZ = cos(angle) * targetDist; nw4r::g3d::Camera::PostureInfo posture; posture.tp = nw4r::g3d::Camera::POSTURE_LOOKAT; posture.cameraUp = (Point3d){0,1,0}; posture.cameraTarget = (Point3d){targetX,targetY,targetZ}; cam3d.SetPosition((Point3d){camX,camY,camZ}); cam3d.SetPosture(posture); return true; }