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