Exemplo n.º 1
0
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;
	}
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
	}
}
Exemplo n.º 4
0
    //
    // 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"
        }
      }
    }
Exemplo n.º 5
0
Arquivo: light.c Projeto: oleavitt/gem
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;
	}
}
Exemplo n.º 6
0
Arquivo: light.c Projeto: oleavitt/gem
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;
	}
}