//---------------------------------------------------------------------------- // EgalWare 2022-2022 //---------------------------------------------------------------------------- // File : ExportThreeJS.cpp Data : 05.07.22 Versione : 1.5h2 // Contenuto : Implementazione della classe per l'esportazione in formato html (javascript). // // // // Modifiche : 21.07.22 DS Creazione modulo. // // //---------------------------------------------------------------------------- //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "ExportThreeJS.h" #include "DllMain.h" #include "/EgtDev/Include/EExDllMain.h" #include "/EgtDev/Include/EGkGeomDB.h" #include "/EgtDev/Include/EGkSurfFlatRegion.h" #include "/EgtDev/Include/EGkSurfTriMesh.h" #include "/EgtDev/Include/EGkGdbIterator.h" #include "/EgtDev/Include/EGnStringUtils.h" #include "/EgtDev/Include/SELkKeyProc.h" #include "/EgtDev/Include/EgtKeyCodes.h" #include "/EgtDev/Include/EgtStringConverter.h" #include "/EgtDev/Include/EgtPointerOwner.h" #include #include "/EgtDev/Include/EGkGeoVector3d.h" #include "/EgtDev/Include/EGkCurveLine.h" #include "/EgtDev/Include/EGkGeoPoint3d.h" #include "/EgtDev/Include/EGKCurve.h" #include "/EgtDev/Include/EGkGeoConst.h" #include "/EgtDev/Include/EGkExtText.h" #include "/EgtDev/Include/EGkSurfBezier.h" #include "/EgtDev/Include/EGkGeoFrame3d.h" #include "/EgtDev/Include/EGkFrame3d.h" #include "/EgtDev/Include/EGkExtDimension.h" #include "/EgtDev/Include/EGrScene.h" #include "/EgtDev/Include/EGkCurveComposite.h" using namespace std ; //---------------------------------------------------------------------------- IExportThreeJS* CreateExportThreeJS( void) { // verifico la chiave e le opzioni if ( ! GetEExNetHwKey() && ! TestKeyForEEx( GetEExKey(), KEYOPT_EEX_EXPBASE, GetEExLogger())) return nullptr ; // creo l'oggetto return static_cast ( new( nothrow) ExportThreeJS) ; } //---------------------------------------------------------------------------- bool ExportThreeJS::SetOptions( int nFilter) { m_nFilter = nFilter ; return true ; } //---------------------------------------------------------------------------- bool ExportThreeJS::Export( IGeomDB* pGDB, int nId, const string& sFile, const string& sFileM, IEGrScene* pScene) { // verifico il DB geometrico if ( pGDB == nullptr) { LOG_ERROR( GetEExLogger(), "ExportThreeJS : Error on GeomDB") return false ; } // verifico l'Id dell'oggetto da esportare if ( ! pGDB->ExistsObj( nId)) { LOG_ERROR( GetEExLogger(), "ExportThreeJS : Error on Id") return false ; } // creo il frame m_frTHREEJSFrame.Set( ORIG, Y_AX, Z_AX, X_AX) ; // apro il file di testo in scrittura m_Writer.Close() ; if ( ! m_Writer.Init( sFile)) { LOG_ERROR( GetEExLogger(), "ExportThreeJS : Error on open file") return false ; } // apro il file di testo in scrittura m_WriterM.Close() ; if ( ! m_WriterM.Init( sFileM)) { LOG_ERROR( GetEExLogger(), "ExportThreeJS : Error on open file") return false ; } // prelevo il Box3D globale (per ingombro e punto luce) BBox3d b3Globbox ; pGDB->GetGlobalBBox( nId, b3Globbox, BBF_ONLY_VISIBLE) ; b3Globbox.GetMinDim( m_ptMin, m_dimX, m_dimY, m_dimZ) ; // m_dScala = max( m_dimX, m_dimY, m_dimZ) / 200 ; m_ptMin.ToLoc( m_frTHREEJSFrame) ; // creazione parte iniziale della pagina html bool bOk = HeadAmbient( pScene, pGDB, nId) ; // creo un iteratore PtrOwner pIter( CreateGdbIterator( pGDB)) ; if ( IsNull( pIter)) return false ; pIter->GoTo( nId) ; // esporto l'oggetto e i suoi eventuali figli bOk = ExportObject( *pIter, pGDB, m_nGroupCount) ; // fine creazione menù con elementi globali m_Writer.OutText( " groupRoot.add(group0)"); // creazione parte finale della pagina html bOk = FinishAmbient() ; // chiudo il file if ( ! m_Writer.Close()) bOk = false ; if (! m_WriterM.Close()) bOk = false ; return bOk; } //---------------------------------------------------------------------------- bool ExportThreeJS::HeadAmbient( IEGrScene* pScene, IGeomDB* pGDB, int nId) { // ================================================================ // CREAZIONE PARTE INIZIALE DELLA SCENA =========================== // ================================================================ // prelevo le impostazioni della camera da EGTCAM5 pScene->GetOrthoCamParam( &m_dHalfWidth, &m_dHalfHeight, &m_ZNear, &m_ZFar) ; m_ptCenter = pScene->GetCenter() ; double dAngVertDeg, dAngOrizzDeg, dDist ; pScene->GetCamera( &dAngVertDeg, &dAngOrizzDeg, &dDist) ; Vector3d vtDirCamera = FromSpherical( 1, dAngVertDeg, dAngOrizzDeg) ; m_ptCamera = m_ptCenter + dDist * vtDirCamera; m_dDistance = dDist ; // prelevo i parametri della griglia double dSnapStep ; int nExtStep ; pScene->GetGridParam( &dSnapStep, &nExtStep) ; // scrittura parte iniziale del codice e librerie m_Writer.OutText( "") ; m_Writer.OutText( "") ; m_Writer.OutText( " ") ; // librerie // --- m_Writer.OutText( " ") ; <---- original // --- m_Writer.OutText( " ") ; <--- original // --- m_Writer.OutText( " ") ; <--- original // stile m_Writer.OutText( " ") ; // librerie (non moduli) m_Writer.OutText( " ") ; //jquery m_Writer.OutText( " ") ; //datGui m_Writer.OutText( " ") ; // body m_Writer.OutText( " ") ; m_Writer.OutText( "
") ; //m_Writer.OutText( "
"); // div di aiuto per controllo parametri telecamera, zoom m_Writer.OutText( "
") ; // --- m_Writer.OutText( " ") ; m_WriterM.OutText( " ") ; m_WriterM.OutText( " ") ; m_WriterM.OutText( " ") ; m_WriterM.OutText( " ") ; m_WriterM.OutText( " ") ; m_WriterM.OutText( "") ; m_WriterM.OutText( "
") ; m_WriterM.OutText( "") ; m_WriterM.OutText( "
") ; m_WriterM.OutText( "
") ; m_WriterM.OutText( " ") ; m_WriterM.OutText( " ") ; m_WriterM.OutText( " ") ; m_WriterM.OutText( "
") ; m_WriterM.OutText( " ") ; m_WriterM.OutText( "
") ; return true ; } //---------------------------------------------------------------------------- bool ExportThreeJS::FinishAmbient() { /* ORGANIZZAZIONE DELLA SCENA - renderizzo prima le mesh trasparenti ordinate per distanza decrescente - renderizzo tutti gli altri oggetti */ // aggiungo alla lista di oggetti le mesh trasparenti riordinandole per distanza // renderizzo prima le mesh (facce) lontane m_lTranspSurf.sort([]( const sSurfDist& a, const sSurfDist& b) { return a.dDistance > b.dDistance; }) ; //scorro le superfici trasparenti for ( sSurfDist sCurrSurvDist : m_lTranspSurf) { m_Writer.OutText( " // ---------------------------------------------------------------------") ; // aggiungo le mesh trasparenti alla mia lista di oggetti e alla scena (front e back) m_Writer.OutText( " list_of_objects.push(front_surf_mesh" + sCurrSurvDist.sName + ");") ; m_Writer.OutText( " list_of_objects.push(back_surf_mesh" + sCurrSurvDist.sName + ");") ; } // carico il gruppo radice // carico nella scena tutti gli oggetti m_Writer.OutText( " for (var i = 0; i < list_of_objects.length; i++)") ; m_Writer.OutText( " {") ; m_Writer.OutText( " scene.add(list_of_objects[i])") ; m_Writer.OutText( " };"); // controllo menu Gui m_Writer.OutText( " var center;") ; m_Writer.OutText( " var boxCreated = false;") ; m_Writer.OutText( " var box;") ; m_Writer.OutText( "") ; m_Writer.OutText( " /*") ; m_Writer.OutText( " const helper = new THREE.CameraHelper( camera );") ; m_Writer.OutText( " scene.add( helper );") ; m_Writer.OutText( " */") ; m_Writer.OutText( "") ; m_Writer.OutText( " var controls = {") ; m_Writer.OutText( " element: null,") ; m_Writer.OutText( " motion : true,") ; m_Writer.OutText( " tar : orbitControls.target,") ; m_Writer.OutText( " reset : function() {") ; m_Writer.OutText( " zoom = 1;") ; 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) + ";") ; m_Writer.OutText( " camera.position.y = " + ToString( m_ptCamera.z) + ";") ; m_Writer.OutText( " camera.position.z = " + ToString( m_ptCamera.x) + ";") ; m_Writer.OutText( " camera.lookAt(new THREE.Vector3(" + ToString( m_ptCenter.y) + ", " + ToString( m_ptCenter.z) + ", " + ToString( m_ptCenter.x) + "));") ; m_Writer.OutText( " orbitControls = new OrbitControls(camera, document.getElementById('WebGL-output'));") ; m_Writer.OutText( " orbitControls.autoRotate = controls.motion;") ; m_Writer.OutText( "") ; m_Writer.OutText( " document.getElementsByClassName('obit-controls-gizmo')[0].remove();") ; m_Writer.OutText( " controlsGizmo = new OrbitControlsGizmo(orbitControls, { size: 100, padding : 8 });") ; m_Writer.OutText( " document.body.appendChild(controlsGizmo.domElement);") ; m_Writer.OutText( " $('.obit-controls-gizmo').bind('touchmove', false);") ; m_Writer.OutText( " $('.obit-controls-gizmo').bind('touchstart', false);") ; m_Writer.OutText( " $('.obit-controls-gizmo').bind('touchend', false);") ; m_Writer.OutText( " $('.obit-controls-gizmo').bind('touchcancel', false);") ; m_Writer.OutText( "") ; m_Writer.OutText( " if (boxCreated) {") ; m_Writer.OutText( " box = new THREE.BoxHelper(controls.element, 0xff0000);") ; m_Writer.OutText( " camera.position.y = " + ToString( m_ptMin.y + ( m_dimZ * 1.1)) + ";") ; //115% m_Writer.OutText( " var center = box.geometry.boundingSphere.center;") ; m_Writer.OutText( " orbitControls.target = center;") ; m_Writer.OutText( " }") ; m_Writer.OutText( " },") ; m_Writer.OutText( "") ; m_Writer.OutText( " }") ; // Cerco il parametro dall'url del gruppo da selezionare m_Writer.OutText( "") ; m_Writer.OutText( " // Lettura Parametri -------------- url -------") ; m_Writer.OutText( " const queryString = window.location.search;") ; m_Writer.OutText( " if (queryString != '') {") ; m_Writer.OutText( " const urlParams = new URLSearchParams(queryString);") ; m_Writer.OutText( " const element = urlParams.get('id')") ; //m_Writer.OutText( " element = element.normalize('NFD').replace(/[\u0300-\u036f]/g, '') ") ; m_Writer.OutText( " findGroupByNameAndId(groupRoot, element);") ; m_Writer.OutText( " }") ; m_Writer.OutText( "") ; m_Writer.OutText( " // --------------------------------------------") ; // funzione per ricavare un gruppo dato l'ID (name + ID) m_Writer.OutText( "" ); m_Writer.OutText( " function findGroupByNameAndId(CurrentGroup, Id) {") ; m_Writer.OutText( " CurrentGroup.children.forEach(element => {") ; m_Writer.OutText( " if (element.name == Id) {") ; // --- m_Writer.OutText( " ScanElements(element, true);") ; <---- original m_Writer.OutText( " // creo il box per telecamera -----") ; m_Writer.OutText( " controls.element = element;") ; m_Writer.OutText( " createBox(element);") ; m_Writer.OutText( " // ----------------------------------") ; m_Writer.OutText( " EvidenziaLoadPage(element);") ; m_Writer.OutText( " trovato = true;"); m_Writer.OutText( " }") ; m_Writer.OutText( " if (element.children.length != 0) {") ; m_Writer.OutText( " findGroupByNameAndId(element, Id);") ; m_Writer.OutText( " }") ; m_Writer.OutText( " });") ; m_Writer.OutText( " }") ; m_Writer.OutText( " // --------------------------------------------") ; m_Writer.OutText( "") ; // funzione per ricavare il gruppo selezionato dal menu // --- m_Writer.OutText( " selectElement = function(val) {") ; // --- m_Writer.OutText(" ScanElements(val, true);"); // --- m_Writer.OutText( " }") ; // funzione per creare il box al gruppo selezionato m_Writer.OutText( "") ; m_Writer.OutText( " function createBox(element) {") ; m_Writer.OutText( " var box = new THREE.BoxHelper(element, 0xff0000);") ; m_Writer.OutText( " camera.position.y = " + ToString(m_ptMin.y + (m_dimZ * 1.1))+ ";") ; //115% m_Writer.OutText( " var center = box.geometry.boundingSphere.center;") ; m_Writer.OutText( " orbitControls.target = center;") ; m_Writer.OutText(" controls.tar.x = center.x;") ; m_Writer.OutText(" controls.tar.y = center.y;") ; m_Writer.OutText(" controls.tar.z = center.z;") ; m_Writer.OutText(" boxCreated = true;") ; m_Writer.OutText(" }"); m_Writer.OutText(" // --------------------------------------------"); m_Writer.OutText( "") ; // creazione del menu Gui m_Writer.OutText( " var gui = new dat.GUI({ width: 200 });") ; m_Writer.OutText( " gui.add(controls, 'motion').name('Rotation');") ; m_Writer.OutText( " gui.add(controls, 'reset').name('Reset camera');") ; m_Writer.OutText( " document.getElementsByClassName('dg main a')[0].style.marginRight = '0px';") ; m_Writer.OutText(" // --------------------------------------------") ; // funzione per evidenziare un gruppo selezionato (per timer) 0xFBF719 m_Writer.OutText( "") ; m_Writer.OutText( " function EnlightGroup(SelGroup) {") ; m_Writer.OutText( " if (SelGroup !== null) {"); m_Writer.OutText( " SelGroup.children.forEach(element => {") ; m_Writer.OutText( " if (!(element instanceof THREE.Group)) {") ; m_Writer.OutText( " if (element instanceof THREE.Line) { //linea") ; m_Writer.OutText( " element.material.color = new THREE.Color(0xFBF719);") ; m_Writer.OutText( " }") ; m_Writer.OutText( " else if (element instanceof THREE.Mesh) { //mesh") ; 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);") ; m_Writer.OutText( " }") ; m_Writer.OutText( " else if (element instanceof THREE.Vector3) { //vettore") ; m_Writer.OutText( " element.line.material.color = new THREE.Color(0xFBF719);") ; m_Writer.OutText( " element.cone.material.color = new THREE.Color(0xFBF719);") ; m_Writer.OutText( " }") ; m_Writer.OutText( " else if (element instanceof THREE.Object3D) { //frame") ; m_Writer.OutText( " element.line.material.color = new THREE.Color(0xFBF719);") ; m_Writer.OutText( " element.cone.material.color = new THREE.Color(0xFBF719);") ; m_Writer.OutText( " }") ; m_Writer.OutText( " }") ; m_Writer.OutText( " else {") ; m_Writer.OutText( " EnlightGroup(element);") ; m_Writer.OutText( " }") ; m_Writer.OutText( " });") ; m_Writer.OutText( " }") ; m_Writer.OutText( " }") ; m_Writer.OutText( " // --------------------------------------------") ; m_Writer.OutText( "") ; // funzione per riportare il colore del gruppo selezionato a quello originale (per timer) m_Writer.OutText( "") ; m_Writer.OutText( " function GetColorBack(SelGroup) {") ; m_Writer.OutText( " if (SelGroup !== null) {") ; m_Writer.OutText( " SelGroup.children.forEach(element => {") ; m_Writer.OutText( " if (!(element instanceof THREE.Group)) {") ; m_Writer.OutText( " if (element instanceof THREE.Line) { //linea") ; m_Writer.OutText( " element.material.color = element.material.oldColor;") ; m_Writer.OutText( " }") ; m_Writer.OutText( " else if (element instanceof THREE.Mesh) { //mesh") ; 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( " 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( " }") ; m_Writer.OutText( " else if (element instanceof THREE.Vector3) { //vettore") ; m_Writer.OutText( " element.line.material.color = element.oldColor;") ; m_Writer.OutText( " element.cone.material.color = element.oldColor; ") ; m_Writer.OutText( " }") ; m_Writer.OutText( " else if (element instanceof THREE.Object3D) { //frame") ; m_Writer.OutText( " element.line.material.color = element.oldColor;") ; m_Writer.OutText( " element.cone.material.color = element.oldColor;") ; m_Writer.OutText( " }") ; m_Writer.OutText( " }") ; m_Writer.OutText( " else {") ; m_Writer.OutText( " GetColorBack(element);") ; m_Writer.OutText( " }") ; m_Writer.OutText( " });") ; m_Writer.OutText( " }") ; m_Writer.OutText( " }") ; m_Writer.OutText( " // --------------------------------------------") ; m_Writer.OutText( "") ; // funzione per tenere evidenziato il gruppo selezionato (funzione con il timer) m_Writer.OutText( "") ; m_Writer.OutText( " function EvidenziaLoadPage(ChoosenGroup) {") ; m_Writer.OutText( "") ; m_Writer.OutText( " if (ChoosenGroup === null) {") ; m_Writer.OutText( " return;") ; m_Writer.OutText( " }") ; m_Writer.OutText( "") ; m_Writer.OutText( " var i = 0;") ; m_Writer.OutText( " var YellowSet = false;") ; m_Writer.OutText( " var OrigColSet = false;") ; m_Writer.OutText( "") ; m_Writer.OutText( " function animation() {") ; m_Writer.OutText( " var timer = setTimeout(function() {") ; m_Writer.OutText( " i++;") ; m_Writer.OutText( " //console.log(i); //delete it") ; m_Writer.OutText( " if (!YellowSet && i < 10)") ; m_Writer.OutText( " {") ; m_Writer.OutText( " // coloro di giallo !!!") ; m_Writer.OutText( " EnlightGroup(ChoosenGroup);") ; m_Writer.OutText( "") ; m_Writer.OutText( " YellowSet = true;") ; m_Writer.OutText( " OrigColSet = false;") ; m_Writer.OutText( " }") ; m_Writer.OutText( " else if (!OrigColSet && (i >= 10 && i < 20))") ; m_Writer.OutText( " {") ; m_Writer.OutText( " // riporto i colori originali ") ; m_Writer.OutText( " GetColorBack(ChoosenGroup);") ; m_Writer.OutText( "") ; m_Writer.OutText( " YellowSet = false;") ; m_Writer.OutText( " OrigColSet = true;") ; m_Writer.OutText( " }") ; m_Writer.OutText( " else if (i == 20)") ; m_Writer.OutText( " {") ; m_Writer.OutText( " i = 0;") ; m_Writer.OutText( " }") ; m_Writer.OutText( "") ; m_Writer.OutText( " animation();") ; m_Writer.OutText( "") ; m_Writer.OutText( " }, 25); //1.5 seconds test") ; m_Writer.OutText( " }") ; m_Writer.OutText( "") ; m_Writer.OutText( " animation(); // prima chimata") ; m_Writer.OutText( "") ; m_Writer.OutText( " }") ; m_Writer.OutText( " // --------------------------------------------") ; m_Writer.OutText( "") ; // funzione per riportare il colore del gruppo selezionato a quello originale // --- m_Writer.OutText(" GetColorBack = function(SelGroup) {") ; // --- m_Writer.OutText(" if (SelGroup != = null) {") ; // --- m_Writer.OutText(" SelGroup.children.forEach(element => {") ; // --- m_Writer.OutText(" if (!(element instanceof THREE.Group)) {") ; // --- m_Writer.OutText(" if (element instanceof THREE.Line) { //linea") ; // --- m_Writer.OutText(" element.material.color = element.material.oldColor;") ; // --- m_Writer.OutText(" }") ; // --- m_Writer.OutText(" else if (element instanceof THREE.Mesh) { //mesh") ; // --- m_Writer.OutText(" element.material.color = element.material.oldColor;"); // --- 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(" }"); // --- m_Writer.OutText(" else if (element instanceof THREE.Vector3) { //vettore"); // --- m_Writer.OutText(" element.line.material.color = element.oldColor;"); // --- m_Writer.OutText(" element.cone.material.color = element.oldColor;"); // --- m_Writer.OutText(" }"); // --- m_Writer.OutText(" else if (element instanceof THREE.Object3D) { //frame"); // --- m_Writer.OutText(" element.line.material.color = element.oldColor;"); // --- m_Writer.OutText(" element.cone.material.color = element.oldColor;"); // --- m_Writer.OutText(" }"); // --- m_Writer.OutText(" }"); // --- m_Writer.OutText(" else {"); // --- m_Writer.OutText(" GetColorBack(element);"); // --- m_Writer.OutText(" }"); // --- m_Writer.OutText(" });"); // --- m_Writer.OutText(" };"); // --- m_Writer.OutText(" }"); // funzione per evidenziare gli elementi dei un gruppo // ---m_Writer.OutText( " ScanElements = function(SelGroup, c) {") ; // ---m_Writer.OutText( " if(c){") ; // ---m_Writer.OutText( " if (!first) {") ; // ---m_Writer.OutText( " GetColorBack(LastGroupSelected);") ; // ---m_Writer.OutText( " }") ; // ---m_Writer.OutText( " first = false;") ; // ---m_Writer.OutText( " LastGroupSelected = SelGroup;") ; // ---m_Writer.OutText( " }") ; // ---m_Writer.OutText( " SelGroup.children.forEach(element => {") ; // ---m_Writer.OutText( " if (!(element instanceof THREE.Group)) {") ; // ---m_Writer.OutText( " if (element instanceof THREE.Line) { //linea") ; // ---m_Writer.OutText( " element.material.color = new THREE.Color(0xFBF719);") ; // ---m_Writer.OutText( " }") ; // ---m_Writer.OutText( " else if (element instanceof THREE.Mesh) { //mesh") ; // ---m_Writer.OutText( " element.material.color = new THREE.Color(0xFBF719);") ; // ---m_Writer.OutText( " }") ; // ---m_Writer.OutText( " else if (element instanceof THREE.Points) { //punto") ; // ---m_Writer.OutText( " element.material.color = new THREE.Color(0xFBF719);") ; // ---m_Writer.OutText( " }"); // ---m_Writer.OutText( " else if (element instanceof THREE.Vector3) { //vettore") ; // ---m_Writer.OutText( " element.line.material.color = new THREE.Color(0xFBF719);") ; // ---m_Writer.OutText( " element.cone.material.color = new THREE.Color(0xFBF719);") ; // ---m_Writer.OutText( " }") ; // ---m_Writer.OutText( " else if (element instanceof THREE.Object3D) { //frame") ; // ---m_Writer.OutText( " element.line.material.color = new THREE.Color(0xFBF719);") ; // ---m_Writer.OutText( " element.cone.material.color = new THREE.Color(0xFBF719);") ; // ---m_Writer.OutText( " }") ; // ---m_Writer.OutText( " }") ; // ---m_Writer.OutText( " else {") ; // ---m_Writer.OutText( " ScanElements(element, false);") ; // ---m_Writer.OutText( " }") ; // ---m_Writer.OutText( " });") ; // ---m_Writer.OutText( " }") ; // funzione render per la scena m_Writer.OutText( " function renderScene() {") ; //m_Writer.OutText( "const div = document.getElementById('zoom_test');"); // div per controllo parametri //m_Writer.OutText( "div.textContent = " + ToString( m_dDistance) +";") ; // div per controllo parametri m_Writer.OutText( " var delta = clock.get") ; m_Writer.OutText( " orbitControls.update(zoom, " + ToString( m_dHalfWidth/2)+ ", " + ToString( m_dHalfHeight/2) + ");") ; // aggiornamento telecamera // --- m_Writer.OutText( " camera.zoom = zoom;") ; <---- original m_Writer.OutText( " orbitControls.autoRotate = controls.motion;") ; m_Writer.OutText( " camera.zoom = zoom + orbitControls.ComputedZoom - 1;") ; m_Writer.OutText( " camera.updateProjectionMatrix();") ; // aggiornamento matrice di proiezione su piano Near di clipping m_Writer.OutText( " requestAnimationFrame(renderScene);") ; m_Writer.OutText( " renderer.render(scene, camera);") ; m_Writer.OutText( " }") ; // aggiungo il canvas alla pagina html con la mia scena m_Writer.OutText( " document.getElementById('WebGL-output').appendChild(renderer.domElement);") ; m_Writer.OutText( " document.body.appendChild(controlsGizmo.domElement);") ; m_Writer.OutText( " renderScene();") ; m_Writer.OutText( " $('.obit-controls-gizmo').bind('touchmove', false);") ; m_Writer.OutText( " $('.obit-controls-gizmo').bind('touchstart', false);") ; m_Writer.OutText( " $('.obit-controls-gizmo').bind('touchend', false);") ; m_Writer.OutText( " $('.obit-controls-gizmo').bind('touchcancel', false);") ; m_Writer.OutText( " }") ; // funzione resize della pagina m_Writer.OutText( " function onResize() {") ; m_Writer.OutText( " camera.aspect = window.innerWidth / window.innerHeight;") ; m_Writer.OutText( " camera.updateProjectionMatrix();") ; m_Writer.OutText( " renderer.setSize(window.innerWidth, window.innerHeight);") ; m_Writer.OutText( " }") ; //funzione per lo zoom della pagina m_Writer.OutText( " function zoomView(){") ; m_Writer.OutText( " zoom += event.wheelDeltaY * 0.00025;") ; m_Writer.OutText( " zoom = Math.max( Math.min( zoom, 10000000 ), 0.00000001);") ; m_Writer.OutText( " };") ; // richiamo della funzione init() e dichiarazione degli eventi in javascript per controllo della scena m_Writer.OutText( " window.onload = init") ; // m_Writer.OutText( " window.addEventListener('resize', onResize, false);") ; m_Writer.OutText( " window.addEventListener('wheel', zoomView, false);") ; m_Writer.OutText( " ") ; m_Writer.OutText( " ") ; m_Writer.OutText( "") ; // Termino scrittura del File del Menu m_WriterM.OutText( " ") ; m_WriterM.OutText( "") ; return true ; } //---------------------------------------------------------------------------- bool GetColor( const Color& Ccol, string& sHexCol) { // ottengo i codici R,G e B dei materiali int iRedColor = Ccol.GetIntRed() ; int iGreenColor = Ccol.GetIntGreen() ; int iBlueColor = Ccol.GetIntBlue() ; char chexColor[9] ; // imposto il colore di Default o ricavo il corrispondente codice in esadecimale std::snprintf( chexColor, sizeof chexColor, "0x%02x%02x%02x", iRedColor, iGreenColor, iBlueColor) ; sHexCol = chexColor ; return true ; } //---------------------------------------------------------------------------- bool ExportThreeJS::ExportObject( const IGdbIterator& iIter, IGeomDB* pGDB, const int nGroupCount) { // recupero il livello dell'oggetto int nLev = GDB_LV_USER; iIter.GetCalcLevel(nLev); // recupero il modo dell'oggetto int nMode = GDB_MD_STD; iIter.GetCalcMode(nMode); // recupero lo stato dell'oggetto int nStat = GDB_ST_ON; iIter.GetCalcStatus(nStat); if (TestFilter(nLev, nMode, nStat)) { switch (iIter.GetGdbType()) { case GDB_TY_GEO: { // recupero l'oggetto geometrico const IGeoObj* pGeoObj = iIter.GetGeoObj(); if (pGeoObj == nullptr) return true; // recupero il riferimento globale dell'oggetto Frame3d frFrame; if (!iIter.GetGlobFrame(frFrame)) return false; // se il filtro lo abilita //if (TestFilter(nLev, nMode, nStat)) //{ // recupero eventuale nome string sName; if (!iIter.GetName(sName)) sName = ToString(iIter.GetId()); // colore oggetto if (sName != "Box" && sName != "box") { Color cCol; int nIndex; bool bColorSpot = false; iIter.GetMaterial(nIndex); if (nIndex == GDB_MT_COLOR) iIter.GetMaterial(cCol); else { PtrOwner iIterNew(CreateGdbIterator(pGDB)); int nParendID = iIter.GetParentId(); int nMaterialID; while (!bColorSpot) { iIterNew->GoTo(nParendID); if (iIterNew->GetMaterial(nMaterialID) && nMaterialID == GDB_MT_COLOR) { iIterNew->GetMaterial(cCol); bColorSpot = true; } nParendID = iIterNew->GetParentId(); } } // emetto l'oggetto switch ( pGeoObj->GetType()) { case GEO_VECT3D: // vettore if ( ! ExportVector3D( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case GEO_PNT3D: // punto if ( ! ExportPoint3D( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case GEO_FRAME3D: // frame 3D if ( ! ExportFrame3D( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case CRV_LINE: // linee rette if ( ! ExportLine3D( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case CRV_ARC: // archi if ( ! ExportCurveComp3D( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case CRV_COMPO: // curve composite if ( ! ExportCurveComp3D( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case CRV_BEZIER: // curve di Bezier if ( ! ExportCurveComp3D( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case SRF_TRIMESH: // superfici trimesh if ( ! ExportSTM( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case SRF_FLATRGN: // flat region if ( ! ExportSFR( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case SRF_BEZIER: // superfici di Bezier if ( ! ExportSBezier( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case EXT_TEXT: // testi if ( ! ExportText( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; case EXT_DIMENSION: // dimensione oggetti if ( ! ExportDimension( ToString( iIter.GetId()), pGeoObj, frFrame, cCol, nGroupCount)) return false ; break ; default: break ; } } //} } return true ; case GDB_TY_GROUP: // esploro il gruppo return ScanGroup( iIter, pGDB, nGroupCount); default: return false ; } } return true; } //---------------------------------------------------------------------------- bool ExportThreeJS::ExportVector3D( const string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& Ccol, const int nGroupCount) { // prelevo il vettore (vettore stesso e punto di applicazione) e il suo colore const IGeoVector3d* pVEC = GetGeoVector3d( pGeoObj) ; if ( pVEC == nullptr) return false ; Vector3d vVec = pVEC->GetVector() ; Point3d ptVec = pVEC->GetBase() ; string sHexCol ; GetColor( Ccol, sHexCol) ; // porto il vettore in coordinate ThreeJS vVec.ToGlob( frFrame) ; ptVec.LocToLoc( frFrame, m_frTHREEJSFrame) ; // scrivo il vettore m_Writer.OutText( " var vettore" + sName + " = new THREE.Vector3(" + ToString(vVec.y) + ", " + ToString(vVec.z) + ", " + ToString(vVec.x) + ")") ; m_Writer.OutText( " vettore" + sName + ".normalize();") ; m_Writer.OutText( " var origin = new THREE.Vector3(" + ToString(ptVec.x) + ", " + ToString(ptVec.y) + ", " + ToString(ptVec.z) + ")") ; m_Writer.OutText( " var length = " + ToString(vVec.Len()) + ";") ; m_Writer.OutText( " var hex = " + sHexCol +";") ; m_Writer.OutText( " var arrowHelper" + sName + " = new THREE.ArrowHelper(vettore" + sName + ", origin, length, hex);") ; m_Writer.OutText( " arrowHelper" + sName + ".oldColor = new THREE.Color(hex);") ; //salvataggio colore per selezione m_Writer.OutText( " list_of_objects.push(arrowHelper" + sName + ");") ; // aggiungo il vettore al suo gruppo di appartenenza if ( nGroupCount != -1) m_Writer.OutText( " group" + ToString(nGroupCount) + ".children.push(arrowHelper" + sName + ")") ; return true ; } //---------------------------------------------------------------------------- bool ExportThreeJS::ExportLine3D( const string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& Ccol, const int nGroupCount) { // prelevo la Linea retta (punto iniziale e punto finale) e il suo colore const ICurveLine* pLINE = GetCurveLine( pGeoObj) ; if ( pLINE == nullptr) return false ; Point3d pStartP = pLINE->GetStart() ; Point3d pEndP = pLINE->GetEnd() ; // porto i punti in coordinate ThreeJS pStartP.LocToLoc(frFrame, m_frTHREEJSFrame) ; pEndP.LocToLoc( frFrame, m_frTHREEJSFrame) ; string sHexCol ; GetColor( Ccol, sHexCol) ; // scrivo la linea m_Writer.OutText( " const line_material" + sName + " = new THREE.LineBasicMaterial({ color: " + sHexCol + " });") ; m_Writer.OutText( " line_material" + sName + ".oldColor = new THREE.Color(" + sHexCol + ")") ; m_Writer.OutText( " var line_geometry" + sName + " = new THREE.Geometry();") ; m_Writer.OutText( " line_geometry" + sName +".vertices.push(") ; m_Writer.OutText( " new THREE.Vector3(" + ToString(pStartP.x) + "," + ToString(pStartP.y) + "," + ToString(pStartP.z) + "),") ; m_Writer.OutText( " new THREE.Vector3(" + ToString(pEndP.x) + "," + ToString(pEndP.y) + "," + ToString(pEndP.z) + "));") ; m_Writer.OutText( " var line" + sName + " = new THREE.Line(line_geometry" + sName +",line_material" + sName + ");") ; m_Writer.OutText( " list_of_objects.push(line" + sName + ");") ; // aggiungo la linea al suo gruppo di appartenenza if ( nGroupCount != -1) m_Writer.OutText( " group" + ToString( nGroupCount) + ".children.push(line" + sName + ")") ; return true ; } //---------------------------------------------------------------------------- bool ExportThreeJS::ExportPoint3D( const string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& Ccol, const int nGroupCount) { // prelevo il punto e il suo colore const IGeoPoint3d* pPoint = GetGeoPoint3d( pGeoObj) ; if ( pPoint == nullptr) return false ; Point3d ptPoint = pPoint->GetPoint() ; // porto il punto in coordinate ThreeJS ptPoint.LocToLoc(frFrame, m_frTHREEJSFrame) ; string sHexCol ; GetColor( Ccol, sHexCol) ; // scrivo il punto m_Writer.OutText( " var dotGeometry" + sName + " = new THREE.Geometry();") ; m_Writer.OutText( " dotGeometry" + sName + ".vertices.push(new THREE.Vector3( " + ToString(ptPoint.x) + ", " + ToString(ptPoint.y) + ", " + ToString(ptPoint.z) + "));") ; m_Writer.OutText( " var dotMaterial" + sName +" = new THREE.PointsMaterial( { size: 5, sizeAttenuation: false, color: " + sHexCol +" } );") ; m_Writer.OutText( " dotMaterial" + sName + ".oldColor = new THREE.Color(" + sHexCol + ");") ; m_Writer.OutText( " var dot" + sName + " = new THREE.Points( dotGeometry" + sName +", dotMaterial" + sName +" );") ; m_Writer.OutText( " list_of_objects.push(dot" + sName + ");") ; // aggiungo il punto al suo gruppo di appartenenza if (nGroupCount != -1) m_Writer.OutText(" group" + ToString(nGroupCount) + ".children.push(dot" + sName + ")") ; return true ; } //---------------------------------------------------------------------------- bool ExportThreeJS::ExportFrame3D( const string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& Ccol, const int nGroupCount) { // prelevo il frame (punto di applicazione e 3 versori) e i suoi colori const IGeoFrame3d* pFrame = GetGeoFrame3d( pGeoObj); if ( pFrame == nullptr) return false ; Frame3d frCurrentFrame = pFrame->GetFrame(); // porto il punto in coordinate ThreeJS frCurrentFrame.ToGlob( frFrame) ; string sHexCol; GetColor( Ccol, sHexCol); Point3d ptOrig = frCurrentFrame.Orig() ; ptOrig.LocToLoc(frFrame, m_frTHREEJSFrame); Vector3d vx = frCurrentFrame.VersZ() ; Vector3d vy = frCurrentFrame.VersX() ; Vector3d vz = frCurrentFrame.VersY() ; // scrivo i 3 vettori // x m_Writer.OutText( " var xdir" + sName + " = new THREE.Vector3(" + ToString(vx.x) + ", " + ToString(vx.y) + ", " + ToString(vx.z) + ");") ; m_Writer.OutText( " xdir" + sName + ".normalize()") ; m_Writer.OutText( " var origin" + sName + " = new THREE.Vector3(" + ToString(ptOrig.x) + ", " + ToString(ptOrig.y) + ", " + ToString(ptOrig.z)+ ");") ; m_Writer.OutText( " var length = 25;") ; m_Writer.OutText( " var hex = 0xff0000;") ; m_Writer.OutText( " var arrowHelper" + sName + " = new THREE.ArrowHelper(xdir" + sName + ", origin" + sName + ", length, hex);") ; m_Writer.OutText( " arrowHelper" + sName + ".oldColor = new THREE.Color(hex);") ; m_Writer.OutText( " list_of_objects.push(arrowHelper" + sName + ");") ; // aggiungo il vettore al suo gruppo di appartenenza if (nGroupCount != -1) m_Writer.OutText( " group" + ToString( nGroupCount) + ".children.push(arrowHelper" + sName + ")"); // y m_Writer.OutText( " var ydir" + sName + " = new THREE.Vector3(" + ToString( vy.x) + ", " + ToString( vy.y) + ", " + ToString( vy.z) + ");") ; m_Writer.OutText( " ydir" + sName + ".normalize()") ; m_Writer.OutText( " var origin" + sName + " = new THREE.Vector3(" + ToString( ptOrig.x) + ", " + ToString( ptOrig.y) + ", " + ToString( ptOrig.z) + ");") ; m_Writer.OutText( " var length = 25;") ; m_Writer.OutText( " var hex = 0x00ff00;") ; m_Writer.OutText( " var arrowHelper" + sName + " = new THREE.ArrowHelper(ydir" + sName + ", origin" + sName + ", length, hex);") ; m_Writer.OutText( " arrowHelper" + sName + ".oldColor = new THREE.Color(hex);"); m_Writer.OutText( " list_of_objects.push(arrowHelper" + sName + ");") ; // aggiungo il vettore al suo gruppo di appartenenza if (nGroupCount != -1) m_Writer.OutText(" group" + ToString(nGroupCount) + ".children.push(arrowHelper" + sName + ")"); // z m_Writer.OutText( " var zdir" + sName + " = new THREE.Vector3(" + ToString( vz.x) + ", " + ToString( vz.y) + ", " + ToString( vz.z) + ");") ; m_Writer.OutText( " zdir" + sName + ".normalize()") ; m_Writer.OutText( " var origin" + sName + " = new THREE.Vector3(" + ToString( ptOrig.x) + ", " + ToString( ptOrig.y) + ", " + ToString( ptOrig.z) + ");") ; m_Writer.OutText( " var length = 25;") ; m_Writer.OutText( " var hex = 0x0000ff;") ; m_Writer.OutText( " var arrowHelper" + sName + " = new THREE.ArrowHelper(zdir" + sName + ", origin" + sName + ", length, hex);") ; m_Writer.OutText( " arrowHelper" + sName + ".oldColor = new THREE.Color(hex);"); m_Writer.OutText( " list_of_objects.push(arrowHelper" + sName + ");") ; // aggiungo il vettore al suo gruppo di appartenenza if (nGroupCount != -1) m_Writer.OutText(" group" + ToString(nGroupCount) + ".children.push(arrowHelper" + sName + ")"); return true ; } //---------------------------------------------------------------------------- bool ExportThreeJS::ExportCurveComp3D( const string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& Ccol, const int nGroupCount) { // prelevo la curva composita e il suo colore const ICurve* pCurve = GetCurve( pGeoObj) ; if ( pCurve == nullptr) return false ; string sHexCol ; GetColor( Ccol, sHexCol) ; // approssimo la curva composita con delle linee PolyLine pLine; pCurve->ApproxWithLines( EPS_SMALL, m_ANG_TOL_STD_DEG, ICurve::APL_STD, pLine) ; // prelevo il primo punto della curva composita (quindi della prima retta) Point3d ptCurrent ; pLine.GetFirstPoint( ptCurrent) ; // porto il punto in coordinate ThreeJS Point3d ptCurrentThreeJS = ptCurrent ; ptCurrentThreeJS.LocToLoc( frFrame, m_frTHREEJSFrame) ; // inizializzo la creazione della linea in javascript m_Writer.OutText( " const line_material" + sName + " = new THREE.LineBasicMaterial({ color: " + sHexCol +" });") ; m_Writer.OutText( " line_material" + sName + ".oldColor = new THREE.Color(" + sHexCol + ")") ; m_Writer.OutText( " var line_geometry" + sName + " = new THREE.Geometry();") ; m_Writer.OutText( " line_geometry" + sName + ".vertices.push(") ; m_Writer.OutText( " new THREE.Vector3(" + ToString( ptCurrentThreeJS.x) + "," + ToString( ptCurrentThreeJS.y) + "," + ToString( ptCurrentThreeJS.z) + "),") ; // scorro tutti i punti ottenuti dalla mia approssimazione e creo delle linee rette while ( pLine.GetNextPoint( ptCurrent)) { ptCurrentThreeJS = ptCurrent; ptCurrentThreeJS.LocToLoc( frFrame, m_frTHREEJSFrame) ; m_Writer.OutText( " new THREE.Vector3(" + ToString( ptCurrentThreeJS.x) + "," + ToString( ptCurrentThreeJS.y) + "," + ToString( ptCurrentThreeJS.z) + "),") ; } m_Writer.OutText( " );") ; m_Writer.OutText( " var Compoline" + sName + " = new THREE.Line(line_geometry" + sName + ",line_material" + sName + ");") ; m_Writer.OutText( " list_of_objects.push(Compoline" + sName + ");") ; // aggiungo la curva composita al suo gruppo di appartenenza if (nGroupCount != -1) m_Writer.OutText(" group" + ToString(nGroupCount) + ".children.push(Compoline" + sName + ")"); return true ; } //---------------------------------------------------------------------------- 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 ; // 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() ; // controllo trasparenza e opacità 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) ; // --- 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; // creo il materiale // front side m_Writer.OutText( " var front_surf_materials" + ToString( m_nCont) + "= new THREE.MeshPhongMaterial({color: " + sHexCol + ", transparent: true , opacity: " + ToString( dOpacityThreeJs) + ", side: THREE.FrontSide});") ; m_Writer.OutText( " front_surf_materials" + ToString( m_nCont) + ".oldColor = new THREE.Color(" + sHexCol + ");") ; m_Writer.OutText( " front_surf_materials" + ToString( m_nCont) + ".depthTest = true;"); // abilito test profondità m_Writer.OutText( " front_surf_materials" + ToString( m_nCont) + ".blending = THREE.CustomBlending") ; // flag per blending customizzato 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) + ".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) } // creo vettore di vertici per i triangoli della mesh m_Writer.OutText(" var vertices" + ToString( m_nCont) + " = [") ; int iTotV = pSTM->GetVertexCount() ; int iTotT = pSTM->GetTriangleCount() ; Point3d ptCurrent ; int iPtCurrentTria[3] ; // scorro tutti i vertici e ne scrivo le coordinate 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) + "),") ; } m_Writer.OutText( " ];") ; // creo vettore delle facce dei triangoli m_Writer.OutText( " var faces" + ToString(m_nCont) + " = [ ") ; // scorro tutti i triangoli associandogli una faccia della mesh 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]) + "),") ; } 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 // 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;") ; // 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) + ")") ; // 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;") ; // 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) + ")") ; // 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 // aggiungo al superficie al suo gruppo di appartenenza if ( nGroupCount != -1) m_Writer.OutText( " group" + ToString( nGroupCount) + ".children.push(opaca_mesh_" + ToString( m_nCont) + ")") ; } return true ; } //---------------------------------------------------------------------------- bool ExportThreeJS::ExportSFR( const string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& cCol, const int nGroupCount) { // verifico oggetto const ISurfFlatRegion* pSFR = GetSurfFlatRegion( pGeoObj) ; if ( pSFR == nullptr) return false ; // ricavo la trimesh equivalente const ISurfTriMesh* pStm = pSFR->GetAuxSurf() ; return ExportSTM(sName, pStm, frFrame, cCol, nGroupCount) ; } //---------------------------------------------------------------------------- bool ExportThreeJS::ExportSBezier( const std::string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& cCol, const int nGroupCount) { // verifico oggetto const ISurfBezier* sbez = GetSurfBezier( pGeoObj) ; if ( sbez == nullptr) return false ; // ricavo la trimesh equivalente const ISurfTriMesh* pStm = sbez->GetAuxSurf() ; return ExportSTM(sName, pStm, frFrame, cCol, nGroupCount) ; } //---------------------------------------------------------------------------- bool ExportThreeJS::ExportText( const string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& Ccol, const int nGroupCount) { // verifico l'oggetto const IExtText* pText = GetExtText( pGeoObj) ; if ( pText == nullptr) return false ; // approssimo il testo come un insieme di curve POLYLINELIST lstPL ; pText->ApproxWithLines( EPS_SMALL, m_ANG_TOL_STD_DEG, lstPL) ; Point3d ptCurrent ; // ricavo il colore della scritta (R,G,B,A) string sHexCol ; GetColor(Ccol, sHexCol) ; // scorro tutte le curve trovate for ( PolyLine aLine : lstPL) { // prelevo il primo punto aLine.GetFirstPoint( ptCurrent) ; ptCurrent.LocToLoc( frFrame, m_frTHREEJSFrame) ; // aumento il contatore generale per evitare nomi uguali su javascript m_nCont++ ; m_Writer.OutText( " const text_line_material" + ToString( m_nCont) + " = new THREE.LineBasicMaterial({ color: " + sHexCol + ", linewidth: 1.2 });") ; m_Writer.OutText( " text_line_material" + ToString( m_nCont) + ".oldColor = new THREE.Color(" + sHexCol + ");") ; m_Writer.OutText( " var text_line_geometry" + ToString( m_nCont) +" = new THREE.Geometry();") ; m_Writer.OutText( " text_line_geometry" + ToString( m_nCont) + ".vertices.push(") ; m_Writer.OutText( " new THREE.Vector3(" + ToString( ptCurrent.x) + "," + ToString( ptCurrent.y) + "," + ToString( ptCurrent.z) + "),") ; // scorro tutti i punti e approssimo con delle linee rette while (aLine.GetNextPoint(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( " var text_Compoline" + ToString( m_nCont) + " = new THREE.Line(text_line_geometry" + ToString( m_nCont) + ",text_line_material" + ToString( m_nCont) + ");") ; m_Writer.OutText( " text_Compoline" + ToString( m_nCont) + ".translateY(1);") ; m_Writer.OutText( " list_of_objects.push(text_Compoline" + ToString( m_nCont) + ");") ; // aggiungo la polyline al suo gruppo di appartenenza if (nGroupCount != -1) m_Writer.OutText( " group" + ToString( nGroupCount) + ".children.push(text_Compoline" + ToString( m_nCont) + ")") ; } return true ; } //---------------------------------------------------------------------------- bool ExportThreeJS::ExportDimension( const std::string& sName, const IGeoObj* pGeoObj, const Frame3d& frFrame, const Color& Ccol, const int nGroupCount) { // verifico l'oggetto const IExtDimension* pDim = GetExtDimension( pGeoObj); if ( pDim == nullptr) return false ; // approssimo con delle curve POLYLINELIST lstPL ; pDim->ApproxWithLines( EPS_SMALL, m_ANG_TOL_STD_DEG, lstPL) ; Point3d ptCurrent ; int iDiff = 0 ; // prelevo il colore string sHexCol ; GetColor( Ccol, sHexCol) ; // per ogni curva di approssimazione scorro i suoi punti e creo delle linee rette for ( PolyLine aLine : lstPL) { aLine.GetFirstPoint( ptCurrent) ; ptCurrent.LocToLoc( frFrame, m_frTHREEJSFrame) ; m_Writer.OutText( " const text_line_material" + sName + ToString( iDiff) + " = new THREE.LineBasicMaterial({ color: " + sHexCol + "});") ; m_Writer.OutText( " text_line_material" + sName + ToString(iDiff) + ".oldColor = new THREE.Color(" + sHexCol + ")") ; m_Writer.OutText( " var text_line_geometry" + sName + ToString( iDiff) + " = new THREE.Geometry();") ; m_Writer.OutText( " text_line_geometry" + sName + ToString( iDiff) + ".vertices.push(") ; m_Writer.OutText( " new THREE.Vector3(" + ToString( ptCurrent.x) + "," + ToString( ptCurrent.y) + "," + ToString( ptCurrent.z) + "),") ; while ( aLine.GetNextPoint( 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( " var text_Compoline" + sName + ToString(iDiff) + " = new THREE.Line(text_line_geometry" + sName + ToString(iDiff) + ",text_line_material" + sName + ToString(iDiff) + ");") ; m_Writer.OutText( " list_of_objects.push(text_Compoline" + sName + ToString(iDiff) + ");") ; iDiff++ ; // aggiungo la distanza al suo gruppo di appartenenza if (nGroupCount != -1) m_Writer.OutText(" group" + ToString( nGroupCount) + ".children.push(text_Compoline" + sName + ToString( iDiff-1) + ")") ; } return true ; } //---------------------------------------------------------------------------- bool ExportThreeJS::ScanGroup( const IGdbIterator& iIter, IGeomDB* pGDB, const int nGroupCount) { // creo un iteratore PtrOwner pIter( CreateGdbIterator( iIter.GetGDB())) ; if ( IsNull( pIter)) return false ; // scandisco il gruppo bool bOk = true ; pIter->GoTo( iIter.GetId()) ; m_nGroupCount++; m_Writer.OutText( " const group" + ToString( m_nGroupCount) + " = new THREE.Group();") ; if (nGroupCount != -1) m_WriterM.OutText("
    "); else m_WriterM.OutText( "
      ") ; //m_WriterM.OutText( "
      ") ; //<--- string sName ; pIter->GetName(sName); for ( int i = 0; sName[i] != '\0'; i++) // sostituisco gli spazi con underscore { if (sName[i] == ' ') sName[i] = '_'; } sName += "_" + ToString(pIter->GetId()); string sId = ToString(pIter->GetId()) ; m_Writer.OutText( " group" + ToString( m_nGroupCount) + ".name = '" + sId + "'") ; //m_Writer.OutText( " group" + ToString(m_nGroupCount) + ".name = group" + ToString(m_nGroupCount) + ".name.normalize('NFD').replace(/[\u0300-\u036f]/g, '')"); //m_WriterM.OutText(" " + sName + ""); //<--- if (!sId.compare("0")) { m_WriterM.OutText( " Basic ") ; } else { m_WriterM.OutText(" " + sName + " "); } if (nGroupCount != -1 && m_nGroupCount != nGroupCount) { // --- m_Writer.OutText(" var gui" + ToString(m_nGroupCount) + "= gui" + ToString(nGroupCount) + ".addFolder('" + sName + "');"); } int nCurrentGroup = m_nGroupCount; for (bool bNext = pIter->GoToFirstInGroup( iIter) ; bNext ; bNext = pIter->GoToNext()) { if ( ! ExportObject( *pIter, pGDB, nCurrentGroup)) bOk = false ; } if (nGroupCount != -1) { m_Writer.OutText( " group" + ToString(nGroupCount) + ".add(group" + ToString( nCurrentGroup) + ")"); //m_WriterM.OutText( "
      ") ; m_WriterM.OutText( "
    ") ; //<--- /* if (!pIter->GetName(sName)) { sName = "Layer" + ToString(pIter->GetId()); } */ /* <--- original m_Writer.OutText( " var settings" + ToString( nCurrentGroup) + " = {") ; m_Writer.OutText( " 'S_Group" + ToString( nCurrentGroup)+ "' : function() { selectElement(group" + ToString( nCurrentGroup) + ") }") ; m_Writer.OutText( " }") ; m_Writer.OutText( " gui" + ToString( nGroupCount) + ".add(settings" + ToString( nCurrentGroup) + ", 'S_Group" + ToString( nCurrentGroup) + "').name('" + sName + "')") ; */ } return bOk ; } //---------------------------------------------------------------------------- bool ExportThreeJS::TestFilter( int nLev, int nMode, int nStat) { /* if (( nLev == GDB_LV_USER && (m_nFilter & EEXFLT_LEVUSER) == 0) || ( nLev == GDB_LV_SYSTEM && (m_nFilter & EEXFLT_LEVSYSTEM) == 0) || ( nLev == GDB_LV_TEMP && (m_nFilter & EEXFLT_LEVTEMP) == 0)) return false; if (( nMode == GDB_MD_STD && (m_nFilter & EEXFLT_MODESTD) == 0) || ( nMode == GDB_MD_LOCKED && (m_nFilter & EEXFLT_MODELOCKED) == 0) || ( nMode == GDB_MD_HIDDEN && (m_nFilter & EEXFLT_MODEHIDDEN) == 0)) return false; */ if (( nStat == GDB_ST_OFF && (m_nFilter & EEXFLT_STAOFF) == 0) || ( nStat == GDB_ST_ON && (m_nFilter & EEXFLT_STAON) == 0) || ( nStat == GDB_ST_SEL && (m_nFilter & EEXFLT_STASEL) == 0)) return false ; return true ; }