-
Notifications
You must be signed in to change notification settings - Fork 54
Expand file tree
/
Copy path__entity__.py
More file actions
84 lines (61 loc) · 3.51 KB
/
__entity__.py
File metadata and controls
84 lines (61 loc) · 3.51 KB
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
from stlib.core.baseParameters import BaseParameters
from stlib.collision import CollisionParameters, Collision
from stlib.visual import VisualParameters, Visual
from stlib.materials import Material, MaterialParameters
from stlib.geometries import Geometry
from typing import Callable, Optional
from stlib.geometries import GeometryParameters, InternalDataProvider
from splib.core.enum_types import StateType
from stlib.core.basePrefab import BasePrefab
from stlib.geometries.file import FileParameters
from stlib.materials.rigid import RigidParameters
from splib.core.enum_types import ElementType
class EntityParameters(BaseParameters):
name : str = "Entity"
stateType : StateType = StateType.RIGID
### QUID
addCollision : Optional[Callable] = Collision(CollisionParameters())
addVisual : Optional[Callable] = Visual(VisualParameters())
geometry : GeometryParameters = GeometryParameters(elementType = ElementType.POINTS, data = InternalDataProvider(position = [[0., 0., 0.]]))
material : MaterialParameters = RigidParameters()
collision : Optional[CollisionParameters] = None
visual : Optional[VisualParameters] = VisualParameters(geometry = FileParameters(filename="mesh/cube.obj"))
class Entity(BasePrefab):
# A simulated object
material : Material
visual : Visual
collision : Collision
geometry : Geometry
parameters : EntityParameters
def __init__(self, parameters: EntityParameters):
BasePrefab.__init__(self, parameters)
def init(self):
self.geometry = self.add(Geometry, parameters=self.parameters.geometry)
self.checkMaterialCompatibility()
self.material = self.add(Material, parameters=self.parameters.material)
self.material.getMechanicalState().position.parent = self.geometry.container.position.linkpath
if self.parameters.collision is not None:
self.collision = self.add(Collision, parameters=self.parameters.collision)
self.addMapping(self.collision)
if self.parameters.visual is not None:
self.visual = self.add(Visual, parameters=self.parameters.visual)
self.addMapping(self.visual)
def checkMaterialCompatibility(self):
if self.parameters.material.stateType != self.parameters.stateType:
print("WARNING: imcompatibility between templates of both the entity and the material")
self.parameters.material.stateType = self.parameters.stateType
def addMapping(self, destinationPrefab):
template = f'{self.parameters.stateType},Vec3' # TODO: check that it is always true
#TODO: all paths are expecting Geometry to be called Geomtry and so on. We need to robustify this by using the name parameter somehow
if( self.parameters.stateType == StateType.VEC3):
destinationPrefab.addObject("BarycentricMapping",
output=destinationPrefab.linkpath,
output_topology=destinationPrefab.geometry.container.linkpath,
input=self.material.linkpath,
input_topology=self.geometry.container.linkpath,
template=template)
else:
destinationPrefab.addObject("RigidMapping",
output=destinationPrefab.linkpath,
input=self.material.linkpath,
template=template)