Exemple #1
0
void myDisplay() {
	glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	gluLookAt(0, 30, 40, 0, 30, 0, 0, 1, 0);

	LightPosition();

	glDisable(GL_LIGHTING);
	glLineWidth(5);
	drawAxes();

	static float angle = 0.0;
	glRotatef(angle, 0, 1, 0);
	angle += 0.5;
	glLineWidth(1);
	myMesh.drawMesh();
	clothMesh.drawMesh();

	glEnable(GL_LIGHTING);


	glutSwapBuffers();
}
Exemple #2
0
void myDisplay() {
	glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	gluLookAt(0.0, 0.5, 1.5, 0, 0, 0, 0, 1, 0);
	LightPosition();

	glDisable(GL_LIGHTING);
	glLineWidth(5);
	drawAxes();

	glEnable(GL_LIGHTING);


	//glDisable(GL_DEPTH_TEST); 
	static float angle = 0.0;
	glRotatef(angle, 0.0, 1.0, 0.0);
	angle += 0.5;
	glPushMatrix();
	glTranslatef(0, 0, -0.5);
	glColor4f(1, 1, 1, 0.5);
	glutSolidTeapot(0.5);
	glPopMatrix();

	
	glPushMatrix();	
	glColor4f(0, 0, 1, 0.5);
	glutSolidTeapot(0.5);
	glPopMatrix();
	//glEnable(GL_DEPTH_TEST);

	glutSwapBuffers();
}
void Mesh::setupVBOs() {
  // delete all the old geometry
  mesh_tri_verts.clear(); 
  light_vert.clear();
  cleanupVBOs();
  // setup the new geometry
  Vec3f light_position = LightPosition();
  SetupLight(light_position);
  SetupMesh();
  SetupPlateVisualization();
  bbox.setupVBOs();
}
Exemple #4
0
void myDisplay() {
	glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	myCam.setGLCamera(); //gluLookAt(0.0, 2.5, 5.0, 0,0,0, 0,1,0);
	LightPosition();

	glDisable(GL_LIGHTING);
	glLineWidth(1);
	drawPlane();

	glLineWidth(5);
	drawAxes();
	
	glEnable(GL_LIGHTING);
	glutSolidTeapot(0.5);
	
	glutSwapBuffers();
}
Exemple #5
0
void Mesh::drawVBOs() {
  // scale it so it fits in the window
  Vec3f center; bbox.getCenter(center);
  float s = 1/bbox.maxDim();
  glScalef(s,s,s);
  glTranslatef(-center.x(),-center.y(),-center.z());

  // setup the light
  Vec3f light_position = LightPosition();
  GLfloat position[4] = { float(light_position.x()),float(light_position.y()),float(light_position.z()),1 };
  glLightfv(GL_LIGHT1, GL_POSITION, position);
  
  if (args->glsl_enabled) {
  
  
    glEnable(GL_DEPTH_TEST);
    glClearColor(0,0,0,1.0f);
    glEnable(GL_CULL_FACE);
    //glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
    
    //BEGIN SHADOW FUN/////////////===================================
    
    //First step: Render from the light POV to a FBO, story depth values only
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,fboId);  //Rendering offscreen
    
    //Using the fixed pipeline to render to the depthbuffer
    glUseProgramObjectARB(0);
      
    
    // In the case we render the shadowmap to a higher resolution, the viewport must be modified accordingly.
    glViewport(0,0,args->width * SHADOW_MAP_RATIO,args->height* SHADOW_MAP_RATIO);
    
    // Clear previous frame values
    glClear(GL_DEPTH_BUFFER_BIT);
    
    //Disable color rendering, we only want to write to the Z-Buffer
    glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
    
    
    
    //LIGHT POSITION==========================================================================================
    setupMatrices(float(light_position.x()),float(light_position.y()),float(light_position.z()),
            10,10,1);
    
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45,args->width/args->height,1.0f,1000.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt((float)light_position.x(),(float)light_position.y(),(float)light_position.z(),0,0,0,0,1,0);
            
    
    // Culling switching, rendering only backface, this is done to avoid self-shadowing
    glCullFace(GL_FRONT);
     
    
    //===========Draw the Things===================================================================================
    InsertColor(floor_color);
    DrawFloor();
    //startTranslate(0,0,0);
    //glutSolidCube(1);
    
    InsertColor(mesh_color);
    glUseProgramObjectARB(GLCanvas::program);
    glColor3b(GLbyte(240-127), GLbyte(184-127), GLbyte(0-127));
    DrawMesh(table, board_tri_verts_VBO);
    DrawPieces(editBoard());

    //endTranslate();
    
    glUseProgramObjectARB(0);
    
    //=============================================================================================================
    
    //Save modelview/projection matrice into texture7, also add a biais
    setTextureMatrix();
    
    
    // Now rendering from the camera POV, using the FBO to generate shadows
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0);
    
    glViewport(0,0,args->width,args->height);
    
    //Enabling color write (previously disabled for light POV z-buffer rendering)
    glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
    
    // Clear previous frame values
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
      
    //Using the shadow shader
    glUseProgramObjectARB(GLCanvas::program);

    glUniform1iARB(shadowMapUniform,7);
    glActiveTextureARB(GL_TEXTURE7);
    glBindTexture(GL_TEXTURE_2D,depthTextureId);
    
    Vec3f cam_position = camera->camera_position;
    Vec3f interest = camera->point_of_interest;
    
    //CAMERA MATRIX=======================================================================================================
    //setupMatrices(cam_pos[0],cam_pos[1],cam_pos[2],interest[0],interest[1],interest[2]);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45,args->width/args->height,1.0f,1000.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt((float)cam_position.x(),(float)cam_position.y(),(float)cam_position.z(),(float)interest.x(),(float)interest.y(),(float)interest.z(),0,1,0);
    
    glCullFace(GL_BACK);
    //============================Draw the things
    InsertColor(floor_color);
    DrawFloor();
    //startTranslate(0,0,0);
    //glutSolidCube(1);
    
    InsertColor(mesh_color);
    glUseProgramObjectARB(GLCanvas::program);
    glColor3b(GLbyte(240-127), GLbyte(184-127), GLbyte(0-127));
    DrawMesh(table, board_tri_verts_VBO);
    DrawPieces(editBoard());

    //endTranslate();
    
    glUseProgramObjectARB(0);
    
    //============================All the things
    
    // DEBUG only. this piece of code draw the depth buffer onscreen
    //*
    glUseProgramObjectARB(0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-args->width/2,args->width/2,-args->height/2,args->height/2,1,20);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glColor4f(1,1,1,1);
    glActiveTextureARB(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D,depthTextureId);
    glEnable(GL_TEXTURE_2D);
    glTranslated(0,0,-1);
    glBegin(GL_QUADS);
    glTexCoord2d(0,0);glVertex3f(0,0,0);
    glTexCoord2d(1,0);glVertex3f(args->width/2,0,0);
    glTexCoord2d(1,1);glVertex3f(args->width/2,args->width/2,0);
    glTexCoord2d(0,1);glVertex3f(0,args->height/2,0);
     
    glEnd();
    glDisable(GL_TEXTURE_2D);
    //*/
    
    //glutSwapBuffers();

    glDisable(GL_STENCIL_TEST);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glDepthMask(1);
    
	  //END SHADOW FUN//////////////////////////////////////////////////
  }
  else
  {
    InsertColor(floor_color);
    DrawFloor();
    
    InsertColor(mesh_color);
    glColor3b(GLbyte(240-127), GLbyte(184-127), GLbyte(0-127));

    DrawMesh(table, board_tri_verts_VBO);
    if(args->board_control)
    {
      DrawControlMap();
    }
    DrawPieces(editBoard());
  }
  

  // -------------------------
  // ADDITIONAL VISUALIZATIONS (for debugging)
  glColor3f(1,1,0);
  //DrawLight();
  if (args->bounding_box) {
    glColor3f(0,0,0);
    bbox.drawVBOs();
  }
    
  HandleGLError(); 
}
Exemple #6
0
// Renders the map
void _Map::Render(_Camera *Camera, _Stats *Stats, _Object *ClientPlayer, double BlendFactor, int RenderFlags) {

	// Set lights for editor
	if(!ClientPlayer) {
		glm::vec4 AmbientLightEditor(1.0f, 1.0f, 1.0f, 1.0f);
		Assets.Programs["pos_uv"]->AmbientLight = AmbientLightEditor;
		Assets.Programs["pos_uv"]->LightPosition = glm::vec3(0, 0, 0);
		Assets.Programs["pos_uv_static"]->AmbientLight = AmbientLightEditor;
	}
	else {

		// Setup day night cycle
		SetAmbientLightByClock();

		// Setup lights
		glm::vec3 LightPosition(glm::vec3(ClientPlayer->Position, 1) + glm::vec3(0.5f, 0.5f, 0));
		glm::vec3 LightAttenuation(0.0f, 1.0f, 0.0f);

		Assets.Programs["pos_uv"]->LightAttenuation = LightAttenuation;
		Assets.Programs["pos_uv"]->LightPosition = LightPosition;
		Assets.Programs["pos_uv"]->AmbientLight = AmbientLight;
	}

	// Draw background map
	if(BackgroundMap) {
		BackgroundMap->Clock = Clock;
		BackgroundMap->SetAmbientLightByClock();
		if(!ClientPlayer)
			BackgroundMap->AmbientLight = glm::vec4(1.0f);
		Assets.Programs["pos_uv_static"]->AmbientLight = BackgroundMap->AmbientLight;

		// Get camera position
		glm::vec3 DrawPosition;
		Camera->GetDrawPosition(BlendFactor, DrawPosition);
		DrawPosition -= BackgroundOffset;

		//BackgroundOffset.z = -10.0f;
		float Width = DrawPosition.z * Graphics.AspectRatio;
		float Height = DrawPosition.z;

		// Get render bounds of background tiles
		glm::vec4 BackgroundBounds;
		BackgroundBounds[0] = glm::clamp(-Width + DrawPosition.x, 0.0f, (float)BackgroundMap->Size.x);
		BackgroundBounds[1] = glm::clamp(-Height + DrawPosition.y, 0.0f, (float)BackgroundMap->Size.y);
		BackgroundBounds[2] = glm::clamp(Width + DrawPosition.x, 0.0f, (float)BackgroundMap->Size.x);
		BackgroundBounds[3] = glm::clamp(Height + DrawPosition.y, 0.0f, (float)BackgroundMap->Size.y);

		BackgroundMap->RenderLayer("pos_uv_static", BackgroundBounds, BackgroundOffset, 0, true);
		BackgroundMap->RenderLayer("pos_uv_static", BackgroundBounds, BackgroundOffset, 1, true);
	}

	// Get render bounds
	glm::vec4 Bounds = Camera->GetAABB();
	Bounds[0] = glm::clamp(Bounds[0], 0.0f, (float)Size.x);
	Bounds[1] = glm::clamp(Bounds[1], 0.0f, (float)Size.y);
	Bounds[2] = glm::clamp(Bounds[2], 0.0f, (float)Size.x);
	Bounds[3] = glm::clamp(Bounds[3], 0.0f, (float)Size.y);

	// Draw layers
	RenderLayer("pos_uv", Bounds, glm::vec3(0.0f), 0);
	RenderLayer("pos_uv", Bounds, glm::vec3(0.0f), 1);

	// Render objects
	for(const auto &Object : Objects) {
		Object->Render(ClientPlayer);
	}

	// Check for flags
	if(!RenderFlags)
		return;

	// Draw map boundaries
	if(RenderFlags & FILTER_BOUNDARY) {
		Graphics.SetProgram(Assets.Programs["pos"]);
		Graphics.SetVBO(VBO_NONE);
		Graphics.SetColor(COLOR_RED);
		Graphics.DrawRectangle(glm::vec2(-0.51f, -0.51f), glm::vec2(Size.x - 0.49f, Size.y - 0.49f));
	}

	// Draw zone overlays
	if((RenderFlags & FILTER_ZONE)) {
		Graphics.SetProgram(Assets.Programs["pos"]);
		Graphics.SetVBO(VBO_NONE);
		for(int j = (int)Bounds[1]; j < Bounds[3]; j++) {
			for(int i = (int)Bounds[0]; i < Bounds[2]; i++) {
				_Tile *Tile = &Tiles[i][j];

				// Draw zone color
				if(!Tile->Wall && Tile->Zone > 0) {
					Graphics.SetColor(ZoneColors[Tile->Zone % 6]);
					Graphics.DrawRectangle(glm::vec2(i, j), glm::vec2(i, j), true);
				}
			}
		}
	}

	// Draw text overlay
	for(int j = (int)Bounds[1]; j < Bounds[3]; j++) {
		for(int i = (int)Bounds[0]; i < Bounds[2]; i++) {
			_Tile *Tile = &Tiles[i][j];
			glm::vec3 DrawPosition = glm::vec3(i, j, 0) + glm::vec3(0.5f, 0.5f, 0);

			// Draw wall
			if(Tile->Wall) {
				if(RenderFlags & FILTER_WALL)
					Assets.Fonts["hud_medium"]->DrawText("W", glm::vec2(DrawPosition), COLOR_WHITE, CENTER_MIDDLE, 1.0f / 64.0f);
			}
			else {

				// Draw zone number
				if((RenderFlags & FILTER_ZONE) && Tile->Zone > 0)
					Assets.Fonts["hud_medium"]->DrawText(std::to_string(Tile->Zone).c_str(), glm::vec2(DrawPosition), COLOR_WHITE, CENTER_MIDDLE, 1.0f / 64.0f);

				// Draw PVP
				if((RenderFlags & FILTER_PVP) && Tile->PVP)
					Assets.Fonts["hud_medium"]->DrawText("PVP", glm::vec2(DrawPosition), COLOR_RED, CENTER_MIDDLE, 1.0f / 64.0f);
			}

			// Draw event info
			if(Tile->Event.Type > 0) {
				std::string EventText = Stats->EventNames[Tile->Event.Type].ShortName + std::string(" ") + std::to_string(Tile->Event.Data);
				Assets.Fonts["hud_medium"]->DrawText(EventText, glm::vec2(DrawPosition), COLOR_CYAN, CENTER_MIDDLE, 1.0f / 64.0f);
			}
		}
	}
}
void Mesh::drawVBOs() {
  // scale it so it fits in the window
  Vec3f center; bbox.getCenter(center);
  float s = 1/bbox.maxDim();
  glScalef(s,s,s);
  glTranslatef(-center.x(),-center.y(),-center.z());

  // setup the light
  Vec3f light_position = LightPosition();
  GLfloat position[4] = { float(light_position.x()),float(light_position.y()),float(light_position.z()),1 };
  glLightfv(GL_LIGHT1, GL_POSITION, position);

  // --------------------------
  // Render Mesh 
  InsertColor(mesh_color);
  glEnable(GL_TEXTURE_2D);
  if (args->glsl_enabled) {
    glUseProgramObjectARB(GLCanvas::program);
    glActiveTexture(GL_TEXTURE0);

    // Height Map
    glActiveTexture(GL_TEXTURE0);
    GLint mapLoc = glGetUniformLocationARB(GLCanvas::program, "terrainMap");
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glUniform1iARB(mapLoc, 0);

    // Normal Map
    glActiveTexture(GL_TEXTURE1);
    GLint normLoc = glGetUniformLocationARB(GLCanvas::program, "normalMap");
    glBindTexture(GL_TEXTURE_2D, texture[1]);
    glUniform1iARB(normLoc, 1);

    // Stone Texture
    glActiveTexture(GL_TEXTURE2);
    GLint stoneLoc = glGetUniformLocationARB(GLCanvas::program, "texStone");
    glBindTexture(GL_TEXTURE_2D, texture[2]);
    glUniform1iARB(stoneLoc, 2);

    // Grass Texture
    glActiveTexture(GL_TEXTURE3);
    GLint grassLoc = glGetUniformLocationARB(GLCanvas::program, "texGrass");
    glBindTexture(GL_TEXTURE_2D, texture[3]);
    glUniform1iARB(grassLoc, 3);

    // Snow Texture
    glActiveTexture(GL_TEXTURE4);
    GLint snowLoc = glGetUniformLocationARB(GLCanvas::program, "texSnow");
    glBindTexture(GL_TEXTURE_2D, texture[4]);
    glUniform1iARB(snowLoc, 4);

    glActiveTexture(GL_TEXTURE0);
  }
  else {
    glBindTexture(GL_TEXTURE_2D, texture[0]);
  }
  DrawMesh();
  if (args->glsl_enabled) {
    glUseProgramObjectARB(0);
  }
  glDisable(GL_TEXTURE_2D);

  DrawPlateVisualization();
  
  // -------------------------
  // Render Light (for debugging)
  glColor3f(1,1,0);
  DrawLight();
    
  HandleGLError(); 
}
Exemple #8
0
void testApp::compute_raycast(const ofMatrix4x4 &tMatrix)
{
	ofVec3f LightPosition(0,0,1000);
	cv::Mat rayimage(KINECT_HEIGHT,KINECT_WIDTH,CV_8UC1);

	float tStep = SIZE_TRIDE*0.8;
	ofVec3f startPosition = ofVec3f(-2,-2,0.5);
	int i=0,j=0;
	int num=0;
	int nnum =0;
	for(j=0;j<480;j++)
	{
		uchar *ptr = rayimage.ptr<uchar>(j);
		for(i=0;i<640;i++)
		{
			ptr[i] = 255;
			num = j*KINECT_WIDTH+i;
			pointsmap_final[num] = ofVec3f(0,0,0);
			normalmap_final[num] = ofVec3f(0,0,0);
			ofVec3f rayChange =nmmul(invKcam,ofVec3f(i,j,1));

			rayChange = tMatrix * rayChange;

			ofVec3f rayOne = 0.5*rayChange - startPosition;
			ofVec3f rayTwo = 1.0*rayChange - startPosition;
			ofVec3f rayFirst = getTheGlobalPostion(rayOne);
			ofVec3f rayEnd = getTheGlobalPostion(rayTwo);
			ofVec3f rayDirct = rayTwo - rayOne;//rayEnd - rayFirst;

			rayDirct = rayDirct.normalize(); 

			rayDirct.x = (rayDirct.x == 0.f) ? 1e-15 : rayDirct.x;
			rayDirct.y = (rayDirct.y == 0.f) ? 1e-15 : rayDirct.y;
			rayDirct.z = (rayDirct.z == 0.f) ? 1e-15 : rayDirct.z;

			float pretsdf = getTsdfData((int)rayFirst.x,(int)rayFirst.y,(int)rayFirst.z);
			float nowtsdf ;
			float turr = 0;
			float maxtime = getmaxtime(rayDirct,rayOne);

			ofVec3f rayLast = rayOne + rayDirct*maxtime;
			ofVec3f gLast = getTheGlobalPostion(rayLast);

			ofVec3f rayPre = rayOne;
			while(turr<maxtime)
			{
				ofVec3f rayNext = rayPre + rayDirct*tStep;
				ofVec3f gnum = getTheGlobalPostion(rayNext);
				if(!isvalid(gnum))
				{
					break;
				}
				nowtsdf = getTsdfData((int)gnum.x,(int)gnum.y,(int)gnum.z);
				if(pretsdf>0&&nowtsdf<0)//&&!(pretsdf==1&&nowtsdf==-1))
				{
					float Ftdt = triLinary(rayNext);
					if(isnan(Ftdt))
						break;

					float Ft = triLinary(rayPre);
					if(isnan(Ft))
						break;

					float realt = turr - (tStep*Ft/(Ftdt-Ft));
					ofVec3f rayzero = rayPre + rayDirct*(realt-turr);
					pointsmap_final[num] = (rayzero + startPosition);//*100;// 显示用
					//cout<<Ftdt<<" "<<Ft<<endl;
					///计算法向////
					ofVec3f pregnum = getTheGlobalPostion(rayzero);
					if(pregnum.x>1&&pregnum.y>1&&pregnum.z>1&&pregnum.x<TSDF_SIZE-2&&pregnum.y<TSDF_SIZE-2&&pregnum.z<TSDF_SIZE-2)
					{
						ofVec3f t;

						t = rayzero;
						t.x -= SIZE_TRIDE;
						float Fx1 = triLinary(t);
						t = rayzero;
						t.x += SIZE_TRIDE;
						float Fx2 = triLinary(t);
						float nx = (Fx2-Fx1);///(SIZE_TRIDE*2);

						t = rayzero;
						t.y -= SIZE_TRIDE;
						float Fy1 = triLinary(t);
						t = rayzero;
						t.y += SIZE_TRIDE;
						float Fy2 = triLinary(t);
						float ny = (Fy2-Fy1);///(SIZE_TRIDE*2);

						t = rayzero;
						t.z -= SIZE_TRIDE;
						float Fz1 = triLinary(t);
						t = rayzero;
						t.z += SIZE_TRIDE;
						float Fz2 = triLinary(t);
						float nz =(Fz2-Fz1);////(SIZE_TRIDE*2);

						ofVec3f n(nx,ny,nz);
						n = n.normalize();
						normalmap_final[num] = n;
						nnum++;
					
						// 生成图像				
						ofVec3f pp = LightPosition - pointsmap_final[num];
						pp = pp.normalize();
						float r = fabs(pp.dot(n));
						int br = (int)(r*205)+50;
						br = max((int)0,min(br,255));
						ptr[i] = br;
					}
					//num++;
					break;
				}
				else if(pretsdf<0&&nowtsdf>0)
					break;
				else
				{
					pretsdf = nowtsdf;
					rayPre = rayNext;
					turr += tStep;
				}
			}// while()
			//}// if(Last<0)

		}// for(i)
	}// for(j)
	finalPointNum = num;
	//std::cout<<num<<" "<<nnum<<endl;
	cv::imshow("ray",rayimage);
}