void CTexelNormalMethod::GenerateTexel(size_t iTexel, CConversionMeshInstance* pMeshInstance, CConversionFace* pFace, CConversionVertex* pV1, CConversionVertex* pV2, CConversionVertex* pV3, raytrace::CTraceResult* tr, const Vector& vecUVPosition, raytrace::CRaytracer* pTracer) { CConversionFace* pHitFace = tr->m_pMeshInstance->GetMesh()->GetFace(tr->m_iFace); Vector vecHitNormal = pHitFace->GetNormal(tr->m_vecHit, tr->m_pMeshInstance); // Build rotation matrix Matrix4x4 mObjectToTangent; Vector t = pFace->GetBaseVector(vecUVPosition, 0, pMeshInstance); Vector b = pFace->GetBaseVector(vecUVPosition, 1, pMeshInstance); Vector n = pFace->GetBaseVector(vecUVPosition, 2, pMeshInstance); mObjectToTangent.SetForwardVector(t); mObjectToTangent.SetUpVector(b); mObjectToTangent.SetRightVector(n); mObjectToTangent.InvertRT(); Vector vecTangentNormal = mObjectToTangent*vecHitNormal; m_pGenerator->GetParallelizer()->LockData(); m_avecNormalValues[iTexel] += vecTangentNormal; m_pGenerator->MarkTexelUsed(iTexel); m_pGenerator->GetParallelizer()->UnlockData(); }
CStructure* CStructure::CreateStructure(structure_type eType, CSPPlayer* pOwner, CSpire* pSpire, const CScalableVector& vecOrigin) { CStructure* pStructure = nullptr; switch (eType) { default: case STRUCTURE_NONE: TAssert(false); return nullptr; case STRUCTURE_SPIRE: pStructure = GameServer()->Create<CSpire>("CSpire"); break; case STRUCTURE_MINE: pStructure = GameServer()->Create<CMine>("CMine"); break; case STRUCTURE_PALLET: pStructure = GameServer()->Create<CPallet>("CPallet"); break; case STRUCTURE_STOVE: pStructure = GameServer()->Create<CStove>("CStove"); break; } pStructure->GameData().SetPlayerOwner(pOwner->GetPlayerCharacter()->GameData().GetPlayerOwner()); pStructure->GameData().SetPlanet(pOwner->GetPlayerCharacter()->GameData().GetPlanet()); pStructure->SetOwner(pOwner); pStructure->SetSpire(pSpire); pStructure->SetGlobalOrigin(pOwner->GetPlayerCharacter()->GameData().GetPlanet()->GetGlobalOrigin()); // Avoid floating point precision problems pStructure->SetMoveParent(pOwner->GetPlayerCharacter()->GameData().GetPlanet()); pStructure->SetLocalOrigin(vecOrigin); if (pStructure->GameData().GetPlanet()) { Vector vecUp = pStructure->GetLocalOrigin().Normalized(); Matrix4x4 mDirection; mDirection.SetUpVector(vecUp); mDirection.SetForwardVector(vecUp.Cross(pOwner->GetPlayerCharacter()->GetLocalTransform().GetRightVector()).Normalized()); mDirection.SetRightVector(mDirection.GetForwardVector().Cross(vecUp).Normalized()); pStructure->SetLocalAngles(mDirection.GetAngles()); } pStructure->AddToPhysics(CT_STATIC_MESH); pStructure->PostConstruction(); return pStructure; }
Matrix4x4 Matrix4x4::ConstructCameraView(const Vector& vecPosition, const Vector& vecDirection, const Vector& vecUp) { Matrix4x4 m; m.Identity(); TAssertNoMsg(fabs(vecDirection.LengthSqr()-1) < 0.0001f); Vector vecCamSide = vecDirection.Cross(vecUp).Normalized(); Vector vecCamUp = vecCamSide.Cross(vecDirection); m.SetForwardVector(Vector(vecCamSide.x, vecCamUp.x, -vecDirection.x)); m.SetLeftVector(Vector(vecCamSide.y, vecCamUp.y, -vecDirection.y)); m.SetUpVector(Vector(vecCamSide.z, vecCamUp.z, -vecDirection.z)); m.AddTranslation(-vecPosition); return m; }