my class is derived of GeomNode - I haven’t overriden any of the geom node methods.
class cAWTerrainPatch : public GeomNode
{
public:
cAWTerrainPatch(unsigned int x, unsigned int y);
virtual ~cAWTerrainPatch();
inline bool IsLoaded()const { return mbLoaded; }
void CreateMesh(cAWTerrain* pTerrain);
protected:
friend class cAWTerrain;
cFileObject* mpFileObject;
private:
unsigned int mCoordX;
unsigned int mCoordY;
bool mbLoaded;
public:
static TypeHandle get_class_type() { return _type_handle; }
static void init_type() { GeomNode::init_type(); register_type(_type_handle, "AWTerrainPatch", GeomNode::get_class_type()); }
virtual TypeHandle get_type() const { return get_class_type(); }
virtual TypeHandle force_init_type() { init_type(); return get_class_type(); }
private:
static TypeHandle _type_handle;
};
and here the implementation of the create function
void cAWTerrainPatch::CreateMesh(cAWTerrain* pTerrain)
{
PT(GeomVertexArrayFormat) array = new GeomVertexArrayFormat();
array->add_column(InternalName::make("vertex"), 3, Geom::NT_float32, Geom::C_point);
array->add_column(InternalName::make("normal"), 3, Geom::NT_float32, Geom::C_point);
array->add_column(InternalName::make("alphaUV"), 2, Geom::NT_float32, Geom::C_texcoord);
array->add_column(InternalName::make("colorUV"), 2, Geom::NT_float32, Geom::C_texcoord);
PT(GeomVertexFormat )unregistered_format = new GeomVertexFormat();
unregistered_format->add_array(array);
CPT(GeomVertexFormat) format = GeomVertexFormat::register_format(unregistered_format);
PT(GeomVertexData) vData = new GeomVertexData("AWTerrainPatch", format, Geom::UH_dynamic);
GeomVertexRewriter vertices = GeomVertexRewriter(vData, "vertex");
GeomVertexRewriter normals = GeomVertexRewriter(vData, "normal");
GeomVertexRewriter alphaUV = GeomVertexRewriter(vData, "alphaUV");
GeomVertexRewriter colorUV = GeomVertexRewriter(vData, "colorUV");
PT(Geom) polyGeom = new Geom(vData);
float factor = TILES_PER_TERRAIN_X / 10.0f;
for(int y = static_cast<int>(mCoordY * (TILES_PER_PATCH_Y - 1)), y0 = 0; y <= static_cast<int>(mCoordY + 1) * (TILES_PER_PATCH_Y - 1); y++, y0++)
{
for(int x = static_cast<int>(mCoordX * (TILES_PER_PATCH_X - 1)), x0 = 0; x <= static_cast<int>(mCoordX + 1) * (TILES_PER_PATCH_X - 1); x++, x0++)
{
cAWTerrainTile* pTile = pTerrain->GetTile(x, y);
LVector3f pos = LVector3f(x, y, pTile->mHeight);
float a_x = static_cast<float>(x) / static_cast<float>(pTerrain->Size().get_x());
float a_y = static_cast<float>(y) / static_cast<float>(pTerrain->Size().get_y());
LVector2f vAlphaUV = LVector2f(a_x, a_y); //Alpha UV : [0, 1)
LVector2f vColorUV = vAlphaUV * factor; //Color UV : Repeat once every 10 tiles
vertices.add_data3f(pos);
normals.add_data3f(pTerrain->GetNormal(x,y));
alphaUV.add_data2f(vAlphaUV);
colorUV.add_data2f(vColorUV);
}
}
PT(GeomTriangles) prim = new GeomTriangles(Geom::UH_dynamic);
for(unsigned int y = mCoordY * (TILES_PER_PATCH_Y - 1), y0 = 0; y < (mCoordY + 1) * (TILES_PER_PATCH_Y - 1); y++, y0++)
{
for(unsigned int x = mCoordX * (TILES_PER_PATCH_X - 1), x0 = 0; x < (mCoordX + 1) * (TILES_PER_PATCH_X - 1); x++, x0++)
{
//Triangle 1
prim->add_vertex(y0 * ((TILES_PER_PATCH_X - 1) + 1 ) + x0);
prim->add_vertex(y0 * ((TILES_PER_PATCH_X - 1) + 1) + x0 + 1);
prim->add_vertex((y0+1) * ((TILES_PER_PATCH_X - 1) + 1) + x0);
//Triangle 2
prim->add_vertex((y0+1) * ((TILES_PER_PATCH_X - 1) + 1) + x0);
prim->add_vertex(y0 * ((TILES_PER_PATCH_X - 1) + 1) + x0 + 1);
prim->add_vertex((y0+1) * ((TILES_PER_PATCH_X -1) + 1) + x0 + 1);
}
}
prim->close_primitive();
polyGeom->add_primitive(prim);
add_geom(polyGeom);
}
this function is not called every frame, but only once.