Skip to content

Commit 57fc8cb

Browse files
committed
Merge pull request #1338 from ngokevin/buffer
default to BufferGeometry for all geometries (fixes #633)
2 parents a7bf7ca + bfd0934 commit 57fc8cb

File tree

4 files changed

+47
-22
lines changed

4 files changed

+47
-22
lines changed

‎src/components/geometry.js‎

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ var error = utils.debug('components:geometry:error');
1212
*/
1313
module.exports.Component = registerComponent('geometry', {
1414
schema: {
15+
buffer: {default: true},
1516
primitive: {default: ''},
1617
translate: {type: 'vec3'}
1718
},
@@ -29,7 +30,7 @@ module.exports.Component = registerComponent('geometry', {
2930
var translateNeedsUpdate = !utils.deepEqual(data.translate, currentTranslate);
3031

3132
if (geometryNeedsUpdate) { this.setGeometry(); }
32-
if (translateNeedsUpdate) {
33+
if (translateNeedsUpdate && !data.buffer) {
3334
applyTranslate(this.el.getObject3D('mesh').geometry, data.translate, currentTranslate);
3435
}
3536
},
@@ -46,6 +47,7 @@ module.exports.Component = registerComponent('geometry', {
4647
* Create geometry and set on mesh.
4748
*/
4849
setGeometry: function () {
50+
var bufferGeometry;
4951
var data = this.data;
5052
var mesh = this.el.getOrCreateObject3D('mesh', THREE.Mesh);
5153
var geometryInstance;
@@ -60,6 +62,13 @@ module.exports.Component = registerComponent('geometry', {
6062
geometryInstance.init(data);
6163
this.geometry = geometryInstance.geometry;
6264

65+
// Transform to BufferGeometry if specified.
66+
if (data.buffer) {
67+
bufferGeometry = new THREE.BufferGeometry().fromGeometry(this.geometry);
68+
this.geometry.dispose();
69+
this.geometry = bufferGeometry;
70+
}
71+
6372
// Dispose and set.
6473
if (mesh.geometry) { mesh.geometry.dispose(); }
6574
mesh.geometry = this.geometry;

‎src/geometries/plane.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ registerGeometry('plane', {
88
},
99

1010
init: function (data) {
11-
this.geometry = new THREE.PlaneBufferGeometry(data.width, data.height);
11+
this.geometry = new THREE.PlaneGeometry(data.width, data.height);
1212
}
1313
});

‎src/geometries/sphere.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ registerGeometry('sphere', {
1616
},
1717

1818
init: function (data) {
19-
this.geometry = new THREE.SphereBufferGeometry(
19+
this.geometry = new THREE.SphereGeometry(
2020
data.radius, data.segmentsWidth, data.segmentsHeight, degToRad(data.phiStart),
2121
degToRad(data.phiLength), degToRad(data.thetaStart), degToRad(data.thetaLength));
2222
}

‎tests/components/geometry.test.js‎

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,14 @@
22
var helpers = require('../helpers');
33
var degToRad = require('index').THREE.Math.degToRad;
44

5+
/**
6+
* Most geometry tests will disable BufferGeometries in order to assert on geometry types and
7+
* parameters. That info is mostly lost when converting a Geometry to a BufferGeometry.
8+
*/
59
suite('geometry', function () {
610
setup(function (done) {
711
var el = this.el = helpers.entityFactory();
8-
el.setAttribute('geometry', 'primitive: box');
12+
el.setAttribute('geometry', 'buffer: false; primitive: box');
913
el.addEventListener('loaded', function () {
1014
done();
1115
});
@@ -20,24 +24,24 @@ suite('geometry', function () {
2024

2125
test('updates geometry', function () {
2226
var mesh = this.el.getObject3D('mesh');
23-
this.el.setAttribute('geometry', 'primitive: box; width: 5');
27+
this.el.setAttribute('geometry', 'buffer: false; primitive: box; width: 5');
2428
assert.equal(mesh.geometry.parameters.width, 5);
2529
});
2630

2731
test('updates geometry for segment-related attribute', function () {
2832
var el = this.el;
2933
var mesh = el.getObject3D('mesh');
30-
el.setAttribute('geometry', 'primitive: sphere');
31-
el.setAttribute('geometry', 'primitive: sphere; segmentsWidth: 8');
34+
el.setAttribute('geometry', 'buffer: false; primitive: sphere');
35+
el.setAttribute('geometry', 'buffer: false; primitive: sphere; segmentsWidth: 8');
3236
assert.equal(mesh.geometry.parameters.widthSegments, 8);
3337
});
3438

3539
test('can change type of geometry', function () {
3640
var el = this.el;
3741
var mesh = el.getObject3D('mesh');
38-
el.setAttribute('geometry', 'primitive: sphere');
39-
assert.equal(mesh.geometry.type, 'SphereBufferGeometry');
40-
el.setAttribute('geometry', 'primitive: box');
42+
el.setAttribute('geometry', 'buffer: false; primitive: sphere');
43+
assert.equal(mesh.geometry.type, 'SphereGeometry');
44+
el.setAttribute('geometry', 'buffer: false; primitive: box');
4145
assert.equal(mesh.geometry.type, 'BoxGeometry');
4246
});
4347

@@ -75,6 +79,7 @@ suite('geometry', function () {
7579

7680
setup(function () {
7781
this.el.setAttribute('geometry', {
82+
buffer: false,
7883
primitive: 'box',
7984
depth: 1,
8085
height: 1,
@@ -109,6 +114,7 @@ suite('geometry', function () {
109114
var el = this.el;
110115
el.setAttribute('geometry', 'translate', '-2 4 2');
111116
this.el.setAttribute('geometry', {
117+
buffer: false,
112118
primitive: 'box',
113119
depth: 1,
114120
height: 1,
@@ -124,6 +130,15 @@ suite('geometry', function () {
124130
assert.equal(el.getObject3D('mesh').geometry.uuid, uuid);
125131
});
126132
});
133+
134+
suite('buffer', function () {
135+
test('uses BufferGeometry', function () {
136+
var el = this.el;
137+
assert.notEqual(el.getObject3D('mesh').geometry.type, 'BufferGeometry');
138+
el.setAttribute('geometry', 'buffer', true);
139+
assert.equal(el.getObject3D('mesh').geometry.type, 'BufferGeometry');
140+
});
141+
});
127142
});
128143

129144
suite('standard geometries', function () {
@@ -139,7 +154,8 @@ suite('standard geometries', function () {
139154
var el = this.el;
140155
var geometry;
141156
el.setAttribute('geometry', {
142-
primitive: 'circle', radius: 5, segments: 4, thetaStart: 0, thetaLength: 350
157+
buffer: false, primitive: 'circle', radius: 5, segments: 4, thetaStart: 0,
158+
thetaLength: 350
143159
});
144160
geometry = el.getObject3D('mesh').geometry;
145161
assert.equal(geometry.type, 'CircleGeometry');
@@ -153,7 +169,7 @@ suite('standard geometries', function () {
153169
var el = this.el;
154170
var geometry;
155171
el.setAttribute('geometry', {
156-
primitive: 'cylinder', radius: 1, height: 2, segmentsRadial: 3,
172+
buffer: false, primitive: 'cylinder', radius: 1, height: 2, segmentsRadial: 3,
157173
segmentsHeight: 4, openEnded: true, thetaStart: 240, thetaLength: 350
158174
});
159175
geometry = el.getObject3D('mesh').geometry;
@@ -172,8 +188,8 @@ suite('standard geometries', function () {
172188
var el = this.el;
173189
var geometry;
174190
el.setAttribute('geometry', {
175-
primitive: 'cone', radiusTop: 1, radiusBottom: 5, height: 2, segmentsRadial: 3,
176-
segmentsHeight: 4, openEnded: true, thetaStart: 240, thetaLength: 350
191+
buffer: false, primitive: 'cone', radiusTop: 1, radiusBottom: 5, height: 2,
192+
segmentsRadial: 3, segmentsHeight: 4, openEnded: true, thetaStart: 240, thetaLength: 350
177193
});
178194
geometry = el.getObject3D('mesh').geometry;
179195
assert.equal(geometry.type, 'CylinderGeometry');
@@ -189,9 +205,9 @@ suite('standard geometries', function () {
189205
test('plane', function () {
190206
var el = this.el;
191207
var geometry;
192-
el.setAttribute('geometry', { primitive: 'plane', width: 1, height: 2 });
208+
el.setAttribute('geometry', {buffer: false, primitive: 'plane', width: 1, height: 2});
193209
geometry = el.getObject3D('mesh').geometry;
194-
assert.equal(geometry.type, 'PlaneBufferGeometry');
210+
assert.equal(geometry.type, 'PlaneGeometry');
195211
assert.equal(geometry.parameters.width, 1);
196212
assert.equal(geometry.parameters.height, 2);
197213
});
@@ -200,7 +216,7 @@ suite('standard geometries', function () {
200216
var el = this.el;
201217
var geometry;
202218
el.setAttribute('geometry', {
203-
primitive: 'ring', radiusInner: 1, radiusOuter: 2, segmentsTheta: 3});
219+
buffer: false, primitive: 'ring', radiusInner: 1, radiusOuter: 2, segmentsTheta: 3});
204220
geometry = el.getObject3D('mesh').geometry;
205221
assert.equal(geometry.type, 'RingGeometry');
206222
assert.equal(geometry.parameters.innerRadius, 1);
@@ -212,11 +228,11 @@ suite('standard geometries', function () {
212228
var el = this.el;
213229
var geometry;
214230
el.setAttribute('geometry', {
215-
primitive: 'sphere', radius: 1, segmentsWidth: 2, segmentsHeight: 3,
231+
buffer: false, primitive: 'sphere', radius: 1, segmentsWidth: 2, segmentsHeight: 3,
216232
phiStart: 45, phiLength: 90, thetaStart: 45
217233
});
218234
geometry = el.getObject3D('mesh').geometry;
219-
assert.equal(geometry.type, 'SphereBufferGeometry');
235+
assert.equal(geometry.type, 'SphereGeometry');
220236
assert.equal(geometry.parameters.radius, 1);
221237
assert.equal(geometry.parameters.widthSegments, 2);
222238
assert.equal(geometry.parameters.heightSegments, 3);
@@ -230,8 +246,8 @@ suite('standard geometries', function () {
230246
var el = this.el;
231247
var geometry;
232248
el.setAttribute('geometry', {
233-
primitive: 'torus', radius: 1, radiusTubular: 2, segmentsRadial: 3, segmentsTubular: 4,
234-
arc: 350
249+
buffer: false, primitive: 'torus', radius: 1, radiusTubular: 2, segmentsRadial: 3,
250+
segmentsTubular: 4, arc: 350
235251
});
236252
geometry = el.getObject3D('mesh').geometry;
237253
assert.equal(geometry.type, 'TorusGeometry');
@@ -246,7 +262,7 @@ suite('standard geometries', function () {
246262
var el = this.el;
247263
var geometry;
248264
el.setAttribute('geometry', {
249-
primitive: 'torusKnot', radius: 1, radiusTubular: 2, segmentsRadial: 3,
265+
buffer: false, primitive: 'torusKnot', radius: 1, radiusTubular: 2, segmentsRadial: 3,
250266
segmentsTubular: 4, p: 5, q: 6
251267
});
252268
geometry = el.getObject3D('mesh').geometry;

0 commit comments

Comments
 (0)