/
WaveDeformer.py
128 lines (102 loc) · 4.49 KB
/
WaveDeformer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
from FabricEngine.CreationPlatform.PySide.Widgets import *
from FabricEngine.CreationPlatform.Nodes.Primitives import *
from FabricEngine.CreationPlatform.Nodes.Kinematics import *
from FabricEngine.CreationPlatform.Nodes.Lights import *
from FabricEngine.CreationPlatform.Nodes.Rendering import *
from FabricEngine.CreationPlatform.Nodes.Manipulation import *
from FabricEngine.CreationPlatform.Nodes.Animation import *
from FabricEngine.CreationPlatform.Nodes.Geometry.StructuredGeometryComponents.DeformComponentImpl import DeformComponent
from FabricEngine.CreationPlatform.RT.Math import *
class WaveDeformComponent(DeformComponent):
def _setDefaultOptions(self, options):
super(WaveDeformComponent, self)._setDefaultOptions(options)
options.setdefault('name', "wave")
options.setdefault('axis', Vec3(1.0, 0.0, 0.0))
options.setdefault('center', Vec3(0.0, 0.0, 0.0))
options.setdefault('amplitude', 0.2)
options.setdefault('frequency', 3.0)
options.setdefault('speed', 5.0)
options.setdefault('timeNode', None)
def apply(self, node):
# ensure that we apply this component to a polygonmesh only
if not node.isTypeOf('PolygonMesh'):
raise Exception("Node not of type PolygonMesh!")
super(WaveDeformComponent, self).apply(node)
# take care of the time reference interface
if not node.getReferenceMap().has_key('WaveDeformTime'):
node.addReferenceInterface('WaveDeformTime', 'Time', True)
# check if we have a timenode setup already
if not node.hasWaveDeformTimeNode():
timeNode = self._getOption('timeNode')
if timeNode is None or not timeNode.isTypeOf('Time'):
raise Exception("timeNode not specified or of wrong type!")
node.setWaveDeformTimeNode(timeNode)
# construct a unique name
name = self._getOption('name') + str(node.getNumComponents()) + '_'
# access the core node
dgNode = node.getGeometryDGNode()
# add all of the members
dgNode.addMember(name + 'axis', 'Vec3', self._getOption('axis'))
dgNode.addMember(name + 'center', 'Vec3', self._getOption('center'))
dgNode.addMember(name + 'amplitude', 'Scalar', self._getOption('amplitude'))
dgNode.addMember(name + 'frequency', 'Scalar', self._getOption('frequency'))
dgNode.addMember(name + 'speed', 'Scalar', self._getOption('speed'))
# add interfaces
self._addMemberInterface(dgNode, name+'axis', True)
self._addMemberInterface(dgNode, name+'center', True)
self._addMemberInterface(dgNode, name+'amplitude', True)
self._addMemberInterface(dgNode, name+'frequency', True)
self._addMemberInterface(dgNode, name+'speed', True)
# connect the time up
dgNode.setDependency(node.getWaveDeformTimeNode().getDGNode(), 'waveDeformTime')
# bind the operator
node.bindDGOperator(
dgNode.bindings,
name = "WaveDeformer",
layout = [
'self.polygonMesh',
'self.attributes',
'self.'+name+'axis',
'self.'+name+'center',
'self.'+name+'amplitude',
'self.'+name+'frequency',
'self.'+name+'speed',
'waveDeformTime.time'
],
fileName = FabricEngine.CreationPlatform.buildAbsolutePath('KL', 'WaveDeformer.kl')
)
class MyApp(Basic3DDemoApplication):
def __init__(self):
# call super class
super(MyApp, self).__init__()
# set the window title
self.setWindowTitle("Creation Platform Deformer Tutorial")
# access the scene, viewport and shadergroup
scene = self.getScene()
viewport = self.getViewport()
group = viewport.getShaderGroupNode()
# setup a camera
camera = TargetCamera(scene)
viewport.setCameraNode(camera)
CameraManipulator(scene)
# setup a light
light = PointLight(scene, transform = camera.getTransformNode())
# construct a torus structured mesh, transform and material
torus = PolygonMeshTorus(scene, detail = 80)
transform = Transform(scene)
material = Material(scene, xmlFile = 'Standard/Phong', shaderGroup = group, light = light)
# construct an instance
instance = Instance(scene,
geometry = torus,
transform = transform,
material = material
)
timeNode = scene.getNode('GlobalTime')
# apply wave deforms
deformer = WaveDeformComponent(timeNode = timeNode)
torus.addComponent(deformer)
deformer = WaveDeformComponent(axis = Vec3(0, 0, 1))
torus.addComponent(deformer)
self.constructionCompleted()
app = MyApp()
app.exec_()