diff options
Diffstat (limited to 'js/lib/drawing/world.js')
-rwxr-xr-x | js/lib/drawing/world.js | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/js/lib/drawing/world.js b/js/lib/drawing/world.js index 049145ce..07a2c3ae 100755 --- a/js/lib/drawing/world.js +++ b/js/lib/drawing/world.js | |||
@@ -363,6 +363,7 @@ var World = function GLWorld( canvas, use3D, preserveDrawingBuffer ) { | |||
363 | if (this._useWebGL) { | 363 | if (this._useWebGL) { |
364 | rdgeStarted = true; | 364 | rdgeStarted = true; |
365 | this._canvas.rdgeid = this._canvas.getAttribute( "data-RDGE-id" ); | 365 | this._canvas.rdgeid = this._canvas.getAttribute( "data-RDGE-id" ); |
366 | g_Engine.unregisterCanvas( this._canvas ) | ||
366 | g_Engine.registerCanvas(this._canvas, this); | 367 | g_Engine.registerCanvas(this._canvas, this); |
367 | RDGEStart( this._canvas ); | 368 | RDGEStart( this._canvas ); |
368 | this._canvas.task.stop() | 369 | this._canvas.task.stop() |
@@ -729,6 +730,72 @@ World.prototype.getShapeFromPoint = function( offsetX, offsetY ) { | |||
729 | } | 730 | } |
730 | }; | 731 | }; |
731 | 732 | ||
733 | World.prototype.exportJSON = function() | ||
734 | { | ||
735 | // world properties | ||
736 | var worldObj = | ||
737 | { | ||
738 | 'version' : 1.1, | ||
739 | 'id' : this.getCanvas().getAttribute( "data-RDGE-id" ), | ||
740 | 'fov' : this._fov, | ||
741 | 'zNear' : this._zNear, | ||
742 | 'zFar' : this._zFar, | ||
743 | 'viewDist' : this._viewDist, | ||
744 | 'webGL' : this._useWebGL | ||
745 | }; | ||
746 | |||
747 | // RDGE scenegraph | ||
748 | if (this._useWebGL) | ||
749 | worldObj.scenedata = this.myScene.exportJSON(); | ||
750 | |||
751 | // object data | ||
752 | var strArray = []; | ||
753 | this.exportObjectsJSON( this._geomRoot, worldObj ); | ||
754 | |||
755 | // You would think that the RDGE export function | ||
756 | // would not be destructive of the data. You would be wrong... | ||
757 | // We need to rebuild everything | ||
758 | if (this._useWebGL) | ||
759 | { | ||
760 | var root = this._rootNode; | ||
761 | root.children = new Array(); | ||
762 | if (worldObj.children && (worldObj.children.length === 1)) | ||
763 | { | ||
764 | this.init(); | ||
765 | this._geomRoot = undefined; | ||
766 | this.importObjectsJSON( worldObj.children[0] ); | ||
767 | } | ||
768 | } | ||
769 | |||
770 | // convert the object to a string | ||
771 | var jStr = JSON.stringify( worldObj ); | ||
772 | |||
773 | // prepend some version information to the string. | ||
774 | // this string is also used to differentiate between JSON | ||
775 | // and pre-JSON versions of fileIO. | ||
776 | // the ending ';' in the version string is necessary | ||
777 | jStr = "v1.0;" + jStr; | ||
778 | |||
779 | return jStr; | ||
780 | } | ||
781 | |||
782 | World.prototype.exportObjectsJSON = function( obj, parentObj ) | ||
783 | { | ||
784 | if (!obj) return; | ||
785 | |||
786 | var jObj = obj.exportJSON(); | ||
787 | if (!parentObj.children) parentObj.children = []; | ||
788 | parentObj.children.push( jObj ); | ||
789 | |||
790 | if (obj.getChild()) { | ||
791 | this.exportObjectsJSON( obj.getChild (), jObj ); | ||
792 | } | ||
793 | |||
794 | if (obj.getNext()) | ||
795 | this.exportObjectsJSON( obj.getNext(), parentObj ); | ||
796 | } | ||
797 | |||
798 | /* | ||
732 | World.prototype.export = function() | 799 | World.prototype.export = function() |
733 | { | 800 | { |
734 | var exportStr = "GLWorld 1.0\n"; | 801 | var exportStr = "GLWorld 1.0\n"; |
@@ -791,6 +858,7 @@ World.prototype.exportObjects = function( obj ) { | |||
791 | 858 | ||
792 | return rtnStr; | 859 | return rtnStr; |
793 | }; | 860 | }; |
861 | */ | ||
794 | 862 | ||
795 | World.prototype.findTransformNodeByMaterial = function( materialNode, trNode ) { | 863 | World.prototype.findTransformNodeByMaterial = function( materialNode, trNode ) { |
796 | //if (trNode == null) trNode = this._ctrNode; | 864 | //if (trNode == null) trNode = this._ctrNode; |
@@ -810,6 +878,85 @@ World.prototype.findTransformNodeByMaterial = function( materialNode, trNode ) | |||
810 | return rtnNode; | 878 | return rtnNode; |
811 | }; | 879 | }; |
812 | 880 | ||
881 | World.prototype.importJSON = function( jObj ) | ||
882 | { | ||
883 | if (jObj.webGL) | ||
884 | { | ||
885 | // start RDGE | ||
886 | rdgeStarted = true; | ||
887 | var id = this._canvas.getAttribute( "data-RDGE-id" ); | ||
888 | this._canvas.rdgeid = id; | ||
889 | g_Engine.registerCanvas(this._canvas, this); | ||
890 | RDGEStart( this._canvas ); | ||
891 | this._canvas.task.stop() | ||
892 | } | ||
893 | |||
894 | // import the objects | ||
895 | // there should be exactly one child of the parent object | ||
896 | if (jObj.children && (jObj.children.length === 1)) | ||
897 | this.importObjectsJSON( jObj.children[0] ); | ||
898 | else | ||
899 | throw new Error ("unrecoverable canvas import error - inconsistent root object: " + jObj.children ); | ||
900 | |||
901 | if (!this._useWebGL) | ||
902 | { | ||
903 | // render using canvas 2D | ||
904 | this.render(); | ||
905 | } | ||
906 | else | ||
907 | this.restartRenderLoop(); | ||
908 | } | ||
909 | |||
910 | World.prototype.importObjectsJSON = function( jObj, parentGeomObj ) | ||
911 | { | ||
912 | // read the next object | ||
913 | var gObj = this.importObjectJSON( jObj, parentGeomObj ); | ||
914 | |||
915 | // determine if we have children | ||
916 | if (jObj.children) | ||
917 | { | ||
918 | var nKids = ojObjbj.chilodren.length; | ||
919 | for (var i=0; i<nKids; i++) | ||
920 | { | ||
921 | var child = jObj.children[i]; | ||
922 | this.importObjectsJSON( child, gObj ); | ||
923 | } | ||
924 | } | ||
925 | } | ||
926 | |||
927 | World.prototype.importObjectJSON = function( jObj, parentGeomObj ) | ||
928 | { | ||
929 | var type = jObj.type; | ||
930 | |||
931 | var obj; | ||
932 | switch (type) | ||
933 | { | ||
934 | case 1: | ||
935 | obj = new Rectangle(); | ||
936 | obj.importJSON( jObj ); | ||
937 | break; | ||
938 | |||
939 | case 2: // circle | ||
940 | obj = new Circle(); | ||
941 | obj.importJSON( jObj ); | ||
942 | break; | ||
943 | |||
944 | case 3: // line | ||
945 | obj = new Line(); | ||
946 | obj.importJSON( jObj ); | ||
947 | break; | ||
948 | |||
949 | default: | ||
950 | throw new Error( "Unrecognized object type: " + type ); | ||
951 | break; | ||
952 | } | ||
953 | |||
954 | if (obj) | ||
955 | this.addObject( obj, parentGeomObj ); | ||
956 | |||
957 | return obj; | ||
958 | }; | ||
959 | |||
813 | World.prototype.import = function( importStr ) { | 960 | World.prototype.import = function( importStr ) { |
814 | // import the worldattributes - not currently used | 961 | // import the worldattributes - not currently used |
815 | 962 | ||