void ofApp::draw(){ fbo_->draw(0,0); for (size_t eachPart = 0; eachPart < robotParticles_->numParticles_; ++eachPart) { drawParticle(robotParticles_->theParticles_[eachPart]->pose_.x_, robotParticles_->theParticles_[eachPart]->pose_.y_, robotParticles_->theParticles_[eachPart]->pose_.theta_); } /// OPTIONAL: draw the simulated robot and its laser. drawLaser(*simBot_); drawParticle(simBot_->pose_.x_, simBot_->pose_.y_, simBot_->pose_.theta_); /// This function has been moved here such that the first iteration /// is visible in the window. if ((MotionModel::rWheelDelta_ != 0.0) || (MotionModel::lWheelDelta_ != 0.0)) { robotParticles_->sampleAndReplace(); } }
// Disparo, usa el patrón template void CShootRaycast::primaryShoot() { if(_primaryCanShoot && _currentAmmo > 0){ _primaryCanShoot = false; _primaryCooldownTimer = 0; drawParticle("shootParticle"); decrementAmmo(); for(int i = 0; i < _numberShots; ++i) { CEntity* entityHit = fireWeapon(); if(entityHit != NULL) { triggerHitMessages(entityHit); } } //Sonido de disparo emitSound(_audioShoot, "audioShoot"); //Mensaje de dispersion en mira /*std::shared_ptr<CMessageHudDispersion> dispersionMsg = std::make_shared<CMessageHudDispersion>(); _entity->emitMessage(dispersionMsg);*/ } else if(_currentAmmo == 0) { // Ejecutar sonidos y animaciones de falta de balas emitSound(_noAmmo, "noAmmo", true); } }// shoot
void Star::drawAllParticles() { glEnable(GL_TEXTURE_2D); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D( GL_TEXTURE_2D, 0, 3, this->particleImage.getWidth(), this->particleImage.getHeight(), 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, this->particleImage.getBits() ); glBindTexture(GL_TEXTURE_2D, particleTexture); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); particles.updateAll(); for(int i = 0; i < particles.getNumberOfParticles(); i++) { drawParticle(particles.getNextParticle()); } }
int displayParticle(pScene sc,pMesh mesh) { pParticle pp; pStream st; int k; st = sc->stream; if ( sc->par.advtim ) for (k=1; k<=st->nbstl; k++) computeTetraParticle(sc,mesh,k); /* redraw particles */ for (k=1; k<=st->nbstl; k++) { pp = &tp[k]; if ( pp->flag ) drawParticle(sc,pp); } return(1); }
void facade::draw() { ofBackground(0, 0, 0); ofSetColor(255); //Particles if(doRender) { ofEnableAlphaBlending(); // center scene glPushMatrix(); glTranslatef(width/2, 0, -width / 3); glRotatef(rotation, 0, 1, 0); if(forceTimer) { float translateMax = forceTimer; glTranslatef(ofRandom(-translateMax, translateMax), ofRandom(-translateMax, translateMax), ofRandom(-translateMax, translateMax)); forceTimer--; } /* // enable back-face culling (so we can see through the walls) glCullFace(GL_BACK); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); ofFill(); glBegin(GL_QUADS); // draw right wall glColor3f(.1, 0.1, 0.1); glVertex3f(width/2, height+1, width/2); glColor3f(0, 0, 0); glVertex3f(width/2, -height, width/2); glColor3f(0.05, 0.05, 0.05); glVertex3f(width/2, -height, -width/2); glColor3f(.15, 0.15, 0.15); glVertex3f(width/2, height+1, -width/2); // back wall glColor3f(.1, 0.1, 0.1); glVertex3f(width/2, height+1, -width/2); glColor3f(0, 0, 0); glVertex3f(width/2, -height, -width/2); glColor3f(0.05, 0.05, 0.05); glVertex3f(-width/2, -height, -width/2); glColor3f(.15, 0.15, 0.15); glVertex3f(-width/2, height+1, -width/2); // left wall glColor3f(.1, 0.1, 0.1); glVertex3f(-width/2, height+1, -width/2); glColor3f(0, 0, 0); glVertex3f(-width/2, -height, -width/2); glColor3f(0.05, 0.05, 0.05); glVertex3f(-width/2, -height, width/2); glColor3f(.15, 0.15, 0.15); glVertex3f(-width/2, height+1, width/2); // front wall glColor3f(0.05, 0.05, 0.05); glVertex3f(width/2, -height, width/2); glColor3f(.15, 0.15, 0.15); glVertex3f(width/2, height+1, width/2); glColor3f(.1, 0.1, 0.1); glVertex3f(-width/2, height+1, width/2); glColor3f(0, 0, 0); glVertex3f(-width/2, -height, width/2); // floor glColor3f(.2, 0.2, 0.2); glVertex3f(width/2, height+1, width/2); glVertex3f(width/2, height+1, -width/2); glVertex3f(-width/2, height+1, -width/2); glVertex3f(-width/2, height+1, width/2); glEnd(); glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); */ //canvas glRotatef(rotation, 0, -1, 0); if(config::useCanvas) { canvas.begin(); ofSetColor(255, canvasFade); canvasTrace.draw(0,0); glTranslatef(width/2, 0, -width / 3); } glRotatef(rotation, 0, 1, 0); //particles //glAlphaFunc(GL_GREATER, 0.5); if(currentSkeletonIndex>=0 && false){ ofPolyline pLine; ofPushStyle(); ofSetColor(255, 0, 0); ofNoFill(); ofSetLineWidth(4); // HEAD pLine.clear(); pLine.addVertex(bone[NUI_SKELETON_POSITION_HIP_CENTER]->getPosition().x, bone[NUI_SKELETON_POSITION_HIP_CENTER]->getPosition().y, bone[NUI_SKELETON_POSITION_HIP_CENTER]->getPosition().z); pLine.addVertex(bone[NUI_SKELETON_POSITION_SPINE]->getPosition().x, bone[NUI_SKELETON_POSITION_SPINE]->getPosition().y, bone[NUI_SKELETON_POSITION_SPINE]->getPosition().z); pLine.addVertex(bone[NUI_SKELETON_POSITION_SHOULDER_CENTER]->getPosition().x, bone[NUI_SKELETON_POSITION_SHOULDER_CENTER]->getPosition().y, bone[NUI_SKELETON_POSITION_SHOULDER_CENTER]->getPosition().z); pLine.addVertex(bone[NUI_SKELETON_POSITION_HEAD]->getPosition().x, bone[NUI_SKELETON_POSITION_HEAD]->getPosition().y, bone[NUI_SKELETON_POSITION_HEAD]->getPosition().z); pLine.draw(); // BODY_LEFT pLine.clear(); pLine.addVertex(bone[NUI_SKELETON_POSITION_SHOULDER_CENTER]->getPosition().x, bone[NUI_SKELETON_POSITION_SHOULDER_CENTER]->getPosition().y, bone[NUI_SKELETON_POSITION_SHOULDER_CENTER]->getPosition().z); pLine.addVertex(bone[NUI_SKELETON_POSITION_SHOULDER_LEFT]->getPosition().x, bone[NUI_SKELETON_POSITION_SHOULDER_LEFT]->getPosition().y, bone[NUI_SKELETON_POSITION_SHOULDER_LEFT]->getPosition().z); pLine.addVertex(bone[NUI_SKELETON_POSITION_ELBOW_LEFT]->getPosition().x, bone[NUI_SKELETON_POSITION_ELBOW_LEFT]->getPosition().y, bone[NUI_SKELETON_POSITION_ELBOW_LEFT]->getPosition().z); pLine.addVertex(bone[NUI_SKELETON_POSITION_WRIST_LEFT]->getPosition().x, bone[NUI_SKELETON_POSITION_WRIST_LEFT]->getPosition().y, bone[NUI_SKELETON_POSITION_WRIST_LEFT]->getPosition().z); pLine.addVertex(bone[NUI_SKELETON_POSITION_HAND_LEFT]->getPosition().x, bone[NUI_SKELETON_POSITION_HAND_LEFT]->getPosition().y, bone[NUI_SKELETON_POSITION_HAND_LEFT]->getPosition().z); pLine.draw(); // BODY_RIGHT pLine.clear(); pLine.addVertex(bone[NUI_SKELETON_POSITION_SHOULDER_CENTER]->getPosition().x, bone[NUI_SKELETON_POSITION_SHOULDER_CENTER]->getPosition().y, bone[NUI_SKELETON_POSITION_SHOULDER_CENTER]->getPosition().z); pLine.addVertex(bone[NUI_SKELETON_POSITION_SHOULDER_RIGHT]->getPosition().x, bone[NUI_SKELETON_POSITION_SHOULDER_RIGHT]->getPosition().y, bone[NUI_SKELETON_POSITION_SHOULDER_RIGHT]->getPosition().z); pLine.addVertex(bone[NUI_SKELETON_POSITION_ELBOW_RIGHT]->getPosition().x, bone[NUI_SKELETON_POSITION_ELBOW_RIGHT]->getPosition().y, bone[NUI_SKELETON_POSITION_ELBOW_RIGHT]->getPosition().z); pLine.addVertex(bone[NUI_SKELETON_POSITION_WRIST_RIGHT]->getPosition().x, bone[NUI_SKELETON_POSITION_WRIST_RIGHT]->getPosition().y, bone[NUI_SKELETON_POSITION_WRIST_RIGHT]->getPosition().z); pLine.addVertex(bone[NUI_SKELETON_POSITION_HAND_RIGHT]->getPosition().x, bone[NUI_SKELETON_POSITION_HAND_RIGHT]->getPosition().y, bone[NUI_SKELETON_POSITION_HAND_RIGHT]->getPosition().z); pLine.draw(); // LEG_LEFT pLine.clear(); pLine.addVertex(bone[NUI_SKELETON_POSITION_HIP_CENTER]->getPosition().x, bone[NUI_SKELETON_POSITION_HIP_CENTER]->getPosition().y, bone[NUI_SKELETON_POSITION_HIP_CENTER]->getPosition().z); pLine.addVertex(bone[NUI_SKELETON_POSITION_HIP_LEFT]->getPosition().x, bone[NUI_SKELETON_POSITION_HIP_LEFT]->getPosition().y, bone[NUI_SKELETON_POSITION_HIP_LEFT]->getPosition().z); pLine.addVertex(bone[NUI_SKELETON_POSITION_KNEE_LEFT]->getPosition().x, bone[NUI_SKELETON_POSITION_KNEE_LEFT]->getPosition().y, bone[NUI_SKELETON_POSITION_KNEE_LEFT]->getPosition().z); pLine.addVertex(bone[NUI_SKELETON_POSITION_ANKLE_LEFT]->getPosition().x, bone[NUI_SKELETON_POSITION_ANKLE_LEFT]->getPosition().y, bone[NUI_SKELETON_POSITION_ANKLE_LEFT]->getPosition().z); pLine.addVertex(bone[NUI_SKELETON_POSITION_FOOT_LEFT]->getPosition().x, bone[NUI_SKELETON_POSITION_FOOT_LEFT]->getPosition().y, bone[NUI_SKELETON_POSITION_FOOT_LEFT]->getPosition().z); pLine.draw(); // LEG_RIGHT pLine.clear(); pLine.addVertex(bone[NUI_SKELETON_POSITION_HIP_CENTER]->getPosition().x, bone[NUI_SKELETON_POSITION_HIP_CENTER]->getPosition().y, bone[NUI_SKELETON_POSITION_HIP_CENTER]->getPosition().z); pLine.addVertex(bone[NUI_SKELETON_POSITION_HIP_RIGHT]->getPosition().x, bone[NUI_SKELETON_POSITION_HIP_RIGHT]->getPosition().y, bone[NUI_SKELETON_POSITION_HIP_RIGHT]->getPosition().z); pLine.addVertex(bone[NUI_SKELETON_POSITION_KNEE_RIGHT]->getPosition().x, bone[NUI_SKELETON_POSITION_KNEE_RIGHT]->getPosition().y, bone[NUI_SKELETON_POSITION_KNEE_RIGHT]->getPosition().z); pLine.addVertex(bone[NUI_SKELETON_POSITION_ANKLE_RIGHT]->getPosition().x, bone[NUI_SKELETON_POSITION_ANKLE_RIGHT]->getPosition().y, bone[NUI_SKELETON_POSITION_ANKLE_RIGHT]->getPosition().z); pLine.addVertex(bone[NUI_SKELETON_POSITION_FOOT_RIGHT]->getPosition().x, bone[NUI_SKELETON_POSITION_FOOT_RIGHT]->getPosition().y, bone[NUI_SKELETON_POSITION_FOOT_RIGHT]->getPosition().z); pLine.draw(); ofPopStyle(); } ofEnableNormalizedTexCoords(); ballImage.getTextureReference().bind(); msa::physics::Particle3D *p; float alpha; int red, green, blue; for(int i=0; i<physics.numberOfParticles(); i++) { p = physics.getParticle(i); if(!p->isFixed()){ red = particleColor.r*colorSpaceVariation + ofMap(p->getPosition().x, -width/2, width/2, 0, 255-(255*colorSpaceVariation)); green = particleColor.g*colorSpaceVariation + ofMap(p->getPosition().y, -height, height, 0, 255-(255*colorSpaceVariation)); blue = particleColor.b*colorSpaceVariation + ofMap(p->getPosition().z, -width/2, width/2, 0, 255-(255*colorSpaceVariation)); // draw ball glPushMatrix(); glTranslatef(p->getPosition().x, p->getPosition().y, p->getPosition().z); glRotatef(180-rotation, 0, 1, 0); ofSetColor(red, green, blue); drawParticle(p->getRadius()); glPopMatrix(); //draw shadow alpha = ofMap(p->getPosition().y, -height * 1.5, height, 0, 1); if(alpha>0) { glPushMatrix(); glTranslatef(p->getPosition().x, height, p->getPosition().z); glRotatef(-90, 1, 0, 0); ofSetColor(red, green, blue, alpha * alpha * alpha * alpha * 255); drawParticle(p->getRadius() * alpha); glPopMatrix(); } } } ballImage.getTextureReference().unbind(); ofDisableNormalizedTexCoords(); if(config::useCanvas) { canvas.end(); } glPopMatrix(); if(config::useCanvas) { canvasTrace.begin(); /*glColorMask(FALSE, FALSE, FALSE, TRUE); glClearColor(0.0f, 0.0f, 0.0f, 0.5f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColorMask(TRUE, TRUE, TRUE, TRUE);*/ ofSetColor(255); canvas.draw(0,0); canvasTrace.end(); canvasTrace.draw(0,canvasY); canvas.begin(); ofClear(0); canvas.end(); } if(blackout>0){ ofSetColor(0,0,0,blackout); ofRect(0,0,0,width, height); } ofDisableAlphaBlending(); } /* // HEAD pLine.clear(); pLine.addVertex(src[NUI_SKELETON_POSITION_HIP_CENTER].x, src[NUI_SKELETON_POSITION_HIP_CENTER].y); pLine.addVertex(src[NUI_SKELETON_POSITION_SPINE].x, src[NUI_SKELETON_POSITION_SPINE].y); pLine.addVertex(src[NUI_SKELETON_POSITION_SHOULDER_CENTER].x, src[NUI_SKELETON_POSITION_SHOULDER_CENTER].y); pLine.addVertex(src[NUI_SKELETON_POSITION_HEAD].x, src[NUI_SKELETON_POSITION_HEAD].y); pLine.draw(); // BODY_LEFT pLine.clear(); pLine.addVertex(src[NUI_SKELETON_POSITION_SHOULDER_CENTER].x, src[NUI_SKELETON_POSITION_SHOULDER_CENTER].y); pLine.addVertex(src[NUI_SKELETON_POSITION_SHOULDER_LEFT].x, src[NUI_SKELETON_POSITION_SHOULDER_LEFT].y); pLine.addVertex(src[NUI_SKELETON_POSITION_ELBOW_LEFT].x, src[NUI_SKELETON_POSITION_ELBOW_LEFT].y); pLine.addVertex(src[NUI_SKELETON_POSITION_WRIST_LEFT].x, src[NUI_SKELETON_POSITION_WRIST_LEFT].y); pLine.addVertex(src[NUI_SKELETON_POSITION_HAND_LEFT].x, src[NUI_SKELETON_POSITION_HAND_LEFT].y); pLine.draw(); // BODY_RIGHT pLine.clear(); pLine.addVertex(src[NUI_SKELETON_POSITION_SHOULDER_CENTER].x, src[NUI_SKELETON_POSITION_SHOULDER_CENTER].y); pLine.addVertex(src[NUI_SKELETON_POSITION_SHOULDER_RIGHT].x, src[NUI_SKELETON_POSITION_SHOULDER_RIGHT].y); pLine.addVertex(src[NUI_SKELETON_POSITION_ELBOW_RIGHT].x, src[NUI_SKELETON_POSITION_ELBOW_RIGHT].y); pLine.addVertex(src[NUI_SKELETON_POSITION_WRIST_RIGHT].x, src[NUI_SKELETON_POSITION_WRIST_RIGHT].y); pLine.addVertex(src[NUI_SKELETON_POSITION_HAND_RIGHT].x, src[NUI_SKELETON_POSITION_HAND_RIGHT].y); pLine.draw(); // LEG_LEFT pLine.clear(); pLine.addVertex(src[NUI_SKELETON_POSITION_HIP_CENTER].x, src[NUI_SKELETON_POSITION_HIP_CENTER].y); pLine.addVertex(src[NUI_SKELETON_POSITION_HIP_LEFT].x, src[NUI_SKELETON_POSITION_HIP_LEFT].y); pLine.addVertex(src[NUI_SKELETON_POSITION_KNEE_LEFT].x, src[NUI_SKELETON_POSITION_KNEE_LEFT].y); pLine.addVertex(src[NUI_SKELETON_POSITION_ANKLE_LEFT].x, src[NUI_SKELETON_POSITION_ANKLE_LEFT].y); pLine.addVertex(src[NUI_SKELETON_POSITION_FOOT_LEFT].x, src[NUI_SKELETON_POSITION_FOOT_LEFT].y); pLine.draw(); // LEG_RIGHT pLine.clear(); pLine.addVertex(src[NUI_SKELETON_POSITION_HIP_CENTER].x, src[NUI_SKELETON_POSITION_HIP_CENTER].y); pLine.addVertex(src[NUI_SKELETON_POSITION_HIP_RIGHT].x, src[NUI_SKELETON_POSITION_HIP_RIGHT].y); pLine.addVertex(src[NUI_SKELETON_POSITION_KNEE_RIGHT].x, src[NUI_SKELETON_POSITION_KNEE_RIGHT].y); pLine.addVertex(src[NUI_SKELETON_POSITION_ANKLE_RIGHT].x, src[NUI_SKELETON_POSITION_ANKLE_RIGHT].y); pLine.addVertex(src[NUI_SKELETON_POSITION_FOOT_RIGHT].x, src[NUI_SKELETON_POSITION_FOOT_RIGHT].y); pLine.draw();*/ //glDisable(GL_BLEND); if(showFPS) { glColor4f(1, 1, 1, 1); ofDrawBitmapString(" FPS: " + ofToString(ofGetFrameRate(), 2) + " | particles: " + ofToString(physics.numberOfParticles(), 2) + " | springs: " + ofToString(physics.numberOfSprings(), 2) , 20, 15); } }
void MyGLWidget::paintGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer glLoadIdentity(); // Reset The Current Modelview Matrix glTranslatef(0, 0, -10); glBindTexture(GL_TEXTURE_2D,texture[0]); for (loop = 0; loop < MAX_PARTICLES; loop++) { if (particle[loop].active) { float x = particle[loop].x; float y = particle[loop].y; float z = particle[loop].z; glColor4f(particle[loop].r,particle[loop].g,particle[loop].b,particle[loop].life); drawParticle(x, y, z); particle[loop].x += particle[loop].xi/(slowdown*1000); // Move On The X Axis By X Speed particle[loop].y += particle[loop].yi/(slowdown*1000); // Move On The Y Axis By Y Speed particle[loop].z += particle[loop].zi/(slowdown*1000); // Move On The Z Axis By Z Speed particle[loop].xi += particle[loop].xg; // Take Pull On X Axis Into Account particle[loop].yi += particle[loop].yg; // Take Pull On Y Axis Into Account particle[loop].zi += particle[loop].zg; // Take Pull On Z Axis Into Account particle[loop].life-=particle[loop].fade; // Reduce Particles Life By 'Fade' if (particle[loop].life < 0.0f) { particle[loop].life=1.0f; // Give It New Life particle[loop].fade=float(rand()%100)/1000.0f+0.003f; // Random Fade Value particle[loop].x=0.0f; // Center On X Axis particle[loop].y=0.0f; // Center On Y Axis particle[loop].z=0.0f; // Center On Z Axis particle[loop].xi=xspeed+float((rand()%60)-32.0f); // X Axis Speed And Direction particle[loop].yi=yspeed+float((rand()%60)-30.0f); // Y Axis Speed And Direction particle[loop].zi=float((rand()%60)-30.0f); // Z Axis Speed And Direction particle[loop].r=colors[col][0]; // Select Red From Color Table particle[loop].g=colors[col][1]; // Select Green From Color Table particle[loop].b=colors[col][2]; // Select Blue From Color Table } if (num8 && (particle[loop].yg < 1.5f)) particle[loop].yg += 0.01f; if (num2 && (particle[loop].yg > -1.5f)) particle[loop].yg -= 0.01f; if (num6 && (particle[loop].xg < 1.5f)) particle[loop].xg += 0.01f; if (num4 && (particle[loop].xg > -1.5f)) particle[loop].xg -= 0.01f; if (tab) { particle[loop].x=0.0f; // Center On X Axis particle[loop].y=0.0f; // Center On Y Axis particle[loop].z=0.0f; // Center On Z Axis particle[loop].xi=float((rand()%50)-26.0f)*10.0f; // Random Speed On X Axis particle[loop].yi=float((rand()%50)-25.0f)*10.0f; // Random Speed On Y Axis particle[loop].zi=float((rand()%50)-25.0f)*10.0f; // Random Speed On Z Axis } } } if (rainbow && delay > 25) { delay = 0; col++; if (col > 11) col = 0; } delay++; }
// Draw Method void Draw() { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glClearColor(0.3f, 0.3f, 0.3f, 1.f); glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT); GLint projection_uniform; GLint world_uniform; mat4 projectionMatrix = esgiOrtho(0.f, 800.f, 600.f, 0.f, 0.f, 1.f); GLint position_attr; GLint texcoord_attr; GLint sampler_uniform; float angle = 0.f; mat4 worldMatrix; worldMatrix.Identity(); worldMatrix = esgiRotateZ(angle); worldMatrix.I.x = 800.f / 1.6f; worldMatrix.J.y = 600.f /1.6f; /** * Draw Sky - Start */ programObject = shaders.UseShader("Sky"); position_attr = glGetAttribLocation(programObject, "a_Position"); texcoord_attr = glGetAttribLocation(programObject, "a_TexCoords"); projection_uniform = glGetUniformLocation(programObject, "u_ProjectionMatrix"); world_uniform = glGetUniformLocation(programObject, "u_WorldMatrix"); glVertexAttribPointer(position_attr, 3, GL_FLOAT, false, sizeof(Vertex), vertices); glVertexAttribPointer(texcoord_attr, 2, GL_FLOAT, false, sizeof(Vertex), &vertices[0].texcoords); glEnableVertexAttribArray(position_attr); glEnableVertexAttribArray(texcoord_attr); glUniformMatrix4fv(projection_uniform, 1, false, &projectionMatrix.I.x); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textures["Sky"]); sampler_uniform = glGetUniformLocation(programObject, "u_Texture"); glUniform1i(sampler_uniform, 0); worldMatrix.T.set(400.f, 300.f, 0.f, 1.0f); glUniformMatrix4fv(world_uniform, 1, false, &worldMatrix.I.x); glDrawArrays(GL_TRIANGLES, 0, VertexCount); glDisableVertexAttribArray(position_attr); glDisableVertexAttribArray(texcoord_attr); shaders.UnUseShader("sky"); /** * Draw Sky - End */ /** * Draw Clouds - Start */ programObject = shaders.UseShader("Clouds"); position_attr = glGetAttribLocation(programObject, "a_Position"); texcoord_attr = glGetAttribLocation(programObject, "a_TexCoords"); projection_uniform = glGetUniformLocation(programObject, "u_ProjectionMatrix"); world_uniform = glGetUniformLocation(programObject, "u_WorldMatrix"); GLint time_uniform = glGetUniformLocation(programObject, "u_Time"); glVertexAttribPointer(position_attr, 3, GL_FLOAT, false, sizeof(Vertex), vertices); glVertexAttribPointer(texcoord_attr, 2, GL_FLOAT, false, sizeof(Vertex), &vertices[0].texcoords); glUniformMatrix4fv(projection_uniform, 1, false, &projectionMatrix.I.x); glEnableVertexAttribArray(position_attr); glEnableVertexAttribArray(texcoord_attr); glUniform1f(time_uniform, t); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textures["Clouds"]); sampler_uniform = glGetUniformLocation(programObject, "u_Texture"); glUniform1i(sampler_uniform, 0); worldMatrix.T.set(400.f, 300.f, 0.f, 1.0f); glUniformMatrix4fv(world_uniform, 1, false, &worldMatrix.I.x); glDrawArrays(GL_TRIANGLES, 0, VertexCount); glDisableVertexAttribArray(position_attr); glDisableVertexAttribArray(texcoord_attr); shaders.UnUseShader("Clouds"); /** * Draw Clouds - End */ /** * Draw Particle - Start */ programObject = shaders.UseShader("Particle"); position_attr = glGetAttribLocation(programObject, "a_Position"); texcoord_attr = glGetAttribLocation(programObject, "a_TexCoords"); projection_uniform = glGetUniformLocation(programObject, "u_ProjectionMatrix"); world_uniform = glGetUniformLocation(programObject, "u_WorldMatrix"); glVertexAttribPointer(position_attr, 3, GL_FLOAT, false, sizeof(Vertex), vertices); glVertexAttribPointer(texcoord_attr, 2, GL_FLOAT, false, sizeof(Vertex), &vertices[0].texcoords); GLint ttl_uniform = glGetUniformLocation(programObject, "u_ttl"); GLint ttl_max_uniform = glGetUniformLocation(programObject, "u_ttl_max"); GLint dir_uniform = glGetUniformLocation(programObject, "u_dir"); glUniformMatrix4fv(projection_uniform, 1, false, &projectionMatrix.I.x); glEnableVertexAttribArray(position_attr); glEnableVertexAttribArray(texcoord_attr); for(int i = 0; i < ParticleEmiters.size(); i++) { for(int j = 0; j < ParticleEmiters[i].nbParticle; j++) { if(ParticleEmiters[i].particles[j].living == true && ParticleEmiters[i].particles[j].emited == true ) { glUniform1f(ttl_uniform, ParticleEmiters[i].particles[j].ttlCurr); glUniform1f(ttl_max_uniform, ParticleEmiters[i].particles[j].ttlMax); glUniform3f(dir_uniform, ParticleEmiters[i].particles[j].direction.x, ParticleEmiters[i].particles[j].direction.y, ParticleEmiters[i].particles[j].direction.z); if(ParticleEmiters[i].particles[j].type == 1) drawParticle(ParticleEmiters[i].particles[j].position, programObject, sampler_uniform, worldMatrix, world_uniform, textures["Fireworks"]); if(ParticleEmiters[i].particles[j].type == 2) drawParticle(ParticleEmiters[i].particles[j].position, programObject, sampler_uniform, worldMatrix, world_uniform, textures["Water"]); } } } glDisableVertexAttribArray(position_attr); glDisableVertexAttribArray(texcoord_attr); shaders.UnUseShader("Particle"); /** * Draw Clouds - End */ }
void display(void) { curTime = timeGetTime(); float dt = (float)(curTime - lastTime) * 0.001;//secに変換 elapseTime1 += dt; elapseTime2 += dt; fps ++; if(elapseTime1 >= 1.0) { printf("frame per sec = %d \n", fps); elapseTime1 = 0.0; fps = 0; } lastTime = curTime; //カラーバッファ,デプスバッファのクリア glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();//視点を変えるときはこの位置に必要 if(cos(M_PI * view.theta /180.0) >= 0.0)//カメラ仰角90度でビューアップベクトル切替 gluLookAt(view.pos[0], view.pos[1], view.pos[2], view.cnt[0], view.cnt[1], view.cnt[2], 0.0, 1.0, 0.0); else gluLookAt(view.pos[0], view.pos[1], view.pos[2], view.cnt[0], view.cnt[1], view.cnt[2], 0.0, -1.0, 0.0); //光源設定//'l'を押した後光源位置可変 glLightfv(GL_LIGHT0, GL_POSITION, lightPos); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texName[0]); //描画 // シェーダプログラムの適用 glUseProgram(shaderProg); //テクスチャユニットをシェーダ側のサンプラに関連付け,レンダリング GLint texLoc = glGetUniformLocation(shaderProg, "tex"); glUniform1i(texLoc, 0);//GL_TEXTURE0を適用 GLint timeLoc = glGetUniformLocation(shaderProg, "time"); glUniform1f(timeLoc, elapseTime2);//経過時間(sec) drawTerrain(); // シェーダプログラムの適用を解除 glUseProgram(0); //particle glBindTexture(GL_TEXTURE_2D, texName[1]); drawParticle(dt); if(flagHelp) { printf("矢印キーによるアフィン変換/光源移動 \n"); printf(" →,←:x軸 \n"); printf(" ↑,↓:y軸 \n"); printf(" [Shift]+↑,↓:z軸 \n"); printf(" 'r'を押した後:回転 \n"); printf(" 't'を押した後:平行移動 \n"); printf(" 's'を押した後:スケーリング \n"); printf(" 'l'を押した後、光源位置の移動可 \n"); printf("マウス操作で視点変更可 \n"); printf(" dolly:中央付近を左ボタンクリックで近づき,右ボタンクリックで遠ざかる \n"); printf(" pan:左横および右横を右ボタンクリックで注視点が左右に変化する \n"); printf(" tilt:真上および真下を右ボタンクリックで注視点が上下に変化する \n"); printf(" tumble:左右にドラッグすると視点が左右に変化する \n"); printf(" crane:上下にドラッグすると視点が上下に変化する \n"); printf(" zoom:左下を右ボタンクリックでズームイン \n"); printf(" 右下を右ボタンクリックでズームアウト \n"); printf("[Shift]+'r'でリセット \n"); printf("[F1]キー:βの調整 \n"); printf("[F2]キー:σの調整 \n"); printf("[F3]キー:seedの変更 \n"); printf("[F4]キー:x方向の風力変更 \n"); flagHelp = false; } //終了 glutSwapBuffers(); }
void ParticleShaderVoronoi::drawPost() { // Get the viewport dimensions GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); if ((pbufferOne->height != viewport[3]) || (pbufferOne->width != viewport[2])) { delete pbufferOne; setupBuffers(viewport[2], viewport[3]); } // Get the light position GLfloat lightpos[4]; glGetLightfv(GL_LIGHT0, GL_POSITION, lightpos); // Create storage for matrices GLfloat mm[16]; GLfloat pm[16]; // If we're not sharing contexts, need to copy state glGetFloatv(GL_MODELVIEW_MATRIX, mm); glGetFloatv(GL_PROJECTION_MATRIX, pm); // Switch to pbufferOne rendering context if (wglMakeCurrent(pbufferOne->hdc, pbufferOne->hglrc) == FALSE) pbufferOne->wglGetLastError(); // If we're not sharing contexts, need to update state if (pbufferOne->onecontext == false) { glMatrixMode(GL_PROJECTION); glLoadMatrixf(pm); glMatrixMode(GL_MODELVIEW); glLoadMatrixf(mm); glEnable(GL_DEPTH_TEST); } else { // Turn off color writes, for better performance glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); } // Clear the depth texture glClear(GL_DEPTH_BUFFER_BIT); cgGLEnableProfile(vProfile); cgGLEnableProfile(fProfile); cgGLBindProgram(vProgram); bindCGParametersVertex(); cgGLBindProgram(fProgramZero); bindCGParametersFragmentZero(); // Draw into the buffer for the depth texture for (unsigned int i = 0; i < ps->size(); i++) drawParticle(i); // Turn back on color for eventual rendering if (pbufferOne->onecontext) { glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } cgGLDisableProfile(vProfile); cgGLDisableProfile(fProfile); // Switch to normal rendering context if (wglMakeCurrent(hdc, hglrc) == FALSE) pbufferOne->wglGetLastError(); // Setup CG cgGLEnableProfile(vProfile); cgGLEnableProfile(fProfile); cgGLBindProgram(vProgram); bindCGParametersVertex(); bindCGParametersFragmentOne(); cgGLBindProgram(fProgramOne); // Make the depth texture active glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC) wglGetProcAddress("glActiveTextureARB"); glActiveTextureARB(GL_TEXTURE0_ARB); // Bind the depth texture glEnable(GL_TEXTURE_RECTANGLE_NV); glMatrixMode(GL_TEXTURE); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glBindTexture(GL_TEXTURE_RECTANGLE_NV, depth_texture); // Bind pbufferOne as a depth texture wglBindTexImageARB = (PFNWGLBINDTEXIMAGEARBPROC)wglGetProcAddress("wglBindTexImageARB"); if (wglBindTexImageARB(pbufferOne->hpbuffer, WGL_DEPTH_COMPONENT_NV) == FALSE) pbufferOne->wglGetLastError(); cgGLEnableTextureParameter(firstPassDepth); glActiveTextureARB(GL_TEXTURE1_ARB); // Set parameters cgGLSetParameter1f(depthRange, GLfloat(abs(10.0 - 0.5))); cgGLSetParameter4fv(lightPositionEC, lightpos); cgGLSetParameter1f(toleranceScaleFactor, GLfloat(toleranceScale)); cgGLSetStateMatrixParameter(viewMatrix, CG_GL_MODELVIEW_MATRIX, CG_GL_MATRIX_IDENTITY); glEnable(GL_DEPTH_TEST); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); // Draw the particles to the screen for (unsigned int i = 0; i < ps->size(); i++) { drawSecondPass(i); } cgGLDisableTextureParameter(firstPassDepth); glDisable(GL_TEXTURE_RECTANGLE_NV); // Release the depth texture wglReleaseTexImageARB = (PFNWGLRELEASETEXIMAGEARBPROC)wglGetProcAddress("wglReleaseTexImageARB"); if (wglReleaseTexImageARB(pbufferOne->hpbuffer, WGL_DEPTH_COMPONENT_NV) == false) pbufferOne->wglGetLastError(); cgGLDisableProfile(vProfile); cgGLDisableProfile(fProfile); }
void drawCar(void) { static float max_distance = 0.9; static float distance; static float width; static int pieces; static float xs; pieces = 20; static GLfloat car_diffuse[] = {0.6, 0.6, 0.6, 1.0}; glMaterialfv(GL_FRONT,GL_DIFFUSE, car_diffuse); //glLightf(GL_FRONT,GL_SPOT_CUTOFF,45.f); glPushMatrix(); //first, draw the body glTranslatef(position_X,position_Y,position_Z); glScalef(1.0,2.0,1.0); //rotate to right orientation glRotatef(velocity_angle, 0.f, 0.f, -1.f); glPushMatrix(); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,carTex); glRotatef(90, -1.0, 0, 0); gluCylinder(cylinder,0.15,0.1,0.3,30,30); glDisable(GL_TEXTURE_2D); glPopMatrix(); if(velocity>0) drawParticle(velocity); //four wheels glPushMatrix(); //right front glTranslatef(2.2*FRONT_RADIUS,0.28,0.1); glRotatef(90.f, 0.0, 1.0, 0.0); glColor3f(0.45,0.45,0.45); //rotate when press left or right glRotatef(wheelangle,1.0, 0, 0); //constant rotate glRotatef(-cons_rotate_front,0,0,1); //axis gluCylinder(cylinder,FRONT_RADIUS,FRONT_RADIUS,0.05,10,10); glColor4f(1.f, 1.f, 1.f, 1.f); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, wheelTex); gluDisk(cylinder,0,FRONT_RADIUS,10,10); glTranslatef(0, 0, 0.05); gluDisk(cylinder,0,FRONT_RADIUS,10,10); glDisable(GL_TEXTURE_2D); glPopMatrix(); glPushMatrix(); //left front glTranslatef(-3.1*FRONT_RADIUS,0.28,0.1); glRotatef(90.f, 0.0, 1.0, 0.0); glColor3f(0.45,0.45,0.45); //rotate when press left or right glRotatef(wheelangle,1.0, 0, 0); //constant rotate glRotatef(-cons_rotate_front,0,0,1); //axis gluCylinder(cylinder,FRONT_RADIUS,FRONT_RADIUS,0.05,10,10); glColor4f(1.f, 1.f, 1.f, 1.f); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, wheelTex); gluDisk(cylinder,0,FRONT_RADIUS,10,10); glTranslatef(0, 0, 0.05); gluDisk(cylinder,0,FRONT_RADIUS,10,10); glDisable(GL_TEXTURE_2D); glPopMatrix(); //left back glPushMatrix(); glTranslatef(-BACK_RADIUS*1.3,0.0,0.1); glRotatef(90.f, 0.0, 1.0, 0.0); glColor3f(0.45,0.45,0.45); glRotatef(-cons_rotate_back,0,0,1); //axis gluCylinder(cylinder,BACK_RADIUS,BACK_RADIUS,0.05,10,10); glColor4f(1.f, 1.f, 1.f, 1.f); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, wheelTex); gluDisk(cylinder,0,BACK_RADIUS,10,10); glTranslatef(0, 0, 0.05); gluDisk(cylinder,0,BACK_RADIUS,10,10); glDisable(GL_TEXTURE_2D); glPopMatrix(); //right back glPushMatrix(); glTranslatef(BACK_RADIUS*1.1,0.0,0.1); glRotatef(90.f, 0.0, 1.0, 0.0); glColor3f(0.45,0.45,0.45); glRotatef(-cons_rotate_back,0,0,1); //axis gluCylinder(cylinder,BACK_RADIUS,BACK_RADIUS,0.05,10,10); glColor4f(1.f, 1.f, 1.f, 1.f); //wheel glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, wheelTex); gluDisk(cylinder,0,BACK_RADIUS,10,10); glTranslatef(0, 0, 0.05); gluDisk(cylinder,0,BACK_RADIUS,10,10); glDisable(GL_TEXTURE_2D); glPopMatrix(); glPopMatrix(); }
void display(void) { curTime = timeGetTime(); float dt = (float)(curTime - lastTime) * 0.001;//secに変換 elapseTime1 += dt; elapseTime2 += dt; fps ++; if(elapseTime1 >= 1.0) { printf("frame per sec = %d \n", fps); elapseTime1 = 0.0; fps = 0; } lastTime = curTime; //カラーバッファ,デプスバッファのクリア glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();//視点を変えるときはこの位置に必要 if(cos(M_PI * view.theta /180.0) >= 0.0)//カメラ仰角90度でビューアップベクトル切替 gluLookAt(view.pos[0], view.pos[1], view.pos[2], view.cnt[0], view.cnt[1], view.cnt[2], 0.0, 1.0, 0.0); else gluLookAt(view.pos[0], view.pos[1], view.pos[2], view.cnt[0], view.cnt[1], view.cnt[2], 0.0, -1.0, 0.0); //光源設定//'l'を押した後光源位置可変 glLightfv(GL_LIGHT0, GL_POSITION, lightPos); if(flagWireframe)//'w'でwireframeとsolid model切り替え { glPolygonMode(GL_FRONT,GL_LINE); glPolygonMode(GL_BACK,GL_POINT); } else glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); //描画 // シェーダプログラムの適用 glUseProgram(shaderProg); //テクスチャユニットをシェーダ側のサンプラに関連付け,レンダリング //fragment shaderのユニフォーム変数texのインデックスを取得 GLint texLoc = glGetUniformLocation(shaderProg, "tex"); glUniform1i(texLoc, 0);//GL_TEXTURE0を適用 drawTerrain(); // シェーダプログラムの適用を解除 glUseProgram(0); drawParticle(dt); drawParticle2(dt); //テクスチャ、半透明物体があるとき glDepthMask(GL_FALSE); //デプスバッファを書き込み禁止 glEnable(GL_BLEND);//アルファブレンディングを有効にする glBlendFunc(GL_DST_ALPHA,GL_ONE_MINUS_SRC_ALPHA);//色混合係数を決める //半透明描画 makeRiver(elapseTime2); drawRiver(); //テクスチャ、半透明物体があるとき glDepthMask(GL_TRUE); //デプスバッファの書き込みを許可 glDisable(GL_BLEND); if(flagHelp) { printf("矢印キーによるアフィン変換/光源移動 \n"); printf(" →,←:x軸 \n"); printf(" ↑,↓:y軸 \n"); printf(" [Shift]+↑,↓:z軸 \n"); printf(" 'r'を押した後:回転 \n"); printf(" 't'を押した後:平行移動 \n"); printf(" 's'を押した後:スケーリング \n"); printf(" 'l'を押した後、光源位置の移動可 \n"); printf("'w'でワイヤーフレームとソリッドモデル切り替え \n"); printf("マウス操作で視点変更可 \n"); printf(" dolly:中央付近を左ボタンクリックで近づき,右ボタンクリックで遠ざかる \n"); printf(" pan:左横および右横を右ボタンクリックで注視点が左右に変化する \n"); printf(" tilt:真上および真下を右ボタンクリックで注視点が上下に変化する \n"); printf(" tumble:左右にドラッグすると視点が左右に変化する \n"); printf(" crane:上下にドラッグすると視点が上下に変化する \n"); printf(" zoom:左下を右ボタンクリックでズームイン \n"); printf(" 右下を右ボタンクリックでズームアウト \n"); printf("[Shift]+'r'でリセット \n"); printf("[F1]キー:βの調整 \n"); printf("[F2]キー:σの調整 \n"); printf("[F3]キー:seedの変更 \n"); printf("[F4]キー:x方向の風力変更 \n"); flagHelp = false; } //終了 glutSwapBuffers(); }