//---------------------------------------------------------
bool CView_Map_3DPanel::On_Draw(void)
{
	if( !m_DEM.is_Valid() )
	{
		return( false );
	}

	//-----------------------------------------------------
	#pragma omp parallel for
	for(int y=1; y<m_DEM.Get_NY(); y++)
	{
		for(int x=1; x<m_DEM.Get_NX(); x++)
		{
			TSG_Triangle_Node	p[3];

			if( Get_Node(x - 1, y - 1, p[0])
			&&  Get_Node(x    , y    , p[1]) )
			{
				if( Get_Node(x, y - 1, p[2]) )
				{
					Draw_Triangle(p, true);
				}

				if( Get_Node(x - 1, y, p[2]) )
				{
					Draw_Triangle(p, true);
				}
			}
		}
	}

	//-----------------------------------------------------
	return( true );
}
Exemplo n.º 2
0
//------------------------------------------------------------------------------
// Draws a generic overlay
//------------------------------------------------------------------------------
void DrawOverlay( OverlayBase_t *pOverlay )
{
    switch( pOverlay->m_Type)
    {
    case OVERLAY_LINE:
    {
        // Draw the line
        OverlayLine_t *pLine = static_cast<OverlayLine_t*>(pOverlay);
        Draw_Line( pLine->origin, pLine->dest, pLine->r, pLine->g, pLine->b, pLine->noDepthTest);
    }
    break;

    case OVERLAY_BOX:
    {
        // Draw the box
        OverlayBox_t *pCurrBox = static_cast<OverlayBox_t*>(pOverlay);
        if (pCurrBox->a > 0.0)
        {
            Draw_AlphaBox( pCurrBox->origin, pCurrBox->mins, pCurrBox->maxs, pCurrBox->angles, pCurrBox->r, pCurrBox->g, pCurrBox->b, pCurrBox->a);
        }
        Draw_WireframeBox( pCurrBox->origin, pCurrBox->mins, pCurrBox->maxs, pCurrBox->angles, pCurrBox->r, pCurrBox->g, pCurrBox->b);
    }
    break;

    case OVERLAY_SWEPT_BOX:
    {
        OverlaySweptBox_t *pBox = static_cast<OverlaySweptBox_t*>(pOverlay);
        Draw_WireframeSweptBox( pBox );
    }
    break;

    case OVERLAY_TRIANGLE:
    {
        OverlayTriangle_t *pTriangle = static_cast<OverlayTriangle_t*>(pOverlay);
        Draw_Triangle( pTriangle->p1, pTriangle->p2, pTriangle->p3, pTriangle->r,
                       pTriangle->g, pTriangle->b, pTriangle->a, pTriangle->noDepthTest );
    }
    break;

    default:
        Assert(0);
    }
}
Exemplo n.º 3
0
//---------------------------------------------------------
void CSG_3DView_Canvas::Draw_Triangle(TSG_Triangle_Node p[3], double Light_Dec, double Light_Azi)
{
	double	A	= p[0].z * (p[1].x - p[2].x) + p[1].z * (p[2].x - p[0].x) + p[2].z * (p[0].x - p[1].x);
	double	B	= p[0].y * (p[1].z - p[2].z) + p[1].y * (p[2].z - p[0].z) + p[2].y * (p[0].z - p[1].z);
	double	C	= p[0].x * (p[1].y - p[2].y) + p[1].x * (p[2].y - p[0].y) + p[2].x * (p[0].y - p[1].y);

	double	s, a;

	if( C != 0.0 )
	{
		A	= - A / C;
		B	= - B / C;

		s	= M_PI_090 - atan(sqrt(A*A + B*B));
		a	= A != 0.0 ? M_PI_180 + atan2(B, A) : B > 0.0 ? M_PI_270 : (B < 0.0 ? M_PI_090 : -1.0);
	}
	else
	{
		s	= 0.0;
		a	= 0.0;
	}

	Draw_Triangle(p, (acos(sin(s) * sin(Light_Dec) + cos(s) * cos(Light_Dec) * cos(a - Light_Azi))) / M_PI_090);
}
Exemplo n.º 4
0
void redraw()  
{  
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除颜色缓存和深度缓存     
    glLoadIdentity();    //初始化矩阵为单位矩阵      
  
    gluLookAt(eye[0], eye[1], eye[2],  
        center[0], center[1], center[2],  
        0, 1, 0);                // 场景(0,0,0)的视点中心 (0,5,50),Y轴向上  
  
    if (bWire) {  
        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);  
        //设置多边形绘制模式:正反面,线型    
    }  
    else {  
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);  
        //设置多边形绘制模式:正反面,填充        
    }  
      
    glEnable(GL_DEPTH_TEST);//开启深度测试      
    glEnable(GL_LIGHTING);  //开启光照模式     
  
    GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };  
    GLfloat light_pos[] = { 5,5,5,1 };  
  
    glLightfv(GL_LIGHT0, GL_POSITION, light_pos);//光源位置  
    glLightfv(GL_LIGHT0, GL_AMBIENT, white);//定义白色   
    glEnable(GL_LIGHT0);//开启第0号光源     
  
    glRotatef(fRotate, 0, 1.0f, 0);    //旋转  
    glRotatef(-90, 1, 0, 0);  
    glScalef(0.2, 0.2, 0.2);//缩放  
    Draw_Triangle();//绘制场景  
  
    if (bAnim) fRotate    += 0.5f;//旋转因子改变  
    glutSwapBuffers(); //交换缓冲区  
}