diff options
Diffstat (limited to 'js/lib/geom')
-rwxr-xr-x | js/lib/geom/brush-stroke.js | 783 | ||||
-rwxr-xr-x | js/lib/geom/circle.js | 157 | ||||
-rwxr-xr-x | js/lib/geom/geom-obj.js | 289 | ||||
-rwxr-xr-x | js/lib/geom/line.js | 101 | ||||
-rwxr-xr-x | js/lib/geom/rectangle.js | 174 | ||||
-rwxr-xr-x | js/lib/geom/sub-path.js | 104 |
6 files changed, 1283 insertions, 325 deletions
diff --git a/js/lib/geom/brush-stroke.js b/js/lib/geom/brush-stroke.js index 9a934928..22209815 100755 --- a/js/lib/geom/brush-stroke.js +++ b/js/lib/geom/brush-stroke.js | |||
@@ -4,9 +4,12 @@ No rights, expressed or implied, whatsoever to this software are provided by Mot | |||
4 | (c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved. | 4 | (c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved. |
5 | </copyright> */ | 5 | </copyright> */ |
6 | 6 | ||
7 | // Todo: This entire class should be converted to a module | ||
8 | var VecUtils = require("js/helper-classes/3D/vec-utils").VecUtils; | 7 | var VecUtils = require("js/helper-classes/3D/vec-utils").VecUtils; |
9 | var GeomObj = require("js/lib/geom/geom-obj").GeomObj; | 8 | var GeomObj = require("js/lib/geom/geom-obj").GeomObj; |
9 | var CanvasController = require("js/controllers/elements/canvas-controller").CanvasController; | ||
10 | var ViewUtils = require("js/helper-classes/3D/view-utils").ViewUtils; | ||
11 | |||
12 | // Todo: This entire class should be converted to a module | ||
10 | 13 | ||
11 | /////////////////////////////////////////////////////////////////////// | 14 | /////////////////////////////////////////////////////////////////////// |
12 | // Class GLBrushStroke | 15 | // Class GLBrushStroke |
@@ -17,30 +20,38 @@ var BrushStroke = function GLBrushStroke() { | |||
17 | /////////////////////////////////////////////////// | 20 | /////////////////////////////////////////////////// |
18 | // Instance variables | 21 | // Instance variables |
19 | /////////////////////////////////////////////////// | 22 | /////////////////////////////////////////////////// |
20 | this._Points = []; | 23 | this._Points = []; //current state of points in stage-world space (may be different from input) |
24 | this._LocalPoints = []; //_Points in local coordinates...do this before rendering the points in the canvas | ||
25 | this._OrigLocalPoints = []; //copy of input points without any smoothing | ||
26 | this._stageWorldCenter = [0,0,0]; //coordinate for the canvas midPoint: a 3D vector in stage world space | ||
21 | this._BBoxMin = [0, 0, 0]; | 27 | this._BBoxMin = [0, 0, 0]; |
22 | this._BBoxMax = [0, 0, 0]; | 28 | this._BBoxMax = [0, 0, 0]; |
23 | this._dirty = true; | 29 | this._isDirty = true; |
24 | 30 | this._isInit = false; | |
25 | //whether or not to use the canvas drawing to stroke/fill | 31 | |
26 | this._useCanvasDrawing = true; | 32 | //the HTML5 canvas that holds this brush stroke |
27 | 33 | this._canvas = null; | |
28 | //the X and Y location of this subpath's canvas in stage world space of Ninja | ||
29 | this._canvasX = 0; | ||
30 | this._canvasY = 0; | ||
31 | 34 | ||
32 | //stroke information | 35 | //stroke information |
33 | this._strokeWidth = 0.0; | 36 | this._strokeWidth = 1.0; |
34 | this._strokeColor = [0.4, 0.4, 0.4, 1.0]; | 37 | this._strokeColor = [0.4, 0.4, 0.4, 1.0]; |
38 | this._secondStrokeColor = [1, 0.4, 0.4, 1.0]; | ||
39 | this._strokeHardness = 100; | ||
35 | this._strokeMaterial = null; | 40 | this._strokeMaterial = null; |
36 | this._strokeStyle = "Solid"; | 41 | this._strokeStyle = "Solid"; |
42 | this._strokeDoSmoothing = false; | ||
43 | this._strokeUseCalligraphic = false; | ||
44 | this._strokeAngle = 0; | ||
45 | this._strokeAmountSmoothing = 0; | ||
46 | |||
47 | //threshold that tells us whether two samples are too far apart | ||
48 | this._MAX_SAMPLE_DISTANCE_THRESHOLD = 5; | ||
37 | 49 | ||
38 | //the wetness of the brush (currently this is multiplied to the square of the stroke width, but todo should be changed to not depend on stroke width entirely | 50 | //threshold that tells us whether two samples are too close |
39 | //smaller value means more samples for the path | 51 | this._MIN_SAMPLE_DISTANCE_THRESHOLD = 2; |
40 | this._WETNESS_FACTOR = 0.25; | ||
41 | 52 | ||
42 | //prevent extremely long paths that can take a long time to render | 53 | //prevent extremely long paths that can take a long time to render |
43 | this._MAX_ALLOWED_SAMPLES = 500; | 54 | this._MAX_ALLOWED_SAMPLES = 5000; |
44 | 55 | ||
45 | //drawing context | 56 | //drawing context |
46 | this._world = null; | 57 | this._world = null; |
@@ -50,10 +61,15 @@ var BrushStroke = function GLBrushStroke() { | |||
50 | this._planeMat = null; | 61 | this._planeMat = null; |
51 | this._planeMatInv = null; | 62 | this._planeMatInv = null; |
52 | this._planeCenter = null; | 63 | this._planeCenter = null; |
64 | this._dragPlane = null; | ||
53 | 65 | ||
54 | ///////////////////////////////////////////////////////// | 66 | ///////////////////////////////////////////////////////// |
55 | // Property Accessors/Setters | 67 | // Property Accessors/Setters |
56 | ///////////////////////////////////////////////////////// | 68 | ///////////////////////////////////////////////////////// |
69 | this.setCanvas = function(c) { | ||
70 | this._canvas = c; | ||
71 | } | ||
72 | |||
57 | this.setWorld = function (world) { | 73 | this.setWorld = function (world) { |
58 | this._world = world; | 74 | this._world = world; |
59 | }; | 75 | }; |
@@ -63,7 +79,7 @@ var BrushStroke = function GLBrushStroke() { | |||
63 | }; | 79 | }; |
64 | 80 | ||
65 | this.geomType = function () { | 81 | this.geomType = function () { |
66 | return this.GEOM_TYPE_CUBIC_BEZIER; | 82 | return this.GEOM_TYPE_BRUSH_STROKE; |
67 | }; | 83 | }; |
68 | 84 | ||
69 | this.setDrawingTool = function (tool) { | 85 | this.setDrawingTool = function (tool) { |
@@ -86,24 +102,15 @@ var BrushStroke = function GLBrushStroke() { | |||
86 | this._planeCenter = pc; | 102 | this._planeCenter = pc; |
87 | }; | 103 | }; |
88 | 104 | ||
89 | this.getCanvasX = function(){ | 105 | this.setDragPlane = function(p){ |
90 | return this._canvasX; | 106 | this._dragPlane = p; |
91 | }; | ||
92 | |||
93 | this.getCanvasY = function(){ | ||
94 | return this._canvasY; | ||
95 | }; | ||
96 | |||
97 | this.setCanvasX = function(cx){ | ||
98 | this._canvasX=cx; | ||
99 | }; | ||
100 | |||
101 | this.setCanvasY = function(cy){ | ||
102 | this._canvasY=cy; | ||
103 | }; | 107 | }; |
104 | 108 | ||
105 | this.getNumPoints = function () { | 109 | this.getNumPoints = function () { |
106 | return this._Points.length; | 110 | if (this._LocalPoints.length) |
111 | return this._LocalPoints.length; | ||
112 | else | ||
113 | return this._Points.length; | ||
107 | }; | 114 | }; |
108 | 115 | ||
109 | this.getPoint = function (index) { | 116 | this.getPoint = function (index) { |
@@ -114,30 +121,38 @@ var BrushStroke = function GLBrushStroke() { | |||
114 | //add the point only if it is some epsilon away from the previous point | 121 | //add the point only if it is some epsilon away from the previous point |
115 | var numPoints = this._Points.length; | 122 | var numPoints = this._Points.length; |
116 | if (numPoints>0) { | 123 | if (numPoints>0) { |
117 | var threshold = this._WETNESS_FACTOR*this._strokeWidth; | 124 | var threshold = this._MIN_SAMPLE_DISTANCE_THRESHOLD; |
118 | var prevPt = this._Points[numPoints-1]; | 125 | var prevPt = this._Points[numPoints-1]; |
119 | var diffPt = [prevPt[0]-pt[0], prevPt[1]-pt[1]]; | 126 | var diffPt = [prevPt[0]-pt[0], prevPt[1]-pt[1]]; |
120 | var diffPtMag = Math.sqrt(diffPt[0]*diffPt[0] + diffPt[1]*diffPt[1]); | 127 | var diffPtMag = Math.sqrt(diffPt[0]*diffPt[0] + diffPt[1]*diffPt[1]); |
121 | if (diffPtMag>threshold){ | 128 | if (diffPtMag>threshold){ |
122 | this._Points.push(pt); | 129 | this._Points.push(pt); |
123 | this._dirty=true; | 130 | this._isDirty=true; |
131 | this._isInit = false; | ||
124 | } | 132 | } |
125 | } else { | 133 | } else { |
126 | this._Points.push(pt); | 134 | this._Points.push(pt); |
127 | this._dirty=true; | 135 | this._isDirty=true; |
136 | this._isInit = false; | ||
128 | } | 137 | } |
129 | }; | 138 | }; |
130 | 139 | ||
131 | this.insertPoint = function(pt, index){ | 140 | this.insertPoint = function(pt, index){ |
132 | this._Points.splice(index, 0, pt); this._dirty=true; | 141 | this._Points.splice(index, 0, pt); |
142 | this._isDirty=true; | ||
143 | this._isInit = false; | ||
133 | }; | 144 | }; |
134 | 145 | ||
135 | this.isDirty = function(){ | 146 | this.isDirty = function(){ |
136 | return this._dirty; | 147 | return this._isDirty; |
137 | }; | 148 | }; |
138 | 149 | ||
139 | this.makeDirty = function(){ | 150 | this.makeDirty = function(){ |
140 | this._dirty=true; | 151 | this._isDirty=true; |
152 | }; | ||
153 | |||
154 | this.getStageWorldCenter = function() { | ||
155 | return this._stageWorldCenter; | ||
141 | }; | 156 | }; |
142 | 157 | ||
143 | this.getBBoxMin = function () { | 158 | this.getBBoxMin = function () { |
@@ -154,7 +169,10 @@ var BrushStroke = function GLBrushStroke() { | |||
154 | 169 | ||
155 | this.setStrokeWidth = function (w) { | 170 | this.setStrokeWidth = function (w) { |
156 | this._strokeWidth = w; | 171 | this._strokeWidth = w; |
157 | this._dirty=true; | 172 | if (this._strokeWidth<1) { |
173 | this._strokeWidth = 1; | ||
174 | } | ||
175 | this._isDirty=true; | ||
158 | }; | 176 | }; |
159 | 177 | ||
160 | this.getStrokeMaterial = function () { | 178 | this.getStrokeMaterial = function () { |
@@ -162,7 +180,7 @@ var BrushStroke = function GLBrushStroke() { | |||
162 | }; | 180 | }; |
163 | 181 | ||
164 | this.setStrokeMaterial = function (m) { | 182 | this.setStrokeMaterial = function (m) { |
165 | this._strokeMaterial = m; | 183 | this._strokeMaterial = m; this._isDirty = true; |
166 | }; | 184 | }; |
167 | 185 | ||
168 | this.getStrokeColor = function () { | 186 | this.getStrokeColor = function () { |
@@ -170,9 +188,71 @@ var BrushStroke = function GLBrushStroke() { | |||
170 | }; | 188 | }; |
171 | 189 | ||
172 | this.setStrokeColor = function (c) { | 190 | this.setStrokeColor = function (c) { |
173 | this._strokeColor = c; | 191 | this._strokeColor = c; this._isDirty = true; |
174 | }; | 192 | }; |
175 | 193 | ||
194 | this.setFillColor = function(c){ | ||
195 | return; | ||
196 | }; //NO-OP for now as we have no fill region | ||
197 | |||
198 | this.setSecondStrokeColor = function(c){ | ||
199 | this._secondStrokeColor=c; this._isDirty = true; | ||
200 |