So, I’ve got this crazy script that puts lots and lots of grass on a terrain, flattens it into fewer nodes and writes it all to a bam file
from panda3d.core import *
import direct.directbase.DirectStart
import random
geoterrain = GeoMipTerrain("mySimpleTerrain")
geoterrain.setHeightfield("hf.png")
geoterrain.setMinLevel(4)
geoterrain.generate()
geoterrain.getRoot().setSz(100)
grass1=loader.loadModel('grass_mini1.egg')
grass2=loader.loadModel('grass_mini2.egg')
grass3=loader.loadModel('grass_mini3.egg')
grass4=loader.loadModel('grass_mini4.egg')
grass_dict={}
root=NodePath("root")
grass=render.attachNewNode('grass')
grass_map=PNMImage()
grass_map.read("grass_map.png")
for x in xrange(512):
for y in xrange(512):
color=grass_map.getBright(x,511-y)
z=geoterrain.getElevation(x,y)*100
model=grass1
if color <0.9:
model=grass2
if color <0.7:
model=grass3
if color <0.5:
model=grass4
if color<0.3:
model=None
if model!=None:
grass_dict[(x,y)]=model.copyTo(root)
grass_dict[(x,y)].setPos(x,y,z)
grass_dict[(x,y)].setH(random.randrange(360)) #optional random rotation?
grass_dict[(x,y)].clearModelNodes()
x_offset=0
y_offset=0
nodes=0
while y_offset<512:
group=grass.attachNewNode('group')
print y_offset, x_offset, "nodes:", nodes
nodes=0
for x in range(x_offset, x_offset+64):
for y in range(y_offset, y_offset+64):
if grass_dict.has_key((x,y)):
grass_dict[(x,y)].reparentTo(group)
nodes=nodes+1
group.flattenStrong()
x_offset=x_offset+64
if x_offset>512:
x_offset=0
y_offset=y_offset+64
grass.writeBamFile('grass1.bam')
grass.analyze()
run()
Models and textures if someone wants to run this:
sendspace.com/file/t573k1
It works, but it takes about an hour or so to finish. Any ideas how I could make this work faster?
This is how it looks:
i.imgur.com/3m2L1Gs.png
i.imgur.com/wBvNwTM.jpg
It’s sad that this either takes +60 minutes or ~350MB on the hard drive once generated. Looks like I’m cooked without hardware instancing(can’t find/make code running on ATI)