summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--camera.c15
-rw-r--r--graphics.h1
-rw-r--r--scene.c4
-rw-r--r--texture.c25
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)
{