diff --git a/EgtGraphics.rc b/EgtGraphics.rc
index 3b4d88e..d5613de 100644
Binary files a/EgtGraphics.rc and b/EgtGraphics.rc differ
diff --git a/EgtGraphics.vcxproj b/EgtGraphics.vcxproj
index 2b31922..a22d313 100644
--- a/EgtGraphics.vcxproj
+++ b/EgtGraphics.vcxproj
@@ -225,6 +225,7 @@ copy $(TargetPath) \EgtProg\Dll64
+
Create
Create
diff --git a/EgtGraphics.vcxproj.filters b/EgtGraphics.vcxproj.filters
index 3387407..32e4ca2 100644
--- a/EgtGraphics.vcxproj.filters
+++ b/EgtGraphics.vcxproj.filters
@@ -92,6 +92,9 @@
File di origine
+
+ File di origine
+
diff --git a/Scene.h b/Scene.h
index 3e6d912..043e11c 100644
--- a/Scene.h
+++ b/Scene.h
@@ -33,7 +33,6 @@ class Scene : public IEGrScene
virtual std::string GetGLSLInfo( void) ;
virtual std::string GetPixelFormatInfo( void) ;
virtual bool RedrawWindow( void) ;
- virtual bool SetExtension( const BBox3d& b3Ext) ;
virtual bool Reshape( int nW, int nH) ;
virtual bool SetBackground( Color BackTop, Color BackBottom) ;
virtual bool Prepare( void) ;
@@ -55,8 +54,14 @@ class Scene : public IEGrScene
virtual bool ZoomAll( void) ;
virtual bool ZoomChange( double dCoeff) ;
virtual bool ZoomOnPoint( const Point3d& ptWin, double dCoeff) ;
+ virtual bool ZoomWin( const Point3d& ptWin1, const Point3d& ptWin2) ;
// Geometry
+ virtual bool SetExtension( const BBox3d& b3Ext) ;
virtual bool UpdateExtension( void) ;
+ // Aux
+ virtual bool SetWinRectAttribs( bool bOutline, Color WRcol) ;
+ virtual bool SetWinRect( const Point3d& ptWinRectP1, const Point3d& ptWinRectP2) ;
+ virtual bool ResetWinRect( void) ;
public :
// Basic
@@ -78,13 +83,16 @@ class Scene : public IEGrScene
// Camera
bool VerifyCamera( void) ;
bool CalcDirUp( void) ;
+ bool CalcCameraFrame( Frame3d& frView) ;
// Geometry
bool DrawGroup( int nId) ;
bool DrawGeoObj( IGeoObj* pGeoObj) ;
bool DeleteObjGraphicsGroup( int nId) ;
+ // Aux
+ bool DrawWinRect( void) ;
private :
- IGeomDB* m_pGeomDB ;
+ IGeomDB* m_pGeomDB ; // puntatore al DB geometrico
HDC m_hDC ; // Device Context
HGLRC m_hRC ; // OpenGL Rendering Context
@@ -106,8 +114,14 @@ class Scene : public IEGrScene
BBox3d m_b3ExtWorld ; // estensione della geometria nel riferimento globale (mondo)
BBox3d m_b3ExtView ; // estensione nel riferimento di vista
bool m_bExtViewOk ; // flag per stato aggiornamento di EView
- double m_dHalfWidth ;
- double m_dHalfHeight ;
- double m_dZNear ;
- double m_dZFar ;
+ double m_dHalfWidth ; // semialtezza della vista
+ double m_dHalfHeight ; // semilarghezza della vista
+ double m_dZNear ; // distanza del piano di clipping vicino
+ double m_dZFar ; // distanza del piano di clipping lontano
+
+ bool m_bOutlineWR ; // flag per disegno WinRect con solo contorno o pieno
+ Color m_colorWR ; // colore per WinRect
+ bool m_bWinRect ; // flag esistenza rettangolo temporaneo in finestra
+ Point3d m_ptWinRectP1 ; // primo estremo del rettangolo temporaneo
+ Point3d m_ptWinRectP2 ; // secondo estremo del rettangolo temporaneo
} ;
diff --git a/SceneAux.cpp b/SceneAux.cpp
new file mode 100644
index 0000000..3fd84b5
--- /dev/null
+++ b/SceneAux.cpp
@@ -0,0 +1,182 @@
+//----------------------------------------------------------------------------
+// EgalTech 2014-2014
+//----------------------------------------------------------------------------
+// File : SceneAux.cpp Data : 25.02.14 Versione : 1.5b4
+// Contenuto : Implementazione della gestione ausiliari della classe scena.
+//
+//
+//
+// Modifiche : 25.02.14 DS Creazione modulo.
+//
+//
+//----------------------------------------------------------------------------
+
+//--------------------------- Include ----------------------------------------
+#include "stdafx.h"
+#include "Scene.h"
+#include "ObjOldGraphics.h"
+#include "ObjNewGraphics.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 ;
+
+//------------------------------ Constants -----------------------------------
+
+//----------------------------------------------------------------------------
+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 ( ! AreSamePointNear( m_ptWinRectP1, m_ptWinRectP2)) ;
+}
+
+//----------------------------------------------------------------------------
+bool
+Scene::ResetWinRect( void)
+{
+ bool bOld = m_bWinRect ;
+ m_bWinRect = false ;
+
+ return bOld ;
+}
+
+//----------------------------------------------------------------------------
+bool
+Scene::DrawWinRect( void)
+{
+ // verifico sia da disegnare
+ if ( ! m_bWinRect)
+ return true ;
+
+ // 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 ;
+}
\ No newline at end of file
diff --git a/SceneBasic.cpp b/SceneBasic.cpp
index 027f1f2..05d4203 100644
--- a/SceneBasic.cpp
+++ b/SceneBasic.cpp
@@ -54,6 +54,10 @@ Scene::Scene( void)
// View data
m_ptCenter = ORIG ;
SetCamera( 0, 0, 0) ;
+ // WinRect
+ m_bOutlineWR = true ;
+ m_colorWR.Set( 0, 0, 0) ;
+ m_bWinRect = false ;
}
//----------------------------------------------------------------------------
@@ -346,10 +350,7 @@ Scene::CalcExtView( void)
return false ;
// calcolo il riferimento di vista
Frame3d frView ;
- Vector3d vtZ = m_vtDirCamera ;
- Vector3d vtY = m_vtUp ;
- Vector3d vtX = vtY ^ vtZ ;
- if ( ! frView.Set( m_ptCenter + m_dDistCamera * vtZ, vtX, vtY, vtZ))
+ if ( ! CalcCameraFrame( frView))
return false ;
// calcolo l'estensione nel riferimento di vista
m_b3ExtView = m_b3ExtWorld ;
@@ -609,9 +610,12 @@ Scene::Draw( void)
// colore di default
glColor4f( 1, 1, 1, 1) ;
- // disegno
+ // disegno le geometrie del DB
DrawGroup( GDB_ID_ROOT) ;
+ // aggiungo disegni diretti
+ DrawWinRect() ;
+
// aggiorno
glFlush() ;
diff --git a/SceneCamera.cpp b/SceneCamera.cpp
index 8329f36..716d8ab 100644
--- a/SceneCamera.cpp
+++ b/SceneCamera.cpp
@@ -191,6 +191,23 @@ Scene::CalcDirUp( void)
return m_bUpOk ;
}
+//----------------------------------------------------------------------------
+bool
+Scene::CalcCameraFrame( Frame3d& frView)
+{
+ // verifico direzione camera Up
+ if ( ! CalcDirUp())
+ return false ;
+ // eseguo il calcolo
+ Vector3d vtZ = m_vtDirCamera ;
+ Vector3d vtY = m_vtUp ;
+ Vector3d vtX = vtY ^ vtZ ;
+ if ( ! frView.Set( m_ptCenter + m_dDistCamera * vtZ, vtX, vtY, vtZ))
+ return false ;
+
+ return true ;
+}
+
//----------------------------------------------------------------------------
bool
Scene::PanCamera( const Point3d& ptWinOld, const Point3d& ptWinNew)
@@ -294,3 +311,38 @@ Scene::ZoomOnPoint( const Point3d& ptWin, double dCoeff)
// eseguo lo zoom
return ZoomChange( dCoeff) ;
}
+
+//----------------------------------------------------------------------------
+bool
+Scene::ZoomWin( const Point3d& ptWin1, const Point3d& ptWin2)
+{
+ // porto i punti in coordinate mondo
+ Point3d ptWorld1 ;
+ if ( ! UnProject( Point3d( ptWin1.x, ptWin1.y, GetProjectedCenter().z), ptWorld1))
+ return false ;
+ Point3d ptWorld2 ;
+ if ( ! UnProject( Point3d( ptWin2.x, ptWin2.y, GetProjectedCenter().z), ptWorld2))
+ return false ;
+
+ // recupero il riferimento della camera (vista)
+ Frame3d frView ;
+ if ( ! CalcCameraFrame( frView))
+ return false ;
+
+ // porto i punti in coordinate camera (vista)
+ Point3d ptView1 = ptWorld1 ;
+ ptView1.ToLoc( frView) ;
+ Point3d ptView2 = ptWorld2 ;
+ ptView2.ToLoc( frView) ;
+
+ // imposto il nuovo centro di vista
+ Point3d ptNewCen = 0.5 * ( ptWorld1 + ptWorld2) ;
+ SetCenter( ptNewCen) ;
+
+ // imposto il nuovo zoom
+ double dHalfWidth = 0.5 * fabs( ptView1.x - ptView2.x) ;
+ double dHalfHeight = 0.5 * fabs( ptView1.y - ptView2.y) ;
+
+ // adatto le dimensioni a quelle della vista
+ return AdjustDimView( dHalfWidth, dHalfHeight) ;
+}
\ No newline at end of file