My leadwerks loader for recast
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);
}
0 Comments
Recommended Comments
There are no comments to display.