diff options
Diffstat (limited to 'scene/3d/sprite_3d.h')
-rw-r--r-- | scene/3d/sprite_3d.h | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/scene/3d/sprite_3d.h b/scene/3d/sprite_3d.h new file mode 100644 index 0000000000..1330cd1c30 --- /dev/null +++ b/scene/3d/sprite_3d.h @@ -0,0 +1,191 @@ +#ifndef SPRITE_3D_H +#define SPRITE_3D_H + +#include "scene/3d/visual_instance.h" +#include "scene/2d/animated_sprite.h" + + +class SpriteBase3D : public VisualInstance { + + OBJ_TYPE(SpriteBase3D,VisualInstance); +public: + + enum DrawFlags { + FLAG_TRANSPARENT, + FLAG_SHADED, + FLAG_MAX + + }; + + enum AlphaCutMode { + ALPHA_CUT_DISABLED, + ALPHA_CUT_DISCARD, + ALPHA_CUT_OPAQUE_PREPASS + }; + +private: + + + bool color_dirty; + Color color_accum; + + SpriteBase3D *parent_sprite; + List<SpriteBase3D*> children; + List<SpriteBase3D*>::Element *pI; + + bool centered; + Point2 offset; + + bool hflip; + bool vflip; + + + Color modulate; + float opacity; + + Vector3::Axis axis; + float pixel_size; + AABB aabb; + + RID immediate; + + bool flags[FLAG_MAX]; + AlphaCutMode alpha_cut; + bool pending_update; + void _im_update(); + + + void _propagate_color_changed(); + +protected: + + Color _get_color_accum(); + void _notification(int p_what); + static void _bind_methods(); + virtual void _draw()=0; + _FORCE_INLINE_ void set_aabb(const AABB& p_aabb) { aabb=p_aabb; } + _FORCE_INLINE_ RID& get_immediate() { return immediate; } + void _queue_update(); +public: + + void set_centered(bool p_center); + bool is_centered() const; + + void set_offset(const Point2& p_offset); + Point2 get_offset() const; + + void set_flip_h(bool p_flip); + bool is_flipped_h() const; + + void set_flip_v(bool p_flip); + bool is_flipped_v() const; + + void set_region(bool p_region); + bool is_region() const; + + void set_region_rect(const Rect2& p_region_rect); + Rect2 get_region_rect() const; + + void set_modulate(const Color& p_color); + Color get_modulate() const; + + void set_opacity(float p_amount); + float get_opacity() const; + + void set_pixel_size(float p_amount); + float get_pixel_size() const; + + void set_axis(Vector3::Axis p_amount); + Vector3::Axis get_axis() const; + + void set_draw_flag(DrawFlags p_flag,bool p_enable); + bool get_draw_flag(DrawFlags p_flag) const; + + void set_alpha_cut_mode(AlphaCutMode p_mode); + AlphaCutMode get_alpha_cut_mode() const; + + virtual Rect2 get_item_rect() const=0; + + virtual AABB get_aabb() const; + virtual DVector<Face3> get_faces(uint32_t p_usage_flags) const; + + SpriteBase3D(); + ~SpriteBase3D(); +}; + + +class Sprite3D : public SpriteBase3D { + + OBJ_TYPE(Sprite3D,SpriteBase3D); + Ref<Texture> texture; + + + bool region; + Rect2 region_rect; + + int frame; + + int vframes; + int hframes; +protected: + virtual void _draw(); + static void _bind_methods(); +public: + + + + void set_texture(const Ref<Texture>& p_texture); + Ref<Texture> get_texture() const; + + void set_region(bool p_region); + bool is_region() const; + + void set_region_rect(const Rect2& p_region_rect); + Rect2 get_region_rect() const; + + void set_frame(int p_frame); + int get_frame() const; + + void set_vframes(int p_amount); + int get_vframes() const; + + void set_hframes(int p_amount); + int get_hframes() const; + + virtual Rect2 get_item_rect() const; + + Sprite3D(); +// ~Sprite3D(); +}; + +class AnimatedSprite3D : public SpriteBase3D { + + OBJ_TYPE(AnimatedSprite3D,SpriteBase3D); + Ref<SpriteFrames> frames; + + + int frame; + +protected: + virtual void _draw(); + static void _bind_methods(); +public: + + + + void set_sprite_frames(const Ref<SpriteFrames>& p_sprite_frames); + Ref<SpriteFrames> get_sprite_frames() const; + + void set_frame(int p_frame); + int get_frame() const; + + + virtual Rect2 get_item_rect() const; + + AnimatedSprite3D(); +// ~AnimatedSprite3D(); +}; + +VARIANT_ENUM_CAST(SpriteBase3D::DrawFlags); +VARIANT_ENUM_CAST(SpriteBase3D::AlphaCutMode); +#endif // SPRITE_3D_H |