github.com/cybriq/giocore@v0.0.7-0.20210703034601-cfb9cb5f3900/internal/ops/ops.go (about)

     1  // SPDX-License-Identifier: Unlicense OR MIT
     2  
     3  package ops
     4  
     5  import (
     6  	"encoding/binary"
     7  	"math"
     8  
     9  	"github.com/cybriq/giocore/f32"
    10  	"github.com/cybriq/giocore/internal/byteslice"
    11  	"github.com/cybriq/giocore/internal/opconst"
    12  	"github.com/cybriq/giocore/internal/scene"
    13  )
    14  
    15  func DecodeCommand(d []byte) scene.Command {
    16  	var cmd scene.Command
    17  	copy(byteslice.Uint32(cmd[:]), d)
    18  	return cmd
    19  }
    20  
    21  func EncodeCommand(out []byte, cmd scene.Command) {
    22  	copy(out, byteslice.Uint32(cmd[:]))
    23  }
    24  
    25  func DecodeTransform(data []byte) (t f32.Affine2D) {
    26  	if opconst.OpType(data[0]) != opconst.TypeTransform {
    27  		panic("invalid op")
    28  	}
    29  	data = data[1:]
    30  	data = data[:4*6]
    31  
    32  	bo := binary.LittleEndian
    33  	a := math.Float32frombits(bo.Uint32(data))
    34  	b := math.Float32frombits(bo.Uint32(data[4*1:]))
    35  	c := math.Float32frombits(bo.Uint32(data[4*2:]))
    36  	d := math.Float32frombits(bo.Uint32(data[4*3:]))
    37  	e := math.Float32frombits(bo.Uint32(data[4*4:]))
    38  	f := math.Float32frombits(bo.Uint32(data[4*5:]))
    39  	return f32.NewAffine2D(a, b, c, d, e, f)
    40  }
    41  
    42  // DecodeSave decodes the state id of a save op.
    43  func DecodeSave(data []byte) int {
    44  	if opconst.OpType(data[0]) != opconst.TypeSave {
    45  		panic("invalid op")
    46  	}
    47  	bo := binary.LittleEndian
    48  	return int(bo.Uint32(data[1:]))
    49  }
    50  
    51  // DecodeLoad decodes the state id and mask of a load op.
    52  func DecodeLoad(data []byte) (int, opconst.StateMask) {
    53  	if opconst.OpType(data[0]) != opconst.TypeLoad {
    54  		panic("invalid op")
    55  	}
    56  	bo := binary.LittleEndian
    57  	return int(bo.Uint32(data[2:])), opconst.StateMask(data[1])
    58  }