diff options
Diffstat (limited to 'js/lib/geom/line.js')
-rwxr-xr-x | js/lib/geom/line.js | 488 |
1 files changed, 488 insertions, 0 deletions
diff --git a/js/lib/geom/line.js b/js/lib/geom/line.js new file mode 100755 index 00000000..da63b21c --- /dev/null +++ b/js/lib/geom/line.js | |||
@@ -0,0 +1,488 @@ | |||
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 GeomObj = require("js/lib/geom/geom-obj").GeomObj; | ||
8 | var ShapePrimitive = require("js/lib/geom/shape-primitive").ShapePrimitive; | ||
9 | var MaterialsModel = require("js/models/materials-model").MaterialsModel; | ||
10 | /////////////////////////////////////////////////////////////////////// | ||
11 | // Class GLLine | ||
12 | // GL representation of a line. | ||
13 | // Derived from class GeomObj | ||
14 | /////////////////////////////////////////////////////////////////////// | ||
15 | var Line = function GLLine( world, xOffset, yOffset, width, height, slope, strokeSize, strokeColor, strokeMaterial, strokeStyle, xAdj, yAdj) { | ||
16 | /////////////////////////////////////////////////////////////////////// | ||
17 | // Instance variables | ||
18 | /////////////////////////////////////////////////////////////////////// | ||
19 | this._width = 2.0; | ||
20 | this._height = 2.0; | ||
21 | this._xOffset = 0; | ||
22 | this._yOffset = 0; | ||
23 | |||
24 | // If line doesn't fit in canvas world, we had to grow the canvas by this much on either side | ||
25 | this._xAdj = 0; | ||
26 | this._yAdj = 0; | ||
27 | |||
28 | this._slope = 0; | ||
29 | |||
30 | this._strokeWidth = 0.25; | ||
31 | |||
32 | this._strokeStyle = "Solid"; | ||
33 | this._scaleX = 1.0; | ||
34 | this._scaleY = 1.0; | ||
35 | |||
36 | if (arguments.length > 0) { | ||
37 | this._width = width; | ||
38 | this._height = height; | ||
39 | this._xOffset = xOffset; | ||
40 | this._yOffset = yOffset; | ||
41 | |||
42 | this._xAdj = xAdj; | ||
43 | this._yAdj = yAdj; | ||
44 | |||
45 | this._slope = slope; | ||
46 | this._strokeWidth = strokeSize; | ||
47 | if (strokeColor) this._strokeColor = strokeColor.slice(); | ||
48 | |||
49 | this._strokeStyle = strokeStyle; | ||
50 | this._scaleX = (world.getViewportWidth())/(world.getViewportHeight()); | ||
51 | } | ||
52 | |||
53 | this._strokeVerticesLen = 0; | ||
54 | |||
55 | this.m_world = world; | ||
56 | |||
57 | this._materialAmbient = [0.2, 0.2, 0.2, 1.0]; | ||
58 | this._materialDiffuse = [0.4, 0.4, 0.4, 1.0]; | ||
59 | this._materialSpecular = [0.4, 0.4, 0.4, 1.0]; | ||
60 | |||
61 | if(strokeMaterial) { | ||
62 | this._strokeMaterial = strokeMaterial; | ||
63 | } | ||
64 | |||
65 | /////////////////////////////////////////////////////////////////////// | ||
66 | // Property Accessors | ||
67 | /////////////////////////////////////////////////////////////////////// | ||
68 | this.getStrokeWidth = function() { return this._strokeWidth; } | ||
69 | this.setStrokeWidth = function(w) { this._strokeWidth = w; } | ||
70 | |||
71 | this.getStrokeMaterial = function() { return this._strokeMaterial; } | ||
72 | this.setStrokeMaterial = function(m) { this._strokeMaterial = m; } | ||
73 | |||
74 | this.getStrokeColor = function() { return this._strokeColor; } | ||
75 | //this.setStrokeColor = function(c) { this._strokeColor = c; } | ||
76 | |||
77 | this.getStrokeStyle = function() { return this._strokeStyle; } | ||
78 | this.setStrokeStyle = function(s) { this._strokeStyle = s; } | ||
79 | |||
80 | this.getFillMaterial = function() { return null; } | ||
81 | |||
82 | this.setStrokeMaterial = function(m) { this._strokeMaterial = m; } | ||
83 | this.getStrokeMaterial = function() { return this._strokeMaterial; } | ||
84 | |||
85 | this.getWidth = function() { return this._width; } | ||
86 | this.setWidth = function(w) { this._width = w; } | ||
87 | |||
88 | this.getHeight = function() { return this._height; } | ||
89 | this.setHeight = function(h) { this._height = h; } | ||
90 | |||
91 | this.getXAdj = function() { return this._xAdj; } | ||
92 | this.setXAdj = function(x) { this._xAdj = x; } | ||
93 | |||
94 | this.getYAdj = function() { return this._yAdj; } | ||
95 | this.setYAdj = function(y) { this._yAdj = y; } | ||
96 | |||
97 | this.getSlope = function() { return this._slope; } | ||
98 | this.setSlope = function(m) { this._slope = m; } | ||
99 | |||
100 | this.geomType = function() { return this.GEOM_TYPE_LINE; } | ||
101 | |||
102 | /////////////////////////////////////////////////////////////////////// | ||
103 | // Methods | ||
104 | /////////////////////////////////////////////////////////////////////// | ||
105 | this.export = function() { | ||
106 | var rtnStr = "type: " + this.geomType() + "\n"; | ||
107 | |||
108 | rtnStr += "xoff: " + this._xOffset + "\n"; | ||
109 | rtnStr += "yoff: " + this._yOffset + "\n"; | ||
110 | rtnStr += "width: " + this._width + "\n"; | ||
111 | rtnStr += "height: " + this._height + "\n"; | ||
112 | rtnStr += "xAdj: " + this._xAdj + "\n"; | ||
113 | rtnStr += "yAdj: " + this._yAdj + "\n"; | ||
114 | rtnStr += "strokeWidth: " + this._strokeWidth + "\n"; | ||
115 | rtnStr += "strokeColor: " + String(this._strokeColor) + "\n"; | ||
116 | rtnStr += "strokeStyle: " + this._strokeStyle + "\n"; | ||
117 | rtnStr += "slope: " + String(this._slope) + "\n"; | ||
118 | |||
119 | rtnStr += "strokeMat: "; | ||
120 | if (this._strokeMaterial) { | ||
121 | rtnStr += this._strokeMaterial.getName(); | ||
122 | } else { | ||
123 | rtnStr += "flatMaterial"; | ||
124 | } | ||
125 | |||
126 | rtnStr += "\n"; | ||
127 | return rtnStr; | ||
128 | }; | ||
129 | |||
130 | this.import = function( importStr ) { | ||
131 | this._xOffset = Number( this.getPropertyFromString( "xoff: ", importStr ) ); | ||
132 | this._yOffset = Number( this.getPropertyFromString( "yoff: ", importStr ) ); | ||
133 | this._width = Number( this.getPropertyFromString( "width: ", importStr ) ); | ||
134 | this._height = Number( this.getPropertyFromString( "height: ", importStr ) ); | ||
135 | this._xAdj = Number( this.getPropertyFromString( "xAdj: ", importStr ) ); | ||
136 | this._yAdj = Number( this.getPropertyFromString( "yAdj: ", importStr ) ); | ||
137 | this._strokeWidth = Number( this.getPropertyFromString( "strokeWidth: ", importStr ) ); | ||
138 | var slope = this.getPropertyFromString( "slope: ", importStr ); | ||
139 | |||
140 | if(isNaN(Number(slope))) { | ||
141 | this._slope = slope; | ||
142 | } else { | ||
143 | this._slope = Number(slope); | ||
144 | } | ||
145 | |||
146 | var strokeMaterialName = this.getPropertyFromString( "strokeMat: ", importStr ); | ||
147 | this._strokeStyle = this.getPropertyFromString( "strokeStyle: ", importStr ); | ||
148 | this._strokeColor = eval( "[" + this.getPropertyFromString( "strokeColor: ", importStr ) + "]" ); | ||
149 | |||
150 | var strokeMat = MaterialsModel.getMaterial( strokeMaterialName ); | ||
151 | if (!strokeMat) { | ||
152 | console.log( "object material not found in library: " + strokeMaterialName ); | ||
153 | strokeMat = MaterialsModel.exportFlatMaterial(); | ||
154 | } | ||
155 | |||
156 | this._strokeMaterial = strokeMat; | ||
157 | |||
158 | }; | ||
159 | |||
160 | /////////////////////////////////////////////////////////////////////// | ||
161 | // Methods | ||
162 | /////////////////////////////////////////////////////////////////////// | ||
163 | this.buildBuffers = function() { | ||
164 | // get the world | ||
165 | var world = this.getWorld(); | ||
166 | if (!world) throw( "null world in buildBuffers" ); | ||
167 | if (!world._useWebGL) return; | ||
168 | |||
169 | // make sure RDGE has the correct context | ||
170 | g_Engine.setContext( world.getCanvas().rdgeid ); | ||
171 | |||
172 | // create the gl buffer | ||
173 | var gl = world.getGLContext(); | ||
174 | |||
175 | this._strokeVerticesLen = 0; | ||
176 | |||
177 | var strokeVertices = []; | ||
178 | var strokeTextures = []; | ||
179 | var strokeNormals = []; | ||
180 | var strokeColors = []; | ||
181 | |||
182 | // var scaleMat = Matrix.I(3); | ||
183 | // scaleMat.elements[0][0] = this._scaleX; | ||
184 | // scaleMat.elements[1][1] = this._scaleY; | ||
185 | |||
186 | |||
187 | // get the normalized device coordinates (NDC) for | ||
188 | // all position and dimensions. | ||
189 | var vpw = world.getViewportWidth(), vph = world.getViewportHeight(); | ||
190 | var xNDC = 2*this._xOffset/vpw, yNDC = 2*this._yOffset/vph, | ||
191 | xFillNDC = this._width/vpw, yFillNDC = this._height/vph, | ||
192 | xAdjNDC = this._xAdj/vpw, yAdjNDC = this._yAdj/vph, | ||
193 | xStrokeNDC = this._strokeWidth/vpw, yStrokeNDC = this._strokeWidth/vph; | ||
194 | |||
195 | var aspect = world.getAspect(); | ||
196 | var zn = world.getZNear(), zf = world.getZFar(); | ||
197 | var t = zn * Math.tan(world.getFOV() * Math.PI / 360.0), | ||
198 | b = -t, | ||
199 | r = aspect*t, | ||
200 | l = -r; | ||
201 | |||
202 | // calculate the object coordinates from their NDC coordinates | ||
203 | var z = -world.getViewDistance(); | ||
204 | |||
205 | // get the position of the origin | ||
206 | var x = -z*(r-l)/(2.0*zn)*xNDC, | ||
207 | y = -z*(t-b)/(2.0*zn)*yNDC; | ||
208 | |||
209 | // get the x and y fill | ||
210 | var xFill = -z*(r-l)/(2.0*zn)*xFillNDC, | ||
211 | yFill = -z*(t-b)/(2.0*zn)*yFillNDC; | ||
212 | |||
213 | // get the x & y stroke size | ||
214 | var xStroke = -z*(r-l)/(2.0*zn)*xStrokeNDC, | ||
215 | yStroke = -z*(t-b)/(2.0*zn)*yStrokeNDC; | ||
216 | |||
217 | // get the x & y adjustments size | ||
218 | var xAdj = -z*(r-l)/(2.0*zn)*xAdjNDC*2, | ||
219 | yAdj = -z*(t-b)/(2.0*zn)*yAdjNDC*2; | ||
220 | |||
221 | |||
222 | this._primArray = []; | ||
223 | this._materialArray = []; | ||
224 | this._materialTypeArray = []; | ||
225 | this._materialNodeArray = []; | ||
226 | |||
227 | this._scaleX = (world._viewportWidth)/(world._viewportHeight); | ||
228 | |||
229 | var innerX = xFill-xStroke; | ||
230 | var innerY = yFill-yStroke; | ||
231 | |||
232 | if(this._slope === "vertical") { | ||
233 | strokeVertices = [ | ||
234 | -xFill+x, yFill+y, 0.0, | ||
235 | xFill+x, yFill+y, 0.0, | ||
236 | -xFill+x, -yFill+y, 0.0, | ||
237 | |||
238 | xFill+x, -yFill+y, 0.0, | ||
239 | -xFill+x, -yFill+y, 0.0, | ||