Skip to content

Commit 905fbb6

Browse files
committed
Compute normals correctly for plain geometries.
Fixes #77.
1 parent 506fd6f commit 905fbb6

File tree

3 files changed

+14
-4
lines changed

3 files changed

+14
-4
lines changed

js/src/jupyter-threejs.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -641,11 +641,18 @@ define(["jupyter-js-widgets", "underscore", "three", "ndarray"],
641641
}
642642
// TODO: faceVertexUvs
643643
geometry.elementsNeedUpdate = true;
644-
geometry.uvsNeedUpdate = true;
644+
if (!faceNormals) {
645+
geometry.computeFaceNormals();
646+
}
647+
geometry.computeVertexNormals();
645648
geometry.normalsNeedUpdate = true;
649+
650+
geometry.computeLineDistances();
651+
geometry.lineDistancesNeedUpdate = true;
652+
653+
geometry.uvsNeedUpdate = true;
646654
geometry.tangentsNeedUpdate = true;
647655
geometry.colorsNeedUpdate = true;
648-
geometry.lineDistancesNeedUpdate = true;
649656
this.replace_obj(geometry);
650657
},
651658
});

pythreejs/pythreejs.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from math import pi, sqrt
2020
from .traits_numpy import array_serialization, shape_constraints
2121
from traittypes import Array
22+
import numpy as np
2223

2324
def vector3(trait_type=CFloat, default=None, **kwargs):
2425
if default is None:
@@ -274,7 +275,7 @@ class PlainGeometry(Geometry):
274275
vertices = Array(dtype='float32').tag(sync=True, **array_serialization).valid(shape_constraints(None,3))
275276
faces = Array(dtype='uint32').tag(sync=True, **array_serialization).valid(shape_constraints(None,3))
276277
# list of [[v1_r,v1_g,v1_b], [v2_r,v2_g,v2_b], [v3_r,v3_g,v3_b]] for each face
277-
faceColors = Array(dtype='float32').tag(sync=True, **array_serialization).valid(shape_constraints(None, 3, 3))
278+
faceColors = Array(dtype='float32', default_value=np.empty(shape=(0,3,3), dtype='float32')).tag(sync=True, **array_serialization).valid(shape_constraints(None, 3, 3))
278279
#vertices = List(vector3(CFloat)).tag(sync=True)
279280
colors = List(Color).tag(sync=True)
280281
#faces = List(List(CFloat)).tag(sync=True)
@@ -290,7 +291,7 @@ class PlainBufferGeometry(Geometry):
290291

291292
vertices = Array(dtype='float32').tag(sync=True, **array_serialization).valid(shape_constraints(None,3))
292293
faces = Array(dtype='uint32').tag(sync=True, **array_serialization).valid(shape_constraints(None,3))
293-
colors = Array(dtype='float32', help="Vertex colors").tag(sync=True, **array_serialization).valid(shape_constraints(None,3))
294+
colors = Array(dtype='float32', default_value=np.empty(shape=(0,3), dtype='float32'), help="Vertex colors").tag(sync=True, **array_serialization).valid(shape_constraints(None,3))
294295

295296
class SphereGeometry(Geometry):
296297
_view_name = Unicode('SphereGeometryView').tag(sync=True)

pythreejs/traits_numpy.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ def array_from_json(value, widget):
2626
def shape_constraints(*args):
2727
"""Example: shape_constraints(None,3) insists that the shape looks like (*,3)"""
2828
def validator(trait, value):
29+
if trait.allow_none:
30+
print(value)
2931
if len(value.shape) != len(args):
3032
raise TraitError('%s shape expected to have %s components, but got %s components'%(trait.name, len(args), (value, type(value))))
3133
for i, constraint in enumerate(args):

0 commit comments

Comments
 (0)