source: GTP/trunk/Lib/Vis/OnlineCullingCHC/ObjReader/src/ObjManualMeshLoader.cpp @ 2111

Revision 2111, 3.6 KB checked in by mattausch, 17 years ago (diff)
Line 
1#include "ObjManualMeshLoader.h"
2#include "ObjReader.h"
3
4ObjManualMeshLoader::ObjManualMeshLoader()
5{
6        data = NULL;
7}
8
9
10ObjManualMeshLoader::ObjManualMeshLoader(ObjMeshData *mData):
11data(mData)
12{
13}
14
15
16ObjManualMeshLoader::~ObjManualMeshLoader()
17{
18        if (data != NULL)
19        {
20                data->collapse();
21                delete data;
22        }
23}
24
25
26Ogre::AxisAlignedBox *ObjManualMeshLoader::getBoundingBox()
27{
28        return data->boundingBox;
29}
30
31
32void ObjManualMeshLoader::loadResource(Ogre::Resource *resource)
33{
34        using namespace Ogre;
35        Mesh *pMesh = (Mesh *) resource;
36
37
38        Vector3 translation = data->boundingBox->getCenter();
39
40        bool nOk = ((data->normals != NULL) && (data->ncnt > 0));
41        bool tOk = ((data->texCoords != NULL) && (data->tcnt > 0));
42       
43        pMesh->sharedVertexData = new VertexData();
44
45        VertexDeclaration* vertexDecl = pMesh->sharedVertexData->vertexDeclaration;
46
47        size_t currOffset = 0;
48        vertexDecl->addElement(0, currOffset, VET_FLOAT3, VES_POSITION);
49        currOffset += VertexElement::getTypeSize(VET_FLOAT3);
50        if (nOk)
51        {
52                vertexDecl->addElement(0, currOffset, VET_FLOAT3, VES_NORMAL);
53                currOffset += VertexElement::getTypeSize(VET_FLOAT3);
54        }
55    if (tOk)
56        {
57                vertexDecl->addElement(0, currOffset, VET_FLOAT2, VES_TEXTURE_COORDINATES);
58                currOffset += VertexElement::getTypeSize(VET_FLOAT2);
59        }
60
61        pMesh->sharedVertexData->vertexCount = data->vcnt/3;
62        HardwareVertexBufferSharedPtr vbuf =
63                HardwareBufferManager::getSingleton().
64                createVertexBuffer(vertexDecl->getVertexSize(0), pMesh->sharedVertexData->vertexCount,
65                        HardwareBuffer::HBU_STATIC_WRITE_ONLY, false);
66
67        VertexBufferBinding* binding = pMesh->sharedVertexData->vertexBufferBinding;
68        binding->setBinding(0, vbuf);
69
70        Real* pVertices = static_cast<Real*>(vbuf->lock(HardwareBuffer::HBL_DISCARD));
71
72        int offset = 0, size = 3;
73        if (nOk) size += 3;
74        if (tOk) size += 2;
75        for (int i=0; i<data->vcnt/3; i++)
76        {
77                pVertices[i*size]   = data->vertices[i*3]   - translation.x;
78                pVertices[i*size+1] = data->vertices[i*3+1] - translation.y;
79                pVertices[i*size+2] = data->vertices[i*3+2] - translation.z;
80
81                offset = 3;
82                if (nOk)
83                {
84                        pVertices[i*size+offset] = data->normals[i*3];   offset++;
85                        pVertices[i*size+offset] = data->normals[i*3+1]; offset++;
86                        pVertices[i*size+offset] = data->normals[i*3+2]; offset++;
87                }
88                if (tOk)
89                {
90                        pVertices[i*size+offset] = data->texCoords[i*2];   offset++;
91                        pVertices[i*size+offset] = -data->texCoords[i*2+1]; offset++;
92                }
93        }
94
95        vbuf->unlock();
96
97
98        SubMesh *pSub = pMesh->createSubMesh();
99        pSub->operationType = RenderOperation::OT_TRIANGLE_LIST; //;data->roType;
100        pSub->useSharedVertices = true;
101
102        pSub->indexData->indexCount = data->icnt;
103        pSub->indexData->indexBuffer = HardwareBufferManager::getSingleton().
104                createIndexBuffer(HardwareIndexBuffer::IT_16BIT,
105                        pSub->indexData->indexCount, HardwareBuffer::HBU_STATIC_WRITE_ONLY, false);
106
107        HardwareIndexBufferSharedPtr ibuf = pSub->indexData->indexBuffer;
108        unsigned short* pIndices = static_cast<unsigned short*>(ibuf->lock(HardwareBuffer::HBL_DISCARD));
109
110        for (i = 0; i < data->icnt; i++) pIndices[i] = data->indices[i];
111       
112        ibuf->unlock();
113               
114        AxisAlignedBox bb(data->boundingBox->getMinimum() - translation, data->boundingBox->getMaximum() - translation);
115        //AxisAlignedBox bb(data->boundingBox->getMinimum(), data->boundingBox->getMaximum());
116        pMesh->_setBounds(bb);
117        Real radius = data->boundingBox->getMinimum().length();
118        if (data->boundingBox->getMaximum().length() > radius) radius = data->boundingBox->getMaximum().length();
119        pMesh->_setBoundingSphereRadius(radius);
120
121}
Note: See TracBrowser for help on using the repository browser.