From 91d13357f38cbe3041ff719222f727b1d964e6c4 Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Fri, 4 Nov 2022 15:00:56 +0100 Subject: [PATCH] egtExchange : - posizione centrale dell'oggetto esportato - render pagina web (prime modifiche) - Posizione telecamera al cambio tra prospettica e ortografica - rotazione del cubo attorno al target arruale (e non all'origine) - Correzione grandezza della lista dei vertici nelle mesh. --- ExportThreeJS.cpp | 312 +++++++++++++++++++++++++++++++--------------- 1 file changed, 210 insertions(+), 102 deletions(-) diff --git a/ExportThreeJS.cpp b/ExportThreeJS.cpp index a8d5031..417bee8 100644 --- a/ExportThreeJS.cpp +++ b/ExportThreeJS.cpp @@ -130,7 +130,7 @@ ExportThreeJS::CompressAll( const string& sFile) return false ; } pSource = zip_source_file( pZipper, ( m_sThreeJSLibDir + "\\Controls\\OrbitControlsM.js" ).c_str(), 0, 0) ; - if ( zip_file_add( pZipper, ( sFileTitle + "\\Lib\\Controls\\OrbitControlsM.js").c_str(), pSource, ZIP_FL_ENC_UTF_8) == -1) { + if ( zip_file_add( pZipper, ( sFileTitle + "\\Lib\\Controls\\orbitControlsM.js").c_str(), pSource, ZIP_FL_ENC_UTF_8) == -1) { EraseFile( sFile) ; return false ; } @@ -523,7 +523,7 @@ ExportThreeJS::HeadAmbient( IEGrScene* pScene, IGeomDB* pGDB, int nId) m_Writer.OutText( " ") ; - m_Writer.OutText( " ") ; m_Writer.OutText( " ") ; @@ -686,6 +686,8 @@ ExportThreeJS::HeadAmbient( IEGrScene* pScene, IGeomDB* pGDB, int nId) m_Writer.OutText( " var spotLight1 = null;") ; // punto luca dell scena ( e rendering delle ombre ) m_Writer.OutText( " var plane = null;") ; // piano su cui poggia la griglia, visibile solo dal lato front m_Writer.OutText( " var ShowGrid = true;") ; // T/F -> se la griglia รจ nella scena o no + m_Writer.OutText( " var BoxSceneCenter;") ; // box globale del groupRoot (tutti gli oggetti della scena) + m_Writer.OutText( " var aspect = window.innerWidth / window.innerHeight;") ; // aspetRatio per risoluzione e rendering geometrie // funzione init() -> funzione principale che viene richiamata per la creazione della scena e dei suoi oggetti m_Writer.OutText( " function init() { ") ; @@ -693,10 +695,11 @@ ExportThreeJS::HeadAmbient( IEGrScene* pScene, IGeomDB* pGDB, int nId) m_Writer.OutText( " scene = new THREE.Scene();") ; // imposto telecamera ortografica (posizione, punto di focus, posizione piani di clipping e definizione della zona di viewing frustum) (o prospettica) m_Writer.OutText( " if(CameraView == 0){") ; - m_Writer.OutText( " camera = new THREE.OrthographicCamera(" + ToString( -m_dHalfWidth) + ", " + ToString( m_dHalfWidth) + ", " + ToString( m_dHalfHeight) + ", " + ToString( -m_dHalfHeight) + "," + ToString( m_dZNear) + ", " + ToString( m_dZFar) + ");") ; + m_Writer.OutText( " camera = new THREE.OrthographicCamera(" + ToString( -m_dHalfWidth) + " * aspect / 2, " + ToString( m_dHalfWidth) + " * aspect / 2, " + ToString( m_dHalfHeight) + ", " + ToString( -m_dHalfHeight) + "," + ToString( m_dZNear) + ", " + ToString( m_dZFar) + ");") ; m_Writer.OutText( " }") ; m_Writer.OutText( " else {") ; m_Writer.OutText( " camera = new THREE.PerspectiveCamera(45, window.screen.availWidth / window.screen.availHeight, 1," + ToString( m_dZFar) + " * 75);") ; + m_Writer.OutText(" camera.aspect = aspect;") ; m_Writer.OutText( " }") ; 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 @@ -707,12 +710,12 @@ ExportThreeJS::HeadAmbient( IEGrScene* pScene, IGeomDB* pGDB, int nId) m_Writer.OutText( " renderer.setClearColor(new THREE.Color(0xD3D3D3));") ; m_Writer.OutText( " renderer.setPixelRatio(window.devicePixelRatio );") ; m_Writer.OutText( " renderer.toneMapping = THREE.ACESFilmicToneMapping;") ; - m_Writer.OutText( " if (window.screen.width > window.screen.height) {") ; - m_Writer.OutText( " renderer.setSize(window.screen.availWidth, window.screen.availHeight);") ; - m_Writer.OutText( " }") ; - m_Writer.OutText( " else {") ; - m_Writer.OutText( " renderer.setSize(window.screen.availHeight, window.screen.availWidth);") ; - m_Writer.OutText( " }") ; + //m_Writer.OutText( " if (window.screen.width > window.screen.height) {") ; + m_Writer.OutText( " renderer.setSize(window.innerWidth, window.innerHeight);") ; + //m_Writer.OutText( " }") ; + //m_Writer.OutText( " else {") ; + //m_Writer.OutText( " renderer.setSize(window.innerHeight, window.innerWidth);") ; + //m_Writer.OutText( " }") ; m_Writer.OutText( " renderer.shadowMapEnabled = true;") ; m_Writer.OutText( " renderer.sortObjects = false;") ; // punto luce @@ -777,6 +780,7 @@ ExportThreeJS::FinishAmbient( void) m_Writer.OutText( " group.add(list_of_objects[i]);") ; m_Writer.OutText( " };"); m_Writer.OutText( " list_of_objects = [];") ; // <--- svuotamento della lista di tutte le geometrie <--- guardare groupRoot + m_Writer.OutText( " BoxSceneCenter = new THREE.Box3().setFromObject(groupRoot);") ; // <--- creazione del box globale di groupRoot // controlli del menu m_Writer.OutText( " var center;") ; @@ -789,18 +793,40 @@ ExportThreeJS::FinishAmbient( void) m_Writer.OutText( " tar : orbitControls.target,") ; // il target della telecamera m_Writer.OutText( " reset : function() {") ; // per resettare la telecamera alla condizioni iniziali m_Writer.OutText( " if(CameraView == 0){") ; - m_Writer.OutText( " camera = new THREE.OrthographicCamera(" + ToString( -m_dHalfWidth) + ", " + ToString( m_dHalfWidth) + ", " + ToString( m_dHalfHeight) + ", " + ToString( -m_dHalfHeight) + "," + ToString( m_dZNear) + ", " + ToString( m_dZFar) + ");") ; + m_Writer.OutText( " camera = new THREE.OrthographicCamera(" + ToString( -m_dHalfWidth) + " * aspect / 2, " + ToString( m_dHalfWidth) + " * aspect / 2, " + ToString( m_dHalfHeight) + ", " + ToString( -m_dHalfHeight) + "," + ToString( m_dZNear) + ", " + ToString( m_dZFar) + ");") ; + 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( " }else {") ; - m_Writer.OutText( " camera = new THREE.PerspectiveCamera(45, window.screen.availWidth / window.screen.availHeight, 1, " + ToString( m_dZFar) + " * 75);") ; + m_Writer.OutText( " camera = new THREE.PerspectiveCamera(45, window.screen.availWidth / window.screen.availHeight, 1, 26000 * 75);") ; + m_Writer.OutText( " camera.aspect = aspect;") ; + m_Writer.OutText( " if ( ( BoxSceneCenter.max.y - BoxSceneCenter.min.y ) >= ( BoxSceneCenter.max.z - BoxSceneCenter.min.z ) ) {") ; + m_Writer.OutText( " camera.position.x = orbitControls.target.x - ( BoxSceneCenter.max.x - BoxSceneCenter.min.x ) * 0.5 + ( BoxSceneCenter.max.y - BoxSceneCenter.min.y ) * ( -7/4 );") ; + m_Writer.OutText( " }") ; + m_Writer.OutText( " else {") ; + m_Writer.OutText( " camera.position.x = orbitControls.target.x - ( BoxSceneCenter.max.x - BoxSceneCenter.min.x ) * 0.5 + ( BoxSceneCenter.max.z - BoxSceneCenter.min.z ) * ( -7/4 );") ; + m_Writer.OutText( " }") ; + m_Writer.OutText( " camera.position.y = ( BoxSceneCenter.min.y + BoxSceneCenter.max.y ) * 0.5;") ; + m_Writer.OutText( " camera.position.z = ( BoxSceneCenter.min.z + BoxSceneCenter.max.z ) * 0.5;") ; + m_Writer.OutText( " camera.lookAt(new THREE.Vector3(") ; + m_Writer.OutText( " ( BoxSceneCenter.min.x + BoxSceneCenter.max.x ) * 0.5,") ; + m_Writer.OutText( " ( BoxSceneCenter.min.y + BoxSceneCenter.max.y ) * 0.5,") ; + m_Writer.OutText( " ( BoxSceneCenter.min.z + BoxSceneCenter.max.z ) * 0.5") ; + m_Writer.OutText( " ));") ; m_Writer.OutText( " }") ; - 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( " camera.updateProjectionMatrix();") ; m_Writer.OutText( " orbitControls = new OrbitControls(camera, renderer.domElement);") ; m_Writer.OutText( " orbitControls.autoRotate = controls.motion;") ; - m_Writer.OutText( " orbitControls.target = new THREE.Vector3(" + ToString( m_ptCenter.y) + ", " + ToString( m_ptCenter.z) + ", " + ToString( m_ptCenter.x) + ");") ; - m_Writer.OutText( " if(CameraView == 1){ orbitControls.target = new THREE.Vector3(0,0,0); camera.position.y = Math.abs(camera.position.y);}") ; + m_Writer.OutText( " if ( CameraView == 0 ) { ") ; + m_Writer.OutText( " orbitControls.target = new THREE.Vector3(" + ToString( m_ptCenter.y) + ", " + ToString( m_ptCenter.z) + ", " + ToString( m_ptCenter.x) + ");") ; + m_Writer.OutText( " } else {") ; + m_Writer.OutText( " orbitControls.target = new THREE.Vector3(") ; + m_Writer.OutText( " ( BoxSceneCenter.min.x + BoxSceneCenter.max.x ) * 0.5,") ; + m_Writer.OutText( " ( BoxSceneCenter.min.y + BoxSceneCenter.max.y ) * 0.5,") ; + m_Writer.OutText( " ( BoxSceneCenter.min.z + BoxSceneCenter.max.z ) * 0.5") ; + m_Writer.OutText( " );") ; + m_Writer.OutText( " }") ; m_Writer.OutText( " if (boxCreated) {") ; m_Writer.OutText( " box = new THREE.BoxHelper(controls.element, 0xff0000);") ; m_Writer.OutText( " camera.position.y = Math.abs(" + ToString( m_ptMin.y + ( m_dimZ * 1.15)) + ");") ; //115% in valore assoluto @@ -848,17 +874,21 @@ ExportThreeJS::FinishAmbient( void) m_Writer.OutText( " var Ctarget = null;") ; m_Writer.OutText( " var anim1 = 0;") ; m_Writer.OutText( " var distanceC = 0;") ; - m_Writer.OutText( " viewCube.addEventListener('angle-change', ({ quaternion, t }) => {") ; - m_Writer.OutText( " getVersor(viewCube._name_click);") ; - m_Writer.OutText( " if (viewCube._blockRot) {") ; - m_Writer.OutText( " if (anim1 == 0) {") ; - m_Writer.OutText( " distanceC = camera.position.distanceTo(new THREE.Vector3(0, 0, 0));") ; - m_Writer.OutText( " orbitControls.target = new THREE.Vector3(0, 0, 0);") ; - m_Writer.OutText( " }") ; - m_Writer.OutText( " anim1++;") ; - m_Writer.OutText( " camera.position.lerp(Cvers.multiplyScalar(distanceC), t);") ; - m_Writer.OutText( " orbitControls.update();") ; - m_Writer.OutText( " }") ; + m_Writer.OutText( " viewCube.addEventListener('angle-change', ( { quaternion, t } ) => {") ; + m_Writer.OutText( " getVersor(viewCube._name_click);") ; + m_Writer.OutText( " if ( viewCube._blockRot ) { ") ; + m_Writer.OutText( " if ( anim1 == 0 ) {") ; + m_Writer.OutText( " distanceC = camera.position.distanceTo(new THREE.Vector3(orbitControls.target.x, orbitControls.target.y, orbitControls.target.z));") ; + m_Writer.OutText( " }") ; + m_Writer.OutText( " anim1++;") ; + m_Writer.OutText( " var VectorEnd = new THREE.Vector3(") ; + m_Writer.OutText( " orbitControls.target.x + Cvers.x * distanceC,") ; + m_Writer.OutText( " orbitControls.target.y + Cvers.y * distanceC,") ; + m_Writer.OutText( " orbitControls.target.z + Cvers.z * distanceC,") ; + m_Writer.OutText( " )") ; + m_Writer.OutText( " camera.position.lerp(VectorEnd, t);") ; + m_Writer.OutText( " orbitControls.update();") ; + m_Writer.OutText( " }") ; m_Writer.OutText( " });") ; // Setting parametri di rotazione @@ -1024,12 +1054,30 @@ ExportThreeJS::FinishAmbient( void) m_Writer.OutText( " });") ; m_Writer.OutText( " document.getElementById('BTORTHO').addEventListener('click', function(){") ; m_Writer.OutText( " CameraView = 0;") ; - m_Writer.OutText( " camera = new THREE.OrthographicCamera(" + ToString( -m_dHalfWidth) + ", " + ToString( m_dHalfWidth) + ", " + ToString( m_dHalfHeight) + ", " + ToString( -m_dHalfHeight) + "," + ToString( m_dZNear) + ", " + ToString( m_dZFar) + ");") ; - 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( " camera.lookAt(new THREE.Vector3(" + ToString( m_ptCenter.y) + ", " + ToString( m_ptCenter.z) + ", " + ToString( m_ptCenter.x) + "));") ; + m_Writer.OutText( " aspect = window.innerWidth/window.innerHeight;") ; + m_Writer.OutText( " camera = new THREE.OrthographicCamera(" + ToString( -m_dHalfWidth) + " * aspect / 2, " + ToString( m_dHalfWidth) + " * aspect / 2, " + ToString( m_dHalfHeight) + ", " + ToString( -m_dHalfHeight) + "," + ToString( m_dZNear) + ", " + ToString( m_dZFar * 5) + ");") ; + m_Writer.OutText( " if (( BoxSceneCenter.max.y - BoxSceneCenter.min.y ) >= ( BoxSceneCenter.max.z - BoxSceneCenter.min.z ) ) {") ; + m_Writer.OutText( " camera.position.x = orbitControls.target.x - ( BoxSceneCenter.max.x - BoxSceneCenter.min.x ) * 0.5 + ( BoxSceneCenter.max.y - BoxSceneCenter.min.y ) * ( -7/4 );") ; + m_Writer.OutText( " }") ; + m_Writer.OutText( " else {") ; + m_Writer.OutText( " camera.position.x = orbitControls.target.x - ( BoxSceneCenter.max.x - BoxSceneCenter.min.x ) * 0.5 + ( BoxSceneCenter.max.z - BoxSceneCenter.min.z ) * ( -7/4 );") ; + m_Writer.OutText( " } ") ; + m_Writer.OutText( " camera.position.y = ( BoxSceneCenter.min.y + BoxSceneCenter.max.y ) * 0.5;") ; + m_Writer.OutText( " camera.position.z = ( BoxSceneCenter.min.z + BoxSceneCenter.max.z ) * 0.5;") ; + m_Writer.OutText( " camera.updateProjectionMatrix(); ") ; + m_Writer.OutText( " orbitControls.update(); ") ; + m_Writer.OutText( " camera.lookAt( new THREE.Vector3(") ; + m_Writer.OutText( " ( BoxSceneCenter.min.x + BoxSceneCenter.max.x ) * 0.5,") ; + m_Writer.OutText( " ( BoxSceneCenter.min.y + BoxSceneCenter.max.y ) * 0.5,") ; + m_Writer.OutText( " ( BoxSceneCenter.min.z + BoxSceneCenter.max.z ) * 0.5,") ; + m_Writer.OutText( " ));") ; m_Writer.OutText( " orbitControls = new OrbitControls(camera, renderer.domElement);") ; m_Writer.OutText( " orbitControls.autoRotate = controls.motion;") ; - m_Writer.OutText( " orbitControls.target = new THREE.Vector3(" + ToString( m_ptCenter.y) + ", " + ToString( m_ptCenter.z) + ", " + ToString( m_ptCenter.x) + ");") ; + m_Writer.OutText( " orbitControls.target = new THREE.Vector3(") ; + m_Writer.OutText( " ( BoxSceneCenter.min.x + BoxSceneCenter.max.x ) * 0.5,") ; + m_Writer.OutText( " ( BoxSceneCenter.min.y + BoxSceneCenter.max.y ) * 0.5,") ; + m_Writer.OutText( " ( BoxSceneCenter.min.z + BoxSceneCenter.max.z ) * 0.5") ; + m_Writer.OutText( " );") ; m_Writer.OutText( " const item = document.querySelector('.Contcube')") ; m_Writer.OutText( " while (item.firstChild) {") ; m_Writer.OutText( " item.removeChild(item.firstChild);") ; @@ -1042,53 +1090,80 @@ ExportThreeJS::FinishAmbient( void) m_Writer.OutText( " viewCube = new ViewCubeControls(cubeCamera, undefined, undefined, cubeRenderer.domElement, orbitControls);") ; m_Writer.OutText( " cubeScene.add(viewCube.getObject());") ; m_Writer.OutText( " Cposition = null; Ctarget = null; anim1 = 0; distanceC = 0;") ; - m_Writer.OutText( " viewCube.addEventListener('angle-change', ({ quaternion, t }) => {") ; - m_Writer.OutText( " getVersor(viewCube._name_click);") ; - m_Writer.OutText( " if (viewCube._blockRot) {") ; - m_Writer.OutText( " if (anim1 == 0) {") ; - m_Writer.OutText( " distanceC = camera.position.distanceTo(new THREE.Vector3(0, 0, 0)); //d0") ; - m_Writer.OutText( " orbitControls.target = new THREE.Vector3(0, 0, 0);") ; - m_Writer.OutText( " }") ; - m_Writer.OutText( " anim1++;") ; - m_Writer.OutText( " camera.position.lerp(Cvers.multiplyScalar(distanceC), t);") ; - m_Writer.OutText( " orbitControls.update();") ; - m_Writer.OutText( " }") ; + m_Writer.OutText( " viewCube.addEventListener('angle-change', ( { quaternion, t } ) => {") ; + m_Writer.OutText( " getVersor(viewCube._name_click);") ; + m_Writer.OutText( " if ( viewCube._blockRot ) {") ; + m_Writer.OutText( " if ( anim1 == 0 ) {") ; + m_Writer.OutText( " distanceC = camera.position.distanceTo(new THREE.Vector3(orbitControls.target.x, orbitControls.target.y, orbitControls.target.z));") ; + m_Writer.OutText( " }") ; + m_Writer.OutText( " anim1++;") ; + m_Writer.OutText( " var VectorEnd = new THREE.Vector3(") ; + m_Writer.OutText( " orbitControls.target.x + Cvers.x * distanceC,") ; + m_Writer.OutText( " orbitControls.target.y + Cvers.y * distanceC,") ; + m_Writer.OutText( " orbitControls.target.z + Cvers.z * distanceC,") ; + m_Writer.OutText( " )") ; + m_Writer.OutText( " camera.position.lerp(VectorEnd, t);") ; + m_Writer.OutText( " orbitControls.update();") ; + m_Writer.OutText( " }") ; m_Writer.OutText( " });") ; m_Writer.OutText( " ColoraCubo(viewCube);") ; m_Writer.OutText( " });") ; m_Writer.OutText( " document.getElementById('BTPERS').addEventListener('click', function(){") ; - m_Writer.OutText( " CameraView = 1;") ; - m_Writer.OutText( " camera = new THREE.PerspectiveCamera(45, window.screen.availWidth / window.screen.availHeight, 1, " + ToString( m_dZFar) + " * 75);") ; - 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( " camera.lookAt(new THREE.Vector3(" + ToString( m_ptCenter.y) + ", " + ToString( m_ptCenter.z) + ", " + ToString( m_ptCenter.x) + "));") ; - m_Writer.OutText( " orbitControls = new OrbitControls(camera, renderer.domElement);") ; - m_Writer.OutText( " orbitControls.autoRotate = controls.motion;") ; - m_Writer.OutText( " orbitControls.target = new THREE.Vector3(0,0,0); camera.position.y = Math.abs(camera.position.y);") ; - m_Writer.OutText( " const item = document.querySelector('.Contcube')") ; - m_Writer.OutText( " while (item.firstChild) {") ; - m_Writer.OutText( " item.removeChild(item.firstChild);") ; - m_Writer.OutText( " }") ; - m_Writer.OutText( " document.querySelector('.Contcube').appendChild(cubeRenderer.domElement);") ; - m_Writer.OutText( " cubeScene = new THREE.Scene();") ; - m_Writer.OutText( " cubeCamera = new THREE.PerspectiveCamera(50, 1, 0.1, 1000);") ; - m_Writer.OutText( " cubeCamera.position.set(0, 0, 70);") ; - m_Writer.OutText( " cubeCamera.lookAt(0, 0, 0);") ; - m_Writer.OutText( " viewCube = new ViewCubeControls(cubeCamera, undefined, undefined, cubeRenderer.domElement, orbitControls);") ; - m_Writer.OutText( " cubeScene.add(viewCube.getObject());") ; - m_Writer.OutText( " Cposition = null; Ctarget = null; anim1 = 0; distanceC = 0;") ; - m_Writer.OutText( " viewCube.addEventListener('angle-change', ({ quaternion, t }) => {") ; - m_Writer.OutText( " getVersor(viewCube._name_click);") ; - m_Writer.OutText( " if (viewCube._blockRot) {") ; - m_Writer.OutText( " if (anim1 == 0) {") ; - m_Writer.OutText( " distanceC = camera.position.distanceTo(new THREE.Vector3(0, 0, 0));") ; - m_Writer.OutText( " orbitControls.target = new THREE.Vector3(0, 0, 0);") ; - m_Writer.OutText( " }") ; - m_Writer.OutText( " anim1++;") ; - m_Writer.OutText( " camera.position.lerp(Cvers.multiplyScalar(distanceC), t);") ; - m_Writer.OutText( " orbitControls.update();") ; - m_Writer.OutText( " }") ; - m_Writer.OutText( " });") ; - m_Writer.OutText( " ColoraCubo(viewCube);") ; + m_Writer.OutText( " CameraView = 1;") ; + m_Writer.OutText( " aspect = window.innerWidth/window.innerHeight;") ; + m_Writer.OutText( " camera = new THREE.PerspectiveCamera(45, window.screen.availWidth / window.screen.availHeight, 1, 26000 * 75);") ; + m_Writer.OutText( " camera.aspect = aspect;") ; + m_Writer.OutText( " if ( ( BoxSceneCenter.max.y - BoxSceneCenter.min.y ) >= ( BoxSceneCenter.max.z - BoxSceneCenter.min.z ) ) {") ; + m_Writer.OutText( " camera.position.x = orbitControls.target.x - ( BoxSceneCenter.max.x - BoxSceneCenter.min.x ) * 0.5 + ( BoxSceneCenter.max.y - BoxSceneCenter.min.y ) * ( -7/4 );") ; + m_Writer.OutText( " }") ; + m_Writer.OutText( " else {") ; + m_Writer.OutText( " camera.position.x = orbitControls.target.x - ( BoxSceneCenter.max.x - BoxSceneCenter.min.x ) * 0.5 + ( BoxSceneCenter.max.z - BoxSceneCenter.min.z ) * ( -7/4 );") ; + m_Writer.OutText( " }") ; + m_Writer.OutText( " camera.position.y = ( BoxSceneCenter.min.y + BoxSceneCenter.max.y ) * 0.5;") ; + m_Writer.OutText( " camera.position.z = ( BoxSceneCenter.min.z + BoxSceneCenter.max.z ) * 0.5;") ; + m_Writer.OutText( " camera.updateProjectionMatrix();") ; + m_Writer.OutText( " orbitControls.update();") ; + m_Writer.OutText( " camera.lookAt(new THREE.Vector3(") ; + m_Writer.OutText( " ( BoxSceneCenter.min.x + BoxSceneCenter.max.x ) * 0.5,") ; + m_Writer.OutText( " ( BoxSceneCenter.min.y + BoxSceneCenter.max.y ) * 0.5,") ; + m_Writer.OutText( " ( BoxSceneCenter.min.z + BoxSceneCenter.max.z ) * 0.5") ; + m_Writer.OutText( " ));") ; + m_Writer.OutText( " orbitControls = new OrbitControls(camera, renderer.domElement);") ; + m_Writer.OutText( " orbitControls.autoRotate = controls.motion;") ; + m_Writer.OutText( " orbitControls.target = new THREE.Vector3(") ; + m_Writer.OutText( " ( BoxSceneCenter.min.x + BoxSceneCenter.max.x ) * 0.5,") ; + m_Writer.OutText( " ( BoxSceneCenter.min.y + BoxSceneCenter.max.y ) * 0.5,") ; + m_Writer.OutText( " ( BoxSceneCenter.min.z + BoxSceneCenter.max.z ) * 0.5") ; + m_Writer.OutText( " );") ; + m_Writer.OutText( " const item = document.querySelector('.Contcube')") ; + m_Writer.OutText( " while ( item.firstChild ) {") ; + m_Writer.OutText( " item.removeChild(item.firstChild);") ; + m_Writer.OutText( " }") ; + m_Writer.OutText( " document.querySelector('.Contcube').appendChild(cubeRenderer.domElement);") ; + m_Writer.OutText( " cubeScene = new THREE.Scene();") ; + m_Writer.OutText( " cubeCamera = new THREE.PerspectiveCamera(50, 1, 0.1, 1000);") ; + m_Writer.OutText( " cubeCamera.position.set(0, 0, 70);") ; + m_Writer.OutText( " cubeCamera.lookAt(0, 0, 0);") ; + m_Writer.OutText( " viewCube = new ViewCubeControls(cubeCamera, undefined, undefined, cubeRenderer.domElement, orbitControls);") ; + m_Writer.OutText( " cubeScene.add(viewCube.getObject());") ; + m_Writer.OutText( " Cposition = null; Ctarget = null; anim1 = 0; distanceC = 0;") ; + m_Writer.OutText( " viewCube.addEventListener('angle-change', ( { quaternion, t } ) => {") ; + m_Writer.OutText( " getVersor(viewCube._name_click);") ; + m_Writer.OutText( " if ( viewCube._blockRot ) {") ; + m_Writer.OutText( " if ( anim1 == 0 ) {") ; + m_Writer.OutText( " distanceC = camera.position.distanceTo(new THREE.Vector3(orbitControls.target.x, orbitControls.target.y, orbitControls.target.z));") ; + m_Writer.OutText( " }") ; + m_Writer.OutText( " anim1++;") ; + m_Writer.OutText( " var VectorEnd = new THREE.Vector3(") ; + m_Writer.OutText( " orbitControls.target.x + Cvers.x * distanceC,") ; + m_Writer.OutText( " orbitControls.target.y + Cvers.y * distanceC,") ; + m_Writer.OutText( " orbitControls.target.z + Cvers.z * distanceC,") ; + m_Writer.OutText( " )") ; + m_Writer.OutText( " camera.position.lerp(VectorEnd, t);") ; + m_Writer.OutText( " orbitControls.update();") ; + m_Writer.OutText( " }") ; + m_Writer.OutText( " });") ; + m_Writer.OutText( " ColoraCubo(viewCube);") ; m_Writer.OutText( " });") ; // eventi click sul menu di destra dei controlli @@ -1109,20 +1184,27 @@ ExportThreeJS::FinishAmbient( void) m_Writer.OutText( " controls.motion = true;") ; m_Writer.OutText( " }") ; m_Writer.OutText( " });") ; - m_Writer.OutText( " document.getElementById('BTORIG').addEventListener('click', function() {orbitControls.target = new THREE.Vector3(0, 0, 0); })") ; - m_Writer.OutText( " document.getElementById('BTBOX').addEventListener('click', function() {") ; - m_Writer.OutText( " if (controls.bBox) {") ; - m_Writer.OutText( " controls.bBox = false;") ; - m_Writer.OutText( " }") ; - m_Writer.OutText( " else {") ; - m_Writer.OutText( " controls.bBox = true;") ; - m_Writer.OutText( " }") ; + m_Writer.OutText( " document.getElementById('BTORIG').addEventListener('click', function() {") ; + m_Writer.OutText( " BoxSceneCenter.getCenter(orbitControls.target);") ; + m_Writer.OutText( " camera.position.x = orbitControls.target.x + camera.position.distanceTo(orbitControls.target) * ( -1 ),") ; + m_Writer.OutText( " camera.position.y = orbitControls.target.y,") ; + m_Writer.OutText( " camera.position.z = orbitControls.target.z") ; + m_Writer.OutText( " camera.updateProjectionMatrix();") ; + m_Writer.OutText( " orbitControls.update();") ; m_Writer.OutText( " })") ; - m_Writer.OutText( " document.getElementById('BTSEL').addEventListener('click', function() {") ; - m_Writer.OutText( " GLOB_SEL = true;") ; - m_Writer.OutText( " SelType = 0;") ; - m_Writer.OutText( " GLOB_DIST = false;") ; - m_Writer.OutText( " CancelMarkers();") ; + m_Writer.OutText( " document.getElementById('BTBOX').addEventListener('click', function() {") ; + m_Writer.OutText( " if (controls.bBox) {") ; + m_Writer.OutText( " controls.bBox = false;") ; + m_Writer.OutText( " }") ; + m_Writer.OutText( " else {") ; + m_Writer.OutText( " controls.bBox = true;") ; + m_Writer.OutText( " }") ; + m_Writer.OutText( " })") ; + m_Writer.OutText( " document.getElementById('BTSEL').addEventListener('click', function() {") ; + m_Writer.OutText( " GLOB_SEL = true;") ; + m_Writer.OutText( " SelType = 0;") ; + m_Writer.OutText( " GLOB_DIST = false;") ; + m_Writer.OutText( " CancelMarkers();") ; m_Writer.OutText( " });") ; m_Writer.OutText( " document.getElementById('BTSHOW').addEventListener('click', function() {") ; m_Writer.OutText( " GLOB_SEL = true;") ; @@ -1165,6 +1247,16 @@ ExportThreeJS::FinishAmbient( void) // funzione render per la scena m_Writer.OutText( " function renderScene() {") ; + m_Writer.OutText( " if ( CameraView == 1 ) { // se prospettica ") ; + m_Writer.OutText( " camera.aspect = window.innerWidth / window.innerHeight;") ; + m_Writer.OutText( " camera.updateProjectionMatrix();") ; + m_Writer.OutText( " }") ; + m_Writer.OutText( " else { // se ortografica") ; + m_Writer.OutText( " aspect = window.innerWidth / window.innerHeight;") ; + m_Writer.OutText( " camera.left = -3342.576634 * aspect / 2;") ; + m_Writer.OutText( " camera.right = 3342.576634 * aspect / 2;") ; + m_Writer.OutText( " camera.updateProjectionMatrix();") ; + m_Writer.OutText( " }") ; m_Writer.OutText( " if (viewCube._blockRot == false) {") ; m_Writer.OutText( " if (ComeFromRot) {") ; m_Writer.OutText( " ComeFromRot = false;") ; @@ -1204,7 +1296,6 @@ ExportThreeJS::FinishAmbient( void) m_Writer.OutText( " }") ; m_Writer.OutText( " camera.updateProjectionMatrix();") ; m_Writer.OutText( " requestAnimationFrame(renderScene);") ; - m_Writer.OutText( " renderer.setSize(window.screen.availWidth, window.screen.availHeight);") ; m_Writer.OutText( " renderer.render(scene, camera);") ; m_Writer.OutText( " GLOB_BOX = controls.bBox;") ; m_Writer.OutText( " if (controls.motion) {") ; @@ -1213,8 +1304,10 @@ ExportThreeJS::FinishAmbient( void) m_Writer.OutText( " else {") ; m_Writer.OutText( " document.getElementById('BTROTATE').style.color = '#d9534f';") ; m_Writer.OutText( " }") ; - m_Writer.OutText( " if (orbitControls.target.x == 0 && orbitControls.target.x == 0 && orbitControls.target.x == 0) {") ; - m_Writer.OutText( " document.getElementById('BTORIG').style.color = '#5cb85c';") ; + m_Writer.OutText( " if (( BoxSceneCenter.min.x + BoxSceneCenter.max.x ) * 0.5 == orbitControls.target.x && ") ; + m_Writer.OutText( " (BoxSceneCenter.min.y + BoxSceneCenter.max.y ) * 0.5 == orbitControls.target.y && ") ; + m_Writer.OutText( " (BoxSceneCenter.min.z + BoxSceneCenter.max.z ) * 0.5 == orbitControls.target.z ) { ") ; + m_Writer.OutText( " document.getElementById('BTORIG').style.color = '#5cb85c';") ; m_Writer.OutText( " }") ; m_Writer.OutText( " else {") ; m_Writer.OutText( " document.getElementById('BTORIG').style.color = '#d9534f';") ; @@ -2018,7 +2111,18 @@ ExportThreeJS::FinishAmbient( void) // funzione resize della pagina m_Writer.OutText( " function onResize() {") ; - m_Writer.OutText( " renderer.setSize(window.screen.availWidth, window.screen.availHeight);") ; + m_Writer.OutText( " if ( CameraView == 1 ) { // se prospettica") ; + m_Writer.OutText( " camera.aspect = window.innerWidth / window.innerHeight;") ; + m_Writer.OutText( " camera.updateProjectionMatrix();") ; + m_Writer.OutText( " renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));") ; + m_Writer.OutText( " }") ; + m_Writer.OutText( " else { // se ortografica") ; + m_Writer.OutText( " aspect = window.innerWidth / window.innerHeight;") ; + m_Writer.OutText( " camera.left = -3342.576634 * aspect / 2;") ; + m_Writer.OutText( " camera.right = 3342.576634 * aspect / 2;") ; + m_Writer.OutText( " camera.updateProjectionMatrix();") ; + m_Writer.OutText( " renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));") ; + m_Writer.OutText( " }") ; m_Writer.OutText( " }") ; // richiamo della funzione init() e dichiarazione degli eventi in javascript per controllo della scena @@ -2084,7 +2188,8 @@ ExportThreeJS::FinishAmbient( void) m_Writer.OutText( " document.getElementById('CScena').style.cursor = 'pointer';") ; m_Writer.OutText( " }") ; m_Writer.OutText( " if (e.key == 'o') {") ; - m_Writer.OutText( " orbitControls.target = new THREE.Vector3(0, 0, 0);") ; + m_Writer.OutText( " BoxSceneCenter.getCenter( orbitControls.target );") ; + m_Writer.OutText( " orbitControls.update();") ; m_Writer.OutText( " }") ; m_Writer.OutText( " }") ; m_Writer.OutText( " if (e.key == 'Enter') {") ; @@ -2800,9 +2905,12 @@ 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 ; + const ISurfTriMesh* pSTMtc = GetSurfTriMesh( pGeoObj) ; + if ( pSTMtc == nullptr) + return false ; + + PtrOwner pSTM( pSTMtc->Clone()) ; + pSTM->DoCompacting() ; // aumento il contatore generale per evitare nomi uguali su javascript m_nCont ++ ; @@ -2875,13 +2983,13 @@ ExportThreeJS::ExportSTM( const string& sName, const IGeoObj* pGeoObj, const Fra 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) + "),", false) ; + m_Writer.OutText(" new THREE.Vector3(" + ToString( ptCurrent.x, 15) + ", " + ToString( ptCurrent.y, 15) + ", " + ToString( ptCurrent.z, 15) + "),", false) ; } m_Writer.OutText( " ];", false) ; // 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++) { @@ -2897,14 +3005,14 @@ ExportThreeJS::ExportSTM( const string& sName, const IGeoObj* pGeoObj, const Fra m_Writer.OutText( " geom" + ToString( m_nCont) + ".faces = faces" + ToString( m_nCont) + ";") ; m_Writer.OutText( " try{") ; m_Writer.OutText( " geom" + ToString( m_nCont) + ".computeFaceNormals();") ; // per rendering effetto ombre e luce - m_Writer.OutText( " } catch(err){ console.log(err);};") ; + m_Writer.OutText( " } catch(err){ console.log('computeFaceNormals error in " + ToString( m_nCont) + "'); console.log(err); console.log('---')}") ; // 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( " front_surf_mesh" + ToString( m_nCont) + ".castShadow = true;") ; // aggiungo la superficie al suo gruppo di appartenenza if ( nGroupCount != -1) @@ -2912,7 +3020,7 @@ ExportThreeJS::ExportSTM( const string& sName, const IGeoObj* pGeoObj, const Fra // 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( " back_surf_mesh" + ToString( m_nCont) + ".castShadow = true;") ; // aggiungo la superficie al suo gruppo di appartenenza if( nGroupCount != -1) @@ -2923,7 +3031,7 @@ ExportThreeJS::ExportSTM( const string& sName, const IGeoObj* pGeoObj, const Fra 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( " 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