1 #include "pch.h"
2 #include "../ogre/common/Def_Str.h"
3 #include "../ogre/common/RenderConst.h"
4 #include "Road.h"
5 #include <OgreSubMesh.h>
6 #include <OgreSceneManager.h>
7 #include <OgreMeshManager.h>
8 #include <OgreEntity.h>
9 #include <OgreSceneNode.h>
10 using namespace Ogre;
11
12
13 // Create Mesh
14 //---------------------------------------------------------
15
CreateMesh(SubMesh * mesh,AxisAlignedBox & aabox,const std::vector<Vector3> & pos,const std::vector<Vector3> & norm,const std::vector<Vector4> & clr,const std::vector<Vector2> & tcs,const std::vector<Ogre::uint16> & idx,String sMtrName)16 void SplineRoad::CreateMesh(SubMesh* mesh, AxisAlignedBox& aabox,
17 const std::vector<Vector3>& pos, const std::vector<Vector3>& norm, const std::vector<Vector4>& clr,
18 const std::vector<Vector2>& tcs, const std::vector<Ogre::uint16>& idx, String sMtrName)
19 {
20 size_t i, si = pos.size();
21 if (si == 0) {
22 LogO("!!Error: Road CreateMesh 0 verts !");
23 return; }
24 mesh->useSharedVertices = false;
25 mesh->vertexData = new VertexData();
26 mesh->vertexData->vertexStart = 0;
27 mesh->vertexData->vertexCount = si;
28
29 // decl
30 VertexDeclaration* decl = mesh->vertexData->vertexDeclaration;
31 size_t offset = 0;
32 offset += decl->addElement(0,offset,VET_FLOAT3,VES_POSITION).getSize();
33 offset += decl->addElement(0,offset,VET_FLOAT3,VES_NORMAL).getSize();
34 offset += decl->addElement(0,offset,VET_FLOAT2,VES_TEXTURE_COORDINATES).getSize();
35 if (clr.size() > 0)
36 offset += decl->addElement(0,offset,VET_FLOAT4,VES_DIFFUSE).getSize();
37
38 // vertex
39 //-----------------------------------------
40 HardwareVertexBufferSharedPtr vbuffer = HardwareBufferManager::getSingleton().createVertexBuffer(
41 decl->getVertexSize(0), si, HardwareBuffer::HBU_STATIC);
42 float* vp = static_cast<float*>(vbuffer->lock(HardwareBuffer::HBL_DISCARD));
43
44 // fill vb, update aabb
45 if (clr.size() > 0)
46 for (i=0; i < si; ++i)
47 {
48 const Vector3& p = pos[i];
49 *vp++ = p.x; *vp++ = p.y; *vp++ = p.z; aabox.merge(p);
50 const Vector3& n = norm[i];
51 *vp++ = n.x; *vp++ = n.y; *vp++ = n.z;
52 *vp++ = tcs[i].x; *vp++ = tcs[i].y;
53 const Vector4& c = clr[i];
54 *vp++ = c.x; *vp++ = c.y; *vp++ = c.z; *vp++ = c.w;
55 }
56 else
57 for (i=0; i < si; ++i)
58 {
59 const Vector3& p = pos[i];
60 *vp++ = p.x; *vp++ = p.y; *vp++ = p.z; aabox.merge(p);
61 const Vector3& n = norm[i];
62 *vp++ = n.x; *vp++ = n.y; *vp++ = n.z;
63 *vp++ = tcs[i].x; *vp++ = tcs[i].y;
64 }
65 vbuffer->unlock();
66 mesh->vertexData->vertexBufferBinding->setBinding(0,vbuffer);
67
68 // index
69 //-----------------------------------------
70 IndexData* id = mesh->indexData;
71 id->indexCount = idx.size(); id->indexStart = 0;
72 id->indexBuffer = HardwareBufferManager::getSingleton().createIndexBuffer(
73 HardwareIndexBuffer::IT_16BIT, id->indexCount, HardwareBuffer::HBU_STATIC);
74 uint16* ip = static_cast<uint16*>(id->indexBuffer->lock(HardwareBuffer::HBL_DISCARD));
75
76 // fill ib
77 for (size_t i=0; i < idx.size(); ++i)
78 *ip++ = idx[i];
79
80 id->indexBuffer->unlock();
81 mesh->setMaterialName(sMtrName);
82 }
83
84
85 // add mesh to scene
86 //---------------------------------------------------------
87
AddMesh(MeshPtr mesh,String sMesh,const AxisAlignedBox & aabox,Entity ** pEnt,SceneNode ** pNode,String sEnd)88 void SplineRoad::AddMesh(MeshPtr mesh, String sMesh, const AxisAlignedBox& aabox,
89 Entity** pEnt, SceneNode** pNode, String sEnd)
90 {
91 mesh->_setBounds(aabox);
92 mesh->_setBoundingSphereRadius((aabox.getMaximum()-aabox.getMinimum()).length()/2.0);
93 mesh->load();
94 unsigned short src, dest;
95 if (!mesh->suggestTangentVectorBuildParams(VES_TANGENT, src, dest))
96 mesh->buildTangentVectors(VES_TANGENT, src, dest);
97
98 *pEnt = mSceneMgr->createEntity("rd.ent"+sEnd, sMesh);
99 *pNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("rd.node"+sEnd);
100 (*pNode)->attachObject(*pEnt);
101 (*pEnt)->setVisible(false); (*pEnt)->setCastShadows(false);
102 (*pEnt)->setVisibilityFlags(RV_Road);
103 }
104
105
106 // add triangle to bullet
107 //---------------------------------------------------------
addTri(int f1,int f2,int f3,int i)108 void SplineRoad::addTri(int f1, int f2, int f3, int i)
109 {
110 /*bool ok = true; const int fmax = 65530; //16bit
111 if (f1 >= at_size || f1 > fmax) { LogO("idx too big: "+toStr(f1)+" >= "+toStr(at_size)); ok = 0; }
112 if (f2 >= at_size || f2 > fmax) { LogO("idx too big: "+toStr(f2)+" >= "+toStr(at_size)); ok = 0; }
113 if (f3 >= at_size || f3 > fmax) { LogO("idx too big: "+toStr(f3)+" >= "+toStr(at_size)); ok = 0; }
114 if (!ok) return;/**/
115
116 idx.push_back(f1); idx.push_back(f2); idx.push_back(f3);
117 if (blendTri)
118 {
119 idxB.push_back(f1); idxB.push_back(f2); idxB.push_back(f3);
120 }
121
122 if (bltTri && i > 0 && i < at_ilBt)
123 {
124 posBt.push_back((*at_pos)[f1]);
125 posBt.push_back((*at_pos)[f2]);
126 posBt.push_back((*at_pos)[f3]);
127 }
128 }
129
130
131 /// Destroy
132 //---------------------------------------------------------
133
Destroy()134 void SplineRoad::Destroy() // full
135 {
136 if (ndSel) mSceneMgr->destroySceneNode(ndSel);
137 if (ndChosen) mSceneMgr->destroySceneNode(ndChosen);
138 if (ndRot) mSceneMgr->destroySceneNode(ndRot);
139 if (ndHit) mSceneMgr->destroySceneNode(ndHit);
140 if (ndChk) mSceneMgr->destroySceneNode(ndChk);
141 if (entSel) mSceneMgr->destroyEntity(entSel);
142 if (entChs) mSceneMgr->destroyEntity(entChs);
143 if (entRot) mSceneMgr->destroyEntity(entRot);
144 if (entHit) mSceneMgr->destroyEntity(entHit);
145 if (entChk) mSceneMgr->destroyEntity(entChk);
146 DestroyMarkers();
147 DestroyRoad();
148 }
149
DestroySeg(int id)150 void SplineRoad::DestroySeg(int id)
151 {
152 //LogO("DestroySeg" + toStr(id));
153 RoadSeg& rs = vSegs[id];
154 if (rs.empty) return;
155 //try
156 //{
157 for (int l=0; l < LODs; ++l)
158 {
159 if (rs.wall[l].ent) // ] wall
160 {
161 rs.wall[l].node->detachAllObjects();
162 #ifdef SR_EDITOR
163 mSceneMgr->destroyEntity(rs.wall[l].ent);
164 #endif
165 //rs.wall[l].node->getParentSceneNode()->detachObject(0);
166 mSceneMgr->destroySceneNode(rs.wall[l].node);
167 Ogre::MeshManager::getSingleton().remove(rs.wall[l].smesh);
168 }
169 if (rs.blend[l].ent) // > blend
170 {
171 rs.blend[l].node->detachAllObjects();
172 #ifdef SR_EDITOR
173 mSceneMgr->destroyEntity(rs.blend[l].ent);
174 #endif
175 mSceneMgr->destroySceneNode(rs.blend[l].node);
176 Ogre::MeshManager::getSingleton().remove(rs.blend[l].smesh);
177 }
178 }
179 if (rs.col.ent) // | column
180 {
181 #ifdef SR_EDITOR
182 rs.col.node->detachAllObjects();
183 mSceneMgr->destroyEntity(rs.col.ent);
184 #endif
185 mSceneMgr->destroySceneNode(rs.col.node);
186 Ogre::MeshManager::getSingleton().remove(rs.col.smesh);
187 }
188 for (int l=0; l < LODs; ++l)
189 {
190 rs.road[l].node->detachAllObjects();
191 #ifdef SR_EDITOR //_crash in game (destroy all ents is before)
192 mSceneMgr->destroyEntity(rs.road[l].ent);
193 #endif
194 mSceneMgr->destroySceneNode(rs.road[l].node);
195 Ogre::MeshManager::getSingleton().remove(rs.road[l].smesh);
196 //Resource* r = ResourceManae::getSingleton().remove(rs.road[l].smesh);
197 }
198 //}catch(...)
199 //{
200 // LogO("Error!! DestroySeg");
201 //}
202 //LogO("Destroyed.");
203 rs.empty = true;
204 rs.lpos.clear();
205 }
206
207
DestroyRoad()208 void SplineRoad::DestroyRoad()
209 {
210
211 #ifndef SR_EDITOR
212 for (int i=0; i < vbtTriMesh.size(); ++i)
213 delete vbtTriMesh[i];
214 vbtTriMesh.clear();
215 #endif
216 for (size_t seg=0; seg < vSegs.size(); ++seg)
217 DestroySeg(seg);
218 vSegs.clear();
219
220 idStr = 0;
221 st.Reset();
222 }
223