123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663 |
- //===========================================================================//
- // Copyright (C) Microsoft Corporation. All rights reserved. //
- //===========================================================================//
- #include "MLRHeaders.hpp"
- #if defined(TRACE_ENABLED) && defined(MLR_TRACE)
- BitTrace *MLR_I_L_PMesh_Clip;
- #endif
- //#############################################################################
- //######## MLRIndexedPolyMesh with color and lighting one texture layer ######
- //#############################################################################
- MLR_I_L_PMesh::ClassData*
- MLR_I_L_PMesh::DefaultData = NULL;
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLR_I_L_PMesh::InitializeClass()
- {
- Verify(!DefaultData);
- Verify(gos_GetCurrentHeap() == StaticHeap);
- DefaultData =
- new ClassData(
- MLR_I_L_PMeshClassID,
- "MidLevelRenderer::MLR_I_L_PMesh",
- MLR_I_C_PMesh::DefaultData,
- (MLRPrimitiveBase::Factory)&Make
- );
- Register_Object(DefaultData);
- #if defined(TRACE_ENABLED) && defined(MLR_TRACE)
- MLR_I_L_PMesh_Clip = new BitTrace("MLR_I_L_PMesh_Clip");
- Register_Object(MLR_I_L_PMesh_Clip);
- #endif
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLR_I_L_PMesh::TerminateClass()
- {
- Unregister_Object(DefaultData);
- delete DefaultData;
- DefaultData = NULL;
- #if defined(TRACE_ENABLED) && defined(MLR_TRACE)
- Unregister_Object(MLR_I_L_PMesh_Clip);
- delete MLR_I_L_PMesh_Clip;
- #endif
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- MLR_I_L_PMesh::MLR_I_L_PMesh(
- ClassData *class_data,
- MemoryStream *stream,
- int version
- ):
- MLR_I_C_PMesh(DefaultData, stream, version)
- {
- Check_Pointer(this);
- Check_Pointer(stream);
- Verify(gos_GetCurrentHeap() == Heap);
- switch(version)
- {
- case 1:
- case 2:
- {
- STOP(("This class got created only after version 2 !"));
- }
- break;
- default:
- {
- MemoryStreamIO_Read(stream, &normals);
- }
- break;
- }
- litColors.SetLength(colors.GetLength());
- actualColors = &colors;
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- MLR_I_L_PMesh::MLR_I_L_PMesh(ClassData *class_data):
- MLR_I_C_PMesh(class_data), normals(0)
- {
- Check_Pointer(this);
- Verify(gos_GetCurrentHeap() == Heap);
- actualColors = &colors;
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- /*
- void
- MLR_I_L_PMesh::Copy(MLRIndexedPolyMesh *polyMesh)
- {
- Check_Pointer(this);
- int len;
- Vector3D *_normals;
- MLR_I_C_PMesh::Copy(polyMesh);
- polyMesh->GetNormalData(&_normals, &len);
- SetNormalData(_normals, len);
- }
- */
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- MLR_I_L_PMesh::~MLR_I_L_PMesh()
- {
- Check_Object(this);
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- MLR_I_L_PMesh*
- MLR_I_L_PMesh::Make(
- MemoryStream *stream,
- int version
- )
- {
- Check_Object(stream);
- gos_PushCurrentHeap(Heap);
- MLR_I_L_PMesh *mesh = new MLR_I_L_PMesh(DefaultData, stream, version);
- gos_PopCurrentHeap();
- return mesh;
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLR_I_L_PMesh::Save(MemoryStream *stream)
- {
- Check_Object(this);
- Check_Object(stream);
- MLR_I_C_PMesh::Save(stream);
- MemoryStreamIO_Write(stream, &normals);
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLR_I_L_PMesh::TestInstance() const
- {
- Verify(IsDerivedFrom(DefaultData));
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLR_I_L_PMesh::SetNormalData(
- const Vector3D *data,
- int dataSize
- )
- {
- Check_Object(this);
- Check_Pointer(data);
- Verify(coords.GetLength() == 0 || dataSize == coords.GetLength());
- Verify(colors.GetLength() == 0 || dataSize == colors.GetLength());
- Verify(texCoords.GetLength() == 0 || dataSize == texCoords.GetLength());
- normals.AssignData(data, dataSize);
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLR_I_L_PMesh::GetNormalData(
- Vector3D **data,
- int *dataSize
- )
- {
- Check_Object(this);
- *data = normals.GetData();
- *dataSize = normals.GetLength();
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLR_I_L_PMesh::SetColorData(
- #if COLOR_AS_DWORD
- const DWORD *data,
- #else
- const RGBAColor *data,
- #endif
- int dataSize
- )
- {
- Check_Object(this);
- Check_Pointer(data);
- Verify(gos_GetCurrentHeap() == Heap);
- Verify(coords.GetLength() == 0 || dataSize == coords.GetLength());
- Verify(texCoords.GetLength() == 0 || dataSize == texCoords.GetLength());
- litColors.SetLength(dataSize);
- colors.AssignData(data, dataSize);
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLR_I_L_PMesh::PaintMe(
- #if COLOR_AS_DWORD
- const DWORD *paintMe
- #else
- const RGBAColor *paintMe
- #endif
-
- )
- {
- Check_Object(this);
- Verify(gos_GetCurrentHeap() == Heap);
- #if 0
- Verify(colors.GetLength() == litColors.GetLength());
- #else
- if(colors.GetLength() == litColors.GetLength())
- {
- litColors.SetLength(colors.GetLength());
- }
- #endif
- int k, len = litColors.GetLength();
- #if COLOR_AS_DWORD
- DWORD argb = GOSCopyColor(paintMe);
- for(k=0;k<len;k++)
- {
- litColors[k] = argb;
- }
- #else
- for(k=0;k<len;k++)
- {
- litColors[k] = *paintMe;
- }
- #endif
- // set the to use colors to the original colors ...
- // only lighting could overwrite this;
- actualColors = &litColors;
- }
- #undef I_SAY_YES_TO_DUAL_TEXTURES
- #define I_SAY_YES_TO_COLOR
- #define I_SAY_YES_TO_LIGHTING
- #define CLASSNAME MLR_I_L_PMesh
- #if defined(TRACE_ENABLED) && defined(MLR_TRACE)
- #define SET_MLR_PMESH_CLIP() MLR_I_L_PMesh_Clip->Set()
- #define CLEAR_MLR_PMESH_CLIP() MLR_I_L_PMesh_Clip->Clear()
- #else
- #define SET_MLR_PMESH_CLIP()
- #define CLEAR_MLR_PMESH_CLIP()
- #endif
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- // This include contains follwing functions:
- // void MLR_I_L_PMesh::TransformNoClip(Matrix4D*, GOSVertexPool*);
- // int MLR_I_L_PMesh::Clip(MLRClippingState, GOSVertexPool*);
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- #include <MLR\MLRPrimitiveClipping.hpp>
- #undef I_SAY_YES_TO_COLOR
- #undef I_SAY_YES_TO_LIGHTING
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- // This include contains follwing functions:
- // void Lighting (MLRLight**, int nrLights);
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- #include <MLR\MLRPrimitiveLighting.hpp>
- #undef CLASSNAME
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- MLRShape*
- MidLevelRenderer::CreateIndexedIcosahedron_Color_Lit(
- IcoInfo& icoInfo,
- MLRState *state
- )
- {
- 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[nrTri*3];
- Register_Pointer(texCoords);
- RGBAColor *colors = new RGBAColor[nrTri*3];
- Register_Pointer(colors);
- Vector3D *normals = new Vector3D[nrTri*3];
- Register_Pointer(normals);
- int uniquePoints = 0;
- for (k=0;k<20;k++)
- {
- MidLevelRenderer::triDrawn = 0;
- MLR_I_L_PMesh *mesh = new MLR_I_L_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<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
- );
- }
- }
- 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
- );
- }
- }
- }
- else
- {
- for(i=0;i<uniquePoints;i++)
- {
- texCoords[i] = Vector2DScalar(0.0f, 0.0f);
- }
- }
- }
- mesh->SetTexCoordData(texCoords, uniquePoints);
- if(icoInfo.indexed==true)
- {
- for(i=0;i<uniquePoints;i++)
- {
- colors[i] =
- RGBAColor(
- (1.0f + collapsedCoords[i].x)/2.0f,
- (1.0f + collapsedCoords[i].y)/2.0f,
- (1.0f + collapsedCoords[i].z)/2.0f,
- 1.0f
- );
- normals[i].Normalize(collapsedCoords[i]);
- }
- }
- else
- {
- for(i=0;i<uniquePoints;i++)
- {
- colors[i] =
- RGBAColor(
- (1.0f + coords[i].x)/2.0f,
- (1.0f + coords[i].y)/2.0f,
- (1.0f + coords[i].z)/2.0f,
- 1.0f
- );
- normals[i].Normalize(coords[i]);
- }
- }
- mesh->SetColorData(colors, uniquePoints);
- mesh->SetNormalData(normals, uniquePoints);
- ret->Add(mesh);
- mesh->DetachReference();
- }
- Unregister_Pointer(normals);
- delete [] normals;
- Unregister_Pointer(colors);
- delete [] colors;
- 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;
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- /*
- MLR_I_L_PMesh*
- MidLevelRenderer::CreateIndexedCube(
- Scalar half,
- RGBAColor *eightColors,
- Vector3D *eightNormals,
- MLRState *state
- )
- {
- gos_PushCurrentHeap(Heap);
- MLR_I_L_PMesh *ret = new MLR_I_L_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->SetPrimitiveLength(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();
- if(eightColors!=NULL)
- {
- #if COLOR_AS_DWORD
- DWORD *dwColor = new DWORD [8];
- Register_Pointer(dwColor);
- for(i=0;i<8;i++)
- {
- dwColor[i] = GOSCopyColor(eightColors+i);
- }
- ret->SetColorData(dwColor, 8);
- Unregister_Pointer(dwColor);
- delete [] dwColor;
- #else
- ret->SetColorData(eightColors, 8);
- #endif
- }
- if(eightNormals!=NULL)
- {
- ret->SetNormalData(eightNormals, 8);
- }
- 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->GetTexture() > 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;
- }
- */
|