OPCODE question

Started by
1 comment, last by kandemor 19 years, 4 months ago
Hello, I'm trying to add a collision system based on Opcode in my engine. I've downloaded the 1.3 version and the user's manual, but it's the user's manual of the 1.2 version and I think some things have changed. Can someone help me, please? Where can I find information about the 1.3 version? And some sample code? Thank you! VinCenT
Advertisement
Indeed, the Opcode docs are awful. The Open Dynamics Engine uses Opcode optionally. Download the ODE source and have a look into the file named collision_trimesh.cpp.

Here's a small example using Opcode 1.3 I wrote earlier this year. It's by far not complete (and there may be bugs), but it worked and I didnt need more functionality at the time. The Opcode parts/classes you are looking for either begin with Opcode:: or uppercase letters. All the lowercased classes etc. are from my project and shouldnt really bother you.

Header:
namespace coll{	class c_triangle_manager : public i_triangle_manager	{		public:			c_triangle_manager( scene::i_mesh* mesh, const math::c_matrix* transformation );			virtual ~c_triangle_manager();						virtual bool get_colliders( const math::t_spheref& sphere, Opcode::SphereCache& cache, Opcode::SphereCollider& collider );			virtual bool get_colliders( const math::t_aabb3df& box, Opcode::AABBCache& cache, Opcode::AABBCollider& collider );			virtual bool get_colliders( const math::c_ray& ray, Container& container, Opcode::RayCollider& collider );			d_forceinline virtual const math::t_aabb3df&					get_bounding_box()      const { return m_bbox; }			d_forceinline virtual const std::vector < Point >&				get_vertices()          const { return m_list_of_vertices; }			d_forceinline virtual const std::vector < IndexedTriangle >&	get_indexed_triangles() const { return m_list_of_triangles; }					private:			math::t_aabb3df					m_bbox;			Opcode::Model					m_model;			Opcode::MeshInterface			m_imesh;			std::vector < Point >			m_list_of_vertices;			std::vector < IndexedTriangle >	m_list_of_triangles;	};}


Implementation:
namespace coll{	c_triangle_manager::c_triangle_manager( scene::i_mesh* mesh, const math::c_matrix* transformation )	{		debug_assert( mesh );		size_t idx_count = 0;		m_bbox.reset( 0.1f, 0.1f, 0.1f );		t_u32 count = mesh->get_submesh_count();		for ( t_u32 idx = 0; idx < count; ++idx )		{			scene::i_submesh* buffer = mesh->get_submesh( idx );			if ( buffer )			{				vid::s_vertex_data& vertex_data = buffer->get_vertex_data();				vid::s_index_data&  index_data  = buffer->get_index_data();				t_s32 vertex_count = vertex_data.get_vertex_count();				t_s32 index_count  = index_data.get_index_count();				t_u16* indices = index_data.get_index_pointer();				math::t_vector3f* vertices = vertex_data.get_vertex_pointer();				debug_assert( vertices );				t_u32 i0, i1, i2;								Point pt;				math::t_vector3f v;									size_t i;								for ( i = 0; i < index_count; i+=3 )				{					i0 = indices;<br>					i1 = indices;<br>					i2 = indices;<br>					<br>					v = vertices[ i0 ];<br>					m_bbox.insert( v );<br>					pt.x = v.x; pt.y = v.y; pt.z = v.z;<br>					m_list_of_vertices.push_back( pt );<br><br>					v = vertices[ i1 ];<br>					m_bbox.insert( v );<br>					pt.x = v.x; pt.y = v.y; pt.z = v.z;<br>					m_list_of_vertices.push_back( pt );<br>					<br>					v = vertices[ i2 ];<br>					m_bbox.insert( v );<br>					pt.x = v.x; pt.y = v.y; pt.z = v.z;<br>					m_list_of_vertices.push_back( pt );<br><br>					m_list_of_triangles.push_back( IndexedTriangle( idx_count+<span class="cpp-number">0</span>, idx_count+<span class="cpp-number">1</span>, idx_count+<span class="cpp-number">2</span> ) );<br>					idx_count+=<span class="cpp-number">3</span>;<br>				}<br><br>			}<br>		}<br><br>		m_imesh.SetNbTriangles( m_list_of_triangles.size() );<br>		m_imesh.SetNbVertices( m_list_of_vertices.size() );<br><br>		<span class="cpp-keyword">if</span> ( !m_imesh.SetPointers( &amp;m_list_of_triangles[ <span class="cpp-number">0</span> ], &amp;m_list_of_vertices[ <span class="cpp-number">0</span> ] ) )<br>		{<br>			<span class="cpp-comment">// TODO</span><br>		}<br><br>		udword degenerate = m_imesh.CheckTopology();<br>		<span class="cpp-keyword">if</span> ( degenerate )<br>		{<br>			<span class="cpp-comment">// TODO</span><br>		}<br>		<br>		Opcode::OPCODECREATE opcc;<br><br>		opcc.mIMesh         = &amp;m_imesh;<br>		opcc.mNoLeaf        = <span class="cpp-keyword">true</span>;<br>		opcc.mQuantized     = <span class="cpp-keyword">true</span>;<br>		<span class="cpp-comment">//opcc.mCollisionHull = false;</span><br>		opcc.mKeepOriginal  = <span class="cpp-keyword">false</span>;<br>		opcc.mCanRemap      = <span class="cpp-keyword">true</span>;<br><br>		<br>		<span class="cpp-keyword">if</span> ( !m_model.Build( opcc ) )<br>		{<br>			<span class="cpp-comment">// TODO</span><br>		}<br>	}<br>	<br>	<br>	c_triangle_manager::~c_triangle_manager()<br>	{<br>	}<br><br>	<br>	<span class="cpp-keyword">bool</span> c_triangle_manager::get_colliders( <span class="cpp-keyword">const</span> math::t_spheref&amp; sphere, Opcode::SphereCache&amp; cache, Opcode::SphereCollider&amp; collider )<br>	{<br>		Point center( sphere.center.x, sphere.center.y, sphere.center.z );<br>		Sphere s( center, sphere.radius );<br><br>		<span class="cpp-keyword">return</span> collider.Collide( cache, s, m_model );<br>	}<br><br><br>	<span class="cpp-keyword">bool</span> c_triangle_manager::get_colliders( <span class="cpp-keyword">const</span> math::t_aabb3df&amp; box, Opcode::AABBCache&amp; cache, Opcode::AABBCollider&amp; collider )<br>	{<br>		Point min;<br>		min.x = box.min.x;<br>		min.y = box.min.y;<br>		min.z = box.min.z;<br><br>		Point max;<br>		max.x = box.max.x;<br>		max.y = box.max.y;<br>		max.z = box.max.z;<br><br>		AABB aabb;<br>		aabb.SetMinMax( min, max );<br><br>		<span class="cpp-keyword">return</span> collider.Collide( cache, aabb, m_model );<br>	}<br><br><br>	<span class="cpp-keyword">bool</span> c_triangle_manager::get_colliders( <span class="cpp-keyword">const</span> math::c_ray&amp; ray, Container&amp; container, Opcode::RayCollider&amp; collider )<br>	{<br>		Point origin;<br>		origin.x = ray.origin.x;<br>		origin.y = ray.origin.y;<br>		origin.z = ray.origin.z;<br><br>		Point direction;<br>		direction.x = ray.normal.x;<br>		direction.y = ray.normal.y;<br>		direction.z = ray.normal.z;<br><br>		Ray opray( origin, direction );<br><br>		<span class="cpp-keyword">return</span> collider.Collide( opray, m_model );<br>	}<br><br>}<br><br></pre></div><!–ENDSCRIPT–><br><br>Usage:<br><small>i removed some parts in the following code snippet to make the usage clearer…</small><br><!–STARTSCRIPT–><!–source lang="cpp"–><div class="source"><pre><br>math::t_vector3f       position;<br>math::t_spheref        sphere;<br>Opcode::SphereCache    cache;<br>Opcode::SphereCollider collider;<br>coll::i_triangle_manager* tmgr;<br><br><span class="cpp-comment">// removed code for clarity</span><br><br><span class="cpp-keyword">if</span> ( tmgr )<br>{<br>	sphere.center.set( position.x, position.y, position.z );<br>	sphere.radius = m_bsphere_radius;<br><br>	<span class="cpp-keyword">bool</span> result = tmgr-&gt;get_colliders( sphere, cache, collider );<br>	<br>	<span class="cpp-keyword">if</span> ( result )<br>	{<br>		udword nbtouched = collider.GetNbTouchedPrimitives();<br><br>		<span class="cpp-keyword">if</span> ( nbtouched )<br>		{<br>			<span class="cpp-comment">// even more removed code…</span><br>		}<br>	}<br>}<br><br></pre></div><!–ENDSCRIPT–><br><br>This really isnt the best or cleanest example that was ever created, so please use with care. But I hope it helps anyway…<br>
Oh perfect!

Thank you very much!

VinCenT.

This topic is closed to new replies.

Advertisement