MCPcopy Create free account
hub / github.com/EliCDavis/polyform / ModifyFloat3AttributeParallelWithPoolSize

Method ModifyFloat3AttributeParallelWithPoolSize

modeling/mesh.go:657–697  ·  view source on GitHub ↗
(atr string, size int, f func(i int, v vector3.Float64) vector3.Float64)

Source from the content-addressed store, hash-verified

655}
656
657func (m Mesh) ModifyFloat3AttributeParallelWithPoolSize(atr string, size int, f func(i int, v vector3.Float64) vector3.Float64) Mesh {
658 m.requireV3Attribute(atr)
659
660 if size < 1 {
661 panic(fmt.Errorf("unable to modify float3, invalid worker pool size: %d", size))
662 }
663
664 if size == 1 {
665 return m.ModifyFloat3Attribute(atr, f)
666 }
667
668 oldData := m.v3Data[atr]
669 modified := make([]vector3.Float64, len(oldData))
670
671 var wg sync.WaitGroup
672
673 workSize := int(math.Floor(float64(len(oldData)) / float64(size)))
674 for i := 0; i < size; i++ {
675 wg.Add(1)
676
677 jobSize := workSize
678
679 // Make sure to clean up potential last cell due to rounding error of
680 // division of number of CPUs
681 if i == size-1 {
682 jobSize = len(oldData) - (workSize * i)
683 }
684
685 go func(start, size int) {
686 defer wg.Done()
687 end := start + size
688 for i := start; i < end; i++ {
689 modified[i] = f(i, oldData[i])
690 }
691 }(workSize*i, jobSize)
692 }
693
694 wg.Wait()
695
696 return m.SetFloat3Attribute(atr, modified)
697}
698
699func (m Mesh) ModifyFloat2Attribute(atr string, f func(i int, v vector2.Float64) vector2.Float64) Mesh {
700 m.requireV2Attribute(atr)

Callers 1

Calls 4

requireV3AttributeMethod · 0.95
ModifyFloat3AttributeMethod · 0.95
SetFloat3AttributeMethod · 0.95
AddMethod · 0.65

Tested by

no test coverage detected