Jump to content
  • entries
    10
  • comments
    21
  • views
    17,091

My leadwerks loader for recast


Chris Paulson

1,381 views

 Share

Here's the code that loads in the verticies to recast:-

 

Include:-

 

#ifndef MESHLOADER_SBX
#define MESHLOADER_SBX
#include "leo.h"
#include "MeshLoaderObj.h"

class rcMeshLoaderSBX : public rcMeshLoaderObj
{
public:
TEntity scene;
int vcap;
int tcap;
int nidx;
rcMeshLoaderSBX() { vcap = 0; tcap = 0; scene = NULL;}; 
~rcMeshLoaderSBX();

void addVertex(float x, float y, float z, int& cap) 
{ 
	rcMeshLoaderObj::addVertex( x, y, z, cap); 
}
void addTriangle(int a, int b, int c, int& cap)
{
	rcMeshLoaderObj::addTriangle(a, b, c, cap);
}
bool load(const char* filename);

private:
};
#endif

 

 

 

Source:-

 

#include "leo.h"
#include "recast.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _USE_MATH_DEFINES
#include <math.h>
#include "ledcast.h"
#include "ledcast_statmeshSimple.h"
#include "rcMeshLoaderSBX.h"

using namespace LEO;

rcMeshLoaderSBX *currentLoader;

bool processMesh( TEntity entity )
{
TMesh mesh = (TMesh)entity;
int SurfCnt = CountSurfaces( mesh );
TSurface surface;
TVec3 vec;
int vertIdx;
float factor=1;

vertIdx = currentLoader->getVertCount();
for( int s = 1; s <= SurfCnt; s++ )
{
	surface = GetSurface( mesh, s );
	if (surface)
	{
		for( int t = 0; t < CountTriangles( surface ); t++)
		{
			for( int v = 0; v < 3; v++)
			{
				vec = GetVertexPosition( surface, TriangleVertex( surface, t, v ));
				vec=TFormPoint(Vec3(vec.X,vec.Y,vec.Z),entity,NULL);

				currentLoader->addVertex( 
						(vec.X)*-factor, 
						(vec.Y)*factor, 
						(vec.Z)*factor, 
						currentLoader->vcap );
			}
			currentLoader->addTriangle( vertIdx+1, vertIdx, vertIdx+2, currentLoader->tcap );
			vertIdx=vertIdx+3;
		}
	}
	else
		break;
}
return true;
}

int _stdcall recastLoadMesh( TEntity entity, byte* extra )
{
TMesh mesh = (TMesh)entity;
std::string entityClass, cn, en;
int type, type1;
// Only bother with collision type 1
cn=GetEntityKey(entity,"classname");
en=GetEntityKey(entity,"name");
entityClass = GetEntityKey(entity, "class","");
type = atoi( GetEntityKey(entity, "collisiontype","1") );
if (type >0)
	EntityType(entity, type, 1);
type1 = GetEntityType(entity);
//if (EntityHidden(entity)) return true;

if (entityClass != "Model") return true;

if(
	(type1 != 1)||
	(cn=="water")||
	(cn=="physics_prop")||
	(cn=="physics_pivot")||
	(cn=="joint_motor")||
	(cn=="info_waypoint")||
	(cn=="info_playerstart")||
	(cn=="player")||
	(cn=="light_directional")||
	(cn=="light_spot")||
	(cn=="light_point")||
	(cn=="env_emitter")||
	(cn=="env_sound"))
{
	HideEntity(entity);
	return true;
}

int child = CountChildren(entity);
for(int i=1; i<=child;i++)
{
	processMesh( GetChild(entity, i) );
};
return true;
}

int _stdcall recastLoadTerrain( TEntity terrain, byte* extra )
{
std::string entityClass;

entityClass = GetEntityKey(terrain, "class","");
if (entityClass != "Terrain") return false;

float mapSize = 1024;
float x;
float z;
float mapHalfSize = 512;
float height;
int vertIdx;
float minx = 0, minz =0, maxx=0, maxz=0;

if (!terrain) return false;
vertIdx = currentLoader->getVertCount();
for(x = -mapHalfSize; x<mapHalfSize - 1; x++)
{
	for(z = -mapHalfSize; z<mapHalfSize - 1; z++)
	{
		height = TerrainElevation( terrain, x, z);
		if ((height != 0) || ((x>=minx && x<=maxx) && (z>=minz && z <= maxz)))
		{
			minx = __min(minx, x);
			minz = __min(minz, z);
			maxx = __max(maxx, x);
			maxz = __max(maxz, z);
			//br
			height = TerrainElevation( terrain, (float)x+1, (float)z);
			currentLoader->addVertex( 
					(x+1)*-1, 
					height, 
					z, 
					currentLoader->vcap );
			//tr
			height = TerrainElevation( terrain, (float)x+1, (float)z+1);
			currentLoader->addVertex( 
					(x+1)*-1, 
					height, 
					z+1, 
					currentLoader->vcap );
			//bl
			height = TerrainElevation( terrain, x, z);
			currentLoader->addVertex( 
					x*-1, 
					height, 
					z, 
					currentLoader->vcap );
			currentLoader->addTriangle( vertIdx, vertIdx+1, vertIdx+2, currentLoader->tcap );
			vertIdx=vertIdx+3;
			//Trianlge 2
			//tl
			height = TerrainElevation( terrain, (float)x, (float)z+1);
			currentLoader->addVertex( 
					x*-1, 
					height, 
					z+1, 
					currentLoader->vcap );
			//bl
			height = TerrainElevation( terrain, (float)x, (float)z);
			currentLoader->addVertex( 
					x*-1, 
					height, 
					z, 
					currentLoader->vcap );
			//tr
			height = TerrainElevation( terrain, (float)x+1, (float)z+1);
			currentLoader->addVertex( 
					(x+1)*-1, 
					height, 
					z+1, 
					currentLoader->vcap );
			currentLoader->addTriangle( vertIdx, vertIdx+1, vertIdx+2, currentLoader->tcap );
			vertIdx=vertIdx+3;
		}
		else
			height = -1;
	}
}
return true;
}


int _stdcall recastLoadMeshNormals( TEntity entity, byte* extra )
{
TMesh mesh = (TMesh)entity;
std::string entityClass;

entityClass = GetEntityKey(entity, "class","");
if (entityClass != "Mesh") return false;

TSurface surface;
int SurfCnt = CountSurfaces( mesh );
float *normals;
normals = (float *)(currentLoader->getNormals());
TVec3 vnorm;
for( int s = 1; s <= SurfCnt; s++ )
{
	surface = GetSurface( mesh, s );
	for( int t = 0; t < CountTriangles( surface ); t++)
	{
		vnorm = GetVertexNormal( surface, TriangleVertex( surface, t, 1 ));
		normals[currentLoader->nidx] = vnorm.X;
		normals[currentLoader->nidx+1] = vnorm.Y;
		normals[currentLoader->nidx+2] = vnorm.Z;
		currentLoader->nidx=currentLoader->nidx+3;
	}
}
return true;
}
bool rcMeshLoaderSBX::load(const char* filename)
{
TWorld world; 
TWorld cur;
cur = CurrentWorld();
std::string f = filename;
if (f.find("sbx")) 
	scene = LoadScene((str)filename);
else if (f.find("gmf")) scene = LoadModel((str)filename);
if (!scene) return false;

currentLoader = this;
ForEachEntityDo( (BP)recastLoadMesh,NULL, ENTITY_MESH|ENTITY_MODEL );
ForEachEntityDo( (BP)recastLoadTerrain,NULL, ENTITY_TERRAIN );
setNormals( new float[getTriCount()*3] );

nidx = 0;
calcNormals();
SetWorld(cur);

return true;
}

rcMeshLoaderSBX::~rcMeshLoaderSBX()
{
if (scene) FreeEntity(scene);
}

 Share

0 Comments


Recommended Comments

There are no comments to display.

Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...