Better tree spawning (getting mem error)

This commit is contained in:
Carlos Sanchez 2024-09-20 19:33:53 -04:00
parent 1f3b6a973d
commit a1182995ae
2 changed files with 137 additions and 68 deletions

70
commonobj.c Normal file
View File

@ -0,0 +1,70 @@
#include "haloo3d/haloo3d.h"
#include "haloo3d/haloo3dex_gen.h"
#include "haloo3d/haloo3dex_obj.h"
#ifndef TREECOL
#define TREECOL 0xF070
#endif
#ifndef TREETRUNKCOL
#define TREETRUNKCOL 0xF950
#endif
#ifndef TREEBOTTOM
#define TREEBOTTOM -0.333
#endif
#ifndef TREETOPWIDTH
#define TREETOPWIDTH 1.0
#endif
#ifndef TREETRUNKWIDTH
#define TREETRUNKWIDTH 0.2
#endif
// Fill a face with a solid color given by the tex
void fastface(haloo3d_facei face, uint16_t tex, uint16_t v0, uint16_t v1,
uint16_t v2) {
face[0].texi = tex;
face[1].texi = tex;
face[2].texi = tex;
face[0].posi = v0;
face[1].posi = v1;
face[2].posi = v2;
}
// Generate a basic tree model
void gen_tree_model(haloo3d_obj *tree) {
haloo3d_obj_resetfixed(tree, 12, 24);
struct vec3 treecol = haloo3d_gen_paletteuv(TREECOL);
int treeuv = haloo3d_obj_addvtexture(tree, treecol);
struct vec3 trunkcol = haloo3d_gen_paletteuv(TREETRUNKCOL);
int trunkuv = haloo3d_obj_addvtexture(tree, trunkcol);
// clang-format off
uint16_t top = haloo3d_obj_addvertex(tree,
(struct vec4){.x = 0, .y = 1, .z = 0, .w = 1});
uint16_t tree1 = haloo3d_obj_addvertex(tree,
(struct vec4){.x = -TREETOPWIDTH, .y = TREEBOTTOM, .z = -TREETOPWIDTH, .w = 1});
uint16_t tree2 = haloo3d_obj_addvertex(tree,
(struct vec4){.x = TREETOPWIDTH, .y = TREEBOTTOM, .z = -TREETOPWIDTH, .w = 1});
uint16_t tree3 = haloo3d_obj_addvertex(tree,
(struct vec4){.x = 0, .y = TREEBOTTOM, .z = TREETOPWIDTH, .w = 1});
uint16_t trunk1 = haloo3d_obj_addvertex(tree,
(struct vec4){ .x = -TREETRUNKWIDTH, .y = -1, .z = -TREETRUNKWIDTH, .w = 1});
uint16_t trunk2 = haloo3d_obj_addvertex(tree,
(struct vec4){ .x = TREETRUNKWIDTH, .y = -1, .z = -TREETRUNKWIDTH, .w = 1});
uint16_t trunk3 = haloo3d_obj_addvertex(tree,
(struct vec4){.x = 0, .y = -1, .z = TREETRUNKWIDTH, .w = 1});
// clang-format on
haloo3d_facei face;
fastface(face, treeuv, top, tree1, tree3);
haloo3d_obj_addface(tree, face);
fastface(face, treeuv, top, tree3, tree2);
haloo3d_obj_addface(tree, face);
fastface(face, treeuv, top, tree2, tree1);
haloo3d_obj_addface(tree, face);
fastface(face, trunkuv, top, trunk1, trunk3);
haloo3d_obj_addface(tree, face);
fastface(face, trunkuv, top, trunk3, trunk2);
haloo3d_obj_addface(tree, face);
fastface(face, trunkuv, top, trunk2, trunk1);
haloo3d_obj_addface(tree, face);
haloo3d_obj_shrinktofit(tree);
}

121
terrain.c
View File

@ -36,7 +36,7 @@
#define INIT_NEARCLIP 0.01
#define INIT_FARCLIP 100.0
#define MAXCHUNKPERFRAME 50
#define MAXCHUNKPERFRAME PLBOXEDGE
// Generation consts / things for looks
#define LANDCOL 0xF6D2 // 0xF4E1
@ -69,57 +69,10 @@ int fps = 60;
#define PALETTEKEY "palette"
#define TREEKEY "tree"
void fastface(haloo3d_facei face, uint16_t tex, uint16_t v0, uint16_t v1,
uint16_t v2) {
face[0].texi = tex;
face[1].texi = tex;
face[2].texi = tex;
face[0].posi = v0;
face[1].posi = v1;
face[2].posi = v2;
}
#include "commonobj.c"
static int gen_terrain_seed = 0;
void gen_tree_model(haloo3d_obj *tree) {
haloo3d_obj_resetfixed(tree, 12, 24);
struct vec3 treecol = haloo3d_gen_paletteuv(TREECOL);
int treeuv = haloo3d_obj_addvtexture(tree, treecol);
struct vec3 trunkcol = haloo3d_gen_paletteuv(TREETRUNKCOL);
int trunkuv = haloo3d_obj_addvtexture(tree, trunkcol);
uint16_t top = haloo3d_obj_addvertex(
tree, (struct vec4){.x = 0, .y = 1, .z = 0, .w = 1});
uint16_t tree1 = haloo3d_obj_addvertex(
tree, (struct vec4){.x = -1, .y = TREEBOTTOM, .z = -1, .w = 1});
uint16_t tree2 = haloo3d_obj_addvertex(
tree, (struct vec4){.x = 1, .y = TREEBOTTOM, .z = -1, .w = 1});
uint16_t tree3 = haloo3d_obj_addvertex(
tree, (struct vec4){.x = 0, .y = TREEBOTTOM, .z = 1, .w = 1});
uint16_t trunk1 = haloo3d_obj_addvertex(
tree, (struct vec4){
.x = -TREETRUNKWIDTH, .y = -1, .z = -TREETRUNKWIDTH, .w = 1});
uint16_t trunk2 = haloo3d_obj_addvertex(
tree, (struct vec4){
.x = TREETRUNKWIDTH, .y = -1, .z = -TREETRUNKWIDTH, .w = 1});
uint16_t trunk3 = haloo3d_obj_addvertex(
tree, (struct vec4){.x = 0, .y = -1, .z = TREETRUNKWIDTH, .w = 1});
haloo3d_facei face;
fastface(face, treeuv, top, tree1, tree3);
haloo3d_obj_addface(tree, face);
fastface(face, treeuv, top, tree3, tree2);
haloo3d_obj_addface(tree, face);
fastface(face, treeuv, top, tree2, tree1);
haloo3d_obj_addface(tree, face);
fastface(face, trunkuv, top, trunk1, trunk3);
haloo3d_obj_addface(tree, face);
fastface(face, trunkuv, top, trunk3, trunk2);
haloo3d_obj_addface(tree, face);
fastface(face, trunkuv, top, trunk2, trunk1);
haloo3d_obj_addface(tree, face);
haloo3d_obj_shrinktofit(tree);
}
void gen_terrain(struct vec3i pos, haloo3d_obj *model,
haloo3d_easystore *storage) {
eprintf("Generating terrain at %d,%d\n", pos.x, pos.z);
@ -155,28 +108,74 @@ void gen_terrain(struct vec3i pos, haloo3d_obj *model,
uint16_t tl = i + CHUNKVSIZE;
uint16_t tr = i + CHUNKVSIZE + 1;
haloo3d_facei face;
uint16_t faces[2];
fastface(face, landuv, bl, br, tl);
haloo3d_obj_addface(model, face);
faces[0] = haloo3d_obj_addface(model, face);
fastface(face, landuv, br, tr, tl);
haloo3d_obj_addface(model, face);
struct vec4 corn = model->vertices[bl];
if (corn.y > 0.1) {
faces[1] = haloo3d_obj_addface(model, face);
struct vec3 triedge[2][3];
for (int t = 0; t < 2; t++) {
for (int v = 0; v < 3; v++) {
// NOTE: WE SWTICH Y AND Z TO MAKE THE EDGE FUNCTION WORK
triedge[t][v].x = model->vertices[model->faces[faces[t]][v].posi].x;
triedge[t][v].y = model->vertices[model->faces[faces[t]][v].posi].z;
triedge[t][v].z = model->vertices[model->faces[faces[t]][v].posi].y;
}
}
// Generate up to 4 trees per cell (usually not)
for (int t = 0; t < 4; t++) {
// We know that the first vec in the first triangle is bl, which is our
// base to start generating trees
struct vec2 treepos = {
.x = triedge[0][0].x + 0.5 * (t & 1) + 0.3 * RANDF(),
.y = triedge[0][0].y - (0.5 * (t >> 1) + 0.3 * RANDF())};
mfloat_t we[3];
for (int i = 0; i < 2; i++) {
we[0] = haloo3d_edgefunc(triedge[i][1].v, triedge[i][2].v, treepos.v);
we[1] = haloo3d_edgefunc(triedge[i][2].v, triedge[i][0].v, treepos.v);
we[2] = haloo3d_edgefunc(triedge[i][0].v, triedge[i][1].v, treepos.v);
if (we[0] < 0 || we[1] < 0 || we[2] < 0) {
// eprintf("BAD: %f,%f, (%f, %f)\n", treepos.x, treepos.y,
// model->vertices[bl].x, model->vertices[bl].z);
continue;
}
// We know this is the triangle to check. Let's figure out a y.
// NOTE: WE SWTICH Y AND Z TO MAKE THE EDGE FUNCTION WORK
float y = we[0] * triedge[i][0].z + we[1] * triedge[i][1].z +
we[2] * triedge[i][2].z;
// eprintf("TREE Y: %f\n", y);
// For now, only generate trees if they're above a certain height
if (RANDF() < y) {
float scale = 0.1 + RANDF() * 0.05;
float height = 0.5 + RANDF() * 0.5;
// for (int b = 1; b <= 4; b++) {
haloo3d_obj_addobj(
model, tree,
(struct vec3){.x = corn.x, .y = corn.y + scale * height, .z = corn.z},
(struct vec3){
.x = treepos.x, .y = y + scale * height, .z = treepos.y},
(struct vec3)DEFAULTLOOK, (struct vec3)DEFAULTUP,
(struct vec3){.x = scale, .y = scale * height, .z = scale});
//}
}
}
}
// struct vec4 corn = model->vertices[bl];
// if (corn.y > 0.1) {
// float scale = 0.1 + RANDF() * 0.05;
// float height = 0.5 + RANDF() * 0.5;
// // for (int b = 1; b <= 4; b++) {
// haloo3d_obj_addobj(
// model, tree,
// (struct vec3){
// .x = corn.x, .y = corn.y + scale * height * 2, .z = corn.z},
// (struct vec3)DEFAULTLOOK, (struct vec3)DEFAULTUP,
// (struct vec3){.x = scale, .y = scale * height, .z = scale});
}
// (struct vec3){.x = corn.x, .y = corn.y + scale * height, .z =
// corn.z}, (struct vec3)DEFAULTLOOK, (struct vec3)DEFAULTUP, (struct
// vec3){.x = scale, .y = scale * height, .z = scale});
// //}
// // haloo3d_obj_addobj(
// // model, tree,
// // (struct vec3){
// // .x = corn.x, .y = corn.y + scale * height * 2, .z = corn.z},
// // (struct vec3)DEFAULTLOOK, (struct vec3)DEFAULTUP,
// // (struct vec3){.x = scale, .y = scale * height, .z = scale});
// }
}
// haloo3d_obj_addobj(
// model, tree,