packages feed

Hydrogen (empty) → 0.1.0.0

raw patch · 18 files changed

+2844/−0 lines, 18 filesdep +HFitUIdep +Hydrogendep +MissingHsetup-changed

Dependencies added: HFitUI, Hydrogen, MissingH, aeson, base, binary, directory, shakespeare, yaml

Files

+ Hydrogen.cabal view
@@ -0,0 +1,72 @@+name:                Hydrogen+version:             0.1.0.0+synopsis:            The library for generating a WebGL scene for the web+description:         The library for generating a WebGL scene for the web for the Haskell programming language.+homepage:            https://github.com/iqsf/Hydrogen.git+license:             BSD3+license-file:        LICENSE+author:              Pavel+maintainer:          iqsf@ya.ru+copyright:           2017 Author name here+category:            Web+build-type:          Simple+extra-source-files:  README.md+cabal-version:       >=1.10++data-files: models/test/MyTest.scene ++library+  hs-source-dirs:      src+  exposed-modules:     Hydrogen.Hydrogen+                     , Hydrogen.HydroCore+                     , Hydrogen.Model.MScene+                     , Hydrogen.Model.MSceneGeneral+                     , Hydrogen.Model.MScene2D+                     , Hydrogen.Model.MScene3D+                     , Hydrogen.Tool.TScene3D+                     , Hydrogen.Tool.TBuilder3D+                     , Hydrogen.Tool.TGeneratorS3D+                     , Hydrogen.Demo.LibDemo ++                     , ThreeJS.HThreeJS++  default-extensions:  DeriveDataTypeable+                       DeriveGeneric+                       MultiParamTypeClasses+                       FlexibleInstances+                       TemplateHaskell+                       QuasiQuotes+                       FlexibleContexts+                       GeneralizedNewtypeDeriving++  build-depends:       base >= 4.7 && < 5+                     , binary                    >= 0.8.3+                     , aeson                     >= 0.11.2+                     , directory                 >= 1.2.6+                     , MissingH                  >= 1.4.0+                     , shakespeare               >= 2.0.11+                     , yaml                      >= 0.8.21+                     , HFitUI++  default-language:    Haskell2010++executable Hydrogen-exe+  hs-source-dirs:      app+  main-is:             Main.hs+  ghc-options:         -threaded -rtsopts -with-rtsopts=-N+  build-depends:       base+                     , Hydrogen+  default-language:    Haskell2010++test-suite Hydrogen-test+  type:                exitcode-stdio-1.0+  hs-source-dirs:      test+  main-is:             Spec.hs+  build-depends:       base+                     , Hydrogen+  ghc-options:         -threaded -rtsopts -with-rtsopts=-N+  default-language:    Haskell2010++source-repository head+  type:     git+  location: https://github.com/iqsf/Hydrogen
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright Author name here (c) 2017++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++    * Redistributions of source code must retain the above copyright+      notice, this list of conditions and the following disclaimer.++    * Redistributions in binary form must reproduce the above+      copyright notice, this list of conditions and the following+      disclaimer in the documentation and/or other materials provided+      with the distribution.++    * Neither the name of Author name here nor the names of other+      contributors may be used to endorse or promote products derived+      from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ README.md view
@@ -0,0 +1,230 @@+# Hydrogen++## Introduction+Library for generating a WebGL scene by using [ThreeJS](https://threejs.org) on the web for the Haskell programming language.++## Short description+The **Hydrogen** uses the [HFitUI](http://hackage.haskell.org/package/HFitUI) library as the result of generating a WebGL scene. The WebGL scene is generated from a YAML file. This approach greatly simplifies the process of generating a WebGL scene in a Haskell with [HFitUI](http://hackage.haskell.org/package/HFitUI) library.+Below is an example generation scene from [YAML file](https://github.com/iqsf/Hydrogen/blob/master/models/test/MyTest.scene) code:+++```+/*Generate by HScript from the HFitUI library*/+//Автоматически сгенерированный скрипт+//Приложение Hydrogen (0.0.1)+if(!Detector.webgl) Detector.addGetWebGLMessage();+ +var camera;+var scene;+var groupRoot;+var root = document.getElementById("idRoot");+var canvas3D = document.getElementById("idCanvas");+var renderer;+var stats;+var orbitControls = null;+var flyControls = null;+ +function render (){+  renderer.render(scene, camera); +}+ +function update (){+  if(stats) stats.update(); +  if(flyControls) flyControls.update(1); +}+ +function animate (){+  requestAnimationFrame(animate); +  render();+  update();+}+ +function onWindowResize (){+  if (camera) {+      camera.aspect = window.innerWidth / (window.innerHeight);+      camera.updateProjectionMatrix();+  }+  renderer.setSize( window.innerWidth, window.innerHeight);+  render();+}+ +function drawRootAxes (){+  var dirX = new THREE.Vector3( 1, 0, 0 ); dirX.normalize();+  var dirY = new THREE.Vector3( 0, 1, 0 ); dirY.normalize();+  var dirZ = new THREE.Vector3( 0, 0, 1 ); dirZ.normalize();+  var origin = new THREE.Vector3( 0, 0, 0 );+  var length = 1;+  var hexX = 0xff0000;+  var hexY = 0x00ff00;+  var hexZ = 0x0000ff;+  scene.add(new THREE.ArrowHelper(dirX, origin, length, hexX));+  scene.add(new THREE.ArrowHelper(dirY, origin, length, hexY));+  scene.add(new THREE.ArrowHelper(dirZ, origin, length, hexZ));+}+ +function init (){+  scene = new THREE.Scene();+  groupRoot = new THREE.Group();+  groupRoot.position.set( 0.0 , 0.0 , 0.0 );+  groupRoot.rotation.set( 0.0 , 0.0 , 0.0 );+  groupRoot.scale.set( 1.0 , 1.0 , 1.0 );+  scene.add(groupRoot);+  var grid = new THREE.GridHelper( 25, 50, 0x586e75, 0x073642 );+  grid.rotateOnAxis( new THREE.Vector3( 1, 0, 0 ), 90 * ( Math.PI/180 ) );+  groupRoot.add(grid);+  drawRootAxes();+  renderer = new THREE.WebGLRenderer({canvas: canvas3D, antialias: false});+  renderer.setClearColor( 0x002b36 );+  renderer.setPixelRatio( window.devicePixelRatio );+  renderer.setSize( window.innerWidth, window.innerHeight );+  renderer.sortObjects = false;+  var material4466976ede5111e6a5d3f3eee64202b6 = new THREE.MeshLambertMaterial( { color: 0x6e6e6e, emissive: 0x6e6e6e, emissiveIntensity: 0.5, opacity: 1.0, transparent: false } ); +  (function(material){  })( material4466976ede5111e6a5d3f3eee64202b6 ); +  var materiale6f1bd16e2fb11e687c71772a2fe4228 = new THREE.MeshLambertMaterial( { color: 0xa41a, emissive: 0x6e06e, emissiveIntensity: 0.0, opacity: 1.0, transparent: false } ); +  (function(material){  })( materiale6f1bd16e2fb11e687c71772a2fe4228 ); +  var material4e181b50e3bc11e6924d8bbeaf59f608 = new THREE.MeshBasicMaterial( { map: new THREE.TextureLoader().load("/texture_3d/3165d44e-e398-11e6-aac6-e7c59ca562a2") , opacity: 1.0, transparent: false } ); +  (function(material){  })( material4e181b50e3bc11e6924d8bbeaf59f608 ); +  var material7badc81ae6b611e69cc12b72c18ca176 = new THREE.MeshFaceMaterial([ new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture("/texture_3d/6b6fc102-e462-11e6-88eb-433f284ad9f1?nm=0"), side: THREE.BackSide } )+                                                                         , new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture("/texture_3d/6b6fc102-e462-11e6-88eb-433f284ad9f1?nm=1"), side: THREE.BackSide } )+                                                                         , new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture("/texture_3d/6b6fc102-e462-11e6-88eb-433f284ad9f1?nm=2"), side: THREE.BackSide } )+                                                                         , new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture("/texture_3d/6b6fc102-e462-11e6-88eb-433f284ad9f1?nm=3"), side: THREE.BackSide } )+                                                                         , new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture("/texture_3d/6b6fc102-e462-11e6-88eb-433f284ad9f1?nm=4"), side: THREE.BackSide } )+                                                                         , new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture("/texture_3d/6b6fc102-e462-11e6-88eb-433f284ad9f1?nm=5"), side: THREE.BackSide } )+                                                                         ]); +         +  (function(material){  })( material7badc81ae6b611e69cc12b72c18ca176 ); +  camera = new THREE.PerspectiveCamera( 45.0, window.innerWidth / window.innerHeight, 1.0, 1000.0 );+  camera.up.set( 0.0, 0.0, 1.0);+  camera.position.set( 0.0 , -10.0 , 10.0 );+  scene.add(camera);+  var lighte436c6c8f1d511e6837cafadb174b93a = new THREE.PointLight( 0xFFFFFF , 0.8 , 0.0 , 1.0); +  lighte436c6c8f1d511e6837cafadb174b93a.position.set( 0.0 , 0.0 , 0.0 ); +  (function(light){  })( lighte436c6c8f1d511e6837cafadb174b93a ); +  camera.add(lighte436c6c8f1d511e6837cafadb174b93a); +  var light9ab6f73cf1d211e6ad6c23968912c3bd = new THREE.AmbientLight( 0x999999 , 1.0 ); +  (function(light){  })( light9ab6f73cf1d211e6ad6c23968912c3bd ); +  scene.add(light9ab6f73cf1d211e6ad6c23968912c3bd); +  var figure5d2f5584e6b611e6b1e007ba4b916aa0 = new THREE.Mesh( new THREE.BoxGeometry( 500.0 , 500.0 , 500.0 ) , material7badc81ae6b611e69cc12b72c18ca176 ); +  figure5d2f5584e6b611e6b1e007ba4b916aa0.position.set( 0.0 , 0.0 , 0.0 ); +  figure5d2f5584e6b611e6b1e007ba4b916aa0.rotation.set( 1.570796 , 0.0 , 0.0 ); +  figure5d2f5584e6b611e6b1e007ba4b916aa0.scale.set( 1.0 , 1.0 , 1.0 ); +  (function(figure, material){  })( figure5d2f5584e6b611e6b1e007ba4b916aa0 , material7badc81ae6b611e69cc12b72c18ca176 ); +  scene.add(figure5d2f5584e6b611e6b1e007ba4b916aa0); +  var group20c55aece15e11e69b09a74605bb9055 = new THREE.Group(); +  group20c55aece15e11e69b09a74605bb9055.position.set( 0.0 , 0.0 , 0.0 ); +  group20c55aece15e11e69b09a74605bb9055.rotation.set( 0.0 , 0.0 , 0.0 ); +  group20c55aece15e11e69b09a74605bb9055.scale.set( 1.0 , 1.0 , 1.0 ); +  (function(figure){  })( group20c55aece15e11e69b09a74605bb9055 );  +  groupRoot.add(group20c55aece15e11e69b09a74605bb9055); +  var params1743e5eaf2a911e69ed17714401e4924 = ["Test","1.0"]; +   var figure1743e5eaf2a911e69ed17714401e4924 = (function(material, params){ var geometry = new THREE.SphereGeometry( 1, 32, 32 );+  var sphere = new THREE.Mesh( geometry, material );   +  return sphere;+   })( material4466976ede5111e6a5d3f3eee64202b6, params1743e5eaf2a911e69ed17714401e4924 ); +  figure1743e5eaf2a911e69ed17714401e4924.position.set( 0.0 , 4.0 , 0.0 ); +  figure1743e5eaf2a911e69ed17714401e4924.rotation.set( 0.0 , 0.0 , 0.0 ); +  figure1743e5eaf2a911e69ed17714401e4924.scale.set( 1.0 , 1.0 , 1.0 ); +  (function(figure, material){  })( figure1743e5eaf2a911e69ed17714401e4924 , material4466976ede5111e6a5d3f3eee64202b6 ); +  group20c55aece15e11e69b09a74605bb9055.add(figure1743e5eaf2a911e69ed17714401e4924); +  var entityCamera45d7b56aedf111e6be1d539a6d03a9c1 = (function(){ +  var video = document.createElement( 'video' );+  video.id = 'VID_45d7b56a-edf1-11e6-be1d-539a6d03a9c1';+  video.src = "/video/sintel.ogv";+  video.loop = true;+  video.muted = true;+  video.load();+  video.play();+  var videoTexture = new THREE.VideoTexture( video );+  videoTexture.minFilter = THREE.LinearFilter;+  videoTexture.magFilter = THREE.LinearFilter;+  videoTexture.format = THREE.RGBFormat;+  var movieMaterial = new THREE.MeshBasicMaterial( { map: videoTexture, overdraw: true, side:THREE.FrontSide } ); +  movieMaterial.side = THREE.BackSide;   +  var entityGroup = new THREE.Group(); +  entityGroup.position.set( 0.0 , 0.0 , 0.0 ); +  entityGroup.rotation.set( 0.0 , 1.57 , 0.0 ); +  entityGroup.scale.set( 1.0 , 1.0 , 1.0 ); +  var meshCamera = new THREE.Mesh( new THREE.ConeGeometry(1*0.5, 1, 4), new THREE.MeshBasicMaterial({color: 0xFF0000, wireframe: true}) );+  meshCamera.rotation.x = -Math.PI/2;+  meshCamera.scale.x = meshCamera.scale.y = meshCamera.scale.z = 0.35;+  entityGroup.add(meshCamera);+  var area_0 = [ new THREE.Vector2( 0.0 , 1.0 )+                                 , new THREE.Vector2( 0.5 , 1.0 )+                                 , new THREE.Vector2( 0.5 , 0.0 )+                                 , new THREE.Vector2( 0.0 , 0.0 )+                                 ];+  var movieGeometry_0 = new THREE.PlaneGeometry(2.5, 2.5);+  movieGeometry_0.faceVertexUvs[0][0] = [ area_0[0], area_0[3], area_0[1] ];+  movieGeometry_0.faceVertexUvs[0][1] = [ area_0[3], area_0[2], area_0[1] ];+  var movieScreen_0 = new THREE.Mesh( movieGeometry_0, movieMaterial );+  movieScreen_0.geometry.vertices[0].x = movieScreen_0.geometry.vertices[0].x + 0.0+  movieScreen_0.geometry.vertices[0].y = movieScreen_0.geometry.vertices[0].y + 0.0+  movieScreen_0.geometry.vertices[0].z = movieScreen_0.geometry.vertices[0].z + 0.0+  movieScreen_0.geometry.vertices[1].x = movieScreen_0.geometry.vertices[1].x + 0.0+  movieScreen_0.geometry.vertices[1].y = movieScreen_0.geometry.vertices[1].y + 0.0+  movieScreen_0.geometry.vertices[1].z = movieScreen_0.geometry.vertices[1].z + 0.0+  movieScreen_0.geometry.vertices[2].x = movieScreen_0.geometry.vertices[2].x + 0.0+  movieScreen_0.geometry.vertices[2].y = movieScreen_0.geometry.vertices[2].y + 0.0+  movieScreen_0.geometry.vertices[2].z = movieScreen_0.geometry.vertices[2].z + 0.0+  movieScreen_0.geometry.vertices[3].x = movieScreen_0.geometry.vertices[3].x + 0.0+  movieScreen_0.geometry.vertices[3].y = movieScreen_0.geometry.vertices[3].y + 0.0+  movieScreen_0.geometry.vertices[3].z = movieScreen_0.geometry.vertices[3].z + 0.0+  movieScreen_0.position.set( 0.0 , 0.0 , 3.0 ); +  movieScreen_0.rotation.set( 0.0 , 0.0 , 1.57 ); +  movieScreen_0.scale.set( 1.0 , 1.0 , 1.0 ); +  entityGroup.add(movieScreen_0);+  var area_1 = [ new THREE.Vector2( 0.5 , 1.0 )+                                 , new THREE.Vector2( 1.0 , 1.0 )+                                 , new THREE.Vector2( 1.0 , 0.0 )+                                 , new THREE.Vector2( 0.5 , 0.0 )+                                 ];+  var movieGeometry_1 = new THREE.PlaneGeometry(2.5, 2.5);+  movieGeometry_1.faceVertexUvs[0][0] = [ area_1[0], area_1[3], area_1[1] ];+  movieGeometry_1.faceVertexUvs[0][1] = [ area_1[3], area_1[2], area_1[1] ];+  var movieScreen_1 = new THREE.Mesh( movieGeometry_1, movieMaterial );+  movieScreen_1.geometry.vertices[0].x = movieScreen_1.geometry.vertices[0].x + 0.0+  movieScreen_1.geometry.vertices[0].y = movieScreen_1.geometry.vertices[0].y + 0.0+  movieScreen_1.geometry.vertices[0].z = movieScreen_1.geometry.vertices[0].z + 0.0+  movieScreen_1.geometry.vertices[1].x = movieScreen_1.geometry.vertices[1].x + 0.0+  movieScreen_1.geometry.vertices[1].y = movieScreen_1.geometry.vertices[1].y + 0.0+  movieScreen_1.geometry.vertices[1].z = movieScreen_1.geometry.vertices[1].z + 0.0+  movieScreen_1.geometry.vertices[2].x = movieScreen_1.geometry.vertices[2].x + 0.0+  movieScreen_1.geometry.vertices[2].y = movieScreen_1.geometry.vertices[2].y + 0.0+  movieScreen_1.geometry.vertices[2].z = movieScreen_1.geometry.vertices[2].z + 0.0+  movieScreen_1.geometry.vertices[3].x = movieScreen_1.geometry.vertices[3].x + 0.0+  movieScreen_1.geometry.vertices[3].y = movieScreen_1.geometry.vertices[3].y + 0.0+  movieScreen_1.geometry.vertices[3].z = movieScreen_1.geometry.vertices[3].z + 0.0+  movieScreen_1.position.set( 0.0 , 3.0 , 4.0 ); +  movieScreen_1.rotation.set( 0.0 , 0.0 , 1.57 ); +  movieScreen_1.scale.set( 1.0 , 1.0 , 1.0 ); +  entityGroup.add(movieScreen_1);+  group20c55aece15e11e69b09a74605bb9055.add(entityGroup); +  return entityGroup; +  })(); +  var groupc34cbde4e7b911e6a0a36bff2604ce8f = new THREE.Group(); +  groupc34cbde4e7b911e6a0a36bff2604ce8f.position.set( 0.0 , 0.0 , 0.0 ); +  groupc34cbde4e7b911e6a0a36bff2604ce8f.rotation.set( 0.0 , 0.0 , 0.0 ); +  groupc34cbde4e7b911e6a0a36bff2604ce8f.scale.set( 1.0 , 1.0 , 1.0 ); +  (function(figure){  })( groupc34cbde4e7b911e6a0a36bff2604ce8f );  +  groupRoot.add(groupc34cbde4e7b911e6a0a36bff2604ce8f); +  orbitControls = new THREE.OrbitControls(camera, renderer.domElement);+  orbitControls.addEventListener('change', render);+  orbitControls.target.set(0, 0, 0);+  orbitControls.update();+   (function(){ if(orbitControls){+      orbitControls.minDistance = 3;+      orbitControls.maxDistance = 20;+      orbitControls.minPolarAngle = 0; +      orbitControls.maxPolarAngle = 1.50098;+  }+   })();  +  window.addEventListener( 'resize',onWindowResize,false );+  animate();+}+init();++```++++
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ app/Main.hs view
@@ -0,0 +1,17 @@+--------------------------------------------------------------+-- Главный модуль программы (Main)+----------------------------------------------------------------++module Main where++-- Импорт модулей+import           Hydrogen.Hydrogen+import           Hydrogen.Demo.LibDemo ++++main :: IO ()+main = testDemo+++
+ models/test/MyTest.scene view
@@ -0,0 +1,274 @@+#################################################################+# Application                                                   #+# Powered by Haskell                                            #+# Scene 3D in YAML format                                       #+#################################################################++---+# Begin 3D scene+tag: Scene3D+s3d_name: Scene 3D (Default)+s3d_uuid: "d7d3e5d4-de50-11e6-80e3-cb4e0b910fb7"++s3d_version: 0.0.1++s3d_author: User++# The scene description+s3d_descr: >-+            This is description of testing 3D scene for demonstration +            working. This example will help you understand the format +            of the scene.++# Geographic information binding+s3d_geoPoint: { gp_lat: 55.774003, gp_lon: 37.592292}++s3d_tags:+    - Test+    - Demo+    - Debug+++# Patterns for fields+s3d_t1: &patternPos { v3d_posX: 0, v3d_posY: 0, v3d_posZ: 0 }+s3d_t2: &patternRot { v3d_rotX: 0, v3d_rotY: 0, v3d_rotZ: 0 }+s3d_t3: &patternScl { v3d_sclX: 1, v3d_sclY: 1, v3d_sclZ: 1 }++s3d_t4: &patternV2D { v3d_x: 0, v3d_y: 0 }+s3d_t5: &patternV3D { v3d_x: 0, v3d_y: 0, v3d_z: 0 }++s3d_m1: &patternM_1+    m3d_color            : { tag: ColorRGB_3D, contents: [110, 110, 110] }+    m3d_emissive         : { tag: ColorRGB_3D, contents: [110, 110, 110] }+    m3d_emissiveIntensity: 0.5 +    m3d_opacity          : 1.0+    m3d_transparent      : False+++s3d_position: {<<: *patternPos}+s3d_rotation: {<<: *patternRot}+s3d_scale   : {<<: *patternScl}+++# The scene script+#s3d_script: ""   +s3d_script: |+    if(orbitControls){+        orbitControls.minDistance = 3;+        orbitControls.maxDistance = 20;+        orbitControls.minPolarAngle = 0; +        orbitControls.maxPolarAngle = 1.50098;+    }++++# Materials of scene+s3d_materials:++    - tag: Material+      m3d_name: Default material+      m3d_uuid: "239e3faa-de51-11e6-b31a-3b6189350ce9"++    - tag: MaterialLambert+      m3d_name             : MyMaterial_1+      m3d_uuid             : "4466976e-de51-11e6-a5d3-f3eee64202b6"+      m3d_color            : { tag: ColorRGB_3D, contents: [110, 110, 110] }+      m3d_emissive         : { tag: ColorRGB_3D, contents: [110, 110, 110] }+      m3d_emissiveIntensity: 0.5 +      m3d_opacity          : 1.0+      m3d_transparent      : False+      m3d_script           : ""++    - tag: MaterialLambert+      m3d_name             : MyMaterial_2+      m3d_uuid             : "e6f1bd16-e2fb-11e6-87c7-1772a2fe4228"+      m3d_color            : { tag: ColorRGB_3D, contents: [10, 65, 10] }+      m3d_emissive         : { tag: ColorRGB_3D, contents: [110, 0, 110] }+      m3d_emissiveIntensity: 0.0 +      m3d_opacity          : 1.0+      m3d_transparent      : False+      m3d_script           : ""++    - tag: MaterialBasic+      m3d_name             : MyMaterial_Ground+      m3d_uuid             : "4e181b50-e3bc-11e6-924d-8bbeaf59f608"+      m3d_texture          : "3165d44e-e398-11e6-aac6-e7c59ca562a2"+      m3d_emissiveIntensity: 0.0 +      m3d_opacity          : 1.0+      m3d_transparent      : False+      m3d_script           : ""++    - tag: MaterialFace+      m3d_name             : MyMaterial_SkyBox+      m3d_uuid             : "7badc81a-e6b6-11e6-9cc1-2b72c18ca176"+      m3d_texture          : "6b6fc102-e462-11e6-88eb-433f284ad9f1"+      m3d_emissiveIntensity: 0.0 +      m3d_opacity          : 1.0+      m3d_transparent      : False+      m3d_script           : ""++++# Camera of scene+s3d_camera:+    tag: CameraPerspective3D+    c3d_name     : MyCamera+    c3d_uuid     : "ad8120fe-ef7f-11e6-b685-47a21a9ccdd2"+    c3d_position : {<<: *patternPos, v3d_posY: -10, v3d_posZ: 10}+    c3d_scale    : {<<: *patternScl}+    c3d_fov      : 45+    c3d_near     : 1+    c3d_far      : 1000+    c3d_zoom     : 1.0+    c3d_up       : {<<: *patternV3D, v3d_z: 1}+    c3d_script   : ""   +    c3d_children :++        - tag: FLPointLight3D   +          l3d_name      : MyPointLight +          l3d_uuid      : "e436c6c8-f1d5-11e6-837c-afadb174b93a"+          l3d_flagDraw  : ON+          l3d_color     : "0xFFFFFF"+          l3d_intensity : 0.8+          l3d_distance  : 0 +          l3d_decay     : 1+          l3d_position  : {<<: *patternPos}+          l3d_script    : ""   ++++# Environments of scene+s3d_envirs:++    - tag: FLAmbientLight3D +      l3d_name      : MyAmbientLight+      l3d_uuid      : "9ab6f73c-f1d2-11e6-ad6c-23968912c3bd"+      l3d_flagDraw  : ON+      l3d_color     : "0x999999"+      l3d_intensity : 1.0+      l3d_script    : ""   ++    - tag: FBox3D+      f3d_name    : MySkyBox+      f3d_uuid    : "5d2f5584-e6b6-11e6-b1e0-07ba4b916aa0"+      f3d_flagDraw: ON+      f3d_material: "7badc81a-e6b6-11e6-9cc1-2b72c18ca176"+      f3d_position: {<<: *patternPos}+      f3d_rotation: {<<: *patternRot, v3d_rotX: 1.570796}+      f3d_scale   : {<<: *patternScl}+      f3d_sizeX   : 500+      f3d_sizeY   : 500+      f3d_sizeZ   : 500+      f3d_script  : ""  ++++# Content of scene+s3d_children:++    - tag: FGroup3D+      f3d_name    : MyGroup+      f3d_uuid    : "20c55aec-e15e-11e6-9b09-a74605bb9055"+      f3d_flagDraw: ON+      f3d_position: {<<: *patternPos}+      f3d_rotation: {<<: *patternRot}+      f3d_scale   : {<<: *patternScl}+      f3d_script  : ""   +      f3d_children:++          - tag: FBox3D+            f3d_name    : MyBox+            f3d_uuid    : "1a49493a-de52-11e6-8860-4725afee8c70"+            f3d_flagDraw: OFF+            f3d_material: "4466976e-de51-11e6-a5d3-f3eee64202b6"+            f3d_position: {<<: *patternPos, v3d_posZ: 1 }+            f3d_rotation: {<<: *patternRot}+            f3d_scale   : {<<: *patternScl}+            f3d_sizeX   : 3+            f3d_sizeY   : 2+            f3d_sizeZ   : 1+            f3d_script  : ""   ++          - tag: FPlane3D+            f3d_name    : MyPlane+            f3d_uuid    : "22f6f794-de52-11e6-b97a-9bf7977de4ff"+            f3d_flagDraw: OFF+            f3d_material: "4e181b50-e3bc-11e6-924d-8bbeaf59f608"+            f3d_position: {<<: *patternPos, v3d_posZ: 0.01}+            f3d_rotation: {<<: *patternRot}+            f3d_scale   : {<<: *patternScl}+            f3d_sizeX   : 30+            f3d_sizeY   : 30+            f3d_script  : ""   ++          - tag: FScript3D +            f3d_name     : MyFigureScript+            f3d_uuid     : "1743e5ea-f2a9-11e6-9ed1-7714401e4924"+            f3d_flagDraw : ON+            f3d_material : "4466976e-de51-11e6-a5d3-f3eee64202b6"+            f3d_position : {<<: *patternPos, v3d_posY: 4.0}+            f3d_rotation : {<<: *patternRot}+            f3d_scale    : {<<: *patternScl}+            f3d_flagExt  : False+            f3d_params   : ["Test", "1.0"]+            f3d_scriptDo : |+                var geometry = new THREE.SphereGeometry( 1, 32, 32 );+                var sphere = new THREE.Mesh( geometry, material );   +                return sphere;+            f3d_script   : ""   +                          +          - tag: FEntityCamera3D+            e3d_name     : MyCamera3D+            e3d_uuid     : "45d7b56a-edf1-11e6-be1d-539a6d03a9c1"+            e3d_flagDraw : ON+            e3d_position : {<<: *patternPos, v3d_posZ: 0}+            e3d_rotation : {<<: *patternRot, v3d_rotY: 1.57}+            e3d_scale    : {<<: *patternScl}+            e3d_params   : ""+            e3d_source   : "/video/sintel.ogv"+                         #  draw   color       geom  scale+            e3d_options  : [ ON , "0xFF0000" , 0.5 , 0.35 ]+            e3d_opacity  : 1.0+            e3d_scrnSide : BackSide +                         #     N    SZx  SZy    px   py   pz     rx   ry   rz      sx   sy   sz      dx0  dy0  dz0     dx1  dy1  dz1    dx2  dy2  dz2    dx3  dy3  dz3    Area [(x0,y0) ... (x3,y3)]+            e3d_screens  : [ [ 0,   2.0, 2.0,   0.0, 0.0, 3.0,   0.0, 0.0, 1.57,   1.0, 1.0, 1.0,    0.0, 0.0, 0.0,    0.0, 0.0, 0.0,   0.0, 0.0, 0.0,   0.0, 0.0, 0.0,   0.0,1.0 , 0.5,1.0 , 0.5,0.0 , 0.0,0.0 ]+                           , [ 1,   2.0, 1.0,   0.0, 3.0, 4.0,   0.0, 0.0, 1.57,   1.0, 1.0, 1.0,    0.0, 0.0, 0.0,    0.0, 0.0, 0.0,   0.0, 0.0, 0.0,   0.0, 0.0, 0.0,   0.5,1.0 , 1.0,1.0 , 1.0,0.0 , 0.5,0.0 ]+                           ]+            e3d_script   : ""   +++    - tag: FGroup3D+      f3d_name    : MyGroup_2+      f3d_uuid    : "c34cbde4-e7b9-11e6-a0a3-6bff2604ce8f"+      f3d_flagDraw: ON+      f3d_position: {<<: *patternPos}+      f3d_rotation: {<<: *patternRot}+      f3d_scale   : {<<: *patternScl}+      f3d_script  : ""   +      f3d_children:++          - tag: FModel3D+            f3d_name    : MyObj+            f3d_uuid    : "f0344534-e7b9-11e6-a116-631ad7dbb628"+            f3d_flagDraw: OFF+            f3d_material: ""+            f3d_position: {<<: *patternPos, v3d_posX: -3.0, v3d_posZ: 2.0 }+            f3d_rotation: {<<: *patternRot, v3d_rotX: 1.507 }+            f3d_scale   : {<<: *patternScl}+            f3d_model   : "cc5af380-e79e-11e6-88d5-035e6ef28b36"   +            f3d_script  : ""   ++          - tag: FModel3D+            f3d_name    : MyObj_BuildChayanova+            f3d_uuid    : "1a458d20-e868-11e6-b256-b387c16aa9d8"+            f3d_flagDraw: OFF+            f3d_material: "4466976e-de51-11e6-a5d3-f3eee64202b6"+            f3d_position: {<<: *patternPos, v3d_posX: 5.0, v3d_posZ: 2.0 }+            f3d_rotation: {<<: *patternRot, v3d_rotX: 1.57079632679 }+            f3d_scale   : {<<: *patternScl}+            f3d_model   : "0b4a2f0a-e7a1-11e6-8ba4-2b23f11b6a84"   +            f3d_script  : ""   ++++
+ src/Hydrogen/Demo/LibDemo.hs view
@@ -0,0 +1,45 @@+--------------------------------------------------------------+-- Module for demonstrating the work of the library+----------------------------------------------------------------++module Hydrogen.Demo.LibDemo +    ( testDemo+    ) where++-- Импорт модулей+import           Hydrogen.Hydrogen+import           Hydrogen.Tool.TScene3D                     (parseSceneFile)++import           WebUI.HFitUI+import           WebUI.Scripts.JavaScript.HJavaScript+import           WebUI.Themes.SolarizedUITheme+++-- | Demo test+testDemo :: IO ()+testDemo = do+    res <- testOne+    putStrLn res++++testOne :: IO String+testOne = do+    scene3D <- parseSceneFile "models/test/MyTest.scene"+--    scene3D <- parseSceneFile "/home/pavel/Projects/Haskell/Hydrogen/models/test/MyTest.scene"+    script  <- return $ runScript defaultHBConfig { hbc_entryLine = "\n" +                                                  , hbc_tabSpace  = "  "+                                                  , hbc_empty     = ""+                                                  } $ do buildHydroScene DData scene3D "idRoot" "idCanvas" "" +    return script+++data DData = DData++-- | Реализация контекста приложения в котором генерируется сцена+instance CContext3D DData KeyContext3D String where+    contextGet app KeyScenesPath    = "folderScenes"+    contextGet app KeyTexturesPath  = "folderTextures"+    contextGet app KeyModelPath     = "folderModel"+    contextGet app _                = ""+
+ src/Hydrogen/HydroCore.hs view
@@ -0,0 +1,100 @@+----------------------------------------------------------------+-- Модуль библиотеки Hydrogen+-- Инструменты ядра (Core)+-- Ядро генератора+----------------------------------------------------------------++module Hydrogen.HydroCore+    ( CHydrogenScene     (..)+    , CContext3D         (..)+    , cortegeKV+    , CBuilder3D         (..)+    , CBuilderModel3D    (..)+    , CBuilderFragment3D (..)++    , KeyContext3D       (..)+    ) where++-- Импорт модулей+import           Hydrogen.Model.MSceneGeneral++import           WebUI.Scripts.HScript                          (HSL(..), HLFinish(..))+import           WebUI.Scripts.JavaScript.HJSTypes              (HLangJS(..))++++-- | Класс сцены библиотеки+-- c   - контекст приложения в котором генерируется сцена+-- k   - ключ обращения+-- v   - значение ответа+-- s   - модель сцены+-- idr - ID корневого элемента+-- idc - ID холста+-- opt - опиции сцены+-- class CContext3D c k v => CHydrogenScene c s idr idc opt where+class CHydrogenScene s idr idc opt where+    buildHydroScene :: (CContext3D c KeyContext3D String) => c -> s -> idr -> idc -> opt -> HSL HLangJS HLFinish++++-- | Класс контекста приложения в котором генерируется сцена+-- c - контекст приложения в котором генерируется сцена+-- k - ключ обращения+-- v - значение ответа+class Show k => CContext3D c k v where+    contextGet :: c -> k -> v++    contextIsDebugMode :: (k,v) -> c -> Bool+    contextIsDebugMode _ _ = True++++-- | Шалок картежа по умолчанию для класса CContext3D+cortegeKV = ( KeyEmpty :: KeyContext3D+            , ""       :: String+            )++++-- | Класс построения 3D сцены по модели данных+-- c - контекст приложения в котором генерируется сцена+-- s - объект сцены+class CBuilder3D s where+    build3D :: (CContext3D c KeyContext3D String) => c -> s -> ParentName -> HSL HLangJS HLangJS++++-- | Класс построения 3D модели сцены по модели данных+-- c - контекст приложения в котором генерируется сцена+-- s - объект сцены+class CBuilderModel3D s where+    buildModel3D :: (CContext3D c KeyContext3D String) => c -> s -> ParentName -> (UUID_3D, Position3D, Rotation3D, Scale3D, String) -> HSL HLangJS HLangJS++++-- | Класс построения 3D фрагмента сцены по сцене данных+-- c - контекст приложения в котором генерируется сцена+-- s - объект сцены+class CBuilderFragment3D s where+    buildFragment3D :: (CContext3D c KeyContext3D String) => c -> s -> ParentName -> (UUID_3D, Position3D, Rotation3D, Scale3D, String) -> HSL HLangJS HLangJS++++-- | Данные ключей контекста+data KeyContext3D = KeyContext3D+				  | KeyScenesPath+                  | KeyTexturesPath +                  | KeyModelPath +                  | KeyText String+                  | KeyEmpty++instance Show KeyContext3D where+    show KeyContext3D       = "KeyContext3D"+    show KeyScenesPath      = "scenesPath"+    show KeyTexturesPath    = "texturesPath"+    show KeyModelPath       = "modelPath"+    show (KeyText t)        = t+    show KeyEmpty           = ""+++
+ src/Hydrogen/Hydrogen.hs view
@@ -0,0 +1,21 @@+----------------------------------------------------------------+-- Модуль библиотеки Hydrogen+----------------------------------------------------------------++module Hydrogen.Hydrogen+    ( module Import+    ) where++-- Импорт модулей+import           Hydrogen.HydroCore               as Import++import           Hydrogen.Model.MScene            as Import+import           Hydrogen.Model.MSceneGeneral     as Import++import           Hydrogen.Tool.TScene3D           as Import+import           Hydrogen.Tool.TBuilder3D         as Import++import           Hydrogen.Tool.TGeneratorS3D      as Import+++
+ src/Hydrogen/Model/MScene.hs view
@@ -0,0 +1,17 @@+----------------------------------------------------------------+-- Модуль библиотеки Hydrogen+-- Модель данных (Model)+-- Сцена +----------------------------------------------------------------++module Hydrogen.Model.MScene+    ( module ImportS2D+    , module ImportS3D+    ) where++++-- Импорт модулей+import           Hydrogen.Model.MScene2D          as ImportS2D+import           Hydrogen.Model.MScene3D          as ImportS3D+
+ src/Hydrogen/Model/MScene2D.hs view
@@ -0,0 +1,275 @@+----------------------------------------------------------------+-- Модуль библиотеки Hydrogen+-- Модель данных (Model)+-- Сцена 2D +----------------------------------------------------------------++module Hydrogen.Model.MScene2D+    ( Scene2D       (..)+    , SceneHeader2D (..)++    , Color2D++    , Figure2D      (..)+    +    , Texture2D     (..)+    , Model2D       (..)+    +    , scene2D++    , emptyScene2D+    , isEmptyScene2D++    , emptySceneHeader2D+    , isEmptySceneHeader2D++    , isEmptyModel2D++    , texture2D+    , model2D++    , testDebugScene2D+    ) where++-- Импорт модулей+import           Prelude                   as PRL++import           Numeric                      (showHex)++import           GHC.Generics                 (Generic)++import           Data.Aeson+import           Data.Aeson.TH+import           Data.Yaml                 as YAML+import           Data.Char                    (toUpper)+import           Data.Version+import           Data.Typeable+import           Data.Binary++import           Hydrogen.Model.MSceneGeneral++-- data Test3D a = Test3D { testDt :: String+--                        , testPrm :: a+--                        }+--                        deriving (Show, Eq, Typeable, Generic)+-- instance Binary (Test3D String)+-- $(deriveJSON defaultOptions ''Test3D)++-- | Данные 2D сцены+data Scene2D = Scene2D { s2d_name      :: String+                       , s2d_uuid      :: UUID_2D+                       , s2d_version   :: Version+                       , s2d_author    :: String+                       , s2d_descr     :: String+                       , s2d_geoPoint  :: GeoPoint+                       , s2d_tags      :: [String]+                       , s2d_position  :: Position2D+                       , s2d_rotation  :: Rotation2D+                       , s2d_scale     :: Scale2D+                       , s2d_script    :: String   +                       , s2d_envirs    :: [Figure2D]+                       , s2d_children  :: [Figure2D]+                       } +             | SceneEmpty2D+                       deriving (Show, Eq, Typeable, Generic)+++-- | Данные заголовка 2D сцены+data SceneHeader2D = SceneHeader2D { sh2d_name     :: String+                                   , sh2d_uuid     :: UUID_2D+                                   , sh2d_version  :: Version+                                   , sh2d_author   :: String+                                   , sh2d_descr    :: String+                                   , sh2d_geoPoint :: GeoPoint+                                   , sh2d_tags     :: [String]+                                   }+                   | SceneEmptyHeader2D+                                   deriving (Show, Eq, Typeable, Generic)++++-- | Цвет 2D+type Color2D = Color3D++++-- | Фигуры 2D сцены+data Figure2D = Figure2D+                deriving (Show, Eq, Typeable, Generic)++++-- | Данные 2D текстуры+data Texture2D = Texture2D { t2d_name     :: String+                           , t2d_uuid     :: UUID_2D+                           , t2d_version  :: Version+                           , t2d_author   :: String+                           , t2d_descr    :: String+                           , t2d_tags     :: [String]+                           , t2d_contents :: [String]+                           } +                           deriving (Show, Eq, Typeable, Generic)++++-- | Данные 2D модели+data Model2D = Model2D +               deriving (Show, Eq, Typeable, Generic)++++instance Binary Scene2D+instance Binary SceneHeader2D+instance Binary Figure2D+instance Binary Texture2D+instance Binary Model2D ++$(deriveJSON defaultOptions ''Scene2D)+$(deriveJSON defaultOptions ''SceneHeader2D)+$(deriveJSON defaultOptions ''Figure2D)+$(deriveJSON defaultOptions ''Texture2D)+$(deriveJSON defaultOptions ''Model2D)++++-- | 2D сцена+scene2D :: Scene2D+scene2D = emptyScene2D+++-- | Пустая 2D сцена+emptyScene2D :: Scene2D+emptyScene2D =+    Scene2D { s2d_name      = ""+            , s2d_uuid      = ""+            , s2d_version   = makeVersion [0,0,0]+            , s2d_author    = ""+            , s2d_descr     = ""+            , s2d_geoPoint  = GeoPoint { gp_lat = 0.0, gp_lon = 0.0 }+            , s2d_tags      = []+            , s2d_position  = Position2D { v2d_posX = 0.0, v2d_posY = 0.0 }+            , s2d_rotation  = Rotation2D { v2d_rotZ = 0.0 }+            , s2d_scale     = Scale2D    { v2d_sclX = 1.0, v2d_sclY = 1.0 }+            , s2d_script    = ""+            , s2d_envirs    = []+            , s2d_children  = []+            }++++-- | Проверка налиичия пустой сцены+isEmptyScene2D :: Scene2D+               -> Bool+isEmptyScene2D SceneEmpty2D = True+isEmptyScene2D scene2D = +    let uuid = s2d_uuid scene2D+        name = s2d_name scene2D+    in+    if uuid == "" && name == "" then True else False++++-- | Пустой заголовок 2D сцены+emptySceneHeader2D :: SceneHeader2D+emptySceneHeader2D =+    SceneHeader2D { sh2d_name     = ""+                  , sh2d_uuid     = ""+                  , sh2d_version  = makeVersion [0,0,0]+                  , sh2d_author   = ""+                  , sh2d_descr    = ""+                  , sh2d_geoPoint = GeoPoint { gp_lat = 0.0, gp_lon = 0.0 }+                  , sh2d_tags     = []+                  }++-- | Проверка налиичия пустого заголовка сцены+isEmptySceneHeader2D :: SceneHeader2D+                     -> Bool+isEmptySceneHeader2D SceneEmptyHeader2D = True +isEmptySceneHeader2D sceneHeader2D = +    let uuid = sh2d_uuid sceneHeader2D+        name = sh2d_name sceneHeader2D+    in+    if uuid == "" && name == "" then True else False++++-- | Проверка налиичия пустой 2D модели+isEmptyModel2D :: Model2D+               -> Bool+isEmptyModel2D Model2D = True+--isEmptyModel2D model2D = +--    let uuid = d2d_uuid model2D+--        name = d2d_name model2D+--    in+--    if uuid == "" && name == "" then True else False++++-- | 2D текстура+texture2D :: Texture2D+texture2D = Texture2D { t2d_name     = ""+                      , t2d_uuid     = ""+                      , t2d_version  = makeVersion [0,0,0]+                      , t2d_author   = ""+                      , t2d_descr    = ""+                      , t2d_tags     = []+                      , t2d_contents = []+                      } ++++-- | 2D модель+model2D :: Model2D +model2D = Model2D ++++-- | Сцена 2D по умолчанию+defaultScene2D :: Scene2D+defaultScene2D =+    Scene2D { s2d_name      = "Scene 2D (Default)"+            , s2d_uuid      = "3bce9fce-236c-11e7-a910-1b01c59c718e"+            , s2d_version   = makeVersion [0,0,1]+            , s2d_author    = "User"+            , s2d_descr     = "This is description of 2D scene."+            , s2d_geoPoint  = GeoPoint { gp_lat = 0.0, gp_lon = 0.0 }+            , s2d_tags      = [ "Test"+                              , "Demo"+                              , "Debug"+                              ]+            , s2d_position  = Position2D { v2d_posX = 0.0, v2d_posY = 0.0 }+            , s2d_rotation  = Rotation2D { v2d_rotZ = 0.0 }+            , s2d_scale     = Scale2D    { v2d_sclX = 1.0, v2d_sclY = 1.0 }+            , s2d_script    = ""+            , s2d_envirs    = []+            , s2d_children  = []+            }++++-- | Разбор конфигурационного файла+parseSceneFile :: String+               -> IO Scene2D+parseSceneFile pathFile = +    either (error . show) id <$>+    decodeFileEither pathFile++++++testDebugScene2D :: IO ()+testDebugScene2D = do+    scene <- return $ defaultScene2D+    json  <- return $ toJSON scene+    putStrLn $ show json+    YAML.encodeFile "/home/pavel/Temp/1/Testr.yaml" scene+    --scene <- parseSceneFile "/home/pavel/Projects/Haskell/Adamant/datas/scenes/d7d3e5d4-de50-11e6-80e3-cb4e0b910fb7/MyTest.scene"+    --putStrLn $ show scene+    return ()++++++
+ src/Hydrogen/Model/MScene3D.hs view
@@ -0,0 +1,617 @@+----------------------------------------------------------------+-- Модуль библиотеки Hydrogen+-- Модель данных (Model)+-- Сцена 3D +----------------------------------------------------------------++module Hydrogen.Model.MScene3D+    ( Scene3D       (..)+    , SceneHeader3D (..)+    , Material      (..)++    , Camera3D      (..)+    , Figure3D      (..)+    , Texture3D     (..)+    , Model3D       (..)+    +    , ECOptions3D   (..)+    , ECScreen3D    (..)++    , scene3D++    , emptyScene3D+    , isEmptyScene3D++    , emptySceneHeader3D+    , isEmptySceneHeader3D++    , isEmptyModel3D++    , texture3D+    , model3D++    , testDebugScene3D+    ) where++-- Импорт модулей+import           Prelude                   as PRL++import           GHC.Generics                 (Generic)++import           Data.Aeson+import           Data.Aeson.TH+import           Data.Yaml                 as YAML+import           Data.Char                    (toUpper)+import           Data.Version+import           Data.Typeable+import           Data.Binary++import           Hydrogen.Model.MSceneGeneral++++-- data Test3D a = Test3D { testDt :: String+--                        , testPrm :: a+--                        }+--                        deriving (Show, Eq, Typeable, Generic)+-- instance Binary (Test3D String)+-- $(deriveJSON defaultOptions ''Test3D)++-- | Данные 3D сцены+data Scene3D = Scene3D { s3d_name      :: String+                       , s3d_uuid      :: UUID_3D+                       , s3d_version   :: Version+                       , s3d_author    :: String+                       , s3d_descr     :: String+                       , s3d_geoPoint  :: GeoPoint+                       , s3d_tags      :: [String]+                       , s3d_position  :: Position3D+                       , s3d_rotation  :: Rotation3D+                       , s3d_scale     :: Scale3D+                       , s3d_script    :: String   +                       , s3d_materials :: [Material]+                       , s3d_camera    :: Camera3D+                       , s3d_envirs    :: [Figure3D]+                       , s3d_children  :: [Figure3D]+                       }+             | SceneEmpty3D+                       deriving (Show, Eq, Typeable, Generic)++++-- | Данные заголовка 3D сцены+data SceneHeader3D = SceneHeader3D { sh3d_name     :: String+                                   , sh3d_uuid     :: UUID_3D+                                   , sh3d_version  :: Version+                                   , sh3d_author   :: String+                                   , sh3d_descr    :: String+                                   , sh3d_geoPoint :: GeoPoint+                                   , sh3d_tags     :: [String]+                                   }+                   | SceneEmptyHeader3D+                                   deriving (Show, Eq, Typeable, Generic)++++-- | Материал 3D сцены+data Material = Material        { m3d_name              :: String+                                , m3d_uuid              :: UUID_3D+                                } +              | MaterialLambert { m3d_name              :: String+                                , m3d_uuid              :: UUID_3D +                                , m3d_color             :: Color3D+                                , m3d_emissive          :: Color3D+                                , m3d_emissiveIntensity :: Double+                                , m3d_opacity           :: Double+                                , m3d_transparent       :: Bool                               +                                , m3d_script            :: String   +                                } +              | MaterialBasic   { m3d_name              :: String+                                , m3d_uuid              :: UUID_3D +                                , m3d_texture           :: UUID_3D+                                , m3d_opacity           :: Double+                                , m3d_transparent       :: Bool                               +                                , m3d_script            :: String   +                                } +              | MaterialFace    { m3d_name              :: String+                                , m3d_uuid              :: UUID_3D +                                , m3d_texture           :: UUID_3D+                                , m3d_opacity           :: Double+                                , m3d_transparent       :: Bool                               +                                , m3d_script            :: String   +                                } +                                deriving (Show, Eq, Typeable, Generic)++++-- | Камера 3D+data Camera3D = Camera3D+              | CameraPerspective3D  { c3d_name     :: String+                                     , c3d_uuid     :: UUID_3D+                                     , c3d_position :: Position3D+                                     , c3d_scale    :: Scale3D+                                     , c3d_fov      :: Double+                                     , c3d_near     :: Double+                                     , c3d_far      :: Double+                                     , c3d_zoom     :: Double+                                     , c3d_up       :: Vector3D+                                     , c3d_script   :: String   +                                     , c3d_children :: [Figure3D]+                                     }+              | CameraOrthographic3D { c3d_name     :: String+                                     , c3d_uuid     :: UUID_3D+                                     , c3d_position :: Position3D+                                     , c3d_scale    :: Scale3D+                                     , c3d_near     :: Double+                                     , c3d_far      :: Double+                                     , c3d_zoom     :: Double+                                     , c3d_up       :: Vector3D+                                     , c3d_script   :: String   +                                     , c3d_children :: [Figure3D]+                                     }+                                     deriving (Show, Eq, Typeable, Generic)++++-- | Фигуры 3D сцены+data Figure3D = Figure3D+              | FGroup3D    { f3d_name     :: String+                            , f3d_uuid     :: UUID_3D+                            , f3d_flagDraw :: Bool+                            , f3d_position :: Position3D+                            , f3d_rotation :: Rotation3D+                            , f3d_scale    :: Scale3D+                            , f3d_script   :: String   +                            , f3d_children :: [Figure3D]+                            }+              | FVGroup3D   { f3d_name     :: String+                            , f3d_uuid     :: UUID_3D+                            , f3d_flagDraw :: Bool+                            , f3d_children :: [Figure3D]+                            }+              | FModel3D    { f3d_name     :: String+                            , f3d_uuid     :: UUID_3D+                            , f3d_flagDraw :: Bool+                            , f3d_material :: UUID_3D+                            , f3d_position :: Position3D+                            , f3d_rotation :: Rotation3D+                            , f3d_scale    :: Scale3D+                            , f3d_model    :: UUID_3D+                            , f3d_script   :: String   +                            }+              | FFragment3D { f3d_name     :: String+                            , f3d_uuid     :: UUID_3D+                            , f3d_flagDraw :: Bool+                            , f3d_position :: Position3D+                            , f3d_rotation :: Rotation3D+                            , f3d_scale    :: Scale3D+                            , f3d_scene    :: UUID_3D+                            , f3d_script   :: String   +                            }+              | FLAmbientLight3D     { l3d_name        :: String+                                     , l3d_uuid        :: UUID_3D+                                     , l3d_flagDraw    :: Bool+                                     , l3d_color       :: String+                                     , l3d_intensity   :: Double+                                     , l3d_script      :: String   +                                     }+              | FLPointLight3D       { l3d_name        :: String+                                     , l3d_uuid        :: UUID_3D+                                     , l3d_flagDraw    :: Bool+                                     , l3d_color       :: String+                                     , l3d_intensity   :: Double+                                     , l3d_distance    :: Double+                                     , l3d_decay       :: Double+                                     , l3d_position    :: Position3D+                                     , l3d_script      :: String   +                                     }+              | FLDirectionalLight3D { l3d_name        :: String+                                     , l3d_uuid        :: UUID_3D+                                     , l3d_flagDraw    :: Bool+                                     , l3d_color       :: String+                                     , l3d_intensity   :: Double+                                     , l3d_position    :: Position3D+                                     , l3d_script      :: String   +                                     }+              | FLHemisphereLight3D  { l3d_name        :: String+                                     , l3d_uuid        :: UUID_3D+                                     , l3d_flagDraw    :: Bool+                                     , l3d_colorSky    :: String+                                     , l3d_colorGround :: String+                                     , l3d_intensity   :: Double+                                     , l3d_position    :: Position3D+                                     , l3d_script      :: String   +                                     }+              | FLSpotLight3D        { l3d_name        :: String+                                     , l3d_uuid        :: UUID_3D+                                     , l3d_flagDraw    :: Bool+                                     , l3d_color       :: String+                                     , l3d_intensity   :: Double+                                     , l3d_distance    :: Double+                                     , l3d_angle       :: Double+                                     , l3d_penumbra    :: Double+                                     , l3d_decay       :: Double+                                     , l3d_position    :: Position3D+                                     , l3d_script      :: String   +                                     }+              | FBox3D    { f3d_name     :: String+                          , f3d_uuid     :: UUID_3D+                          , f3d_flagDraw :: Bool+                          , f3d_material :: UUID_3D+                          , f3d_position :: Position3D+                          , f3d_rotation :: Rotation3D+                          , f3d_scale    :: Scale3D+                          , f3d_sizeX    :: Double+                          , f3d_sizeY    :: Double+                          , f3d_sizeZ    :: Double+                          , f3d_script   :: String   +                          } +              | FPlane3D  { f3d_name     :: String+                          , f3d_uuid     :: UUID_3D+                          , f3d_flagDraw :: Bool+                          , f3d_material :: UUID_3D+                          , f3d_position :: Position3D+                          , f3d_rotation :: Rotation3D+                          , f3d_scale    :: Scale3D+                          , f3d_sizeX    :: Double+                          , f3d_sizeY    :: Double+                          , f3d_script   :: String   +                          }+              | FScript3D { f3d_name     :: String+                          , f3d_uuid     :: UUID_3D+                          , f3d_flagDraw :: Bool+                          , f3d_material :: UUID_3D+                          , f3d_position :: Position3D+                          , f3d_rotation :: Rotation3D+                          , f3d_scale    :: Scale3D+                          , f3d_flagExt  :: Bool+                          , f3d_params   :: [String]+                          , f3d_scriptDo :: String   +                          , f3d_script   :: String   +                          }+              | FEntityCamera3D { e3d_name     :: String+                                , e3d_uuid     :: UUID_3D+                                , e3d_flagDraw :: Bool+                                , e3d_position :: Position3D+                                , e3d_rotation :: Rotation3D+                                , e3d_scale    :: Scale3D+                                , e3d_params   :: String+                                , e3d_source   :: String+                                , e3d_options  :: ECOptions3D+                                , e3d_opacity  :: Double+                                , e3d_scrnSide :: String+                                , e3d_screens  :: [ECScreen3D]+                                , e3d_script   :: String   +                                }+              deriving (Show, Eq, Typeable, Generic)++++-- | Данные 3D текстуры+data Texture3D = Texture3D { t3d_name     :: String+                           , t3d_uuid     :: UUID_3D+                           , t3d_version  :: Version+                           , t3d_author   :: String+                           , t3d_descr    :: String+                           , t3d_tags     :: [String]+                           , t3d_contents :: [String]+                           } +                           deriving (Show, Eq, Typeable, Generic)++++-- | Данные 3D модели+data Model3D = Model3D +             | Model3D_Obj  { d3d_name     :: String+                            , d3d_uuid     :: UUID_3D+                            , d3d_version  :: Version+                            , d3d_author   :: String+                            , d3d_descr    :: String+                            , d3d_tags     :: [String]+                            , d3d_cntObjs  :: [String]+                            , d3d_cntMtls  :: [String]+                            } +             | Model3D_Json { d3d_name     :: String+                            , d3d_uuid     :: UUID_3D+                            , d3d_version  :: Version+                            , d3d_author   :: String+                            , d3d_descr    :: String+                            , d3d_tags     :: [String]+                            , d3d_contents :: [String]+                            } +                           deriving (Show, Eq, Typeable, Generic)++++-- Настройки отображения камеры сущности FEntityCamera3D+data ECOptions3D = ECOptions3D Bool         -- ^ Флаг отображения+                               String       -- ^ Цвет камеры+                               Double       -- ^ Пропорции +                               Double       -- ^ Масштаб отображения+                               deriving (Show, Eq, Typeable, Generic)++-- Экран для сущности FEntityCamera3D+data ECScreen3D = ECScreen3D Int     -- ^ Number++                             Double  -- ^ Sx+                             Double  -- ^ Sy++                             Double  -- ^ px+                             Double  -- ^ py+                             Double  -- ^ pz++                             Double  -- ^ rx+                             Double  -- ^ ry+                             Double  -- ^ rz++                             Double  -- ^ sx+                             Double  -- ^ sy+                             Double  -- ^ sz++                             Double  -- ^ dx0+                             Double  -- ^ dy0+                             Double  -- ^ dz0++                             Double  -- ^ dx1+                             Double  -- ^ dy1+                             Double  -- ^ dz1++                             Double  -- ^ dx2+                             Double  -- ^ dy2+                             Double  -- ^ dz2++                             Double  -- ^ dx3+                             Double  -- ^ dy3+                             Double  -- ^ dz3+                             +                             Double Double  -- ^ (ax0,ay0)+                             Double Double  -- ^ (ax1,ay1)+                             Double Double  -- ^ (ax2,ay2)+                             Double Double  -- ^ (ax3,ay3)+                             deriving (Show, Eq, Typeable, Generic)++++instance Binary Scene3D+instance Binary SceneHeader3D+instance Binary Material+instance Binary Camera3D+instance Binary Figure3D+instance Binary Texture3D+instance Binary Model3D +instance Binary ECOptions3D +instance Binary ECScreen3D ++$(deriveJSON defaultOptions ''Scene3D)+$(deriveJSON defaultOptions ''SceneHeader3D)+$(deriveJSON defaultOptions ''Material)+$(deriveJSON defaultOptions ''Camera3D)+$(deriveJSON defaultOptions ''Figure3D)+$(deriveJSON defaultOptions ''Texture3D)+$(deriveJSON defaultOptions ''Model3D)+$(deriveJSON defaultOptions ''ECOptions3D)+$(deriveJSON defaultOptions ''ECScreen3D)++++-- | 3D сцена+scene3D :: Scene3D+scene3D = emptyScene3D+++-- | Пустая 3D сцена+emptyScene3D :: Scene3D+emptyScene3D =+    Scene3D { s3d_name      = ""+            , s3d_uuid      = ""+            , s3d_version   = makeVersion [0,0,0]+            , s3d_author    = ""+            , s3d_descr     = ""+            , s3d_geoPoint  = GeoPoint { gp_lat = 0.0, gp_lon = 0.0 }+            , s3d_tags      = []+            , s3d_position  = Position3D { v3d_posX = 0.0, v3d_posY = 0.0, v3d_posZ = 0.0 }+            , s3d_rotation  = Rotation3D { v3d_rotX = 0.0, v3d_rotY = 0.0, v3d_rotZ = 0.0 }+            , s3d_scale     = Scale3D    { v3d_sclX = 1.0, v3d_sclY = 1.0, v3d_sclZ = 1.0 }+            , s3d_script    = ""+            , s3d_materials = []+            , s3d_camera    = Camera3D  +            , s3d_envirs    = []+            , s3d_children  = []+            }++-- | Проверка налиичия пустой сцены+isEmptyScene3D :: Scene3D+               -> Bool+isEmptyScene3D SceneEmpty3D = True+isEmptyScene3D scene3D = +    let uuid = s3d_uuid scene3D+        name = s3d_name scene3D+    in+    if uuid == "" && name == "" then True else False++++-- | Пустой заголовок 3D сцены+emptySceneHeader3D :: SceneHeader3D+emptySceneHeader3D =+    SceneHeader3D { sh3d_name     = ""+                  , sh3d_uuid     = ""+                  , sh3d_version  = makeVersion [0,0,0]+                  , sh3d_author   = ""+                  , sh3d_descr    = ""+                  , sh3d_geoPoint = GeoPoint { gp_lat = 0.0, gp_lon = 0.0 }+                  , sh3d_tags     = []+                  }++-- | Проверка налиичия пустого заголовка сцены+isEmptySceneHeader3D :: SceneHeader3D+                     -> Bool+isEmptySceneHeader3D SceneEmptyHeader3D = True+isEmptySceneHeader3D sceneHeader3D = +    let uuid = sh3d_uuid sceneHeader3D+        name = sh3d_name sceneHeader3D+    in+    if uuid == "" && name == "" then True else False++++-- | Проверка налиичия пустой 3D модели+isEmptyModel3D :: Model3D+               -> Bool+isEmptyModel3D Model3D = True+isEmptyModel3D model3D = +    let uuid = d3d_uuid model3D+        name = d3d_name model3D+    in+    if uuid == "" && name == "" then True else False++++-- | 3D текстура+texture3D :: Texture3D+texture3D = Texture3D { t3d_name     = ""+                      , t3d_uuid     = ""+                      , t3d_version  = makeVersion [0,0,0]+                      , t3d_author   = ""+                      , t3d_descr    = ""+                      , t3d_tags     = []+                      , t3d_contents = []+                      } ++++-- | 3D модель+model3D :: Model3D +model3D = Model3D ++++-- | Сцена 3D по умолчанию+defaultScene3D :: Scene3D+defaultScene3D =+    Scene3D { s3d_name      = "Scene 3D (Default)"+            , s3d_uuid      = "d7d3e5d4-de50-11e6-80e3-cb4e0b910fb7"+            , s3d_version   = makeVersion [0,0,1]+            , s3d_author    = "User"+            , s3d_descr     = "This is description of 3D scene."+            , s3d_geoPoint  = GeoPoint { gp_lat = 0.0, gp_lon = 0.0 }+            , s3d_tags      = [ "Test"+                              , "Demo"+                              , "Debug"+                              ]+            , s3d_position  = Position3D { v3d_posX = 0.0, v3d_posY = 0.0, v3d_posZ = 0.0 }+            , s3d_rotation  = Rotation3D { v3d_rotX = 0.0, v3d_rotY = 0.0, v3d_rotZ = 0.0 }+            , s3d_scale     = Scale3D    { v3d_sclX = 1.0, v3d_sclY = 1.0, v3d_sclZ = 1.0 }+            , s3d_script    = ""+            , s3d_materials = [ Material        { m3d_name              = "Default material"+                                                , m3d_uuid              = "0ea4f586-e2fb-11e6-8150-938210091cb8"+                                                } +                              , MaterialLambert { m3d_name              = "MyMaterial 1"+                                                , m3d_uuid              = "239e3faa-de51-11e6-b31a-3b6189350ce9"+                                                , m3d_color             = ColorRGB_3D 110 110 110+                                                , m3d_emissive          = ColorRGB_3D 110 110 110+                                                , m3d_emissiveIntensity = 1.0+                                                , m3d_opacity           = 1.0+                                                , m3d_transparent       = False+                                                , m3d_script            = ""+                                                }+                              , MaterialLambert { m3d_name              = "MyMaterial 2"+                                                , m3d_uuid              = "4466976e-de51-11e6-a5d3-f3eee64202b6"+                                                , m3d_color             = ColorRGB_3D 10 145 10+                                                , m3d_emissive          = ColorRGB_3D 110 110 110+                                                , m3d_emissiveIntensity = 1.0+                                                , m3d_opacity           = 1.0+                                                , m3d_transparent       = False+                                                , m3d_script            = ""+                                                }+                              ]+            , s3d_camera    = CameraPerspective3D { c3d_name     = "MyCamera" +                                                  , c3d_uuid     = "e501c034-ef7e-11e6-ab73-87e2eb608649"+                                                  , c3d_position = Position3D { v3d_posX = 0.0, v3d_posY = -10.0, v3d_posZ = 10.0 }+                                                  , c3d_scale    = Scale3D    { v3d_sclX = 1.0, v3d_sclY = 1.0, v3d_sclZ = 1.0 }+                                                  , c3d_fov      = 45+                                                  , c3d_near     = 1+                                                  , c3d_far      = 10+                                                  , c3d_zoom     = 1.0+                                                  , c3d_up       = Vector3D {v3d_x = 0.0, v3d_y = 0.0, v3d_z = 1.0 }+                                                  , c3d_script   = ""   +                                                  , c3d_children = []+                                                  }+            , s3d_envirs    = []+            , s3d_children  = [ FGroup3D { f3d_name = "MyGroup"+                                         , f3d_uuid = "20c55aec-e15e-11e6-9b09-a74605bb9055"+                                         , f3d_flagDraw = True+                                         , f3d_position = Position3D { v3d_posX = 0.0, v3d_posY = 0.0, v3d_posZ = 0.0 }+                                         , f3d_rotation = Rotation3D { v3d_rotX = 0.0, v3d_rotY = 0.0, v3d_rotZ = 0.0 }+                                         , f3d_scale    = Scale3D    { v3d_sclX = 0.0, v3d_sclY = 0.0, v3d_sclZ = 0.0 }+                                         , f3d_script   = ""   +                                         , f3d_children = [ FBox3D   { f3d_name  = "MyBox"+                                                                     , f3d_uuid  = "1a49493a-de52-11e6-8860-4725afee8c70"+                                                                     , f3d_flagDraw = True+                                                                     , f3d_material = "239e3faa-de51-11e6-b31a-3b6189350ce9"+                                                                     , f3d_position = Position3D { v3d_posX = 0.0, v3d_posY = 0.0, v3d_posZ = 0.0 }+                                                                     , f3d_rotation = Rotation3D { v3d_rotX = 0.0, v3d_rotY = 0.0, v3d_rotZ = 0.0 }+                                                                     , f3d_scale    = Scale3D    { v3d_sclX = 1.0, v3d_sclY = 1.0, v3d_sclZ = 1.0 }+                                                                     , f3d_sizeX = 3+                                                                     , f3d_sizeY = 2+                                                                     , f3d_sizeZ = 1+                                                                     , f3d_script   = ""   +                                                                     } +                                                          , FPlane3D { f3d_name  = "MyPlane"+                                                                     , f3d_uuid  = "22f6f794-de52-11e6-b97a-9bf7977de4ff"+                                                                     , f3d_flagDraw = True+                                                                     , f3d_material = "4466976e-de51-11e6-a5d3-f3eee64202b6"+                                                                     , f3d_position = Position3D { v3d_posX = 0.0, v3d_posY = 0.0, v3d_posZ = 0.0 }+                                                                     , f3d_rotation = Rotation3D { v3d_rotX = 0.0, v3d_rotY = 0.0, v3d_rotZ = 0.0 }+                                                                     , f3d_scale    = Scale3D    { v3d_sclX = 1.0, v3d_sclY = 1.0, v3d_sclZ = 1.0 }+                                                                     , f3d_sizeX = 5+                                                                     , f3d_sizeY = 5+                                                                     , f3d_script   = ""   +                                                                     }+                                                          , FEntityCamera3D { e3d_name     = "DeomoCamera3D"+                                                                            , e3d_uuid     = "56dfc5fc-edef-11e6-8474-e3fd097df198"+                                                                            , e3d_flagDraw = True+                                                                            , e3d_position = Position3D { v3d_posX = 0.0, v3d_posY = 0.0, v3d_posZ = 0.0 }+                                                                            , e3d_rotation = Rotation3D { v3d_rotX = 0.0, v3d_rotY = 0.0, v3d_rotZ = 0.0 }+                                                                            , e3d_scale    = Scale3D    { v3d_sclX = 1.0, v3d_sclY = 1.0, v3d_sclZ = 1.0 }+                                                                            , e3d_params   = ""+                                                                            , e3d_source   = "/video/sintel.ogv"+                                                                            , e3d_options  = ECOptions3D True "0xFF0000" 0.5 1.0+                                                                            , e3d_opacity  = 1.0+                                                                            , e3d_scrnSide = ""+                                                                            , e3d_screens  = [ ECScreen3D 0   2.0 2.0   0.0 0.0 3.0   0.0 0.0 0.0   1.0 1.0 1.0    0.0 0.0 0.0    0.0 0.0 0.0   0.0 0.0 0.0    0.0 0.0 0.0  0.0 1.0  0.5 1.0  0.5 0.0  0.0 0.0+                                                                                             , ECScreen3D 1   2.0 1.0   0.0 3.0 4.0   0.0 0.0 0.0   1.0 1.0 1.0    0.0 0.0 0.0    0.0 0.0 0.0   0.0 0.0 0.0    0.0 0.0 0.0  0.5 1.0  1.0 1.0  1.0 0.0  0.5 0.0+                                                                                             ]+                                                                            , e3d_script   = ""+                                                                            }+                                                          ]+                                         }+                              ]+            }++++-- | Разбор конфигурационного файла+parseSceneFile :: String+               -> IO Scene3D+parseSceneFile pathFile = +    either (error . show) id <$>+    decodeFileEither pathFile++++++testDebugScene3D :: IO ()+testDebugScene3D = do+    scene <- return $ defaultScene3D+    json  <- return $ toJSON scene+    putStrLn $ show json+    YAML.encodeFile "/home/pavel/Temp/1/Testr.yaml" scene+    --scene <- parseSceneFile "/home/pavel/Projects/Haskell/Adamant/datas/scenes/d7d3e5d4-de50-11e6-80e3-cb4e0b910fb7/MyTest.scene"+    --putStrLn $ show scene+    return ()++++
+ src/Hydrogen/Model/MSceneGeneral.hs view
@@ -0,0 +1,173 @@+----------------------------------------------------------------+-- Модуль библиотеки Hydrogen+-- Модель данных (Model)+-- Общин данные для сцены +----------------------------------------------------------------++module Hydrogen.Model.MSceneGeneral+    ( GeoPoint      (..)++    , Color3D       (..)++    , Position2D    (..)+    , Position3D    (..)++    , Rotation2D    (..)+    , Rotation3D    (..)++    , Scale2D       (..)+    , Scale3D       (..)++    , Vector2D      (..)+    , Vector3D      (..)++    , ParentName    (..)++    , UUID_2D       (..)+    , UUID_3D       (..)+    ) where++++-- Импорт модулей+import           Prelude                   as PRL++import           Numeric                      (showHex)++import           GHC.Generics                 (Generic)++--import           Data.Aeson+import           Data.Aeson.TH+--import           Data.Yaml                 as YAML+import           Data.Char                    (toUpper)+--import           Data.Version+import           Data.Typeable+import           Data.Binary++++-- | Данне географической точки+data GeoPoint = GeoPoint { gp_lat :: Double+                         , gp_lon :: Double+                         }+                         deriving (Show, Eq, Typeable, Generic)++++-- | Цвет 3D+data Color3D = Color3D+             | ColorNull3D +             | ColorRGB_3D  Int Int Int+             | ColorRGBA_3D Int Int Int Int+             | ColorRGB_H_3D  String String String+             | ColorRGBA_H_3D String String String String+             | ColorH_3D String+             deriving (Eq, Typeable, Generic)++instance Show Color3D where+    show Color3D                  = "0xFFFFFF"+    show ColorNull3D              = "null"+    show (ColorRGB_3D    r g b  ) = "0x" ++ (showHex r "") ++ (showHex g "") ++ (showHex b "")+    show (ColorRGBA_3D   r g b a) = "0x" ++ (showHex r "") ++ (showHex g "") ++ (showHex b "") ++ (showHex a "")+    show (ColorRGB_H_3D  r g b  ) = "0x" ++ (map toUpper r) ++ (map toUpper g) ++ (map toUpper b)+    show (ColorRGBA_H_3D r g b a) = "0x" ++ (map toUpper r) ++ (map toUpper g) ++ (map toUpper b) ++ (map toUpper a)+    show (ColorH_3D      v      ) = "0x" ++ (map toUpper v)++++-- | Линейное положение в 2D пространстве+data Position2D = Position2D { v2d_posX :: Double+                             , v2d_posY :: Double+                             }+                             deriving (Show, Eq, Typeable, Generic)++-- | Линейное положение в 3D пространстве+data Position3D = Position3D { v3d_posX :: Double+                             , v3d_posY :: Double+                             , v3d_posZ :: Double+                             }+                             deriving (Show, Eq, Typeable, Generic)++++-- | Угловое положение в 2D пространстве+data Rotation2D = Rotation2D { v2d_rotZ :: Double+                             }+                             deriving (Show, Eq, Typeable, Generic)++-- | Угловое положение в 3D пространстве+data Rotation3D = Rotation3D { v3d_rotX :: Double+                             , v3d_rotY :: Double+                             , v3d_rotZ :: Double+                             }+                             deriving (Show, Eq, Typeable, Generic)++++-- | Масштаб в 2D пространстве+data Scale2D = Scale2D { v2d_sclX :: Double+                       , v2d_sclY :: Double+                       }+                       deriving (Show, Eq, Typeable, Generic)++-- | Масштаб в 3D пространстве+data Scale3D = Scale3D { v3d_sclX :: Double+                       , v3d_sclY :: Double+                       , v3d_sclZ :: Double+                       }+                       deriving (Show, Eq, Typeable, Generic)++++-- | Вектор в 2D пространстве+data Vector2D = Vector2D { v2d_x :: Double+                         , v2d_y :: Double+                         }+                         deriving (Show, Eq, Typeable, Generic)++-- | Вектор в 3D пространстве+data Vector3D = Vector3D { v3d_x :: Double+                         , v3d_y :: Double+                         , v3d_z :: Double+                         }+                         deriving (Show, Eq, Typeable, Generic)++++-- | Синоним типа для имени родителького объекта+type ParentName = String ++++-- | Синоним типа для UUID+type UUID_2D = String +type UUID_3D = String ++++instance Binary GeoPoint+instance Binary Color3D+instance Binary Position2D+instance Binary Position3D+instance Binary Rotation2D+instance Binary Rotation3D+instance Binary Scale2D+instance Binary Scale3D+instance Binary Vector2D+instance Binary Vector3D++++$(deriveJSON defaultOptions ''GeoPoint)+$(deriveJSON defaultOptions ''Color3D)+$(deriveJSON defaultOptions ''Position2D)+$(deriveJSON defaultOptions ''Position3D)+$(deriveJSON defaultOptions ''Rotation2D)+$(deriveJSON defaultOptions ''Rotation3D)+$(deriveJSON defaultOptions ''Scale2D)+$(deriveJSON defaultOptions ''Scale3D)+$(deriveJSON defaultOptions ''Vector2D)+$(deriveJSON defaultOptions ''Vector3D)+++
+ src/Hydrogen/Tool/TBuilder3D.hs view
@@ -0,0 +1,532 @@+----------------------------------------------------------------+-- Модуль библиотеки Hydrogen+-- Инструменты для модели данных (Tool)+-- Генератор сцены 3D +----------------------------------------------------------------++module Hydrogen.Tool.TBuilder3D+    ( CBuilder3D         (..)+    , CBuilderModel3D    (..)+    , CBuilderFragment3D (..)+    ) where++-- Импорт модулей+import           Prelude                                     as PRL++import           Data.Char                                      (toLower)+import           Data.String.Utils                              (replace)++import           Text.Julius++import           Hydrogen.Model.MScene3D++import           Hydrogen.Tool.TScene3D++import           WebUI.HFitUI+import           WebUI.Scripts.JavaScript.HJavaScript++import           Hydrogen.HydroCore+import           Hydrogen.Model.MSceneGeneral++++-----------------------------------------------------------------------------------------------+-- Материалы   --------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------++instance CBuilder3D [Material] where+    build3D _   []     parentName = do +        endBuild+    build3D c (x:xs) parentName = do+        build3D c x  parentName+        build3D c xs parentName+        +++instance CBuilder3D Material where+    build3D _ (Material _ _) _ = do+        endBuild++    -- | MaterialLambert+    build3D _ (MaterialLambert name uuid color emissive emissiveIntensity opacity transparent script) _ = do+        varName <- return $ genVarName "material" uuid+        hjs $[julius| var #{rawJS varName} = new THREE.MeshLambertMaterial( { color: #{rawJS (show color)}, emissive: #{rawJS (show emissive)}, emissiveIntensity: #{rawJS (show emissiveIntensity)}, opacity: #{rawJS (show opacity)}, transparent: #{rawJS (showBool transparent)} } ); |]+        hjs $[julius| (function(material){ #{rawJS script} })( #{rawJS varName} ); |]+        endBuild++    -- | MaterialBasic+    build3D _ (MaterialBasic name uuid texture opacity transparent script) _ = do+        varName <- return $ genVarName "material" uuid+        hjs $[julius| var #{rawJS varName} = new THREE.MeshBasicMaterial( { map: new THREE.TextureLoader().load("/texture_3d/#{rawJS texture}") , opacity: #{rawJS (show opacity)}, transparent: #{rawJS (showBool transparent)} } ); |]+        hjs $[julius| (function(material){ #{rawJS script} })( #{rawJS varName} ); |]+        endBuild++    -- | MaterialFace+    build3D _ (MaterialFace name uuid texture opacity transparent script) _ = do+        varName <- return $ genVarName "material" uuid+        hjs $[julius| var #{rawJS varName} = new THREE.MeshFaceMaterial([ new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture("/texture_3d/#{rawJS texture}?nm=0"), side: THREE.BackSide } )+                                                                        , new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture("/texture_3d/#{rawJS texture}?nm=1"), side: THREE.BackSide } )+                                                                        , new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture("/texture_3d/#{rawJS texture}?nm=2"), side: THREE.BackSide } )+                                                                        , new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture("/texture_3d/#{rawJS texture}?nm=3"), side: THREE.BackSide } )+                                                                        , new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture("/texture_3d/#{rawJS texture}?nm=4"), side: THREE.BackSide } )+                                                                        , new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture("/texture_3d/#{rawJS texture}?nm=5"), side: THREE.BackSide } )+                                                                        ]); +        |]+        hjs $[julius| (function(material){ #{rawJS script} })( #{rawJS varName} ); |]+        endBuild++++++-----------------------------------------------------------------------------------------------+-- Камера   -----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------++instance CBuilder3D Camera3D where+    build3D _ Camera3D _ = do+        endBuild++    build3D app (CameraPerspective3D name uuid position scale fov near far zoom (Vector3D upX upY upZ) script children) parentName = do+        hjs $[julius| +            camera = new THREE.PerspectiveCamera( #{rawJS (show fov)}, window.innerWidth / window.innerHeight, #{rawJS (show near)}, #{rawJS (show far)} );+            camera.up.set( #{rawJS (show upX)}, #{rawJS (show upY)}, #{rawJS (show upZ)});+            camera.position.set( #{rawJS (show $ v3d_posX position)} , #{rawJS (show $ v3d_posY position)} , #{rawJS (show $ v3d_posZ position)} );+            scene.add(camera);+        |]+        build3D app children "camera"+        endBuild++++++-----------------------------------------------------------------------------------------------+-- Фигуры   -----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------++instance CBuilder3D [Figure3D] where+    build3D _   []     parentName = do +        endBuild+    build3D app (x:xs) parentName = do+        build3D app x  parentName+        build3D app xs parentName+        +++instance CBuilder3D Figure3D where+    build3D _ Figure3D _ = do+        endBuild++    -- | Group 3D+    build3D app (FGroup3D name uuid flagDraw position rotation scale script children) parentName = +        case flagDraw of+            True  -> do varName <- return $ genVarName "group" uuid+                        hjs $[julius| var #{rawJS varName} = new THREE.Group(); |]+                        buildPosRotScale varName position rotation scale+                        hjs $[julius| (function(figure){ #{rawJS script} })( #{rawJS varName} );  |]+                        hjs $[julius| #{rawJS parentName}.add(#{rawJS varName}); |]+                        build3D app children varName+                        endBuild+            False -> do endBuild++    -- | VGroup 3D+    build3D app (FVGroup3D name uuid flagDraw children) parentName = +        case flagDraw of+            True  -> do build3D app children parentName +                        endBuild+            False -> do endBuild++    -- | Model 3D+    build3D app (FModel3D name uuid flagDraw material position rotation scale model script) parentName = do+        case flagDraw of+            True  -> do model3D <- liftIO $ loadModel3D app model +                        buildModel3D app model3D parentName (material, position, rotation, scale, script)+                        endBuild+            False -> do endBuild++    -- | Fragment 3D+    build3D app (FFragment3D name uuid flagDraw position rotation scale scene script) parentName = do+        case flagDraw of+            True  -> do scene3D <- liftIO $ loadScene3D app scene+                        buildFragment3D app scene3D parentName (uuid, position, rotation, scale, script)+                        endBuild+            False -> do endBuild++    -- | AmbientLight 3D+    build3D _ (FLAmbientLight3D name uuid flagDraw color intensity script) parentName = do+        case flagDraw of+            True  -> do varName <- return $ genVarName "light" uuid+                        hjs $[julius| var #{rawJS varName} = new THREE.AmbientLight( #{rawJS color} , #{rawJS (show intensity)} ); |]+                        hjs $[julius| (function(light){ #{rawJS script} })( #{rawJS varName} ); |]+                        hjs $[julius| #{rawJS parentName}.add(#{rawJS varName}); |]+                        endBuild+            False -> do endBuild++    -- | PointLight 3D+    build3D _ (FLPointLight3D name uuid flagDraw color intensity distance decay position script) parentName = do+        case flagDraw of+            True  -> do varName <- return $ genVarName "light" uuid+                        hjs $[julius| var #{rawJS varName} = new THREE.PointLight( #{rawJS color} , #{rawJS (show intensity)} , #{rawJS (show distance)} , #{rawJS (show decay)}); |]+                        hjs $[julius| #{rawJS varName}.position.set( #{rawJS (show $ v3d_posX position)} , #{rawJS (show $ v3d_posY position)} , #{rawJS (show $ v3d_posZ position)} ); |]+                        hjs $[julius| (function(light){ #{rawJS script} })( #{rawJS varName} ); |]+                        hjs $[julius| #{rawJS parentName}.add(#{rawJS varName}); |]+                        endBuild+            False -> do endBuild++    -- | DirectionalLight 3D+    build3D _ (FLDirectionalLight3D name uuid flagDraw color intensity position script) parentName = do+        case flagDraw of+            True  -> do varName <- return $ genVarName "light" uuid+                        hjs $[julius| var #{rawJS varName} = new THREE.DirectionalLight( #{rawJS color} , #{rawJS (show intensity)} ); |]+                        hjs $[julius| #{rawJS varName}.position.set( #{rawJS (show $ v3d_posX position)} , #{rawJS (show $ v3d_posY position)} , #{rawJS (show $ v3d_posZ position)} ); |]+                        hjs $[julius| (function(light){ #{rawJS script} })( #{rawJS varName} ); |]+                        hjs $[julius| #{rawJS parentName}.add(#{rawJS varName}); |]+                        endBuild+            False -> do endBuild++    -- | HemisphereLight 3D+    build3D _ (FLHemisphereLight3D name uuid flagDraw colorSky colorGround intensity position script) parentName = do+        case flagDraw of+            True  -> do varName <- return $ genVarName "light" uuid+                        hjs $[julius| var #{rawJS varName} = new THREE.HemisphereLight( #{rawJS colorSky} , #{rawJS colorGround} , #{rawJS (show intensity)} ); |]+                        hjs $[julius| #{rawJS varName}.position.set( #{rawJS (show $ v3d_posX position)} , #{rawJS (show $ v3d_posY position)} , #{rawJS (show $ v3d_posZ position)} ); |]+                        hjs $[julius| (function(light){ #{rawJS script} })( #{rawJS varName} ); |]+                        hjs $[julius| #{rawJS parentName}.add(#{rawJS varName}); |]+                        endBuild+            False -> do endBuild++    -- | SpotLight 3D+    build3D _ (FLSpotLight3D name uuid flagDraw color intensity distance angle penumbra decay position script) parentName = do+        case flagDraw of+            True  -> do varName <- return $ genVarName "light" uuid+                        hjs $[julius| var #{rawJS varName} = new THREE.SpotLight( #{rawJS color} , #{rawJS (show intensity)} , #{rawJS (show distance)} , #{rawJS (show angle)} , #{rawJS (show penumbra)} , #{rawJS (show decay)} ); |]+                        hjs $[julius| #{rawJS varName}.position.set( #{rawJS (show $ v3d_posX position)} , #{rawJS (show $ v3d_posY position)} , #{rawJS (show $ v3d_posZ position)} ); |]+                        hjs $[julius| (function(light){ #{rawJS script} })( #{rawJS varName} ); |]+                        hjs $[julius| #{rawJS parentName}.add(#{rawJS varName}); |]+                        endBuild+            False -> do endBuild++    -- | Box 3D+    build3D _ (FBox3D name uuid flagDraw material position rotation scale sizeX sizeY sizeZ script) parentName = do+        case flagDraw of+            True  -> do varName         <- return $ genVarName "figure"   uuid+                        varMaterialName <- return $ genVarName "material" material+                        hjs $[julius| var #{rawJS varName} = new THREE.Mesh( new THREE.BoxGeometry( #{rawJS (show sizeX)} , #{rawJS (show sizeY)} , #{rawJS (show sizeZ)} ) , #{rawJS  varMaterialName} ); |]+                        buildPosRotScale varName position rotation scale+                        hjs $[julius| (function(figure, material){ #{rawJS script} })( #{rawJS varName} , #{rawJS varMaterialName} ); |]+                        hjs $[julius| #{rawJS parentName}.add(#{rawJS varName}); |]+                        endBuild+            False -> do endBuild++    -- | Plane 3D+    build3D _ (FPlane3D name uuid flagDraw material position rotation scale sizeX sizeY script) parentName = do+        case flagDraw of+            True  -> do varName         <- return $ genVarName "figure"   uuid+                        varMaterialName <- return $ genVarName "material" material+                        hjs $[julius| var #{rawJS varName} = new THREE.Mesh( new THREE.PlaneGeometry( #{rawJS (show sizeX)} , #{rawJS (show sizeY)} ) , #{rawJS  varMaterialName} ); |]+                        buildPosRotScale varName position rotation scale+                        hjs $[julius| (function(figure, material){ #{rawJS script} })( #{rawJS varName} , #{rawJS varMaterialName} ); |]+                        hjs $[julius| #{rawJS parentName}.add(#{rawJS varName}); |]+                        endBuild+            False -> do endBuild++    -- | Script 3D+    build3D _ (FScript3D name uuid flagDraw material position rotation scale flagExt params scriptDo script) parentName = do+        case (flagDraw, flagExt) of+            (True, False) -> do varName         <- return $ genVarName "figure"   uuid+                                varMaterialName <- return $ genVarName "material" material+                                varParamsName   <- return $ genVarName "params"   uuid+                                hjs $[julius| var #{rawJS varParamsName} = #{rawJS (show params)}; |]+                                hjs $[julius| var #{rawJS varName} = (function(material, params){ #{rawJS scriptDo} })( #{rawJS varMaterialName}, #{rawJS varParamsName} ); |]+                                buildPosRotScale varName position rotation scale+                                hjs $[julius| (function(figure, material){ #{rawJS script} })( #{rawJS varName} , #{rawJS varMaterialName} ); |]+                                hjs $[julius| #{rawJS parentName}.add(#{rawJS varName}); |]+                                endBuild+            (True, True)  -> do varName         <- return $ genVarName "figure"   uuid+                                varMaterialName <- return $ genVarName "material" material+                                varParamsName   <- return $ genVarName "params"   uuid+                                hjs $[julius| var #{rawJS varParamsName} = #{rawJS (show params)}; |]++                                hjs $[julius| +                                    var #{rawJS varName} = (function(material, params, parent, px, py, pz, rx, ry, rz, sx, sy, sz){ #{rawJS scriptDo} +                                    })( #{rawJS varMaterialName}, #{rawJS varParamsName}, #{rawJS parentName}+                                      , #{rawJS (show $ v3d_posX position)} , #{rawJS (show $ v3d_posY position)} , #{rawJS (show $ v3d_posZ position)}+                                      , #{rawJS (show $ v3d_rotX rotation)} , #{rawJS (show $ v3d_rotY rotation)} , #{rawJS (show $ v3d_rotZ rotation)}+                                      , #{rawJS (show $ v3d_sclX scale)} , #{rawJS (show $ v3d_sclY scale)} , #{rawJS (show $ v3d_sclZ scale)}+                                      );+                                |]++                                hjs $[julius| (function(figure, material){ #{rawJS script} })( #{rawJS varName} , #{rawJS varMaterialName} ); |]+                                endBuild+            (False, _)    -> do endBuild++    -- | EntityCamera 3D +    build3D _ (FEntityCamera3D name uuid flagDraw position rotation scale params source (ECOptions3D fdFC clrC geomC scaleC) opacity scrnSide screens script) parentName = do+        case flagDraw of+            True  -> do varName      <- return $ genVarName "entityCamera" uuid+                        hjs $[julius| var #{rawJS varName} = (function(){ |]+                        +                        hjs $[julius| +                            var video = document.createElement( 'video' );+                            video.id = 'VID_#{rawJS uuid}';+                            video.src = "#{rawJS source}";+                            video.loop = true;+                            video.muted = true;+                            video.load();+                            video.play();++                            var videoTexture = new THREE.VideoTexture( video );+                            videoTexture.minFilter = THREE.LinearFilter;+                            videoTexture.magFilter = THREE.LinearFilter;+                            videoTexture.format = THREE.RGBFormat;+                        |]++                        if opacity > 0.0 && opacity < 1.0+                        then hjs $[julius| var movieMaterial = new THREE.MeshBasicMaterial( { map: videoTexture, overdraw: true, side:THREE.FrontSide, opacity: #{rawJS (show opacity)}, transparent: true } ); |]+                        else hjs $[julius| var movieMaterial = new THREE.MeshBasicMaterial( { map: videoTexture, overdraw: true, side:THREE.FrontSide } ); |]+                        +                        case scrnSide of+                            "FrontSide"  -> do hjs $[julius| movieMaterial.side = THREE.FrontSide;  |]+                            "BackSide"   -> do hjs $[julius| movieMaterial.side = THREE.BackSide;   |]+                            "DoubleSide" -> do hjs $[julius| movieMaterial.side = THREE.DoubleSide; |]++                        hjs $[julius| var entityGroup = new THREE.Group(); |]+                        buildPosRotScale "entityGroup" position rotation scale++                        if fdFC == True+                        then hjs $[julius| +                                var meshCamera = new THREE.Mesh( new THREE.ConeGeometry(1*#{rawJS (show geomC)}, 1, 4), new THREE.MeshBasicMaterial({color: #{rawJS clrC}, wireframe: true}) );+                                meshCamera.rotation.x = -Math.PI/2;+                                meshCamera.scale.x = meshCamera.scale.y = meshCamera.scale.z = #{rawJS (show scaleC)};+                                entityGroup.add(meshCamera);+                             |]+                        else endBuild++                        mapM_ buildECScreen3D screens++                        --hjs $[julius| var #{rawJS varName} = new THREE.Mesh( new THREE.PlaneGeometry( #{rawJS (show sizeX)} , #{rawJS (show sizeY)} ) , #{rawJS  varMaterialName} ); |]+                        --buildPosRotScale varName position rotation scale+                        --hjs $[julius| (function(figure, material){ #{rawJS script} })( #{rawJS varName} , #{rawJS varMaterialName} ); |]+                        hjs $[julius| #{rawJS parentName}.add(entityGroup); |]+                        hjs $[julius| return entityGroup; |]+                        hjs $[julius| })(); |]+                        endBuild+            False -> do endBuild+        where+            buildECScreen3D :: ECScreen3D -> HSL HLangJS ()+            buildECScreen3D (ECScreen3D nmb  szx szy  px py pz  rx ry rz  sx sy sz  dx0 dy0 dz0  dx1 dy1 dz1  dx2 dy2 dz2  dx3 dy3 dz3  ax0 ay0  ax1 ay1  ax2 ay2  ax3 ay3) = do+                hjs $[julius|+ +                    var area_#{rawJS (show nmb)} = [ new THREE.Vector2( #{rawJS (show ax0)} , #{rawJS (show ay0)} )+                                                   , new THREE.Vector2( #{rawJS (show ax1)} , #{rawJS (show ay1)} )+                                                   , new THREE.Vector2( #{rawJS (show ax2)} , #{rawJS (show ay2)} )+                                                   , new THREE.Vector2( #{rawJS (show ax3)} , #{rawJS (show ay3)} )+                                                   ];++                    var movieGeometry_#{rawJS (show nmb)} = new THREE.PlaneGeometry(2.5, 2.5);+                    movieGeometry_#{rawJS (show nmb)}.faceVertexUvs[0][0] = [ area_#{rawJS (show nmb)}[0], area_#{rawJS (show nmb)}[3], area_#{rawJS (show nmb)}[1] ];+                    movieGeometry_#{rawJS (show nmb)}.faceVertexUvs[0][1] = [ area_#{rawJS (show nmb)}[3], area_#{rawJS (show nmb)}[2], area_#{rawJS (show nmb)}[1] ];++                    var movieScreen_#{rawJS (show nmb)} = new THREE.Mesh( movieGeometry_#{rawJS (show nmb)}, movieMaterial );++                    movieScreen_#{rawJS (show nmb)}.geometry.vertices[0].x = movieScreen_#{rawJS (show nmb)}.geometry.vertices[0].x + #{rawJS (show dx0)}+                    movieScreen_#{rawJS (show nmb)}.geometry.vertices[0].y = movieScreen_#{rawJS (show nmb)}.geometry.vertices[0].y + #{rawJS (show dy0)}+                    movieScreen_#{rawJS (show nmb)}.geometry.vertices[0].z = movieScreen_#{rawJS (show nmb)}.geometry.vertices[0].z + #{rawJS (show dz0)}++                    movieScreen_#{rawJS (show nmb)}.geometry.vertices[1].x = movieScreen_#{rawJS (show nmb)}.geometry.vertices[1].x + #{rawJS (show dx1)}+                    movieScreen_#{rawJS (show nmb)}.geometry.vertices[1].y = movieScreen_#{rawJS (show nmb)}.geometry.vertices[1].y + #{rawJS (show dy1)}+                    movieScreen_#{rawJS (show nmb)}.geometry.vertices[1].z = movieScreen_#{rawJS (show nmb)}.geometry.vertices[1].z + #{rawJS (show dz1)}++                    movieScreen_#{rawJS (show nmb)}.geometry.vertices[2].x = movieScreen_#{rawJS (show nmb)}.geometry.vertices[2].x + #{rawJS (show dx2)}+                    movieScreen_#{rawJS (show nmb)}.geometry.vertices[2].y = movieScreen_#{rawJS (show nmb)}.geometry.vertices[2].y + #{rawJS (show dy2)}+                    movieScreen_#{rawJS (show nmb)}.geometry.vertices[2].z = movieScreen_#{rawJS (show nmb)}.geometry.vertices[2].z + #{rawJS (show dz2)}++                    movieScreen_#{rawJS (show nmb)}.geometry.vertices[3].x = movieScreen_#{rawJS (show nmb)}.geometry.vertices[3].x + #{rawJS (show dx3)}+                    movieScreen_#{rawJS (show nmb)}.geometry.vertices[3].y = movieScreen_#{rawJS (show nmb)}.geometry.vertices[3].y + #{rawJS (show dy3)}+                    movieScreen_#{rawJS (show nmb)}.geometry.vertices[3].z = movieScreen_#{rawJS (show nmb)}.geometry.vertices[3].z + #{rawJS (show dz3)}++                |]++                buildPosRotScale ("movieScreen_" ++ (show nmb)) (Position3D px py pz) (Rotation3D rx ry rz) (Scale3D sx sy sz)++                hjs $[julius|+                    entityGroup.add(movieScreen_#{rawJS (show nmb)});++                |]+                return () ++++++-----------------------------------------------------------------------------------------------+-- Модели   -----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------++instance CBuilderModel3D [Model3D] where+    buildModel3D _   []     parentName _ = do +        endBuild+    buildModel3D app (x:xs) parentName mprss = do+        buildModel3D app x  parentName mprss+        buildModel3D app xs parentName mprss+        +++instance CBuilderModel3D Model3D where+    buildModel3D _ Model3D _ _ = do+        endBuild++    buildModel3D _ (Model3D_Obj name uuid version author descr tags cntObjs cntMtls) parentName (material, position, rotation, scale, script) = +        if cntMtls == []+        then do varMaterialName <- return $ genVarName "material" material+                hjs $[julius| (function(material){ |]+                hjs $[julius| +                    var objLoader = new THREE.OBJLoader();+                    objLoader.load("/model_3d/obj/#{rawJS uuid}", function(object) {+                    object.traverse(function(child) {+                        if (child instanceof THREE.Mesh){+                            child.material = material;+                        }+                    });+                |]+                buildPosRotScale "object" position rotation scale+                hjs $[julius| (function(figure){ #{rawJS script} })( object ); |]+                hjs $[julius| +                        ;#{rawJS parentName}.add(object);+                    });+                |]+                hjs $[julius| })(#{rawJS varMaterialName}); |]+                endBuild+        else do hjs $[julius| (function(){ |]+                hjs $[julius| +                    var mtlLoader = new THREE.MTLLoader();+                    mtlLoader.load("/model_3d/mtl/#{rawJS uuid}", function(materials) {+                        materials.preload();+                        var objLoader = new THREE.OBJLoader();+                        objLoader.setMaterials(materials);+                        objLoader.load("/model_3d/obj/#{rawJS uuid}", function(object) {+                |]+                buildPosRotScale "object" position rotation scale+                hjs $[julius| (function(figure){ #{rawJS script} })( object ); |]+                hjs $[julius| +                            ;#{rawJS parentName}.add(object);+                        });+                    });+                |]+                hjs $[julius| })(); |]+                endBuild++    buildModel3D _ (Model3D_Json name uuid version author descr tags contants) parentName (material, position, rotation, scale, script) = do +        varMaterialName <- return $ genVarName "material" material+        hjs $[julius| (function(){ |]+        hjs $[julius| +            var jsonLoader = new THREE.JSONLoader();+            jsonLoader.load("/model_3d/json/#{rawJS uuid}", function(geometry) {+            var mesh = new THREE.Mesh(geometry, #{rawJS varMaterialName});+        |]+        buildPosRotScale "mesh" position rotation scale+        hjs $[julius| (function(figure){ #{rawJS script} })( mesh ); |]+        hjs $[julius| +                ;#{rawJS parentName}.add(mesh);+            });+        |]+        hjs $[julius| })(); |]+        endBuild++++++-----------------------------------------------------------------------------------------------+-- Фрагменты   --------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------++instance CBuilderFragment3D [Scene3D] where+    buildFragment3D _   []     parentName _ = do +        endBuild+    buildFragment3D app (x:xs) parentName fprss = do+        buildFragment3D app x  parentName fprss+        buildFragment3D app xs parentName fprss+        +++instance CBuilderFragment3D Scene3D where+    buildFragment3D app scene3D parentName (uuid, position, rotation, scale, script) = do+        uuidScene <- return $ s3d_uuid scene3D+        varName   <- return $ genVarName "fragment" uuid+        varFSName <- return $ genVarName "fragment" uuidScene+        hjs $[julius| /* FragmentBegin. UUID: #{rawJS uuid} */  |]+        hjs $[julius| var #{rawJS varName} = (function(){ |]+        hjs $[julius| var #{rawJS varFSName} = new THREE.Group(); |]+        buildPosRotScale varFSName position rotation scale+        build3D app (s3d_materials scene3D) ""+        build3D app (s3d_children  scene3D) varFSName +        hjs $[julius| return #{rawJS varFSName}; })(); |]+        hjs $[julius| #{rawJS parentName}.add(#{rawJS varName}); |]+        hjs $[julius| /* FragmentEnd. UUID: #{rawJS uuid} */  |]+        endBuild++++++-----------------------------------------------------------------------------------------------+-- Вспомогательные инструменты   --------------------------------------------------------------+-----------------------------------------------------------------------------------------------++-- | Генерация имени переменной+genVarName :: String +           -> UUID_3D +           -> String+genVarName prefix uuid =+    if uuid == ""+    then "null"+    else let p = replace "-" "" uuid in+         prefix ++ p++++-- | Генерация имени переменной материала+genVarMatName :: UUID_3D +              -> String+genVarMatName uuid = genVarName "material" uuid++++-- | Генерация имени переменной фмгуры+genVarFigName :: UUID_3D +              -> String+genVarFigName uuid = genVarName "figure" uuid++++-- | Перевод Bool в строку для скрипта+showBool :: Bool+         -> String+showBool flag = +    map toLower $ show flag++++-- | Окончание построения сцены+buildPosRotScale :: String+                 -> Position3D+                 -> Rotation3D+                 -> Scale3D+                 -> HSL HLangJS HLangJS+buildPosRotScale varName position rotation scale = do+    hjs $[julius| #{rawJS varName}.position.set( #{rawJS (show $ v3d_posX position)} , #{rawJS (show $ v3d_posY position)} , #{rawJS (show $ v3d_posZ position)} ); |]+    hjs $[julius| #{rawJS varName}.rotation.set( #{rawJS (show $ v3d_rotX rotation)} , #{rawJS (show $ v3d_rotY rotation)} , #{rawJS (show $ v3d_rotZ rotation)} ); |]+    hjs $[julius| #{rawJS varName}.scale.set( #{rawJS (show $ v3d_sclX scale)} , #{rawJS (show $ v3d_sclY scale)} , #{rawJS (show $ v3d_sclZ scale)} ); |]+    ++++-- | Окончание построения сцены+endBuild :: HSL HLangJS HLangJS+endBuild = do+    return $ hl HJsEmpty+++
+ src/Hydrogen/Tool/TGeneratorS3D.hs view
@@ -0,0 +1,277 @@+----------------------------------------------------------------+-- Модуль библиотеки Hydrogen+-- Инструменты для модели данных (Tool)+-- Генератор WebGL кода сцены 3D +----------------------------------------------------------------++module Hydrogen.Tool.TGeneratorS3D+    ( +    ) where++-- Импорт модулей+import           Prelude                                     as PRL++import           Data.Char                                      (toLower)+import           Data.String.Utils                              (replace)++import           Text.Julius++import           WebUI.HFitUI+import           WebUI.Scripts.JavaScript.HJavaScript+import           WebUI.Themes.SolarizedUITheme++import           ThreeJS.HThreeJS++import           WebUI.HFitUI+import           WebUI.Scripts.JavaScript.HJavaScript++import           Hydrogen.HydroCore+import           Hydrogen.Model.MSceneGeneral+import           Hydrogen.Model.MScene3D++import           Hydrogen.Tool.TScene3D+import           Hydrogen.Tool.TBuilder3D++++instance CHydrogenScene Scene3D String String String where+    buildHydroScene app scene3D idRoot idCanvas sopts = generateWGLScene3D app scene3D idRoot idCanvas sopts++++-- | Сгенерировать WGL код сцены 3D+generateWGLScene3D :: (CContext3D c KeyContext3D String) +                   => c                     -- ^ Контекст приложения в котором генерируется сцена+                   -> Scene3D               -- ^ Модель 3D сцены+                   -> String                -- ^ ID корневого элемента+                   -> String                -- ^ ID холста+                   -> String                -- ^ Опиции 3D сцены+                   -> HSL HLangJS HLFinish  -- ^ Результат+--generateWGLScene3D _   SceneEmpty _ _ _ = do+--    return endH+--generateWGLScene3D _   (Scene2D {}) _ _ _ = do+--    return endH+generateWGLScene3D app scene3D idRoot idCanvas sopts = do+    (//) "Автоматически сгенерированный скрипт"+    (//) "Приложение Hydrogen (0.0.1)"++    detectorWebGL >> hjsBR ++    var_camera    <- newVar "camera"    HJsEmpty+    var_scene     <- newVar "scene"     HJsEmpty+    var_groupRoot <- newVar "groupRoot" HJsEmpty+    var_root      <- newVar "root"      $ getElementById idRoot+    var_canvas3D  <- newVar "canvas3D"  $ getElementById idCanvas +    var_renderer  <- newVar "renderer"  HJsEmpty+    var_stats     <- newVar "stats"     HJsEmpty++    -- | Управление в 3D сцене+    hjs $[julius|+        var orbitControls = null;+        var flyControls = null;+    |]++    hjsBR++    -- Рендер сцены+    varFn_render <- functJS "render" [] $ do +        hjs $[julius| renderer.render(scene, camera); |]+        return endH++    hjsBR++    -- Обновление+    varFn_update <- functJS "update" [] $ do +        hjs $[julius| if(stats) stats.update(); |]+        hjs $[julius| if(flyControls) flyControls.update(1); |]+        return endH++    hjsBR++    -- Анимация+    varFn_animate <- functJS "animate" [] $ do +        hjs $[julius| requestAnimationFrame(animate); |]+        call varFn_render []+        call varFn_update []+        return endH++    hjsBR++    -- Отработка изменения размера окна+    varFn_onWindowResize <- functJS "onWindowResize" [] $ do +        hjs $[julius|    +            if (camera) {+                camera.aspect = window.innerWidth / (window.innerHeight);+                camera.updateProjectionMatrix();+            }+            renderer.setSize( window.innerWidth, window.innerHeight);+        |]+        call varFn_render []+        return endH++    hjsBR+    +    -- Отрисовка корневых осей сцены+    varFn_drawRootAxes <- functJS "drawRootAxes" [] $ do +        hjs $[julius|+            var dirX = new THREE.Vector3( 1, 0, 0 ); dirX.normalize();+            var dirY = new THREE.Vector3( 0, 1, 0 ); dirY.normalize();+            var dirZ = new THREE.Vector3( 0, 0, 1 ); dirZ.normalize();++            var origin = new THREE.Vector3( 0, 0, 0 );+            var length = 1;++            var hexX = 0xff0000;+            var hexY = 0x00ff00;+            var hexZ = 0x0000ff;++            scene.add(new THREE.ArrowHelper(dirX, origin, length, hexX));+            scene.add(new THREE.ArrowHelper(dirY, origin, length, hexY));+            scene.add(new THREE.ArrowHelper(dirZ, origin, length, hexZ));+        |]+        return endH++    hjsBR++    -- Инициализация+    varFn_init <- functJS "init" [] $ do ++        hjs $[julius|+            scene = new THREE.Scene();++            groupRoot = new THREE.Group();+            groupRoot.position.set( #{rawJS (show $ v3d_posX $ s3d_position scene3D)} , #{rawJS (show $ v3d_posY $ s3d_position scene3D)} , #{rawJS (show $ v3d_posZ $ s3d_position scene3D)} );+            groupRoot.rotation.set( #{rawJS (show $ v3d_rotX $ s3d_rotation scene3D)} , #{rawJS (show $ v3d_rotY $ s3d_rotation scene3D)} , #{rawJS (show $ v3d_rotZ $ s3d_rotation scene3D)} );+            groupRoot.scale.set( #{rawJS (show $ v3d_sclX $ s3d_scale scene3D)} , #{rawJS (show $ v3d_sclY $ s3d_scale scene3D)} , #{rawJS (show $ v3d_sclZ $ s3d_scale scene3D)} );+            scene.add(groupRoot);++            var grid = new THREE.GridHelper( 25, 50, #{rawJS (replace "#" "0x" thC_01)}, #{rawJS (replace "#" "0x" thC_02)} );+            grid.rotateOnAxis( new THREE.Vector3( 1, 0, 0 ), 90 * ( Math.PI/180 ) );+            groupRoot.add(grid);+        |]+           +        call varFn_drawRootAxes [] ++        hjs $[julius|+            renderer = new THREE.WebGLRenderer({canvas: canvas3D, antialias: #{rawJS (parsSOpts_Antialias sopts)}});+            renderer.setClearColor( #{rawJS (replace "#" "0x" thC_03)} );+            renderer.setPixelRatio( window.devicePixelRatio );+            renderer.setSize( window.innerWidth, window.innerHeight );+            renderer.sortObjects = false;+        |]+++        -- | Отрисовка сцены 3D генерацией скрипта ThreeJS для+        -- создания WebGL сцены+        drawScene3D app scene3D+++        -- | Управление в 3D сцене+        case parsSOpts_Control sopts of+            'o' -> hjs $[julius|+                        orbitControls = new THREE.OrbitControls(camera, renderer.domElement);+                        orbitControls.addEventListener('change', render);+                        orbitControls.target.set(0, 0, 0);+                        orbitControls.update();+                   |]+            'f' -> hjs $[julius|+                        flyControls = new THREE.FlyControls(camera);+                        flyControls.movementSpeed = 0.1;+                        flyControls.rollSpeed = Math.PI / 460;+                        flyControls.autoForward = false;+                        flyControls.dragToLook = true;+                   |]+            'n'-> return endH +            _  -> return endH +++        -- | Статистика работы 3D сцены+        if parsSOpts_Stats sopts+        then hjs $[julius|+                stats = new Stats();+                root.appendChild(stats.dom);+             |]+        else return endH+++        -- | Отработка кода скрипта из 3D модели сцены+        hjs $[julius| (function(){ #{rawJS (s3d_script scene3D)} })();  |]+++        addEventListener "resize" varFn_onWindowResize False +        call varFn_animate []++        return endH++    -- Инициализация+    call varFn_init []++    jsFinish ++++-- | Отрисовка сцены 3D генерацией скрипта ThreeJS для+-- создания WebGL сцены+drawScene3D :: (CContext3D c KeyContext3D String)+            => c                    -- ^ Контекст приложения в котором генерируется сцена+            -> Scene3D              -- ^ Модель 3D сцены+            -> HSL HLangJS HLangJS  -- ^ Результат+drawScene3D app scene3D = do+    build3D app (s3d_materials scene3D) ""+    build3D app (s3d_camera    scene3D) "scene"+    build3D app (s3d_envirs    scene3D) "scene"+    build3D app (s3d_children  scene3D) "groupRoot"+    return $ hl HJsEmpty++++++-----------------------------------------------------------------------------------------------+-- Параметры сцены   --------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------++-- 1) o, f, n       - Controls: OrbitControls, FlyControls, None+-- 2) t, f          - Antialias: True, False+-- 3) (s | t), _    - Show stats: True, False+++-- | Парсим параметры сцены+-- Управление: o - OrbitControls+--             n - None+parsSOpts_Control :: String+                  -> Char+parsSOpts_Control []    = 'o'+parsSOpts_Control (x:_) = toLower x++++-- | Парсим параметры сцены+-- Сглаживание: t - true+--              _ - false+parsSOpts_Antialias :: String+                    -> String+parsSOpts_Antialias []        = "false"+parsSOpts_Antialias (_:[])    = "false"+parsSOpts_Antialias (_:(x:_)) = +    let f = toLower x in+    if f == 't' then "true" else "false"++++-- | Парсим параметры сцены+-- Stats: s - Stats+--        n - None+parsSOpts_Stats :: String+                -> Bool+parsSOpts_Stats [] = False+parsSOpts_Stats sopts = +    if (length sopts) > 2+    then case toLower (sopts!!2) of+        's' -> True+        't' -> True+        _   -> False+    else False+++
+ src/Hydrogen/Tool/TScene3D.hs view
@@ -0,0 +1,129 @@+----------------------------------------------------------------+-- Модуль приложения+-- Инструменты для модели данных (Tool)+-- Инструментарий сцены 3D +----------------------------------------------------------------++module Hydrogen.Tool.TScene3D+    ( parseSceneFile+    , loadScene3D+    , loadTexture3D+    , loadModel3D+    , sayDebugMessage+    ) where++-- Импорт модулей+import           Prelude                   as PRL++import           System.Directory++import           Data.String.Utils+import           Data.Yaml                 as YAML++import           Hydrogen.HydroCore+import           Hydrogen.Model.MSceneGeneral+import           Hydrogen.Model.MScene3D++++-----------------------------------------------------------------------------------------------+-- Работа с моделью 3D   ----------------------------------------------------------------------+-----------------------------------------------------------------------------------------------++-- | Разбор файла 3D сцены+parseSceneFile :: String+               -> IO Scene3D+parseSceneFile pathFile = +    either (error . show) id <$>+    decodeFileEither pathFile++++-- | Разбор файла 3D текстуры+parseTextureFile :: String+                 -> IO Texture3D+parseTextureFile pathFile = +    either (error . show) id <$>+    decodeFileEither pathFile++++-- | Разбор файла 3D текстуры+parseModelFile :: String+               -> IO Model3D+parseModelFile pathFile = +    either (error . show) id <$>+    decodeFileEither pathFile++++-- | Поиск файла в списке имен по фильтру+findFileFilter :: [String] +               -> String +               -> String+findFileFilter []     _    = ""+findFileFilter (x:xs) txtF = if (endswith txtF x) == True+                             then x+                             else findFileFilter xs txtF++++-- | Загрузить 3D сцену+loadScene3D :: (CContext3D a KeyContext3D String)+            => a            -- ^ Основной тип данных приложения+            -> UUID_3D      -- ^ UUID 3D сцены+            -> IO Scene3D   -- ^ 3D сцена+loadScene3D app uuid3D = do+    pathDir  <- return $ (contextGet app KeyScenesPath) ++ "/" ++ uuid3D+    contents <- getDirectoryContents pathDir+    file3D   <- return $ pathDir ++ "/" ++ (findFileFilter contents ".scene")+    flagIs3D <- doesFileExist file3D+    sayDebugMessage app $ "FILE SCENE: " ++ file3D+    if flagIs3D == True+    then parseSceneFile file3D+    else return emptyScene3D++++-- | Загрузить 3D текстуру+loadTexture3D :: (CContext3D a KeyContext3D String)+              => a              -- ^ Основной тип данных приложения+              -> UUID_3D        -- ^ UUID 3D текстуры+              -> IO Texture3D   -- ^ 3D текстура+loadTexture3D app uuid3D = do+    pathDir       <- return $ (contextGet app KeyTexturesPath) ++ "/" ++ uuid3D+    contents      <- getDirectoryContents pathDir+    fileTexture3D <- return $ pathDir ++ "/" ++ (findFileFilter contents ".tx")+    sayDebugMessage app $ "FILE TEXTURE: " ++ fileTexture3D+    texture3D  <- parseTextureFile fileTexture3D+    return texture3D++++-- | Загрузить 3D модель+loadModel3D :: (CContext3D a KeyContext3D String)+            => a              -- ^ Основной тип данных приложения+            -> UUID_3D        -- ^ UUID 3D модели+            -> IO Model3D     -- ^ 3D модель+loadModel3D app uuid3D = do+    pathDir     <- return $ (contextGet app KeyModelPath) ++ "/" ++ uuid3D+    contents    <- getDirectoryContents pathDir+    fileModel3D <- return $ pathDir ++ "/" ++ (findFileFilter contents ".d3d")+    sayDebugMessage app $ "FILE MODEL: " ++ fileModel3D+    model3D <- parseModelFile fileModel3D+    return model3D++++-- | Вывести отладочное сообщение+sayDebugMessage :: (CContext3D a KeyContext3D String)+                => a            -- ^ Основной тип данных приложения+                -> String       -- ^ Отладочное сообщение+                -> IO ()        -- ^ Результат+sayDebugMessage app message = do+    if (contextIsDebugMode cortegeKV app) == True +    then putStrLn message +    else return ()+++
+ src/ThreeJS/HThreeJS.hs view
@@ -0,0 +1,31 @@+----------------------------------------------------------------+-- Модуль приложения+-- Скрипты ThreeJS для WebGL (HThreeJS)+-- Фреймворк ThreeJS +----------------------------------------------------------------++module ThreeJS.HThreeJS+    ( detectorWebGL+    ) where++-- Импорт модулей+import           Prelude                                     as PRL++import           Data.Char                                      (toLower)+import           Data.String.Utils                              (strip)++import           WebUI.Scripts.HScript+import           WebUI.Scripts.JavaScript.HJavaScript++++-- | Детектор WebGL+detectorWebGL :: HSL HLangJS HLangJS +detectorWebGL = do  +    c <- ask+    hl <- return $ HL $ "if(!Detector.webgl) Detector.addGetWebGLMessage();" ++ (hbc_entryLine c)+    modify (:> hl)+    return hl+++
+ test/Spec.hs view
@@ -0,0 +1,2 @@+main :: IO ()+main = putStrLn "Test suite not yet implemented"