func (c *ColorM) Concat(other *ColorM) *ColorM {
	if !c.isInited() {
		return other
	}
	if !other.isInited() {
		return c
	}

	lhsb := colorMIdentityBody
	lhst := colorMIdentityTranslate
	rhsb := colorMIdentityBody
	rhst := colorMIdentityTranslate
	if other.isInited() {
		if other.body != nil {
			lhsb = other.body
		}
		if other.translate != nil {
			lhst = other.translate
		}
	}
	if c.isInited() {
		if c.body != nil {
			rhsb = c.body
		}
		if c.translate != nil {
			rhst = c.translate
		}
	}

	return &ColorM{
		// TODO: This is a temporary hack to calculate multiply of transposed matrices.
		// Fix mulSquare implmentation and swap the arguments.
		body: mulSquare(rhsb, lhsb, ColorMDim-1),
		translate: []float32{
			lhsb[0]*rhst[0] + lhsb[4]*rhst[1] + lhsb[8]*rhst[2] + lhsb[12]*rhst[3] + lhst[0],
			lhsb[1]*rhst[0] + lhsb[5]*rhst[1] + lhsb[9]*rhst[2] + lhsb[13]*rhst[3] + lhst[1],
			lhsb[2]*rhst[0] + lhsb[6]*rhst[1] + lhsb[10]*rhst[2] + lhsb[14]*rhst[3] + lhst[2],
			lhsb[3]*rhst[0] + lhsb[7]*rhst[1] + lhsb[11]*rhst[2] + lhsb[15]*rhst[3] + lhst[3],
		},
	}
}
func (c *ColorM) Concat(other *ColorM) *ColorM {
	if !c.isInited() {
		return other
	}
	if !other.isInited() {
		return c
	}

	lhsb := colorMIdentityBody
	lhst := colorMIdentityTranslate
	rhsb := colorMIdentityBody
	rhst := colorMIdentityTranslate
	if other.isInited() {
		if other.body != nil {
			lhsb = other.body
		}
		if other.translate != nil {
			lhst = other.translate
		}
	}
	if c.isInited() {
		if c.body != nil {
			rhsb = c.body
		}
		if c.translate != nil {
			rhst = c.translate
		}
	}

	return &ColorM{
		
		
		body: mulSquare(rhsb, lhsb, ColorMDim-1),
		translate: []float32{
			lhsb[0]*rhst[0] + lhsb[4]*rhst[1] + lhsb[8]*rhst[2] + lhsb[12]*rhst[3] + lhst[0],
			lhsb[1]*rhst[0] + lhsb[5]*rhst[1] + lhsb[9]*rhst[2] + lhsb[13]*rhst[3] + lhst[1],
			lhsb[2]*rhst[0] + lhsb[6]*rhst[1] + lhsb[10]*rhst[2] + lhsb[14]*rhst[3] + lhst[2],
			lhsb[3]*rhst[0] + lhsb[7]*rhst[1] + lhsb[11]*rhst[2] + lhsb[15]*rhst[3] + lhst[3],
		},
	}
}
func ( c * ColorM ) Concat ( other * ColorM ) * ColorM { if ! c . isInited ( ) { return other } if ! other . isInited ( ) { return c } lhsb := colorMIdentityBody lhst := colorMIdentityTranslate rhsb := colorMIdentityBody rhst := colorMIdentityTranslate if other . isInited ( ) { if other . body != nil { lhsb = other . body } if other . translate != nil { lhst = other . translate } } if c . isInited ( ) { if c . body != nil { rhsb = c . body } if c . translate != nil { rhst = c . translate } } return & ColorM { // TODO: This is a temporary hack to calculate multiply of transposed matrices. // Fix mulSquare implmentation and swap the arguments. body : mulSquare ( rhsb , lhsb , ColorMDim - 1 ) , translate : [ ] float32 { lhsb [ 0 ] * rhst [ 0 ] + lhsb [ 4 ] * rhst [ 1 ] + lhsb [ 8 ] * rhst [ 2 ] + lhsb [ 12 ] * rhst [ 3 ] + lhst [ 0 ] , lhsb [ 1 ] * rhst [ 0 ] + lhsb [ 5 ] * rhst [ 1 ] + lhsb [ 9 ] * rhst [ 2 ] + lhsb [ 13 ] * rhst [ 3 ] + lhst [ 1 ] , lhsb [ 2 ] * rhst [ 0 ] + lhsb [ 6 ] * rhst [ 1 ] + lhsb [ 10 ] * rhst [ 2 ] + lhsb [ 14 ] * rhst [ 3 ] + lhst [ 2 ] , lhsb [ 3 ] * rhst [ 0 ] + lhsb [ 7 ] * rhst [ 1 ] + lhsb [ 11 ] * rhst [ 2 ] + lhsb [ 15 ] * rhst [ 3 ] + lhst [ 3 ] , } , } }
// Concat multiplies a color matrix with the other color matrix.
// This is same as muptiplying the matrix other and the matrix c in this order.
Concat multiplies a color matrix with the other color matrix . This is same as muptiplying the matrix other and the matrix c in this order .