Skip to content
This repository was archived by the owner on Nov 7, 2023. It is now read-only.

Commit 8bf4c37

Browse files
authored
Merge pull request #100 from OpenGeoscience/align-before-origin
Perform pixel alignment before uniform origin shift.
2 parents 602fdc3 + 6d38eb6 commit 8bf4c37

File tree

3 files changed

+284
-37
lines changed

3 files changed

+284
-37
lines changed

src/uniform.js

Lines changed: 34 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ vgl.uniform = function (type, name) {
1919
'use strict';
2020

2121
if (!(this instanceof vgl.uniform)) {
22-
return new vgl.uniform();
22+
return new vgl.uniform(type, name);
2323
}
2424

2525
this.getTypeNumberOfComponents = function (type) {
@@ -102,25 +102,9 @@ vgl.uniform = function (type, name) {
102102
*/
103103
/////////////////////////////////////////////////////////////////////////////
104104
this.set = function (value) {
105-
var i = 0;
106-
if (m_dataArray.length === 16) {
107-
for (i = 0; i < 16; i += 1) {
108-
m_dataArray[i] = value[i];
109-
}
110-
} else if (m_dataArray.length === 9) {
111-
for (i = 0; i < 9; i += 1) {
112-
m_dataArray[i] = value[i];
113-
}
114-
} else if (m_dataArray.length === 4) {
115-
for (i = 0; i < 4; i += 1) {
116-
m_dataArray[i] = value[i];
117-
}
118-
} else if (m_dataArray.length === 3) {
119-
for (i = 0; i < 3; i += 1) {
120-
m_dataArray[i] = value[i];
121-
}
122-
} else if (m_dataArray.length === 2) {
123-
for (i = 0; i < 2; i += 1) {
105+
var i = 0, lendata = m_dataArray.length;
106+
if (lendata !== 1) {
107+
for (i = 0; i < lendata; i += 1) {
124108
m_dataArray[i] = value[i];
125109
}
126110
} else {
@@ -136,10 +120,6 @@ vgl.uniform = function (type, name) {
136120
*/
137121
/////////////////////////////////////////////////////////////////////////////
138122
this.callGL = function (renderState, location) {
139-
if (this.m_numberElements < 1) {
140-
return;
141-
}
142-
143123
switch (m_type) {
144124
case vgl.GL.BOOL:
145125
case vgl.GL.INT:
@@ -148,12 +128,24 @@ vgl.uniform = function (type, name) {
148128
case vgl.GL.FLOAT:
149129
renderState.m_context.uniform1fv(location, m_dataArray);
150130
break;
131+
case vgl.GL.BOOL_VEC2:
132+
case vgl.GL.INT_VEC2:
133+
renderState.m_context.uniform2iv(location, m_dataArray);
134+
break;
151135
case vgl.GL.FLOAT_VEC2:
152136
renderState.m_context.uniform2fv(location, m_dataArray);
153137
break;
138+
case vgl.GL.BOOL_VEC3:
139+
case vgl.GL.INT_VEC3:
140+
renderState.m_context.uniform3iv(location, m_dataArray);
141+
break;
154142
case vgl.GL.FLOAT_VEC3:
155143
renderState.m_context.uniform3fv(location, m_dataArray);
156144
break;
145+
case vgl.GL.BOOL_VEC4:
146+
case vgl.GL.INT_VEC4:
147+
renderState.m_context.uniform4iv(location, m_dataArray);
148+
break;
157149
case vgl.GL.FLOAT_VEC4:
158150
renderState.m_context.uniform4fv(location, m_dataArray);
159151
break;
@@ -179,8 +171,8 @@ vgl.uniform = function (type, name) {
179171
*/
180172
/////////////////////////////////////////////////////////////////////////////
181173
this.update = function (renderState, program) {
182-
renderState = renderState; /* unused parameter */
183-
program = program; /* unused parameter */
174+
void renderState; /* unused parameter */
175+
void program; /* unused parameter */
184176
// Should be implemented by the derived class
185177
};
186178

@@ -202,7 +194,7 @@ vgl.modelViewUniform = function (name) {
202194
return new vgl.modelViewUniform(name);
203195
}
204196

205-
if (name.length === 0) {
197+
if (!name) {
206198
name = 'modelViewMatrix';
207199
}
208200

@@ -219,7 +211,7 @@ vgl.modelViewUniform = function (name) {
219211
*/
220212
/////////////////////////////////////////////////////////////////////////////
221213
this.update = function (renderState, program) {
222-
program = program; /* unused parameter */
214+
void program; /* unused parameter */
223215
this.set(renderState.m_modelViewMatrix);
224216
};
225217

@@ -244,7 +236,7 @@ vgl.modelViewOriginUniform = function (name, origin) {
244236
return new vgl.modelViewOriginUniform(name, origin);
245237
}
246238

247-
if (name.length === 0) {
239+
if (!name) {
248240
name = 'modelViewMatrix';
249241
}
250242
origin = origin || [0, 0, 0];
@@ -277,18 +269,23 @@ vgl.modelViewOriginUniform = function (name, origin) {
277269
*/
278270
/////////////////////////////////////////////////////////////////////////////
279271
this.update = function (renderState, program) {
280-
program = program; /* unused parameter */
281-
var view = mat4.create();
282-
mat4.translate(view, renderState.m_modelViewMatrix, m_origin);
272+
void program; /* unused parameter */
273+
var view = renderState.m_modelViewMatrix;
283274
if (renderState.m_modelViewAlignment) {
275+
/* adjust alignment before origin. Otherwise, a changing origin can
276+
* affect the rounding choice and result in a 1 pixe jitter. */
284277
var align = renderState.m_modelViewAlignment;
278+
/* Don't modify the orignal matrix. If we are in an environment where
279+
* you can't slice an Float32Array, switch to a regular array */
280+
view = view.slice ? view.slice() : Array.prototype.slice.call(view);
285281
/* view[12] and view[13] are the x and y offsets. align.round is the
286282
* units-per-pixel, and align.dx and .dy are either 0 or half the size of
287283
* a unit-per-pixel. The alignment guarantees that the texels are
288284
* aligned with screen pixels. */
289285
view[12] = Math.round(view[12] / align.roundx) * align.roundx + align.dx;
290286
view[13] = Math.round(view[13] / align.roundy) * align.roundy + align.dy;
291287
}
288+
view = mat4.translate(mat4.create(), view, m_origin);
292289
this.set(view);
293290
};
294291

@@ -312,7 +309,7 @@ vgl.projectionUniform = function (name) {
312309
return new vgl.projectionUniform(name);
313310
}
314311

315-
if (name.length === 0) {
312+
if (!name) {
316313
name = 'projectionMatrix';
317314
}
318315

@@ -329,7 +326,7 @@ vgl.projectionUniform = function (name) {
329326
*/
330327
/////////////////////////////////////////////////////////////////////////////
331328
this.update = function (renderState, program) {
332-
program = program; /* unused parameter */
329+
void program; /* unused parameter */
333330
this.set(renderState.m_projectionMatrix);
334331
};
335332

@@ -354,7 +351,7 @@ vgl.floatUniform = function (name, value) {
354351
return new vgl.floatUniform(name, value);
355352
}
356353

357-
if (name.length === 0) {
354+
if (!name) {
358355
name = 'floatUniform';
359356
}
360357

@@ -382,7 +379,7 @@ vgl.normalMatrixUniform = function (name) {
382379
return new vgl.normalMatrixUniform(name);
383380
}
384381

385-
if (name.length === 0) {
382+
if (!name) {
386383
name = 'normalMatrix';
387384
}
388385

@@ -399,7 +396,7 @@ vgl.normalMatrixUniform = function (name) {
399396
*/
400397
/////////////////////////////////////////////////////////////////////////////
401398
this.update = function (renderState, program) {
402-
program = program; /* unused parameter */
399+
void program; /* unused parameter */
403400
this.set(renderState.m_normalMatrix);
404401
};
405402

0 commit comments

Comments
 (0)