Пример #1
0
double itemAnimationTime(LWItemID item, int *keys)
{
	double t = 0.0;
	LWChannelID chan[3];
	int		k[3]={0,0,0}, typ;
	LWDVector tim;

	VCLR(tim);
	typ = itemInfo->type(item);
	k[0] = itemKeys(item, LWIP_POSITION, chan,tim);
	k[1] = itemKeys(item, LWIP_ROTATION, chan,tim+1);
	if(typ==LWI_OBJECT)
		k[2] = itemKeys(item, LWIP_SCALING, chan,tim+2);
	else if(typ==LWI_LIGHT)
	{
		LWEnvelopeID intens;
		lightIntensity(item,0.0,&intens);
		if(intens)
			tim[2] = envDuration(intens, &(k[2]));
		k[2] += 2; // catch up to 3-channel types
	}
	t = MAX3(tim[0],tim[1],tim[2]);
	if(keys)
		*keys = MAX3(k[0],k[1],k[2]);
	return t;
}
Пример #2
0
//----------------------------------------------------------------------------------------------------------------------
void grassHair::createShader(){
    //create our shader program
    m_shaderProgram = new ShaderProgram();
    Shader *vert = new Shader("shaders/grassHairVert.glsl", GL_VERTEX_SHADER);
    Shader *geom = new Shader("shaders/grassHairGeom.glsl", GL_GEOMETRY_SHADER);
    Shader *frag = new Shader("shaders/grassHairFrag.glsl", GL_FRAGMENT_SHADER);

    //attach and link our shaders to our program
    m_shaderProgram->attachShader(vert);
    m_shaderProgram->attachShader(geom);
    m_shaderProgram->attachShader(frag);
    m_shaderProgram->link();
    m_shaderProgram->use();


    //get rid of the junk
    delete vert;
    delete geom;
    delete frag;

    glEnable(GL_DEPTH_TEST); // for removal of hidden surfaces

    //set up our light

    GLuint lightPosGrassLoc = m_shaderProgram->getUniformLoc("light.position");
    GLuint lightIntGrassLoc = m_shaderProgram->getUniformLoc("light.intensity");
    GLuint kdGrassLoc = m_shaderProgram->getUniformLoc("Kd");
    GLuint kaGrassLoc = m_shaderProgram->getUniformLoc("Ka");
    GLuint ksGrassLoc = m_shaderProgram->getUniformLoc("Ks");
    GLuint shininessGrassLoc = m_shaderProgram->getUniformLoc("shininess");

    glm::vec4 lightPositon(1.0, 1.0, 1.0, 1.0);
    glm::vec3 lightIntensity(0.8, 0.8, 0.8);
    glUniform4f(lightPosGrassLoc, lightPositon.x, lightPositon.y, lightPositon.z, lightPositon.w);
    glUniform3f(lightIntGrassLoc, lightIntensity.x, lightIntensity.y, lightIntensity.z);
    glUniform3f(kdGrassLoc, 0.5, 0.5, 0.5);
    glUniform3f(kaGrassLoc, 0.5, 0.5, 0.5);
    glUniform3f(ksGrassLoc, 0.5, 0.5, 0.5);
    glUniform1f(shininessGrassLoc, 100.0);

    //set our grass size
    GLuint grassSizeLoc = m_shaderProgram->getUniformLoc("grassSize");
    glUniform1f(grassSizeLoc,m_grassSize);

    //set up our grass texture
    m_grassTexture = new Texture("textures/grassBlade.png");
    m_grassTexture->bind(10);
    GLuint grassBladeTexLoc = m_shaderProgram->getUniformLoc("grassTexture");
    glUniform1i(grassBladeTexLoc, 10);

}
Пример #3
0
// recursive...
static int VRML97_SceneObjWrite (VRMLData *dat,LWItemID id, char *oname)
{
	unsigned int comflags=0,sound=0;
	int k,s,t=1,typ,clockLoop=1, clockTrigger=0,sclockLoop=1, sclockTrigger=1,csiz=0,LOD=0, animated=0; 
	ObjectDB	*odb=NULL;
	LWItemID	kid;
	double	dur=0.0;
 	char cname[84], *com_url=NULL;

	*cname = 0;
	*tagBuf = 0;
	if(getItemTag(itemInfo,id,VTAG_IGNORE"=", tagBuf,MAX_LIGHT_NAME))
	{
			com_url = strtok(tagBuf,"\n");
			fprintf(dat->vr->file,"%s### Intentionally Ignoring %s, and descendants ( %s ) \n",dat->vr->indent,oname,com_url);
			return 0;
	}
	typ = itemInfo->type(id);
	if(typ==LWI_OBJECT)
	{
		odb = getObjectDB(id, GlobalGlobal);

	/*	if(getItemTag(itemInfo,id,VTAG_SEQUENCE"=", cname,MAX_LIGHT_NAME))
		{
			com_url = strtok(cname,"\n");
			if(*com_url)
				sscanf(com_url,"%d %d",&sclockLoop,&sclockTrigger);
			com_url = NULL;
		} */
		if(getItemTag(itemInfo,id,VTAG_MORPH"=", tagBuf,MAX_LIGHT_NAME))
		{
			com_url = strtok(tagBuf,"\n");
			if(*com_url)
			{
				sscanf(com_url,"%d %d %d %d",&k,&t,&s,&sclockLoop);
				t -= k;
			}
			com_url = NULL;
		}
		if(getItemTag(itemInfo,id,VTAG_URL"=", tagBuf,MAX_LIGHT_NAME))
		{
			com_url = strtok(tagBuf,"\n");
			fprintf(dat->vr->file,"%sAnchor { url [ %s ]  children\n",dat->vr->indent,com_url);
		}  // Handle Collision, LOD, BillBoard here too!?
		LOD = findItemTag(itemInfo, id, VTAG_LOD);
	}
	strncpy(tagBuf,(oname),MAX_LIGHT_NAME);
	oname = filepart(oname);
	OpenItemTransform(dat,id,oname);
	if(typ==LWI_OBJECT)
	{
		OpenItemPivotTransform(dat,id,oname);
		if(LOD)
			VRML97_LODNodeWrite(dat,id,oname);
		else
		{
			if( (dat->vr->vrprefs&VRPREF_INCLUDE_OBJS) )
			{
				if( (dat->vr->vrprefs&VRPREF_PROTO_OBJS) )
				{
					if(objInfo->numPolygons(id)) // skip NULLs
						VRML97_ProtoInstWrite(dat,id,oname);
				}
				else
				{
					if(odb)
						VRML2_ObjWrite(dat,odb,"","");
				}
			}
			else
			{
				if( (dat->vr->vrprefs&VRPREF_PROTO_OBJS) )
				{
	#ifndef EXTERNPROTO_WORKING
					VRML97_InlineObjDefWrite(dat,id,odb,oname);
	#else
					if(objInfo->numPolygons(id)) // skip NULLs
						VRML97_ProtoInstWrite(dat,id,oname);
				//	VRML97_ExternProtoWrite(dat,id,oname);
	#endif		
				}
				else
					VRML97_InlineObjDefWrite(dat,id,odb,oname);
			}
		}
	}
	else if(typ==LWI_LIGHT)
		VRML97_LightWrite(dat, id, oname, 0);

	comflags=VRML97_ObjTagsParse(dat,id,oname);
	k = 1;
	for(kid=itemInfo->firstChild(id); kid!=LWITEM_NULL; kid=itemInfo->nextChild(id, kid) )	
	{
		fprintf(dat->vr->file,"%s \t\t # child #%d of %s\n",dat->vr->indent,k++,oname);
		buildItemVRCloneName(kid,cname,84);
		VRML97_SceneObjWrite(dat,kid, cname);	
	}
	sprintf(cname,"%s",oname);

	dur = itemAnimationTime(id,&k);

	//	if( ( k || obj->morfTarg 
	if( ( (k>3) || (comflags&(1UL<<VTAGID_SOUND)) || (comflags&(1UL<<VTAGID_MORPH)) ) )	// any animation
	{
		animated = 1;
		VRML97_TriggerWrite(dat,id,odb,comflags,oname);
	}


	if(typ==LWI_OBJECT)
	{
		CloseItemPivotTransform(dat,id,oname);	// enclose children
		CloseItemTransform(dat,oname);
		if(com_url)
			fprintf(dat->vr->file,"%s} #end Anchor\n",dat->vr->indent);
	}
	else
		CloseItemTransform(dat,oname);

	dur = VRML97_MoveInterpolatorWrite(dat,id,cname, &clockTrigger, &clockLoop);
	if(dur>0.0)
	{
		clockLoop = clockLoop>1 ? 1:0;//(obj->o_motEnv->flags&MOTF_STOP) ? 0:1;
		clockTrigger = clockTrigger>1 ? 1:0; //comflags&(1UL<<VTAGID_AUTOSTART) ? 1:0; //(obj->o_motEnv->flags&(MOTF_STOP|MOTF_REPEAT)) ? 1:0;
		VRML97_SceneClockWrite(dat,cname, clockLoop, clockTrigger,dur, VDEF_TIMER);
	}  
	if(typ==LWI_LIGHT)
	{
		LWEnvelopeID intens;
		lightIntensity(id,0.0,&intens);
		if(intens)
		{
			dur = envDuration(intens, &clockLoop);
			if( (dur>0.0) && clockLoop)
				VRML97_ValueInterpolatorWrite(dat,intens,cname,&clockTrigger,  &clockLoop);
			VRML97_SceneClockWrite(dat,cname, clockLoop, clockTrigger,dur, VDEF_TIMER);
		}
	}
	else if(typ==LWI_OBJECT)
	{
		if( comflags&(1UL<<VTAGID_MORPH) )
		{
			sclockTrigger = comflags&(1UL<<VTAGID_AUTOSTART) ? 1:0;
			if(t)
				dur = ((double)t)/sceneInfo->framesPerSecond;
			VRML97_SceneClockWrite(dat,cname, sclockLoop, sclockTrigger,dur, VDEF_FXTIMER);
		}
	}
	return comflags;

}
Пример #4
0
// connect timers to interpolators
int VRML97_TimerRoutesWrite(VRMLData *dat, LWItemID id, LWChannelID chan, char *name) //, int swtch)
{
	int tot=0;
	if(!id && !chan) 
		return tot;	 
	name = filepart(name);
	if(id)	 
	{	 
		LWDVector tim;
		int		k[3];
		LWChannelID ch[3];
		int mov=0,siz=0,rot=0, typ;
		name = filepart(name);
		typ = itemInfo->type(id);
		k[0] = itemKeys(id, LWIP_POSITION, ch,tim);
		k[1] = itemKeys(id, LWIP_ROTATION, ch,tim+1);
		if(typ==LWI_OBJECT)
		{
			k[2] = itemKeys(id, LWIP_SCALING, ch,tim+2);
			tot = MAX3(k[0],k[1],k[2]);
		}
		else
			tot = MAX(k[0],k[1]);

		if(typ==LWI_OBJECT)
		{
			if(k[0]>3)	 //XYZ
			{
				fprintf(dat->vr->file,"%sROUTE %s"VDEF_TIMER"."FIELD_FRACTION" TO %s"VDEF_MOVER".set_fraction \n",dat->vr->indent,name,name);
				tot++;
				fprintf(dat->vr->file,"%sROUTE %s"VDEF_MOVER".value_changed TO %s"VDEF_XFORM".set_translation \n",dat->vr->indent,name,name);
				tot++;
			}
			if(k[2]>3)	 	// Scale
			{
				fprintf(dat->vr->file,"%sROUTE %s"VDEF_TIMER"."FIELD_FRACTION" TO %s"VDEF_SIZER".set_fraction \n",dat->vr->indent,name,name);
				tot++;
				fprintf(dat->vr->file,"%sROUTE %s"VDEF_SIZER".value_changed TO %s"VDEF_XFORM".set_scale \n",dat->vr->indent,name,name);
				tot++;
			}
			if(k[1]>3)		// HPB
			{
				fprintf(dat->vr->file,"%sROUTE %s"VDEF_TIMER"."FIELD_FRACTION" TO %s"VDEF_ROTATOR".set_fraction \n",dat->vr->indent,name,name);
				tot++;
				fprintf(dat->vr->file,"%sROUTE %s"VDEF_ROTATOR".value_changed TO %s"VDEF_XFORM".set_rotation \n",dat->vr->indent,name,name);
				tot++;
			}
		}
		else if(typ==LWI_LIGHT)	// write ROUTES for intensity, if necessary
		{
			LWEnvelopeID	env;
			if(k[0]>3)	 //XYZ
			{
				fprintf(dat->vr->file,"%sROUTE %s"VDEF_TIMER"."FIELD_FRACTION" TO %s"VDEF_MOVER".set_fraction \n",dat->vr->indent,name,name);
				tot++;
				fprintf(dat->vr->file,"%sROUTE %s"VDEF_MOVER".value_changed TO %s"VDEF_XFORM".set_translation \n",dat->vr->indent,name,name);
				tot++;
			}
			if(k[1]>3)		// HPB
			{
				fprintf(dat->vr->file,"%sROUTE %s"VDEF_TIMER"."FIELD_FRACTION" TO %s"VDEF_ROTATOR".set_fraction \n",dat->vr->indent,name,name);
				tot++;
				fprintf(dat->vr->file,"%sROUTE %s"VDEF_ROTATOR".value_changed TO %s"VDEF_XFORM".set_rotation \n",dat->vr->indent,name,name);
				tot++;
			}
			lightIntensity(id, 0.0, &env);
			if(env)
			{
				tim[2] = envDuration(env, &rot);
				if(rot>1) // keys!!
				{
					fprintf(dat->vr->file,"%sROUTE %s"VDEF_TIMER"."FIELD_FRACTION" TO %s"VDEF_ENVELOPE".set_fraction \n",dat->vr->indent,name,name);
					tot++;
					fprintf(dat->vr->file,"%sROUTE %s"VDEF_ENVELOPE".value_changed TO %s.set_intensity \n",dat->vr->indent,name,name);
					tot++;
				}
			}
		}
		else // Camera: write ROUTES for ViewPoint position, orientation, not Transform
		{
			if(k[0]>3)	 //XYZ
			{
				fprintf(dat->vr->file,"%sROUTE %s"VDEF_TIMER"."FIELD_FRACTION" TO %s"VDEF_MOVER".set_fraction \n",dat->vr->indent,name,name);
				tot++;
				fprintf(dat->vr->file,"%sROUTE %s"VDEF_MOVER".value_changed TO %s.set_position \n",dat->vr->indent,name,name);
				tot++;
			}
			if(k[1]>3)		// HPB
			{
				fprintf(dat->vr->file,"%sROUTE %s"VDEF_TIMER"."FIELD_FRACTION" TO %s"VDEF_ROTATOR".set_fraction \n",dat->vr->indent,name,name);
				tot++;
				fprintf(dat->vr->file,"%sROUTE %s"VDEF_ROTATOR".value_changed TO %s.set_orientation \n",dat->vr->indent,name,name);
				tot++;
			}

		}/*		if(tot && swtch)
		{
			fprintf(dat->vr->file,"%sROUTE %s"VDEF_SWITCH".touchTime TO %s"VDEF_TIMER".startTime \n",dat->vr->indent,name,name);
			tot++;
		} */
	}
	else if(chan)
	{
		fprintf(dat->vr->file,"%sROUTE %s"VDEF_TIMER"."FIELD_FRACTION" TO %s"VDEF_ENVELOPE".set_fraction \n",dat->vr->indent,name,name);
		tot++;
	}
	return tot;
}
//----------------------------------------------------------------------------------------------------------------------
void grassHairClipmap::createShader(){
    //create our shader program
    m_shaderProgram = new ShaderProgram();
    Shader *vert = new Shader("shaders/grassHairClipmapVert.glsl", GL_VERTEX_SHADER);
    Shader *geom = new Shader("shaders/grassHairClipmapGeom.glsl", GL_GEOMETRY_SHADER);
    Shader *frag = new Shader("shaders/grassHairClipmapFrag.glsl", GL_FRAGMENT_SHADER);

    //attach and link our shaders to our program
    m_shaderProgram->attachShader(vert);
    m_shaderProgram->attachShader(geom);
    m_shaderProgram->attachShader(frag);
    m_shaderProgram->link();
    m_shaderProgram->use();


    //get rid of the junk
    delete vert;
    delete geom;
    delete frag;

    glEnable(GL_DEPTH_TEST); // for removal of hidden surfaces

    //set up our light

    GLuint lightPosGrassLoc = m_shaderProgram->getUniformLoc("light.position");
    GLuint lightIntGrassLoc = m_shaderProgram->getUniformLoc("light.intensity");
    GLuint kdGrassLoc = m_shaderProgram->getUniformLoc("Kd");
    GLuint kaGrassLoc = m_shaderProgram->getUniformLoc("Ka");
    GLuint ksGrassLoc = m_shaderProgram->getUniformLoc("Ks");
    GLuint shininessGrassLoc = m_shaderProgram->getUniformLoc("shininess");

    glm::vec4 lightPositon(1.0, 1.0, 1.0, 1.0);
    glm::vec3 lightIntensity(0.8, 0.8, 0.8);
    glUniform4f(lightPosGrassLoc, lightPositon.x, lightPositon.y, lightPositon.z, lightPositon.w);
    glUniform3f(lightIntGrassLoc, lightIntensity.x, lightIntensity.y, lightIntensity.z);
    glUniform3f(kdGrassLoc, 0.5, 0.5, 0.5);
    glUniform3f(kaGrassLoc, 0.5, 0.5, 0.5);
    glUniform3f(ksGrassLoc, 0.5, 0.5, 0.5);
    glUniform1f(shininessGrassLoc, 100.0);

    //set our grass size
    GLuint grassSizeLoc = m_shaderProgram->getUniformLoc("grassSize");
    GLuint grassHeightLoc = m_shaderProgram->getUniformLoc("grassHeight");
    GLuint heightMapLoc = m_shaderProgram->getUniformLoc("geoTexture");
    GLuint heightScaleLoc = m_shaderProgram->getUniformLoc("heightScale");
    m_timeLoc = m_shaderProgram->getUniformLoc("time");
    GLuint windDirLoc = m_shaderProgram->getUniformLoc("windDir");
    GLuint windStrengthLoc = m_shaderProgram->getUniformLoc("windStrength");
    GLuint scaleLoc = m_shaderProgram->getUniformLoc("scale");

    glUniform1f(heightScaleLoc,4);
    glUniform4f(scaleLoc, 2, 2, 2, 1.0);
    glUniform1f(windStrengthLoc,0.01);
    glUniform3f(windDirLoc,1.0,0.0,0.0);
    glUniform1f(m_timeLoc,clock()/CLOCKS_PER_SEC);
    glUniform1f(grassHeightLoc,m_grassHeight);
    glUniform1f(grassSizeLoc,m_grassSize);

    //set up our grass texture
    m_grassTexture = new Texture("textures/grassBlade.png");
    m_grassTexture->bind(10);
    GLuint grassBladeTexLoc = m_shaderProgram->getUniformLoc("grassTexture");
    glUniform1i(grassBladeTexLoc, 10);
    m_heightmapTex->bind(2);
    glUniform1i(heightMapLoc,2);

    // fog uniforms
    GLuint fogMaxLoc = m_shaderProgram->getUniformLoc("fogMax");
    GLuint fogMinLoc = m_shaderProgram->getUniformLoc("fogMin");

    glUniform1f(fogMaxLoc, 4.0);
    glUniform1f(fogMinLoc, 3.0);

}