123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590 |
- //===========================================================================//
- // Copyright (C) Microsoft Corporation. All rights reserved. //
- //===========================================================================//
- #include "MLRHeaders.hpp"
- #if !defined(MLR_MLRCLIPTRICK_HPP)
- #include <MLR\MLRClipTrick.hpp>
- #endif
- //#############################################################################
- //########################### MLRLightMap ###############################
- //#############################################################################
- MLRLightMap::ClassData*
- MLRLightMap::DefaultData = NULL;
- Stuff::MemoryStream
- *MLRLightMap::stream;
- GOSVertexPool*
- MLRLightMap::vertexPool;
- DynamicArrayOf<Stuff::Vector4D>
- *transformedCoords, *clipExtraCoords;
- DynamicArrayOf<RGBAColor>
- *clipExtraColors;
- DynamicArrayOf<Vector2DScalar>
- *clipExtraTexCoords;
- DynamicArrayOf<MLRClippingState>
- *clippingStates;
- ClipPolygon2
- *MLRLightMap::clipBuffer;
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLRLightMap::InitializeClass()
- {
- Verify(!DefaultData);
- Verify(gos_GetCurrentHeap() == StaticHeap);
- DefaultData =
- new ClassData(
- MLRLightMapClassID,
- "MidLevelRenderer::MLRLightMap",
- RegisteredClass::DefaultData
- );
- Register_Object(DefaultData);
- unsigned char *ptr = new unsigned char [Limits::Max_Size_Of_LightMap_MemoryStream];
- Register_Pointer(ptr);
- stream = new MemoryStream(ptr, Limits::Max_Size_Of_LightMap_MemoryStream);
- Register_Object(stream);
- transformedCoords = new DynamicArrayOf<Stuff::Vector4D> (Limits::Max_Number_Vertices_Per_Polygon);
- Register_Object(transformedCoords);
- clipExtraCoords = new DynamicArrayOf<Stuff::Vector4D> (2*Limits::Max_Number_Vertices_Per_Polygon);
- Register_Object(clipExtraCoords);
- clipExtraColors = new DynamicArrayOf<RGBAColor> (2*Limits::Max_Number_Vertices_Per_Polygon);
- Register_Object(clipExtraColors);
- clipExtraTexCoords = new DynamicArrayOf<Vector2DScalar> (2*Limits::Max_Number_Vertices_Per_Polygon);
- Register_Object(clipExtraTexCoords);
- clippingStates = new DynamicArrayOf<MLRClippingState> (Limits::Max_Number_Vertices_Per_Polygon);
- Register_Object(clippingStates);
- clipBuffer = new ClipPolygon2 [2];
- Register_Pointer(clipBuffer);
- clipBuffer[0].Init(Limits::Max_Number_Of_Multitextures);
- clipBuffer[1].Init(Limits::Max_Number_Of_Multitextures);
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLRLightMap::TerminateClass()
- {
- clipBuffer[1].Destroy();
- clipBuffer[0].Destroy();
- Unregister_Pointer(clipBuffer);
- delete [] clipBuffer;
- Unregister_Object(transformedCoords);
- delete transformedCoords;
- Unregister_Object(clipExtraCoords);
- delete clipExtraCoords;
- Unregister_Object(clipExtraColors);
- delete clipExtraColors;
- Unregister_Object(clipExtraTexCoords);
- delete clipExtraTexCoords;
- Unregister_Object(clippingStates);
- delete clippingStates;
- stream->Rewind();
- unsigned char *ptr = (unsigned char *)stream->GetPointer();
- Unregister_Object(stream);
- delete stream;
- stream = NULL;
- Unregister_Pointer(ptr);
- delete [] ptr;
- Unregister_Object(DefaultData);
- delete DefaultData;
- DefaultData = NULL;
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- MLRLightMap::MLRLightMap(MLRTexture *tex) :
- RegisteredClass(DefaultData)
- {
- Verify(gos_GetCurrentHeap() == Heap);
- state.SetTextureHandle(tex->GetTextureHandle());
- state.SetRenderDeltaMask(MLRState::TextureMask);
- // state.SetFogData(0xffffffff, 0.0f, 1.0f, 100.0f);
- #ifdef OLDFOG
- state.SetFogMode(MLRState::DisableFogMode);
- #else
- state.SetFogMode(0);
- #endif
- state.SetZBufferCompareOn();
- state.SetZBufferWriteOff();
- state.SetBackFaceOn();
- state.SetAlphaMode(MLRState::OneOneMode);
- state.SetFilterMode(MLRState::BiLinearFilterMode);
- state.SetTextureWrapMode(MLRState::TextureClamp);
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- MLRLightMap::~MLRLightMap()
- {
- Check_Object(this);
- Check_Object(stream);
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLRLightMap::SetDrawData
- (
- GOSVertexPool *vp,
- Stuff::Matrix4D *mat,
- MLRClippingState& clippingState,
- MLRState& _state
- )
- {
- vertexPool = vp;
- stream->Rewind();
- *stream << (int)Matrix4D;
- *stream << reinterpret_cast<int>(mat);
- *stream << (int)ClippingState;
- clippingState.Save(stream);
- *stream << (int)MasterRenderState;
- _state.Save(stream);
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLRLightMap::TestInstance()
- {
- Verify(IsDerivedFrom(DefaultData));
- Check_Object(stream);
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLRLightMap::DrawLightMaps(MLRSorter *sorter)
- {
- Check_Object(stream);
- void *ptr, *end = stream->GetPointer();
- Stuff::Matrix4D *currentMatrix=NULL;
- MLRClippingState currentClippingState;
-
- MLRState currentState, masterState;
- unsigned short stride;
- int i, pointerValue;
- Stuff::Point3D *coords = NULL;
- Stuff::RGBAColor color;
- Stuff::RGBAColor *colors = NULL;
- Vector2DScalar *texCoords = NULL;
- DWORD argb = 0xffffffff;
- Check_Object(vertexPool);
- GOSVertex* gos_vertices = vertexPool->GetActualVertexPool();
- int numGOSVertices = 0;
- int msd;
- MemoryStreamData type;
- stream->Rewind();
- ptr = stream->GetPointer();
- while(ptr < end)
- {
- *stream >> msd;
- type = static_cast<MemoryStreamData>(msd);
- switch(msd)
- {
- case Matrix4D:
- *stream >> pointerValue;
- currentMatrix = reinterpret_cast<Stuff::Matrix4D*>(pointerValue);
- break;
- case ClippingState:
- currentClippingState.Load(stream);
- break;
- case MasterRenderState:
- masterState.Load(stream, Current_MLR_Version);
- break;
- case LightMapRenderState:
- {
- MLRState lightmapState;
- lightmapState.Load(stream, Current_MLR_Version);
- lightmapState.Combine(masterState, lightmapState);
- if(numGOSVertices && (lightmapState != currentState))
- {
- vertexPool->Increase(numGOSVertices);
- SortData *sd = sorter->SetRawData
- (
- gos_vertices,
- numGOSVertices,
- currentState,
- SortData::TriList
- );
- if(currentState.GetDrawNowMode()==MLRState::DrawNowOnMode)
- {
- SortData::DrawFunc drawFunc = sd->Draw[sd->type];
- (sd->*drawFunc)();
- }
- else
- {
- sorter->AddSortRawData(sd);
- }
- gos_vertices = vertexPool->GetActualVertexPool();
- numGOSVertices = 0;
- }
- currentState = lightmapState;
- }
- break;
- case Polygon:
- {
- *stream >> stride;
- Verify(stride<=Limits::Max_Number_Vertices_Per_Polygon);
- *stream >> color;
- argb = GOSCopyColor(&color);
- coords = (Stuff::Point3D *)stream->GetPointer();
- stream->AdvancePointer(stride*sizeof(Stuff::Point3D));
- texCoords = (Vector2DScalar *)stream->GetPointer();
- stream->AdvancePointer(stride*sizeof(Vector2DScalar));
- MLRClippingState theAnd(0x3f), theOr(0);
- MLRClippingState *cs = clippingStates->GetData();
- Vector4D *v4d = transformedCoords->GetData();
- for(i=0;i<stride;i++,v4d++,cs++)
- {
- v4d->Multiply(coords[i], *currentMatrix);
- if(currentClippingState!=0)
- {
- cs->Clip4dVertex(v4d);
- theAnd &= *cs;
- theOr |= *cs;
- }
- #if defined(_ARMOR)
- else
- {
- Verify((*transformedCoords)[i].x >= 0.0f && (*transformedCoords)[i].x <= (*transformedCoords)[i].w );
- Verify((*transformedCoords)[i].y >= 0.0f && (*transformedCoords)[i].y <= (*transformedCoords)[i].w );
- Verify((*transformedCoords)[i].z >= 0.0f && (*transformedCoords)[i].z <= (*transformedCoords)[i].w );
- }
- #endif
- }
- if(theOr == 0)
- {
- for(i=1;i<stride-1;i++)
- {
- Verify((vertexPool->GetLast() + 3 + numGOSVertices) < vertexPool->GetLength());
- GOSCopyTriangleData(
- &gos_vertices[numGOSVertices],
- transformedCoords->GetData(),
- texCoords,
- 0, i + 1, i
- );
- gos_vertices[numGOSVertices].argb = argb;
- gos_vertices[numGOSVertices+1].argb = argb;
- gos_vertices[numGOSVertices+2].argb = argb;
- numGOSVertices+=3;
- }
- }
- else
- {
- if(theAnd != 0)
- {
- break;
- }
- else
- {
- int k, k0, k1, l, mask, ct = 0;
- Scalar a = 0.0f;
- int numberVerticesPerPolygon = 0;
- //
- //---------------------------------------------------------------
- // Handle the case of a single clipping plane by stepping through
- // the vertices and finding the edge it originates
- //---------------------------------------------------------------
- //
- bool firstIsIn;
- MLRClippingState theTest;
- if (theOr.GetNumberOfSetBits() == 1)
- {
- #ifdef LAB_ONLY
- Set_Statistic(PolysClippedButOnePlane, PolysClippedButOnePlane+1);
- #endif
- for(k=0;k<stride;k++)
- {
- int clipped_index = numberVerticesPerPolygon;
- k0 = k;
- k1 = (k+1) < stride ? k+1 : 0;
- //
- //----------------------------------------------------
- // If this vertex is inside the viewing space, copy it
- // directly to the clipping buffer
- //----------------------------------------------------
- //
- theTest = (*clippingStates)[k0];
- if(theTest == 0)
- {
- firstIsIn = true;
- (*clipExtraCoords)[clipped_index] = (*transformedCoords)[k0];
- Verify((*clipExtraCoords)[clipped_index].x >= 0.0f && (*clipExtraCoords)[clipped_index].x <= (*clipExtraCoords)[clipped_index].w );
- Verify((*clipExtraCoords)[clipped_index].y >= 0.0f && (*clipExtraCoords)[clipped_index].y <= (*clipExtraCoords)[clipped_index].w );
- Verify((*clipExtraCoords)[clipped_index].z >= 0.0f && (*clipExtraCoords)[clipped_index].z <= (*clipExtraCoords)[clipped_index].w );
- (*clipExtraTexCoords)[clipped_index] = texCoords[k0];
- numberVerticesPerPolygon++;
- clipped_index++;
- //
- //-------------------------------------------------------
- // We don't need to clip this edge if the next vertex is
- // also in the viewing space, so just move on to the next
- // vertex
- //-------------------------------------------------------
- //
- if((*clippingStates)[k1] == 0)
- {
- continue;
- }
- }
- //
- //---------------------------------------------------------
- // This vertex is outside the viewing space, so if the next
- // vertex is also outside the viewing space, no clipping is
- // needed and we throw this vertex away. Since only one
- // clipping plane is involved, it must be in the same space
- // as the first vertex
- //---------------------------------------------------------
- //
- else
- {
- firstIsIn = false;
- if((*clippingStates)[k1] != 0)
- {
- Verify((*clippingStates)[k1] == (*clippingStates)[k0]);
- continue;
- }
- }
- //
- //--------------------------------------------------
- // We now find the distance along the edge where the
- // clipping plane will intersect
- //--------------------------------------------------
- //
- mask = 1;
- theTest |= (*clippingStates)[k1];
- //
- //-----------------------------------------------------
- // Find the boundary conditions that match our clipping
- // plane
- //-----------------------------------------------------
- //
- for (l=0; l<MLRClippingState::NextBit; l++)
- {
- if(theTest.IsClipped(mask))
- {
- // GetDoubleBC(l, bc0, bc1, transformedCoords[k0], transformedCoords[k1]);
- //
- //-------------------------------------------
- // Find the clipping interval from bc0 to bc1
- //-------------------------------------------
- //
- if(firstIsIn==true)
- {
- a = GetLerpFactor(l, (*transformedCoords)[k0], (*transformedCoords)[k1]);
- }
- else
- {
- a = GetLerpFactor(l, (*transformedCoords)[k1], (*transformedCoords)[k0]);
- }
- Verify(a >= 0.0f && a <= 1.0f);
- ct = l;
- break;
- }
- mask <<= 1;
- }
- //
- //------------------------------
- // Lerp the homogeneous position
- //------------------------------
- //
- if(firstIsIn==true)
- {
- (*clipExtraCoords)[clipped_index].Lerp(
- (*transformedCoords)[k0],
- (*transformedCoords)[k1],
- a
- );
- DoClipTrick((*clipExtraCoords)[clipped_index], ct);
- Verify((*clipExtraCoords)[clipped_index].x >= 0.0f && (*clipExtraCoords)[clipped_index].x <= (*clipExtraCoords)[clipped_index].w );
- Verify((*clipExtraCoords)[clipped_index].y >= 0.0f && (*clipExtraCoords)[clipped_index].y <= (*clipExtraCoords)[clipped_index].w );
- Verify((*clipExtraCoords)[clipped_index].z >= 0.0f && (*clipExtraCoords)[clipped_index].z <= (*clipExtraCoords)[clipped_index].w );
- //
- //-----------------------------------------------------
- // If there are texture uv's, we need to lerp them in a
- // perspective correct manner
- //-----------------------------------------------------
- //
- (*clipExtraTexCoords)[clipped_index].Lerp
- (
- texCoords[k0],
- texCoords[k1],
- a
- );
- }
- else
- {
- (*clipExtraCoords)[clipped_index].Lerp(
- (*transformedCoords)[k1],
- (*transformedCoords)[k0],
- a
- );
- DoClipTrick((*clipExtraCoords)[clipped_index], ct);
- Verify((*clipExtraCoords)[clipped_index].x >= 0.0f && (*clipExtraCoords)[clipped_index].x <= (*clipExtraCoords)[clipped_index].w );
- Verify((*clipExtraCoords)[clipped_index].y >= 0.0f && (*clipExtraCoords)[clipped_index].y <= (*clipExtraCoords)[clipped_index].w );
- Verify((*clipExtraCoords)[clipped_index].z >= 0.0f && (*clipExtraCoords)[clipped_index].z <= (*clipExtraCoords)[clipped_index].w );
- //
- //-----------------------------------------------------
- // If there are texture uv's, we need to lerp them in a
- // perspective correct manner
- //-----------------------------------------------------
- //
- (*clipExtraTexCoords)[clipped_index].Lerp
- (
- texCoords[k1],
- texCoords[k0],
- a
- );
- }
- //
- //--------------------------------
- // Bump the polygon's vertex count
- //--------------------------------
- //
- numberVerticesPerPolygon++;
- }
- }
- //
- //---------------------------------------------------------------
- // We have to handle multiple planes. We do this by creating two
- // buffers and we switch between them as we clip plane by plane
- //---------------------------------------------------------------
- //
- else
- {
- #ifdef LAB_ONLY
- Set_Statistic(PolysClippedButGOnePlane, PolysClippedButGOnePlane+1);
- #endif
- ClipData2 srcPolygon, dstPolygon;
- int dstBuffer = 1;
- srcPolygon.coords = clipBuffer[dstBuffer].coords.GetData();
- srcPolygon.texCoords = clipBuffer[dstBuffer].texCoords.GetData();
- srcPolygon.clipPerVertex = clipBuffer[dstBuffer].clipPerVertex.GetData();
- //
- //----------------------------------------------------------
- // unravel and copy the original data into the source buffer
- //----------------------------------------------------------
- //
- for(k=0;k<stride;k++)
- {
- srcPolygon.coords[k] = (*transformedCoords)[k];
- srcPolygon.texCoords[k] = texCoords[k];
- srcPolygon.clipPerVertex[k] = (*clippingStates)[k];
- }
- srcPolygon.length = stride;
- //
- //--------------------------------
- // Point to the destination buffer
- //--------------------------------
- //
- dstBuffer = 0;
- dstPolygon.coords = clipBuffer[dstBuffer].coords.GetData();
- dstPolygon.texCoords = clipBuffer[dstBuffer].texCoords.GetData();
- dstPolygon.clipPerVertex = clipBuffer[dstBuffer].clipPerVertex.GetData();
- dstPolygon.length = 0;
- //
- //-----------------------------------------------------------
- // Spin through each plane that clipped the primitive and use
- // it to actually clip the primitive
- //-----------------------------------------------------------
- //
- mask = 1;
- MLRClippingState theNewOr(0);
- int loop = 4;
- do
- {
- for(l=0; l<MLRClippingState::NextBit; l++)
- {
- if(theOr.IsClipped(mask))
- {
- //
- //-----------------------------------
- // Clip each vertex against the plane
- //-----------------------------------
- //
- for(k=0;k<srcPolygon.length;k++)
- {
- k1 = (k+1) < srcPolygon.length ? k+1 : 0;
- theTest = srcPolygon.clipPerVertex[k];
- //
- //----------------------------------------------------
- // If this vertex is inside the viewing space, copy it
- // directly to the clipping buffer
- //----------------------------------------------------
- //
- if(theTest.IsClipped(mask) == 0)
- {
- firstIsIn = true;
- dstPolygon.coords[dstPolygon.length] =
- srcPolygon.coords[k];
- dstPolygon.clipPerVertex[dstPolygon.length] =
- srcPolygon.clipPerVertex[k];
- dstPolygon.texCoords[dstPolygon.length] =
- srcPolygon.texCoords[k];
- dstPolygon.length++;
- //
- //-------------------------------------------------------
- // We don't need to clip this edge if the next vertex is
- // also in the viewing space, so just move on to the next
- // vertex
- //-------------------------------------------------------
- //
- if(srcPolygon.clipPerVertex[k1].IsClipped(mask) == 0)
- {
- continue;
- }
- }
- //
- //---------------------------------------------------------
- // This vertex is outside the viewing space, so if the next
- // vertex is also outside the viewing space, no clipping is
- // needed and we throw this vertex away. Since only one
- // clipping plane is involved, it must be in the same space
- // as the first vertex
- //---------------------------------------------------------
- //
- else
- {
- firstIsIn = false;
- if(srcPolygon.clipPerVertex[k1].IsClipped(mask) != 0)
- {
- Verify(
- srcPolygon.clipPerVertex[k1].IsClipped(mask)
- == srcPolygon.clipPerVertex[k].IsClipped(mask)
- );
- continue;
- }
- }
- //
- //-------------------------------------------
- // Find the clipping interval from bc0 to bc1
- //-------------------------------------------
- //
- if(firstIsIn == true)
- {
- a = GetLerpFactor (l, srcPolygon.coords[k], srcPolygon.coords[k1]);
- Verify(a >= 0.0f && a <= 1.0f);
- //
- //------------------------------
- // Lerp the homogeneous position
- //------------------------------
- //
- dstPolygon.coords[dstPolygon.length].Lerp(
- srcPolygon.coords[k],
- srcPolygon.coords[k1],
- a
- );
- DoClipTrick(dstPolygon.coords[dstPolygon.length], l);
- //
- //-----------------------------------------------------
- // If there are texture uv's, we need to lerp them in a
- // perspective correct manner
- //-----------------------------------------------------
- //
- dstPolygon.texCoords[dstPolygon.length].Lerp
- (
- srcPolygon.texCoords[k],
- srcPolygon.texCoords[k1],
- a
- );
- }
- else
- {
- a = GetLerpFactor (l, srcPolygon.coords[k1], srcPolygon.coords[k]);
- Verify(a >= 0.0f && a <= 1.0f);
- //
- //------------------------------
- // Lerp the homogeneous position
- //------------------------------
- //
- dstPolygon.coords[dstPolygon.length].Lerp(
- srcPolygon.coords[k1],
- srcPolygon.coords[k],
- a
- );
- DoClipTrick(dstPolygon.coords[dstPolygon.length], l);
- //
- //-----------------------------------------------------
- // If there are texture uv's, we need to lerp them in a
- // perspective correct manner
- //-----------------------------------------------------
- //
- dstPolygon.texCoords[dstPolygon.length].Lerp
- (
- srcPolygon.texCoords[k1],
- srcPolygon.texCoords[k],
- a
- );
- }
- //
- //-------------------------------------
- // We have to generate a new clip state
- //-------------------------------------
- //
- dstPolygon.clipPerVertex[dstPolygon.length].Clip4dVertex(&dstPolygon.coords[dstPolygon.length]);
- //
- //----------------------------------
- // Bump the new polygon vertex count
- //----------------------------------
- //
- dstPolygon.length++;
- }
- //
- //-----------------------------------------------
- // Swap source and destination buffer pointers in
- // preparation for the next plane test
- //-----------------------------------------------
- //
- srcPolygon.coords = clipBuffer[dstBuffer].coords.GetData();
- srcPolygon.texCoords = clipBuffer[dstBuffer].texCoords.GetData();
- srcPolygon.clipPerVertex = clipBuffer[dstBuffer].clipPerVertex.GetData();
- srcPolygon.length = dstPolygon.length;
- dstBuffer = !dstBuffer;
- dstPolygon.coords = clipBuffer[dstBuffer].coords.GetData();
- dstPolygon.texCoords = clipBuffer[dstBuffer].texCoords.GetData();
- dstPolygon.clipPerVertex = clipBuffer[dstBuffer].clipPerVertex.GetData();
- dstPolygon.length = 0;
- }
- mask = mask << 1;
- }
- theNewOr = 0;
- for(k=0;k<srcPolygon.length;k++)
- {
- theNewOr |= srcPolygon.clipPerVertex[k];
- }
- theOr == theNewOr;
- loop++;
- } while (theNewOr != 0 && loop--);
- Verify(theNewOr == 0);
- //
- //--------------------------------------------------
- // Move the most recent polygon into the clip buffer
- //--------------------------------------------------
- //
- for(k=0;k<srcPolygon.length;k++)
- {
- (*clipExtraCoords)[k] = srcPolygon.coords[k];
- Verify((*clipExtraCoords)[k].x >= 0.0f && (*clipExtraCoords)[k].x <= (*clipExtraCoords)[k].w );
- Verify((*clipExtraCoords)[k].y >= 0.0f && (*clipExtraCoords)[k].y <= (*clipExtraCoords)[k].w );
- Verify((*clipExtraCoords)[k].z >= 0.0f && (*clipExtraCoords)[k].z <= (*clipExtraCoords)[k].w );
- (*clipExtraTexCoords)[k] = srcPolygon.texCoords[k];
- }
- numberVerticesPerPolygon = srcPolygon.length;
- }
- // clip
- for(i=1;i<numberVerticesPerPolygon-1;i++)
- {
- Verify((vertexPool->GetLast() + 3 + numGOSVertices) < vertexPool->GetLength());
- GOSCopyTriangleData(
- &gos_vertices[numGOSVertices],
- clipExtraCoords->GetData(),
- clipExtraTexCoords->GetData(),
- 0, i + 1, i
- );
- gos_vertices[numGOSVertices].argb = argb;
- gos_vertices[numGOSVertices+1].argb = argb;
- gos_vertices[numGOSVertices+2].argb = argb;
- numGOSVertices+=3;
- }
- }
- }
- }
- break;
- case PolygonWithColor:
- {
- *stream >> stride;
- Verify(stride<=Limits::Max_Number_Vertices_Per_Polygon);
- coords = (Stuff::Point3D *)stream->GetPointer();
- stream->AdvancePointer(stride*sizeof(Stuff::Point3D));
-
- colors = (Stuff::RGBAColor *)stream->GetPointer();
- stream->AdvancePointer(stride*sizeof(Stuff::RGBAColor));
- texCoords = (Vector2DScalar *)stream->GetPointer();
- stream->AdvancePointer(stride*sizeof(Vector2DScalar));
- MLRClippingState theAnd(0x3f), theOr(0);
- MLRClippingState *cs = clippingStates->GetData();
- Vector4D *v4d = transformedCoords->GetData();
- for(i=0;i<stride;i++,v4d++,cs++)
- {
- v4d->Multiply(coords[i], *currentMatrix);
- if(currentClippingState!=0)
- {
- cs->Clip4dVertex(v4d);
- theAnd &= *cs;
- theOr |= *cs;
- }
- #if defined(_ARMOR)
- else
- {
- Verify((*transformedCoords)[i].x >= 0.0f && (*transformedCoords)[i].x <= (*transformedCoords)[i].w );
- Verify((*transformedCoords)[i].y >= 0.0f && (*transformedCoords)[i].y <= (*transformedCoords)[i].w );
- Verify((*transformedCoords)[i].z >= 0.0f && (*transformedCoords)[i].z <= (*transformedCoords)[i].w );
- }
- #endif
- }
- if(theOr == 0)
- {
- for(i=1;i<stride-1;i++)
- {
- Verify((vertexPool->GetLast() + 3 + numGOSVertices) < vertexPool->GetLength());
- GOSCopyTriangleData(
- &gos_vertices[numGOSVertices],
- transformedCoords->GetData(),
- colors,
- texCoords,
- 0, i + 1, i
- );
- numGOSVertices+=3;
- }
- }
- else
- {
- if(theAnd != 0)
- {
- break;
- }
- else
- {
- int k, k0, k1, l, mask, ct = 0;
- Scalar a = 0.0f;
- int numberVerticesPerPolygon = 0;
- //
- //---------------------------------------------------------------
- // Handle the case of a single clipping plane by stepping through
- // the vertices and finding the edge it originates
- //---------------------------------------------------------------
- //
- bool firstIsIn;
- MLRClippingState theTest;
- if (theOr.GetNumberOfSetBits() == 1)
- {
- #ifdef LAB_ONLY
- Set_Statistic(PolysClippedButOnePlane, PolysClippedButOnePlane+1);
- #endif
- for(k=0;k<stride;k++)
- {
- int clipped_index = numberVerticesPerPolygon;
- k0 = k;
- k1 = (k+1) < stride ? k+1 : 0;
- //
- //----------------------------------------------------
- // If this vertex is inside the viewing space, copy it
- // directly to the clipping buffer
- //----------------------------------------------------
- //
- theTest = (*clippingStates)[k0];
- if(theTest == 0)
- {
- firstIsIn = true;
- (*clipExtraCoords)[clipped_index] = (*transformedCoords)[k0];
- Verify((*clipExtraCoords)[clipped_index].x >= 0.0f && (*clipExtraCoords)[clipped_index].x <= (*clipExtraCoords)[clipped_index].w );
- Verify((*clipExtraCoords)[clipped_index].y >= 0.0f && (*clipExtraCoords)[clipped_index].y <= (*clipExtraCoords)[clipped_index].w );
- Verify((*clipExtraCoords)[clipped_index].z >= 0.0f && (*clipExtraCoords)[clipped_index].z <= (*clipExtraCoords)[clipped_index].w );
- (*clipExtraColors)[clipped_index] = colors[k0];
- (*clipExtraTexCoords)[clipped_index] = texCoords[k0];
- numberVerticesPerPolygon++;
- clipped_index++;
- //
- //-------------------------------------------------------
- // We don't need to clip this edge if the next vertex is
- // also in the viewing space, so just move on to the next
- // vertex
- //-------------------------------------------------------
- //
- if((*clippingStates)[k1] == 0)
- {
- continue;
- }
- }
- //
- //---------------------------------------------------------
- // This vertex is outside the viewing space, so if the next
- // vertex is also outside the viewing space, no clipping is
- // needed and we throw this vertex away. Since only one
- // clipping plane is involved, it must be in the same space
- // as the first vertex
- //---------------------------------------------------------
- //
- else
- {
- firstIsIn = false;
- if((*clippingStates)[k1] != 0)
- {
- Verify((*clippingStates)[k1] == (*clippingStates)[k0]);
- continue;
- }
- }
- //
- //--------------------------------------------------
- // We now find the distance along the edge where the
- // clipping plane will intersect
- //--------------------------------------------------
- //)
- mask = 1;
- theTest |= (*clippingStates)[k1];
- //
- //-----------------------------------------------------
- // Find the boundary conditions that match our clipping
- // plane
- //-----------------------------------------------------
- //
- for (l=0; l<MLRClippingState::NextBit; l++)
- {
- if(theTest.IsClipped(mask))
- {
- // GetDoubleBC(l, bc0, bc1, transformedCoords[k0], transformedCoords[k1]);
- //
- //-------------------------------------------
- // Find the clipping interval from bc0 to bc1
- //-------------------------------------------
- //
- if(firstIsIn==true)
- {
- a = GetLerpFactor(l, (*transformedCoords)[k0], (*transformedCoords)[k1]);
- }
- else
- {
- a = GetLerpFactor(l, (*transformedCoords)[k1], (*transformedCoords)[k0]);
- }
- Verify(a >= 0.0f && a <= 1.0f);
- ct = l;
- break;
- }
- mask <<= 1;
- }
- //
- //------------------------------
- // Lerp the homogeneous position
- //------------------------------
- //
- if(firstIsIn==true)
- {
- (*clipExtraCoords)[clipped_index].Lerp(
- (*transformedCoords)[k0],
- (*transformedCoords)[k1],
- a
- );
- DoClipTrick((*clipExtraCoords)[clipped_index], ct);
- Verify((*clipExtraCoords)[clipped_index].x >= 0.0f && (*clipExtraCoords)[clipped_index].x <= (*clipExtraCoords)[clipped_index].w );
- Verify((*clipExtraCoords)[clipped_index].y >= 0.0f && (*clipExtraCoords)[clipped_index].y <= (*clipExtraCoords)[clipped_index].w );
- Verify((*clipExtraCoords)[clipped_index].z >= 0.0f && (*clipExtraCoords)[clipped_index].z <= (*clipExtraCoords)[clipped_index].w );
- //
- //-----------------------------------------------------
- // If there are texture uv's, we need to lerp them in a
- // perspective correct manner
- //-----------------------------------------------------
- //
- (*clipExtraTexCoords)[clipped_index].Lerp
- (
- texCoords[k0],
- texCoords[k1],
- a
- );
- (*clipExtraColors)[clipped_index].Lerp
- (
- colors[k0],
- colors[k1],
- a
- );
- }
- else
- {
- (*clipExtraCoords)[clipped_index].Lerp(
- (*transformedCoords)[k1],
- (*transformedCoords)[k0],
- a
- );
- DoClipTrick((*clipExtraCoords)[clipped_index], ct);
- Verify((*clipExtraCoords)[clipped_index].x >= 0.0f && (*clipExtraCoords)[clipped_index].x <= (*clipExtraCoords)[clipped_index].w );
- Verify((*clipExtraCoords)[clipped_index].y >= 0.0f && (*clipExtraCoords)[clipped_index].y <= (*clipExtraCoords)[clipped_index].w );
- Verify((*clipExtraCoords)[clipped_index].z >= 0.0f && (*clipExtraCoords)[clipped_index].z <= (*clipExtraCoords)[clipped_index].w );
- //
- //-----------------------------------------------------
- // If there are texture uv's, we need to lerp them in a
- // perspective correct manner
- //-----------------------------------------------------
- //
- (*clipExtraTexCoords)[clipped_index].Lerp
- (
- texCoords[k1],
- texCoords[k0],
- a
- );
- (*clipExtraColors)[clipped_index].Lerp
- (
- colors[k1],
- colors[k0],
- a
- );
- }
- //
- //--------------------------------
- // Bump the polygon's vertex count
- //--------------------------------
- //
- numberVerticesPerPolygon++;
- }
- }
- //
- //---------------------------------------------------------------
- // We have to handle multiple planes. We do this by creating two
- // buffers and we switch between them as we clip plane by plane
- //---------------------------------------------------------------
- //
- else
- {
- #ifdef LAB_ONLY
- Set_Statistic(PolysClippedButGOnePlane, PolysClippedButGOnePlane+1);
- #endif
- ClipData2 srcPolygon, dstPolygon;
- int dstBuffer = 1;
- srcPolygon.coords = clipBuffer[dstBuffer].coords.GetData();
- srcPolygon.texCoords = clipBuffer[dstBuffer].texCoords.GetData();
- srcPolygon.colors = clipBuffer[dstBuffer].colors.GetData();
- srcPolygon.clipPerVertex = clipBuffer[dstBuffer].clipPerVertex.GetData();
- //
- //----------------------------------------------------------
- // unravel and copy the original data into the source buffer
- //----------------------------------------------------------
- //
- for(k=0;k<stride;k++)
- {
- srcPolygon.coords[k] = (*transformedCoords)[k];
- srcPolygon.texCoords[k] = texCoords[k];
- srcPolygon.colors[k] = colors[k];
- srcPolygon.clipPerVertex[k] = (*clippingStates)[k];
- }
- srcPolygon.length = stride;
- //
- //--------------------------------
- // Point to the destination buffer
- //--------------------------------
- //
- dstBuffer = 0;
- dstPolygon.coords = clipBuffer[dstBuffer].coords.GetData();
- dstPolygon.texCoords = clipBuffer[dstBuffer].texCoords.GetData();
- dstPolygon.colors = clipBuffer[dstBuffer].colors.GetData();
- dstPolygon.clipPerVertex = clipBuffer[dstBuffer].clipPerVertex.GetData();
- dstPolygon.length = 0;
- //
- //-----------------------------------------------------------
- // Spin through each plane that clipped the primitive and use
- // it to actually clip the primitive
- //-----------------------------------------------------------
- //
- mask = 1;
- MLRClippingState theNewOr(0);
- int loop = 4;
- do
- {
- for(l=0; l<MLRClippingState::NextBit; l++)
- {
- if(theOr.IsClipped(mask))
- {
- //
- //-----------------------------------
- // Clip each vertex against the plane
- //-----------------------------------
- //
- for(k=0;k<srcPolygon.length;k++)
- {
- k1 = (k+1) < srcPolygon.length ? k+1 : 0;
- theTest = srcPolygon.clipPerVertex[k];
- //
- //----------------------------------------------------
- // If this vertex is inside the viewing space, copy it
- // directly to the clipping buffer
- //----------------------------------------------------
- //
- if(theTest.IsClipped(mask) == 0)
- {
- firstIsIn = true;
- dstPolygon.coords[dstPolygon.length] =
- srcPolygon.coords[k];
- dstPolygon.clipPerVertex[dstPolygon.length] =
- srcPolygon.clipPerVertex[k];
- dstPolygon.texCoords[dstPolygon.length] =
- srcPolygon.texCoords[k];
- dstPolygon.colors[dstPolygon.length] =
- srcPolygon.colors[k];
- dstPolygon.length++;
- //
- //-------------------------------------------------------
- // We don't need to clip this edge if the next vertex is
- // also in the viewing space, so just move on to the next
- // vertex
- //-------------------------------------------------------
- //
- if(srcPolygon.clipPerVertex[k1].IsClipped(mask) == 0)
- {
- continue;
- }
- }
- //
- //---------------------------------------------------------
- // This vertex is outside the viewing space, so if the next
- // vertex is also outside the viewing space, no clipping is
- // needed and we throw this vertex away. Since only one
- // clipping plane is involved, it must be in the same space
- // as the first vertex
- //---------------------------------------------------------
- //
- else
- {
- firstIsIn = false;
- if(srcPolygon.clipPerVertex[k1].IsClipped(mask) != 0)
- {
- Verify(
- srcPolygon.clipPerVertex[k1].IsClipped(mask)
- == srcPolygon.clipPerVertex[k].IsClipped(mask)
- );
- continue;
- }
- }
- //
- //-------------------------------------------
- // Find the clipping interval from bc0 to bc1
- //-------------------------------------------
- //
- if(firstIsIn == true)
- {
- a = GetLerpFactor (l, srcPolygon.coords[k], srcPolygon.coords[k1]);
- Verify(a >= 0.0f && a <= 1.0f);
- //
- //------------------------------
- // Lerp the homogeneous position
- //------------------------------
- //
- dstPolygon.coords[dstPolygon.length].Lerp(
- srcPolygon.coords[k],
- srcPolygon.coords[k1],
- a
- );
- DoClipTrick(dstPolygon.coords[dstPolygon.length], l);
- //
- //-----------------------------------------------------
- // If there are texture uv's, we need to lerp them in a
- // perspective correct manner
- //-----------------------------------------------------
- //
- dstPolygon.texCoords[dstPolygon.length].Lerp
- (
- srcPolygon.texCoords[k],
- srcPolygon.texCoords[k1],
- a
- );
- dstPolygon.colors[dstPolygon.length].Lerp
- (
- srcPolygon.colors[k],
- srcPolygon.colors[k1],
- a
- );
- }
- else
- {
- a = GetLerpFactor (l, srcPolygon.coords[k1], srcPolygon.coords[k]);
- Verify(a >= 0.0f && a <= 1.0f);
- //
- //------------------------------
- // Lerp the homogeneous position
- //------------------------------
- //
- dstPolygon.coords[dstPolygon.length].Lerp(
- srcPolygon.coords[k1],
- srcPolygon.coords[k],
- a
- );
- DoClipTrick(dstPolygon.coords[dstPolygon.length], l);
- //
- //-----------------------------------------------------
- // If there are texture uv's, we need to lerp them in a
- // perspective correct manner
- //-----------------------------------------------------
- //
- dstPolygon.texCoords[dstPolygon.length].Lerp
- (
- srcPolygon.texCoords[k1],
- srcPolygon.texCoords[k],
- a
- );
- dstPolygon.colors[dstPolygon.length].Lerp
- (
- srcPolygon.colors[k1],
- srcPolygon.colors[k],
- a
- );
- }
- //
- //-------------------------------------
- // We have to generate a new clip state
- //-------------------------------------
- //
- dstPolygon.clipPerVertex[dstPolygon.length].Clip4dVertex(&dstPolygon.coords[dstPolygon.length]);
- //
- //----------------------------------
- // Bump the new polygon vertex count
- //----------------------------------
- //
- dstPolygon.length++;
- }
- //
- //-----------------------------------------------
- // Swap source and destination buffer pointers in
- // preparation for the next plane test
- //-----------------------------------------------
- //
- srcPolygon.coords = clipBuffer[dstBuffer].coords.GetData();
- srcPolygon.texCoords = clipBuffer[dstBuffer].texCoords.GetData();
- srcPolygon.colors = clipBuffer[dstBuffer].colors.GetData();
- srcPolygon.clipPerVertex = clipBuffer[dstBuffer].clipPerVertex.GetData();
- srcPolygon.length = dstPolygon.length;
- dstBuffer = !dstBuffer;
- dstPolygon.coords = clipBuffer[dstBuffer].coords.GetData();
- dstPolygon.texCoords = clipBuffer[dstBuffer].texCoords.GetData();
- dstPolygon.colors = clipBuffer[dstBuffer].colors.GetData();
- dstPolygon.clipPerVertex = clipBuffer[dstBuffer].clipPerVertex.GetData();
- dstPolygon.length = 0;
- }
- mask = mask << 1;
- }
- theNewOr = 0;
- for(k=0;k<srcPolygon.length;k++)
- {
- theNewOr |= srcPolygon.clipPerVertex[k];
- }
- theOr == theNewOr;
- loop++;
- } while (theNewOr != 0 && loop--);
- Verify(theNewOr == 0);
- //
- //--------------------------------------------------
- // Move the most recent polygon into the clip buffer
- //--------------------------------------------------
- //
- for(k=0;k<srcPolygon.length;k++)
- {
- (*clipExtraCoords)[k] = srcPolygon.coords[k];
- Verify((*clipExtraCoords)[k].x >= 0.0f && (*clipExtraCoords)[k].x <= (*clipExtraCoords)[k].w );
- Verify((*clipExtraCoords)[k].y >= 0.0f && (*clipExtraCoords)[k].y <= (*clipExtraCoords)[k].w );
- Verify((*clipExtraCoords)[k].z >= 0.0f && (*clipExtraCoords)[k].z <= (*clipExtraCoords)[k].w );
- (*clipExtraTexCoords)[k] = srcPolygon.texCoords[k];
- (*clipExtraColors)[k] = srcPolygon.colors[k];
- }
- numberVerticesPerPolygon = srcPolygon.length;
- }
- // clip
- for(i=1;i<numberVerticesPerPolygon-1;i++)
- {
- Verify((vertexPool->GetLast() + 3 + numGOSVertices) < vertexPool->GetLength());
- GOSCopyTriangleData(
- &gos_vertices[numGOSVertices],
- clipExtraCoords->GetData(),
- clipExtraColors->GetData(),
- clipExtraTexCoords->GetData(),
- 0, i + 1, i
- );
- numGOSVertices+=3;
- }
- }
- }
- }
- break;
- }
- ptr = stream->GetPointer();
- }
- if(numGOSVertices)
- {
- vertexPool->Increase(numGOSVertices);
- SortData *sd = sorter->SetRawData
- (
- gos_vertices,
- numGOSVertices,
- currentState,
- SortData::TriList
- );
- if(currentState.GetDrawNowMode()==MLRState::DrawNowOnMode)
- {
- SortData::DrawFunc drawFunc = sd->Draw[sd->type];
- (sd->*drawFunc)();
- }
- else
- {
- sorter->AddSortRawData(sd);
- }
- }
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- MLRShape*
- MLRLightMap::CreateLightMapShape()
- {
- Check_Object(stream);
- gos_PushCurrentHeap(Heap);
- MLRShape *ret = new MLRShape(20);
- Register_Object(ret);
- MLR_I_C_TMesh *ctmesh = NULL;
-
- void *ptr, *end = stream->GetPointer();
- MLRClippingState currentClippingState;
-
- MLRState currentState, masterState;
- unsigned short stride;
- int i;
- Stuff::Point3D *coords = NULL;
- Stuff::RGBAColor color;
- Stuff::RGBAColor *colors = NULL;
- Vector2DScalar *texCoords = NULL;
- int numGOSVertices = 0;
- int msd;
- MemoryStreamData type;
- stream->Rewind();
- ptr = stream->GetPointer();
- while(ptr < end)
- {
- *stream >> msd;
- type = static_cast<MemoryStreamData>(msd);
- switch(msd)
- {
- case Matrix4D:
- // not this time
- *stream >> i;
- break;
- case ClippingState:
- // not this time
- *stream >> i;
- break;
- case MasterRenderState:
- // not this time
- masterState.Load(stream, Current_MLR_Version);
- break;
- case LightMapRenderState:
- {
- MLRState state;
- state.Load(stream, Current_MLR_Version);
- if(numGOSVertices && (state != currentState))
- {
- if(ctmesh!=NULL)
- {
- ctmesh->SetSubprimitiveLengths(NULL, numGOSVertices/3);
- ctmesh->FlashClipCoords(numGOSVertices);
- ctmesh->FlashClipTexCoords(numGOSVertices);
- ctmesh->FlashClipColors(numGOSVertices);
- ctmesh->SetReferenceState(currentState);
- ctmesh->TheIndexer(numGOSVertices);
- ctmesh->FindFacePlanes();
- ret->Add(ctmesh);
- ctmesh->DetachReference();
-
- ctmesh = NULL;
- }
- }
- currentState = state;
- }
- break;
- case Polygon:
- {
- if(ctmesh == NULL)
- {
- ctmesh = new MLR_I_C_TMesh;
- numGOSVertices = 0;
- }
- *stream >> stride;
- Verify(stride==3);
- *stream >> color;
- #if COLOR_AS_DWORD
- DWORD argb = 0xffffffff;
- argb = GOSCopyColor(&color);
- #endif
- coords = (Stuff::Point3D *)stream->GetPointer();
- stream->AdvancePointer(stride*sizeof(Stuff::Point3D));
- texCoords = (Vector2DScalar *)stream->GetPointer();
- stream->AdvancePointer(stride*sizeof(Vector2DScalar));
- for(i=0;i<stride;i++,numGOSVertices++)
- {
- ctmesh->SetClipCoord(coords[i], numGOSVertices);
- ctmesh->SetClipTexCoord(texCoords[i], numGOSVertices);
- #if COLOR_AS_DWORD
- ctmesh->SetClipColor(argb, numGOSVertices);
- #else
- ctmesh->SetClipColor(color, numGOSVertices);
- #endif
- }
- }
- break;
- case PolygonWithColor:
- {
- if(ctmesh == NULL)
- {
- ctmesh = new MLR_I_C_TMesh;
- numGOSVertices = 0;
- }
- *stream >> stride;
- Verify(stride<=Limits::Max_Number_Vertices_Per_Polygon);
- coords = (Stuff::Point3D *)stream->GetPointer();
- stream->AdvancePointer(stride*sizeof(Stuff::Point3D));
-
- colors = (Stuff::RGBAColor *)stream->GetPointer();
- stream->AdvancePointer(stride*sizeof(Stuff::RGBAColor));
- texCoords = (Vector2DScalar *)stream->GetPointer();
- stream->AdvancePointer(stride*sizeof(Vector2DScalar));
- for(i=0;i<stride;i++,numGOSVertices++)
- {
- ctmesh->SetClipCoord(coords[i], numGOSVertices);
- ctmesh->SetClipTexCoord(texCoords[i], numGOSVertices);
- #if COLOR_AS_DWORD
- #error not implemented yet
- #else
- ctmesh->SetClipColor(colors[i], numGOSVertices);
- #endif
- }
- }
- break;
- }
- ptr = stream->GetPointer();
- }
- if(ctmesh!=NULL)
- {
- ctmesh->SetSubprimitiveLengths(NULL, numGOSVertices/3);
- ctmesh->FlashClipCoords(numGOSVertices);
- ctmesh->FlashClipTexCoords(numGOSVertices);
- ctmesh->FlashClipColors(numGOSVertices);
- ctmesh->SetReferenceState(currentState);
- ctmesh->TheIndexer(numGOSVertices);
- ctmesh->FindFacePlanes();
- ret->Add(ctmesh);
- ctmesh->DetachReference();
- }
- gos_PopCurrentHeap();
- return ret;
- }
|