From 912e699047d6131a3abf4fa6c2970cf1f35c6563 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Thu, 2 Feb 2017 20:01:05 +0000 Subject: [PATCH] EgtGraphics 1.6x3 : - aggiunto oggetto MultiGraphics per accelerare visualizzazione Zmap in modifica. --- EgtGraphics.rc | Bin 11612 -> 11612 bytes EgtGraphics.vcxproj | 2 + EgtGraphics.vcxproj.filters | 6 ++ ObjEGrGraphics.h | 1 + ObjMultiGraphics.cpp | 202 ++++++++++++++++++++++++++++++++++++ ObjMultiGraphics.h | 56 ++++++++++ ObjNewGraphics.h | 44 ++++---- ObjOldGraphics.h | 44 ++++---- SceneGeom.cpp | 91 ++++++++++------ 9 files changed, 372 insertions(+), 74 deletions(-) create mode 100644 ObjMultiGraphics.cpp create mode 100644 ObjMultiGraphics.h diff --git a/EgtGraphics.rc b/EgtGraphics.rc index dfcacf194e2b0ecb4d0abdb805cb7995e9798429..cb70dabc54e8c346d4de08280de436fcb79c41b3 100644 GIT binary patch delta 119 zcmcZ;bth`WA2vqg&41YhnHh~IGxF$8RuJ07Xg+zb)Wppl+%`Z#pxl0@$!U^#$nu+S U3!TO(w^!;cL=KCYV#;n@0E>Gj&;S4c delta 119 zcmcZ;bth`WA2vp#&41YhnHh~HGxF$8RuJ07Xf}DT)Wppl+%`Z#pxl0@$!U^#$nu+S U3!TO(w^!;cL=KCYV#;n@0En+9!~g&Q diff --git a/EgtGraphics.vcxproj b/EgtGraphics.vcxproj index dd014fc..ebb7581 100644 --- a/EgtGraphics.vcxproj +++ b/EgtGraphics.vcxproj @@ -226,6 +226,7 @@ copy $(TargetPath) \EgtProg\Dll64 + @@ -239,6 +240,7 @@ copy $(TargetPath) \EgtProg\Dll64 + diff --git a/EgtGraphics.vcxproj.filters b/EgtGraphics.vcxproj.filters index 0d7ccf9..47e21ec 100644 --- a/EgtGraphics.vcxproj.filters +++ b/EgtGraphics.vcxproj.filters @@ -81,6 +81,9 @@ File di intestazione + + File di intestazione + @@ -128,6 +131,9 @@ File di origine + + File di origine + diff --git a/ObjEGrGraphics.h b/ObjEGrGraphics.h index 7309cc3..d95cf3c 100644 --- a/ObjEGrGraphics.h +++ b/ObjEGrGraphics.h @@ -31,6 +31,7 @@ class ObjEGrGraphics : public IObjGraphics virtual bool IsValid( void) = 0 ; virtual void SetScene( Scene* pScene) = 0 ; virtual Scene* GetScene( void) = 0 ; + virtual bool SetCurrent( int nCurr) { return false ; } ; virtual void Clear( void) = 0 ; virtual bool AddColor( const Color& colC) = 0 ; virtual bool AddMaterial( const Color& colAmb, const Color& colDiff, diff --git a/ObjMultiGraphics.cpp b/ObjMultiGraphics.cpp new file mode 100644 index 0000000..5a91a4e --- /dev/null +++ b/ObjMultiGraphics.cpp @@ -0,0 +1,202 @@ +//---------------------------------------------------------------------------- +// EgalTech 2017-2017 +//---------------------------------------------------------------------------- +// File : ObjMultiGraphics.cpp Data : 02.02.17 Versione : 1.6x3 +// Contenuto : Implementazione classe multi-grafica di un oggetto geometrico. +// +// +// +// Modifiche : 02.02.17 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +//--------------------------- Include ---------------------------------------- +#include "stdafx.h" +#include "ObjMultiGraphics.h" +#include "ObjNewGraphics.h" +#include "ObjOldGraphics.h" + +//---------------------------------------------------------------------------- +ObjMultiGraphics::~ObjMultiGraphics( void) +{ + for ( size_t i = 0 ; i < m_vOEGR.size() ; ++ i) { + delete m_vOEGR[i] ; + m_vOEGR[i] = nullptr ; + } +} + +//---------------------------------------------------------------------------- +void +ObjMultiGraphics::Reset( void) +{ + m_bValid = false ; + m_nCurr = - 1 ; +} + +//---------------------------------------------------------------------------- +void +ObjMultiGraphics::SetScene( Scene* pScene) +{ + m_pScene = pScene ; + for ( size_t i = 0 ; i < m_vOEGR.size() ; ++ i) + m_vOEGR[i]->SetScene( pScene) ; +} + +//---------------------------------------------------------------------------- +bool +ObjMultiGraphics::SetCurrent( int nCurr) +{ + if ( nCurr < 0 || nCurr >= int( m_vOEGR.size())) { + m_nCurr = - 1 ; + return false ; + } + m_nCurr = nCurr ; + return true ; +} + +//---------------------------------------------------------------------------- +void +ObjMultiGraphics::Clear( void) +{ + m_bValid = false ; + if ( m_nCurr < 0 || m_nCurr >= int( m_vOEGR.size())) + return ; + m_vOEGR[m_nCurr]->Clear() ; +} + +//---------------------------------------------------------------------------- +bool +ObjMultiGraphics::AddColor( const Color& colC) +{ + if ( m_nCurr < 0 || m_nCurr >= int( m_vOEGR.size())) + return false ; + return m_vOEGR[m_nCurr]->AddColor( colC) ; +} + +//---------------------------------------------------------------------------- +bool +ObjMultiGraphics::AddMaterial( const Color& colAmb, const Color& colDiff, + const Color& colSpec, float fShin) +{ + if ( m_nCurr < 0 || m_nCurr >= int( m_vOEGR.size())) + return false ; + return m_vOEGR[m_nCurr]->AddMaterial( colAmb, colDiff, colSpec, fShin) ; +} + +//---------------------------------------------------------------------------- +bool +ObjMultiGraphics::AddBackMaterial( const Color& colAmbDiff) +{ + if ( m_nCurr < 0 || m_nCurr >= int( m_vOEGR.size())) + return false ; + return m_vOEGR[m_nCurr]->AddBackMaterial( colAmbDiff) ; +} + +//---------------------------------------------------------------------------- +bool +ObjMultiGraphics::AddPoint( const Point3d& ptP, bool bAux) +{ + if ( m_nCurr < 0 || m_nCurr >= int( m_vOEGR.size())) + return false ; + m_bValid = true ; + return m_vOEGR[m_nCurr]->AddPoint( ptP, bAux) ; +} + +//---------------------------------------------------------------------------- +bool +ObjMultiGraphics::AddLines( const PNTVECTOR& vPnt, bool bAux) +{ + if ( m_nCurr < 0 || m_nCurr >= int( m_vOEGR.size())) + return false ; + m_bValid = true ; + return m_vOEGR[m_nCurr]->AddLines( vPnt, bAux) ; +} + +//---------------------------------------------------------------------------- +bool +ObjMultiGraphics::AddPolyLine( const PolyLine& PL, bool bAux) +{ + if ( m_nCurr < 0 || m_nCurr >= int( m_vOEGR.size())) + return false ; + m_bValid = true ; + return m_vOEGR[m_nCurr]->AddPolyLine( PL, bAux) ; +} + +//---------------------------------------------------------------------------- +bool +ObjMultiGraphics::StartTriangles( int nNum, bool bAux) +{ + if ( m_nCurr < 0 || m_nCurr >= int( m_vOEGR.size())) + return false ; + return m_vOEGR[m_nCurr]->StartTriangles( nNum, bAux) ; +} + +//---------------------------------------------------------------------------- +bool +ObjMultiGraphics::AddTriangle( const Triangle3d& Tria, const TriFlags3d& TFlags, const TriNormals3d& TNrms) +{ + if ( m_nCurr < 0 || m_nCurr >= int( m_vOEGR.size())) + return false ; + return m_vOEGR[m_nCurr]->AddTriangle( Tria, TFlags, TNrms) ; +} + +//---------------------------------------------------------------------------- +bool +ObjMultiGraphics::EndTriangles( void) +{ + if ( m_nCurr < 0 || m_nCurr >= int( m_vOEGR.size())) + return false ; + m_bValid = true ; + return m_vOEGR[m_nCurr]->EndTriangles() ; +} + +//---------------------------------------------------------------------------- +bool +ObjMultiGraphics::Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool bShowAux) +{ + bool bOk = true ; + for ( size_t i = 0 ; i < m_vOEGR.size() ; ++ i) { + if ( m_vOEGR[i] != nullptr && + m_vOEGR[i]->IsValid() && + ! m_vOEGR[i]->Draw( nStat, nMark, bSurfSha, nAlpha, bShowAux)) + bOk = false ; + } + return bOk ; +} + +//---------------------------------------------------------------------------- +bool +ObjMultiGraphics::GetLocalBBox( BBox3d& b3Loc) const +{ + // svuoto BBox + m_b3Loc.Reset() ; + // aggiorno il bbox con quello dei componenti + for ( size_t i = 0 ; i < m_vOEGR.size() ; ++ i) { + if ( m_vOEGR[i] != nullptr && + m_vOEGR[i]->IsValid()) { + BBox3d b3Temp ; + if ( m_vOEGR[i]->GetLocalBBox( b3Temp)) + m_b3Loc.Add( b3Temp) ; + } + } + // copio + b3Loc = m_b3Loc ; + // verifico non sia vuoto + return ! m_b3Loc.IsEmpty() ; +} + +//---------------------------------------------------------------------------- +ObjMultiGraphics::ObjMultiGraphics( int nCount, bool bNewWay) +{ + m_pScene = nullptr ; + m_bValid = false ; + m_vOEGR.reserve( nCount) ; + for ( int i = 0 ; i < nCount ; ++ i) { + if ( bNewWay) + m_vOEGR.emplace_back( new ObjNewGraphics) ; + else + m_vOEGR.emplace_back( new ObjOldGraphics) ; + } + m_nCurr = - 1 ; +} diff --git a/ObjMultiGraphics.h b/ObjMultiGraphics.h new file mode 100644 index 0000000..f907b34 --- /dev/null +++ b/ObjMultiGraphics.h @@ -0,0 +1,56 @@ +//---------------------------------------------------------------------------- +// EgalTech 2017-2017 +//---------------------------------------------------------------------------- +// File : ObjMultiGraphics.h Data : 02.02.17 Versione : 1.6x3 +// Contenuto : Dichiarazione classe multi-grafica di un oggetto geometrico. +// +// +// +// Modifiche : 02.02.17 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +#pragma once + +#include "ObjEGrGraphics.h" +#include + +//---------------------------------------------------------------------------- +class ObjMultiGraphics : public ObjEGrGraphics +{ + public : // IObjGraphics + ~ObjMultiGraphics( void) override ; + void Reset( void) override ; + + public : // ObjEGrGraphics + bool IsValid( void) override + { return m_bValid ; } + void SetScene( Scene* pScene) override ; + Scene* GetScene( void) override + { return m_pScene ; } + bool SetCurrent( int nCurr) ; + void Clear( void) override ; + bool AddColor( const Color& colC) override ; + bool AddMaterial( const Color& colAmb, const Color& colDiff, + const Color& colSpec, float fShin) override ; + bool AddBackMaterial( const Color& colAmbDiff) override ; + bool AddPoint( const Point3d& ptP, bool bAux = false) override ; + bool AddLines( const PNTVECTOR& vPnt, bool bAux = false) override ; + bool AddPolyLine( const PolyLine& PL, bool bAux = false) override ; + bool StartTriangles( int nNum, bool bAux = false) override ; + bool AddTriangle( const Triangle3d& Tria, const TriFlags3d& TFlags, const TriNormals3d& TNrms) override ; + bool EndTriangles( void) override ; + bool Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool bShowAux) override ; + bool GetLocalBBox( BBox3d& b3Loc) const override ; + + public : + ObjMultiGraphics( int nCount, bool bNewWay) ; + + private : + Scene* m_pScene ; // puntatore alla scena + bool m_bValid ; // flag + mutable BBox3d m_b3Loc ; // BoundingBox locale + int m_nCurr ; // Graphics corrente + std::vector m_vOEGR ; // vettore di Graphics +} ; diff --git a/ObjNewGraphics.h b/ObjNewGraphics.h index 10e0bc5..aba3ee9 100644 --- a/ObjNewGraphics.h +++ b/ObjNewGraphics.h @@ -55,30 +55,30 @@ typedef std::list NGALIST ; class ObjNewGraphics : public ObjEGrGraphics { public : // IObjGraphics - virtual ~ObjNewGraphics( void) ; - virtual void Reset( void) ; + ~ObjNewGraphics( void) override ; + void Reset( void) override ; public : // ObjEGrGraphics - virtual bool IsValid( void) - { return m_bValid ; } - virtual void SetScene( Scene* pScene) - { m_pScene = pScene ; } - virtual Scene* GetScene( void) - { return m_pScene ; } - virtual void Clear( void) ; - virtual bool AddColor( const Color& colC) ; - virtual bool AddMaterial( const Color& colAmb, const Color& colDiff, - const Color& colSpec, float fShin) ; - virtual bool AddBackMaterial( const Color& colAmbDiff) ; - virtual bool AddPoint( const Point3d& ptP, bool bAux = false) ; - virtual bool AddLines( const PNTVECTOR& vPnt, bool bAux = false) ; - virtual bool AddPolyLine( const PolyLine& PL, bool bAux = false) ; - virtual bool StartTriangles( int nNum, bool bAux = false) ; - virtual bool AddTriangle( const Triangle3d& Tria, const TriFlags3d& TFlags, const TriNormals3d& TNrms) ; - virtual bool EndTriangles( void) ; - virtual bool Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool bShowAux) ; - virtual bool GetLocalBBox( BBox3d& b3Loc) const - { b3Loc = m_b3Loc ; return ! m_b3Loc.IsEmpty() ; } + bool IsValid( void) override + { return m_bValid ; } + void SetScene( Scene* pScene) override + { m_pScene = pScene ; } + Scene* GetScene( void) override + { return m_pScene ; } + void Clear( void) override ; + bool AddColor( const Color& colC) override ; + bool AddMaterial( const Color& colAmb, const Color& colDiff, + const Color& colSpec, float fShin) override ; + bool AddBackMaterial( const Color& colAmbDiff) override ; + bool AddPoint( const Point3d& ptP, bool bAux = false) override ; + bool AddLines( const PNTVECTOR& vPnt, bool bAux = false) override ; + bool AddPolyLine( const PolyLine& PL, bool bAux = false) override ; + bool StartTriangles( int nNum, bool bAux = false) override ; + bool AddTriangle( const Triangle3d& Tria, const TriFlags3d& TFlags, const TriNormals3d& TNrms) override ; + bool EndTriangles( void) override ; + bool Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool bShowAux) override ; + bool GetLocalBBox( BBox3d& b3Loc) const override + { b3Loc = m_b3Loc ; return ! m_b3Loc.IsEmpty() ; } public : ObjNewGraphics( void) : m_pScene( nullptr), m_bValid( false) {} diff --git a/ObjOldGraphics.h b/ObjOldGraphics.h index 7d2241d..74949bc 100644 --- a/ObjOldGraphics.h +++ b/ObjOldGraphics.h @@ -60,30 +60,30 @@ typedef std::vector OGAVECT ; class ObjOldGraphics : public ObjEGrGraphics { public : // IObjGraphics - virtual ~ObjOldGraphics( void) ; - virtual void Reset( void) ; + ~ObjOldGraphics( void) override ; + void Reset( void) override ; public : // ObjEGrGraphics - virtual bool IsValid( void) - { return m_bValid ; } - virtual void SetScene( Scene* pScene) - { m_pScene = pScene ; } - virtual Scene* GetScene( void) - { return m_pScene ; } - virtual void Clear( void) ; - virtual bool AddColor( const Color& colC) ; - virtual bool AddMaterial( const Color& colAmb, const Color& colDiff, - const Color& colSpec, float fShin) ; - virtual bool AddBackMaterial( const Color& colAmbDiff) ; - virtual bool AddPoint( const Point3d& ptP, bool bAux = false) ; - virtual bool AddLines( const PNTVECTOR& vPnt, bool bAux = false) ; - virtual bool AddPolyLine( const PolyLine& PL, bool bAux = false) ; - virtual bool StartTriangles( int nNum, bool bAux = false) ; - virtual bool AddTriangle( const Triangle3d& Tria, const TriFlags3d& TFlags, const TriNormals3d& TNrms) ; - virtual bool EndTriangles( void) ; - virtual bool Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool bShowAux) ; - virtual bool GetLocalBBox( BBox3d& b3Loc) const - { b3Loc = m_b3Loc ; return ! m_b3Loc.IsEmpty() ; } + bool IsValid( void) override + { return m_bValid ; } + void SetScene( Scene* pScene) override + { m_pScene = pScene ; } + Scene* GetScene( void) override + { return m_pScene ; } + void Clear( void) override ; + bool AddColor( const Color& colC) override ; + bool AddMaterial( const Color& colAmb, const Color& colDiff, + const Color& colSpec, float fShin) override ; + bool AddBackMaterial( const Color& colAmbDiff) override ; + bool AddPoint( const Point3d& ptP, bool bAux = false) override ; + bool AddLines( const PNTVECTOR& vPnt, bool bAux = false) override ; + bool AddPolyLine( const PolyLine& PL, bool bAux = false) override ; + bool StartTriangles( int nNum, bool bAux = false) override ; + bool AddTriangle( const Triangle3d& Tria, const TriFlags3d& TFlags, const TriNormals3d& TNrms) override ; + bool EndTriangles( void) override ; + bool Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool bShowAux) override ; + bool GetLocalBBox( BBox3d& b3Loc) const override + { b3Loc = m_b3Loc ; return ! m_b3Loc.IsEmpty() ; } public : ObjOldGraphics( void) : m_pScene( nullptr), m_nCurrMode( GL_NONE), m_bValid( false) {} diff --git a/SceneGeom.cpp b/SceneGeom.cpp index b4f154b..39b09f3 100644 --- a/SceneGeom.cpp +++ b/SceneGeom.cpp @@ -16,7 +16,9 @@ #include "Scene.h" #include "ObjOldGraphics.h" #include "ObjNewGraphics.h" +#include "ObjMultiGraphics.h" #include "EGrUtils.h" +#include "DllMain.h" #include "/EgtDev/Include/EgtILogger.h" #include "/EgtDev/Include/EGnStringUtils.h" #include "/EgtDev/Include/EGkFrame3d.h" @@ -35,7 +37,7 @@ using namespace std ; //------------------------------ Local functions ----------------------------- -static ObjEGrGraphics* CreateObjEGrGraphics( bool bNewWay) ; +static ObjEGrGraphics* CreateObjEGrGraphics( int nCount, bool bNewWay) ; static bool CalcCurveTailMark( const Vector3d& vtRef, const PolyLine& plCrv, PolyLine& plMark) ; static bool CalcCurveTipArrow( const Vector3d& vtRef, const PolyLine& plCrv, PolyLine& plArr) ; static bool CalcConnectingLines( const PolyLine& plCrv, const Vector3d& vtTh, bool bDense, PNTVECTOR& vPnt) ; @@ -171,7 +173,18 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj) // se non esiste grafica associata, la creo if ( pGeoObj->GetObjGraphics() == nullptr) { - // nuova modalità grafica solo per superfici con molti triangoli + // oggetto grafico molteplice solo per Zmap che lo richiedono + int nCount = 0 ; + if ( nGeoType == VOL_ZMAP) { + const IVolZmap* pZmap = GetVolZmap( pGeoObj) ; + if ( pZmap != nullptr) { + switch ( m_nShowZmap) { + case ZSM_SURF : nCount = pZmap->GetBlockCount() ; break ; + case ZSM_BOTH : nCount = pZmap->GetBlockCount() + 1 ; break ; + } + } + } + // nuova modalità grafica solo per superfici con molti triangoli o solidi Zmap const int N_MIN_TRIA_NEWWAY = 100 ; bool bNewWay = false ; if ( m_bNewWay) { @@ -188,7 +201,7 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj) bNewWay = true ; } } - ObjEGrGraphics* pGraphics = CreateObjEGrGraphics( bNewWay) ; + ObjEGrGraphics* pGraphics = CreateObjEGrGraphics( nCount, bNewWay) ; if ( pGraphics == nullptr) return false ; pGraphics->SetScene( this) ; @@ -329,36 +342,52 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj) const IVolZmap* pZmap = GetVolZmap( pGeoObj) ; if ( pZmap == nullptr) return false ; - // recupero il materiale + // recupero il materiale Material mMat ; if ( ! iIter.GetCalcMaterial( mMat)) mMat.Set( m_colDef) ; - // impostazioni iniziali - pGraphics->Clear() ; - // visualizzazione superficie - if ( m_nShowZmap != ZSM_LINES) { - pGraphics->AddColor( siObj.colObj) ; // per wireframe - pGraphics->AddMaterial( mMat.GetAmbient(), mMat.GetDiffuse(), - mMat.GetSpecular(), mMat.GetShininess()) ; - pGraphics->AddBackMaterial( GetSurfBackColor( mMat.GetDiffuse())) ; - // recupero la geometria - TRIA3DLIST lstTria ; - pZmap->GetAllTriangles( lstTria) ; - // passo i triangoli alla grafica - pGraphics->StartTriangles( int( lstTria.size())) ; - for ( const auto& Tria : lstTria) { - TriFlags3d TFlags ; - TriNormals3d TNrms ; - for ( int i = 0 ; i < 3 ; ++i) { - TFlags.bFlag[i] = true ; - TNrms.vtN[i] = Tria.GetN() ; - } - pGraphics->AddTriangle( Tria, TFlags, TNrms) ; - } - pGraphics->EndTriangles() ; + // ciclo sui blocchi da aggiornare + std::vector vUpdate ; + pZmap->GetBlockInfo( vUpdate) ; + int nCount = int( vUpdate.size()) ; + for ( int i = 0 ; i < nCount ; ++ i) { + // se da non aggiornare, vado oltre + if ( ! vUpdate[i]) + continue ; + // imposto indice blocco corrente + pGraphics->SetCurrent( i) ; + // lo pulisco + pGraphics->Clear() ; + // visualizzazione superficie + if ( m_nShowZmap != ZSM_LINES) { + pGraphics->AddColor( siObj.colObj) ; // per wireframe + pGraphics->AddMaterial( mMat.GetAmbient(), mMat.GetDiffuse(), + mMat.GetSpecular(), mMat.GetShininess()) ; + pGraphics->AddBackMaterial( GetSurfBackColor( mMat.GetDiffuse())) ; + // recupero la geometria + TRIA3DLIST lstTria ; + pZmap->GetBlockTriangles( i, lstTria) ; + // passo i triangoli alla grafica + pGraphics->StartTriangles( int( lstTria.size())) ; + for ( const auto& Tria : lstTria) { + TriFlags3d TFlags ; + TriNormals3d TNrms ; + for ( int j = 0 ; j < 3 ; ++ j) { + TFlags.bFlag[j] = true ; + TNrms.vtN[j] = Tria.GetN() ; + } + pGraphics->AddTriangle( Tria, TFlags, TNrms) ; + } + pGraphics->EndTriangles() ; + } } - // visualizzazione spilloni + // visualizzazione spilloni (sempre nell'ultimo blocco) if ( m_nShowZmap == ZSM_LINES || m_nShowZmap == ZSM_BOTH) { + // imposto indice blocco corrente + pGraphics->SetCurrent( nCount) ; + // lo pulisco + pGraphics->Clear() ; + // ciclo sui tre gruppi di spilloni Color vCol[3] = {BLUE, RED, GREEN} ; for ( int k = 0 ; k < 3 ; ++ k) { pGraphics->AddColor( vCol[k]) ; @@ -578,9 +607,11 @@ Scene::DeleteObjGraphicsGroup( int nId) //------------------------------ Local functions ----------------------------- //---------------------------------------------------------------------------- static ObjEGrGraphics* -CreateObjEGrGraphics( bool bNewWay) +CreateObjEGrGraphics( int nCount, bool bNewWay) { - if ( bNewWay) + if ( nCount > 1) + return ( new ObjMultiGraphics( nCount, bNewWay)) ; + else if ( bNewWay) return ( new ObjNewGraphics) ; else return ( new ObjOldGraphics) ;