package ox import ( "github.com/hajimehoshi/ebiten/v2" //"fmt" ) import "surdeus.su/core/gg" import "surdeus.su/core/gg/mx" type Sprite struct { ObjectImpl gg.Transform ShaderOptions Floating bool Visibility } var ( //spritesOp DrawImageOptions ) func (s *Sprite) Draw(c Context) []EVertex { // Nothing to draw. if s.Images[0] == nil { return nil } t := s.GetRectangleToDraw().Transform m := t.GetMatrice() if !s.Floating { m.Concat(c.Camera.GetRealMatrix()) } // Drawing without shader. if s.Shader == nil { c.DrawImage(s.Images[0], &ebiten.DrawImageOptions{ GeoM: m, }) return nil } w, h := s.Images[0].Size() // Drawing with shader. c.DrawRectShader( w, h, s.Shader, &ebiten.DrawRectShaderOptions{ Images: s.Images, Uniforms: s.Uniforms, GeoM: m, }, ) return nil } // Return the rectangle that contains the sprite to draw. func (s *Sprite) GetRectangleToDraw() Rectangle { if s.Images[0] == nil { return Rectangle{} } w, h := s.Images[0].Size() t := s.Transform t.SetAround( t.Around().Mul( V(Float(w), Float(h)), ), ) return Rectangle{ Transform: t, } } // Return the rectangle that contains // the sprite in the engine. func (s *Sprite) GetRectangle() Rectangle { if s.Images[0] == nil { return Rectangle{ Transform: s.Transform, } } w, h := s.Images[0].Size() t := s.Transform return Rectangle{ Transform: t, Width: Float(w), Height: Float(h), } } // Get triangles of the rectangle that contains the sprite // and has the same widght and height. func (s *Sprite) MakeTriangles() Triangles { return s.Rectangle().MakeTriangles() } func (s *Sprite) Vertices() mx.Vectors { return s.GetRectangle().Vertices() } func (s *Sprite) Edges() mx.Lines { return s.GetRectangle().Edges() } func (s *Sprite) ContainsPoint(pt mx.Vector) bool { return s.GetRectangle().ContainsPoint(pt) } func (s *Sprite) GetContainedPoints(pts mx.Vectors) Points { return s.Rectangle().GetContainedPoints(pts) }