Crazy flowers
This commit is contained in:
parent
20a8c65266
commit
8a1534004c
116
terrain.c
116
terrain.c
@ -59,7 +59,7 @@
|
||||
#define CHUNKSCALE (1.0 / CHUNKSIZE)
|
||||
// This is how many vertices across a chunk is
|
||||
#define CHUNKVSIZE (CHUNKSIZE + 1)
|
||||
#define VIEWDISTANCE 7
|
||||
#define VIEWDISTANCE 10
|
||||
#define PLBOXEDGE (VIEWDISTANCE * 2 + 1)
|
||||
#define INIT_NEARCLIP 0.01
|
||||
#define INIT_FARCLIP 100.0
|
||||
@ -76,7 +76,8 @@
|
||||
#define TREETRUNKCOL 0xF950
|
||||
#define TREEBOTTOM -0.333
|
||||
#define TREETRUNKWIDTH 0.2
|
||||
#define REDFLOWERCOL 0xFF36
|
||||
#define REDFLOWERCOL 0xFF24
|
||||
#define YELLOWFLOWERCOL 0xFFF0
|
||||
#define SEATRANS 0.75
|
||||
#define CLOUDTRANSMIN 0.1
|
||||
#define CLOUDTRANSMAX 0.2
|
||||
@ -108,6 +109,7 @@ int fps = 60;
|
||||
#define TREEKEY "tree"
|
||||
#define CLOUDKEY "cloud"
|
||||
#define REDFLOWERKEY "redflower"
|
||||
#define YELLOWFLOWERKEY "yellowflower"
|
||||
|
||||
#include "commonobj.c"
|
||||
|
||||
@ -130,11 +132,13 @@ static inline mfloat_t calc_barycentric(mfloat_t *point, mfloat_t *values,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void gen_terrain(struct vec3i pos, haloo3d_obj *model,
|
||||
haloo3d_easystore *storage) {
|
||||
uint16_t gen_terrain(struct vec3i pos, haloo3d_obj *model,
|
||||
haloo3d_easystore *storage) {
|
||||
eprintf("Generating terrain at %d,%d\n", pos.x, pos.z);
|
||||
haloo3d_obj *tree = haloo3d_easystore_getobj(storage, TREEKEY);
|
||||
haloo3d_obj *redflower = haloo3d_easystore_getobj(storage, REDFLOWERKEY);
|
||||
haloo3d_obj *flowers[2];
|
||||
flowers[0] = haloo3d_easystore_getobj(storage, REDFLOWERKEY);
|
||||
flowers[1] = haloo3d_easystore_getobj(storage, YELLOWFLOWERKEY);
|
||||
// Don't allow the model to have more than some amount of faces/vertices.
|
||||
haloo3d_obj_resetfixed(model, H3D_OBJ_MAXFACES, H3D_OBJ_MAXVERTICES);
|
||||
struct vec3 landcol = haloo3d_gen_paletteuv(LANDCOL); // 0xF2C0);
|
||||
@ -154,6 +158,14 @@ void gen_terrain(struct vec3i pos, haloo3d_obj *model,
|
||||
// clang-format on
|
||||
}
|
||||
}
|
||||
struct vec2 triedge[6];
|
||||
mfloat_t heights[6];
|
||||
uint16_t faces[2];
|
||||
// A funny little thing... we're going to add flowers to this alternative
|
||||
// model, then add them to the end of the real model with a pointer saying
|
||||
// "don't do lighting past this point"
|
||||
haloo3d_obj nl_model;
|
||||
haloo3d_obj_resetfixed(&nl_model, H3D_OBJ_MAXFACES, H3D_OBJ_MAXVERTICES);
|
||||
for (int i = 0; i < CHUNKVSIZE * (CHUNKVSIZE - 1); i++) {
|
||||
if ((i & CHUNKSIZE) == CHUNKSIZE) {
|
||||
continue;
|
||||
@ -162,14 +174,8 @@ void gen_terrain(struct vec3i pos, haloo3d_obj *model,
|
||||
uint16_t br = i + 1;
|
||||
uint16_t tl = i + CHUNKVSIZE;
|
||||
uint16_t tr = i + CHUNKVSIZE + 1;
|
||||
haloo3d_facei face;
|
||||
uint16_t faces[2];
|
||||
fastface(face, landuv, bl, br, tl);
|
||||
faces[0] = haloo3d_obj_addface(model, face);
|
||||
fastface(face, landuv, br, tr, tl);
|
||||
faces[1] = haloo3d_obj_addface(model, face);
|
||||
struct vec2 triedge[6];
|
||||
mfloat_t heights[6];
|
||||
faces[0] = fastface2(model, landuv, bl, br, tl);
|
||||
faces[1] = fastface2(model, landuv, br, tr, tl);
|
||||
for (int t = 0; t < 2; t++) {
|
||||
for (int v = 0; v < 3; v++) {
|
||||
int ofs = t * 3;
|
||||
@ -183,27 +189,30 @@ void gen_terrain(struct vec3i pos, haloo3d_obj *model,
|
||||
// ns.seed = 0;
|
||||
ns.frequency = 0.02;
|
||||
ns.fractal_type = FNL_FRACTAL_NONE;
|
||||
// Pick a random place for a flower
|
||||
struct vec2 flowerpos = {.x = triedge[0].x + 0.8 * RANDF(),
|
||||
.y = triedge[0].y - 0.8 * RANDF()};
|
||||
float y = calc_barycentric(flowerpos.v, heights, triedge, 2);
|
||||
if (y < 0.4 && y > 0) {
|
||||
float nlayer =
|
||||
fnlGetNoise2D(&ns, noisex + flowerpos.x, noisey + flowerpos.y);
|
||||
float scale = 0.04;
|
||||
float vertscale = scale; // * CHUNKSCALE * 4;
|
||||
if (RANDF() < -nlayer) {
|
||||
haloo3d_obj_addobj(
|
||||
model, redflower,
|
||||
(struct vec3){
|
||||
.x = flowerpos.x, .y = y + vertscale * 0.5, .z = flowerpos.y},
|
||||
(struct vec3)DEFAULTLOOK,
|
||||
//(struct vec3){.x = -sin(MPI * 0.25), .y = 0, .z = -cos(MPI *
|
||||
// 0.25)},
|
||||
(struct vec3)DEFAULTUP,
|
||||
(struct vec3){.x = scale, .y = vertscale, .z = scale});
|
||||
}
|
||||
}
|
||||
// for (int fi = 0; fi < 2; fi++) {
|
||||
// // Pick a random place for a flower
|
||||
// struct vec2 flowerpos = {.x = triedge[0].x + 0.8 * RANDF(),
|
||||
// .y = triedge[0].y - 0.8 * RANDF()};
|
||||
// float y = calc_barycentric(flowerpos.v, heights, triedge, 2);
|
||||
// if (y > 0.2 * fi && y < 0.2 * (fi + 1)) {
|
||||
// float nlayer =
|
||||
// fnlGetNoise2D(&ns, noisex + flowerpos.x, noisey + flowerpos.y);
|
||||
// float scale = 0.04;
|
||||
// float vertscale = scale * (1 - 0.5 * RANDF()); // * CHUNKSCALE * 4;
|
||||
// if (RANDF() < -nlayer) {
|
||||
// haloo3d_obj_addobj(
|
||||
// &nl_model, flowers[fi],
|
||||
// (struct vec3){
|
||||
// .x = flowerpos.x, .y = y + vertscale * 0.5, .z =
|
||||
// flowerpos.y},
|
||||
// (struct vec3)DEFAULTLOOK,
|
||||
// //(struct vec3){.x = -sin(MPI * 0.25), .y = 0, .z = -cos(MPI *
|
||||
// // 0.25)},
|
||||
// (struct vec3)DEFAULTUP,
|
||||
// (struct vec3){.x = scale, .y = vertscale, .z = scale});
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
for (int t = 0; t < MAXTREEPERCELL; t++) {
|
||||
// We know that the first vec in the first triangle is bl, which is our
|
||||
// base to start generating trees
|
||||
@ -226,18 +235,28 @@ void gen_terrain(struct vec3i pos, haloo3d_obj *model,
|
||||
.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});
|
||||
} else if ((rand() & 1) && y < 0.4 && y > 0 && RANDF() < -nlayer) {
|
||||
// if (y > 0.2 * fi && y < 0.2 * (fi + 1)) {
|
||||
float scale = 0.04;
|
||||
float vertscale = scale * (1 - 0.5 * RANDF()); // * CHUNKSCALE * 4;
|
||||
haloo3d_obj_addobj(
|
||||
&nl_model, flowers[y < 0.2],
|
||||
(struct vec3){
|
||||
.x = treepos.x, .y = y + vertscale * 0.5, .z = treepos.y},
|
||||
(struct vec3)DEFAULTLOOK,
|
||||
//(struct vec3){.x = -sin(MPI * 0.25), .y = 0, .z = -cos(MPI *
|
||||
// 0.25)},
|
||||
(struct vec3)DEFAULTUP,
|
||||
(struct vec3){.x = scale, .y = vertscale, .z = scale});
|
||||
}
|
||||
}
|
||||
}
|
||||
// uint16_t stoplighting = model->numfaces;
|
||||
// for (int i = 0; i < CHUNKVSIZE * (CHUNKVSIZE - 1); i++) {
|
||||
// if ((i & CHUNKSIZE) == CHUNKSIZE) {
|
||||
// continue;
|
||||
// }
|
||||
// uint16_t bl = i;
|
||||
// }
|
||||
// haloo3d_obj_shrinktofit(model);
|
||||
// return stoplighting;
|
||||
uint16_t stoplighting = model->numfaces;
|
||||
haloo3d_obj_addobj(model, &nl_model, (struct vec3){.x = 0, .y = 0, .z = 0},
|
||||
(struct vec3)DEFAULTLOOK, (struct vec3)DEFAULTUP,
|
||||
(struct vec3){.x = 1, .y = 1, .z = 1});
|
||||
haloo3d_obj_free(&nl_model);
|
||||
return stoplighting;
|
||||
}
|
||||
|
||||
void gen_cloud(render_context *ctx, tecs *ecs, struct vec3i pos) {
|
||||
@ -254,7 +273,7 @@ void gen_cloud(render_context *ctx, tecs *ecs, struct vec3i pos) {
|
||||
.texture = haloo3d_easystore_gettex(&ecs->storage, PALETTEKEY),
|
||||
.scale = {.x = 1 + RANDF(), .y = 1.0 / CLOUDSTRETCH, .z = 1},
|
||||
.lighting = NULL, //&ecs->chunklight,
|
||||
//.stoplighting = 0,
|
||||
.stoplighting = 0,
|
||||
.model = cloud,
|
||||
.cullbackface = 1,
|
||||
.context = {ctx},
|
||||
@ -272,7 +291,7 @@ void gen_chunk(render_context *ctx, tecs *ecs, struct vec3i pos) {
|
||||
sprintf(garbage.dynmodel, "e%d", id);
|
||||
haloo3d_obj *model =
|
||||
haloo3d_easystore_addobj(&ecs->storage, garbage.dynmodel);
|
||||
gen_terrain(pos, model, &ecs->storage);
|
||||
uint16_t stoplighting = gen_terrain(pos, model, &ecs->storage);
|
||||
ECS_SETCOMPONENT(ecs, id, ecs_playergarbage) garbage;
|
||||
ECS_SETCOMPONENT(ecs, id, ecs_chunk){.pos = pos};
|
||||
ECS_SETCOMPONENT(ecs, id,
|
||||
@ -286,7 +305,7 @@ void gen_chunk(render_context *ctx, tecs *ecs, struct vec3i pos) {
|
||||
.texture = haloo3d_easystore_gettex(&ecs->storage, PALETTEKEY),
|
||||
.scale = {.x = CHUNKSCALE, .y = CHUNKSCALE * LANDHEIGHT, .z = CHUNKSCALE},
|
||||
.lighting = &ecs->chunklight,
|
||||
//.stoplighting = stoplighting,
|
||||
.stoplighting = stoplighting,
|
||||
.model = model,
|
||||
.cullbackface = 1,
|
||||
.context = {ctx},
|
||||
@ -464,7 +483,7 @@ void sys_renderobject(ecs_placement *p, ecs_object *o, tecs **ecs) {
|
||||
int tris = haloo3d_facef_clip(face, outfaces);
|
||||
if (tris > 0) {
|
||||
uint8_t oflags = rsettings.flags;
|
||||
if (o->lighting) {
|
||||
if (o->lighting && facei < o->stoplighting) {
|
||||
haloo3d_obj_facef(o->model, o->model->faces[facei], baseface);
|
||||
rsettings.intensity =
|
||||
haloo3d_calc_light(lighting.v, o->lighting->minlight, baseface);
|
||||
@ -681,6 +700,9 @@ int main() { // int argc, char **argv) {
|
||||
gen_circle_model(cloudmodel, CLOUDCOL, 32);
|
||||
haloo3d_obj *redflower = haloo3d_easystore_addobj(&ecs.storage, REDFLOWERKEY);
|
||||
gen_flower(redflower, REDFLOWERCOL);
|
||||
haloo3d_obj *yellowflower =
|
||||
haloo3d_easystore_addobj(&ecs.storage, YELLOWFLOWERKEY);
|
||||
gen_flower(yellowflower, YELLOWFLOWERCOL);
|
||||
|
||||
eprintf("Setup ECS system + obj/tex storage (%d bytes)\n", tecs_size);
|
||||
|
||||
|
@ -51,7 +51,7 @@ typedef struct {
|
||||
object_lighting *lighting; // a pointer to lighting, null for none
|
||||
haloo3d_obj *model;
|
||||
haloo3d_fb *texture;
|
||||
// uint16_t stoplighting;
|
||||
uint16_t stoplighting;
|
||||
uint8_t cullbackface; // Whether to cull backfaces (you probably should)
|
||||
uint8_t contextcount; // How many contexts we render into
|
||||
float flatdither; // A flat dither amount. Set to -1 to disable
|
||||
|
Loading…
Reference in New Issue
Block a user