//===========================================================================// // Copyright (C) Microsoft Corporation. All rights reserved. // //===========================================================================// #include "MLRHeaders.hpp" extern DWORD gEnableDetailTexture; #if defined(TRACE_ENABLED) && defined(MLR_TRACE) BitTrace *MLR_I_DeT_TMesh_Clip; #endif //############################################################################# //###### MLRIndexedPolyMesh with no color no lighting two texture layer ###### //############################################################################# MLR_I_DeT_TMesh::ClassData* MLR_I_DeT_TMesh::DefaultData = NULL; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void MLR_I_DeT_TMesh::InitializeClass() { Verify(!DefaultData); Verify(gos_GetCurrentHeap() == StaticHeap); DefaultData = new ClassData( MLR_I_DeT_TMeshClassID, "MidLevelRenderer::MLR_I_DeT_TMesh", MLR_I_TMesh::DefaultData, (MLRPrimitiveBase::Factory)&Make ); Register_Object(DefaultData); #if defined(TRACE_ENABLED) && defined(MLR_TRACE) MLR_I_DeT_TMesh_Clip = new BitTrace("MLR_I_DeT_TMesh_Clip"); Register_Object(MLR_I_DeT_TMesh_Clip); #endif } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void MLR_I_DeT_TMesh::TerminateClass() { Unregister_Object(DefaultData); delete DefaultData; DefaultData = NULL; #if defined(TRACE_ENABLED) && defined(MLR_TRACE) Unregister_Object(MLR_I_DeT_TMesh_Clip); delete MLR_I_DeT_TMesh_Clip; #endif } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // MLR_I_DeT_TMesh::MLR_I_DeT_TMesh( ClassData *class_data, MemoryStream *stream, int version ): MLR_I_TMesh(class_data, stream, version) { Check_Pointer(this); Check_Pointer(stream); Verify(gos_GetCurrentHeap() == Heap); referenceState2.Load(stream, version); *stream >> xOffset >> yOffset >> xScale >> yScale; *stream >> fadeDetailStart >> fadeDetailEnd; fadeMultiplicator = 255.9f/(fadeDetailStart-fadeDetailEnd); referenceState2.SetZBufferWriteOff(); #if 0 referenceState.SetPriority(MLRState::DefaultPriority); referenceState2.SetPriority(MLRState::DefaultPriority); referenceState.SetPriority(MLRState::DefaultPriority+1); referenceState2.SetAlphaMode(MLRState::OneZeroMode); referenceState.SetAlphaMode(MLRState::AlphaInvAlphaMode); #endif detTextureVisible = true; passes = 2; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // MLR_I_DeT_TMesh::MLR_I_DeT_TMesh(ClassData *class_data): MLR_I_TMesh(class_data) { Check_Pointer(this); Verify(gos_GetCurrentHeap() == Heap); fadeDetailStart = 0.0f; fadeDetailEnd = 1.0f; fadeMultiplicator = 0.0f; detTextureVisible = true; passes = 2; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void MLR_I_DeT_TMesh::Copy( MLR_I_TMesh *tMesh, MLRState detailState, Stuff::Scalar xOff, Stuff::Scalar yOff, Stuff::Scalar xFac, Stuff::Scalar yFac ) { Check_Object(this); Check_Object(tMesh); Verify(gos_GetCurrentHeap() == Heap); int len; unsigned short *_index; Point3D *_coords; Vector2DScalar *_texCoords; tMesh->GetCoordData(&_coords, &len); SetCoordData(_coords, len); tMesh->GetIndexData(&_index, &len); SetIndexData(_index, len); SetSubprimitiveLengths(NULL, tMesh->GetNumPrimitives()); facePlanes.SetLength(GetNumPrimitives()); testList.SetLength(GetNumPrimitives()); FindFacePlanes(); tMesh->GetTexCoordData(&_texCoords, &len); SetTexCoordData(_texCoords, len); referenceState = tMesh->GetReferenceState(); visibleIndexedVerticesKey = false; visibleIndexedVertices.SetLength(coords.GetLength()); referenceState2 = detailState; SetDetailData(xOff, xFac, xFac, yFac, 80.0f, 100.0f); detTextureVisible = true; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // MLR_I_DeT_TMesh::~MLR_I_DeT_TMesh() { Check_Object(this); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // MLR_I_DeT_TMesh* MLR_I_DeT_TMesh::Make( MemoryStream *stream, int version ) { Check_Object(stream); gos_PushCurrentHeap(Heap); MLR_I_DeT_TMesh *mesh = new MLR_I_DeT_TMesh(DefaultData, stream, version); gos_PopCurrentHeap(); return mesh; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void MLR_I_DeT_TMesh::Save(MemoryStream *stream) { Check_Object(this); Check_Object(stream); MLR_I_TMesh::Save(stream); referenceState2.Save(stream); *stream << xOffset << yOffset << xScale << yScale; *stream << fadeDetailStart << fadeDetailEnd; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void MLR_I_DeT_TMesh::SetDetailData( Stuff::Scalar xOff, Stuff::Scalar yOff, Stuff::Scalar xFac, Stuff::Scalar yFac, Stuff::Scalar detailStart, Stuff::Scalar detailEnd ) { Check_Object(this); xOffset = xOff; yOffset = yOff; xScale = xFac; yScale = yFac; fadeDetailStart = 1.0f/detailStart; Verify(detailEnd>0.0f); fadeDetailEnd = 1.0f/detailEnd; Verify(detailStart!=detailEnd); fadeMultiplicator = 255.9f/(fadeDetailStart-fadeDetailEnd); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // int MLR_I_DeT_TMesh::GetNumPasses() { Check_Object(this); Check_Object(this); if(gEnableDetailTexture==0 || detTextureVisible==false) { return 1; } if(MLRState::GetMultitextureLightMap() == true && state.GetMultiTextureMode()!=MLRState::MultiTextureOffMode) { return 1; } return 2; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void MLR_I_DeT_TMesh::TestInstance() const { Verify(IsDerivedFrom(DefaultData)); } #define I_SAY_YES_TO_DETAIL_TEXTURES #undef I_SAY_YES_TO_DUAL_TEXTURES #undef I_SAY_YES_TO_COLOR #undef I_SAY_YES_TO_LIGHTING #define CLASSNAME MLR_I_DeT_TMesh #if defined(TRACE_ENABLED) && defined(MLR_TRACE) #define SET_MLR_TMESH_CLIP() MLR_I_DeT_TMesh_Clip->Set() #define CLEAR_MLR_TMESH_CLIP() MLR_I_DeT_TMesh_Clip->Clear() #else #define SET_MLR_TMESH_CLIP() #define CLEAR_MLR_TMESH_CLIP() #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // This include contains follwing functions: // void MLR_I_DeT_TMesh::TransformNoClip(Matrix4D*, GOSVertexPool*); // int MLR_I_DeT_TMesh::Clip(MLRClippingState, GOSVertexPool*); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include #undef I_SAY_YES_TO_DETAIL_TEXTURES #undef CLASSNAME //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // MLR_I_DeT_TMesh* MidLevelRenderer::CreateIndexedTriCube_NoColor_NoLit_DetTex( Scalar half, MLRState *state, MLRState *state1 ) { #if 0 gos_PushCurrentHeap(Heap); MLR_I_TMesh *ret = new MLR_I_TMesh(); Register_Object(ret); Point3D *coords = new Point3D [8]; Register_Object(coords); coords[0] = Point3D( half, -half, half); coords[1] = Point3D(-half, -half, half); coords[2] = Point3D( half, -half, -half); coords[3] = Point3D(-half, -half, -half); coords[4] = Point3D(-half, half, half); coords[5] = Point3D( half, half, half); coords[6] = Point3D( half, half, -half); coords[7] = Point3D(-half, half, -half); unsigned char *lengths = new unsigned char [6]; Register_Pointer(lengths); int i; for(i=0;i<6;i++) { lengths[i] = 4; } ret->SetSubprimitiveLengths(lengths, 6); ret->SetCoordData(coords, 8); unsigned short *index = new unsigned short [6*4]; Register_Pointer(index); index[0] = 0; index[1] = 2; index[2] = 6; index[3] = 5; index[4] = 0; index[5] = 5; index[6] = 4; index[7] = 1; index[8] = 5; index[9] = 6; index[10] = 7; index[11] = 4; index[12] = 2; index[13] = 3; index[14] = 7; index[15] = 6; index[16] = 1; index[17] = 4; index[18] = 7; index[19] = 3; index[20] = 0; index[21] = 1; index[22] = 3; index[23] = 2; ret->SetIndexData(index, 6*4); ret->FindFacePlanes(); Vector2DScalar *texCoords = new Vector2DScalar[8]; Register_Object(texCoords); texCoords[0] = Vector2DScalar(0.0f, 0.0f); texCoords[1] = Vector2DScalar(0.0f, 0.0f); texCoords[2] = Vector2DScalar(0.0f, 0.0f); texCoords[3] = Vector2DScalar(0.0f, 0.0f); texCoords[4] = Vector2DScalar(0.0f, 0.0f); texCoords[5] = Vector2DScalar(0.0f, 0.0f); texCoords[6] = Vector2DScalar(0.0f, 0.0f); texCoords[7] = Vector2DScalar(0.0f, 0.0f); if(state != NULL) { ret->SetReferenceState(*state); if(state->GetTextureHandle() > 0) { texCoords[0] = Vector2DScalar(0.0f, 0.0f); texCoords[1] = Vector2DScalar(1.0f, 0.0f); texCoords[2] = Vector2DScalar(0.25f, 0.25f); texCoords[3] = Vector2DScalar(0.75f, 0.25f); texCoords[4] = Vector2DScalar(1.0f, 1.0f); texCoords[5] = Vector2DScalar(0.0f, 1.0f); texCoords[6] = Vector2DScalar(0.25f, 0.75f); texCoords[7] = Vector2DScalar(0.75f, 0.75f); } } ret->SetTexCoordData(texCoords, 8); Unregister_Object(texCoords); delete [] texCoords; Unregister_Pointer(index); delete [] index; Unregister_Pointer(lengths); delete [] lengths; Unregister_Object(coords); delete [] coords; gos_PopCurrentHeap(); return ret; #endif return NULL; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // MLRShape* MidLevelRenderer::CreateIndexedTriIcosahedron_NoColor_NoLit_DetTex( IcoInfo& icoInfo, MLRState *state, MLRState *stateDet ) { gos_PushCurrentHeap(Heap); MLRShape *ret = new MLRShape(20); Register_Object(ret); int i, j, k; long nrTri = (long) ceil (icoInfo.all * pow (4.0f, icoInfo.depth)); Point3D v[3]; if(3*nrTri >= Limits::Max_Number_Vertices_Per_Mesh) { nrTri = Limits::Max_Number_Vertices_Per_Mesh/3; } Point3D *coords = new Point3D [nrTri*3]; Register_Pointer(coords); Point3D *collapsedCoords = NULL; if(icoInfo.indexed==true) { collapsedCoords = new Point3D [nrTri*3]; Register_Pointer(collapsedCoords); } unsigned short *index = new unsigned short [nrTri*3]; Register_Pointer(index); Vector2DScalar *texCoords = new Vector2DScalar[nrTri*3]; Register_Pointer(texCoords); int uniquePoints = 0; for (k=0;k<20;k++) { triDrawn = 0; MLR_I_DeT_TMesh *mesh = new MLR_I_DeT_TMesh(); Register_Object(mesh); // setup vertex position information for (j=0;j<3;j++) { v[j].x = vdata[tindices[k][j]][0]; v[j].y = vdata[tindices[k][j]][1]; v[j].z = vdata[tindices[k][j]][2]; } subdivide (coords, v[0], v[1], v[2], icoInfo.depth, nrTri, icoInfo.radius); mesh->SetSubprimitiveLengths(NULL, nrTri); if(icoInfo.indexed==true) { uniquePoints = 1; collapsedCoords[0] = coords[0]; index[0] = 0; for(i=1;i(j); } mesh->SetCoordData(collapsedCoords, uniquePoints); } else { uniquePoints = nrTri*3; for(i=0;i(i); } mesh->SetCoordData(coords, nrTri*3); } mesh->SetIndexData(index, nrTri*3); mesh->FindFacePlanes(); if(state == NULL) { for(i=0;iSetMultiTextureMode(MLRState::MultiTextureLightmapMode); mesh->SetReferenceState(*state); state->SetMultiTextureMode(MLRState::MultiTextureOffMode); if(state->GetTextureHandle() > 0) { if(icoInfo.indexed==true) { for(i=0;iSetTexCoordData(texCoords, uniquePoints); mesh->SetDetailData(0.0f, 0.0f, 16.0f, 16.0f, 50.0f, 70.0f); mesh->SetReferenceState(*stateDet, 1); ret->Add(mesh); mesh->DetachReference(); } Unregister_Pointer(texCoords); delete [] texCoords; Unregister_Pointer(index); delete [] index; if(icoInfo.indexed==true) { Unregister_Pointer(collapsedCoords); delete [] collapsedCoords; } Unregister_Pointer(coords); delete [] coords; gos_PopCurrentHeap(); return ret; }