summaryrefslogtreecommitdiff
path: root/camera.c
diff options
context:
space:
mode:
authorrodri <rgl@antares-labs.eu>2024-07-15 20:06:47 +0000
committerrodri <rgl@antares-labs.eu>2024-07-15 20:06:47 +0000
commitac662557dc246b04ad1b9fa755a40ed0ec05d386 (patch)
treec858909b501bd3210dc3c13340b9085d0ccc6923 /camera.c
parent5f10c82aad318fc9091c9bd612e89fda1a77009f (diff)
downloadlibgraphics-ac662557dc246b04ad1b9fa755a40ed0ec05d386.tar.gz
libgraphics-ac662557dc246b04ad1b9fa755a40ed0ec05d386.tar.bz2
libgraphics-ac662557dc246b04ad1b9fa755a40ed0ec05d386.zip
fix stack overflow, skybox fov sensibility and scene duplication.
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°.
Diffstat (limited to 'camera.c')
-rw-r--r--camera.c15
1 files changed, 8 insertions, 7 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);
}