

4.10.4 Creating a Thing Mesh

This section describes how to create a thing mesh.

What are Things?

A `thing' mesh object (see section Thing Mesh Object) is an object made out of polygons. Every polygon can have another material and the polygons can have three or more vertices. A thing uses lightmapping for lighting (roughly this means that every polygon gets another texture which contains light and shadow information for that polygon).

Things are useful for static geometry objects or objects that don't animate. You can use it for walls, floor, staircases, and even doors that open. As long as the object itself doesn't have to animate (but just moves) a thing is perfectly fine. For very high detail objects it is probably better to use the `genmesh' mesh object (see section Genmesh Mesh Object instead. Also if you want to use internal animation (like an actor or a creature in your game) you should use the `sprite3d' mesh object (see section Sprite3D Mesh Object).

Things can share geometry if they are made from the same factory. Note that information like lightmaps is not shared because a lightmap is position dependent (i.e. the amount of light a polygon receives depends on where the object instance actually is).

Note that you can hardtransform things (hardmove in maps). If you do this on a mesh object instance then the factory will be cloned if it is used by multiple mesh objects. That's because hardtransform essentially modifies the original geometry and the geometry of a thing is always in the factory. So beware of this because it may mean a lot of extra memory usage if you hardtransform every instance created from a factory.

Note that individual polygons can have names. This can be useful for debugging and also for attaching specific game features to some polygons (like indicating if some polygon is a light switch button or something) but be aware that these names add some memory overhead.

Creating a Thing in a Map

Here is an example of how to create a cube thing in a map file. Note that in this example we avoid the use of a factory. We load a mesh object directly. A factory will be created invisibly to support the thing geometry:

<meshobj name="cube">
    <v x="-0.5" y="-0.5" z="-0.5" />
    <v x="-0.5" y="-0.5" z="0.5" />
    <v x="-0.5" y="0.5" z="-0.5" />
    <v x="-0.5" y="0.5" z="0.5" />
    <v x="0.5" y="-0.5" z="-0.5" />
    <v x="0.5" y="0.5" z="-0.5" />
    <v x="0.5" y="0.5" z="0.5" />

    <p name="up">
      <v>3</v> <v>7</v> <v>6</v> <v>2</v>
    <p name="north">
      <v>1</v> <v>5</v> <v>7</v> <v>3</v>
    <p name="east">
      <v>5</v> <v>4</v> <v>6</v> <v>7</v>
    <p name="south">
      <v>4</v> <v>0</v> <v>2</v> <v>6</v>
    <p name="west">
      <v>0</v> <v>1</v> <v>3</v> <v>2</v>
    <p name="down">
      <v>0</v> <v>4</v> <v>5</v> <v>1</v>
    <v x="1" y="0" z="3" />

There is a lot more you can do in a thing. For example you can specify exactly how you want to map the texture on the polygons. In this particular example we create a cube that has another material for the upper polygon.

Creating a Thing from Code

Here we create the same thing from code. We use a convenience function in the engine to create a thing (CreateThingMesh).

iMaterialWrapper* upMaterial = ...
iMaterialWrapper* otherMaterial = ...
csRef<iMeshWrapper> walls = engine->CreateThingMesh (room, "cube"));
csRef<iThingState> ws =
  scfQueryInterface<iThingState> (walls->GetMeshObject ());
iMeshObject* walls_object = walls->GetMeshObject ();
iMeshObjectFactory* walls_factory = walls->GetFactory();
csRef<iThingFactoryState> walls_state = 
    scfQueryInterface<iThingFactoryState> (walls_factory);
walls_state->AddQuad (
  csVector3 (-.5, .5, -.5),
  csVector3 (.5, .5, -.5),
  csVector3 (.5, .5, .5),
  csVector3 (-.5, .5, .5));
walls_state->SetPolygonMaterial (CS_POLYRANGE_LAST, upMaterial);
walls_state->SetPolygonTextureMapping (CS_POLYRANGE_LAST, 3);

This is only an extract of the example but you can easily see how to create additional polygons here.

Include Files

The include files useful for this section are:

#include <imesh/thing.h>


This document was generated using texi2html 1.76.