//----------------------------------------------------------------------------- EdgeData* ManualObject::getEdgeList(void) { // Build on demand if (!mEdgeList && mAnyIndexed) { EdgeListBuilder eb; size_t vertexSet = 0; bool anyBuilt = false; for (SectionList::iterator i = mSectionList.begin(); i != mSectionList.end(); ++i) { RenderOperation* rop = (*i)->getRenderOperation(); // Only indexed triangle geometry supported for stencil shadows if (rop->useIndexes && rop->indexData->indexCount != 0 && (rop->operationType == RenderOperation::OT_TRIANGLE_FAN || rop->operationType == RenderOperation::OT_TRIANGLE_LIST || rop->operationType == RenderOperation::OT_TRIANGLE_STRIP)) { eb.addVertexData(rop->vertexData); eb.addIndexData(rop->indexData, vertexSet++); anyBuilt = true; } } if (anyBuilt) mEdgeList = eb.build(); } return mEdgeList; }
void EdgeBuilderTests::testSingleIndexBufSingleVertexBuf() { /* This tests the edge builders ability to find shared edges in the simple case of a single index buffer referencing a single vertex buffer */ VertexData vd; IndexData id; // Test pyramid vd.vertexCount = 4; vd.vertexStart = 0; vd.vertexDeclaration = HardwareBufferManager::getSingleton().createVertexDeclaration(); vd.vertexDeclaration->addElement(0, 0, VET_FLOAT3, VES_POSITION); HardwareVertexBufferSharedPtr vbuf = HardwareBufferManager::getSingleton().createVertexBuffer(sizeof(float)*3, 4, HardwareBuffer::HBU_STATIC,true); vd.vertexBufferBinding->setBinding(0, vbuf); float* pFloat = static_cast<float*>(vbuf->lock(HardwareBuffer::HBL_DISCARD)); *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = 50 ; *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = 100; *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = -50; vbuf->unlock(); id.indexBuffer = HardwareBufferManager::getSingleton().createIndexBuffer( HardwareIndexBuffer::IT_16BIT, 12, HardwareBuffer::HBU_STATIC, true); id.indexCount = 12; id.indexStart = 0; unsigned short* pIdx = static_cast<unsigned short*>(id.indexBuffer->lock(HardwareBuffer::HBL_DISCARD)); *pIdx++ = 0; *pIdx++ = 1; *pIdx++ = 2; *pIdx++ = 0; *pIdx++ = 2; *pIdx++ = 3; *pIdx++ = 1; *pIdx++ = 3; *pIdx++ = 2; *pIdx++ = 0; *pIdx++ = 3; *pIdx++ = 1; id.indexBuffer->unlock(); EdgeListBuilder edgeBuilder; edgeBuilder.addVertexData(&vd); edgeBuilder.addIndexData(&id); EdgeData* edgeData = edgeBuilder.build(); // Should be only one group, since only one vertex buffer CPPUNIT_ASSERT(edgeData->edgeGroups.size() == 1); // 4 tris CPPUNIT_ASSERT(edgeData->triangles.size() == 4); EdgeData::EdgeGroup& eg = edgeData->edgeGroups[0]; // 6 edges CPPUNIT_ASSERT(eg.edges.size() == 6); delete edgeData; }
static int outputEdges(const vertex_t * const nodes, const vector<vid_t> * const edges, const vid_t cntNodes, const string& filepath) { EdgeListBuilder * builder = NULL; try { builder = adjlistfile_write(filepath); if (builder == NULL) { std::cerr << "Received null builder when writing to file " << filepath << std::endl; return -1; } builder->set_node_count(cntNodes); vid_t totalEdges = 0; for (vid_t i = 0; i < cntNodes; ++i) { totalEdges += edges[i].size(); } builder->set_total_edge_count(totalEdges); // calculate offsets totalEdges = 0; for (vid_t i = 0; i < cntNodes; ++i) { builder->set_first_edge_of_node(i, totalEdges); totalEdges += edges[i].size(); } // writing edges totalEdges = 0; for (vid_t i = 0; i < cntNodes; ++i) { for (auto& edge : edges[i]) { builder->create_edge(totalEdges++, edge); } } builder->build(); delete builder; return 0; } catch (std::exception& e) { std::cerr << "ERROR: " << e.what() << std::endl; if (builder != NULL) { delete builder; } return -1; } }
void EdgeBuilderTests::testMultiIndexBufMultiVertexBuf() { /* This tests the edge builders ability to find shared edges when there are both multiple index sets (submeshes) each using a different vertex buffer (not using shared geoemtry). */ VertexData vd[4]; IndexData id[4]; // Test pyramid vd[0].vertexCount = 3; vd[0].vertexStart = 0; vd[0].vertexDeclaration = HardwareBufferManager::getSingleton().createVertexDeclaration(); vd[0].vertexDeclaration->addElement(0, 0, VET_FLOAT3, VES_POSITION); HardwareVertexBufferSharedPtr vbuf = HardwareBufferManager::getSingleton().createVertexBuffer(sizeof(float)*3, 3, HardwareBuffer::HBU_STATIC,true); vd[0].vertexBufferBinding->setBinding(0, vbuf); float* pFloat = static_cast<float*>(vbuf->lock(HardwareBuffer::HBL_DISCARD)); *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = 50 ; *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = 100; *pFloat++ = 0 ; vbuf->unlock(); vd[1].vertexCount = 3; vd[1].vertexStart = 0; vd[1].vertexDeclaration = HardwareBufferManager::getSingleton().createVertexDeclaration(); vd[1].vertexDeclaration->addElement(0, 0, VET_FLOAT3, VES_POSITION); vbuf = HardwareBufferManager::getSingleton().createVertexBuffer(sizeof(float)*3, 3, HardwareBuffer::HBU_STATIC,true); vd[1].vertexBufferBinding->setBinding(0, vbuf); pFloat = static_cast<float*>(vbuf->lock(HardwareBuffer::HBL_DISCARD)); *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = 100; *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = -50; vbuf->unlock(); vd[2].vertexCount = 3; vd[2].vertexStart = 0; vd[2].vertexDeclaration = HardwareBufferManager::getSingleton().createVertexDeclaration(); vd[2].vertexDeclaration->addElement(0, 0, VET_FLOAT3, VES_POSITION); vbuf = HardwareBufferManager::getSingleton().createVertexBuffer(sizeof(float)*3, 3, HardwareBuffer::HBU_STATIC,true); vd[2].vertexBufferBinding->setBinding(0, vbuf); pFloat = static_cast<float*>(vbuf->lock(HardwareBuffer::HBL_DISCARD)); *pFloat++ = 50 ; *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = 100; *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = -50; vbuf->unlock(); vd[3].vertexCount = 3; vd[3].vertexStart = 0; vd[3].vertexDeclaration = HardwareBufferManager::getSingleton().createVertexDeclaration(); vd[3].vertexDeclaration->addElement(0, 0, VET_FLOAT3, VES_POSITION); vbuf = HardwareBufferManager::getSingleton().createVertexBuffer(sizeof(float)*3, 3, HardwareBuffer::HBU_STATIC,true); vd[3].vertexBufferBinding->setBinding(0, vbuf); pFloat = static_cast<float*>(vbuf->lock(HardwareBuffer::HBL_DISCARD)); *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = 50 ; *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = 0 ; *pFloat++ = -50; vbuf->unlock(); id[0].indexBuffer = HardwareBufferManager::getSingleton().createIndexBuffer( HardwareIndexBuffer::IT_16BIT, 3, HardwareBuffer::HBU_STATIC, true); id[0].indexCount = 3; id[0].indexStart = 0; unsigned short* pIdx = static_cast<unsigned short*>(id[0].indexBuffer->lock(HardwareBuffer::HBL_DISCARD)); *pIdx++ = 0; *pIdx++ = 1; *pIdx++ = 2; id[0].indexBuffer->unlock(); id[1].indexBuffer = HardwareBufferManager::getSingleton().createIndexBuffer( HardwareIndexBuffer::IT_16BIT, 3, HardwareBuffer::HBU_STATIC, true); id[1].indexCount = 3; id[1].indexStart = 0; pIdx = static_cast<unsigned short*>(id[1].indexBuffer->lock(HardwareBuffer::HBL_DISCARD)); *pIdx++ = 0; *pIdx++ = 1; *pIdx++ = 2; id[1].indexBuffer->unlock(); id[2].indexBuffer = HardwareBufferManager::getSingleton().createIndexBuffer( HardwareIndexBuffer::IT_16BIT, 3, HardwareBuffer::HBU_STATIC, true); id[2].indexCount = 3; id[2].indexStart = 0; pIdx = static_cast<unsigned short*>(id[2].indexBuffer->lock(HardwareBuffer::HBL_DISCARD)); *pIdx++ = 0; *pIdx++ = 2; *pIdx++ = 1; id[2].indexBuffer->unlock(); id[3].indexBuffer = HardwareBufferManager::getSingleton().createIndexBuffer( HardwareIndexBuffer::IT_16BIT, 3, HardwareBuffer::HBU_STATIC, true); id[3].indexCount = 3; id[3].indexStart = 0; pIdx = static_cast<unsigned short*>(id[3].indexBuffer->lock(HardwareBuffer::HBL_DISCARD)); *pIdx++ = 0; *pIdx++ = 2; *pIdx++ = 1; id[3].indexBuffer->unlock(); EdgeListBuilder edgeBuilder; edgeBuilder.addVertexData(&vd[0]); edgeBuilder.addVertexData(&vd[1]); edgeBuilder.addVertexData(&vd[2]); edgeBuilder.addVertexData(&vd[3]); edgeBuilder.addIndexData(&id[0], 0); edgeBuilder.addIndexData(&id[1], 1); edgeBuilder.addIndexData(&id[2], 2); edgeBuilder.addIndexData(&id[3], 3); EdgeData* edgeData = edgeBuilder.build(); // Should be 4 groups CPPUNIT_ASSERT(edgeData->edgeGroups.size() == 4); // 4 tris CPPUNIT_ASSERT(edgeData->triangles.size() == 4); // 6 edges in total CPPUNIT_ASSERT( (edgeData->edgeGroups[0].edges.size() + edgeData->edgeGroups[1].edges.size() + edgeData->edgeGroups[2].edges.size() + edgeData->edgeGroups[3].edges.size()) == 6); delete edgeData; }