EgtExchange :

- esportazione con menu e file geometrie separati
This commit is contained in:
riccardo.elitropi
2022-08-25 09:26:24 +02:00
parent 1c8da69f63
commit b2e6005700
+91 -185
View File
@@ -65,81 +65,9 @@ ExportThreeJS::SetOptions( int nFilter)
bool
ExportThreeJS::Export( IGeomDB* pGDB, int nId, const string& sFile, const string& sFileM, IEGrScene* pScene)
{
/*
m_Writer.Close();
if (!m_Writer.Init(sFile)) {
LOG_ERROR(GetEExLogger(), "ExportThreeJS : Error on open file")
return false;
}
ISurfTriMesh* miaSurf = GetSurfTriMesh(pGDB->GetGeoObj(1117));
ICurveComposite* miaCurvaSotto = GetCurveComposite(pGDB->GetGeoObj(1332));
double Bi, Bf;
miaCurvaSotto->GetDomain(Bi, Bf);
ICurveComposite* miaCurvaSopra = GetCurveComposite(pGDB->GetGeoObj(1333));
double Ti, Tf;
miaCurvaSopra->GetDomain(Ti, Tf);
ICurveComposite* miaCurvaSinistra = GetCurveComposite(pGDB->GetGeoObj(1334));
double Li, Lf;
miaCurvaSinistra->GetDomain(Li, Lf);
ICurveComposite* miaCurvaDestra = GetCurveComposite(pGDB->GetGeoObj(1335));
double Ri, Rf;
miaCurvaDestra->GetDomain(Ri, Rf);
int iTotT = miaSurf->GetTriangleCount();
int nIdVert[3];
Point3d punto;
double par;
string str;
for (int i = 0; i < iTotT; i++)
{
miaSurf->GetTriangle(i, nIdVert);
str = "[";
for (int j = 0; j < 3; j++)
{
str += "new THREE.Vector2";
miaSurf->GetVertex(nIdVert[j], punto);
if (miaCurvaSotto->GetParamAtPoint(punto, par, 100*EPS_SMALL))
{
par = par / Bf;
str += "(" + ToString(par) + ",0),";
}
else if (miaCurvaSopra->GetParamAtPoint(punto, par, 100*EPS_SMALL))
{
par = par / Tf;
str += "(" + ToString(par) + ",1),";
}
else if (miaCurvaSinistra->GetParamAtPoint(punto, par, 100*EPS_SMALL))
{
par = par / Lf;
str += "(0, " + ToString(par) + "),";
}
else if (miaCurvaDestra->GetParamAtPoint(punto, par, 100*EPS_SMALL))
{
par = par / Rf;
str += "(1," + ToString(par) + "),";
}
else
{
m_Writer.OutText("Pizza");
IGeoPoint3d* pt = CreateGeoPoint3d();
pt->Set(punto);
pGDB->AddGeoObj(GDB_ID_NULL, GDB_ID_ROOT, pt->Clone());
}
}
m_Writer.OutText(str + "],");
}
if (!m_Writer.Close())
return true;
*/
// verifico il DB geometrico
if ( pGDB == nullptr) {
LOG_ERROR(GetEExLogger(), "ExportThreeJS : Error on GeomDB")
LOG_ERROR( GetEExLogger(), "ExportThreeJS : Error on GeomDB")
return false ;
}
@@ -167,7 +95,6 @@ ExportThreeJS::Export( IGeomDB* pGDB, int nId, const string& sFile, const string
}
// prelevo il Box3D globale (per ingombro e punto luce)
BBox3d b3Globbox ;
pGDB->GetGlobalBBox( nId, b3Globbox, BBF_ONLY_VISIBLE) ;
@@ -187,27 +114,6 @@ ExportThreeJS::Export( IGeomDB* pGDB, int nId, const string& sFile, const string
bOk = ExportObject( *pIter, pGDB, m_nGroupCount) ;
// fine creazione menù con elementi globali
m_Writer.OutText( " groupRoot.add(group0)");
// --- m_Writer.OutText( " var reset = {") ;
// --- m_Writer.OutText( " 'Reset': function() {") ;
// --- m_Writer.OutText( " if (!first) {") ;
// --- m_Writer.OutText( " GetColorBack(LastGroupSelected)") ;
// --- m_Writer.OutText( " }") ;
// --- m_Writer.OutText( " }") ;
// --- m_Writer.OutText( " }") ;
// --- m_Writer.OutText( " gui.add(reset, 'Reset').name('Deselect all');") ;
// --- m_Writer.OutText( " const params = {" ) ;
// --- m_Writer.OutText( " textField: 'Type Name_Id'") ;
// --- m_Writer.OutText( " }") ;
// --- m_Writer.OutText( " gui.add(params, 'textField').onFinishChange(function(value) {") ;
// --- m_Writer.OutText( " if (value != '') {") ;
// --- m_Writer.OutText( " findGroupByNameAndId(groupRoot, value);") ;
// --- m_Writer.OutText( " if (!trovato) {") ;
// --- m_Writer.OutText( " GetColorBack(LastGroupSelected);") ;
// --- m_Writer.OutText( " window.alert('Element not found :(');") ;
// --- m_Writer.OutText( " }") ;
// --- m_Writer.OutText( " }") ;
// --- m_Writer.OutText( " trovato = false;");
// --- m_Writer.OutText( " }).name('Code');") ;
// creazione parte finale della pagina html
bOk = FinishAmbient() ;
@@ -253,7 +159,7 @@ ExportThreeJS::HeadAmbient( IEGrScene* pScene, IGeomDB* pGDB, int nId)
// librerie
// --- m_Writer.OutText( " <script type='text/javascript' src='C:/EgtDev/Extern/ThreeJs/three.js'></script>") ; <---- original
// --- m_Writer.OutText( " <script type='text/javascript' src='C:/EgtDev/Extern/ThreeJs/OrbitControls.js'></script>") ; <--- original
// --- m_Writer.OutText( " <script type='text/javascript' src='C:/EgtDev/Extern/ThreeJs/dat.gui.js'></script>") ;
// --- m_Writer.OutText( " <script type='text/javascript' src='C:/EgtDev/Extern/ThreeJs/dat.gui.js'></script>") ; <--- original
// stile
m_Writer.OutText( " <style>") ;
m_Writer.OutText( " body{") ;
@@ -283,9 +189,9 @@ ExportThreeJS::HeadAmbient( IEGrScene* pScene, IGeomDB* pGDB, int nId)
m_Writer.OutText( " }") ;
m_Writer.OutText( "") ;
m_Writer.OutText( " </style>") ;
m_Writer.OutText( " <script src = 'https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js'></script>") ;
m_Writer.OutText( " <script type = 'text/javascript' src = 'https://iis01.egalware.com/Test3D/Lib/Controls/dat.gui.js'></script>") ;
// librerie (non moduli)
m_Writer.OutText( " <script type = 'text/javascript' src = './Lib/jquery.js'></script>") ; //jquery
m_Writer.OutText( " <script type = 'text/javascript' src = './Lib/Controls/dat.gui.js'></script>") ; //datGui
m_Writer.OutText( " </head>") ;
// body
@@ -295,9 +201,9 @@ ExportThreeJS::HeadAmbient( IEGrScene* pScene, IGeomDB* pGDB, int nId)
m_Writer.OutText( " </div>") ;
// --- m_Writer.OutText( " <script type='text/javascript'>") ; <----------- original
m_Writer.OutText( " <script type='module'>");
m_Writer.OutText( " import * as THREE from 'https://iis01.egalware.com/Test3D/Lib/three.module.js';") ;
m_Writer.OutText( " import { OrbitControls } from 'https://iis01.egalware.com/Test3D/Lib/Controls/orbitControlsM.js';") ;
m_Writer.OutText( " import{OrbitControlsGizmo} from 'https://iis01.egalware.com/Test3D/Lib/Controls/OrbitControlsGizmo.js'; ");
m_Writer.OutText( " import * as THREE from './Lib/three.module.js';") ; // modulo THREEJS
m_Writer.OutText( " import { OrbitControls } from './Lib/Controls/orbitControlsM.js';") ; // modulo Controllo telecamera
m_Writer.OutText( " import { OrbitControlsGizmo } from './Lib/Controls/OrbitControlsGizmo.js';") ; // modulo Controllo assi GIZMO
// variabili globali per script javascript
m_Writer.OutText( " var camera;") ;
m_Writer.OutText( " var scene;") ;
@@ -315,7 +221,7 @@ ExportThreeJS::HeadAmbient( IEGrScene* pScene, IGeomDB* pGDB, int nId)
// imposto telecamera ortografica (posizione, punto di focus, posizione piani di clipping e definizione della zona di viewing frustum
m_Writer.OutText( " camera = new THREE.OrthographicCamera(" + ToString( -m_dHalfWidth) + ", " + ToString( m_dHalfWidth) + ", " + ToString( m_dHalfHeight) + ", " + ToString( -m_dHalfHeight) + "," + ToString( m_ZNear) + ", " + ToString( m_ZFar) + ");") ;
m_Writer.OutText( " camera.position.x = " + ToString( m_ptCamera.y) + "; camera.position.y = " + ToString( m_ptCamera.z) + "; camera.position.z = " + ToString( m_ptCamera.x) + "; ") ;
m_Writer.OutText( " var dist = camera.position.distanceTo(new THREE.Vector3(0,0,0)); // per Gizmo"); // per Gizmo
m_Writer.OutText( " var dist = camera.position.distanceTo(new THREE.Vector3(0,0,0)); // per Gizmo") ; // per Gizmo
m_Writer.OutText( " camera.lookAt(new THREE.Vector3(" + ToString( m_ptCenter.y) + ", " + ToString( m_ptCenter.z) + ", " + ToString( m_ptCenter.x) + "));") ;
m_Writer.OutText( " scene.add(camera)") ;
// impostazioni del render della scena
@@ -332,23 +238,23 @@ ExportThreeJS::HeadAmbient( IEGrScene* pScene, IGeomDB* pGDB, int nId)
m_Writer.OutText( " renderer.shadowMapEnabled = true;") ;
m_Writer.OutText( " renderer.sortObjects = false;") ;
// punti luce
double dResult = sqrt(( m_ptMin.x + ( m_dimX * 2)) * ( m_ptMin.x + ( m_dimX * 2)) + ( m_ptMin.y + ( m_dimY * 2)) * ( m_ptMin.y + ( m_dimY * 2)) + ( m_ptMin.z + ( m_dimZ * 2)) * ( m_ptMin.z + ( m_dimZ * 2)));
double dResult = sqrt(( m_ptMin.x + ( m_dimX * 2)) * ( m_ptMin.x + ( m_dimX * 2)) + ( m_ptMin.y + ( m_dimY * 2)) * ( m_ptMin.y + ( m_dimY * 2)) + ( m_ptMin.z + ( m_dimZ * 2)) * ( m_ptMin.z + ( m_dimZ * 2))) ;
m_Writer.OutText( " var spotLight1 = new THREE.SpotLight(0xFFFFFF);") ;
m_Writer.OutText( " spotLight1.position.set(" + ToString( m_ptMin.x + ( m_dimX * 2)) + ", " + ToString( m_ptMin.y + ( m_dimY * 2)) + ", " + ToString(( m_ptMin.z + ( m_dimZ*2))) + ");");
m_Writer.OutText( " spotLight1.position.set(" + ToString( m_ptMin.x + ( m_dimX * 2)) + ", " + ToString( m_ptMin.y + ( m_dimY * 2)) + ", " + ToString(( m_ptMin.z + ( m_dimZ*2))) + ");") ;
m_Writer.OutText( " spotLight1.intensity = 0.6;") ;
m_Writer.OutText( " spotLight1.angle = Math.PI/4;") ;
m_Writer.OutText( " spotLight1.distance = " + ToString( dResult) + "*2.5;");
m_Writer.OutText( " spotLight1.distance = " + ToString( dResult) + "*2.5;") ;
m_Writer.OutText( " spotLight1.castShadow = true;") ;
m_Writer.OutText( " scene.add(spotLight1);") ;
// punto luce helper
//m_Writer.OutText( "const spotLightHelper1 = new THREE.SpotLightHelper( spotLight1 );") ;
//m_Writer.OutText( "scene.add( spotLightHelper1 );") ;
// m_Writer.OutText( "const spotLightHelper1 = new THREE.SpotLightHelper( spotLight1 );") ;
// m_Writer.OutText( "scene.add( spotLightHelper1 );") ;
// ambiente
m_Writer.OutText( " var ambientLight = new THREE.AmbientLight(0x4d4d4d);") ;
m_Writer.OutText( " ambientLight.intensity = 1.25;") ;
m_Writer.OutText( " scene.add(ambientLight); ") ;
// codice per disegno griglia
m_Writer.OutText( " var size = " + ToString( nExtStep * dSnapStep) + ";");
m_Writer.OutText( " var size = " + ToString( nExtStep * dSnapStep) + ";") ;
m_Writer.OutText( " var divisions = " + ToString( dSnapStep) + ";");
// m_Writer.OutText("var divisions = 10;");
// ---- m_Writer.OutText( " var gridHelper = new THREE.GridHelper(size, divisions, new THREE.Color(1,0,0), new THREE.Color(0,1,0));");
@@ -373,7 +279,7 @@ ExportThreeJS::HeadAmbient( IEGrScene* pScene, IGeomDB* pGDB, int nId)
m_Writer.OutText( " LineMaterial = new THREE.LineBasicMaterial({ color: 0x444444 });") ;
m_Writer.OutText( " LineGeometry = new THREE.Geometry();") ;
m_Writer.OutText( " LineGeometry.vertices.push(") ;
m_Writer.OutText( " new THREE.Vector3(" + ToString( nExtStep * dSnapStep) + " - ( " + ToString( nExtStep * dSnapStep / 10) + " ) * ( i + 10), 0, -" + ToString( nExtStep * dSnapStep) + "),");
m_Writer.OutText( " new THREE.Vector3(" + ToString( nExtStep * dSnapStep) + " - ( " + ToString( nExtStep * dSnapStep / 10) + " ) * ( i + 10), 0, -" + ToString( nExtStep * dSnapStep) + "),") ;
m_Writer.OutText( " new THREE.Vector3(" + ToString( nExtStep * dSnapStep) + " - ( " + ToString( nExtStep * dSnapStep / 10) + " ) * ( i + 10), 0, " + ToString( nExtStep * dSnapStep) + ")") ;
m_Writer.OutText( " );") ;
m_Writer.OutText( " line = new THREE.Line(LineGeometry, LineMaterial);") ;
@@ -415,20 +321,6 @@ ExportThreeJS::HeadAmbient( IEGrScene* pScene, IGeomDB* pGDB, int nId)
m_Writer.OutText( " plane.receiveShadow = false;");
m_Writer.OutText( " spotLight1.target = plane;") ;
m_Writer.OutText( " var list_of_objects = [];") ;
// codice per inizializzazione menu
// --- m_Writer.OutText( " var gui = new dat.GUI({ width: 350 });") ;
// --- m_Writer.OutText( " var gui0 = gui.addFolder('Root');") ;
/*
ORGANIZZAZIONE DEL MENU GUI
- ad ogni cartella del menu c'è associata una label
- cliccando sulla label viene lanciata la funzione all'interno della relativa struttura creata, alla funzione viene passato il gruppo corrispondente
- funzioni richiamate una volta avendo il gruppo (gruppo di linee, punti, mesh, vettori di altri gruppi) selezionato:
- selectElement(...)
- scanElement(...)
- getColorBack(...)
*/
// ================================================================
// CREAZIONE PARTE INIZIALE DEL MENU ==============================
@@ -436,6 +328,7 @@ ExportThreeJS::HeadAmbient( IEGrScene* pScene, IGeomDB* pGDB, int nId)
m_WriterM.OutText( "<!DOCTYPE html>") ;
m_WriterM.OutText( "<html>") ;
m_WriterM.OutText( " <head>" ) ;
// libreria per Bootstrap
m_WriterM.OutText( " <link rel = 'stylesheet' href = 'https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css'/>") ;
m_WriterM.OutText( " <link rel = 'stylesheet' href = 'https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css'/>") ;
m_WriterM.OutText( " <link href = 'https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css' rel = 'stylesheet'>") ;
@@ -625,6 +518,8 @@ ExportThreeJS::FinishAmbient()
m_Writer.OutText( " element.material.color = new THREE.Color(0x00ff00);") ;
m_Writer.OutText( " element.material.emissive = new THREE.Color(0xFBF719);") ;
m_Writer.OutText( " element.material.emissiveIntensity = 1.2;") ;
m_Writer.OutText( " element.material.transparent = false;") ;
m_Writer.OutText( " element.material.opacity = 1;") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " else if (element instanceof THREE.Points) { //punto") ;
m_Writer.OutText( " element.material.color = new THREE.Color(0xFBF719);") ;
@@ -660,7 +555,11 @@ ExportThreeJS::FinishAmbient()
m_Writer.OutText( " element.material.color = element.material.oldColor;") ;
m_Writer.OutText( " element.material.emissive = new THREE.Color(0x000000);") ;
m_Writer.OutText( " element.material.emissiveIntensity = 1;") ;
m_Writer.OutText( " }");
m_Writer.OutText( " if (element.material.wasTransparent) {") ;
m_Writer.OutText( " element.material.transparent = true;") ;
m_Writer.OutText( " element.material.opacity = element.material.hadOpacity;") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " }") ;
m_Writer.OutText( " else if (element instanceof THREE.Points) { //punto") ;
m_Writer.OutText( " element.material.color = element.material.oldColor;") ;
m_Writer.OutText( " }") ;
@@ -997,6 +896,8 @@ ExportThreeJS::ExportObject( const IGdbIterator& iIter, IGeomDB* pGDB, const int
return false ;
}
}
return true;
}
@@ -1222,37 +1123,38 @@ ExportThreeJS::ExportCurveComp3D( const string& sName, const IGeoObj* pGeoObj, c
bool
ExportThreeJS::ExportSTM( const string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& Ccol, const int nGroupCount)
{
// verifico oggetto
const ISurfTriMesh* pSTM = GetSurfTriMesh(pGeoObj) ;
if ( pSTM == nullptr)
return false ;
// verifico oggetto
const ISurfTriMesh* pSTM = GetSurfTriMesh( pGeoObj) ;
if ( pSTM == nullptr)
return false ;
// aumento il contatore generale per evitare nomi uguali su javascript
m_nCont++;
// aumento il contatore generale per evitare nomi uguali su javascript
m_nCont++ ;
// ricavo il colore della faccia (R,G,B,A)
string sHexCol;
GetColor(Ccol, sHexCol);
double dOpacity = Ccol.GetAlpha();
string sHexCol ;
GetColor( Ccol, sHexCol) ;
double dOpacity = Ccol.GetAlpha() ;
// controllo trasparenza e opacità
double dOpacityThreeJs = 1;
if (dOpacity < 1)
double dOpacityThreeJs = 1 ;
if ( dOpacity < 1)
{
// mesh trasparente
// calcolo distanza tra mesh e posizione delle telecamera (per riodinare l'ordine di visualizzazione)
BBox3d b3Localbox;
pSTM->GetLocalBBox(b3Localbox);
b3Localbox.ToLoc(m_frTHREEJSFrame);
double dDistance = sqrt(b3Localbox.SqMaxDistFromPoint(m_ptCenter));
sSurfDist sNewSurfDist;
sNewSurfDist.SurvAlpha = pSTM;
sNewSurfDist.dDistance = dDistance;
sNewSurfDist.sName = ToString( m_nCont);
m_lTranspSurf.push_back(sNewSurfDist);
BBox3d b3Localbox ;
pSTM->GetLocalBBox( b3Localbox) ;
b3Localbox.ToLoc( m_frTHREEJSFrame) ;
double dDistance = sqrt( b3Localbox.SqMaxDistFromPoint( m_ptCenter)) ;
sSurfDist sNewSurfDist ;
sNewSurfDist.SurvAlpha = pSTM ;
sNewSurfDist.dDistance = dDistance ;
sNewSurfDist.sName = ToString( m_nCont) ;
m_lTranspSurf.push_back( sNewSurfDist) ;
// --- dOpacityThreeJs = 0.1 * dOpacity * dOpacity + 0.25 * dOpacity + 0.5; // interpolazione quadratica per opacità (opacità ThreeJs diversa da opacità EGTCAM5)
dOpacityThreeJs = 0.7 + 0.2*dOpacity;
//dOpacityThreeJs = dOpacity;
dOpacityThreeJs = 0.7 + 0.2*dOpacity ;
// dOpacityThreeJs = dOpacity;
// creo il materiale
// front side
@@ -1263,95 +1165,99 @@ ExportThreeJS::ExportSTM( const string& sName, const IGeoObj* pGeoObj, const Fra
m_Writer.OutText( " front_surf_materials" + ToString( m_nCont) + ".blendEquation = THREE.AddEquation") ; // aggiungo equazione di blending
m_Writer.OutText( " front_surf_materials" + ToString( m_nCont) + ".blendSrc = THREE.SrcAlphaFactor") ; // source blending factor --> glBlendFunc( srcfactor, destfactor)
m_Writer.OutText( " front_surf_materials" + ToString( m_nCont) + ".blendDst = THREE.OneMinusSrcAlphaFactor;") ; // destination blending factor --> glBlendFunc( srcfactor, destfactor)
m_Writer.OutText( " front_surf_materials" + ToString( m_nCont) + ".wasTransparent = true;") ; // nel caso sia selezionata
m_Writer.OutText( " front_surf_materials" + ToString( m_nCont) + ".hadOpacity = " + ToString( dOpacityThreeJs) + ";") ; // nel caso sia selezionata
// back side
m_Writer.OutText( " var back_surf_materials" + ToString(m_nCont) + "= new THREE.MeshPhongMaterial({color: " + sHexCol + ", transparent: true , opacity: " + ToString( dOpacityThreeJs) + ", side: THREE.BackSide});") ;
m_Writer.OutText( " back_surf_materials" + ToString(m_nCont) + ".oldColor = new THREE.Color(" + sHexCol + ");") ;
m_Writer.OutText( " back_surf_materials" + ToString( m_nCont) + ".oldColor = new THREE.Color(" + sHexCol + ");") ;
m_Writer.OutText( " back_surf_materials" + ToString( m_nCont) + ".depthTest = true;") ; // abilito test profondità
m_Writer.OutText( " back_surf_materials" + ToString( m_nCont) + ".blending = THREE.CustomBlending") ; // flag per blending customizzato
m_Writer.OutText( " back_surf_materials" + ToString( m_nCont) + ".blendEquation = THREE.AddEquation") ; // aggiungo equazione di blending
m_Writer.OutText( " back_surf_materials" + ToString( m_nCont) + ".blendSrc = THREE.SrcAlphaFactor") ; // source blending factor --> glBlendFunc( srcfactor, destfactor)
m_Writer.OutText( " back_surf_materials" + ToString( m_nCont) + ".blendDst = THREE.OneMinusSrcAlphaFactor;") ; // destination blending factor --> glBlendFunc( srcfactor, destfactor)
}
m_Writer.OutText( " back_surf_materials" + ToString( m_nCont) + ".wasTransparent = true;") ; // nel caso sia selezionata
m_Writer.OutText( " back_surf_materials" + ToString( m_nCont) + ".hadOpacity = " + ToString( dOpacityThreeJs) + ";") ; // nel caso sia selezionata
}
else
{
// mesh opaca
m_Writer.OutText( " var opaca_surf_materials" + ToString(m_nCont) + "= new THREE.MeshPhongMaterial({color: " + sHexCol + ", transparent: false , opacity: " + ToString( dOpacityThreeJs) + ", side: THREE.DoubleSide});") ;
m_Writer.OutText( " opaca_surf_materials" + ToString(m_nCont) + ".oldColor = new THREE.Color(" + sHexCol + ");") ;
m_Writer.OutText( " opaca_surf_materials" + ToString( m_nCont) + ".depthTest = true;"); // abilito test profondità
m_Writer.OutText( " opaca_surf_materials" + ToString( m_nCont) + ".blending = THREE.CustomBlending"); // flag per blending customizzato
m_Writer.OutText( " opaca_surf_materials" + ToString( m_nCont) + ".blendEquation = THREE.AddEquation"); // aggiungo equazione di blending
m_Writer.OutText( " opaca_surf_materials" + ToString( m_nCont) + ".blendSrc = THREE.SrcAlphaFactor"); // source blending factor --> glBlendFunc( srcfactor, destfactor)
m_Writer.OutText( " opaca_surf_materials" + ToString( m_nCont) + ".blendDst = THREE.OneMinusSrcAlphaFactor;"); // destination blending factor --> glBlendFunc( srcfactor, destfactor)
m_Writer.OutText( " var opaca_surf_materials" + ToString( m_nCont) + "= new THREE.MeshPhongMaterial({color: " + sHexCol + ", transparent: false , opacity: " + ToString( dOpacityThreeJs) + ", side: THREE.DoubleSide});") ;
m_Writer.OutText( " opaca_surf_materials" + ToString( m_nCont) + ".oldColor = new THREE.Color(" + sHexCol + ");") ;
m_Writer.OutText( " opaca_surf_materials" + ToString( m_nCont) + ".depthTest = true;") ; // abilito test profondità
m_Writer.OutText( " opaca_surf_materials" + ToString( m_nCont) + ".blending = THREE.CustomBlending") ; // flag per blending customizzato
m_Writer.OutText( " opaca_surf_materials" + ToString( m_nCont) + ".blendEquation = THREE.AddEquation") ; // aggiungo equazione di blending
m_Writer.OutText( " opaca_surf_materials" + ToString( m_nCont) + ".blendSrc = THREE.SrcAlphaFactor") ; // source blending factor --> glBlendFunc( srcfactor, destfactor)
m_Writer.OutText( " opaca_surf_materials" + ToString( m_nCont) + ".blendDst = THREE.OneMinusSrcAlphaFactor;") ; // destination blending factor --> glBlendFunc( srcfactor, destfactor)
}
// creo vettore di vertici per i triangoli della mesh
m_Writer.OutText(" var vertices" + ToString(m_nCont) + " = [") ;
m_Writer.OutText(" var vertices" + ToString( m_nCont) + " = [") ;
int iTotV = pSTM->GetVertexCount();
int iTotT = pSTM->GetTriangleCount();
int iTotV = pSTM->GetVertexCount() ;
int iTotT = pSTM->GetTriangleCount() ;
Point3d ptCurrent;
int iPtCurrentTria[3];
Point3d ptCurrent ;
int iPtCurrentTria[3] ;
// scorro tutti i vertici e ne scrivo le coordinate
for (int i = 0; i < iTotV; i++)
for ( int i = 0; i < iTotV; i++)
{
pSTM->GetVertex(i, ptCurrent);
ptCurrent.LocToLoc(frFrame, m_frTHREEJSFrame);
m_Writer.OutText(" new THREE.Vector3(" + ToString(ptCurrent.x) + ", " + ToString(ptCurrent.y) + ", " + ToString(ptCurrent.z) + "),");
pSTM->GetVertex( i, ptCurrent);
ptCurrent.LocToLoc( frFrame, m_frTHREEJSFrame);
m_Writer.OutText(" new THREE.Vector3(" + ToString( ptCurrent.x) + ", " + ToString( ptCurrent.y) + ", " + ToString( ptCurrent.z) + "),") ;
}
m_Writer.OutText(" ];");
m_Writer.OutText( " ];") ;
// creo vettore delle facce dei triangoli
m_Writer.OutText(" var faces" + ToString(m_nCont) + " = [ ");
m_Writer.OutText( " var faces" + ToString(m_nCont) + " = [ ") ;
// scorro tutti i triangoli associandogli una faccia della mesh
for (int i = 0; i < iTotT; i++)
for ( int i = 0; i < iTotT; i++)
{
pSTM->GetTriangle(i, iPtCurrentTria);
m_Writer.OutText(" new THREE.Face3(" + ToString(iPtCurrentTria[0]) + ", " + ToString(iPtCurrentTria[1]) + ", " + ToString(iPtCurrentTria[2]) + "),");
pSTM->GetTriangle( i, iPtCurrentTria) ;
m_Writer.OutText( " new THREE.Face3(" + ToString( iPtCurrentTria[0]) + ", " + ToString( iPtCurrentTria[1]) + ", " + ToString( iPtCurrentTria[2]) + "),") ;
}
m_Writer.OutText(" ];");
m_Writer.OutText( " ];") ;
// creo la geometria con i vertici e le facce
m_Writer.OutText(" var geom" + ToString(m_nCont) + " = new THREE.Geometry();");
m_Writer.OutText(" geom" + ToString(m_nCont) + ".vertices = vertices" + ToString(m_nCont) + ";");
m_Writer.OutText(" geom" + ToString(m_nCont) + ".faces = faces" + ToString(m_nCont) + ";");
m_Writer.OutText(" geom" + ToString(m_nCont) + ".computeFaceNormals();"); // per rendering effetto ombre e luce
m_Writer.OutText( " var geom" + ToString( m_nCont) + " = new THREE.Geometry();") ;
m_Writer.OutText( " geom" + ToString( m_nCont) + ".vertices = vertices" + ToString(m_nCont) + ";") ;
m_Writer.OutText( " geom" + ToString( m_nCont) + ".faces = faces" + ToString(m_nCont) + ";") ;
m_Writer.OutText( " geom" + ToString( m_nCont) + ".computeFaceNormals();") ; // per rendering effetto ombre e luce
// creo la mesh unendo geometria (vertici e facce) e materiale
if ( dOpacity < 1)
{
// mesh trasparente
// front side -----------------------------
m_Writer.OutText( " var front_surf_mesh" + ToString(m_nCont) + " = new THREE.Mesh(geom" + ToString(m_nCont) + ", front_surf_materials" + ToString(m_nCont) + ");") ;
m_Writer.OutText( " front_surf_mesh" + ToString(m_nCont) + ".castShadow = true;") ;
m_Writer.OutText( " var front_surf_mesh" + ToString( m_nCont) + " = new THREE.Mesh(geom" + ToString( m_nCont) + ", front_surf_materials" + ToString( m_nCont) + ");") ;
m_Writer.OutText( " front_surf_mesh" + ToString( m_nCont) + ".castShadow = true;") ;
// aggiungo la superficie al suo gruppo di appartenenza
if ( nGroupCount != -1)
m_Writer.OutText( " group" + ToString(nGroupCount) + ".children.push(front_surf_mesh" + ToString(m_nCont) + ")") ;
m_Writer.OutText( " group" + ToString( nGroupCount) + ".children.push(front_surf_mesh" + ToString( m_nCont) + ")") ;
// back side -------------------------------
m_Writer.OutText( " var back_surf_mesh" + ToString(m_nCont) + " = new THREE.Mesh(geom" + ToString(m_nCont) + ", back_surf_materials" + ToString(m_nCont) + ");") ;
m_Writer.OutText( " back_surf_mesh" + ToString(m_nCont) + ".castShadow = true;") ;
m_Writer.OutText( " var back_surf_mesh" + ToString( m_nCont) + " = new THREE.Mesh(geom" + ToString( m_nCont) + ", back_surf_materials" + ToString(m_nCont) + ");") ;
m_Writer.OutText( " back_surf_mesh" + ToString( m_nCont) + ".castShadow = true;") ;
// aggiungo la superficie al suo gruppo di appartenenza
if( nGroupCount != -1)
m_Writer.OutText( " group" + ToString(nGroupCount) + ".children.push(back_surf_mesh" + ToString(m_nCont) + ")") ;
m_Writer.OutText( " group" + ToString( nGroupCount) + ".children.push(back_surf_mesh" + ToString( m_nCont) + ")") ;
// non aggiungo la mesh alla lista degli oggetti della scena, prima le riordino nella funzione FinishAmbient()
}
else
{
// mesh opaca
m_Writer.OutText( " var opaca_mesh_" + ToString(m_nCont) + " = new THREE.Mesh(geom" + ToString(m_nCont) + ", opaca_surf_materials" + ToString(m_nCont) + ");") ;
m_Writer.OutText( " opaca_mesh_" + ToString(m_nCont) + ".castShadow = true;") ;
m_Writer.OutText( " list_of_objects.push(opaca_mesh_" + ToString(m_nCont) + ");") ; // aggiungo la mesh alla lista degli oggetti della scena
m_Writer.OutText( " var opaca_mesh_" + ToString( m_nCont) + " = new THREE.Mesh(geom" + ToString( m_nCont) + ", opaca_surf_materials" + ToString( m_nCont) + ");") ;
m_Writer.OutText( " opaca_mesh_" + ToString( m_nCont) + ".castShadow = true;") ;
m_Writer.OutText( " list_of_objects.push(opaca_mesh_" + ToString( m_nCont) + ");") ; // aggiungo la mesh alla lista degli oggetti della scena
// aggiungo al superficie al suo gruppo di appartenenza
if ( nGroupCount != -1)