123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556 |
- //===========================================================================//
- // Copyright (C) Microsoft Corporation. All rights reserved. //
- //===========================================================================//
- #include "MLRHeaders.hpp"
- #if defined(TRACE_ENABLED) && defined(MLR_TRACE)
- BitTrace *MLR_I_DT_PMesh_Clip;
- #endif
- //#############################################################################
- //###### MLRIndexedPolyMesh with no color no lighting two texture layer ######
- //#############################################################################
- MLR_I_DT_PMesh::ClassData*
- MLR_I_DT_PMesh::DefaultData = NULL;
- DynamicArrayOf<Vector2DScalar>
- *MLR_I_DT_PMesh::clipExtraTexCoords2;
- DynamicArrayOf<Vector2DScalar>
- *MLR_I_DT_PMesh::texCoords2;
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLR_I_DT_PMesh::InitializeClass()
- {
- Verify(!DefaultData);
- Verify(gos_GetCurrentHeap() == StaticHeap);
- DefaultData =
- new ClassData(
- MLR_I_DT_PMeshClassID,
- "MidLevelRenderer::MLR_I_DT_PMesh",
- MLR_I_PMesh::DefaultData,
- (MLRPrimitiveBase::Factory)&Make
- );
- Register_Object(DefaultData);
-
- clipExtraTexCoords2 = new DynamicArrayOf<Vector2DScalar>;
- Register_Object(clipExtraTexCoords2);
- clipExtraTexCoords2->SetLength(Limits::Max_Number_Vertices_Per_Mesh);
- texCoords2 = new DynamicArrayOf<Vector2DScalar>;
- Register_Object(texCoords2);
- texCoords2->SetLength(Limits::Max_Number_Vertices_Per_Mesh);
- #if defined(TRACE_ENABLED) && defined(MLR_TRACE)
- MLR_I_DT_PMesh_Clip = new BitTrace("MLR_I_DT_PMesh_Clip");
- Register_Object(MLR_I_DT_PMesh_Clip);
- #endif
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLR_I_DT_PMesh::TerminateClass()
- {
- Unregister_Object(clipExtraTexCoords2);
- delete clipExtraTexCoords2;
- Unregister_Object(texCoords2);
- delete texCoords2;
- Unregister_Object(DefaultData);
- delete DefaultData;
- DefaultData = NULL;
- #if defined(TRACE_ENABLED) && defined(MLR_TRACE)
- Unregister_Object(MLR_I_DT_PMesh_Clip);
- delete MLR_I_DT_PMesh_Clip;
- #endif
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- MLR_I_DT_PMesh::MLR_I_DT_PMesh(
- ClassData *class_data,
- MemoryStream *stream,
- int version
- ):
- MLR_I_PMesh(class_data, stream, version)
- {
- Check_Pointer(this);
- Check_Pointer(stream);
- Verify(gos_GetCurrentHeap() == Heap);
- referenceState2.Load(stream, version);
- referenceState2.SetZBufferWriteOff();
- referenceState.SetPriority(MLRState::DefaultPriority);
- referenceState2.SetPriority(MLRState::DefaultPriority);
- #if 0
- referenceState.SetPriority(MLRState::DefaultPriority+1);
- referenceState2.SetAlphaMode(MLRState::OneZeroMode);
- referenceState.SetAlphaMode(MLRState::AlphaInvAlphaMode);
- #endif
- passes = 2;
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- MLR_I_DT_PMesh::MLR_I_DT_PMesh(ClassData *class_data):
- MLR_I_PMesh(class_data)
- {
- Check_Pointer(this);
- Verify(gos_GetCurrentHeap() == Heap);
- passes = 2;
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- MLR_I_DT_PMesh::~MLR_I_DT_PMesh()
- {
- Check_Object(this);
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- MLR_I_DT_PMesh*
- MLR_I_DT_PMesh::Make(
- MemoryStream *stream,
- int version
- )
- {
- Check_Object(stream);
- gos_PushCurrentHeap(Heap);
- MLR_I_DT_PMesh *mesh = new MLR_I_DT_PMesh(DefaultData, stream, version);
- gos_PopCurrentHeap();
- return mesh;
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLR_I_DT_PMesh::Save(MemoryStream *stream)
- {
- Check_Object(this);
- Check_Object(stream);
- MLR_I_PMesh::Save(stream);
- referenceState2.Save(stream);
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLR_I_DT_PMesh::TestInstance() const
- {
- Verify(IsDerivedFrom(DefaultData));
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLR_I_DT_PMesh::SetTexCoordData(
- const Vector2DScalar *data,
- int dataSize
- )
- {
- Check_Object(this);
- Check_Pointer(data);
- Verify(coords.GetLength() == 0 || dataSize == 2*coords.GetLength());
- texCoords.AssignData((Vector2DScalar *)data, dataSize);
- }
- #define I_SAY_YES_TO_DUAL_TEXTURES
- #undef I_SAY_YES_TO_COLOR
- #undef I_SAY_YES_TO_LIGHTING
- #define CLASSNAME MLR_I_DT_PMesh
- #if defined(TRACE_ENABLED) && defined(MLR_TRACE)
- #define SET_MLR_PMESH_CLIP() MLR_I_DT_PMesh_Clip->Set()
- #define CLEAR_MLR_PMESH_CLIP() MLR_I_DT_PMesh_Clip->Clear()
- #else
- #define SET_MLR_PMESH_CLIP()
- #define CLEAR_MLR_PMESH_CLIP()
- #endif
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- // This include contains follwing functions:
- // void MLR_I_DT_PMesh::TransformNoClip(Matrix4D*, GOSVertexPool*);
- // int MLR_I_DT_PMesh::Clip(MLRClippingState, GOSVertexPool*);
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- #include <MLR\MLRPrimitiveClipping.hpp>
- #undef I_SAY_YES_TO_DUAL_TEXTURES
- #undef CLASSNAME
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- MLR_I_DT_PMesh*
- MidLevelRenderer::CreateIndexedCube_NoColor_NoLit_2Tex(
- Scalar half,
- MLRState *state,
- MLRState *state2
- )
- {
- gos_PushCurrentHeap(Heap);
- MLR_I_DT_PMesh *ret = new MLR_I_DT_PMesh();
- 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[16];
- Register_Pointer(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);
- texCoords[8] = Vector2DScalar(0.0f, 0.0f);
- texCoords[9] = Vector2DScalar(0.0f, 0.0f);
- texCoords[10] = Vector2DScalar(0.0f, 0.0f);
- texCoords[12] = Vector2DScalar(0.0f, 0.0f);
- texCoords[13] = Vector2DScalar(0.0f, 0.0f);
- texCoords[14] = Vector2DScalar(0.0f, 0.0f);
- texCoords[15] = Vector2DScalar(0.0f, 0.0f);
- texCoords[16] = 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);
- }
- }
- if(state2 != NULL)
- {
- ret->SetReferenceState(*state, 1);
- if(state2->GetTextureHandle() > 0)
- {
- texCoords[8] = Vector2DScalar(0.0f, 0.0f);
- texCoords[9] = Vector2DScalar(1.0f, 0.0f);
- texCoords[10] = Vector2DScalar(0.25f, 0.25f);
- texCoords[11] = Vector2DScalar(0.75f, 0.25f);
- texCoords[12] = Vector2DScalar(1.0f, 1.0f);
- texCoords[13] = Vector2DScalar(0.0f, 1.0f);
- texCoords[14] = Vector2DScalar(0.25f, 0.75f);
- texCoords[15] = Vector2DScalar(0.75f, 0.75f);
- }
- }
- ret->SetTexCoordData(texCoords, 16);
- Unregister_Object(texCoords);
- delete [] texCoords;
- Unregister_Pointer(index);
- delete [] index;
- Unregister_Pointer(lengths);
- delete [] lengths;
- Unregister_Object(coords);
- delete [] coords;
- gos_PopCurrentHeap();
- return ret;
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- MLRShape*
- MidLevelRenderer::CreateIndexedIcosahedron_NoColor_NoLit_2Tex(
- IcoInfo& icoInfo,
- MLRState *state,
- MLRState *state2
- )
- {
- 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;
- }
- unsigned char *lengths = new unsigned char [nrTri];
- Register_Pointer(lengths);
- for(i=0;i<nrTri;i++)
- {
- lengths[i] = 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[2*nrTri*3];
- Register_Pointer(texCoords);
- int uniquePoints = 0;
- for (k=0;k<20;k++)
- {
- triDrawn = 0;
- MLR_I_DT_PMesh *mesh = new MLR_I_DT_PMesh();
- 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(lengths, nrTri);
- if(icoInfo.indexed==true)
- {
- uniquePoints = 1;
- collapsedCoords[0] = coords[0];
- index[0] = 0;
- for(i=1;i<nrTri*3;i++)
- {
- for(j=0;j<uniquePoints;j++)
- {
- if(coords[i] == collapsedCoords[j])
- {
- break;
- }
- }
- if(j==uniquePoints)
- {
- collapsedCoords[uniquePoints++] = coords[i];
- }
- index[i] = static_cast<unsigned short>(j);
- }
- mesh->SetCoordData(collapsedCoords, uniquePoints);
- }
- else
- {
- uniquePoints = nrTri*3;
- for(i=0;i<nrTri*3;i++)
- {
- index[i] = static_cast<unsigned short>(i);
- }
- mesh->SetCoordData(coords, nrTri*3);
- }
- mesh->SetIndexData(index, nrTri*3);
- mesh->FindFacePlanes();
- if(state == NULL)
- {
- for(i=0;i<2*uniquePoints;i++)
- {
- texCoords[i] = Vector2DScalar(0.0f, 0.0f);
- }
- }
- else
- {
- mesh->SetReferenceState(*state);
- if(state->GetTextureHandle() > 0)
- {
- if(icoInfo.indexed==true)
- {
- for(i=0;i<uniquePoints;i++)
- {
- texCoords[i] =
- Vector2DScalar(
- (1.0f + collapsedCoords[i].x)/2.0f,
- (1.0f + collapsedCoords[i].y)/2.0f
- );
- texCoords[i+uniquePoints] =
- Vector2DScalar(
- (1.0f + collapsedCoords[i].x)/2.0f,
- (1.0f + collapsedCoords[i].z)/2.0f
- );
- }
- }
- else
- {
- for(i=0;i<nrTri;i++)
- {
- texCoords[3*i] =
- Vector2DScalar(
- (1.0f + coords[3*i].x)/2.0f,
- (1.0f + coords[3*i].y)/2.0f
- );
- texCoords[3*i+1] =
- Vector2DScalar(
- (1.0f + coords[3*i+1].x)/2.0f,
- (1.0f + coords[3*i+1].y)/2.0f
- );
- texCoords[3*i+2] =
- Vector2DScalar(
- (1.0f + coords[3*i+2].x)/2.0f,
- (1.0f + coords[3*i+2].y)/2.0f
- );
- texCoords[3*i+nrTri] =
- Vector2DScalar(
- (1.0f + coords[3*i].x)/2.0f,
- (1.0f + coords[3*i].z)/2.0f
- );
- texCoords[3*i+1+nrTri] =
- Vector2DScalar(
- (1.0f + coords[3*i+1].x)/2.0f,
- (1.0f + coords[3*i+1].z)/2.0f
- );
- texCoords[3*i+2+nrTri] =
- Vector2DScalar(
- (1.0f + coords[3*i+2].x)/2.0f,
- (1.0f + coords[3*i+2].z)/2.0f
- );
- }
- }
- }
- else
- {
- for(i=0;i<2*uniquePoints;i++)
- {
- texCoords[i] = Vector2DScalar(0.0f, 0.0f);
- }
- }
- }
- mesh->SetTexCoordData(texCoords, 2*uniquePoints);
- mesh->SetReferenceState(*state2);
- 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;
-
- Unregister_Pointer(lengths);
- delete [] lengths;
- gos_PopCurrentHeap();
- return ret;
- }
|