void KX_LightObject::BindShadowBuffer(RAS_IRasterizer *ras, KX_Camera *cam, MT_Transform& camtrans) { GPULamp *lamp; float viewmat[4][4], winmat[4][4]; int winsize; /* bind framebuffer */ lamp = GetGPULamp(); GPU_lamp_shadow_buffer_bind(lamp, viewmat, &winsize, winmat); /* setup camera transformation */ MT_Matrix4x4 modelviewmat((float*)viewmat); MT_Matrix4x4 projectionmat((float*)winmat); MT_Transform trans = MT_Transform((float*)viewmat); camtrans.invert(trans); cam->SetModelviewMatrix(modelviewmat); cam->SetProjectionMatrix(projectionmat); cam->NodeSetLocalPosition(camtrans.getOrigin()); cam->NodeSetLocalOrientation(camtrans.getBasis()); cam->NodeUpdateGS(0); /* setup rasterizer transformations */ /* SetViewMatrix may use stereomode which we temporarily disable here */ RAS_IRasterizer::StereoMode stereomode = ras->GetStereoMode(); ras->SetStereoMode(RAS_IRasterizer::RAS_STEREO_NOSTEREO); ras->SetProjectionMatrix(projectionmat); ras->SetViewMatrix(modelviewmat, cam->NodeGetWorldOrientation(), cam->NodeGetWorldPosition(), cam->GetCameraData()->m_perspective); ras->SetStereoMode(stereomode); }
void IK_QSegment::UpdateTransform(const MT_Transform& global) { // compute the global transform at the end of the segment m_global_start = global.getOrigin() + global.getBasis()*m_start; m_global_transform.setOrigin(m_global_start); m_global_transform.setBasis(global.getBasis() * m_rest_basis * m_basis); m_global_transform.translate(m_translation); // update child transforms for (IK_QSegment *seg = m_child; seg; seg = seg->m_sibling) seg->UpdateTransform(m_global_transform); }
void KX_KetsjiEngine::PostProcessScene(KX_Scene* scene) { bool override_camera = (m_overrideCam && (scene->GetName() == m_overrideSceneName)); SG_SetActiveStage(SG_STAGE_SCENE); // if there is no activecamera, or the camera is being // overridden we need to construct a temporarily camera if (!scene->GetActiveCamera() || override_camera) { KX_Camera* activecam = NULL; RAS_CameraData camdata = RAS_CameraData(); if (override_camera) { camdata.m_lens = m_overrideCamLens; camdata.m_clipstart = m_overrideCamNear; camdata.m_clipend = m_overrideCamFar; camdata.m_perspective= !m_overrideCamUseOrtho; } activecam = new KX_Camera(scene,KX_Scene::m_callbacks,camdata); activecam->SetName("__default__cam__"); // set transformation if (override_camera) { const MT_CmMatrix4x4& cammatdata = m_overrideCamViewMat; MT_Transform trans = MT_Transform(cammatdata.getPointer()); MT_Transform camtrans; camtrans.invert(trans); activecam->NodeSetLocalPosition(camtrans.getOrigin()); activecam->NodeSetLocalOrientation(camtrans.getBasis()); activecam->NodeUpdateGS(0); } else { activecam->NodeSetLocalPosition(MT_Point3(0.0, 0.0, 0.0)); activecam->NodeSetLocalOrientation(MT_Vector3(0.0, 0.0, 0.0)); activecam->NodeUpdateGS(0); } scene->AddCamera(activecam); scene->SetActiveCamera(activecam); scene->GetObjectList()->Add(activecam->AddRef()); scene->GetRootParentList()->Add(activecam->AddRef()); //done with activecam activecam->Release(); } scene->UpdateParents(0.0); }
void RAS_OpenGLLight::BindShadowBuffer(RAS_ICanvas *canvas, KX_Camera *cam, MT_Transform& camtrans) { GPULamp *lamp; float viewmat[4][4], winmat[4][4]; int winsize; /* bind framebuffer */ lamp = GetGPULamp(); GPU_lamp_shadow_buffer_bind(lamp, viewmat, &winsize, winmat); if (GPU_lamp_shadow_buffer_type(lamp) == LA_SHADMAP_VARIANCE) { m_rasterizer->SetShadowMode(RAS_IRasterizer::RAS_SHADOW_VARIANCE); } else { m_rasterizer->SetShadowMode(RAS_IRasterizer::RAS_SHADOW_SIMPLE); } /* GPU_lamp_shadow_buffer_bind() changes the viewport, so update the canvas */ canvas->UpdateViewPort(0, 0, winsize, winsize); /* setup camera transformation */ MT_Matrix4x4 modelviewmat((float *)viewmat); MT_Matrix4x4 projectionmat((float *)winmat); MT_Transform trans = MT_Transform((float *)viewmat); camtrans.invert(trans); cam->SetModelviewMatrix(modelviewmat); cam->SetProjectionMatrix(projectionmat); cam->NodeSetLocalPosition(camtrans.getOrigin()); cam->NodeSetLocalOrientation(camtrans.getBasis()); cam->NodeUpdateGS(0); /* setup rasterizer transformations */ /* SetViewMatrix may use stereomode which we temporarily disable here */ RAS_IRasterizer::StereoMode stereomode = m_rasterizer->GetStereoMode(); m_rasterizer->SetStereoMode(RAS_IRasterizer::RAS_STEREO_NOSTEREO); m_rasterizer->SetProjectionMatrix(projectionmat); m_rasterizer->SetViewMatrix(modelviewmat, cam->NodeGetWorldOrientation(), cam->NodeGetWorldPosition(), cam->NodeGetLocalScaling(), cam->GetCameraData()->m_perspective); m_rasterizer->SetStereoMode(stereomode); }
/** * Transforms the collision object. A cone is not correctly centered * for usage. */ void KX_RadarSensor::SynchronizeTransform() { // Getting the parent location was commented out. Why? MT_Transform trans; trans.setOrigin(((KX_GameObject*)GetParent())->NodeGetWorldPosition()); trans.setBasis(((KX_GameObject*)GetParent())->NodeGetWorldOrientation()); // What is the default orientation? pointing in the -y direction? // is the geometry correctly converted? // a collision cone is oriented // center the cone correctly // depends on the radar 'axis' switch (m_axis) { case SENS_RADAR_X_AXIS: // +X Axis { MT_Quaternion rotquatje(MT_Vector3(0,0,1),MT_radians(90)); trans.rotate(rotquatje); trans.translate(MT_Vector3 (0, -m_coneheight/2.0 ,0)); break; }; case SENS_RADAR_Y_AXIS: // +Y Axis { MT_Quaternion rotquatje(MT_Vector3(1,0,0),MT_radians(-180)); trans.rotate(rotquatje); trans.translate(MT_Vector3 (0, -m_coneheight/2.0 ,0)); break; }; case SENS_RADAR_Z_AXIS: // +Z Axis { MT_Quaternion rotquatje(MT_Vector3(1,0,0),MT_radians(-90)); trans.rotate(rotquatje); trans.translate(MT_Vector3 (0, -m_coneheight/2.0 ,0)); break; }; case SENS_RADAR_NEG_X_AXIS: // -X Axis { MT_Quaternion rotquatje(MT_Vector3(0,0,1),MT_radians(-90)); trans.rotate(rotquatje); trans.translate(MT_Vector3 (0, -m_coneheight/2.0 ,0)); break; }; case SENS_RADAR_NEG_Y_AXIS: // -Y Axis { //MT_Quaternion rotquatje(MT_Vector3(1,0,0),MT_radians(-180)); //trans.rotate(rotquatje); trans.translate(MT_Vector3 (0, -m_coneheight/2.0 ,0)); break; }; case SENS_RADAR_NEG_Z_AXIS: // -Z Axis { MT_Quaternion rotquatje(MT_Vector3(1,0,0),MT_radians(90)); trans.rotate(rotquatje); trans.translate(MT_Vector3 (0, -m_coneheight/2.0 ,0)); break; }; default: { } } //Using a temp variable to translate MT_Point3 to float[3]. //float[3] works better for the Python interface. MT_Point3 temp = trans.getOrigin(); m_cone_origin[0] = temp[0]; m_cone_origin[1] = temp[1]; m_cone_origin[2] = temp[2]; temp = trans(MT_Point3(0, -m_coneheight/2.0 ,0)); m_cone_target[0] = temp[0]; m_cone_target[1] = temp[1]; m_cone_target[2] = temp[2]; if (m_physCtrl) { PHY_IMotionState* motionState = m_physCtrl->GetMotionState(); const MT_Point3& pos = trans.getOrigin(); float ori[12]; trans.getBasis().getValue(ori); motionState->setWorldPosition(pos[0], pos[1], pos[2]); motionState->setWorldOrientation(ori); m_physCtrl->WriteMotionStateToDynamics(true); } }