Changeset 682

Show
Ignore:
Timestamp:
06/26/07 18:58:56 (17 months ago)
Author:
leo
Message:

Fixed inserting models into other models.

Location:
trunk/common
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/common/lc_modelref.cpp

    r681 r682  
    44#include "lc_model.h" 
    55#include "lc_mesh.h" 
     6#include "lc_scene.h" 
    67 
    78lcModelRef::lcModelRef(lcModel* Model) 
     
    5152{ 
    5253    lcPieceObject::Update(Time); 
     54 
     55    // FIXME: don't call BuildMesh() here 
     56    BuildMesh(); 
    5357} 
    5458 
    5559void lcModelRef::AddToScene(lcScene* Scene, int Color) 
    5660{ 
    57     // FIXME: prebuild mesh and use it 
    58     // FIXME: using m_ModelWorld here at least 
    59     m_Model->AddToScene(Scene, Color); 
     61    // FIXME: this should be a function of lcMesh, this is a copy of lcPiece::AddToScene. 
     62    int RenderColor = (m_Color == LC_COL_DEFAULT) ? Color : m_Color; 
     63 
     64    for (int i = 0; i < m_Mesh->m_SectionCount; i++) 
     65    { 
     66        lcRenderSection RenderSection; 
     67 
     68        RenderSection.Owner = this; 
     69        RenderSection.ModelWorld = m_ModelWorld; 
     70        RenderSection.Mesh = m_Mesh; 
     71        RenderSection.Section = &m_Mesh->m_Sections[i]; 
     72        RenderSection.Color = RenderSection.Section->ColorIndex; 
     73 
     74        if (RenderSection.Color == LC_COL_DEFAULT) 
     75            RenderSection.Color = RenderColor; 
     76 
     77        if (RenderSection.Section->PrimitiveType == GL_LINES) 
     78        { 
     79            // FIXME: LC_DET_BRICKEDGES 
     80//          if ((m_nDetail & LC_DET_BRICKEDGES) == 0) 
     81//              continue; 
     82 
     83            if (IsFocused()) 
     84                RenderSection.Color = LC_COL_FOCUSED; 
     85            else if (IsSelected()) 
     86                RenderSection.Color = LC_COL_SELECTED; 
     87        } 
     88 
     89        if (RenderSection.Color > 13 && RenderSection.Color < 22) 
     90        { 
     91            Vector3 Pos = Mul31(m_BoundingBox.GetCenter(), m_ModelWorld); // FIXME: Have a bounding box for each section 
     92            Pos = Mul31(Pos, Scene->m_WorldView); 
     93            RenderSection.Distance = Pos[2]; 
     94 
     95            Scene->m_TranslucentSections.AddSorted(RenderSection, SortRenderSectionsCallback, NULL); 
     96        } 
     97        else 
     98        { 
     99            // Pieces are already sorted by vertex buffer, so no need to sort again here. 
     100            // FIXME: not true anymore, need to sort by vertex buffer here. 
     101            Scene->m_OpaqueSections.Add(RenderSection); 
     102        } 
     103    } 
    60104} 
    61105 
     
    182226 
    183227            // Fix the indices to point to the right place after the vertex buffers are merged. 
    184             MeshEdit.OffsetIndices(MeshEdit.m_CurIndex - SrcSection->IndexCount, SrcSection->IndexCount, SrcMesh->m_VertexCount); 
     228            MeshEdit.OffsetIndices(MeshEdit.m_CurIndex - SrcSection->IndexCount, SrcSection->IndexCount, MeshEdit.m_CurVertex); 
    185229 
    186230            MeshEdit.EndSection(ReserveIndices); 
     
    189233        SrcMesh->m_IndexBuffer->UnmapBuffer(); 
    190234 
    191         // Copy vertices. 
    192         void* SrcVertexBuffer = SrcMesh->m_VertexBuffer->MapBuffer(GL_READ_ONLY_ARB); 
    193         MeshEdit.AddVertices((float*)SrcVertexBuffer, SrcMesh->m_VertexCount); 
     235        // Transform and copy vertices. 
     236        float* SrcVertexBuffer = (float*)SrcMesh->m_VertexBuffer->MapBuffer(GL_READ_ONLY_ARB); 
     237 
     238        for (int i = 0; i < SrcMesh->m_VertexCount; i++) 
     239        { 
     240            float* SrcPtr = SrcVertexBuffer + 3 * i; 
     241            Vector3 Vert(SrcPtr[0], SrcPtr[1], SrcPtr[2]); 
     242            Vert = Mul31(Vert, Piece->m_ModelWorld); 
     243            MeshEdit.AddVertex(Vert); 
     244        } 
     245 
    194246        SrcMesh->m_VertexBuffer->UnmapBuffer(); 
    195247    } 
  • trunk/common/lc_piece.cpp

    r681 r682  
    106106        if (RenderSection.Color > 13 && RenderSection.Color < 22) 
    107107        { 
    108             Vector3 Pos = Mul31(m_BoundingBox.GetCenter(), m_ModelWorld); 
     108            Vector3 Pos = Mul31(m_BoundingBox.GetCenter(), m_ModelWorld); // FIXME: Have a bounding box for each section 
    109109            Pos = Mul31(Pos, Scene->m_WorldView); 
    110110            RenderSection.Distance = Pos[2];