This is test data to build a triangle (like in the sample
Code: Select all
Point p1(4.5, 0.00, 4.02);
Point p2(3.5, 1.5, 4.02);
Point p3(2.1, 0.00, 4.5);
const Triangle orig_Tris[1] = { Triangle(p1, p2, p3) };
Code: Select all
Ogre::IndexBufferPacked* MyTest::createIndexBuffer()
{
Ogre::IndexBufferPacked *indexBuffer = 0;
const Ogre::uint16 c_indexData[3 * 2 * 6] =
{
// confusion here
}
Ogre::uint16 *triIndices = reinterpret_cast<Ogre::uint16*>
(OGRE_MALLOC_SIMD(sizeof(Ogre::uint16) * 3 * 2 * 6,
Ogre::MEMCATEGORY_GEOMETRY));
memcpy( cubeIndices, c_indexData, sizeof(c_indexData));
Ogre::Root *root = mGraphicsSystem->getRoot();
Ogre::RenderSystem *renderSystem = root->getRenderSystem();
Ogre::VaoManager *vaoManager = renderSystem->getVaoManager();
try
{
indexBuffer = vaoManager->createIndexBuffer(Ogre::IndexBufferPacked::IT_16BIT,
3 * 2 * 6, Ogre::BT_IMMUTABLE, cubeIndices, true);
}
catch( Ogre::Exception &e )
{
OGRE_FREE_SIMD(indexBuffer, Ogre::MEMCATEGORY_GEOMETRY);
indexBuffer = 0;
throw e;
}
return indexBuffer;
}
Code: Select all
void MyTest::createScene()
{
Ogre::RenderSystem *renderSystem = m_ogreRoot->getRenderSystem();
Ogre::VaoManager *vaoManager = renderSystem->getVaoManager();
/* Create the mesh. */
Ogre::MeshPtr omesh =
Ogre::MeshManager::getSingleton().createManual("TestA",
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
/* Create a submesh. */
Ogre::SubMesh *subMesh = omesh->createSubMesh();
/* Vertex declaration. */
Ogre::VertexElement2Vec vertexElements;
vertexElements.push_back(Ogre::VertexElement2(Ogre::VET_FLOAT3,
Ogre::VES_POSITION));
vertexElements.push_back(Ogre::VertexElement2(Ogre::VET_FLOAT3,
Ogre::VES_NORMAL));
Triangle *tris =
reinterpret_cast<Triangle*>(OGRE_MALLOC_SIMD(sizeof(Triangle) * 1,
Ogre::MEMCATEGORY_GEOMETRY));
// todo: revisit copying data
memcpy(tris, orig_Tris, sizeof(Triangle) * 1);
Ogre::VertexBufferPacked *vertexBuffer = nullptr;
try {
/* Create the actual vertex buffer. */
vertexBuffer = vaoManager->createVertexBuffer(vertexElements, 1,
Ogre::BT_IMMUTABLE, tris, true);
}
catch (Ogre::Exception &e) {
OGRE_FREE_SIMD(vertexBuffer, Ogre::MEMCATEGORY_GEOMETRY);
vertexBuffer = 0;
throw e;
}
Ogre::VertexBufferPackedVec vertexBuffers;
vertexBuffers.push_back(vertexBuffer);
Ogre::IndexBufferPacked *indexBuffer = createIndexBuffer();
Ogre::VertexArrayObject *vao = vaoManager->createVertexArrayObject(
vertexBuffers, indexBuffer, Ogre::OT_TRIANGLE_LIST);
subMesh->mVao[Ogre::VpNormal].push_back(vao);
subMesh->mVao[Ogre::VpShadow].push_back(vao);
omesh->_setBounds(Ogre::Aabb(Ogre::Vectgor3::ZERO, Ogre::Vector3::UNIT_SCALE), false);
omesh->_setBoundingSphereRadius(1.732f);
}