diff options
Diffstat (limited to 'js/lib/geom/geom-obj.js')
-rwxr-xr-x | js/lib/geom/geom-obj.js | 280 |
1 files changed, 280 insertions, 0 deletions
diff --git a/js/lib/geom/geom-obj.js b/js/lib/geom/geom-obj.js new file mode 100755 index 00000000..c5880843 --- /dev/null +++ b/js/lib/geom/geom-obj.js | |||
@@ -0,0 +1,280 @@ | |||
1 | /* <copyright> | ||
2 | This file contains proprietary software owned by Motorola Mobility, Inc.<br/> | ||
3 | No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.<br/> | ||
4 | (c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved. | ||
5 | </copyright> */ | ||
6 | |||
7 | var MaterialsModel = require("js/models/materials-model").MaterialsModel; | ||
8 | /////////////////////////////////////////////////////////////////////// | ||
9 | // Class GLGeomObj | ||
10 | // Super class for all geometry classes | ||
11 | /////////////////////////////////////////////////////////////////////// | ||
12 | var GeomObj = function GLGeomObj() { | ||
13 | /////////////////////////////////////////////////////////////////////// | ||
14 | // Constants | ||
15 | /////////////////////////////////////////////////////////////////////// | ||
16 | this.GEOM_TYPE_RECTANGLE = 1; | ||
17 | this.GEOM_TYPE_CIRCLE = 2; | ||
18 | this.GEOM_TYPE_LINE = 3; | ||
19 | this.GEOM_TYPE_PATH = 4; | ||
20 | this.GEOM_TYPE_CUBIC_BEZIER = 5; | ||
21 | this.GEOM_TYPE_UNDEFINED = -1; | ||
22 | |||
23 | // Needed for calculating dashed/dotted strokes | ||
24 | this.DASH_LENGTH = 0.15; | ||
25 | this.DOT_LENGTH = 0.05; | ||
26 | this.GAP_LENGTH = 0.05; | ||
27 | |||
28 | /////////////////////////////////////////////////////////////////////// | ||
29 | // Instance variables | ||
30 | /////////////////////////////////////////////////////////////////////// | ||
31 | this._matrix = Matrix.I(4); | ||
32 | |||
33 | this._next = undefined; | ||
34 | this._prev = undefined; | ||
35 | this._child = undefined; | ||
36 | this._parent = undefined; | ||
37 | |||
38 | this.m_world = null; | ||
39 | |||
40 | // stroke and fill colors | ||
41 | this._strokeColor = [0,0,0,0]; | ||
42 | this._fillColor = [0,0,0,0]; | ||
43 | |||
44 | // stroke and fill materials | ||
45 | this._fillMaterial = null; | ||
46 | this._strokeMaterial = null; | ||
47 | |||
48 | // array of primitives - used in RDGE | ||
49 | this._primArray = []; | ||
50 | this._materialNodeArray = []; | ||
51 | this._materialArray = []; | ||
52 | this._materialTypeArray = []; | ||
53 | |||
54 | // the transform node used by RDGE | ||
55 | this._trNode = null; | ||
56 | |||
57 | /////////////////////////////////////////////////////////////////////// | ||
58 | // Property accessors | ||
59 | /////////////////////////////////////////////////////////////////////// | ||
60 | this.setWorld = function( world ) { | ||
61 | this.m_world = world; | ||
62 | }; | ||
63 | |||
64 | this.getWorld = function() { | ||
65 | return this.m_world; | ||
66 | }; | ||
67 | |||
68 | this.getMatrix = function() { | ||
69 | return this._matrix.slice(0); | ||
70 | }; | ||
71 | |||
72 | this.setMatrix = function(m) { | ||
73 | this._matrix = m.slice(0); | ||
74 | }; | ||
75 | |||
76 | this.setNext = function( next ) { | ||
77 | this._next = next; | ||
78 | }; | ||
79 | |||
80 | this.getNext = function() { | ||
81 | return this._next; | ||
82 | }; | ||
83 | |||
84 | this.setPrev = function( prev ) { | ||
85 | this._prev = prev; | ||
86 | }; | ||
87 | |||
88 | this.getPrev = function() { | ||
89 | return this._prev; | ||
90 | }; | ||
91 | |||
92 | this.setChild = function( child ) { | ||
93 | this._child = child; | ||
94 | }; | ||
95 | |||
96 | this.getChild = function() { | ||
97 | return this._child; | ||
98 | }; | ||
99 | |||
100 | this.setParent = function( parent ) { | ||
101 | this._parent = parent; | ||
102 | }; | ||
103 | |||
104 | this.getParent = function() { | ||
105 | return this._parent; | ||
106 | }; | ||
107 | |||
108 | this.geomType = function() { | ||
109 | return this.GEOM_TYPE_UNDEFINED; | ||
110 | }; | ||
111 | |||
112 | this.getPrimitiveArray = function() { return this._primArray; | ||
113 | }; | ||
114 | |||
115 | this.getMaterialNodeArray = function() { | ||
116 | return this._materialNodeArray; | ||
117 | }; | ||
118 | |||
119 | this.getMaterialArray = function() { return this._materialArray; | ||
120 | }; | ||
121 | |||
122 | this.getTransformNode = function() { | ||
123 | return this._trNode; | ||
124 | }; | ||
125 | |||
126 | this.setTransformNode = function(t) { | ||
127 | this._trNode = t; | ||
128 | }; | ||
129 | |||
130 | this.setFillColor = function(c) { | ||
131 | this.setMaterialColor(c, "fill"); | ||
132 | }; | ||
133 | |||
134 | this.setStrokeColor = function(c) { | ||
135 | this.setMaterialColor(c, "stroke"); | ||
136 | }; | ||
137 | /////////////////////////////////////////////////////////////////////// | ||
138 | // Methods | ||
139 | /////////////////////////////////////////////////////////////////////// | ||
140 | this.setMaterialColor = function(c, type) { | ||
141 | if (type == "fill") { | ||
142 | this._fillColor = c.slice(0); | ||
143 | } else { | ||
144 | this._strokeColor = c.slice(0); | ||
145 | } | ||
146 | |||
147 | if (this._materialArray && this._materialTypeArray) { | ||
148 | var nMats = this._materialArray.length; | ||
149 | if (nMats === this._materialTypeArray.length) { | ||
150 | for (var i=0; i<nMats; i++) { | ||
151 | if (this._materialTypeArray[i] == type) { | ||
152 | this._materialArray[i].setProperty( "color", c.slice(0) ); | ||
153 | } | ||
154 | } | ||
155 | } | ||
156 | } | ||
157 | |||
158 | var world = this.getWorld(); | ||
159 | if (world) { | ||
160 | world.restartRenderLoop(); | ||
161 | } | ||
162 | }; | ||
163 | |||
164 | this.makeStrokeMaterial = function() { | ||
165 | var strokeMaterial; | ||
166 | if (this.getStrokeMaterial()){ | ||
167 | strokeMaterial = this.getStrokeMaterial().dup(); | ||
168 | } else { | ||
169 | strokeMaterial = MaterialsModel.exportFlatMaterial(); | ||
170 | } | ||
171 | |||
172 | if (strokeMaterial) { | ||
173 | strokeMaterial.init( this.getWorld() ); | ||
174 | if(this._strokeColor) { | ||
175 | strokeMaterial.setProperty("color", this._strokeColor); | ||
176 | } | ||
177 | } | ||
178 | |||
179 | this._materialArray.push( strokeMaterial ); | ||
180 | this._materialTypeArray.push( "stroke" ); | ||
181 | |||
182 | return strokeMaterial; | ||
183 | }; | ||
184 | |||
185 | this.makeFillMaterial = function() { | ||
186 | var fillMaterial; | ||
187 | if (this.getFillMaterial()) { | ||
188 | fillMaterial = this.getFillMaterial().dup(); | ||
189 | } else { | ||
190 | fillMaterial = MaterialsModel.exportFlatMaterial(); | ||
191 | } | ||
192 | |||
193 | if (fillMaterial) { | ||
194 | fillMaterial.init( this.getWorld() ); | ||
195 | //if(!this.getFillMaterial() && this._fillColor) | ||
196 | if (this._fillColor) { | ||
197 | fillMaterial.setProperty("color", this._fillColor); | ||
198 | } | ||
199 | } | ||
200 | |||
201 | this._materialArray.push( fillMaterial ); | ||
202 | this._materialTypeArray.push( "fill" ); | ||
203 | |||
204 | return fillMaterial; | ||
205 | }; | ||
206 | |||
207 | this.translate = function(v) { | ||
208 | var mat = Matrix.Translation( v ); | ||
209 | //var mat2 = mat.multiply( this._matrix ); | ||
210 | //this._matrix = mat2; | ||
211 | glmat4.multiply(mat, this._matrix, this._matrix); | ||
212 | }; | ||
213 | |||
214 | this.transform = function( mat ) { | ||
215 | if (mat) { | ||
216 | //this._matrix = mat.multiply( this._matrix ); | ||
217 | glmat4.multiply(mat, this._matrix, this._matrix); | ||
218 | } | ||
219 | }; | ||
220 | |||
221 | this.setMatrix = function(mat) { | ||
222 | var gl = this.getWorld().getGLContext(); | ||
223 | if (gl) { | ||
224 | gl.uniformMatrix4fv(this.getWorld().getShaderProgram().mvMatrixUniform, false, new Float32Array(mat)); | ||
225 | } | ||
226 | }; | ||
227 | |||
228 | this.buildBuffers = function() { | ||
229 | // this function must be overridden by the base class | ||
230 | alert( "GLGeomObj.buildBuffers must be overridden by base class" ); | ||
231 | }; | ||
232 | |||
233 | this.render = function() { | ||
234 | alert( "GLGeomObj.render method must be overridden by sub class" ); | ||
235 | }; | ||
236 | |||
237 | this.collidesWithPoint = function( x, y ) { | ||
238 | alert( "GLGeomObj.collidesWithPoint method must be overridden by sub class" ); | ||
239 | }; | ||
240 | |||
241 | this.getNearPoint = function( pt, dir ) { | ||
242 | // the alert is not displayed. Objects may choose not to implement this method. | ||
243 | //alert( "GLGeomObj.getNearPoint method must be overridden by sub class" ); | ||
244 | }; | ||
245 | |||
246 | this.getNearVertex = function( pt, dir ) { | ||
247 | // this should be overridden by objects (such as rectangles) that have corners | ||
248 | }; | ||
249 | |||
250 | this.containsPoint = function( pt, dir ) { | ||
251 | // the alert is not displayed. Objects may choose not to implement this method. | ||