@@ -4122,7 +4122,8 @@ def rotate_primitive(self, name: str, idx: int, rot: Tuple[float, float, float],
41224122 self ._logger .error (msg )
41234123 if self ._raise_on_error : raise RuntimeError (msg )
41244124
4125- def scale_geometry (self , name : str , s : float ,
4125+ def scale_geometry (self , name : str , s : Union [float , Tuple [float , float , float ]],
4126+ center : Optional [Tuple [float , float , float ]] = None ,
41264127 update : bool = True ) -> None :
41274128 """Scale all primitive's positions and sizes.
41284129
@@ -4136,19 +4137,44 @@ def scale_geometry(self, name: str, s: float,
41364137 ----------
41374138 name : string
41384139 Name of the geometry.
4139- s : float
4140- Scaling factor.
4140+ s : float, tuple (float, float, float)
4141+ Scaling factor, single value or (x, y, z) scales.
4142+ center : tuple (float, float, float), optional
4143+ Scaling center. If not provided, scaling is made w.r.t. the primitive center.
41414144 update : bool, optional
41424145 Update GPU buffer.
41434146 """
41444147 if name is None : raise ValueError ()
41454148
4146- if not self ._optix .scale_geometry (name , s , update ):
4147- msg = "Geometry scale failed."
4148- self ._logger .error (msg )
4149- if self ._raise_on_error : raise RuntimeError (msg )
4149+ if isinstance (s , float ) or isinstance (s , int ):
4150+ s = float (s )
4151+ if center is None :
4152+ if not self ._optix .scale_geometry (name , s , update ):
4153+ msg = "Geometry scale by scalar failed."
4154+ self ._logger .error (msg )
4155+ if self ._raise_on_error : raise RuntimeError (msg )
4156+ else :
4157+ if not isinstance (center , tuple ): center = tuple (center )
4158+ if not self ._optix .scale_geometry_c (name , s , center [0 ], center [1 ], center [2 ], update ):
4159+ msg = "Geometry scale by scalar w.r.t. the center failed."
4160+ self ._logger .error (msg )
4161+ if self ._raise_on_error : raise RuntimeError (msg )
4162+ else :
4163+ if not isinstance (s , tuple ): s = tuple (s )
4164+ if center is None :
4165+ if not self ._optix .scale_geometry_xyz (name , s [0 ], s [1 ], s [2 ], update ):
4166+ msg = "Geometry scale by vector failed."
4167+ self ._logger .error (msg )
4168+ if self ._raise_on_error : raise RuntimeError (msg )
4169+ else :
4170+ if not isinstance (center , tuple ): center = tuple (center )
4171+ if not self ._optix .scale_geometry_xyz_c (name , s [0 ], s [1 ], s [2 ], center [0 ], center [1 ], center [2 ], update ):
4172+ msg = "Geometry scale by vector w.r.t. the center failed."
4173+ self ._logger .error (msg )
4174+ if self ._raise_on_error : raise RuntimeError (msg )
41504175
4151- def scale_primitive (self , name : str , idx : int , s : float ,
4176+ def scale_primitive (self , name : str , idx : int , s : Union [float , Tuple [float , float , float ]],
4177+ center : Optional [Tuple [float , float , float ]] = None ,
41524178 update : bool = True ) -> None :
41534179 """Scale selected primitive.
41544180
@@ -4164,17 +4190,41 @@ def scale_primitive(self, name: str, idx: int, s: float,
41644190 Name of the geometry.
41654191 idx : int
41664192 Primitive index.
4167- s : float
4168- Scaling factor.
4193+ s : float, tuple (float, float, float)
4194+ Scaling factor, single value or (x, y, z) scales.
4195+ center : tuple (float, float, float), optional
4196+ Scaling center. If not provided, scaling is made w.r.t. the primitive center.
41694197 update : bool, optional
41704198 Update GPU buffer.
41714199 """
41724200 if name is None : raise ValueError ()
41734201
4174- if not self ._optix .scale_primitive (name , idx , s , update ):
4175- msg = "Primitive scale failed."
4176- self ._logger .error (msg )
4177- if self ._raise_on_error : raise RuntimeError (msg )
4202+ if isinstance (s , float ) or isinstance (s , int ):
4203+ s = float (s )
4204+ if center is None :
4205+ if not self ._optix .scale_primitive (name , idx , s , update ):
4206+ msg = "Primitive scale by scalar failed."
4207+ self ._logger .error (msg )
4208+ if self ._raise_on_error : raise RuntimeError (msg )
4209+ else :
4210+ if not isinstance (center , tuple ): center = tuple (center )
4211+ if not self ._optix .scale_primitive_c (name , idx , s , center [0 ], center [1 ], center [2 ], update ):
4212+ msg = "Primitive scale by scalar w.r.t. the center failed."
4213+ self ._logger .error (msg )
4214+ if self ._raise_on_error : raise RuntimeError (msg )
4215+ else :
4216+ if not isinstance (s , tuple ): s = tuple (s )
4217+ if center is None :
4218+ if not self ._optix .scale_primitive_xyz (name , idx , s [0 ], s [1 ], s [2 ], update ):
4219+ msg = "Primitive scale by vector failed."
4220+ self ._logger .error (msg )
4221+ if self ._raise_on_error : raise RuntimeError (msg )
4222+ else :
4223+ if not isinstance (center , tuple ): center = tuple (center )
4224+ if not self ._optix .scale_primitive_xyz_c (name , idx , s [0 ], s [1 ], s [2 ], center [0 ], center [1 ], center [2 ], update ):
4225+ msg = "Primitive scale by vector w.r.t. the center failed."
4226+ self ._logger .error (msg )
4227+ if self ._raise_on_error : raise RuntimeError (msg )
41784228
41794229 def update_geom_buffers (self , name : str ,
41804230 mask : Union [GeomBuffer , str ] = GeomBuffer .All ) -> None :
0 commit comments