EgtGraphics 1.6b7 :

- griglia non più nascosta da oggetti in hiddenline
- corretta visualizzazione superfici trasparenti con riferimenti locali al gruppo
- con selezione oggetti, con il punto si ritorna indice di sotto-oggetto
- aggiunto snap-point di superfici e fatte correzioni in generale.
This commit is contained in:
Dario Sassi
2015-03-11 07:49:00 +00:00
parent 21d509f3da
commit 992f5360b6
12 changed files with 271 additions and 84 deletions
+191 -66
View File
@@ -14,17 +14,19 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "Scene.h"
#include "ObjEGrGraphics.h"
#include "/EgtDev/Include/EGkGeomDB.h"
#include "/EgtDev/Include/EgkGeoPoint3d.h"
#include "/EgtDev/Include/EgkGeoVector3d.h"
#include "/EgtDev/Include/EGkFrame3d.h"
#include "/EgtDev/Include/EGkCurve.h"
#include "/EgtDev/Include/EGkCurveArc.h"
#include "/EgtDev/Include/EGkCurveComposite.h"
#include "/EgtDev/Include/EGkDistPointCurve.h"
#include "/EgtDev/Include/EGkSurfTriMesh.h"
#include "/EgtDev/Include/EGkExtText.h"
#include "/EgtDev/Include/EgkIntersCurveCurve.h"
#include "/EgtDev/Include/EgkIntersLineTria.h"
#include "/EgtDev/Include/EGkIntersLineSurfTm.h"
#include "/EgtDev/Include/EgtPointerOwner.h"
@@ -359,7 +361,13 @@ Scene::FindCurveSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame
bFound = true ;
m_nLastSnapId = nId ;
m_ptLastSnapPnt = ptP ;
m_bLastSnapDirOk = false ;
if ( pCrv->GetType() == CRV_ARC) {
m_bLastSnapDirOk = true ;
m_vtLastSnapDir = GetCurveArc( pCrv)->GetNormVersor() ;
m_vtLastSnapDir.ToGlob( frEnt) ;
}
else
m_bLastSnapDirOk = false ;
}
}
break ;
@@ -414,11 +422,18 @@ Scene::FindCurveSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame
bool
Scene::VerifySnapPoint( const Point3d& ptP, const Point3d& ptWin, double& dMinSqDist)
{
// proietto il punto sulla viewport
Point3d ptWinP ;
Project( ptP, ptWinP) ;
// confronto le distanze
double dSqDist = SqDistXY( ptWin, ptWinP) ;
// il punto di riferimento deriva da XY su viewport e Z minima (più vicina a osservatore) da selezione
Point3d ptWinZ( ptWin.x, ptWin.y, GetSelectedObjMinWinZ()) ;
// punto di riferimento nello spazio geometrico 3d
Point3d ptRef ;
if ( ! UnProject( ptWinZ, ptRef))
return false ;
// recupero la direzione di mira
Vector3d vtDir = - m_vtDirCamera ;
// il punto di confronto è quello sulla linea di mira a minima distanza dal punto dato
Point3d ptCfr = ptRef + (( ptP - ptRef) * vtDir) * vtDir ;
// determino la distanza e la confronto con il minimo
double dSqDist = SqDist( ptP, ptCfr) ;
if ( dSqDist < dMinSqDist) {
dMinSqDist = dSqDist ;
return true ;
@@ -538,64 +553,172 @@ Scene::FindSurfTMSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fram
// recupero la direzione di mira e la porto nel riferimento della superficie
Vector3d vtDir = - m_vtDirCamera ;
vtDir.ToLoc( frEnt) ;
// salvo stato precedente di snap
bool bPrevFound = ( m_nLastSnapId != GDB_ID_NULL) ;
// cerco il vertice a minor distanza dalla linea
bool bFound = false ;
int nVert ;
Point3d ptMin ;
Point3d ptP ;
int nIv = pStm->GetFirstVertex( ptP) ;
while ( nIv != SVT_NULL) {
// in generale (shading e hiddenline) il punto di confronto è quello di riferimento
Point3d ptCfr = ptRef ;
// se wireframe, il punto di confronto è quello della linea di mira a minima distanza dal vertice
if ( m_nShowMode == SM_WIREFRAME)
ptCfr = ptRef + (( ptP - ptRef) * vtDir) * vtDir ;
// determino la distanza e la confronto con il minimo
double dSqDist = SqDist( ptP, ptCfr) ;
if ( dSqDist < dMinSqDist) {
bFound = true ;
nVert = nIv ;
ptMin = ptCfr ;
dMinSqDist = dSqDist ;
ptP.ToGlob( frEnt) ;
m_nLastSnapId = nId ;
m_ptLastSnapPnt = ptP ;
m_bLastSnapDirOk = false ;
}
// passo al successivo
nIv = pStm->GetNextVertex( nIv, ptP) ;
// recupero il raggio del box di ingombro
double dBlRad = 1000 ;
const ObjEGrGraphics* pGraphics = GetObjEGrGraphics( pStm) ;
if ( pGraphics != nullptr) {
BBox3d b3Loc ;
if ( pGraphics->GetLocalBBox( b3Loc))
b3Loc.GetRadius( dBlRad) ;
}
// se è la prima selezione e non è modalità wireframe, la favorisco perchè davanti
if ( bFound && ! bPrevFound && m_nShowMode != SM_WIREFRAME)
dMinSqDist = 0 ;
// se trovato punto, cerco la faccia
if ( bFound) {
// cerco i triangoli intorno al vertice
INTVECTOR vTria ;
bool bCirc ;
int nTtot = pStm->GetAllTriaAroundVertex( nVert, vTria, bCirc) ;
// tra quelli che intersecano la linea di mira prendo il più vicino al punto Minimo
double dMinSqDistFace = INFINITO * INFINITO ;
for ( int i = 0 ; i < int( vTria.size()) ; ++ i) {
Triangle3d Tria ;
if ( ! pStm->GetTriangle( vTria[i], Tria))
continue ;
Point3d ptInt ;
int nRes = IntersLineTria( ptRef - vtDir * 1000, vtDir, 2000, Tria, ptInt) ;
if ( nRes == ILTT_IN || nRes == ILTT_EDGE || nRes == ILTT_VERT) {
double dSqDist = SqDist( ptInt, ptMin) ;
if ( dSqDist < dMinSqDistFace) {
dMinSqDistFace = dSqDist ;
m_bLastSnapDirOk = true ;
pStm->GetVertexSmoothNormal( nVert, vTria[i], m_vtLastSnapDir) ;
m_vtLastSnapDir.ToGlob( frEnt) ;
// punto davanti all'oggetto lungo il raggio di mira
Point3d ptMir = ptRef - vtDir * 2 * dBlRad ;
double dLenMir = 4 * dBlRad ;
// se richiesto il centro di gravità (baricentro, centroide)
if ( nSnap == SP_CENTROID) {
Point3d ptP ;
bool bFound = false ;
if ( pStm->GetCentroid( ptP)) {
// il punto di confronto è quello sulla linea di mira a minima distanza dal vertice
Point3d ptCfr = ptRef + (( ptP - ptRef) * vtDir) * vtDir ;
// determino la distanza e la confronto con il minimo
double dSqDist = SqDist( ptP, ptCfr) ;
if ( dSqDist < dMinSqDist) {
bFound = true ;
dMinSqDist = dSqDist ;
m_nLastSnapId = nId ;
m_ptLastSnapPnt = ptP ;
m_ptLastSnapPnt.ToGlob( frEnt) ;
m_bLastSnapDirOk = false ;
}
}
return bFound ;
}
// cerco i triangoli intersecati dalla linea di mira
ILSIVECTOR vInfo ;
if ( ! IntersLineSurfTm( ptMir, vtDir, dLenMir, *pStm, vInfo))
return false ;
// elaborazione a seconda del tipo di snap
bool bFound = false ;
switch ( nSnap) {
case SP_END :
{
// con wireframe devo provare tutti i triangoli intersecati, con shading e hiddenline solo il primo
int nTtot = (( m_nShowMode == SM_WIREFRAME) ? int( vInfo.size()) : 1) ;
for ( int i = 0 ; i < nTtot ; ++ i) {
// punto di intersezione
Point3d ptInt = vInfo[i].ptI ;
// punto finale più vicino
int nF = pStm->GetFacetFromTria( vInfo[i].nT) ;
Point3d ptEnd ;
Vector3d vtN ;
if ( pStm->GetFacetNearestEndPoint( nF, ptInt, ptEnd, vtN)) {
// il punto di confronto è quello sulla linea di mira a minima distanza dal vertice
Point3d ptCfr = ptRef + (( ptEnd - ptRef) * vtDir) * vtDir ;
// determino la distanza e la confronto con il minimo
double dSqDist = SqDist( ptEnd, ptCfr) ;
if ( dSqDist < dMinSqDist) {
bFound = true ;
dMinSqDist = dSqDist ;
m_nLastSnapId = nId ;
m_ptLastSnapPnt = ptEnd ;
m_ptLastSnapPnt.ToGlob( frEnt) ;
m_bLastSnapDirOk = true ;
m_vtLastSnapDir = vtN ;
m_vtLastSnapDir.ToGlob( frEnt) ;
}
}
}
}
break ;
case SP_MID :
{
// con wireframe devo provare tutti i triangoli intersecati, con shading e hiddenline solo il primo
int nTtot = (( m_nShowMode == SM_WIREFRAME) ? int( vInfo.size()) : 1) ;
for ( int i = 0 ; i < nTtot ; ++ i) {
// punto di intersezione
Point3d ptInt = vInfo[i].ptI ;
// punto medio più vicino
int nF = pStm->GetFacetFromTria( vInfo[i].nT) ;
Point3d ptMid ;
Vector3d vtN ;
if ( pStm->GetFacetNearestMidPoint( nF, ptInt, ptMid, vtN)) {
// il punto di confronto è quello sulla linea di mira a minima distanza dal punto medio
Point3d ptCfr = ptRef + (( ptMid - ptRef) * vtDir) * vtDir ;
// determino la distanza e la confronto con il minimo
double dSqDist = SqDist( ptMid, ptCfr) ;
if ( dSqDist < dMinSqDist) {
bFound = true ;
dMinSqDist = dSqDist ;
m_nLastSnapId = nId ;
m_ptLastSnapPnt = ptMid ;
m_ptLastSnapPnt.ToGlob( frEnt) ;
m_bLastSnapDirOk = true ;
m_vtLastSnapDir = vtN ;
m_vtLastSnapDir.ToGlob( frEnt) ;
}
}
}
}
break ;
case SP_CENTER :
{
// con wireframe devo provare tutti i triangoli intersecati, con shading e hiddenline solo il primo
int nTtot = (( m_nShowMode == SM_WIREFRAME) ? int( vInfo.size()) : 1) ;
for ( int i = 0 ; i < nTtot ; ++ i) {
// centro più vicino
int nF = pStm->GetFacetFromTria( vInfo[i].nT) ;
Point3d ptCen ;
Vector3d vtN ;
if ( pStm->GetFacetCenter( nF, ptCen, vtN)) {
// il punto di confronto è quello sulla linea di mira a minima distanza dal centro
Point3d ptCfr = ptRef + (( ptCen - ptRef) * vtDir) * vtDir ;
// determino la distanza e la confronto con il minimo
double dSqDist = SqDist( ptCen, ptCfr) ;
if ( dSqDist < dMinSqDist) {
bFound = true ;
dMinSqDist = dSqDist ;
m_nLastSnapId = nId ;
m_ptLastSnapPnt = ptCen ;
m_ptLastSnapPnt.ToGlob( frEnt) ;
m_bLastSnapDirOk = true ;
m_vtLastSnapDir = vtN ;
m_vtLastSnapDir.ToGlob( frEnt) ;
}
}
}
}
break ;
case SP_NEAR :
case SP_TANG :
case SP_PERP :
case SP_MINDIST :
// considero solo il primo triangolo intersecato
// la distanza è nulla e la confronto con il minimo
if ( 0 < dMinSqDist) {
bFound = true ;
dMinSqDist = 0 ;
m_nLastSnapId = nId ;
// punto
Point3d ptInt = vInfo[0].ptI ;
m_ptLastSnapPnt = ptInt ;
m_ptLastSnapPnt.ToGlob( frEnt) ;
// direzione
Triangle3d Tria ;
TriNormals3d Tnorms ;
Vector3d vtNorm ;
if ( pStm->GetTriangle( vInfo[0].nT, Tria) &&
pStm->GetTriangleSmoothNormals( vInfo[0].nT, Tnorms) &&
CalcNormal( ptInt, Tria, Tnorms, vtNorm)) {
m_bLastSnapDirOk = true ;
m_vtLastSnapDir = vtNorm ;
m_vtLastSnapDir.ToGlob( frEnt) ;
}
else
m_bLastSnapDirOk = false ;
}
break ;
default :
break ;
}
// risultato dello snap su questo oggetto
// se trovato e modalità shading o hiddenline, la favorisco perchè davanti alle possibili successive
if ( bFound && m_nShowMode != SM_WIREFRAME)
dMinSqDist = 0 ;
return bFound ;
}
@@ -617,7 +740,7 @@ Scene::FindTextSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame3
m_nLastSnapId = nId ;
m_ptLastSnapPnt = ptP ;
m_bLastSnapDirOk = true ;
m_vtLastSnapDir = pTxt->GetDirVersor() ;
m_vtLastSnapDir = pTxt->GetNormVersor() ;
m_vtLastSnapDir.ToGlob( frEnt) ;
}
}
@@ -629,7 +752,7 @@ Scene::FindTextSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame3
m_nLastSnapId = nId ;
m_ptLastSnapPnt = ptP ;
m_bLastSnapDirOk = true ;
m_vtLastSnapDir = pTxt->GetDirVersor() ;
m_vtLastSnapDir = pTxt->GetNormVersor() ;
m_vtLastSnapDir.ToGlob( frEnt) ;
}
}
@@ -641,7 +764,7 @@ Scene::FindTextSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame3
m_nLastSnapId = nId ;
m_ptLastSnapPnt = ptP ;
m_bLastSnapDirOk = true ;
m_vtLastSnapDir = pTxt->GetDirVersor() ;
m_vtLastSnapDir = pTxt->GetNormVersor() ;
m_vtLastSnapDir.ToGlob( frEnt) ;
}
}
@@ -653,7 +776,7 @@ Scene::FindTextSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame3
m_nLastSnapId = nId ;
m_ptLastSnapPnt = ptP ;
m_bLastSnapDirOk = true ;
m_vtLastSnapDir = pTxt->GetDirVersor() ;
m_vtLastSnapDir = pTxt->GetNormVersor() ;
m_vtLastSnapDir.ToGlob( frEnt) ;
}
}
@@ -667,7 +790,7 @@ Scene::FindTextSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame3
m_nLastSnapId = nId ;
m_ptLastSnapPnt = ptP ;
m_bLastSnapDirOk = true ;
m_vtLastSnapDir = pTxt->GetDirVersor() ;
m_vtLastSnapDir = pTxt->GetNormVersor() ;
m_vtLastSnapDir.ToGlob( frEnt) ;
}
}
@@ -680,7 +803,9 @@ Scene::FindTextSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame3
bFound = true ;
m_nLastSnapId = nId ;
m_ptLastSnapPnt = ptP ;
m_bLastSnapDirOk = false ;
m_bLastSnapDirOk = true ;
m_vtLastSnapDir = pTxt->GetNormVersor() ;
m_vtLastSnapDir.ToGlob( frEnt) ;
}
}
break ;