Here is a kinda large chunk of code that generates the models for each ground tile of a diamond-square powered terrain generator.
It works…but I am wondering if it is efficient at all? It generates a 30 * 30 map in about 3 seconds. A 100 * 100 takes much longer and my FPS drops a whole lot with that big of a map. Is a map of that size with that many ground tiles just too big or is there a way to better this code? Thanks for taking the time to look at this (if you do)!
def generate(self, size, min_height, max_height, roughness):
grid = diamond_square.make_grid(shape=(size, size),
min_height=min_height,
max_height=max_height,
roughness=roughness)
cam_max_z = 0
min_z = 999999
for y in range(1, size):
for x in range(1, size):
if grid[x, y] < min_z:
if grid[x, y] > max_height * evo_config.WATER_LIMIT:
min_z = grid[x, y]
if grid[x, y] > cam_max_z:
cam_max_z = grid[x, y]
cam.set_z(self, cam_max_z)
ground_node = NodePath("GroundNode")
n = None
water = self.loader.loadModel("Assets/Models/GroundTypes/Water")
water.clearModelNodes()
sand = self.loader.loadModel("Assets/Models/GroundTypes/Sand")
sand.clearModelNodes()
dirt = self.loader.loadModel("Assets/Models/GroundTypes/Dirt")
dirt.clearModelNodes()
grass = self.loader.loadModel("Assets/Models/GroundTypes/Grass")
grass.clearModelNodes()
plains = self.loader.loadModel("Assets/Models/GroundTypes/Plains")
plains.clearModelNodes()
rock = self.loader.loadModel("Assets/Models/GroundTypes/Rock")
rock.clearModelNodes()
snow = self.loader.loadModel("Assets/Models/GroundTypes/Snow")
snow.clearModelNodes()
is_water = False
for y in range(1, size):
for x in range(1, size):
if grid[x, y] < max_height * evo_config.WATER_LIMIT:
n = ground_node.attachNewNode(f"Ground-{x},{y}")
water.instanceTo(n)
is_water = True
elif grid[x, y] < max_height * evo_config.SAND_LIMIT:
n = ground_node.attachNewNode(f"Ground-{x},{y}")
sand.instanceTo(n)
elif grid[x, y] < max_height * evo_config.DIRT_LIMIT:
n = ground_node.attachNewNode(f"Ground-{x},{y}")
dirt.instanceTo(n)
elif grid[x, y] < max_height * evo_config.GRASS_PLAINS_LIMIT:
rnd = round(random.random() * 10)
if rnd < 5:
n = ground_node.attachNewNode(f"Ground-{x},{y}")
grass.instanceTo(n)
else:
n = ground_node.attachNewNode(f"Ground-{x},{y}")
plains.instanceTo(n)
elif grid[x, y] < max_height * evo_config.ROCK_LIMIT:
n = ground_node.attachNewNode(f"Ground-{x},{y}")
rock.instanceTo(n)
else:
n = ground_node.attachNewNode(f"Ground-{x},{y}")
snow.instanceTo(n)
if n is not None:
if not is_water:
n.setPos(x, y, grid[x, y])
else:
n.setPos(x, y, min_z)
is_water = False
ground_node.flattenStrong()
ground_node.reparentTo(self.render)
detailed_grid = solid_grid.gen_grid_from_terrain(grid, max_height)
return ground_node, grid, detailed_grid