Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //! Align an Entity, so the X axis is pointing along
- //! the global direction x,y,z.
- //! The up vector will be the Y axis.
- // \param entity - entity to align
- // \param x,y,z - direction to align
- // \param glob - global alignment (ignore parent rotation)
- FUNCTION EntityAlignVector%: entity%, x,y,z, glob%=FALSE
- LOCAL m[]
- LOCAL d
- ASSERT EntityIsValid(entity)
- m[] = g3DObj[entity].M[]
- d = x*x + y*y + z*z
- // must normalize before?
- IF ABS(d-1.0) > 0.01
- IF ABS(d)<0.0000001
- x=1
- y=0
- z=0
- ELSE
- d = 1.0 / SQR(d)
- x=x*d
- y=y*d
- z=z*d
- ENDIF
- ENDIF
- d=z
- // X
- m[ 0]=z
- m[ 1]=0
- m[ 2]=-x
- // Z
- m[8]=x
- m[9]=y
- m[10]=z
- // Y = ZxX
- m[4] = m[ 9]*m[2] - m[10]*m[1]
- m[5] = m[10]*m[0] - m[ 8]*m[2]
- m[6] = m[ 8]*m[1] - m[ 9]*m[0]
- IF glob AND g3DObj[entity].parent>=0
- LOCAL pm[]
- EntityInverseMatrix(g3DObj[EntityGetParent(entity)].Mg[], pm[])
- LOCAL x,y,z
- x=m[12]
- y=m[13]
- z=m[14]
- EntityMultMatrix4x4(g3DObj[entity].M[], pm[], m[])
- g3DObj[entity].M[12]=x
- g3DObj[entity].M[13]=y
- g3DObj[entity].M[14]=z
- ELSE
- g3DObj[entity].M[] = m[]
- ENDIF
- EntityUpdateMatrix(g3DObj[entity])
- ENDFUNCTION
Add Comment
Please, Sign In to add comment