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; }
//---------------------------------------------------------------------------------------------------------------------- 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); }
// 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; }
// 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); }