Hi,
I’m writing a grid of map squares procedurally, adding each square as a single geom and texturing said geom. (This is roughly based on a code snippet someone else posted) Applying the texture to a geom is done by adding a renderattrib to the geomstate. I then flatten everything at the end and seem to get reasonable performance.
What I would like to do is layer on extra textures to some of the tiles to create variation. (IE base grass tile, add second layer for small rocks). I’m struggling with how to define a new renderattrib that adds this second texture as a decal, or even just makes a second texturestage and they are composited.
Here is my code:
self._geomNode = GeomNode('gnode')
self._size = (100,100)
self._tiles = []
self._gvd = GeomVertexData('map_maker', GeomVertexFormat.getV3t2(), Geom.UHStatic)
self._vertex_writer = GeomVertexWriter(self._gvd, 'vertex')
self._texcoord_writer = GeomVertexWriter(self._gvd, 'texcoord')
for x in xrange(0,self._size[0]):
self._tiles.append([])
for z in xrange(0,self._size[1]):
geom = Geom(self._gvd)
prim = GeomTriangles(Geom.UHStatic)
self._vertex_writer.addData3f(x, 0, z)
self._texcoord_writer.addData2f(0, 0)
self._vertex_writer.addData3f(x, 0, z+1)
self._texcoord_writer.addData2f(0, 1)
self._vertex_writer.addData3f(x+1, 0, z+1)
self._texcoord_writer.addData2f(1, 1)
self._vertex_writer.addData3f(x+1, 0, z)
self._texcoord_writer.addData2f(1, 0)
d = ((x*self._size[0]) + z) * 4
prim.addVertices(d, d + 2, d + 1)
prim.addVertices(d, d + 3, d + 2)
prim.closePrimitive()
geom.addPrimitive(prim)
i = randint(0, len(tiles)-1)
self._tiles[x].append( {
'geom':geom,
'prim':prim,
'tile':tiles[i],
'geomIndex': d/4
}
)
#rock = loader.loadTexture('assets/img/modifiers/rock.png')
#rock.setMagfilter(Texture.FTLinearMipmapLinear)
#rock.setMinfilter(Texture.FTLinearMipmapLinear)
for x in self._tiles:
for z in x:
self._geomNode.addGeom(z['geom'])
self._geomNode.setGeomState(z['geomIndex'], self._geomNode.getGeomState(z['geomIndex']).addAttrib\
(TextureAttrib.make(z['tile']._tex)))
Basically I’d like to add an if statement at the very bottom within the double loop that applies the rock texture as a decal over the geom.
Thanks in advance!