Skip to content

Commit 430edc5

Browse files
author
hartsantler
committed
fixed and refactored nested attribute lookups that were overloaded using @Property
1 parent 3262d08 commit 430edc5

4 files changed

Lines changed: 136 additions & 61 deletions

File tree

bindings/three.py

Lines changed: 66 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,40 @@
22
# by Brett Hartshorn - copyright 2013
33
# License: PSFLv2 - http://www.python.org/psf/license/
44

5+
class Color:
6+
def __init__(self, red=1.0, green=1.0, blue=1.0, object=None ):
7+
if object:
8+
self._color = object
9+
else:
10+
self._color = JS('new THREE.Vector3()')
11+
self.setRGB(red=red, green=green, blue=blue)
12+
13+
def setRGB(self, red=1.0, green=1.0, blue=1.0):
14+
color = self._color
15+
JS('color.setRGB(red, green, blue)')
16+
17+
@property
18+
def r(self):
19+
color = self._color
20+
return JS('color.r')
21+
@property
22+
def g(self):
23+
color = self._color
24+
return JS('color.g')
25+
@property
26+
def b(self):
27+
color = self._color
28+
return JS('color.b')
29+
30+
def clone(self):
31+
return Color( red=self.r, green=self.g, blue=self.b )
32+
533
class Vector3:
6-
def __init__(self, x=0, y=0, z=0 ):
7-
self._vec = JS('new THREE.Vector3(x,y,z)')
34+
def __init__(self, x=0, y=0, z=0, object=None ):
35+
if object:
36+
self._vec = object
37+
else:
38+
self._vec = JS('new THREE.Vector3(x,y,z)')
839

940
@property
1041
def x(self):
@@ -321,14 +352,24 @@ def setViewOffset(self, fullWidth, fullHeight, x, y, width, height):
321352
ob = self._object
322353
JS('ob.setViewOffset(fullWidth, fullHeight, x, y, width, height)')
323354

355+
@property
356+
def position(self):
357+
vec = self._object.position
358+
return Vector3( object=vec )
359+
360+
def get_position(self):
361+
vec = self._object.position
362+
return Vector3( object=vec )
363+
324364

325365
class Scene:
326366
def __init__(self):
327367
self._scene = JS('new THREE.Scene()')
328368

329369
def add(self, child):
330370
scene = self._scene
331-
JS('scene.add(child)')
371+
c = child._object
372+
JS('scene.add(c)')
332373

333374
def updateMatrixWorld(self):
334375
scene = self._scene
@@ -350,7 +391,14 @@ def getDomElement(self):
350391

351392
def render(self, scn, cam):
352393
renderer = self._renderer
353-
return JS('renderer.render(scn, cam)')
394+
s = scn._scene; c = cam._object
395+
return JS('renderer.render(s, c)')
396+
397+
398+
class CanvasRenderer( _Renderer ):
399+
def __init__(self):
400+
self._renderer = JS('new THREE.CanvasRenderer()')
401+
354402

355403
class CSS3DRenderer( _Renderer ):
356404
def __init__(self):
@@ -377,3 +425,17 @@ def loadTextureCube( urls ):
377425

378426
ImageUtils = _ImageUtils()
379427

428+
class MeshBasicMaterial:
429+
def __init__(self):
430+
self._object = JS('new THREE.MeshBasicMaterial( {color:0xff0000, wireframe:true} )')
431+
432+
class CubeGeometry:
433+
def __init__(self, width, height, length):
434+
self._object = JS('new THREE.CubeGeometry(width, height, length)')
435+
436+
437+
class Mesh:
438+
def __init__(self, geometry, material):
439+
g = geometry._object
440+
m = material._object
441+
self._object = JS('new THREE.Mesh(g,m)')

pythonscript/python_to_pythonjs.py

Lines changed: 24 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ def visit_ClassDef(self, node):
257257

258258
if self._catch_attributes:
259259
self._inline_classes[ name ] = self._catch_attributes
260-
writer.write('#$---: %s' %self._function_return_types)
260+
261261
self._catch_attributes = None
262262
self._decorator_properties = None
263263
self._instances.pop('self')
@@ -394,21 +394,24 @@ def visit_UnaryOp(self, node):
394394
return self.visit(node.op) + self.visit(node.operand)
395395

396396
def visit_Attribute(self, node):
397+
node_value = self.visit(node.value)
398+
typedef = None
397399
if isinstance(node.value, Name):
398-
name = self.visit( node.value )
399-
typedef = self.get_typedef( node.value )
400-
if typedef:
401-
if node.attr in typedef.properties:
402-
getter = typedef.properties[ node.attr ]['get']
403-
if getter in self._function_return_types:
404-
node.returns_type = self._function_return_types[getter]
405-
return '%s( [%s] )' %(getter, name)
406-
else:
407-
return 'get_attribute(%s, "%s")' % (name, node.attr)
400+
typedef = self.get_typedef( instance=node.value )
401+
elif hasattr(node.value, 'returns_type'):
402+
typedef = self.get_typedef( class_name=node.value.returns_type )
403+
404+
if typedef:
405+
if node.attr in typedef.properties:
406+
getter = typedef.properties[ node.attr ]['get']
407+
if getter in self._function_return_types:
408+
node.returns_type = self._function_return_types[getter]
409+
return '%s( [%s] )' %(getter, node_value)
408410
else:
409-
return 'get_attribute(%s, "%s")' % (name, node.attr)
411+
return 'get_attribute(%s, "%s")' % (node_value, node.attr)
410412
else:
411-
return 'get_attribute(%s, "%s")' % (self.visit(node.value), node.attr)
413+
return 'get_attribute(%s, "%s")' % (node_value, node.attr)
414+
412415

413416
def visit_Attribute_OLD(self, node):
414417
name = self.visit(node.value)
@@ -480,49 +483,25 @@ def visit_Assign(self, node):
480483
code = "get_attribute(get_attribute('%s', '__setitem__'), '__call__')([%s, %s], JSObject())"
481484
code = code % (self.visit(target.value), self.visit(target.slice.value), self.visit(node.value))
482485
writer.write(code)
483-
elif isinstance(target, Attribute):
484-
#name = self.visit(target.value)
485-
#if name == 'self' and isinstance(self._catch_attributes, set):
486-
# self._catch_attributes.add( target.attr )
487-
488-
fallback = True
489-
#if name in self._instances: ## support '.' operator overloading
490-
# klass = self._instances[ name ]
491-
# if klass in self._decorator_class_props and target.attr in self._decorator_class_props[klass]:
492-
# setter = self._decorator_class_props[klass][target.attr].get( 'set', None )
493-
# if setter:
494-
# #writer.write( '''JS('%s( [%s, %s] )')''' %(setter, name, self.visit(node.value)) ) ## can not nest have nested JS() calls
495-
# writer.write( '%s( [%s, %s] )' %(setter, name, self.visit(node.value)) )
496-
# fallback = False
497-
# else:
498-
# writer.write('#!!!! class is known: %s' %klass)
499-
#else:
500-
# writer.write('##fallback--unknown-type: %s - %s' %(target.value, name))
501486

487+
elif isinstance(target, Attribute):
502488
target_value = self.visit(target.value) ## target.value may have "returns_type" after being visited
489+
typedef = None
503490
if isinstance(target.value, Name):
504491
if target.value.id == 'self' and isinstance(self._catch_attributes, set):
505492
self._catch_attributes.add( target.attr )
506-
507493
typedef = self.get_typedef( instance=target.value )
508-
if typedef and target.attr in typedef.properties:
509-
setter = typedef.properties[ target.attr ].get('set',None)
510-
if setter:
511-
writer.write( '%s( [%s, %s] )' %(setter, target_value, self.visit(node.value)) )
512-
fallback = False
513-
514494
elif hasattr(target.value, 'returns_type'):
515-
writer.write('#### HEY: %s' %target.value.returns_type)
516495
typedef = self.get_typedef( class_name=target.value.returns_type )
517-
if typedef and target.attr in typedef.properties:
518-
setter = typedef.properties[ target.attr ].get('set',None)
519-
if setter:
520-
writer.write( '%s( [%s, %s] )' %(setter, target_value, self.visit(node.value)) )
521-
fallback = False
522496

497+
fallback = True
498+
if typedef and target.attr in typedef.properties:
499+
setter = typedef.properties[ target.attr ].get('set',None)
500+
if setter:
501+
writer.write( '%s( [%s, %s] )' %(setter, target_value, self.visit(node.value)) )
502+
fallback = False
523503

524504
if fallback:
525-
writer.write('#FALLBACK')
526505
code = 'set_attribute(%s, "%s", %s)' % (
527506
target_value,
528507
target.attr,

tests/threejs_helloworld.html

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,32 +6,39 @@
66
</head>
77

88
<body>
9-
<script type="text/python" closure="true">
9+
<script type="text/python" closure="false">
1010
from three import *
1111

12-
con = JS("document.createElement( 'div' )")
13-
JS('document.body.appendChild(con)')
12+
#con = JS("document.createElement( 'div' )")
13+
#JS('document.body.appendChild(con)')
1414

1515
width = 640; height = 320
1616
scn = Scene()
1717
cam = PerspectiveCamera( 45, width, height, 0.01, 10000)
18-
scn.add( cam )
18+
cam.position.z = 100
19+
cam.position.x = 5
1920

20-
ren = WebGLRenderer()
21-
ren.setSize( 640, 480 )
22-
ren.setClearColor( red=1.0, green=0.5, blue=0.5 )
21+
#scn.add( cam )
22+
23+
#ren = WebGLRenderer()
24+
ren = CanvasRenderer()
25+
ren.setSize( width, height )
26+
#ren.setClearColor( red=1.0, green=0.0, blue=0.5 )
2327

2428
element = ren.getDomElement()
25-
JS('con.appendChild( element )')
29+
#JS('con.appendChild( element )')
30+
JS('document.body.appendChild(element)')
2631

32+
geo = CubeGeometry( 10, 10, 10 )
33+
mat = MeshBasicMaterial()
34+
mesh = Mesh( geo, mat )
35+
scn.add( mesh )
2736

2837
def animate():
2938
JS('requestAnimationFrame( animate )')
3039
scn.updateMatrixWorld()
31-
s = scn._scene
32-
c = cam._object
33-
ren.render( s, c )
34-
print('rendering')
40+
ren.render( scn, cam )
41+
#print('rendering')
3542

3643
</script>
3744
<button onclick="animate()">click me</button>
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<html>
2+
<head>
3+
<script src="pythonscript.js"></script>
4+
<script src="libs/three/three.min.js"></script>
5+
<script src="bindings/three.py"></script>
6+
</head>
7+
8+
<body>
9+
<script type="text/python" closure="false">
10+
from three import *
11+
12+
def test():
13+
cam = PerspectiveCamera( 45, 640, 480, 0.01, 10000)
14+
p = cam.position
15+
p.z = 100
16+
print( p.z )
17+
18+
cam.position.x = 420
19+
print(cam.position.x)
20+
a = cam.position
21+
print(a.x)
22+
23+
24+
</script>
25+
<button onclick="test()">click me</button>
26+
</body>
27+
</html>

0 commit comments

Comments
 (0)