From ac662557dc246b04ad1b9fa755a40ed0ec05d386 Mon Sep 17 00:00:00 2001 From: rodri Date: Mon, 15 Jul 2024 20:06:47 +0000 Subject: fix stack overflow, skybox fov sensibility and scene duplication. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit putting the duplicate camera in a local variable turned out to be a bad idea. bring the dynamic version back. the skybox rendering was affected by the camera fov, which made it look like it was not really at infinity, so set it always to 90°. --- camera.c | 15 ++++++++------- graphics.h | 1 + scene.c | 4 ++-- texture.c | 25 +++++++++++++++++++------ 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/camera.c b/camera.c index 3bf0d89..b6bb5bb 100644 --- a/camera.c +++ b/camera.c @@ -19,9 +19,9 @@ skyboxvs(VSparams *sp) addvattr(sp->v, "dir", VAPoint, &sp->v->p); /* only rotate along with the camera */ - p = sp->v->p; p.w = 0; - p = world2vcs(sp->su->camera, p); p.w = 1; - p = vcs2clip(sp->su->camera, p); + p = sp->v->p; + p.w = 0; p = world2vcs(sp->su->camera, p); + p.w = 1; p = vcs2clip(sp->su->camera, p); /* force the cube to always be on the far plane */ p.z = -p.w; return p; @@ -208,7 +208,6 @@ shootcamera(Camera *c, Shadertab *s) { static Scene *skyboxscene; static Shadertab skyboxshader = { nil, skyboxvs, skyboxfs }; - Camera cam; Model *mdl; Renderjob *job; uvlong t0, t1; @@ -218,8 +217,8 @@ shootcamera(Camera *c, Shadertab *s) job = emalloc(sizeof *job); memset(job, 0, sizeof *job); job->fb = c->view->fbctl->getbb(c->view->fbctl); - cam = *c; - job->camera = &cam; + job->camera = emalloc(sizeof *c); + *job->camera = *c; job->scene = dupscene(c->scene); /* take a snapshot */ job->shaders = s; job->donec = chancreate(sizeof(void*), 0); @@ -239,8 +238,9 @@ shootcamera(Camera *c, Shadertab *s) mdl = mkskyboxmodel(); skyboxscene->addent(skyboxscene, newentity("skybox", mdl)); } - skyboxscene->skybox = c->scene->skybox; job->camera->cullmode = CullNone; + job->camera->fov = 90*DEG; + reloadcamera(job->camera); job->scene = dupscene(skyboxscene); job->shaders = &skyboxshader; sendp(c->rctl->c, job); @@ -254,5 +254,6 @@ shootcamera(Camera *c, Shadertab *s) updatetimes(c, job); chanfree(job->donec); + free(job->camera); free(job); } diff --git a/graphics.h b/graphics.h index 511564e..a0e1c3a 100644 --- a/graphics.h +++ b/graphics.h @@ -360,6 +360,7 @@ Color neartexsampler(Texture*, Point2); Color bilitexsampler(Texture*, Point2); Color sampletexture(Texture*, Point2, Color(*)(Texture*, Point2)); Cubemap *readcubemap(char*[6]); +Cubemap *dupcubemap(Cubemap*); void freecubemap(Cubemap*); Color samplecubemap(Cubemap*, Point3, Color(*)(Texture*, Point2)); diff --git a/scene.c b/scene.c index 95c6203..8a05bc9 100644 --- a/scene.c +++ b/scene.c @@ -322,8 +322,7 @@ dupmodel(Model *m) return nil; nm = newmodel(); - if(m->tex != nil) - nm->tex = duptexture(m->tex); + nm->tex = duptexture(m->tex); if(m->nmaterials > 0){ nm->nmaterials = m->nmaterials; nm->materials = emalloc(nm->nmaterials*sizeof(*nm->materials)); @@ -456,6 +455,7 @@ dupscene(Scene *s) if(s->nents > 0) for(e = s->ents.next; e != &s->ents; e = e->next) ns->addent(ns, dupentity(e)); + ns->skybox = dupcubemap(s->skybox); return ns; } diff --git a/texture.c b/texture.c index c75f29c..b30f829 100644 --- a/texture.c +++ b/texture.c @@ -125,14 +125,9 @@ alloctexture(int type, Memimage *i) Texture * duptexture(Texture *t) { - Texture *nt; - if(t == nil) return nil; - - nt = alloctexture(t->type, nil); - nt->image = dupmemimage(t->image); - return nt; + return alloctexture(t->type, dupmemimage(t->image)); } void @@ -172,6 +167,24 @@ readcubemap(char *paths[6]) return cm; } +Cubemap * +dupcubemap(Cubemap *cm) +{ + Cubemap *ncm; + int i; + + if(cm == nil) + return nil; + + ncm = emalloc(sizeof *ncm); + memset(ncm, 0, sizeof *ncm); + if(cm->name != nil) + ncm->name = strdup(cm->name); + for(i = 0; i < 6; i++) + ncm->faces[i] = duptexture(cm->faces[i]); + return ncm; +} + void freecubemap(Cubemap *cm) { -- cgit v1.2.3