void RAS_ListRasterizer::IndexPrimitivesMulti(RAS_MeshSlot& ms) { RAS_ListSlot* localSlot =0; if (ms.m_bDisplayList) { localSlot = FindOrAdd(ms); localSlot->DrawList(); if (localSlot->End()) { // save slot here too, needed for replicas and object using same mesh // => they have the same vertexarray but different mesh slot ms.m_DisplayList = localSlot; return; } } // workaround: note how we do not use vertex arrays for making display // lists, since glVertexAttribPointerARB doesn't seem to work correct // in display lists on ATI? either a bug in the driver or in Blender .. if (mUseVertexArrays && !mATI && !ms.m_pDerivedMesh) RAS_VAOpenGLRasterizer::IndexPrimitivesMulti(ms); else RAS_OpenGLRasterizer::IndexPrimitivesMulti(ms); if (ms.m_bDisplayList) { localSlot->EndList(); ms.m_DisplayList = localSlot; } }
void RAS_ListRasterizer::IndexPrimitives(RAS_MeshSlot& ms) { RAS_ListSlot* localSlot =0; if (ms.m_bDisplayList) { localSlot = FindOrAdd(ms); localSlot->DrawList(); if (localSlot->End()) { // save slot here too, needed for replicas and object using same mesh // => they have the same vertexarray but different mesh slot ms.m_DisplayList = localSlot; return; } } // derived mesh cannot use vertex array if (mUseVertexArrays && !ms.m_pDerivedMesh) RAS_VAOpenGLRasterizer::IndexPrimitives(ms); else RAS_OpenGLRasterizer::IndexPrimitives(ms); if (ms.m_bDisplayList) { localSlot->EndList(); ms.m_DisplayList = localSlot; } }
RAS_ListSlot* RAS_ListRasterizer::FindOrAdd(RAS_MeshSlot& ms) { /* * Keep a copy of constant lists submitted for rendering, * this guards against (replicated)new...delete every frame, * and we can reuse lists! * :: sorted by mesh slot */ RAS_ListSlot* localSlot = (RAS_ListSlot*)ms.m_DisplayList; if (!localSlot) { if (ms.m_pDerivedMesh) { // that means that we draw based on derived mesh, a display list is possible // Note that we come here only for static derived mesh int matnr = ms.m_bucket->GetPolyMaterial()->GetMaterialIndex(); RAS_ListSlot* nullSlot = NULL; RAS_ListSlots *listVector; RAS_DerivedMeshLists::iterator it = mDerivedMeshLists.find(ms.m_pDerivedMesh); if (it == mDerivedMeshLists.end()) { listVector = new RAS_ListSlots(matnr+4, nullSlot); localSlot = new RAS_ListSlot(this); localSlot->m_flag |= LIST_DERIVEDMESH; localSlot->m_matnr = matnr; listVector->at(matnr) = localSlot; mDerivedMeshLists.insert(std::pair<DerivedMesh*, RAS_ListSlots*>(ms.m_pDerivedMesh, listVector)); } else { listVector = it->second; if (listVector->size() <= matnr) listVector->resize(matnr+4, nullSlot); if ((localSlot = listVector->at(matnr)) == NULL) { localSlot = new RAS_ListSlot(this); localSlot->m_flag |= LIST_DERIVEDMESH; localSlot->m_matnr = matnr; listVector->at(matnr) = localSlot; } else { localSlot->AddRef(); } } } else { RAS_ArrayLists::iterator it = mArrayLists.find(ms.m_displayArrays); if (it == mArrayLists.end()) { localSlot = new RAS_ListSlot(this); mArrayLists.insert(std::pair<RAS_DisplayArrayList, RAS_ListSlot*>(ms.m_displayArrays, localSlot)); } else { localSlot = static_cast<RAS_ListSlot*>(it->second->AddRef()); } } } MT_assert(localSlot); return localSlot; }
void RAS_ListRasterizer::IndexPrimitivesMulti(RAS_MeshSlot& ms) { RAS_ListSlot* localSlot =0; if (ms.m_bDisplayList) { localSlot = FindOrAdd(ms); localSlot->DrawList(); if (localSlot->End()) { // save slot here too, needed for replicas and object using same mesh // => they have the same vertexarray but different mesh slot ms.m_DisplayList = localSlot; return; } } RAS_OpenGLRasterizer::IndexPrimitivesMulti(ms); if (ms.m_bDisplayList) { localSlot->EndList(); ms.m_DisplayList = localSlot; } }