2710646327
- aggiunta possibilità di impostare spessore linee e grandezza punti.
288 lines
9.3 KiB
C++
288 lines
9.3 KiB
C++
//----------------------------------------------------------------------------
|
|
// EgalTech 2014-2014
|
|
//----------------------------------------------------------------------------
|
|
// File : SceneDirect.cpp Data : 09.10.14 Versione : 1.5j1
|
|
// Contenuto : Implementazione disegno diretto nella scena.
|
|
//
|
|
//
|
|
//
|
|
// Modifiche : 25.02.14 DS Creazione modulo.
|
|
//
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
//--------------------------- Include ----------------------------------------
|
|
#include "stdafx.h"
|
|
#include "ObjOldGraphics.h"
|
|
#include "ObjNewGraphics.h"
|
|
#include "Scene.h"
|
|
#include "GraphObjs.h"
|
|
#include "/EgtDev/Include/EgtILogger.h"
|
|
#include "/EgtDev/Include/EGnStringUtils.h"
|
|
#include "/EgtDev/Include/EGkFrame3d.h"
|
|
#include "/EgtDev/Include/EgtPointerOwner.h"
|
|
#include "/EgtDev/Include/EGkGdbIterator.h"
|
|
#include "/EgtDev/Include/EGkCurve.h"
|
|
|
|
using namespace std ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
Scene::SetGeoLineAttribs( Color GLcol)
|
|
{
|
|
m_colorGL = GLcol ;
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
Scene::SetGeoLine( const Point3d& ptP1, const Point3d& ptP2)
|
|
{
|
|
m_bGeoLine = true ;
|
|
m_ptGeoLineP1 = ptP1 ;
|
|
m_ptGeoLineP2 = ptP2 ;
|
|
|
|
return ( ! AreSamePointApprox( m_ptGeoLineP1, m_ptGeoLineP2)) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
Scene::ResetGeoLine( void)
|
|
{
|
|
bool bOld = m_bGeoLine ;
|
|
m_bGeoLine = false ;
|
|
|
|
return bOld ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
Scene::SetGeoTriaAttribs( Color GTcol)
|
|
{
|
|
m_colorGT = GTcol ;
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
Scene::SetGeoTria( const Point3d& ptP1, const Point3d& ptP2, const Point3d& ptP3)
|
|
{
|
|
m_bGeoTria = true ;
|
|
m_ptGeoTriaP1 = ptP1 ;
|
|
m_ptGeoTriaP2 = ptP2 ;
|
|
m_ptGeoTriaP3 = ptP3 ;
|
|
|
|
return ( ! AreSamePointApprox( m_ptGeoTriaP1, m_ptGeoTriaP2) &&
|
|
! AreSamePointApprox( m_ptGeoTriaP1, m_ptGeoTriaP3)) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
Scene::ResetGeoTria( void)
|
|
{
|
|
bool bOld = m_bGeoTria ;
|
|
m_bGeoTria = false ;
|
|
|
|
return bOld ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
Scene::SetWinRectAttribs( bool bOutline, Color WRcol)
|
|
{
|
|
m_bOutlineWR = bOutline ;
|
|
m_colorWR = WRcol ;
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
Scene::SetWinRect( const Point3d& ptWinRectP1, const Point3d& ptWinRectP2)
|
|
{
|
|
m_bWinRect = true ;
|
|
m_ptWinRectP1 = ptWinRectP1 ;
|
|
m_ptWinRectP2 = ptWinRectP2 ;
|
|
|
|
return ( ! AreSamePointApprox( m_ptWinRectP1, m_ptWinRectP2)) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
Scene::ResetWinRect( void)
|
|
{
|
|
bool bOld = m_bWinRect ;
|
|
m_bWinRect = false ;
|
|
|
|
return bOld ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
Scene::DrawDirect( void)
|
|
{
|
|
// eseguo disegni diretti
|
|
bool bOk = true ;
|
|
if ( m_bGeoLine) {
|
|
if ( ! DrawGeoLine())
|
|
bOk = false ;
|
|
}
|
|
if ( m_bGeoTria) {
|
|
if ( ! DrawGeoTria())
|
|
bOk = false ;
|
|
}
|
|
if ( m_bWinRect) {
|
|
if ( ! DrawWinRect())
|
|
bOk = false ;
|
|
}
|
|
|
|
return bOk ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
Scene::DrawGeoLine( void)
|
|
{
|
|
// disegno linea in geometria globale
|
|
glBegin( GL_LINES) ;
|
|
glColor3f( m_colorGL.GetRed(), m_colorGL.GetGreen(), m_colorGL.GetBlue()) ;
|
|
glVertex3f( float( m_ptGeoLineP1.x), float( m_ptGeoLineP1.y), float( m_ptGeoLineP1.z)) ;
|
|
glVertex3f( float( m_ptGeoLineP2.x), float( m_ptGeoLineP2.y), float( m_ptGeoLineP2.z)) ;
|
|
glEnd() ;
|
|
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
Scene::DrawGeoTria( void)
|
|
{
|
|
// disegno triangolo in geometria globale
|
|
glBegin( GL_LINE_LOOP) ;
|
|
glColor3f( m_colorGT.GetRed(), m_colorGT.GetGreen(), m_colorGT.GetBlue()) ;
|
|
glVertex3f( float( m_ptGeoTriaP1.x), float( m_ptGeoTriaP1.y), float( m_ptGeoTriaP1.z)) ;
|
|
glVertex3f( float( m_ptGeoTriaP2.x), float( m_ptGeoTriaP2.y), float( m_ptGeoTriaP2.z)) ;
|
|
glVertex3f( float( m_ptGeoTriaP3.x), float( m_ptGeoTriaP3.y), float( m_ptGeoTriaP3.z)) ;
|
|
glEnd() ;
|
|
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
Scene::DrawWinRect( void)
|
|
{
|
|
// rendo neutre matrici di proiezione e di modello/vista
|
|
glMatrixMode( GL_PROJECTION) ;
|
|
glPushMatrix() ;
|
|
glLoadIdentity() ;
|
|
glMatrixMode( GL_MODELVIEW) ;
|
|
glPushMatrix() ;
|
|
glLoadIdentity() ;
|
|
|
|
// recupero le dimensioni della viewport
|
|
GLint vPort[ 4] ;
|
|
glGetIntegerv( GL_VIEWPORT, vPort) ;
|
|
|
|
// estremi del rettangolo nel riferimento Win ( 0,0 in alto a sinistra e Y verso il basso)
|
|
double dWinXmin = min( m_ptWinRectP1.x, m_ptWinRectP2.x) ;
|
|
double dWinXmax = max( m_ptWinRectP1.x, m_ptWinRectP2.x) ;
|
|
double dWinYmin = min( m_ptWinRectP1.y, m_ptWinRectP2.y) ;
|
|
double dWinYmax = max( m_ptWinRectP1.y, m_ptWinRectP2.y) ;
|
|
// estremi del rettangolo nel riferimento View (0,0 in centro, quindi estremi -1,-1 e +1,+1 assi soliti)
|
|
float dViewXmin = float( - 1 + 2 * ( 1 + dWinXmin) / ( vPort[2] + 1)) ;
|
|
float dViewXmax = float( - 1 + 2 * ( 1 + dWinXmax) / ( vPort[2] + 1)) ;
|
|
float dViewYmin = float( - 1 + 2 * ( vPort[3] - dWinYmax) / ( vPort[3] + 1)) ;
|
|
float dViewYmax = float( - 1 + 2 * ( vPort[3] - dWinYmin) / ( vPort[3] + 1)) ;
|
|
|
|
// eseguo il disegno del rettangolo
|
|
if ( ! m_bNewWay) {
|
|
if ( m_bOutlineWR) {
|
|
glBegin( GL_LINE_LOOP) ;
|
|
glColor3f( m_colorWR.GetRed(), m_colorWR.GetGreen(), m_colorWR.GetBlue()) ;
|
|
glVertex3f( dViewXmin, dViewYmin, 0.5) ;
|
|
glVertex3f( dViewXmax, dViewYmin, 0.5) ;
|
|
glVertex3f( dViewXmax, dViewYmax, 0.5) ;
|
|
glVertex3f( dViewXmin, dViewYmax, 0.5) ;
|
|
glEnd() ;
|
|
}
|
|
else {
|
|
glEnable( GL_BLEND) ;
|
|
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;
|
|
glBegin( GL_TRIANGLE_STRIP) ;
|
|
glColor4f( m_colorWR.GetRed(), m_colorWR.GetGreen(), m_colorWR.GetBlue(), m_colorWR.GetAlpha()) ;
|
|
glVertex3f( dViewXmin, dViewYmin, 0.5) ;
|
|
glVertex3f( dViewXmax, dViewYmin, 0.5) ;
|
|
glVertex3f( dViewXmin, dViewYmax, 0.5) ;
|
|
glVertex3f( dViewXmax, dViewYmax, 0.5) ;
|
|
glEnd() ;
|
|
glDisable( GL_BLEND) ;
|
|
}
|
|
}
|
|
|
|
else {
|
|
// predispongo VAO e VBO usa e getta
|
|
unsigned int nVaoId ;
|
|
unsigned int nVboId ;
|
|
// definizione
|
|
glGenVertexArrays( 1, &nVaoId) ;
|
|
if ( nVaoId == 0)
|
|
return false ;
|
|
glBindVertexArray( nVaoId) ;
|
|
glGenBuffers( 1, &nVboId) ;
|
|
glBindBuffer( GL_ARRAY_BUFFER, nVboId) ;
|
|
glBufferData( GL_ARRAY_BUFFER, 4 * SIZEV3F, NULL, GL_STATIC_DRAW) ;
|
|
glVertexPointer( 3, GL_FLOAT, SIZEV3F, ((void*)(0))) ;
|
|
glEnableClientState( GL_VERTEX_ARRAY) ;
|
|
// se contorno
|
|
if ( m_bOutlineWR) {
|
|
// assegno i vertici (ordine S)
|
|
Vert3f v3V ;
|
|
v3V.Set( dViewXmin, dViewYmin, 0.5) ;
|
|
glBufferSubData( GL_ARRAY_BUFFER, 0 * SIZEV3F, SIZEV3F, &v3V) ;
|
|
v3V.Set( dViewXmax, dViewYmin, 0.5) ;
|
|
glBufferSubData( GL_ARRAY_BUFFER, 1 * SIZEV3F, SIZEV3F, &v3V) ;
|
|
v3V.Set( dViewXmax, dViewYmax, 0.5) ;
|
|
glBufferSubData( GL_ARRAY_BUFFER, 2 * SIZEV3F, SIZEV3F, &v3V) ;
|
|
v3V.Set( dViewXmin, dViewYmax, 0.5) ;
|
|
glBufferSubData( GL_ARRAY_BUFFER, 3 * SIZEV3F, SIZEV3F, &v3V) ;
|
|
// imposto colore
|
|
glColor3f( m_colorWR.GetRed(), m_colorWR.GetGreen(), m_colorWR.GetBlue()) ;
|
|
// disegno
|
|
glDrawArrays( GL_LINE_LOOP, 0, 4) ;
|
|
}
|
|
// altrimenti area
|
|
else {
|
|
// assegno i vertici (ordine S)
|
|
Vert3f v3V ;
|
|
v3V.Set( dViewXmin, dViewYmin, 0.5) ;
|
|
glBufferSubData( GL_ARRAY_BUFFER, 0 * SIZEV3F, SIZEV3F, &v3V) ;
|
|
v3V.Set( dViewXmax, dViewYmin, 0.5) ;
|
|
glBufferSubData( GL_ARRAY_BUFFER, 1 * SIZEV3F, SIZEV3F, &v3V) ;
|
|
v3V.Set( dViewXmin, dViewYmax, 0.5) ;
|
|
glBufferSubData( GL_ARRAY_BUFFER, 2 * SIZEV3F, SIZEV3F, &v3V) ;
|
|
v3V.Set( dViewXmax, dViewYmax, 0.5) ;
|
|
glBufferSubData( GL_ARRAY_BUFFER, 3 * SIZEV3F, SIZEV3F, &v3V) ;
|
|
// imposto blending e colore
|
|
glEnable( GL_BLEND) ;
|
|
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;
|
|
glColor4f( m_colorWR.GetRed(), m_colorWR.GetGreen(), m_colorWR.GetBlue(), m_colorWR.GetAlpha()) ;
|
|
// disegno
|
|
glDrawArrays( GL_TRIANGLE_STRIP, 0, 4) ;
|
|
// disabilito blending
|
|
glDisable( GL_BLEND) ;
|
|
}
|
|
// cancello VAO e VBO
|
|
glBindBuffer( GL_ARRAY_BUFFER, 0) ;
|
|
glDeleteBuffers( 1, &nVboId) ;
|
|
glBindVertexArray( 0) ;
|
|
glDeleteVertexArrays( 1, &nVaoId) ;
|
|
}
|
|
|
|
// ripristino le matrici di proiezione e di modello/vista originali
|
|
glMatrixMode( GL_PROJECTION) ;
|
|
glPopMatrix() ;
|
|
glMatrixMode( GL_MODELVIEW) ;
|
|
glPopMatrix() ;
|
|
|
|
return true ;
|
|
} |