MT_Transform KX_Camera::GetWorldToCamera() const { MT_Transform camtrans; camtrans.invert(MT_Transform(NodeGetWorldPosition(), NodeGetWorldOrientation())); return camtrans; }
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 RAS_MaterialBucket::RenderMeshSlot(const MT_Transform& cameratrans, RAS_IRasterizer* rasty, RAS_IRenderTools* rendertools, RAS_MeshSlot &ms) { m_material->ActivateMeshSlot(ms, rasty); if (ms.m_pDeformer) { ms.m_pDeformer->Apply(m_material); // KX_ReInstanceShapeFromMesh(ms.m_mesh); // Recompute the physics mesh. (Can't call KX_* from RAS_) } if (IsZSort() && rasty->GetDrawingMode() >= RAS_IRasterizer::KX_SOLID) ms.m_mesh->SortPolygons(ms, cameratrans*MT_Transform(ms.m_OpenGLMatrix)); rendertools->PushMatrix(); if (!ms.m_pDeformer || !ms.m_pDeformer->SkipVertexTransform()) { rendertools->applyTransform(rasty,ms.m_OpenGLMatrix,m_material->GetDrawingMode()); } if (rasty->QueryLists()) if (ms.m_DisplayList) ms.m_DisplayList->SetModified(ms.m_mesh->MeshModified()); // verify if we can use display list, not for deformed object, and // also don't create a new display list when drawing shadow buffers, // then it won't have texture coordinates for actual drawing. also // for zsort we can't make a display list, since the polygon order // changes all the time. if (ms.m_pDeformer && ms.m_pDeformer->IsDynamic()) ms.m_bDisplayList = false; else if (!ms.m_DisplayList && rasty->GetDrawingMode() == RAS_IRasterizer::KX_SHADOW) ms.m_bDisplayList = false; else if (IsZSort()) ms.m_bDisplayList = false; else if (m_material->UsesObjectColor() && ms.m_bObjectColor) ms.m_bDisplayList = false; else ms.m_bDisplayList = true; // for text drawing using faces if (m_material->GetDrawingMode() & RAS_IRasterizer::RAS_RENDER_3DPOLYGON_TEXT) rasty->IndexPrimitives_3DText(ms, m_material, rendertools); // for multitexturing else if ((m_material->GetFlag() & (RAS_MULTITEX|RAS_BLENDERGLSL))) rasty->IndexPrimitivesMulti(ms); // use normal IndexPrimitives else rasty->IndexPrimitives(ms); if (rasty->QueryLists()) if (ms.m_DisplayList) ms.m_mesh->SetMeshModified(false); rendertools->PopMatrix(); }
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); }
void RAS_MaterialBucket::RenderMeshSlot(const MT_Transform& cameratrans, RAS_IRasterizer *rasty, RAS_MeshSlot *ms) { RAS_MeshUser *meshUser = ms->m_meshUser; rasty->SetClientObject(meshUser->GetClientObject()); rasty->SetFrontFace(meshUser->GetFrontFace()); // Inverse condition of in ActivateMaterial. if (rasty->GetOverrideShader() == RAS_IRasterizer::RAS_OVERRIDE_SHADER_NONE) { bool uselights = m_material->UsesLighting(rasty); rasty->ProcessLighting(uselights, cameratrans); m_material->ActivateMeshSlot(ms, rasty); } else { // Set cull face without activating the material. rasty->SetCullFace(m_material->IsCullFace()); } if (IsZSort() && rasty->GetDrawingMode() >= RAS_IRasterizer::RAS_SOLID) { ms->m_mesh->SortPolygons(ms, cameratrans * MT_Transform(meshUser->GetMatrix())); ms->m_displayArrayBucket->SetPolygonsModified(rasty); } rasty->PushMatrix(); if ((!ms->m_pDeformer || !ms->m_pDeformer->SkipVertexTransform()) && !m_material->IsText()) { float mat[16]; rasty->GetTransform(meshUser->GetMatrix(), m_material->GetDrawingMode(), mat); rasty->MultMatrix(mat); } if (m_material->IsText()) { rasty->IndexPrimitivesText(ms); } else { rasty->IndexPrimitives(ms); } rasty->PopMatrix(); }
MT_Transform KX_Camera::GetCameraToWorld() const { return MT_Transform(NodeGetWorldPosition(), NodeGetWorldOrientation()); }
MT_Transform SG_Spatial::GetWorldTransform() const { return MT_Transform(m_worldPosition, m_worldRotation.scaled( m_worldScaling[0], m_worldScaling[1], m_worldScaling[2])); }
bool KX_BoneParentRelation:: UpdateChildCoordinates( SG_Spatial * child, const SG_Spatial * parent, bool& parentUpdated ) { MT_assert(child != NULL); // This way of accessing child coordinates is a bit cumbersome // be nice to have non constant reference access to these values. const MT_Vector3 & child_scale = child->GetLocalScale(); const MT_Point3 & child_pos = child->GetLocalPosition(); const MT_Matrix3x3 & child_rotation = child->GetLocalOrientation(); // we don't know if the armature has been updated or not, assume yes parentUpdated = true; // the childs world locations which we will update. MT_Vector3 child_w_scale; MT_Point3 child_w_pos; MT_Matrix3x3 child_w_rotation; bool valid_parent_transform = false; if (parent) { BL_ArmatureObject *armature = (BL_ArmatureObject*)(parent->GetSGClientObject()); if (armature) { MT_Matrix4x4 parent_matrix; if (armature->GetBoneMatrix(m_bone, parent_matrix)) { // Get the child's transform, and the bone matrix. MT_Matrix4x4 child_transform ( MT_Transform(child_pos + MT_Vector3(0.0f, armature->GetBoneLength(m_bone), 0.0f), child_rotation.scaled( child_scale[0], child_scale[1], child_scale[2]))); // The child's world transform is parent * child parent_matrix = parent->GetWorldTransform() * parent_matrix; child_transform = parent_matrix * child_transform; // Recompute the child transform components from the transform. child_w_scale.setValue( MT_Vector3(child_transform[0][0], child_transform[0][1], child_transform[0][2]).length(), MT_Vector3(child_transform[1][0], child_transform[1][1], child_transform[1][2]).length(), MT_Vector3(child_transform[2][0], child_transform[2][1], child_transform[2][2]).length()); child_w_rotation.setValue(child_transform[0][0], child_transform[0][1], child_transform[0][2], child_transform[1][0], child_transform[1][1], child_transform[1][2], child_transform[2][0], child_transform[2][1], child_transform[2][2]); child_w_rotation.scale(1.0f/child_w_scale[0], 1.0f/child_w_scale[1], 1.0f/child_w_scale[2]); child_w_pos = MT_Point3(child_transform[0][3], child_transform[1][3], child_transform[2][3]); valid_parent_transform = true; } } } if (valid_parent_transform) { child->SetWorldScale(child_w_scale); child->SetWorldPosition(child_w_pos); child->SetWorldOrientation(child_w_rotation); } else { child->SetWorldFromLocalTransform(); } child->ClearModified(); // this node must always be updated, so reschedule it for next time child->ActivateRecheduleUpdateCallback(); return valid_parent_transform; }