-
-
Notifications
You must be signed in to change notification settings - Fork 4
/
rotate_attribute.go
40 lines (31 loc) · 1.02 KB
/
rotate_attribute.go
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
package meshops
import (
"github.com/EliCDavis/polyform/math/quaternion"
"github.com/EliCDavis/polyform/modeling"
"github.com/EliCDavis/vector/vector3"
)
type RotateAttribute3DTransformer struct {
Attribute string
Amount quaternion.Quaternion
}
func (rat RotateAttribute3DTransformer) attribute() string {
return rat.Attribute
}
func (rat RotateAttribute3DTransformer) Transform(m modeling.Mesh) (results modeling.Mesh, err error) {
attribute := getAttribute(rat, modeling.PositionAttribute)
if err = RequireV3Attribute(m, attribute); err != nil {
return
}
return RotateAttribute3D(m, attribute, rat.Amount), nil
}
func RotateAttribute3D(m modeling.Mesh, attribute string, q quaternion.Quaternion) modeling.Mesh {
if err := RequireV3Attribute(m, attribute); err != nil {
panic(err)
}
oldData := m.Float3Attribute(attribute)
scaledData := make([]vector3.Float64, oldData.Len())
for i := 0; i < oldData.Len(); i++ {
scaledData[i] = q.Rotate(oldData.At(i))
}
return m.SetFloat3Attribute(attribute, scaledData)
}