void ExecImplicitStmt(Stmt *stmt) { ImplicitStmtData *sd = (ImplicitStmtData *)stmt->data; Vec3 bmin, bmax, steps; Object *obj, *oldobj; V3Set(&bmin, -1.0, -1.0, -1.0); V3Set(&bmax, 1.0, 1.0, 1.0); assert(sd->fn != NULL); assert(sd->bmin != NULL); assert(sd->bmax != NULL); ExprEvalVector(sd->bmin, &bmin); ExprEvalVector(sd->bmax, &bmax); if(sd->steps != NULL) ExprEvalVector(sd->steps, &steps); else V3Set(&steps, 32.0, 32.0, 32.0); if((obj = Ray_MakeImplicit(sd->fn, &bmin, &bmax, &steps)) != NULL) { /* The ray tracer now has the fn expr, set the stmt's ptr to */ /* NULL so that DeleteImplicitStmt() will not delete it. */ /* The ray tracer will delete it when finished. */ sd->fn = NULL; obj->surface = Ray_ShareSurface(default_surface); ScnBuild_AddObject(obj); oldobj = objstack_ptr->curobj; objstack_ptr->curobj = obj; ExecBlock(stmt, sd->block); objstack_ptr->curobj = oldobj; } }
void ExecLoadImageMapStmt(Stmt *stmt) { LoadImageMapStmtData *sd = (LoadImageMapStmtData *)stmt->data; ColorMap *old_cmap = cur_cmap; if((cur_cmap = ColorMap_Create()) != NULL) { if(Symbol_AddLocal(sd->name, DECL_COLOR_MAP, 0, (void *)cur_cmap)) ExecBlock(stmt, sd->block); /* Note: Color map will be deleted if symbol table fails to add it. */ } cur_cmap = old_cmap; }
void ExecTriangleStmt(Stmt *stmt) { TriangleStmtData *sd = (TriangleStmtData *)stmt->data; float pts[9], norms[9], uv[6]; float *ppts, *pnorms, *puv; Vec3 v; Object *obj, *oldobj; ppts = pnorms = puv = NULL; assert(sd->pt1 != NULL); assert(sd->pt2 != NULL); assert(sd->pt3 != NULL); ExprEvalVector(sd->pt1, &v); pts[0] = (float)v.x; pts[1] = (float)v.y; pts[2] = (float)v.z; ExprEvalVector(sd->pt2, &v); pts[3] = (float)v.x; pts[4] = (float)v.y; pts[5] = (float)v.z; ExprEvalVector(sd->pt3, &v); pts[6] = (float)v.x; pts[7] = (float)v.y; pts[8] = (float)v.z; ppts = pts; if (sd->n1 != NULL) { assert(sd->n2 != NULL); assert(sd->n3 != NULL); ExprEvalVector(sd->n1, &v); norms[0] = (float)v.x; norms[1] = (float)v.y; norms[2] = (float)v.z; ExprEvalVector(sd->n2, &v); norms[3] = (float)v.x; norms[4] = (float)v.y; norms[5] = (float)v.z; ExprEvalVector(sd->n3, &v); norms[6] = (float)v.x; norms[7] = (float)v.y; norms[8] = (float)v.z; pnorms = norms; } if (sd->u != NULL) { assert(sd->v != NULL); ExprEvalVector(sd->u, &v); uv[0] = (float)v.x; uv[2] = (float)v.y; uv[4] = (float)v.z; ExprEvalVector(sd->v, &v); uv[1] = (float)v.x; uv[3] = (float)v.y; uv[5] = (float)v.z; puv = uv; } if ((obj = Ray_MakeTriangle(ppts, pnorms, puv)) != NULL) { obj->surface = Ray_ShareSurface(default_surface); ScnBuild_AddObject(obj); oldobj = objstack_ptr->curobj; objstack_ptr->curobj = obj; ExecBlock(stmt, sd->block); objstack_ptr->curobj = oldobj; } }
// // Cineractive::GameTimeSim // void Cineractive::GameTimeSim() { if (moviePrim) { if (moviePrim->done) { delete moviePrim; moviePrim = NULL; } else { moviePrim->Notify(0x7FEF2C7B); // "CycleTick" return; } } // Currently elapsed seconds elapsedCycles = GameTime::GameCycle() - startCycle; // Any new instructions to instantiate? while (nextScope && (nextCycle <= elapsedCycles && !moviePrim)) { ExecBlock(nextScope); NextInstruction(); } // Send all primitives a cycle tick message NList<Prim>::Iterator i(&primitiveList); Prim *prim; while ((prim = i++) != NULL) { if (prim->done) { primitiveList.Dispose(prim); } else { prim->Notify(0x7FEF2C7B); // "CycleTick" } } }
void ExecInfiniteLightStmt(Stmt *stmt) { InfiniteLightStmtData *lsd = (InfiniteLightStmtData *)stmt->data; Light *light, *prev_light; Vec3 dir, color; V3Set(&dir, 0.0, 0.0, -1.0); V3Set(&color, 1.0, 1.0, 1.0); if(lsd->dir != NULL) ExprEvalVector(lsd->dir, &dir); if(lsd->color != NULL) ExprEvalVector(lsd->color, &color); if((light = Ray_MakeInfiniteLight(&dir, &color)) != NULL) { prev_light = cur_light; cur_light = light; ExecBlock(stmt, lsd->block); Ray_AddLight(&ray_setup_data->lights, light); cur_light = prev_light; } }
void ExecLightStmt(Stmt *stmt) { LightStmtData *lsd = (LightStmtData *)stmt->data; Light *light, *prev_light; Vec3 from, color; double falloff; V3Set(&from, 0.0, 0.0, 0.0); V3Set(&color, 1.0, 1.0, 1.0); falloff = 0.0; if(lsd->from != NULL) ExprEvalVector(lsd->from, &from); if(lsd->color != NULL) ExprEvalVector(lsd->color, &color); if(lsd->falloff != NULL) falloff = ExprEvalDouble(lsd->falloff); if((light = Ray_MakePointLight(&from, &color, falloff)) != NULL) { prev_light = cur_light; cur_light = light; ExecBlock(stmt, lsd->block); Ray_AddLight(&ray_setup_data->lights, light); cur_light = prev_light; } }