<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://horde3d.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Newacct</id>
		<title>Horde3D Wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://horde3d.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Newacct"/>
		<link rel="alternate" type="text/html" href="http://horde3d.org/wiki/index.php?title=Special:Contributions/Newacct"/>
		<updated>2026-05-23T14:37:09Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.29.3</generator>

	<entry>
		<id>http://horde3d.org/wiki/index.php?title=Procedurally_generated_geometry_tutorial&amp;diff=692</id>
		<title>Procedurally generated geometry tutorial</title>
		<link rel="alternate" type="text/html" href="http://horde3d.org/wiki/index.php?title=Procedurally_generated_geometry_tutorial&amp;diff=692"/>
				<updated>2011-03-18T04:09:10Z</updated>
		
		<summary type="html">&lt;p&gt;Newacct: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ __NOEDITSECTION__{{ContentBlock|color=white|content={{!!}}&lt;br /&gt;
'''Work in progress   - Due to the current changes in the Horde API this tutorial will be delayed '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Important notes=&lt;br /&gt;
* The code used here has been tested with Horde3D 1.0.0 beta2 and beta3 and will '''NOT''' work with the latest release (beta4)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Overview=&lt;br /&gt;
==Basic approach==&lt;br /&gt;
To create and display a procedurally generated mesh that, instead of being loaded from a Horde3D Scene node and a geoemtry file(*.scene.xml, *.geo), will be created in-memory by some algorithm, you have to create a mesh first and then &amp;quot;fake&amp;quot; the .geo-file and the scene node itself and pass it to the engine.&lt;br /&gt;
&lt;br /&gt;
To do that you have to create your procedural geometry first. This is easy for simple shapes like single triangles, squares or triangle-strips, but will become way more difficult when we try to generate complex meshes, e.g. when we have a cloud of points in 3D space and have to describe which points make triangles, and which don't (calculating the triangle indices, texture coordinates and normals).&lt;br /&gt;
&lt;br /&gt;
When we have calculated the geometry itself we need to create a char-stream to make Horde believe the geometry has been read from a file and pass it to Horde as a geometry Resource.&lt;br /&gt;
The final step is to create a Horde3D Scene Node from our procedurally generated mesh and render it into our scene.&lt;br /&gt;
&lt;br /&gt;
=StreamGenerator=&lt;br /&gt;
&lt;br /&gt;
These classes are only for creating the character stream that will contain the geometry resource.&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= StreamGenerator.h| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#pragma once&lt;br /&gt;
#include &amp;lt;sstream&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class StreamGenerator &lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
	StreamGenerator();&lt;br /&gt;
	virtual ~StreamGenerator();&lt;br /&gt;
	virtual const char* getStream() = 0;&lt;br /&gt;
	virtual const int getStreamSize() = 0;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= StreamGenerator.cpp| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;StreamGenerator.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
StreamGenerator::StreamGenerator() &lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
StreamGenerator::~StreamGenerator()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= GeometryStreamGenerator.h| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#pragma once&lt;br /&gt;
#include &amp;quot;StreamGenerator.h&amp;quot;&lt;br /&gt;
#include &amp;quot;CustomGeometry.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class GeometryStreamGenerator : public StreamGenerator&lt;br /&gt;
{&lt;br /&gt;
private:&lt;br /&gt;
	std::stringstream* ss;&lt;br /&gt;
	void generate();&lt;br /&gt;
	int numVertices, numTriangleIndices;&lt;br /&gt;
	char* _stream;&lt;br /&gt;
	CustomGeometry* _geom;&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
	GeometryStreamGenerator(CustomGeometry* geom_);&lt;br /&gt;
	~GeometryStreamGenerator();&lt;br /&gt;
	const char* getStream();&lt;br /&gt;
	const std::stringstream* getStringStream() { return ss; };&lt;br /&gt;
	const int getStreamSize();&lt;br /&gt;
	const int getNumVertices();&lt;br /&gt;
	const int getNumTriangleIndices();&lt;br /&gt;
	void release();&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= GeometryStreamGenerator.cpp| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;GeometryStreamGenerator.h&amp;quot;&lt;br /&gt;
#include &amp;quot;time.h&amp;quot;&lt;br /&gt;
#include &amp;quot;utMath.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
GeometryStreamGenerator::GeometryStreamGenerator(CustomGeometry* geom_) : _geom(geom_)&lt;br /&gt;
{&lt;br /&gt;
	ss = new std::stringstream();&lt;br /&gt;
	generate();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
GeometryStreamGenerator::~GeometryStreamGenerator()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void GeometryStreamGenerator::generate()&lt;br /&gt;
{&lt;br /&gt;
	numVertices = _geom-&amp;gt;getNumVertices();&lt;br /&gt;
	numTriangleIndices = _geom-&amp;gt;getNumTriangleIndices();&lt;br /&gt;
	const std::string _magicHeader = &amp;quot;H3DG&amp;quot;;&lt;br /&gt;
	const int _version = 5;&lt;br /&gt;
	const int _numJoints = 1;&lt;br /&gt;
	const float _identityMatrix[] = {	1.0f, 0.0f, 0.0f, 0.0f,  &lt;br /&gt;
						0.0f, 1.0f, 0.0f, 0.0f,  &lt;br /&gt;
						0.0f, 0.0f, 1.0f, 0.0f,  &lt;br /&gt;
						0.0f, 0.0f, 0.0f, 1.0f};&lt;br /&gt;
	const int _numVertexStreams = 3;&lt;br /&gt;
	const int _magicVertices = 0;&lt;br /&gt;
	const int _vertexStreamElementSize = 12;&lt;br /&gt;
	const float* _positions = _geom-&amp;gt;getPositions();&lt;br /&gt;
	const int _magicNormals = 1;&lt;br /&gt;
	const int _normalsStreamElementSize = 6;&lt;br /&gt;
	const float* _normals = _geom-&amp;gt;getNormals();&lt;br /&gt;
	const int _magicTextureCoords1 = 6;&lt;br /&gt;
	const int _texCoordStreamElementSize = 8;&lt;br /&gt;
	const float* _texCoords = _geom-&amp;gt;getTexCoords();&lt;br /&gt;
	const int* _triangleIndices = _geom-&amp;gt;getTriangleIndices();&lt;br /&gt;
	const int _numMorphTragets = 0;&lt;br /&gt;
	// header&lt;br /&gt;
	ss-&amp;gt;write(_magicHeader.c_str(), 4*sizeof(char));&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_version, sizeof(int));&lt;br /&gt;
	// joints (mandatory)&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_numJoints, sizeof(int));&lt;br /&gt;
	for (int i=0; i&amp;lt;16; ++i) {&lt;br /&gt;
		ss-&amp;gt;write((char*)&amp;amp;_identityMatrix[i], sizeof(float));&lt;br /&gt;
	}&lt;br /&gt;
	// vertices&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_numVertexStreams, sizeof(int));&lt;br /&gt;
	const int numVerts = _geom-&amp;gt;getNumVertices();&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;numVerts, sizeof(int));&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_magicVertices, sizeof(int));&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_vertexStreamElementSize, sizeof(int));&lt;br /&gt;
	for (int i=0; i&amp;lt;_geom-&amp;gt;getNumVertices()*3; ++i) {&lt;br /&gt;
		ss-&amp;gt;write((char*)&amp;amp;_positions[i], sizeof(float));&lt;br /&gt;
	}&lt;br /&gt;
	// normals&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_magicNormals, sizeof(int));&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_normalsStreamElementSize, sizeof(int));&lt;br /&gt;
	for (int i=0; i&amp;lt;_geom-&amp;gt;getNumVertices()*3; ++i) {&lt;br /&gt;
		// do not forget to mutliply the value with 32767 and &lt;br /&gt;
		// then convert it to short before writing to the stream&lt;br /&gt;
		const short f = (short)(_normals[i]*32767);&lt;br /&gt;
		ss-&amp;gt;write((char*)&amp;amp;f, sizeof(short));&lt;br /&gt;
	}&lt;br /&gt;
	// texture coordinates&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_magicTextureCoords1, sizeof(int));&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_texCoordStreamElementSize, sizeof(int));&lt;br /&gt;
	for (int i=0; i&amp;lt;_geom-&amp;gt;getNumVertices()*2; ++i) {&lt;br /&gt;
		ss-&amp;gt;write((char*)&amp;amp;_texCoords[i], sizeof(float));&lt;br /&gt;
	}&lt;br /&gt;
	// triangle indices&lt;br /&gt;
	const int numTriangleIndices = _geom-&amp;gt;getNumTriangleIndices();&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;numTriangleIndices, sizeof(int));&lt;br /&gt;
	for (int i=0; i&amp;lt;_geom-&amp;gt;getNumTriangleIndices(); ++i) {&lt;br /&gt;
		ss-&amp;gt;write((char*)&amp;amp;_triangleIndices[i], sizeof(int));&lt;br /&gt;
	}&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_numMorphTragets, sizeof(int));&lt;br /&gt;
	_stream = new char[ss-&amp;gt;tellp()];&lt;br /&gt;
	ss-&amp;gt;read(_stream, ss-&amp;gt;tellp());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const char* GeometryStreamGenerator::getStream()&lt;br /&gt;
{&lt;br /&gt;
	return _stream;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const int GeometryStreamGenerator::getStreamSize() &lt;br /&gt;
{&lt;br /&gt;
	int t = (int)ss-&amp;gt;tellp();&lt;br /&gt;
	return t;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const int GeometryStreamGenerator::getNumVertices()&lt;br /&gt;
{&lt;br /&gt;
	return numVertices;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const int GeometryStreamGenerator::getNumTriangleIndices()&lt;br /&gt;
{&lt;br /&gt;
	return numTriangleIndices;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void GeometryStreamGenerator::release()&lt;br /&gt;
{&lt;br /&gt;
	ss-&amp;gt;flush();&lt;br /&gt;
	ss-&amp;gt;clear();&lt;br /&gt;
	delete ss;&lt;br /&gt;
	ss = 0;&lt;br /&gt;
	delete[] _stream;&lt;br /&gt;
	_stream = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=CustomGeometry base class=&lt;br /&gt;
&lt;br /&gt;
Base class for the custom geometry. This class currently contains lots of deprecated stuff, e.g. the update() function. This function was used to update an in-memory gemoetry resource in the &amp;quot;punk-rock&amp;quot;-way. Until Horde3D Beta3 the geometry resources were read-only, so directmanipulation of vertices was impossible. To modify the vertices I had to unload the geometry resource, re-create it with the new vertex-positions and load it into Horde again. '''This is not necessary any more because since Beta4 the geometry resources are not read-only anymore.'''&lt;br /&gt;
&lt;br /&gt;
All custom geometry classes should be derived from this class and implement the abstract functions as needed. (See the examples below)&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= CustomGeometry.h| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#pragma once&lt;br /&gt;
/**&lt;br /&gt;
 * Abstract class for custom/dynamic geometry&lt;br /&gt;
 **/&lt;br /&gt;
#include &amp;quot;utMath.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Horde3D.h&amp;quot;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class CustomGeometry &lt;br /&gt;
{&lt;br /&gt;
protected:&lt;br /&gt;
	float _size;&lt;br /&gt;
	Vec3f _origin;&lt;br /&gt;
	int _numVertices;&lt;br /&gt;
	int _numTriangles;&lt;br /&gt;
	int _numTriangleIndices;&lt;br /&gt;
	float* _positions;&lt;br /&gt;
	float* _normals;&lt;br /&gt;
	float* _texCoords;&lt;br /&gt;
	int* _tIndices;&lt;br /&gt;
	std::string _name;&lt;br /&gt;
	NodeHandle _model;&lt;br /&gt;
	NodeHandle _parent;&lt;br /&gt;
	ResHandle _material;&lt;br /&gt;
	virtual void generatePositions() = 0;&lt;br /&gt;
	virtual void generateNormals() = 0;&lt;br /&gt;
	virtual void generateTexCoords() = 0;&lt;br /&gt;
	virtual void generateTriangleIndices() = 0;&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
	CustomGeometry();&lt;br /&gt;
	virtual void generate() = 0;&lt;br /&gt;
	const int getNumVertices() { return _numVertices; }&lt;br /&gt;
	const float* getPositions() { return _positions; }&lt;br /&gt;
	const float* getNormals() { return _normals; }&lt;br /&gt;
	const float* getTexCoords() { return _texCoords; }&lt;br /&gt;
	const int* getTriangleIndices() { return _tIndices; }&lt;br /&gt;
	const int getNumTriangles() { return _numTriangles; }&lt;br /&gt;
	const int getNumTriangleIndices() { return _numTriangleIndices; }&lt;br /&gt;
	void release();&lt;br /&gt;
	const Vec3f getInterpolatedNormal(Vec3f n1_, Vec3f n2_);&lt;br /&gt;
	// pass -1 as the parameter to leave the parent node unchanged&lt;br /&gt;
	void addCustomModelNode(NodeHandle parent_);&lt;br /&gt;
	bool removeCustomModelNode();&lt;br /&gt;
	void setMaterial(ResHandle material_) { _material = material_; }&lt;br /&gt;
	void setParent(NodeHandle parent_) { _parent = parent_; }&lt;br /&gt;
	NodeHandle getModel() { return _model; }&lt;br /&gt;
	ResHandle getMaterial() { return _material; }&lt;br /&gt;
	void update();&lt;br /&gt;
	Vec3f getOrigin() { return _origin; }&lt;br /&gt;
	void setOrigin(Vec3f origin_) { _origin = origin_; }&lt;br /&gt;
	const float getSize() { return _size; }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= CustomGeometry.cpp| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;CustomGeometry.h&amp;quot;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;sstream&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#include &amp;quot;GeometryStreamGenerator.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Horde3DUtils.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
CustomGeometry::CustomGeometry() : _name(&amp;quot;default&amp;quot;), _size(1)&lt;br /&gt;
{&lt;br /&gt;
	_origin = Vec3f(0, 0, 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CustomGeometry::release()&lt;br /&gt;
{&lt;br /&gt;
	delete[] _positions;&lt;br /&gt;
	_positions = 0;&lt;br /&gt;
	delete[] _normals;&lt;br /&gt;
	_normals = 0;&lt;br /&gt;
	delete[] _texCoords;&lt;br /&gt;
	_texCoords = 0;&lt;br /&gt;
	delete[] _tIndices;&lt;br /&gt;
	_tIndices = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const Vec3f CustomGeometry::getInterpolatedNormal(Vec3f n1_, Vec3f n2_) &lt;br /&gt;
{&lt;br /&gt;
	Vec3f newNormal = n1_ + n2_;&lt;br /&gt;
	float length = newNormal.length();&lt;br /&gt;
	return newNormal/length;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CustomGeometry::addCustomModelNode(NodeHandle parent_)&lt;br /&gt;
{&lt;br /&gt;
	//std::stringstream* sa = new std::stringstream();&lt;br /&gt;
	std::stringstream ss;&lt;br /&gt;
	if (parent_ != -1) &lt;br /&gt;
		_parent = parent_;&lt;br /&gt;
	ss&amp;lt;&amp;lt; &amp;quot;customGeometry-&amp;quot;;&lt;br /&gt;
	ss&amp;lt;&amp;lt;_name;&lt;br /&gt;
	GeometryStreamGenerator* gsg = new GeometryStreamGenerator(this);&lt;br /&gt;
	ResHandle customGeoRes = Horde3D::addResource(ResourceTypes::Geometry, ss.str().c_str(), 0);&lt;br /&gt;
	Horde3D::loadResource(customGeoRes, gsg-&amp;gt;getStream(), gsg-&amp;gt;getStreamSize());&lt;br /&gt;
	// model_node_name&lt;br /&gt;
	ss&amp;lt;&amp;lt;&amp;quot;-Node&amp;quot;;&lt;br /&gt;
	_model = Horde3D::addModelNode(_parent, ss.str().c_str(), customGeoRes);&lt;br /&gt;
	// mesh_name&lt;br /&gt;
	ss&amp;lt;&amp;lt;&amp;quot;-Mesh&amp;quot;;&lt;br /&gt;
	Horde3D::addMeshNode(_model, ss.str().c_str(), _material, 0, gsg-&amp;gt;getNumTriangleIndices(), 0, gsg-&amp;gt;getNumVertices()-1);&lt;br /&gt;
	Horde3DUtils::dumpMessages();&lt;br /&gt;
	ss.str(&amp;quot;&amp;quot;);&lt;br /&gt;
	ss.clear();&lt;br /&gt;
	ss.flush();&lt;br /&gt;
	gsg-&amp;gt;release();&lt;br /&gt;
	delete gsg;&lt;br /&gt;
	gsg = 0;&lt;br /&gt;
	//Horde3D::setNodeTransform(_model, _origin.x, _origin.y, _origin.z, 0, 0, 0, 1, 1, 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool CustomGeometry::removeCustomModelNode()&lt;br /&gt;
{&lt;br /&gt;
	std::stringstream* ss = new std::stringstream();&lt;br /&gt;
	*ss&amp;lt;&amp;lt; &amp;quot;customGeometry-&amp;quot;;&lt;br /&gt;
	*ss&amp;lt;&amp;lt;_name;&lt;br /&gt;
	ResHandle rh = Horde3D::findResource(ResourceTypes::Geometry, ss-&amp;gt;str().c_str());&lt;br /&gt;
	if (Horde3D::isResourceLoaded(rh)) {&lt;br /&gt;
		Horde3D::removeResource(rh);&lt;br /&gt;
		Horde3D::unloadResource(rh);&lt;br /&gt;
		Horde3D::removeNode(_model);&lt;br /&gt;
		Horde3D::releaseUnusedResources();&lt;br /&gt;
		Horde3DUtils::dumpMessages();&lt;br /&gt;
		delete ss;&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
	else &lt;br /&gt;
		return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CustomGeometry::update()&lt;br /&gt;
{&lt;br /&gt;
	removeCustomModelNode();&lt;br /&gt;
	addCustomModelNode(-1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Simple Square=&lt;br /&gt;
&lt;br /&gt;
A simple hard-coded square. This is pretty straight forward and demonstrates how to derive from the CustomGeometry class and how the triangle indices work.&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= DynamicSquare.h| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Class representing a square &lt;br /&gt;
 **/&lt;br /&gt;
#pragma once&lt;br /&gt;
#include &amp;quot;CustomGeometry.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class DynamicSquare : public CustomGeometry&lt;br /&gt;
{&lt;br /&gt;
protected:&lt;br /&gt;
	virtual void generatePositions();&lt;br /&gt;
	virtual void generateNormals();&lt;br /&gt;
	virtual void generateTexCoords();&lt;br /&gt;
	virtual void generateTriangleIndices();&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
	DynamicSquare();&lt;br /&gt;
	virtual void generate();&lt;br /&gt;
	DynamicSquare(const float size_, const std::string name_);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= DynamicSquare.cpp| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;DynamicSquare.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DynamicSquare::DynamicSquare() : CustomGeometry()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DynamicSquare::DynamicSquare(const float size_, const std::string name_) &lt;br /&gt;
{&lt;br /&gt;
	_size = size_;&lt;br /&gt;
	_name = name_;&lt;br /&gt;
	_numVertices = 4;&lt;br /&gt;
	_numTriangles = 2;&lt;br /&gt;
	_numTriangleIndices = _numTriangles * 3;&lt;br /&gt;
	//generate();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicSquare::generate() &lt;br /&gt;
{&lt;br /&gt;
	generatePositions();&lt;br /&gt;
	generateNormals();&lt;br /&gt;
	generateTexCoords();&lt;br /&gt;
	generateTriangleIndices();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicSquare::generatePositions() &lt;br /&gt;
{&lt;br /&gt;
	_positions = new float[_numVertices * 3 * 2];&lt;br /&gt;
	// front left point (x/y/z)&lt;br /&gt;
	_positions[0] = _origin.x * _size - _size/2;&lt;br /&gt;
	_positions[1] = _origin.y;&lt;br /&gt;
	_positions[2] = _origin.z * _size -_size/2;&lt;br /&gt;
	// front right point (x/y/z)&lt;br /&gt;
	_positions[3] = _origin.x * _size + _size/2;&lt;br /&gt;
	_positions[4] = _origin.y;&lt;br /&gt;
	_positions[5] = _origin.z * _size - _size/2;&lt;br /&gt;
	// back left point (x/y/z)&lt;br /&gt;
	_positions[6] = _origin.x * _size - _size/2;&lt;br /&gt;
	_positions[7] = _origin.y;&lt;br /&gt;
	_positions[8] = _origin.z * _size + _size/2;&lt;br /&gt;
	// back right point (x/y/z)&lt;br /&gt;
	_positions[9] = _origin.x * _size + _size/2;&lt;br /&gt;
	_positions[10] = _origin.y;&lt;br /&gt;
	_positions[11] = _origin.z * _size + _size/2;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicSquare::generateNormals() &lt;br /&gt;
{&lt;br /&gt;
	_normals = new float[_numVertices * 3];&lt;br /&gt;
	for (int i=0; i&amp;lt; 12; i+=3) {&lt;br /&gt;
		_normals[i] = 0;&lt;br /&gt;
		_normals[i+1] = 1;&lt;br /&gt;
		_normals[i+2] = 0;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicSquare::generateTexCoords()&lt;br /&gt;
{&lt;br /&gt;
	_texCoords = new float[_numVertices * 2];&lt;br /&gt;
	_texCoords[0] = 0.0f; &lt;br /&gt;
	_texCoords[1] = 0.0f;&lt;br /&gt;
	_texCoords[2] = 1.0f; &lt;br /&gt;
	_texCoords[3] = 0.0f;&lt;br /&gt;
	_texCoords[4] = 0.0f; &lt;br /&gt;
	_texCoords[5] = 1.0f;&lt;br /&gt;
	_texCoords[6] = 1.0f; &lt;br /&gt;
	_texCoords[7] = 1.0f;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicSquare::generateTriangleIndices() &lt;br /&gt;
{&lt;br /&gt;
	_tIndices = new int[_numTriangleIndices ];&lt;br /&gt;
	_tIndices[0] = 0;&lt;br /&gt;
	_tIndices[1] = 2;&lt;br /&gt;
	_tIndices[2] = 1;&lt;br /&gt;
	_tIndices[3] = 1;&lt;br /&gt;
	_tIndices[4] = 2;&lt;br /&gt;
	_tIndices[5] = 3;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Simple Grid=&lt;br /&gt;
&lt;br /&gt;
All the work above was made to create my own interactive terrain generator(screenshot on top of this page) for a A* pathfinding demonstrator. The Grid-class actually generates a 2-dimensional array of Vec3f(s) and allows to extrude each point and re-generate the mesh in realtime. The internal representation is writeable and in case of a change of any point the overridden update() function will be called to update the Horde3D geometry resource.&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= DynamicGrid.h| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Class representing a grid&lt;br /&gt;
 **/&lt;br /&gt;
#pragma once&lt;br /&gt;
#include &amp;quot;CustomGeometry.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class DynamicGrid : public CustomGeometry&lt;br /&gt;
{&lt;br /&gt;
protected:&lt;br /&gt;
	virtual void generatePositions();&lt;br /&gt;
	virtual void generateNormals();&lt;br /&gt;
	virtual void generateTexCoords();&lt;br /&gt;
	virtual void generateTriangleIndices();&lt;br /&gt;
       // generate the internal representation of the grid (writeable to allow updates of single points!)&lt;br /&gt;
	void generateGrid();&lt;br /&gt;
	int _gridSize;&lt;br /&gt;
	Vec3f** _grid;&lt;br /&gt;
	std::string _fileName;&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
	DynamicGrid();&lt;br /&gt;
	virtual void generate();&lt;br /&gt;
	DynamicGrid(const float size_, const std::string name_, std::string fileName_);&lt;br /&gt;
	Vec3f getPointAt(int x_, int y_) { return _grid[y_][x_]; }&lt;br /&gt;
	// update a point of our grid (args: index x, index y, new position)&lt;br /&gt;
	void setPointAt(int x_, int y_, Vec3f newPos_) { _grid[y_][x_] = newPos_; }&lt;br /&gt;
	int getGridSize() { return _gridSize; }&lt;br /&gt;
	// overwrite update() from parent class&lt;br /&gt;
	void update();&lt;br /&gt;
	// read and write grids from/to files&lt;br /&gt;
	void saveGridToFile(std::string fileName_);&lt;br /&gt;
	bool readGridFromFile(std::string fileName_);&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= DynamicGrid.cpp| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;DynamicGrid.h&amp;quot;&lt;br /&gt;
#include &amp;quot;rng.h&amp;quot;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;sstream&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#include &amp;quot;util.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define GRIDSIZE 50&lt;br /&gt;
&lt;br /&gt;
DynamicGrid::DynamicGrid() : CustomGeometry()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DynamicGrid::DynamicGrid(const float size_, const std::string name_, std::string fileName_) : _fileName(fileName_) &lt;br /&gt;
{&lt;br /&gt;
	_name = name_;&lt;br /&gt;
	_positions = 0;&lt;br /&gt;
	_normals = 0;&lt;br /&gt;
	_texCoords = 0;&lt;br /&gt;
	_tIndices = 0;&lt;br /&gt;
	readGridFromFile(_fileName);&lt;br /&gt;
	_numVertices = (_gridSize*_gridSize);&lt;br /&gt;
	_numTriangles = ((_gridSize - 1) * (_gridSize - 1)) * 2;&lt;br /&gt;
	_numTriangleIndices = _numTriangles * 3;&lt;br /&gt;
	_origin = Vec3f(-_size/2*_gridSize, 0, _size/2*_gridSize);&lt;br /&gt;
	/*&lt;br /&gt;
	std::cout&amp;lt;&amp;lt;&amp;quot;numVerts: &amp;quot;&amp;lt;&amp;lt;_numVertices&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	std::cout&amp;lt;&amp;lt;&amp;quot;numTris: &amp;quot;&amp;lt;&amp;lt;_numTriangles&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	std::cout&amp;lt;&amp;lt;&amp;quot;numTInds: &amp;quot;&amp;lt;&amp;lt;_numTriangleIndices&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	std::cout&amp;lt;&amp;lt;&amp;quot;size: &amp;quot;&amp;lt;&amp;lt;_size&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	*/&lt;br /&gt;
	//std::cout&amp;lt;&amp;lt;_origin.x&amp;lt;&amp;lt;&amp;quot;/&amp;quot;&amp;lt;&amp;lt;_origin.y&amp;lt;&amp;lt;&amp;quot;/&amp;quot;&amp;lt;&amp;lt;_origin.z&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	//generate();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicGrid::generate() &lt;br /&gt;
{&lt;br /&gt;
	if (!_grid)&lt;br /&gt;
		generateGrid();&lt;br /&gt;
	generatePositions();&lt;br /&gt;
	generateNormals();&lt;br /&gt;
	generateTexCoords();&lt;br /&gt;
	generateTriangleIndices();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the following two functions could be combined into one single loop, but I left it this way for clarity...&lt;br /&gt;
/**&lt;br /&gt;
 * This function simply generates a 2-dimensional array of Vec3f(s) with slightly random height values&lt;br /&gt;
 **/&lt;br /&gt;
void DynamicGrid::generateGrid()&lt;br /&gt;
{&lt;br /&gt;
	RNG rng;&lt;br /&gt;
	_grid = new Vec3f*[_gridSize];&lt;br /&gt;
	for (int y=0; y&amp;lt;_gridSize; ++y) {&lt;br /&gt;
		_grid[y] = new Vec3f[_gridSize];&lt;br /&gt;
		for (int x=0; x&amp;lt;_gridSize; ++x) {&lt;br /&gt;
			long rand = (abs((int)rng.rand_int31()) %3);&lt;br /&gt;
			_grid[y][x] = Vec3f(_origin.x/2+_size/2*x, rand, _origin.z/2-_size/2*y);&lt;br /&gt;
			//std::cout&amp;lt;&amp;lt;_grid[y][x].x&amp;lt;&amp;lt;&amp;quot;/&amp;quot;&amp;lt;&amp;lt;_grid[y][x].y&amp;lt;&amp;lt;&amp;quot;/&amp;quot;&amp;lt;&amp;lt;_grid[y][x].z&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Convert the grid's positions into a Horde3D vertex array.&lt;br /&gt;
 **/&lt;br /&gt;
void DynamicGrid::generatePositions() &lt;br /&gt;
{&lt;br /&gt;
	_positions = new float[_numVertices*3];&lt;br /&gt;
	int counter = 0;&lt;br /&gt;
	for (int i=0; i&amp;lt;_numVertices*3; i+=3) {&lt;br /&gt;
		int y = counter / _gridSize;&lt;br /&gt;
		int x = counter % _gridSize;&lt;br /&gt;
		_positions[i] = _grid[y][x].x;&lt;br /&gt;
		_positions[i+1] = _grid[y][x].y;&lt;br /&gt;
		_positions[i+2] = _grid[y][x].z;&lt;br /&gt;
		++counter;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicGrid::generateNormals() &lt;br /&gt;
{&lt;br /&gt;
	_normals = new float[_numVertices * 3];&lt;br /&gt;
	for (int i=0; i&amp;lt; _numVertices*3; i+=3) {&lt;br /&gt;
		int pos = i/3;&lt;br /&gt;
		int xPos = pos % _gridSize;&lt;br /&gt;
		int yPos = pos / _gridSize;&lt;br /&gt;
		Vec3f xPred;&lt;br /&gt;
		Vec3f xSucc;&lt;br /&gt;
		Vec3f yPred;&lt;br /&gt;
		Vec3f ySucc;&lt;br /&gt;
		Vec3f normal;&lt;br /&gt;
		if (xPos &amp;gt; 0 &amp;amp;&amp;amp; yPos &amp;gt; 0) {&lt;br /&gt;
			// if the current vertex is inside the grid we will calculate&lt;br /&gt;
			// two normals from the previous&amp;amp;next point and our current vertex&lt;br /&gt;
			if (xPos &amp;lt; _gridSize-1 &amp;amp;&amp;amp; yPos &amp;lt; _gridSize-1) {&lt;br /&gt;
				xSucc = _grid[yPos][xPos+1];&lt;br /&gt;
				xPred = _grid[yPos][xPos-1];&lt;br /&gt;
				ySucc = _grid[yPos+1][xPos];&lt;br /&gt;
				yPred = _grid[yPos-1][xPos];&lt;br /&gt;
				Vec3f v1 = xSucc - _grid[yPos][xPos];&lt;br /&gt;
				if (v1.y &amp;lt; 0)&lt;br /&gt;
					v1.y *= -1;&lt;br /&gt;
				Vec3f v2 = xPred - _grid[yPos][xPos];&lt;br /&gt;
				if (v2.y &amp;lt; 0)&lt;br /&gt;
					v2.y *= -1;&lt;br /&gt;
				v1 += v2;&lt;br /&gt;
				Vec3f v3 = ySucc - _grid[yPos][xPos];&lt;br /&gt;
				if (v3.y &amp;lt; 0)&lt;br /&gt;
					v3.y *= -1;&lt;br /&gt;
				Vec3f v4 = yPred - _grid[yPos][xPos];&lt;br /&gt;
				if (v4.y &amp;lt; 0)&lt;br /&gt;
					v4.y *= -1;&lt;br /&gt;
				v3 += v4;&lt;br /&gt;
				normal = getInterpolatedNormal(v1, v3);&lt;br /&gt;
			}&lt;br /&gt;
			// if the vertex is on the grid's border the normal will simply be 0/1/0&lt;br /&gt;
			else {&lt;br /&gt;
				normal = Vec3f(0,1,0);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			normal = Vec3f(0,1,0);&lt;br /&gt;
		}&lt;br /&gt;
		_normals[i] = normal.x;&lt;br /&gt;
		_normals[i+1] = normal.y;&lt;br /&gt;
		_normals[i+2] = normal.z;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicGrid::generateTexCoords()&lt;br /&gt;
{&lt;br /&gt;
	_texCoords = new float[_numVertices * 2];&lt;br /&gt;
	int counter = 0;&lt;br /&gt;
	int line = 0;&lt;br /&gt;
	for (int i=0; i&amp;lt;_numVertices*2; i+=2) {&lt;br /&gt;
		if ( line % 2 == 0) {&lt;br /&gt;
			if (counter %2 == 0) {&lt;br /&gt;
				_texCoords[i] = 0.0f;&lt;br /&gt;
				_texCoords[i+1] = 0.0f;&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				_texCoords[i] = 0.0f;&lt;br /&gt;
				_texCoords[i+1] = 1.0f;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			if (counter % 2 == 0) {&lt;br /&gt;
				_texCoords[i] = 1.0f;&lt;br /&gt;
				_texCoords[i+1] = 0.0f;&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				_texCoords[i] = 1.0f;&lt;br /&gt;
				_texCoords[i+1] = 1.0f;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		++counter;&lt;br /&gt;
		if (counter &amp;gt;= _gridSize) {&lt;br /&gt;
			++line;&lt;br /&gt;
			counter = 0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicGrid::generateTriangleIndices() &lt;br /&gt;
{&lt;br /&gt;
	_tIndices = new int[ _numTriangleIndices ];&lt;br /&gt;
	int counter = 0;&lt;br /&gt;
	int lineBreakCounter = 0;&lt;br /&gt;
	int counter3 = 0;&lt;br /&gt;
	for (int i=0; i&amp;lt;_numTriangleIndices; i+=3) {&lt;br /&gt;
		if (i%2 ==0) {&lt;br /&gt;
			_tIndices[i] = counter;&lt;br /&gt;
			_tIndices[i+1] = counter+1;&lt;br /&gt;
			_tIndices[i+2] = counter+_gridSize;&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			_tIndices[i] = counter + _gridSize;&lt;br /&gt;
			_tIndices[i+1] = counter + 1;&lt;br /&gt;
			_tIndices[i+2] = counter+_gridSize+1;&lt;br /&gt;
			++counter;&lt;br /&gt;
		}&lt;br /&gt;
		++lineBreakCounter;&lt;br /&gt;
		if (lineBreakCounter == _gridSize*2 - 2) {&lt;br /&gt;
			--counter;&lt;br /&gt;
			++counter3;&lt;br /&gt;
			lineBreakCounter = 0;&lt;br /&gt;
			counter = counter3*_gridSize;&lt;br /&gt;
		}&lt;br /&gt;
		//std::cout&amp;lt;&amp;lt;_tIndices[i]&amp;lt;&amp;lt;&amp;quot;/&amp;quot;&amp;lt;&amp;lt;_tIndices[i+1]&amp;lt;&amp;lt;&amp;quot;/&amp;quot;&amp;lt;&amp;lt;_tIndices[i+2]&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicGrid::update()&lt;br /&gt;
{&lt;br /&gt;
	removeCustomModelNode();&lt;br /&gt;
	delete[] _positions;&lt;br /&gt;
	_positions = 0;&lt;br /&gt;
	delete[] _normals;&lt;br /&gt;
	_normals = 0;&lt;br /&gt;
	generatePositions();&lt;br /&gt;
	generateNormals();&lt;br /&gt;
	addCustomModelNode(-1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicGrid::saveGridToFile(std::string fileName_)&lt;br /&gt;
{&lt;br /&gt;
	//std::stringstream fName;&lt;br /&gt;
	//fName&amp;lt;&amp;lt;fileName_;&lt;br /&gt;
	//fName&amp;lt;&amp;lt;&amp;quot;.d2g&amp;quot;;&lt;br /&gt;
	std::stringstream ss;&lt;br /&gt;
	// magic header&lt;br /&gt;
	ss&amp;lt;&amp;lt;&amp;quot;D2SG\n&amp;quot;;&lt;br /&gt;
	// the gridsize (important to know!)&lt;br /&gt;
	ss&amp;lt;&amp;lt;_gridSize;&lt;br /&gt;
	ss&amp;lt;&amp;lt;&amp;quot;\n&amp;quot;;&lt;br /&gt;
	// the quadsize (important to know!)&lt;br /&gt;
	ss&amp;lt;&amp;lt;_size;&lt;br /&gt;
	ss&amp;lt;&amp;lt;&amp;quot;\n&amp;quot;;&lt;br /&gt;
	// number of coordinates (most important to know!)&lt;br /&gt;
	ss&amp;lt;&amp;lt;(_gridSize*_gridSize*3);&lt;br /&gt;
	ss&amp;lt;&amp;lt;&amp;quot;\n&amp;quot;;&lt;br /&gt;
	// coordinates&lt;br /&gt;
	for (int y=0; y&amp;lt;_gridSize; ++y) {&lt;br /&gt;
		for (int x=0; x&amp;lt;_gridSize; ++x) {&lt;br /&gt;
			ss&amp;lt;&amp;lt;_grid[y][x].x;&lt;br /&gt;
			ss&amp;lt;&amp;lt;&amp;quot;\n&amp;quot;;&lt;br /&gt;
			ss&amp;lt;&amp;lt;_grid[y][x].y;&lt;br /&gt;
			ss&amp;lt;&amp;lt;&amp;quot;\n&amp;quot;;&lt;br /&gt;
			ss&amp;lt;&amp;lt;_grid[y][x].z;&lt;br /&gt;
			ss&amp;lt;&amp;lt;&amp;quot;\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	ss&amp;lt;&amp;lt;&amp;quot;\n&amp;quot;;&lt;br /&gt;
	std::ofstream dest(fileName_.c_str());&lt;br /&gt;
	if (dest.is_open()) {&lt;br /&gt;
		dest&amp;lt;&amp;lt;ss.str();&lt;br /&gt;
		dest.close();&lt;br /&gt;
	}&lt;br /&gt;
	std::cout&amp;lt;&amp;lt;&amp;quot;Grid successfully saved to file: &amp;quot;&amp;lt;&amp;lt;fileName_&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool DynamicGrid::readGridFromFile(std::string fileName_)&lt;br /&gt;
{&lt;br /&gt;
	int numCoordinates;&lt;br /&gt;
	std::ifstream inFile;&lt;br /&gt;
	inFile.open(fileName_.c_str());&lt;br /&gt;
	bool error = false;&lt;br /&gt;
	if (!inFile) {&lt;br /&gt;
		std::cout&amp;lt;&amp;lt;&amp;quot;Gridfile &amp;quot;&amp;lt;&amp;lt;fileName_&amp;lt;&amp;lt;&amp;quot; could not be found! Creating new grid.&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
		error = true;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		std::string line;&lt;br /&gt;
		if (std::getline(inFile, line)) {&lt;br /&gt;
			std::cout&amp;lt;&amp;lt;&amp;quot;Line: &amp;quot;&amp;lt;&amp;lt;line&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
			if (line != &amp;quot;D2SG&amp;quot;) {&lt;br /&gt;
				std::cout&amp;lt;&amp;lt;&amp;quot;wrong grid-file format &amp;quot;&amp;lt;&amp;lt;line.compare(&amp;quot;D2SG&amp;quot;)&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
				error = true;&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				std::cout&amp;lt;&amp;lt;&amp;quot;Valid grid-file found!&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (std::getline(inFile, line)) {&lt;br /&gt;
			_gridSize = stringToInt(line);&lt;br /&gt;
			//std::cout&amp;lt;&amp;lt;&amp;quot;gridsize: &amp;quot;&amp;lt;&amp;lt;_gridSize&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			error = true;&lt;br /&gt;
		}&lt;br /&gt;
		if (std::getline(inFile, line)) {&lt;br /&gt;
			_size = stringToInt(line);&lt;br /&gt;
			//std::cout&amp;lt;&amp;lt;&amp;quot;quadsize: &amp;quot;&amp;lt;&amp;lt;_size&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			error = true;&lt;br /&gt;
		}&lt;br /&gt;
		if (std::getline(inFile, line)) {&lt;br /&gt;
			numCoordinates = stringToInt(line);&lt;br /&gt;
			//std::cout&amp;lt;&amp;lt;&amp;quot;numCoords: &amp;quot;&amp;lt;&amp;lt;numCoordinates&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			error = true;&lt;br /&gt;
		}&lt;br /&gt;
		if (!error) {&lt;br /&gt;
			_grid = new Vec3f*[_gridSize];&lt;br /&gt;
			for(int y=0; y&amp;lt;_gridSize; ++y) {&lt;br /&gt;
				_grid[y] = new Vec3f[_gridSize];&lt;br /&gt;
				for (int x=0; x&amp;lt;_gridSize; ++x) {&lt;br /&gt;
					Vec3f v;&lt;br /&gt;
					if (std::getline(inFile, line)) {&lt;br /&gt;
						v.x = stringToFloat(line);&lt;br /&gt;
					}&lt;br /&gt;
					if (std::getline(inFile, line)) {&lt;br /&gt;
						v.y = stringToFloat(line);&lt;br /&gt;
					}&lt;br /&gt;
					if (std::getline(inFile, line)) {&lt;br /&gt;
						v.z = stringToFloat(line);&lt;br /&gt;
					}&lt;br /&gt;
					_grid[y][x] = v;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	inFile.close();&lt;br /&gt;
	if (error) {&lt;br /&gt;
		_gridSize = GRIDSIZE;&lt;br /&gt;
		_size = 12;&lt;br /&gt;
		_grid = 0;&lt;br /&gt;
	}&lt;br /&gt;
	_numVertices = (_gridSize*_gridSize);&lt;br /&gt;
	_numTriangles = ((_gridSize - 1) * (_gridSize - 1)) * 2;&lt;br /&gt;
	_numTriangleIndices = _numTriangles * 3;&lt;br /&gt;
	_origin = Vec3f(-_size/2*_gridSize, 0, _size/2*_gridSize);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Usage example=&lt;br /&gt;
&lt;br /&gt;
Finally this is all you have to do to generate the grid and display it in your scene.&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= app.cpp| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	// initialize a new grid (args: quadsize, model-name, filename (if applicable)&lt;br /&gt;
	_grid = new DynamicGrid(12.0f, &amp;quot;grid&amp;quot;, &amp;quot;grid-filename&amp;quot;);&lt;br /&gt;
	// do not forget to load a material and apply it to the mesh&lt;br /&gt;
	_grid-&amp;gt;setMaterial(gridMatRes);&lt;br /&gt;
	// generate the grid&lt;br /&gt;
	_grid-&amp;gt;generate();&lt;br /&gt;
	// add the grid-model to the RootNode&lt;br /&gt;
	_grid-&amp;gt;addCustomModelNode(RootNode);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''TODO'''&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Newacct</name></author>	</entry>

	<entry>
		<id>http://horde3d.org/wiki/index.php?title=Procedurally_generated_geometry_tutorial&amp;diff=691</id>
		<title>Procedurally generated geometry tutorial</title>
		<link rel="alternate" type="text/html" href="http://horde3d.org/wiki/index.php?title=Procedurally_generated_geometry_tutorial&amp;diff=691"/>
				<updated>2011-03-17T10:52:52Z</updated>
		
		<summary type="html">&lt;p&gt;Newacct: Undo revision 690 by Newacct (Talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ __NOEDITSECTION__{{ContentBlock|color=white|content={{!!}}&lt;br /&gt;
'''Work in progress   - Due to the current changes in the Horde API this tutorial will be delayed '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Important notes=&lt;br /&gt;
* The code used here has been tested with Horde3D 1.0.0 beta2 and beta3 and will '''NOT''' work with the latest release (beta4)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Overview=&lt;br /&gt;
==Basic approach==&lt;br /&gt;
To create and display a procedurally generated mesh that, instead of being loaded from a Horde3D Scene node and a geoemtry file(*.scene.xml, *.geo), will be created in-memory by some algorithm, you have to create a mesh first and then &amp;quot;fake&amp;quot; the .geo-file and the scene node itself and pass it to the engine.&lt;br /&gt;
&lt;br /&gt;
To do that you have to create your procedural geometry first. This is easy for simple shapes like single triangles, squares or triangle-strips, but will become way more difficult when we try to generate complex meshes, e.g. when we have a cloud of points in 3D space and have to describe which points make triangles, and which don't (calculating the triangle indices, texture coordinates and normals).&lt;br /&gt;
&lt;br /&gt;
When we have calculated the geometry itself we need to create a char-stream to make Horde believe the geometry has been read from a file and pass it to Horde as a geometry Resource.&lt;br /&gt;
The final step is to create a Horde3D Scene Node from our procedurally generated mesh and render it into our scene.&lt;br /&gt;
&lt;br /&gt;
=StreamGenerator=&lt;br /&gt;
&lt;br /&gt;
These classes are only for creating the character stream that will contain the geometry resource.&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= StreamGenerator.h| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#pragma once&lt;br /&gt;
#include &amp;lt;sstream&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class StreamGenerator &lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
	StreamGenerator();&lt;br /&gt;
	virtual ~StreamGenerator();&lt;br /&gt;
	virtual const char* getStream() = 0;&lt;br /&gt;
	virtual const int getStreamSize() = 0;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= StreamGenerator.cpp| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;StreamGenerator.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
StreamGenerator::StreamGenerator() &lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
StreamGenerator::~StreamGenerator()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= GeometryStreamGenerator.h| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#pragma once&lt;br /&gt;
#include &amp;quot;StreamGenerator.h&amp;quot;&lt;br /&gt;
#include &amp;quot;CustomGeometry.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class GeometryStreamGenerator : public StreamGenerator&lt;br /&gt;
{&lt;br /&gt;
private:&lt;br /&gt;
	std::stringstream* ss;&lt;br /&gt;
	void generate();&lt;br /&gt;
	int numVertices, numTriangleIndices;&lt;br /&gt;
	char* _stream;&lt;br /&gt;
	CustomGeometry* _geom;&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
	GeometryStreamGenerator(CustomGeometry* geom_);&lt;br /&gt;
	~GeometryStreamGenerator();&lt;br /&gt;
	const char* getStream();&lt;br /&gt;
	const std::stringstream* getStringStream() { return ss; };&lt;br /&gt;
	const int getStreamSize();&lt;br /&gt;
	const int getNumVertices();&lt;br /&gt;
	const int getNumTriangleIndices();&lt;br /&gt;
	void release();&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= GeometryStreamGenerator.cpp| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;GeometryStreamGenerator.h&amp;quot;&lt;br /&gt;
#include &amp;quot;time.h&amp;quot;&lt;br /&gt;
#include &amp;quot;utMath.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
GeometryStreamGenerator::GeometryStreamGenerator(CustomGeometry* geom_) : _geom(geom_)&lt;br /&gt;
{&lt;br /&gt;
	ss = new std::stringstream();&lt;br /&gt;
	generate();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
GeometryStreamGenerator::~GeometryStreamGenerator()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void GeometryStreamGenerator::generate()&lt;br /&gt;
{&lt;br /&gt;
	numVertices = _geom-&amp;gt;getNumVertices();&lt;br /&gt;
	numTriangleIndices = _geom-&amp;gt;getNumTriangleIndices();&lt;br /&gt;
	const std::string _magicHeader = &amp;quot;H3DG&amp;quot;;&lt;br /&gt;
	const int _version = 5;&lt;br /&gt;
	const int _numJoints = 1;&lt;br /&gt;
	const float _identityMatrix[] = {	1.0f, 0.0f, 0.0f, 0.0f,  &lt;br /&gt;
						0.0f, 1.0f, 0.0f, 0.0f,  &lt;br /&gt;
						0.0f, 0.0f, 1.0f, 0.0f,  &lt;br /&gt;
						0.0f, 0.0f, 0.0f, 1.0f};&lt;br /&gt;
	const int _numVertexStreams = 3;&lt;br /&gt;
	const int _magicVertices = 0;&lt;br /&gt;
	const int _vertexStreamElementSize = 12;&lt;br /&gt;
	const float* _positions = _geom-&amp;gt;getPositions();&lt;br /&gt;
	const int _magicNormals = 1;&lt;br /&gt;
	const int _normalsStreamElementSize = 6;&lt;br /&gt;
	const float* _normals = _geom-&amp;gt;getNormals();&lt;br /&gt;
	const int _magicTextureCoords1 = 6;&lt;br /&gt;
	const int _texCoordStreamElementSize = 8;&lt;br /&gt;
	const float* _texCoords = _geom-&amp;gt;getTexCoords();&lt;br /&gt;
	const int* _triangleIndices = _geom-&amp;gt;getTriangleIndices();&lt;br /&gt;
	const int _numMorphTragets = 0;&lt;br /&gt;
	// header&lt;br /&gt;
	ss-&amp;gt;write(_magicHeader.c_str(), 4*sizeof(char));&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_version, sizeof(int));&lt;br /&gt;
	// joints (mandatory)&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_numJoints, sizeof(int));&lt;br /&gt;
	for (int i=0; i&amp;lt;16; ++i) {&lt;br /&gt;
		ss-&amp;gt;write((char*)&amp;amp;_identityMatrix[i], sizeof(float));&lt;br /&gt;
	}&lt;br /&gt;
	// vertices&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_numVertexStreams, sizeof(int));&lt;br /&gt;
	const int numVerts = _geom-&amp;gt;getNumVertices();&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;numVerts, sizeof(int));&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_magicVertices, sizeof(int));&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_vertexStreamElementSize, sizeof(int));&lt;br /&gt;
	for (int i=0; i&amp;lt;_geom-&amp;gt;getNumVertices()*3; ++i) {&lt;br /&gt;
		ss-&amp;gt;write((char*)&amp;amp;_positions[i], sizeof(float));&lt;br /&gt;
	}&lt;br /&gt;
	// normals&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_magicNormals, sizeof(int));&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_normalsStreamElementSize, sizeof(int));&lt;br /&gt;
	for (int i=0; i&amp;lt;_geom-&amp;gt;getNumVertices()*3; ++i) {&lt;br /&gt;
		// do not forget to mutliply the value with 32767 and &lt;br /&gt;
		// then convert it to short before writing to the stream&lt;br /&gt;
		const short f = (short)(_normals[i]*32767);&lt;br /&gt;
		ss-&amp;gt;write((char*)&amp;amp;f, sizeof(short));&lt;br /&gt;
	}&lt;br /&gt;
	// texture coordinates&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_magicTextureCoords1, sizeof(int));&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_texCoordStreamElementSize, sizeof(int));&lt;br /&gt;
	for (int i=0; i&amp;lt;_geom-&amp;gt;getNumVertices()*2; ++i) {&lt;br /&gt;
		ss-&amp;gt;write((char*)&amp;amp;_texCoords[i], sizeof(float));&lt;br /&gt;
	}&lt;br /&gt;
	// triangle indices&lt;br /&gt;
	const int numTriangleIndices = _geom-&amp;gt;getNumTriangleIndices();&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;numTriangleIndices, sizeof(int));&lt;br /&gt;
	for (int i=0; i&amp;lt;_geom-&amp;gt;getNumTriangleIndices(); ++i) {&lt;br /&gt;
		ss-&amp;gt;write((char*)&amp;amp;_triangleIndices[i], sizeof(int));&lt;br /&gt;
	}&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_numMorphTragets, sizeof(int));&lt;br /&gt;
	_stream = new char[ss-&amp;gt;tellp()];&lt;br /&gt;
	ss-&amp;gt;read(_stream, ss-&amp;gt;tellp());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const char* GeometryStreamGenerator::getStream()&lt;br /&gt;
{&lt;br /&gt;
	return _stream;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const int GeometryStreamGenerator::getStreamSize() &lt;br /&gt;
{&lt;br /&gt;
	int t = (int)ss-&amp;gt;tellp();&lt;br /&gt;
	return t;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const int GeometryStreamGenerator::getNumVertices()&lt;br /&gt;
{&lt;br /&gt;
	return numVertices;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const int GeometryStreamGenerator::getNumTriangleIndices()&lt;br /&gt;
{&lt;br /&gt;
	return numTriangleIndices;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void GeometryStreamGenerator::release()&lt;br /&gt;
{&lt;br /&gt;
	ss-&amp;gt;flush();&lt;br /&gt;
	ss-&amp;gt;clear();&lt;br /&gt;
	delete ss;&lt;br /&gt;
	ss = 0;&lt;br /&gt;
	delete[] _stream;&lt;br /&gt;
	_stream = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=CustomGeometry base class=&lt;br /&gt;
&lt;br /&gt;
Base class for the custom geometry. This class currently contains lots of deprecated stuff, e.g. the update() function. This function was used to update an in-memory gemoetry resource in the &amp;quot;punk-rock&amp;quot;-way. Until Horde3D Beta3 the geometry resources were read-only, so directmanipulation of vertices was impossible. To modify the vertices I had to unload the geometry resource, re-create it with the new vertex-positions and load it into Horde again. '''This is not necessary any more because since Beta4 the geometry resources are not read-only anymore.'''&lt;br /&gt;
&lt;br /&gt;
All custom geometry classes should be derived from this class and implement the abstract functions as needed. (See the examples below)&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= CustomGeometry.h| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#pragma once&lt;br /&gt;
/**&lt;br /&gt;
 * Abstract class for custom/dynamic geometry&lt;br /&gt;
 **/&lt;br /&gt;
#include &amp;quot;utMath.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Horde3D.h&amp;quot;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class CustomGeometry &lt;br /&gt;
{&lt;br /&gt;
protected:&lt;br /&gt;
	float _size;&lt;br /&gt;
	Vec3f _origin;&lt;br /&gt;
	int _numVertices;&lt;br /&gt;
	int _numTriangles;&lt;br /&gt;
	int _numTriangleIndices;&lt;br /&gt;
	float* _positions;&lt;br /&gt;
	float* _normals;&lt;br /&gt;
	float* _texCoords;&lt;br /&gt;
	int* _tIndices;&lt;br /&gt;
	std::string _name;&lt;br /&gt;
	NodeHandle _model;&lt;br /&gt;
	NodeHandle _parent;&lt;br /&gt;
	ResHandle _material;&lt;br /&gt;
	virtual void generatePositions() = 0;&lt;br /&gt;
	virtual void generateNormals() = 0;&lt;br /&gt;
	virtual void generateTexCoords() = 0;&lt;br /&gt;
	virtual void generateTriangleIndices() = 0;&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
	CustomGeometry();&lt;br /&gt;
	virtual void generate() = 0;&lt;br /&gt;
	const int getNumVertices() { return _numVertices; }&lt;br /&gt;
	const float* getPositions() { return _positions; }&lt;br /&gt;
	const float* getNormals() { return _normals; }&lt;br /&gt;
	const float* getTexCoords() { return _texCoords; }&lt;br /&gt;
	const int* getTriangleIndices() { return _tIndices; }&lt;br /&gt;
	const int getNumTriangles() { return _numTriangles; }&lt;br /&gt;
	const int getNumTriangleIndices() { return _numTriangleIndices; }&lt;br /&gt;
	void release();&lt;br /&gt;
	const Vec3f getInterpolatedNormal(Vec3f n1_, Vec3f n2_);&lt;br /&gt;
	// pass -1 as the parameter to leave the parent node unchanged&lt;br /&gt;
	void addCustomModelNode(NodeHandle parent_);&lt;br /&gt;
	bool removeCustomModelNode();&lt;br /&gt;
	void setMaterial(ResHandle material_) { _material = material_; }&lt;br /&gt;
	void setParent(NodeHandle parent_) { _parent = parent_; }&lt;br /&gt;
	NodeHandle getModel() { return _model; }&lt;br /&gt;
	ResHandle getMaterial() { return _material; }&lt;br /&gt;
	void update();&lt;br /&gt;
	Vec3f getOrigin() { return _origin; }&lt;br /&gt;
	void setOrigin(Vec3f origin_) { _origin = origin_; }&lt;br /&gt;
	const float getSize() { return _size; }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= CustomGeometry.cpp| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;CustomGeometry.h&amp;quot;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;sstream&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#include &amp;quot;GeometryStreamGenerator.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Horde3DUtils.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
CustomGeometry::CustomGeometry() : _name(&amp;quot;default&amp;quot;), _size(1)&lt;br /&gt;
{&lt;br /&gt;
	_origin = Vec3f(0, 0, 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CustomGeometry::release()&lt;br /&gt;
{&lt;br /&gt;
	delete[] _positions;&lt;br /&gt;
	_positions = 0;&lt;br /&gt;
	delete[] _normals;&lt;br /&gt;
	_normals = 0;&lt;br /&gt;
	delete[] _texCoords;&lt;br /&gt;
	_texCoords = 0;&lt;br /&gt;
	delete[] _tIndices;&lt;br /&gt;
	_tIndices = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const Vec3f CustomGeometry::getInterpolatedNormal(Vec3f n1_, Vec3f n2_) &lt;br /&gt;
{&lt;br /&gt;
	Vec3f newNormal = n1_ + n2_;&lt;br /&gt;
	float length = newNormal.length();&lt;br /&gt;
	return newNormal/length;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CustomGeometry::addCustomModelNode(NodeHandle parent_)&lt;br /&gt;
{&lt;br /&gt;
	//std::stringstream* sa = new std::stringstream();&lt;br /&gt;
	std::stringstream ss;&lt;br /&gt;
	if (parent_ != -1) &lt;br /&gt;
		_parent = parent_;&lt;br /&gt;
	ss&amp;lt;&amp;lt; &amp;quot;customGeometry-&amp;quot;;&lt;br /&gt;
	ss&amp;lt;&amp;lt;_name;&lt;br /&gt;
	GeometryStreamGenerator* gsg = new GeometryStreamGenerator(this);&lt;br /&gt;
	ResHandle customGeoRes = Horde3D::addResource(ResourceTypes::Geometry, ss.str().c_str(), 0);&lt;br /&gt;
	Horde3D::loadResource(customGeoRes, gsg-&amp;gt;getStream(), gsg-&amp;gt;getStreamSize());&lt;br /&gt;
	// model_node_name&lt;br /&gt;
	ss&amp;lt;&amp;lt;&amp;quot;-Node&amp;quot;;&lt;br /&gt;
	_model = Horde3D::addModelNode(_parent, ss.str().c_str(), customGeoRes);&lt;br /&gt;
	// mesh_name&lt;br /&gt;
	ss&amp;lt;&amp;lt;&amp;quot;-Mesh&amp;quot;;&lt;br /&gt;
	Horde3D::addMeshNode(_model, ss.str().c_str(), _material, 0, gsg-&amp;gt;getNumTriangleIndices(), 0, gsg-&amp;gt;getNumVertices()-1);&lt;br /&gt;
	Horde3DUtils::dumpMessages();&lt;br /&gt;
	ss.str(&amp;quot;&amp;quot;);&lt;br /&gt;
	ss.clear();&lt;br /&gt;
	ss.flush();&lt;br /&gt;
	gsg-&amp;gt;release();&lt;br /&gt;
	delete gsg;&lt;br /&gt;
	gsg = 0;&lt;br /&gt;
	//Horde3D::setNodeTransform(_model, _origin.x, _origin.y, _origin.z, 0, 0, 0, 1, 1, 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool CustomGeometry::removeCustomModelNode()&lt;br /&gt;
{&lt;br /&gt;
	std::stringstream* ss = new std::stringstream();&lt;br /&gt;
	*ss&amp;lt;&amp;lt; &amp;quot;customGeometry-&amp;quot;;&lt;br /&gt;
	*ss&amp;lt;&amp;lt;_name;&lt;br /&gt;
	ResHandle rh = Horde3D::findResource(ResourceTypes::Geometry, ss-&amp;gt;str().c_str());&lt;br /&gt;
	if (Horde3D::isResourceLoaded(rh)) {&lt;br /&gt;
		Horde3D::removeResource(rh);&lt;br /&gt;
		Horde3D::unloadResource(rh);&lt;br /&gt;
		Horde3D::removeNode(_model);&lt;br /&gt;
		Horde3D::releaseUnusedResources();&lt;br /&gt;
		Horde3DUtils::dumpMessages();&lt;br /&gt;
		delete ss;&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
	else &lt;br /&gt;
		return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CustomGeometry::update()&lt;br /&gt;
{&lt;br /&gt;
	removeCustomModelNode();&lt;br /&gt;
	addCustomModelNode(-1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Simple Square=&lt;br /&gt;
&lt;br /&gt;
A simple hard-coded square. This is pretty straight forward and demonstrates how to derive from the CustomGeometry class and how the triangle indices work.&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= DynamicSquare.h| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Class representing a square &lt;br /&gt;
 **/&lt;br /&gt;
#pragma once&lt;br /&gt;
#include &amp;quot;CustomGeometry.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class DynamicSquare : public CustomGeometry&lt;br /&gt;
{&lt;br /&gt;
protected:&lt;br /&gt;
	virtual void generatePositions();&lt;br /&gt;
	virtual void generateNormals();&lt;br /&gt;
	virtual void generateTexCoords();&lt;br /&gt;
	virtual void generateTriangleIndices();&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
	DynamicSquare();&lt;br /&gt;
	virtual void generate();&lt;br /&gt;
	DynamicSquare(const float size_, const std::string name_);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= DynamicSquare.cpp| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;DynamicSquare.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DynamicSquare::DynamicSquare() : CustomGeometry()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DynamicSquare::DynamicSquare(const float size_, const std::string name_) &lt;br /&gt;
{&lt;br /&gt;
	_size = size_;&lt;br /&gt;
	_name = name_;&lt;br /&gt;
	_numVertices = 4;&lt;br /&gt;
	_numTriangles = 2;&lt;br /&gt;
	_numTriangleIndices = _numTriangles * 3;&lt;br /&gt;
	//generate();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicSquare::generate() &lt;br /&gt;
{&lt;br /&gt;
	generatePositions();&lt;br /&gt;
	generateNormals();&lt;br /&gt;
	generateTexCoords();&lt;br /&gt;
	generateTriangleIndices();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicSquare::generatePositions() &lt;br /&gt;
{&lt;br /&gt;
	_positions = new float[_numVertices * 3 * 2];&lt;br /&gt;
	// front left point (x/y/z)&lt;br /&gt;
	_positions[0] = _origin.x * _size - _size/2;&lt;br /&gt;
	_positions[1] = _origin.y;&lt;br /&gt;
	_positions[2] = _origin.z * _size -_size/2;&lt;br /&gt;
	// front right point (x/y/z)&lt;br /&gt;
	_positions[3] = _origin.x * _size + _size/2;&lt;br /&gt;
	_positions[4] = _origin.y;&lt;br /&gt;
	_positions[5] = _origin.z * _size - _size/2;&lt;br /&gt;
	// back left point (x/y/z)&lt;br /&gt;
	_positions[6] = _origin.x * _size - _size/2;&lt;br /&gt;
	_positions[7] = _origin.y;&lt;br /&gt;
	_positions[8] = _origin.z * _size + _size/2;&lt;br /&gt;
	// back right point (x/y/z)&lt;br /&gt;
	_positions[9] = _origin.x * _size + _size/2;&lt;br /&gt;
	_positions[10] = _origin.y;&lt;br /&gt;
	_positions[11] = _origin.z * _size + _size/2;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicSquare::generateNormals() &lt;br /&gt;
{&lt;br /&gt;
	_normals = new float[_numVertices * 3];&lt;br /&gt;
	for (int i=0; i&amp;lt; 12; i+=3) {&lt;br /&gt;
		_normals[i] = 0;&lt;br /&gt;
		_normals[i+1] = 1;&lt;br /&gt;
		_normals[i+2] = 0;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicSquare::generateTexCoords()&lt;br /&gt;
{&lt;br /&gt;
	_texCoords = new float[_numVertices * 2];&lt;br /&gt;
	_texCoords[0] = 0.0f; &lt;br /&gt;
	_texCoords[1] = 0.0f;&lt;br /&gt;
	_texCoords[2] = 1.0f; &lt;br /&gt;
	_texCoords[3] = 0.0f;&lt;br /&gt;
	_texCoords[4] = 0.0f; &lt;br /&gt;
	_texCoords[5] = 1.0f;&lt;br /&gt;
	_texCoords[6] = 1.0f; &lt;br /&gt;
	_texCoords[7] = 1.0f;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicSquare::generateTriangleIndices() &lt;br /&gt;
{&lt;br /&gt;
	_tIndices = new int[_numTriangleIndices ];&lt;br /&gt;
	_tIndices[0] = 0;&lt;br /&gt;
	_tIndices[1] = 2;&lt;br /&gt;
	_tIndices[2] = 1;&lt;br /&gt;
	_tIndices[3] = 1;&lt;br /&gt;
	_tIndices[4] = 2;&lt;br /&gt;
	_tIndices[5] = 3;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Simple Grid=&lt;br /&gt;
&lt;br /&gt;
All the work above was made to create my own interactive terrain generator(screenshot on top of this page) for a A* pathfinding demonstrator. The Grid-class actually generates a 2-dimensional array of Vec3f(s) and allows to extrude each point and re-generate the mesh in realtime. The internal representation is writeable and in case of a change of any point the overridden update() function will be called to update the Horde3D geometry resource.&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= DynamicGrid.h| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Class representing a grid&lt;br /&gt;
 **/&lt;br /&gt;
#pragma once&lt;br /&gt;
#include &amp;quot;CustomGeometry.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class DynamicGrid : public CustomGeometry&lt;br /&gt;
{&lt;br /&gt;
protected:&lt;br /&gt;
	virtual void generatePositions();&lt;br /&gt;
	virtual void generateNormals();&lt;br /&gt;
	virtual void generateTexCoords();&lt;br /&gt;
	virtual void generateTriangleIndices();&lt;br /&gt;
       // generate the internal representation of the grid (writeable to allow updates of single points!)&lt;br /&gt;
	void generateGrid();&lt;br /&gt;
	int _gridSize;&lt;br /&gt;
	Vec3f** _grid;&lt;br /&gt;
	std::string _fileName;&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
	DynamicGrid();&lt;br /&gt;
	virtual void generate();&lt;br /&gt;
	DynamicGrid(const float size_, const std::string name_, std::string fileName_);&lt;br /&gt;
	Vec3f getPointAt(int x_, int y_) { return _grid[y_][x_]; }&lt;br /&gt;
	// update a point of our grid (args: index x, index y, new position)&lt;br /&gt;
	void setPointAt(int x_, int y_, Vec3f newPos_) { _grid[y_][x_] = newPos_; }&lt;br /&gt;
	int getGridSize() { return _gridSize; }&lt;br /&gt;
	// overwrite update() from parent class&lt;br /&gt;
	void update();&lt;br /&gt;
	// read and write grids from/to files&lt;br /&gt;
	void saveGridToFile(std::string fileName_);&lt;br /&gt;
	bool readGridFromFile(std::string fileName_);&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= DynamicGrid.cpp| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;DynamicGrid.h&amp;quot;&lt;br /&gt;
#include &amp;quot;rng.h&amp;quot;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;sstream&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#include &amp;quot;util.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define GRIDSIZE 50&lt;br /&gt;
&lt;br /&gt;
DynamicGrid::DynamicGrid() : CustomGeometry()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DynamicGrid::DynamicGrid(const float size_, const std::string name_, std::string fileName_) : _fileName(fileName_) &lt;br /&gt;
{&lt;br /&gt;
	_name = name_;&lt;br /&gt;
	_positions = 0;&lt;br /&gt;
	_normals = 0;&lt;br /&gt;
	_texCoords = 0;&lt;br /&gt;
	_tIndices = 0;&lt;br /&gt;
	readGridFromFile(_fileName);&lt;br /&gt;
	_numVertices = (_gridSize*_gridSize);&lt;br /&gt;
	_numTriangles = ((_gridSize - 1) * (_gridSize - 1)) * 2;&lt;br /&gt;
	_numTriangleIndices = _numTriangles * 3;&lt;br /&gt;
	_origin = Vec3f(-_size/2*_gridSize, 0, _size/2*_gridSize);&lt;br /&gt;
	/*&lt;br /&gt;
	std::cout&amp;lt;&amp;lt;&amp;quot;numVerts: &amp;quot;&amp;lt;&amp;lt;_numVertices&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	std::cout&amp;lt;&amp;lt;&amp;quot;numTris: &amp;quot;&amp;lt;&amp;lt;_numTriangles&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	std::cout&amp;lt;&amp;lt;&amp;quot;numTInds: &amp;quot;&amp;lt;&amp;lt;_numTriangleIndices&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	std::cout&amp;lt;&amp;lt;&amp;quot;size: &amp;quot;&amp;lt;&amp;lt;_size&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	*/&lt;br /&gt;
	//std::cout&amp;lt;&amp;lt;_origin.x&amp;lt;&amp;lt;&amp;quot;/&amp;quot;&amp;lt;&amp;lt;_origin.y&amp;lt;&amp;lt;&amp;quot;/&amp;quot;&amp;lt;&amp;lt;_origin.z&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	//generate();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicGrid::generate() &lt;br /&gt;
{&lt;br /&gt;
	if (!_grid)&lt;br /&gt;
		generateGrid();&lt;br /&gt;
	generatePositions();&lt;br /&gt;
	generateNormals();&lt;br /&gt;
	generateTexCoords();&lt;br /&gt;
	generateTriangleIndices();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the following two functions could be combined into one single loop, but I left it this way for clarity...&lt;br /&gt;
/**&lt;br /&gt;
 * This function simply generates a 2-dimensional array of Vec3f(s) with slightly random height values&lt;br /&gt;
 **/&lt;br /&gt;
void DynamicGrid::generateGrid()&lt;br /&gt;
{&lt;br /&gt;
	RNG rng;&lt;br /&gt;
	_grid = new Vec3f*[_gridSize];&lt;br /&gt;
	for (int y=0; y&amp;lt;_gridSize; ++y) {&lt;br /&gt;
		_grid[y] = new Vec3f[_gridSize];&lt;br /&gt;
		for (int x=0; x&amp;lt;_gridSize; ++x) {&lt;br /&gt;
			long rand = (abs((int)rng.rand_int31()) %3);&lt;br /&gt;
			_grid[y][x] = Vec3f(_origin.x/2+_size/2*x, rand, _origin.z/2-_size/2*y);&lt;br /&gt;
			//std::cout&amp;lt;&amp;lt;_grid[y][x].x&amp;lt;&amp;lt;&amp;quot;/&amp;quot;&amp;lt;&amp;lt;_grid[y][x].y&amp;lt;&amp;lt;&amp;quot;/&amp;quot;&amp;lt;&amp;lt;_grid[y][x].z&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Convert the grid's positions into a Horde3D vertex array.&lt;br /&gt;
 **/&lt;br /&gt;
void DynamicGrid::generatePositions() &lt;br /&gt;
{&lt;br /&gt;
	_positions = new float[_numVertices*3];&lt;br /&gt;
	int counter = 0;&lt;br /&gt;
	for (int i=0; i&amp;lt;_numVertices*3; i+=3) {&lt;br /&gt;
		int y = counter / _gridSize;&lt;br /&gt;
		int x = counter % _gridSize;&lt;br /&gt;
		_positions[i] = _grid[y][x].x;&lt;br /&gt;
		_positions[i+1] = _grid[y][x].y;&lt;br /&gt;
		_positions[i+2] = _grid[y][x].z;&lt;br /&gt;
		++counter;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicGrid::generateNormals() &lt;br /&gt;
{&lt;br /&gt;
	_normals = new float[_numVertices * 3];&lt;br /&gt;
	for (int i=0; i&amp;lt; _numVertices*3; i+=3) {&lt;br /&gt;
		int pos = i/3;&lt;br /&gt;
		int xPos = pos % _gridSize;&lt;br /&gt;
		int yPos = pos / _gridSize;&lt;br /&gt;
		Vec3f xPred;&lt;br /&gt;
		Vec3f xSucc;&lt;br /&gt;
		Vec3f yPred;&lt;br /&gt;
		Vec3f ySucc;&lt;br /&gt;
		Vec3f normal;&lt;br /&gt;
		if (xPos &amp;gt; 0 &amp;amp;&amp;amp; yPos &amp;gt; 0) {&lt;br /&gt;
			// if the current vertex is inside the grid we will calculate&lt;br /&gt;
			// two normals from the previous&amp;amp;next point and our current vertex&lt;br /&gt;
			if (xPos &amp;lt; _gridSize-1 &amp;amp;&amp;amp; yPos &amp;lt; _gridSize-1) {&lt;br /&gt;
				xSucc = _grid[yPos][xPos+1];&lt;br /&gt;
				xPred = _grid[yPos][xPos-1];&lt;br /&gt;
				ySucc = _grid[yPos+1][xPos];&lt;br /&gt;
				yPred = _grid[yPos-1][xPos];&lt;br /&gt;
				Vec3f v1 = xSucc - _grid[yPos][xPos];&lt;br /&gt;
				if (v1.y &amp;lt; 0)&lt;br /&gt;
					v1.y *= -1;&lt;br /&gt;
				Vec3f v2 = xPred - _grid[yPos][xPos];&lt;br /&gt;
				if (v2.y &amp;lt; 0)&lt;br /&gt;
					v2.y *= -1;&lt;br /&gt;
				v1 += v2;&lt;br /&gt;
				Vec3f v3 = ySucc - _grid[yPos][xPos];&lt;br /&gt;
				if (v3.y &amp;lt; 0)&lt;br /&gt;
					v3.y *= -1;&lt;br /&gt;
				Vec3f v4 = yPred - _grid[yPos][xPos];&lt;br /&gt;
				if (v4.y &amp;lt; 0)&lt;br /&gt;
					v4.y *= -1;&lt;br /&gt;
				v3 += v4;&lt;br /&gt;
				normal = getInterpolatedNormal(v1, v3);&lt;br /&gt;
			}&lt;br /&gt;
			// if the vertex is on the grid's border the normal will simply be 0/1/0&lt;br /&gt;
			else {&lt;br /&gt;
				normal = Vec3f(0,1,0);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			normal = Vec3f(0,1,0);&lt;br /&gt;
		}&lt;br /&gt;
		_normals[i] = normal.x;&lt;br /&gt;
		_normals[i+1] = normal.y;&lt;br /&gt;
		_normals[i+2] = normal.z;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicGrid::generateTexCoords()&lt;br /&gt;
{&lt;br /&gt;
	_texCoords = new float[_numVertices * 2];&lt;br /&gt;
	int counter = 0;&lt;br /&gt;
	int line = 0;&lt;br /&gt;
	for (int i=0; i&amp;lt;_numVertices*2; i+=2) {&lt;br /&gt;
		if ( line % 2 == 0) {&lt;br /&gt;
			if (counter %2 == 0) {&lt;br /&gt;
				_texCoords[i] = 0.0f;&lt;br /&gt;
				_texCoords[i+1] = 0.0f;&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				_texCoords[i] = 0.0f;&lt;br /&gt;
				_texCoords[i+1] = 1.0f;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			if (counter % 2 == 0) {&lt;br /&gt;
				_texCoords[i] = 1.0f;&lt;br /&gt;
				_texCoords[i+1] = 0.0f;&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				_texCoords[i] = 1.0f;&lt;br /&gt;
				_texCoords[i+1] = 1.0f;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		++counter;&lt;br /&gt;
		if (counter &amp;gt;= _gridSize) {&lt;br /&gt;
			++line;&lt;br /&gt;
			counter = 0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicGrid::generateTriangleIndices() &lt;br /&gt;
{&lt;br /&gt;
	_tIndices = new int[ _numTriangleIndices ];&lt;br /&gt;
	int counter = 0;&lt;br /&gt;
	int lineBreakCounter = 0;&lt;br /&gt;
	int counter3 = 0;&lt;br /&gt;
	for (int i=0; i&amp;lt;_numTriangleIndices; i+=3) {&lt;br /&gt;
		if (i%2 ==0) {&lt;br /&gt;
			_tIndices[i] = counter;&lt;br /&gt;
			_tIndices[i+1] = counter+1;&lt;br /&gt;
			_tIndices[i+2] = counter+_gridSize;&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			_tIndices[i] = counter + _gridSize;&lt;br /&gt;
			_tIndices[i+1] = counter + 1;&lt;br /&gt;
			_tIndices[i+2] = counter+_gridSize+1;&lt;br /&gt;
			++counter;&lt;br /&gt;
		}&lt;br /&gt;
		++lineBreakCounter;&lt;br /&gt;
		if (lineBreakCounter == _gridSize*2 - 2) {&lt;br /&gt;
			--counter;&lt;br /&gt;
			++counter3;&lt;br /&gt;
			lineBreakCounter = 0;&lt;br /&gt;
			counter = counter3*_gridSize;&lt;br /&gt;
		}&lt;br /&gt;
		//std::cout&amp;lt;&amp;lt;_tIndices[i]&amp;lt;&amp;lt;&amp;quot;/&amp;quot;&amp;lt;&amp;lt;_tIndices[i+1]&amp;lt;&amp;lt;&amp;quot;/&amp;quot;&amp;lt;&amp;lt;_tIndices[i+2]&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicGrid::update()&lt;br /&gt;
{&lt;br /&gt;
	removeCustomModelNode();&lt;br /&gt;
	delete[] _positions;&lt;br /&gt;
	_positions = 0;&lt;br /&gt;
	delete[] _normals;&lt;br /&gt;
	_normals = 0;&lt;br /&gt;
	generatePositions();&lt;br /&gt;
	generateNormals();&lt;br /&gt;
	addCustomModelNode(-1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicGrid::saveGridToFile(std::string fileName_)&lt;br /&gt;
{&lt;br /&gt;
	//std::stringstream fName;&lt;br /&gt;
	//fName&amp;lt;&amp;lt;fileName_;&lt;br /&gt;
	//fName&amp;lt;&amp;lt;&amp;quot;.d2g&amp;quot;;&lt;br /&gt;
	std::stringstream ss;&lt;br /&gt;
	// magic header&lt;br /&gt;
	ss&amp;lt;&amp;lt;&amp;quot;D2SG\n&amp;quot;;&lt;br /&gt;
	// the gridsize (important to know!)&lt;br /&gt;
	ss&amp;lt;&amp;lt;_gridSize;&lt;br /&gt;
	ss&amp;lt;&amp;lt;&amp;quot;\n&amp;quot;;&lt;br /&gt;
	// the quadsize (important to know!)&lt;br /&gt;
	ss&amp;lt;&amp;lt;_size;&lt;br /&gt;
	ss&amp;lt;&amp;lt;&amp;quot;\n&amp;quot;;&lt;br /&gt;
	// number of coordinates (most important to know!)&lt;br /&gt;
	ss&amp;lt;&amp;lt;(_gridSize*_gridSize*3);&lt;br /&gt;
	ss&amp;lt;&amp;lt;&amp;quot;\n&amp;quot;;&lt;br /&gt;
	// coordinates&lt;br /&gt;
	for (int y=0; y&amp;lt;_gridSize; ++y) {&lt;br /&gt;
		for (int x=0; x&amp;lt;_gridSize; ++x) {&lt;br /&gt;
			ss&amp;lt;&amp;lt;_grid[y][x].x;&lt;br /&gt;
			ss&amp;lt;&amp;lt;&amp;quot;\n&amp;quot;;&lt;br /&gt;
			ss&amp;lt;&amp;lt;_grid[y][x].y;&lt;br /&gt;
			ss&amp;lt;&amp;lt;&amp;quot;\n&amp;quot;;&lt;br /&gt;
			ss&amp;lt;&amp;lt;_grid[y][x].z;&lt;br /&gt;
			ss&amp;lt;&amp;lt;&amp;quot;\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	ss&amp;lt;&amp;lt;&amp;quot;\n&amp;quot;;&lt;br /&gt;
	std::ofstream dest(fileName_.c_str());&lt;br /&gt;
	if (dest.is_open()) {&lt;br /&gt;
		dest&amp;lt;&amp;lt;ss.str();&lt;br /&gt;
		dest.close();&lt;br /&gt;
	}&lt;br /&gt;
	std::cout&amp;lt;&amp;lt;&amp;quot;Grid successfully saved to file: &amp;quot;&amp;lt;&amp;lt;fileName_&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool DynamicGrid::readGridFromFile(std::string fileName_)&lt;br /&gt;
{&lt;br /&gt;
	int numCoordinates;&lt;br /&gt;
	std::ifstream inFile;&lt;br /&gt;
	inFile.open(fileName_.c_str());&lt;br /&gt;
	bool error = false;&lt;br /&gt;
	if (!inFile) {&lt;br /&gt;
		std::cout&amp;lt;&amp;lt;&amp;quot;Gridfile &amp;quot;&amp;lt;&amp;lt;fileName_&amp;lt;&amp;lt;&amp;quot; could not be found! Creating new grid.&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
		error = true;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		std::string line;&lt;br /&gt;
		if (std::getline(inFile, line)) {&lt;br /&gt;
			std::cout&amp;lt;&amp;lt;&amp;quot;Line: &amp;quot;&amp;lt;&amp;lt;line&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
			//if (!(line == &amp;quot;D2SG&amp;quot;)) {&lt;br /&gt;
			if (line.compare(&amp;quot;D2SG&amp;quot;) != 0){&lt;br /&gt;
				std::cout&amp;lt;&amp;lt;&amp;quot;wrong grid-file format &amp;quot;&amp;lt;&amp;lt;line.compare(&amp;quot;D2SG&amp;quot;)&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
				error = true;&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				std::cout&amp;lt;&amp;lt;&amp;quot;Valid grid-file found!&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (std::getline(inFile, line)) {&lt;br /&gt;
			_gridSize = stringToInt(line);&lt;br /&gt;
			//std::cout&amp;lt;&amp;lt;&amp;quot;gridsize: &amp;quot;&amp;lt;&amp;lt;_gridSize&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			error = true;&lt;br /&gt;
		}&lt;br /&gt;
		if (std::getline(inFile, line)) {&lt;br /&gt;
			_size = stringToInt(line);&lt;br /&gt;
			//std::cout&amp;lt;&amp;lt;&amp;quot;quadsize: &amp;quot;&amp;lt;&amp;lt;_size&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			error = true;&lt;br /&gt;
		}&lt;br /&gt;
		if (std::getline(inFile, line)) {&lt;br /&gt;
			numCoordinates = stringToInt(line);&lt;br /&gt;
			//std::cout&amp;lt;&amp;lt;&amp;quot;numCoords: &amp;quot;&amp;lt;&amp;lt;numCoordinates&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			error = true;&lt;br /&gt;
		}&lt;br /&gt;
		if (!error) {&lt;br /&gt;
			_grid = new Vec3f*[_gridSize];&lt;br /&gt;
			for(int y=0; y&amp;lt;_gridSize; ++y) {&lt;br /&gt;
				_grid[y] = new Vec3f[_gridSize];&lt;br /&gt;
				for (int x=0; x&amp;lt;_gridSize; ++x) {&lt;br /&gt;
					Vec3f v;&lt;br /&gt;
					if (std::getline(inFile, line)) {&lt;br /&gt;
						v.x = stringToFloat(line);&lt;br /&gt;
					}&lt;br /&gt;
					if (std::getline(inFile, line)) {&lt;br /&gt;
						v.y = stringToFloat(line);&lt;br /&gt;
					}&lt;br /&gt;
					if (std::getline(inFile, line)) {&lt;br /&gt;
						v.z = stringToFloat(line);&lt;br /&gt;
					}&lt;br /&gt;
					_grid[y][x] = v;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	inFile.close();&lt;br /&gt;
	if (error) {&lt;br /&gt;
		_gridSize = GRIDSIZE;&lt;br /&gt;
		_size = 12;&lt;br /&gt;
		_grid = 0;&lt;br /&gt;
	}&lt;br /&gt;
	_numVertices = (_gridSize*_gridSize);&lt;br /&gt;
	_numTriangles = ((_gridSize - 1) * (_gridSize - 1)) * 2;&lt;br /&gt;
	_numTriangleIndices = _numTriangles * 3;&lt;br /&gt;
	_origin = Vec3f(-_size/2*_gridSize, 0, _size/2*_gridSize);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Usage example=&lt;br /&gt;
&lt;br /&gt;
Finally this is all you have to do to generate the grid and display it in your scene.&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= app.cpp| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	// initialize a new grid (args: quadsize, model-name, filename (if applicable)&lt;br /&gt;
	_grid = new DynamicGrid(12.0f, &amp;quot;grid&amp;quot;, &amp;quot;grid-filename&amp;quot;);&lt;br /&gt;
	// do not forget to load a material and apply it to the mesh&lt;br /&gt;
	_grid-&amp;gt;setMaterial(gridMatRes);&lt;br /&gt;
	// generate the grid&lt;br /&gt;
	_grid-&amp;gt;generate();&lt;br /&gt;
	// add the grid-model to the RootNode&lt;br /&gt;
	_grid-&amp;gt;addCustomModelNode(RootNode);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''TODO'''&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Newacct</name></author>	</entry>

	<entry>
		<id>http://horde3d.org/wiki/index.php?title=Procedurally_generated_geometry_tutorial&amp;diff=690</id>
		<title>Procedurally generated geometry tutorial</title>
		<link rel="alternate" type="text/html" href="http://horde3d.org/wiki/index.php?title=Procedurally_generated_geometry_tutorial&amp;diff=690"/>
				<updated>2011-03-17T10:51:42Z</updated>
		
		<summary type="html">&lt;p&gt;Newacct: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ __NOEDITSECTION__{{ContentBlock|color=white|content={{!!}}&lt;br /&gt;
'''Work in progress   - Due to the current changes in the Horde API this tutorial will be delayed '''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Important notes=&lt;br /&gt;
* The code used here has been tested with Horde3D 1.0.0 beta2 and beta3 and will '''NOT''' work with the latest release (beta4)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Overview=&lt;br /&gt;
==Basic approach==&lt;br /&gt;
To create and display a procedurally generated mesh that, instead of being loaded from a Horde3D Scene node and a geoemtry file(*.scene.xml, *.geo), will be created in-memory by some algorithm, you have to create a mesh first and then &amp;quot;fake&amp;quot; the .geo-file and the scene node itself and pass it to the engine.&lt;br /&gt;
&lt;br /&gt;
To do that you have to create your procedural geometry first. This is easy for simple shapes like single triangles, squares or triangle-strips, but will become way more difficult when we try to generate complex meshes, e.g. when we have a cloud of points in 3D space and have to describe which points make triangles, and which don't (calculating the triangle indices, texture coordinates and normals).&lt;br /&gt;
&lt;br /&gt;
When we have calculated the geometry itself we need to create a char-stream to make Horde believe the geometry has been read from a file and pass it to Horde as a geometry Resource.&lt;br /&gt;
The final step is to create a Horde3D Scene Node from our procedurally generated mesh and render it into our scene.&lt;br /&gt;
&lt;br /&gt;
=StreamGenerator=&lt;br /&gt;
&lt;br /&gt;
These classes are only for creating the character stream that will contain the geometry resource.&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= StreamGenerator.h| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#pragma once&lt;br /&gt;
#include &amp;lt;sstream&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class StreamGenerator &lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
	StreamGenerator();&lt;br /&gt;
	virtual ~StreamGenerator();&lt;br /&gt;
	virtual const char* getStream() = 0;&lt;br /&gt;
	virtual const int getStreamSize() = 0;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= StreamGenerator.cpp| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;StreamGenerator.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
StreamGenerator::StreamGenerator() &lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
StreamGenerator::~StreamGenerator()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= GeometryStreamGenerator.h| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#pragma once&lt;br /&gt;
#include &amp;quot;StreamGenerator.h&amp;quot;&lt;br /&gt;
#include &amp;quot;CustomGeometry.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class GeometryStreamGenerator : public StreamGenerator&lt;br /&gt;
{&lt;br /&gt;
private:&lt;br /&gt;
	std::stringstream* ss;&lt;br /&gt;
	void generate();&lt;br /&gt;
	int numVertices, numTriangleIndices;&lt;br /&gt;
	char* _stream;&lt;br /&gt;
	CustomGeometry* _geom;&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
	GeometryStreamGenerator(CustomGeometry* geom_);&lt;br /&gt;
	~GeometryStreamGenerator();&lt;br /&gt;
	const char* getStream();&lt;br /&gt;
	const std::stringstream* getStringStream() { return ss; };&lt;br /&gt;
	const int getStreamSize();&lt;br /&gt;
	const int getNumVertices();&lt;br /&gt;
	const int getNumTriangleIndices();&lt;br /&gt;
	void release();&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= GeometryStreamGenerator.cpp| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;GeometryStreamGenerator.h&amp;quot;&lt;br /&gt;
#include &amp;quot;time.h&amp;quot;&lt;br /&gt;
#include &amp;quot;utMath.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
GeometryStreamGenerator::GeometryStreamGenerator(CustomGeometry* geom_) : _geom(geom_)&lt;br /&gt;
{&lt;br /&gt;
	ss = new std::stringstream();&lt;br /&gt;
	generate();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
GeometryStreamGenerator::~GeometryStreamGenerator()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void GeometryStreamGenerator::generate()&lt;br /&gt;
{&lt;br /&gt;
	numVertices = _geom-&amp;gt;getNumVertices();&lt;br /&gt;
	numTriangleIndices = _geom-&amp;gt;getNumTriangleIndices();&lt;br /&gt;
	const std::string _magicHeader = &amp;quot;H3DG&amp;quot;;&lt;br /&gt;
	const int _version = 5;&lt;br /&gt;
	const int _numJoints = 1;&lt;br /&gt;
	const float _identityMatrix[] = {	1.0f, 0.0f, 0.0f, 0.0f,  &lt;br /&gt;
						0.0f, 1.0f, 0.0f, 0.0f,  &lt;br /&gt;
						0.0f, 0.0f, 1.0f, 0.0f,  &lt;br /&gt;
						0.0f, 0.0f, 0.0f, 1.0f};&lt;br /&gt;
	const int _numVertexStreams = 3;&lt;br /&gt;
	const int _magicVertices = 0;&lt;br /&gt;
	const int _vertexStreamElementSize = 12;&lt;br /&gt;
	const float* _positions = _geom-&amp;gt;getPositions();&lt;br /&gt;
	const int _magicNormals = 1;&lt;br /&gt;
	const int _normalsStreamElementSize = 6;&lt;br /&gt;
	const float* _normals = _geom-&amp;gt;getNormals();&lt;br /&gt;
	const int _magicTextureCoords1 = 6;&lt;br /&gt;
	const int _texCoordStreamElementSize = 8;&lt;br /&gt;
	const float* _texCoords = _geom-&amp;gt;getTexCoords();&lt;br /&gt;
	const int* _triangleIndices = _geom-&amp;gt;getTriangleIndices();&lt;br /&gt;
	const int _numMorphTragets = 0;&lt;br /&gt;
	// header&lt;br /&gt;
	ss-&amp;gt;write(_magicHeader.c_str(), 4*sizeof(char));&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_version, sizeof(int));&lt;br /&gt;
	// joints (mandatory)&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_numJoints, sizeof(int));&lt;br /&gt;
	for (int i=0; i&amp;lt;16; ++i) {&lt;br /&gt;
		ss-&amp;gt;write((char*)&amp;amp;_identityMatrix[i], sizeof(float));&lt;br /&gt;
	}&lt;br /&gt;
	// vertices&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_numVertexStreams, sizeof(int));&lt;br /&gt;
	const int numVerts = _geom-&amp;gt;getNumVertices();&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;numVerts, sizeof(int));&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_magicVertices, sizeof(int));&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_vertexStreamElementSize, sizeof(int));&lt;br /&gt;
	for (int i=0; i&amp;lt;_geom-&amp;gt;getNumVertices()*3; ++i) {&lt;br /&gt;
		ss-&amp;gt;write((char*)&amp;amp;_positions[i], sizeof(float));&lt;br /&gt;
	}&lt;br /&gt;
	// normals&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_magicNormals, sizeof(int));&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_normalsStreamElementSize, sizeof(int));&lt;br /&gt;
	for (int i=0; i&amp;lt;_geom-&amp;gt;getNumVertices()*3; ++i) {&lt;br /&gt;
		// do not forget to mutliply the value with 32767 and &lt;br /&gt;
		// then convert it to short before writing to the stream&lt;br /&gt;
		const short f = (short)(_normals[i]*32767);&lt;br /&gt;
		ss-&amp;gt;write((char*)&amp;amp;f, sizeof(short));&lt;br /&gt;
	}&lt;br /&gt;
	// texture coordinates&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_magicTextureCoords1, sizeof(int));&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_texCoordStreamElementSize, sizeof(int));&lt;br /&gt;
	for (int i=0; i&amp;lt;_geom-&amp;gt;getNumVertices()*2; ++i) {&lt;br /&gt;
		ss-&amp;gt;write((char*)&amp;amp;_texCoords[i], sizeof(float));&lt;br /&gt;
	}&lt;br /&gt;
	// triangle indices&lt;br /&gt;
	const int numTriangleIndices = _geom-&amp;gt;getNumTriangleIndices();&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;numTriangleIndices, sizeof(int));&lt;br /&gt;
	for (int i=0; i&amp;lt;_geom-&amp;gt;getNumTriangleIndices(); ++i) {&lt;br /&gt;
		ss-&amp;gt;write((char*)&amp;amp;_triangleIndices[i], sizeof(int));&lt;br /&gt;
	}&lt;br /&gt;
	ss-&amp;gt;write((char*)&amp;amp;_numMorphTragets, sizeof(int));&lt;br /&gt;
	_stream = new char[ss-&amp;gt;tellp()];&lt;br /&gt;
	ss-&amp;gt;read(_stream, ss-&amp;gt;tellp());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const char* GeometryStreamGenerator::getStream()&lt;br /&gt;
{&lt;br /&gt;
	return _stream;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const int GeometryStreamGenerator::getStreamSize() &lt;br /&gt;
{&lt;br /&gt;
	int t = (int)ss-&amp;gt;tellp();&lt;br /&gt;
	return t;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const int GeometryStreamGenerator::getNumVertices()&lt;br /&gt;
{&lt;br /&gt;
	return numVertices;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const int GeometryStreamGenerator::getNumTriangleIndices()&lt;br /&gt;
{&lt;br /&gt;
	return numTriangleIndices;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void GeometryStreamGenerator::release()&lt;br /&gt;
{&lt;br /&gt;
	ss-&amp;gt;flush();&lt;br /&gt;
	ss-&amp;gt;clear();&lt;br /&gt;
	delete ss;&lt;br /&gt;
	ss = 0;&lt;br /&gt;
	delete[] _stream;&lt;br /&gt;
	_stream = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=CustomGeometry base class=&lt;br /&gt;
&lt;br /&gt;
Base class for the custom geometry. This class currently contains lots of deprecated stuff, e.g. the update() function. This function was used to update an in-memory gemoetry resource in the &amp;quot;punk-rock&amp;quot;-way. Until Horde3D Beta3 the geometry resources were read-only, so directmanipulation of vertices was impossible. To modify the vertices I had to unload the geometry resource, re-create it with the new vertex-positions and load it into Horde again. '''This is not necessary any more because since Beta4 the geometry resources are not read-only anymore.'''&lt;br /&gt;
&lt;br /&gt;
All custom geometry classes should be derived from this class and implement the abstract functions as needed. (See the examples below)&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= CustomGeometry.h| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#pragma once&lt;br /&gt;
/**&lt;br /&gt;
 * Abstract class for custom/dynamic geometry&lt;br /&gt;
 **/&lt;br /&gt;
#include &amp;quot;utMath.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Horde3D.h&amp;quot;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class CustomGeometry &lt;br /&gt;
{&lt;br /&gt;
protected:&lt;br /&gt;
	float _size;&lt;br /&gt;
	Vec3f _origin;&lt;br /&gt;
	int _numVertices;&lt;br /&gt;
	int _numTriangles;&lt;br /&gt;
	int _numTriangleIndices;&lt;br /&gt;
	float* _positions;&lt;br /&gt;
	float* _normals;&lt;br /&gt;
	float* _texCoords;&lt;br /&gt;
	int* _tIndices;&lt;br /&gt;
	std::string _name;&lt;br /&gt;
	NodeHandle _model;&lt;br /&gt;
	NodeHandle _parent;&lt;br /&gt;
	ResHandle _material;&lt;br /&gt;
	virtual void generatePositions() = 0;&lt;br /&gt;
	virtual void generateNormals() = 0;&lt;br /&gt;
	virtual void generateTexCoords() = 0;&lt;br /&gt;
	virtual void generateTriangleIndices() = 0;&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
	CustomGeometry();&lt;br /&gt;
	virtual void generate() = 0;&lt;br /&gt;
	const int getNumVertices() { return _numVertices; }&lt;br /&gt;
	const float* getPositions() { return _positions; }&lt;br /&gt;
	const float* getNormals() { return _normals; }&lt;br /&gt;
	const float* getTexCoords() { return _texCoords; }&lt;br /&gt;
	const int* getTriangleIndices() { return _tIndices; }&lt;br /&gt;
	const int getNumTriangles() { return _numTriangles; }&lt;br /&gt;
	const int getNumTriangleIndices() { return _numTriangleIndices; }&lt;br /&gt;
	void release();&lt;br /&gt;
	const Vec3f getInterpolatedNormal(Vec3f n1_, Vec3f n2_);&lt;br /&gt;
	// pass -1 as the parameter to leave the parent node unchanged&lt;br /&gt;
	void addCustomModelNode(NodeHandle parent_);&lt;br /&gt;
	bool removeCustomModelNode();&lt;br /&gt;
	void setMaterial(ResHandle material_) { _material = material_; }&lt;br /&gt;
	void setParent(NodeHandle parent_) { _parent = parent_; }&lt;br /&gt;
	NodeHandle getModel() { return _model; }&lt;br /&gt;
	ResHandle getMaterial() { return _material; }&lt;br /&gt;
	void update();&lt;br /&gt;
	Vec3f getOrigin() { return _origin; }&lt;br /&gt;
	void setOrigin(Vec3f origin_) { _origin = origin_; }&lt;br /&gt;
	const float getSize() { return _size; }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= CustomGeometry.cpp| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;CustomGeometry.h&amp;quot;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;sstream&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#include &amp;quot;GeometryStreamGenerator.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Horde3DUtils.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
CustomGeometry::CustomGeometry() : _name(&amp;quot;default&amp;quot;), _size(1)&lt;br /&gt;
{&lt;br /&gt;
	_origin = Vec3f(0, 0, 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CustomGeometry::release()&lt;br /&gt;
{&lt;br /&gt;
	delete[] _positions;&lt;br /&gt;
	_positions = 0;&lt;br /&gt;
	delete[] _normals;&lt;br /&gt;
	_normals = 0;&lt;br /&gt;
	delete[] _texCoords;&lt;br /&gt;
	_texCoords = 0;&lt;br /&gt;
	delete[] _tIndices;&lt;br /&gt;
	_tIndices = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const Vec3f CustomGeometry::getInterpolatedNormal(Vec3f n1_, Vec3f n2_) &lt;br /&gt;
{&lt;br /&gt;
	Vec3f newNormal = n1_ + n2_;&lt;br /&gt;
	float length = newNormal.length();&lt;br /&gt;
	return newNormal/length;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CustomGeometry::addCustomModelNode(NodeHandle parent_)&lt;br /&gt;
{&lt;br /&gt;
	//std::stringstream* sa = new std::stringstream();&lt;br /&gt;
	std::stringstream ss;&lt;br /&gt;
	if (parent_ != -1) &lt;br /&gt;
		_parent = parent_;&lt;br /&gt;
	ss&amp;lt;&amp;lt; &amp;quot;customGeometry-&amp;quot;;&lt;br /&gt;
	ss&amp;lt;&amp;lt;_name;&lt;br /&gt;
	GeometryStreamGenerator* gsg = new GeometryStreamGenerator(this);&lt;br /&gt;
	ResHandle customGeoRes = Horde3D::addResource(ResourceTypes::Geometry, ss.str().c_str(), 0);&lt;br /&gt;
	Horde3D::loadResource(customGeoRes, gsg-&amp;gt;getStream(), gsg-&amp;gt;getStreamSize());&lt;br /&gt;
	// model_node_name&lt;br /&gt;
	ss&amp;lt;&amp;lt;&amp;quot;-Node&amp;quot;;&lt;br /&gt;
	_model = Horde3D::addModelNode(_parent, ss.str().c_str(), customGeoRes);&lt;br /&gt;
	// mesh_name&lt;br /&gt;
	ss&amp;lt;&amp;lt;&amp;quot;-Mesh&amp;quot;;&lt;br /&gt;
	Horde3D::addMeshNode(_model, ss.str().c_str(), _material, 0, gsg-&amp;gt;getNumTriangleIndices(), 0, gsg-&amp;gt;getNumVertices()-1);&lt;br /&gt;
	Horde3DUtils::dumpMessages();&lt;br /&gt;
	ss.str(&amp;quot;&amp;quot;);&lt;br /&gt;
	ss.clear();&lt;br /&gt;
	ss.flush();&lt;br /&gt;
	gsg-&amp;gt;release();&lt;br /&gt;
	delete gsg;&lt;br /&gt;
	gsg = 0;&lt;br /&gt;
	//Horde3D::setNodeTransform(_model, _origin.x, _origin.y, _origin.z, 0, 0, 0, 1, 1, 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool CustomGeometry::removeCustomModelNode()&lt;br /&gt;
{&lt;br /&gt;
	std::stringstream* ss = new std::stringstream();&lt;br /&gt;
	*ss&amp;lt;&amp;lt; &amp;quot;customGeometry-&amp;quot;;&lt;br /&gt;
	*ss&amp;lt;&amp;lt;_name;&lt;br /&gt;
	ResHandle rh = Horde3D::findResource(ResourceTypes::Geometry, ss-&amp;gt;str().c_str());&lt;br /&gt;
	if (Horde3D::isResourceLoaded(rh)) {&lt;br /&gt;
		Horde3D::removeResource(rh);&lt;br /&gt;
		Horde3D::unloadResource(rh);&lt;br /&gt;
		Horde3D::removeNode(_model);&lt;br /&gt;
		Horde3D::releaseUnusedResources();&lt;br /&gt;
		Horde3DUtils::dumpMessages();&lt;br /&gt;
		delete ss;&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
	else &lt;br /&gt;
		return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CustomGeometry::update()&lt;br /&gt;
{&lt;br /&gt;
	removeCustomModelNode();&lt;br /&gt;
	addCustomModelNode(-1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Simple Square=&lt;br /&gt;
&lt;br /&gt;
A simple hard-coded square. This is pretty straight forward and demonstrates how to derive from the CustomGeometry class and how the triangle indices work.&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= DynamicSquare.h| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Class representing a square &lt;br /&gt;
 **/&lt;br /&gt;
#pragma once&lt;br /&gt;
#include &amp;quot;CustomGeometry.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class DynamicSquare : public CustomGeometry&lt;br /&gt;
{&lt;br /&gt;
protected:&lt;br /&gt;
	virtual void generatePositions();&lt;br /&gt;
	virtual void generateNormals();&lt;br /&gt;
	virtual void generateTexCoords();&lt;br /&gt;
	virtual void generateTriangleIndices();&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
	DynamicSquare();&lt;br /&gt;
	virtual void generate();&lt;br /&gt;
	DynamicSquare(const float size_, const std::string name_);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= DynamicSquare.cpp| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;DynamicSquare.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DynamicSquare::DynamicSquare() : CustomGeometry()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DynamicSquare::DynamicSquare(const float size_, const std::string name_) &lt;br /&gt;
{&lt;br /&gt;
	_size = size_;&lt;br /&gt;
	_name = name_;&lt;br /&gt;
	_numVertices = 4;&lt;br /&gt;
	_numTriangles = 2;&lt;br /&gt;
	_numTriangleIndices = _numTriangles * 3;&lt;br /&gt;
	//generate();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicSquare::generate() &lt;br /&gt;
{&lt;br /&gt;
	generatePositions();&lt;br /&gt;
	generateNormals();&lt;br /&gt;
	generateTexCoords();&lt;br /&gt;
	generateTriangleIndices();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicSquare::generatePositions() &lt;br /&gt;
{&lt;br /&gt;
	_positions = new float[_numVertices * 3 * 2];&lt;br /&gt;
	// front left point (x/y/z)&lt;br /&gt;
	_positions[0] = _origin.x * _size - _size/2;&lt;br /&gt;
	_positions[1] = _origin.y;&lt;br /&gt;
	_positions[2] = _origin.z * _size -_size/2;&lt;br /&gt;
	// front right point (x/y/z)&lt;br /&gt;
	_positions[3] = _origin.x * _size + _size/2;&lt;br /&gt;
	_positions[4] = _origin.y;&lt;br /&gt;
	_positions[5] = _origin.z * _size - _size/2;&lt;br /&gt;
	// back left point (x/y/z)&lt;br /&gt;
	_positions[6] = _origin.x * _size - _size/2;&lt;br /&gt;
	_positions[7] = _origin.y;&lt;br /&gt;
	_positions[8] = _origin.z * _size + _size/2;&lt;br /&gt;
	// back right point (x/y/z)&lt;br /&gt;
	_positions[9] = _origin.x * _size + _size/2;&lt;br /&gt;
	_positions[10] = _origin.y;&lt;br /&gt;
	_positions[11] = _origin.z * _size + _size/2;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicSquare::generateNormals() &lt;br /&gt;
{&lt;br /&gt;
	_normals = new float[_numVertices * 3];&lt;br /&gt;
	for (int i=0; i&amp;lt; 12; i+=3) {&lt;br /&gt;
		_normals[i] = 0;&lt;br /&gt;
		_normals[i+1] = 1;&lt;br /&gt;
		_normals[i+2] = 0;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicSquare::generateTexCoords()&lt;br /&gt;
{&lt;br /&gt;
	_texCoords = new float[_numVertices * 2];&lt;br /&gt;
	_texCoords[0] = 0.0f; &lt;br /&gt;
	_texCoords[1] = 0.0f;&lt;br /&gt;
	_texCoords[2] = 1.0f; &lt;br /&gt;
	_texCoords[3] = 0.0f;&lt;br /&gt;
	_texCoords[4] = 0.0f; &lt;br /&gt;
	_texCoords[5] = 1.0f;&lt;br /&gt;
	_texCoords[6] = 1.0f; &lt;br /&gt;
	_texCoords[7] = 1.0f;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicSquare::generateTriangleIndices() &lt;br /&gt;
{&lt;br /&gt;
	_tIndices = new int[_numTriangleIndices ];&lt;br /&gt;
	_tIndices[0] = 0;&lt;br /&gt;
	_tIndices[1] = 2;&lt;br /&gt;
	_tIndices[2] = 1;&lt;br /&gt;
	_tIndices[3] = 1;&lt;br /&gt;
	_tIndices[4] = 2;&lt;br /&gt;
	_tIndices[5] = 3;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Simple Grid=&lt;br /&gt;
&lt;br /&gt;
All the work above was made to create my own interactive terrain generator(screenshot on top of this page) for a A* pathfinding demonstrator. The Grid-class actually generates a 2-dimensional array of Vec3f(s) and allows to extrude each point and re-generate the mesh in realtime. The internal representation is writeable and in case of a change of any point the overridden update() function will be called to update the Horde3D geometry resource.&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= DynamicGrid.h| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Class representing a grid&lt;br /&gt;
 **/&lt;br /&gt;
#pragma once&lt;br /&gt;
#include &amp;quot;CustomGeometry.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class DynamicGrid : public CustomGeometry&lt;br /&gt;
{&lt;br /&gt;
protected:&lt;br /&gt;
	virtual void generatePositions();&lt;br /&gt;
	virtual void generateNormals();&lt;br /&gt;
	virtual void generateTexCoords();&lt;br /&gt;
	virtual void generateTriangleIndices();&lt;br /&gt;
       // generate the internal representation of the grid (writeable to allow updates of single points!)&lt;br /&gt;
	void generateGrid();&lt;br /&gt;
	int _gridSize;&lt;br /&gt;
	Vec3f** _grid;&lt;br /&gt;
	std::string _fileName;&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
	DynamicGrid();&lt;br /&gt;
	virtual void generate();&lt;br /&gt;
	DynamicGrid(const float size_, const std::string name_, std::string fileName_);&lt;br /&gt;
	Vec3f getPointAt(int x_, int y_) { return _grid[y_][x_]; }&lt;br /&gt;
	// update a point of our grid (args: index x, index y, new position)&lt;br /&gt;
	void setPointAt(int x_, int y_, Vec3f newPos_) { _grid[y_][x_] = newPos_; }&lt;br /&gt;
	int getGridSize() { return _gridSize; }&lt;br /&gt;
	// overwrite update() from parent class&lt;br /&gt;
	void update();&lt;br /&gt;
	// read and write grids from/to files&lt;br /&gt;
	void saveGridToFile(std::string fileName_);&lt;br /&gt;
	bool readGridFromFile(std::string fileName_);&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= DynamicGrid.cpp| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;DynamicGrid.h&amp;quot;&lt;br /&gt;
#include &amp;quot;rng.h&amp;quot;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;sstream&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#include &amp;quot;util.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define GRIDSIZE 50&lt;br /&gt;
&lt;br /&gt;
DynamicGrid::DynamicGrid() : CustomGeometry()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DynamicGrid::DynamicGrid(const float size_, const std::string name_, std::string fileName_) : _fileName(fileName_) &lt;br /&gt;
{&lt;br /&gt;
	_name = name_;&lt;br /&gt;
	_positions = 0;&lt;br /&gt;
	_normals = 0;&lt;br /&gt;
	_texCoords = 0;&lt;br /&gt;
	_tIndices = 0;&lt;br /&gt;
	readGridFromFile(_fileName);&lt;br /&gt;
	_numVertices = (_gridSize*_gridSize);&lt;br /&gt;
	_numTriangles = ((_gridSize - 1) * (_gridSize - 1)) * 2;&lt;br /&gt;
	_numTriangleIndices = _numTriangles * 3;&lt;br /&gt;
	_origin = Vec3f(-_size/2*_gridSize, 0, _size/2*_gridSize);&lt;br /&gt;
	/*&lt;br /&gt;
	std::cout&amp;lt;&amp;lt;&amp;quot;numVerts: &amp;quot;&amp;lt;&amp;lt;_numVertices&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	std::cout&amp;lt;&amp;lt;&amp;quot;numTris: &amp;quot;&amp;lt;&amp;lt;_numTriangles&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	std::cout&amp;lt;&amp;lt;&amp;quot;numTInds: &amp;quot;&amp;lt;&amp;lt;_numTriangleIndices&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	std::cout&amp;lt;&amp;lt;&amp;quot;size: &amp;quot;&amp;lt;&amp;lt;_size&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	*/&lt;br /&gt;
	//std::cout&amp;lt;&amp;lt;_origin.x&amp;lt;&amp;lt;&amp;quot;/&amp;quot;&amp;lt;&amp;lt;_origin.y&amp;lt;&amp;lt;&amp;quot;/&amp;quot;&amp;lt;&amp;lt;_origin.z&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	//generate();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicGrid::generate() &lt;br /&gt;
{&lt;br /&gt;
	if (!_grid)&lt;br /&gt;
		generateGrid();&lt;br /&gt;
	generatePositions();&lt;br /&gt;
	generateNormals();&lt;br /&gt;
	generateTexCoords();&lt;br /&gt;
	generateTriangleIndices();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the following two functions could be combined into one single loop, but I left it this way for clarity...&lt;br /&gt;
/**&lt;br /&gt;
 * This function simply generates a 2-dimensional array of Vec3f(s) with slightly random height values&lt;br /&gt;
 **/&lt;br /&gt;
void DynamicGrid::generateGrid()&lt;br /&gt;
{&lt;br /&gt;
	RNG rng;&lt;br /&gt;
	_grid = new Vec3f*[_gridSize];&lt;br /&gt;
	for (int y=0; y&amp;lt;_gridSize; ++y) {&lt;br /&gt;
		_grid[y] = new Vec3f[_gridSize];&lt;br /&gt;
		for (int x=0; x&amp;lt;_gridSize; ++x) {&lt;br /&gt;
			long rand = (abs((int)rng.rand_int31()) %3);&lt;br /&gt;
			_grid[y][x] = Vec3f(_origin.x/2+_size/2*x, rand, _origin.z/2-_size/2*y);&lt;br /&gt;
			//std::cout&amp;lt;&amp;lt;_grid[y][x].x&amp;lt;&amp;lt;&amp;quot;/&amp;quot;&amp;lt;&amp;lt;_grid[y][x].y&amp;lt;&amp;lt;&amp;quot;/&amp;quot;&amp;lt;&amp;lt;_grid[y][x].z&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Convert the grid's positions into a Horde3D vertex array.&lt;br /&gt;
 **/&lt;br /&gt;
void DynamicGrid::generatePositions() &lt;br /&gt;
{&lt;br /&gt;
	_positions = new float[_numVertices*3];&lt;br /&gt;
	int counter = 0;&lt;br /&gt;
	for (int i=0; i&amp;lt;_numVertices*3; i+=3) {&lt;br /&gt;
		int y = counter / _gridSize;&lt;br /&gt;
		int x = counter % _gridSize;&lt;br /&gt;
		_positions[i] = _grid[y][x].x;&lt;br /&gt;
		_positions[i+1] = _grid[y][x].y;&lt;br /&gt;
		_positions[i+2] = _grid[y][x].z;&lt;br /&gt;
		++counter;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicGrid::generateNormals() &lt;br /&gt;
{&lt;br /&gt;
	_normals = new float[_numVertices * 3];&lt;br /&gt;
	for (int i=0; i&amp;lt; _numVertices*3; i+=3) {&lt;br /&gt;
		int pos = i/3;&lt;br /&gt;
		int xPos = pos % _gridSize;&lt;br /&gt;
		int yPos = pos / _gridSize;&lt;br /&gt;
		Vec3f xPred;&lt;br /&gt;
		Vec3f xSucc;&lt;br /&gt;
		Vec3f yPred;&lt;br /&gt;
		Vec3f ySucc;&lt;br /&gt;
		Vec3f normal;&lt;br /&gt;
		if (xPos &amp;gt; 0 &amp;amp;&amp;amp; yPos &amp;gt; 0) {&lt;br /&gt;
			// if the current vertex is inside the grid we will calculate&lt;br /&gt;
			// two normals from the previous&amp;amp;next point and our current vertex&lt;br /&gt;
			if (xPos &amp;lt; _gridSize-1 &amp;amp;&amp;amp; yPos &amp;lt; _gridSize-1) {&lt;br /&gt;
				xSucc = _grid[yPos][xPos+1];&lt;br /&gt;
				xPred = _grid[yPos][xPos-1];&lt;br /&gt;
				ySucc = _grid[yPos+1][xPos];&lt;br /&gt;
				yPred = _grid[yPos-1][xPos];&lt;br /&gt;
				Vec3f v1 = xSucc - _grid[yPos][xPos];&lt;br /&gt;
				if (v1.y &amp;lt; 0)&lt;br /&gt;
					v1.y *= -1;&lt;br /&gt;
				Vec3f v2 = xPred - _grid[yPos][xPos];&lt;br /&gt;
				if (v2.y &amp;lt; 0)&lt;br /&gt;
					v2.y *= -1;&lt;br /&gt;
				v1 += v2;&lt;br /&gt;
				Vec3f v3 = ySucc - _grid[yPos][xPos];&lt;br /&gt;
				if (v3.y &amp;lt; 0)&lt;br /&gt;
					v3.y *= -1;&lt;br /&gt;
				Vec3f v4 = yPred - _grid[yPos][xPos];&lt;br /&gt;
				if (v4.y &amp;lt; 0)&lt;br /&gt;
					v4.y *= -1;&lt;br /&gt;
				v3 += v4;&lt;br /&gt;
				normal = getInterpolatedNormal(v1, v3);&lt;br /&gt;
			}&lt;br /&gt;
			// if the vertex is on the grid's border the normal will simply be 0/1/0&lt;br /&gt;
			else {&lt;br /&gt;
				normal = Vec3f(0,1,0);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			normal = Vec3f(0,1,0);&lt;br /&gt;
		}&lt;br /&gt;
		_normals[i] = normal.x;&lt;br /&gt;
		_normals[i+1] = normal.y;&lt;br /&gt;
		_normals[i+2] = normal.z;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicGrid::generateTexCoords()&lt;br /&gt;
{&lt;br /&gt;
	_texCoords = new float[_numVertices * 2];&lt;br /&gt;
	int counter = 0;&lt;br /&gt;
	int line = 0;&lt;br /&gt;
	for (int i=0; i&amp;lt;_numVertices*2; i+=2) {&lt;br /&gt;
		if ( line % 2 == 0) {&lt;br /&gt;
			if (counter %2 == 0) {&lt;br /&gt;
				_texCoords[i] = 0.0f;&lt;br /&gt;
				_texCoords[i+1] = 0.0f;&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				_texCoords[i] = 0.0f;&lt;br /&gt;
				_texCoords[i+1] = 1.0f;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			if (counter % 2 == 0) {&lt;br /&gt;
				_texCoords[i] = 1.0f;&lt;br /&gt;
				_texCoords[i+1] = 0.0f;&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				_texCoords[i] = 1.0f;&lt;br /&gt;
				_texCoords[i+1] = 1.0f;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		++counter;&lt;br /&gt;
		if (counter &amp;gt;= _gridSize) {&lt;br /&gt;
			++line;&lt;br /&gt;
			counter = 0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicGrid::generateTriangleIndices() &lt;br /&gt;
{&lt;br /&gt;
	_tIndices = new int[ _numTriangleIndices ];&lt;br /&gt;
	int counter = 0;&lt;br /&gt;
	int lineBreakCounter = 0;&lt;br /&gt;
	int counter3 = 0;&lt;br /&gt;
	for (int i=0; i&amp;lt;_numTriangleIndices; i+=3) {&lt;br /&gt;
		if (i%2 ==0) {&lt;br /&gt;
			_tIndices[i] = counter;&lt;br /&gt;
			_tIndices[i+1] = counter+1;&lt;br /&gt;
			_tIndices[i+2] = counter+_gridSize;&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			_tIndices[i] = counter + _gridSize;&lt;br /&gt;
			_tIndices[i+1] = counter + 1;&lt;br /&gt;
			_tIndices[i+2] = counter+_gridSize+1;&lt;br /&gt;
			++counter;&lt;br /&gt;
		}&lt;br /&gt;
		++lineBreakCounter;&lt;br /&gt;
		if (lineBreakCounter == _gridSize*2 - 2) {&lt;br /&gt;
			--counter;&lt;br /&gt;
			++counter3;&lt;br /&gt;
			lineBreakCounter = 0;&lt;br /&gt;
			counter = counter3*_gridSize;&lt;br /&gt;
		}&lt;br /&gt;
		//std::cout&amp;lt;&amp;lt;_tIndices[i]&amp;lt;&amp;lt;&amp;quot;/&amp;quot;&amp;lt;&amp;lt;_tIndices[i+1]&amp;lt;&amp;lt;&amp;quot;/&amp;quot;&amp;lt;&amp;lt;_tIndices[i+2]&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicGrid::update()&lt;br /&gt;
{&lt;br /&gt;
	removeCustomModelNode();&lt;br /&gt;
	delete[] _positions;&lt;br /&gt;
	_positions = 0;&lt;br /&gt;
	delete[] _normals;&lt;br /&gt;
	_normals = 0;&lt;br /&gt;
	generatePositions();&lt;br /&gt;
	generateNormals();&lt;br /&gt;
	addCustomModelNode(-1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DynamicGrid::saveGridToFile(std::string fileName_)&lt;br /&gt;
{&lt;br /&gt;
	//std::stringstream fName;&lt;br /&gt;
	//fName&amp;lt;&amp;lt;fileName_;&lt;br /&gt;
	//fName&amp;lt;&amp;lt;&amp;quot;.d2g&amp;quot;;&lt;br /&gt;
	std::stringstream ss;&lt;br /&gt;
	// magic header&lt;br /&gt;
	ss&amp;lt;&amp;lt;&amp;quot;D2SG\n&amp;quot;;&lt;br /&gt;
	// the gridsize (important to know!)&lt;br /&gt;
	ss&amp;lt;&amp;lt;_gridSize;&lt;br /&gt;
	ss&amp;lt;&amp;lt;&amp;quot;\n&amp;quot;;&lt;br /&gt;
	// the quadsize (important to know!)&lt;br /&gt;
	ss&amp;lt;&amp;lt;_size;&lt;br /&gt;
	ss&amp;lt;&amp;lt;&amp;quot;\n&amp;quot;;&lt;br /&gt;
	// number of coordinates (most important to know!)&lt;br /&gt;
	ss&amp;lt;&amp;lt;(_gridSize*_gridSize*3);&lt;br /&gt;
	ss&amp;lt;&amp;lt;&amp;quot;\n&amp;quot;;&lt;br /&gt;
	// coordinates&lt;br /&gt;
	for (int y=0; y&amp;lt;_gridSize; ++y) {&lt;br /&gt;
		for (int x=0; x&amp;lt;_gridSize; ++x) {&lt;br /&gt;
			ss&amp;lt;&amp;lt;_grid[y][x].x;&lt;br /&gt;
			ss&amp;lt;&amp;lt;&amp;quot;\n&amp;quot;;&lt;br /&gt;
			ss&amp;lt;&amp;lt;_grid[y][x].y;&lt;br /&gt;
			ss&amp;lt;&amp;lt;&amp;quot;\n&amp;quot;;&lt;br /&gt;
			ss&amp;lt;&amp;lt;_grid[y][x].z;&lt;br /&gt;
			ss&amp;lt;&amp;lt;&amp;quot;\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	ss&amp;lt;&amp;lt;&amp;quot;\n&amp;quot;;&lt;br /&gt;
	std::ofstream dest(fileName_.c_str());&lt;br /&gt;
	if (dest.is_open()) {&lt;br /&gt;
		dest&amp;lt;&amp;lt;ss.str();&lt;br /&gt;
		dest.close();&lt;br /&gt;
	}&lt;br /&gt;
	std::cout&amp;lt;&amp;lt;&amp;quot;Grid successfully saved to file: &amp;quot;&amp;lt;&amp;lt;fileName_&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool DynamicGrid::readGridFromFile(std::string fileName_)&lt;br /&gt;
{&lt;br /&gt;
	int numCoordinates;&lt;br /&gt;
	std::ifstream inFile;&lt;br /&gt;
	inFile.open(fileName_.c_str());&lt;br /&gt;
	bool error = false;&lt;br /&gt;
	if (!inFile) {&lt;br /&gt;
		std::cout&amp;lt;&amp;lt;&amp;quot;Gridfile &amp;quot;&amp;lt;&amp;lt;fileName_&amp;lt;&amp;lt;&amp;quot; could not be found! Creating new grid.&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
		error = true;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		std::string line;&lt;br /&gt;
		if (std::getline(inFile, line)) {&lt;br /&gt;
			std::cout&amp;lt;&amp;lt;&amp;quot;Line: &amp;quot;&amp;lt;&amp;lt;line&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
			if (line != &amp;quot;D2SG&amp;quot;) {&lt;br /&gt;
				std::cout&amp;lt;&amp;lt;&amp;quot;wrong grid-file format &amp;quot;&amp;lt;&amp;lt;line.compare(&amp;quot;D2SG&amp;quot;)&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
				error = true;&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				std::cout&amp;lt;&amp;lt;&amp;quot;Valid grid-file found!&amp;quot;&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (std::getline(inFile, line)) {&lt;br /&gt;
			_gridSize = stringToInt(line);&lt;br /&gt;
			//std::cout&amp;lt;&amp;lt;&amp;quot;gridsize: &amp;quot;&amp;lt;&amp;lt;_gridSize&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			error = true;&lt;br /&gt;
		}&lt;br /&gt;
		if (std::getline(inFile, line)) {&lt;br /&gt;
			_size = stringToInt(line);&lt;br /&gt;
			//std::cout&amp;lt;&amp;lt;&amp;quot;quadsize: &amp;quot;&amp;lt;&amp;lt;_size&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			error = true;&lt;br /&gt;
		}&lt;br /&gt;
		if (std::getline(inFile, line)) {&lt;br /&gt;
			numCoordinates = stringToInt(line);&lt;br /&gt;
			//std::cout&amp;lt;&amp;lt;&amp;quot;numCoords: &amp;quot;&amp;lt;&amp;lt;numCoordinates&amp;lt;&amp;lt;std::endl;&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			error = true;&lt;br /&gt;
		}&lt;br /&gt;
		if (!error) {&lt;br /&gt;
			_grid = new Vec3f*[_gridSize];&lt;br /&gt;
			for(int y=0; y&amp;lt;_gridSize; ++y) {&lt;br /&gt;
				_grid[y] = new Vec3f[_gridSize];&lt;br /&gt;
				for (int x=0; x&amp;lt;_gridSize; ++x) {&lt;br /&gt;
					Vec3f v;&lt;br /&gt;
					if (std::getline(inFile, line)) {&lt;br /&gt;
						v.x = stringToFloat(line);&lt;br /&gt;
					}&lt;br /&gt;
					if (std::getline(inFile, line)) {&lt;br /&gt;
						v.y = stringToFloat(line);&lt;br /&gt;
					}&lt;br /&gt;
					if (std::getline(inFile, line)) {&lt;br /&gt;
						v.z = stringToFloat(line);&lt;br /&gt;
					}&lt;br /&gt;
					_grid[y][x] = v;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	inFile.close();&lt;br /&gt;
	if (error) {&lt;br /&gt;
		_gridSize = GRIDSIZE;&lt;br /&gt;
		_size = 12;&lt;br /&gt;
		_grid = 0;&lt;br /&gt;
	}&lt;br /&gt;
	_numVertices = (_gridSize*_gridSize);&lt;br /&gt;
	_numTriangles = ((_gridSize - 1) * (_gridSize - 1)) * 2;&lt;br /&gt;
	_numTriangleIndices = _numTriangles * 3;&lt;br /&gt;
	_origin = Vec3f(-_size/2*_gridSize, 0, _size/2*_gridSize);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Usage example=&lt;br /&gt;
&lt;br /&gt;
Finally this is all you have to do to generate the grid and display it in your scene.&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= app.cpp| &lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	// initialize a new grid (args: quadsize, model-name, filename (if applicable)&lt;br /&gt;
	_grid = new DynamicGrid(12.0f, &amp;quot;grid&amp;quot;, &amp;quot;grid-filename&amp;quot;);&lt;br /&gt;
	// do not forget to load a material and apply it to the mesh&lt;br /&gt;
	_grid-&amp;gt;setMaterial(gridMatRes);&lt;br /&gt;
	// generate the grid&lt;br /&gt;
	_grid-&amp;gt;generate();&lt;br /&gt;
	// add the grid-model to the RootNode&lt;br /&gt;
	_grid-&amp;gt;addCustomModelNode(RootNode);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''TODO'''&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Newacct</name></author>	</entry>

	</feed>