| 
									
										
										
										
											2016-06-18 14:46:12 +02:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*  sprite_3d.cpp                                                        */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							| 
									
										
										
										
											2017-08-27 14:16:55 +02:00
										 |  |  | /*                      https://godotengine.org                          */ | 
					
						
							| 
									
										
										
										
											2016-06-18 14:46:12 +02:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2020-01-01 11:16:22 +01:00
										 |  |  | /* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							|  |  |  | /* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).   */ | 
					
						
							| 
									
										
										
										
											2016-06-18 14:46:12 +02:00
										 |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the       */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including   */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,   */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to    */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to */ | 
					
						
							|  |  |  | /* the following conditions:                                             */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be        */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.       */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | #include "sprite_3d.h"
 | 
					
						
							| 
									
										
										
										
											2018-09-11 18:13:45 +02:00
										 |  |  | #include "core/core_string_names.h"
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | #include "scene/scene_string_names.h"
 | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | Color SpriteBase3D::_get_color_accum() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!color_dirty) | 
					
						
							|  |  |  | 		return color_accum; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (parent_sprite) | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		color_accum = parent_sprite->_get_color_accum(); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	else | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		color_accum = Color(1, 1, 1, 1); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	color_accum.r *= modulate.r; | 
					
						
							|  |  |  | 	color_accum.g *= modulate.g; | 
					
						
							|  |  |  | 	color_accum.b *= modulate.b; | 
					
						
							|  |  |  | 	color_accum.a *= modulate.a; | 
					
						
							|  |  |  | 	color_dirty = false; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	return color_accum; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SpriteBase3D::_propagate_color_changed() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (color_dirty) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	color_dirty = true; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	_queue_update(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (List<SpriteBase3D *>::Element *E = children.front(); E; E = E->next()) { | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		E->get()->_propagate_color_changed(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SpriteBase3D::_notification(int p_what) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (p_what == NOTIFICATION_ENTER_TREE) { | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if (!pending_update) | 
					
						
							|  |  |  | 			_im_update(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-24 22:58:51 +02:00
										 |  |  | 		parent_sprite = Object::cast_to<SpriteBase3D>(get_parent()); | 
					
						
							|  |  |  | 		if (parent_sprite) { | 
					
						
							|  |  |  | 			pI = parent_sprite->children.push_back(this); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (p_what == NOTIFICATION_EXIT_TREE) { | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if (parent_sprite) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			parent_sprite->children.erase(pI); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			pI = NULL; | 
					
						
							|  |  |  | 			parent_sprite = NULL; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SpriteBase3D::set_centered(bool p_center) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	centered = p_center; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	_queue_update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool SpriteBase3D::is_centered() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return centered; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void SpriteBase3D::set_offset(const Point2 &p_offset) { | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	offset = p_offset; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	_queue_update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | Point2 SpriteBase3D::get_offset() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return offset; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SpriteBase3D::set_flip_h(bool p_flip) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	hflip = p_flip; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	_queue_update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | bool SpriteBase3D::is_flipped_h() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return hflip; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SpriteBase3D::set_flip_v(bool p_flip) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	vflip = p_flip; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	_queue_update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | bool SpriteBase3D::is_flipped_v() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return vflip; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void SpriteBase3D::set_modulate(const Color &p_color) { | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	modulate = p_color; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	_propagate_color_changed(); | 
					
						
							|  |  |  | 	_queue_update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | Color SpriteBase3D::get_modulate() const { | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return modulate; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SpriteBase3D::set_pixel_size(float p_amount) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	pixel_size = p_amount; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	_queue_update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | float SpriteBase3D::get_pixel_size() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return pixel_size; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SpriteBase3D::set_opacity(float p_amount) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	opacity = p_amount; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	_queue_update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | float SpriteBase3D::get_opacity() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return opacity; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SpriteBase3D::set_axis(Vector3::Axis p_axis) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-24 14:53:26 +02:00
										 |  |  | 	ERR_FAIL_INDEX(p_axis, 3); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	axis = p_axis; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	_queue_update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | Vector3::Axis SpriteBase3D::get_axis() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return axis; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SpriteBase3D::_im_update() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_draw(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	pending_update = false; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	//texture->draw_rect_region(ci,dst_rect,src_rect,modulate);
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void SpriteBase3D::_queue_update() { | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (pending_update) | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-06 20:49:22 +02:00
										 |  |  | 	triangle_mesh.unref(); | 
					
						
							|  |  |  | 	update_gizmo(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	pending_update = true; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	call_deferred(SceneStringNames::get_singleton()->_im_update); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 21:09:00 -05:00
										 |  |  | AABB SpriteBase3D::get_aabb() const { | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return aabb; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-01-07 18:25:37 -03:00
										 |  |  | PoolVector<Face3> SpriteBase3D::get_faces(uint32_t p_usage_flags) const { | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-07 18:25:37 -03:00
										 |  |  | 	return PoolVector<Face3>(); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-06 20:49:22 +02:00
										 |  |  | Ref<TriangleMesh> SpriteBase3D::generate_triangle_mesh() const { | 
					
						
							|  |  |  | 	if (triangle_mesh.is_valid()) | 
					
						
							|  |  |  | 		return triangle_mesh; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	PoolVector<Vector3> faces; | 
					
						
							|  |  |  | 	faces.resize(6); | 
					
						
							|  |  |  | 	PoolVector<Vector3>::Write facesw = faces.write(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Rect2 final_rect = get_item_rect(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (final_rect.size.x == 0 || final_rect.size.y == 0) | 
					
						
							|  |  |  | 		return Ref<TriangleMesh>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	float pixel_size = get_pixel_size(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Vector2 vertices[4] = { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		(final_rect.position + Vector2(0, final_rect.size.y)) * pixel_size, | 
					
						
							|  |  |  | 		(final_rect.position + final_rect.size) * pixel_size, | 
					
						
							|  |  |  | 		(final_rect.position + Vector2(final_rect.size.x, 0)) * pixel_size, | 
					
						
							|  |  |  | 		final_rect.position * pixel_size, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	int x_axis = ((axis + 1) % 3); | 
					
						
							|  |  |  | 	int y_axis = ((axis + 2) % 3); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (axis != Vector3::AXIS_Z) { | 
					
						
							|  |  |  | 		SWAP(x_axis, y_axis); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for (int i = 0; i < 4; i++) { | 
					
						
							|  |  |  | 			if (axis == Vector3::AXIS_Y) { | 
					
						
							|  |  |  | 				vertices[i].y = -vertices[i].y; | 
					
						
							|  |  |  | 			} else if (axis == Vector3::AXIS_X) { | 
					
						
							|  |  |  | 				vertices[i].x = -vertices[i].x; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static const int indices[6] = { | 
					
						
							|  |  |  | 		0, 1, 2, | 
					
						
							|  |  |  | 		0, 2, 3 | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (int j = 0; j < 6; j++) { | 
					
						
							|  |  |  | 		int i = indices[j]; | 
					
						
							|  |  |  | 		Vector3 vtx; | 
					
						
							|  |  |  | 		vtx[x_axis] = vertices[i][0]; | 
					
						
							|  |  |  | 		vtx[y_axis] = vertices[i][1]; | 
					
						
							|  |  |  | 		facesw[j] = vtx; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-05 18:08:43 +01:00
										 |  |  | 	facesw.release(); | 
					
						
							| 
									
										
										
										
											2018-05-06 20:49:22 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	triangle_mesh = Ref<TriangleMesh>(memnew(TriangleMesh)); | 
					
						
							|  |  |  | 	triangle_mesh->create(faces); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return triangle_mesh; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void SpriteBase3D::set_draw_flag(DrawFlags p_flag, bool p_enable) { | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_INDEX(p_flag, FLAG_MAX); | 
					
						
							|  |  |  | 	flags[p_flag] = p_enable; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	_queue_update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | bool SpriteBase3D::get_draw_flag(DrawFlags p_flag) const { | 
					
						
							|  |  |  | 	ERR_FAIL_INDEX_V(p_flag, FLAG_MAX, false); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	return flags[p_flag]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void SpriteBase3D::set_alpha_cut_mode(AlphaCutMode p_mode) { | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_INDEX(p_mode, 3); | 
					
						
							|  |  |  | 	alpha_cut = p_mode; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	_queue_update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | SpriteBase3D::AlphaCutMode SpriteBase3D::get_alpha_cut_mode() const { | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return alpha_cut; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-17 01:04:36 +02:00
										 |  |  | void SpriteBase3D::set_billboard_mode(SpatialMaterial::BillboardMode p_mode) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ERR_FAIL_INDEX(p_mode, 3); | 
					
						
							|  |  |  | 	billboard_mode = p_mode; | 
					
						
							|  |  |  | 	_queue_update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SpatialMaterial::BillboardMode SpriteBase3D::get_billboard_mode() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return billboard_mode; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | void SpriteBase3D::_bind_methods() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_centered", "centered"), &SpriteBase3D::set_centered); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("is_centered"), &SpriteBase3D::is_centered); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_offset", "offset"), &SpriteBase3D::set_offset); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_offset"), &SpriteBase3D::get_offset); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_flip_h", "flip_h"), &SpriteBase3D::set_flip_h); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("is_flipped_h"), &SpriteBase3D::is_flipped_h); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_flip_v", "flip_v"), &SpriteBase3D::set_flip_v); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("is_flipped_v"), &SpriteBase3D::is_flipped_v); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_modulate", "modulate"), &SpriteBase3D::set_modulate); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_modulate"), &SpriteBase3D::get_modulate); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_opacity", "opacity"), &SpriteBase3D::set_opacity); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_opacity"), &SpriteBase3D::get_opacity); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_pixel_size", "pixel_size"), &SpriteBase3D::set_pixel_size); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_pixel_size"), &SpriteBase3D::get_pixel_size); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_axis", "axis"), &SpriteBase3D::set_axis); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_axis"), &SpriteBase3D::get_axis); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_draw_flag", "flag", "enabled"), &SpriteBase3D::set_draw_flag); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_draw_flag", "flag"), &SpriteBase3D::get_draw_flag); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_alpha_cut_mode", "mode"), &SpriteBase3D::set_alpha_cut_mode); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_alpha_cut_mode"), &SpriteBase3D::get_alpha_cut_mode); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-17 01:04:36 +02:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_billboard_mode", "mode"), &SpriteBase3D::set_billboard_mode); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_billboard_mode"), &SpriteBase3D::get_billboard_mode); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("get_item_rect"), &SpriteBase3D::get_item_rect); | 
					
						
							| 
									
										
										
										
											2018-05-06 20:49:22 +02:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("generate_triangle_mesh"), &SpriteBase3D::generate_triangle_mesh); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("_queue_update"), &SpriteBase3D::_queue_update); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("_im_update"), &SpriteBase3D::_im_update); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "centered"), "set_centered", "is_centered"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "offset"), "set_offset", "get_offset"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "flip_h"), "set_flip_h", "is_flipped_h"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "flip_v"), "set_flip_v", "is_flipped_v"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::COLOR, "modulate"), "set_modulate", "get_modulate"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::REAL, "opacity", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_opacity", "get_opacity"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::REAL, "pixel_size", PROPERTY_HINT_RANGE, "0.0001,128,0.0001"), "set_pixel_size", "get_pixel_size"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::INT, "axis", PROPERTY_HINT_ENUM, "X-Axis,Y-Axis,Z-Axis"), "set_axis", "get_axis"); | 
					
						
							|  |  |  | 	ADD_GROUP("Flags", ""); | 
					
						
							| 
									
										
										
										
											2019-07-17 01:04:36 +02:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::INT, "billboard", PROPERTY_HINT_ENUM, "Disabled,Enabled,Y-Billboard"), "set_billboard_mode", "get_billboard_mode"); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "transparent"), "set_draw_flag", "get_draw_flag", FLAG_TRANSPARENT); | 
					
						
							|  |  |  | 	ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "shaded"), "set_draw_flag", "get_draw_flag", FLAG_SHADED); | 
					
						
							| 
									
										
										
										
											2017-04-17 02:32:51 +01:00
										 |  |  | 	ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "double_sided"), "set_draw_flag", "get_draw_flag", FLAG_DOUBLE_SIDED); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::INT, "alpha_cut", PROPERTY_HINT_ENUM, "Disabled,Discard,Opaque Pre-Pass"), "set_alpha_cut_mode", "get_alpha_cut_mode"); | 
					
						
							| 
									
										
										
										
											2014-12-07 02:04:20 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-20 17:45:01 +02:00
										 |  |  | 	BIND_ENUM_CONSTANT(FLAG_TRANSPARENT); | 
					
						
							|  |  |  | 	BIND_ENUM_CONSTANT(FLAG_SHADED); | 
					
						
							|  |  |  | 	BIND_ENUM_CONSTANT(FLAG_DOUBLE_SIDED); | 
					
						
							|  |  |  | 	BIND_ENUM_CONSTANT(FLAG_MAX); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	BIND_ENUM_CONSTANT(ALPHA_CUT_DISABLED); | 
					
						
							|  |  |  | 	BIND_ENUM_CONSTANT(ALPHA_CUT_DISCARD); | 
					
						
							|  |  |  | 	BIND_ENUM_CONSTANT(ALPHA_CUT_OPAQUE_PREPASS); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SpriteBase3D::SpriteBase3D() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	color_dirty = true; | 
					
						
							|  |  |  | 	centered = true; | 
					
						
							|  |  |  | 	hflip = false; | 
					
						
							|  |  |  | 	vflip = false; | 
					
						
							|  |  |  | 	parent_sprite = NULL; | 
					
						
							|  |  |  | 	pI = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (int i = 0; i < FLAG_MAX; i++) | 
					
						
							| 
									
										
										
										
											2017-04-17 02:32:51 +01:00
										 |  |  | 		flags[i] = i == FLAG_TRANSPARENT || i == FLAG_DOUBLE_SIDED; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-17 21:32:24 +01:00
										 |  |  | 	alpha_cut = ALPHA_CUT_DISABLED; | 
					
						
							| 
									
										
										
										
											2019-07-17 01:04:36 +02:00
										 |  |  | 	billboard_mode = SpatialMaterial::BILLBOARD_DISABLED; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	axis = Vector3::AXIS_Z; | 
					
						
							|  |  |  | 	pixel_size = 0.01; | 
					
						
							|  |  |  | 	modulate = Color(1, 1, 1, 1); | 
					
						
							|  |  |  | 	pending_update = false; | 
					
						
							|  |  |  | 	opacity = 1.0; | 
					
						
							| 
									
										
										
										
											2020-06-26 20:22:25 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	material = VisualServer::get_singleton()->material_create(); | 
					
						
							|  |  |  | 	// Set defaults for material, names need to match up those in SpatialMaterial
 | 
					
						
							|  |  |  | 	VS::get_singleton()->material_set_param(material, "albedo", Color(1, 1, 1, 1)); | 
					
						
							|  |  |  | 	VS::get_singleton()->material_set_param(material, "specular", 0.5); | 
					
						
							|  |  |  | 	VS::get_singleton()->material_set_param(material, "metallic", 0.0); | 
					
						
							|  |  |  | 	VS::get_singleton()->material_set_param(material, "roughness", 1.0); | 
					
						
							|  |  |  | 	VS::get_singleton()->material_set_param(material, "uv1_offset", Vector3(0, 0, 0)); | 
					
						
							|  |  |  | 	VS::get_singleton()->material_set_param(material, "uv1_scale", Vector3(1, 1, 1)); | 
					
						
							|  |  |  | 	VS::get_singleton()->material_set_param(material, "uv2_offset", Vector3(0, 0, 0)); | 
					
						
							|  |  |  | 	VS::get_singleton()->material_set_param(material, "uv2_scale", Vector3(1, 1, 1)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	mesh = VisualServer::get_singleton()->mesh_create(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	PoolVector2Array mesh_vertices; | 
					
						
							|  |  |  | 	PoolVector3Array mesh_normals; | 
					
						
							|  |  |  | 	PoolRealArray mesh_tangents; | 
					
						
							|  |  |  | 	PoolColorArray mesh_colors; | 
					
						
							|  |  |  | 	PoolVector2Array mesh_uvs; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	mesh_vertices.resize(4); | 
					
						
							|  |  |  | 	mesh_normals.resize(4); | 
					
						
							|  |  |  | 	mesh_tangents.resize(16); | 
					
						
							|  |  |  | 	mesh_colors.resize(4); | 
					
						
							|  |  |  | 	mesh_uvs.resize(4); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// create basic mesh and store format information
 | 
					
						
							|  |  |  | 	for (int i = 0; i < 4; i++) { | 
					
						
							|  |  |  | 		mesh_normals.write()[i] = Vector3(0.0, 0.0, 0.0); | 
					
						
							|  |  |  | 		mesh_tangents.write()[i * 4 + 0] = 0.0; | 
					
						
							|  |  |  | 		mesh_tangents.write()[i * 4 + 1] = 0.0; | 
					
						
							|  |  |  | 		mesh_tangents.write()[i * 4 + 2] = 0.0; | 
					
						
							|  |  |  | 		mesh_tangents.write()[i * 4 + 3] = 0.0; | 
					
						
							|  |  |  | 		mesh_colors.write()[i] = Color(1.0, 1.0, 1.0, 1.0); | 
					
						
							|  |  |  | 		mesh_uvs.write()[i] = Vector2(0.0, 0.0); | 
					
						
							|  |  |  | 		mesh_vertices.write()[i] = Vector2(0.0, 0.0); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Array mesh_array; | 
					
						
							|  |  |  | 	mesh_array.resize(VS::ARRAY_MAX); | 
					
						
							|  |  |  | 	mesh_array[VS::ARRAY_VERTEX] = mesh_vertices; | 
					
						
							|  |  |  | 	mesh_array[VS::ARRAY_NORMAL] = mesh_normals; | 
					
						
							|  |  |  | 	mesh_array[VS::ARRAY_TANGENT] = mesh_tangents; | 
					
						
							|  |  |  | 	mesh_array[VS::ARRAY_COLOR] = mesh_colors; | 
					
						
							|  |  |  | 	mesh_array[VS::ARRAY_TEX_UV] = mesh_uvs; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	VS::get_singleton()->mesh_add_surface_from_arrays(mesh, VS::PRIMITIVE_TRIANGLE_FAN, mesh_array); | 
					
						
							|  |  |  | 	const int surface_vertex_len = VS::get_singleton()->mesh_surface_get_array_len(mesh, 0); | 
					
						
							|  |  |  | 	const int surface_index_len = VS::get_singleton()->mesh_surface_get_array_index_len(mesh, 0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-16 19:19:14 -07:00
										 |  |  | 	mesh_surface_format = VS::get_singleton()->mesh_surface_get_format(mesh, 0); | 
					
						
							| 
									
										
										
										
											2020-06-26 20:22:25 -07:00
										 |  |  | 	mesh_buffer = VS::get_singleton()->mesh_surface_get_array(mesh, 0); | 
					
						
							| 
									
										
										
										
											2020-08-16 19:19:14 -07:00
										 |  |  | 	mesh_stride = VS::get_singleton()->mesh_surface_make_offsets_from_format(mesh_surface_format, surface_vertex_len, surface_index_len, mesh_surface_offsets); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SpriteBase3D::~SpriteBase3D() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-26 20:22:25 -07:00
										 |  |  | 	VisualServer::get_singleton()->free(mesh); | 
					
						
							|  |  |  | 	VisualServer::get_singleton()->free(material); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ///////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void Sprite3D::_draw() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-26 20:22:25 -07:00
										 |  |  | 	set_base(RID()); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (!texture.is_valid()) | 
					
						
							| 
									
										
										
										
											2019-02-04 20:19:00 -02:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	Vector2 tsize = texture->get_size(); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (tsize.x == 0 || tsize.y == 0) | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-04 20:19:00 -02:00
										 |  |  | 	Rect2 base_rect; | 
					
						
							|  |  |  | 	if (region) | 
					
						
							|  |  |  | 		base_rect = region_rect; | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		base_rect = Rect2(0, 0, texture->get_width(), texture->get_height()); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-04 20:19:00 -02:00
										 |  |  | 	Size2 frame_size = base_rect.size / Size2(hframes, vframes); | 
					
						
							|  |  |  | 	Point2 frame_offset = Point2(frame % hframes, frame / hframes); | 
					
						
							|  |  |  | 	frame_offset *= frame_size; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-04 20:19:00 -02:00
										 |  |  | 	Point2 dest_offset = get_offset(); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	if (is_centered()) | 
					
						
							| 
									
										
										
										
											2019-02-04 20:19:00 -02:00
										 |  |  | 		dest_offset -= frame_size / 2; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-04 20:19:00 -02:00
										 |  |  | 	Rect2 src_rect(base_rect.position + frame_offset, frame_size); | 
					
						
							|  |  |  | 	Rect2 final_dst_rect(dest_offset, frame_size); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	Rect2 final_rect; | 
					
						
							|  |  |  | 	Rect2 final_src_rect; | 
					
						
							| 
									
										
										
										
											2019-02-04 20:19:00 -02:00
										 |  |  | 	if (!texture->get_rect_region(final_dst_rect, src_rect, final_rect, final_src_rect)) | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (final_rect.size.x == 0 || final_rect.size.y == 0) | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Color color = _get_color_accum(); | 
					
						
							|  |  |  | 	color.a *= get_opacity(); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	float pixel_size = get_pixel_size(); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Vector2 vertices[4] = { | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-04 00:25:13 +02:00
										 |  |  | 		(final_rect.position + Vector2(0, final_rect.size.y)) * pixel_size, | 
					
						
							|  |  |  | 		(final_rect.position + final_rect.size) * pixel_size, | 
					
						
							|  |  |  | 		(final_rect.position + Vector2(final_rect.size.x, 0)) * pixel_size, | 
					
						
							|  |  |  | 		final_rect.position * pixel_size, | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2018-05-07 16:05:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-27 15:24:56 -04:00
										 |  |  | 	Vector2 src_tsize = tsize; | 
					
						
							| 
									
										
										
										
											2018-05-07 16:05:28 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Properly setup UVs for impostor textures (AtlasTexture).
 | 
					
						
							|  |  |  | 	Ref<AtlasTexture> atlas_tex = texture; | 
					
						
							|  |  |  | 	if (atlas_tex != NULL) { | 
					
						
							|  |  |  | 		src_tsize[0] = atlas_tex->get_atlas()->get_width(); | 
					
						
							|  |  |  | 		src_tsize[1] = atlas_tex->get_atlas()->get_height(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Vector2 uvs[4] = { | 
					
						
							| 
									
										
										
										
											2018-08-27 15:24:56 -04:00
										 |  |  | 		final_src_rect.position / src_tsize, | 
					
						
							|  |  |  | 		(final_src_rect.position + Vector2(final_src_rect.size.x, 0)) / src_tsize, | 
					
						
							|  |  |  | 		(final_src_rect.position + final_src_rect.size) / src_tsize, | 
					
						
							|  |  |  | 		(final_src_rect.position + Vector2(0, final_src_rect.size.y)) / src_tsize, | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (is_flipped_h()) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		SWAP(uvs[0], uvs[1]); | 
					
						
							|  |  |  | 		SWAP(uvs[2], uvs[3]); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	if (is_flipped_v()) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		SWAP(uvs[0], uvs[3]); | 
					
						
							|  |  |  | 		SWAP(uvs[1], uvs[2]); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Vector3 normal; | 
					
						
							|  |  |  | 	int axis = get_axis(); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	normal[axis] = 1.0; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-17 12:11:35 +11:00
										 |  |  | 	Plane tangent; | 
					
						
							|  |  |  | 	if (axis == Vector3::AXIS_X) { | 
					
						
							| 
									
										
										
										
											2018-12-08 13:43:46 +11:00
										 |  |  | 		tangent = Plane(0, 0, -1, 1); | 
					
						
							| 
									
										
										
										
											2018-11-17 12:11:35 +11:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2018-12-08 13:43:46 +11:00
										 |  |  | 		tangent = Plane(1, 0, 0, 1); | 
					
						
							| 
									
										
										
										
											2018-11-17 12:11:35 +11:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	int x_axis = ((axis + 1) % 3); | 
					
						
							|  |  |  | 	int y_axis = ((axis + 2) % 3); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (axis != Vector3::AXIS_Z) { | 
					
						
							|  |  |  | 		SWAP(x_axis, y_axis); | 
					
						
							| 
									
										
										
										
											2014-09-21 01:43:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		for (int i = 0; i < 4; i++) { | 
					
						
							| 
									
										
										
										
											2014-09-21 01:43:42 -03:00
										 |  |  | 			//uvs[i] = Vector2(1.0,1.0)-uvs[i];
 | 
					
						
							|  |  |  | 			//SWAP(vertices[i].x,vertices[i].y);
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			if (axis == Vector3::AXIS_Y) { | 
					
						
							|  |  |  | 				vertices[i].y = -vertices[i].y; | 
					
						
							|  |  |  | 			} else if (axis == Vector3::AXIS_X) { | 
					
						
							|  |  |  | 				vertices[i].x = -vertices[i].x; | 
					
						
							| 
									
										
										
										
											2014-09-21 01:43:42 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 21:09:00 -05:00
										 |  |  | 	AABB aabb; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-26 20:22:25 -07:00
										 |  |  | 	// Buffer is using default compression, so everything except position is compressed
 | 
					
						
							|  |  |  | 	PoolVector<uint8_t>::Write write_buffer = mesh_buffer.write(); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-26 20:22:25 -07:00
										 |  |  | 	int8_t v_normal[4] = { | 
					
						
							|  |  |  | 		(int8_t)CLAMP(normal.x * 127, -128, 127), | 
					
						
							|  |  |  | 		(int8_t)CLAMP(normal.y * 127, -128, 127), | 
					
						
							|  |  |  | 		(int8_t)CLAMP(normal.z * 127, -128, 127), | 
					
						
							|  |  |  | 		0, | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	int8_t v_tangent[4] = { | 
					
						
							|  |  |  | 		(int8_t)CLAMP(tangent.normal.x * 127, -128, 127), | 
					
						
							|  |  |  | 		(int8_t)CLAMP(tangent.normal.y * 127, -128, 127), | 
					
						
							|  |  |  | 		(int8_t)CLAMP(tangent.normal.z * 127, -128, 127), | 
					
						
							|  |  |  | 		(int8_t)CLAMP(tangent.d * 127, -128, 127) | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	uint8_t v_color[4] = { | 
					
						
							|  |  |  | 		(uint8_t)CLAMP(int(color.r * 255.0), 0, 255), | 
					
						
							|  |  |  | 		(uint8_t)CLAMP(int(color.g * 255.0), 0, 255), | 
					
						
							|  |  |  | 		(uint8_t)CLAMP(int(color.b * 255.0), 0, 255), | 
					
						
							|  |  |  | 		(uint8_t)CLAMP(int(color.a * 255.0), 0, 255) | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (int i = 0; i < 4; i++) { | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 		Vector3 vtx; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		vtx[x_axis] = vertices[i][0]; | 
					
						
							|  |  |  | 		vtx[y_axis] = vertices[i][1]; | 
					
						
							|  |  |  | 		if (i == 0) { | 
					
						
							| 
									
										
										
										
											2017-06-06 20:33:51 +02:00
										 |  |  | 			aabb.position = vtx; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			aabb.size = Vector3(); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 		} else { | 
					
						
							|  |  |  | 			aabb.expand_to(vtx); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-08-16 19:19:14 -07:00
										 |  |  | 		if (mesh_surface_format & VS::ARRAY_COMPRESS_TEX_UV) { | 
					
						
							|  |  |  | 			uint16_t v_uv[2] = { Math::make_half_float(uvs[i].x), Math::make_half_float(uvs[i].y) }; | 
					
						
							|  |  |  | 			copymem(&write_buffer[i * mesh_stride + mesh_surface_offsets[VS::ARRAY_TEX_UV]], v_uv, 4); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			float v_uv[2] = { uvs[i].x, uvs[i].y }; | 
					
						
							|  |  |  | 			copymem(&write_buffer[i * mesh_stride + mesh_surface_offsets[VS::ARRAY_TEX_UV]], v_uv, 8); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-06-26 20:22:25 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		copymem(&write_buffer[i * mesh_stride + mesh_surface_offsets[VS::ARRAY_VERTEX]], &vertices[i], sizeof(float) * 2); | 
					
						
							|  |  |  | 		copymem(&write_buffer[i * mesh_stride + mesh_surface_offsets[VS::ARRAY_NORMAL]], v_normal, 4); | 
					
						
							|  |  |  | 		copymem(&write_buffer[i * mesh_stride + mesh_surface_offsets[VS::ARRAY_TANGENT]], v_tangent, 4); | 
					
						
							|  |  |  | 		copymem(&write_buffer[i * mesh_stride + mesh_surface_offsets[VS::ARRAY_COLOR]], v_color, 4); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-06-26 20:22:25 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	write_buffer.release(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	RID mesh = get_mesh(); | 
					
						
							|  |  |  | 	VS::get_singleton()->mesh_surface_update_region(mesh, 0, 0, mesh_buffer); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-20 20:22:12 -07:00
										 |  |  | 	VS::get_singleton()->mesh_set_custom_aabb(mesh, aabb); | 
					
						
							|  |  |  | 	set_aabb(aabb); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-26 20:22:25 -07:00
										 |  |  | 	set_base(mesh); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	RID mat = SpatialMaterial::get_material_rid_for_2d(get_draw_flag(FLAG_SHADED), get_draw_flag(FLAG_TRANSPARENT), get_draw_flag(FLAG_DOUBLE_SIDED), get_alpha_cut_mode() == ALPHA_CUT_DISCARD, get_alpha_cut_mode() == ALPHA_CUT_OPAQUE_PREPASS, get_billboard_mode() == SpatialMaterial::BILLBOARD_ENABLED, get_billboard_mode() == SpatialMaterial::BILLBOARD_FIXED_Y); | 
					
						
							|  |  |  | 	VS::get_singleton()->material_set_shader(get_material(), VS::get_singleton()->material_get_shader(mat)); | 
					
						
							|  |  |  | 	VS::get_singleton()->material_set_param(get_material(), "texture_albedo", texture->get_rid()); | 
					
						
							|  |  |  | 	VS::get_singleton()->instance_set_surface_material(get_instance(), 0, get_material()); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void Sprite3D::set_texture(const Ref<Texture> &p_texture) { | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (p_texture == texture) | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 	if (texture.is_valid()) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		texture->disconnect(CoreStringNames::get_singleton()->changed, this, SceneStringNames::get_singleton()->_queue_update); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	texture = p_texture; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	if (texture.is_valid()) { | 
					
						
							|  |  |  | 		texture->set_flags(texture->get_flags()); //remove repeat from texture, it looks bad in sprites
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		texture->connect(CoreStringNames::get_singleton()->changed, this, SceneStringNames::get_singleton()->_queue_update); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	_queue_update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Ref<Texture> Sprite3D::get_texture() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return texture; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void Sprite3D::set_region(bool p_region) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (p_region == region) | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	region = p_region; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	_queue_update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | bool Sprite3D::is_region() const { | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return region; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void Sprite3D::set_region_rect(const Rect2 &p_region_rect) { | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	bool changed = region_rect != p_region_rect; | 
					
						
							|  |  |  | 	region_rect = p_region_rect; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	if (region && changed) { | 
					
						
							|  |  |  | 		_queue_update(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Rect2 Sprite3D::get_region_rect() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return region_rect; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void Sprite3D::set_frame(int p_frame) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-20 08:09:57 +02:00
										 |  |  | 	ERR_FAIL_INDEX(p_frame, int64_t(vframes) * hframes); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-14 11:40:55 +02:00
										 |  |  | 	frame = p_frame; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-11 10:41:03 -03:00
										 |  |  | 	_queue_update(); | 
					
						
							| 
									
										
										
										
											2019-01-25 19:21:23 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	_change_notify("frame"); | 
					
						
							|  |  |  | 	_change_notify("frame_coords"); | 
					
						
							| 
									
										
										
										
											2015-01-02 13:08:28 -03:00
										 |  |  | 	emit_signal(SceneStringNames::get_singleton()->frame_changed); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int Sprite3D::get_frame() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return frame; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-25 19:21:23 +01:00
										 |  |  | void Sprite3D::set_frame_coords(const Vector2 &p_coord) { | 
					
						
							| 
									
										
										
										
											2019-10-13 08:44:44 +02:00
										 |  |  | 	ERR_FAIL_INDEX(int(p_coord.x), hframes); | 
					
						
							|  |  |  | 	ERR_FAIL_INDEX(int(p_coord.y), vframes); | 
					
						
							| 
									
										
										
										
											2019-01-25 19:21:23 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	set_frame(int(p_coord.y) * hframes + int(p_coord.x)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Vector2 Sprite3D::get_frame_coords() const { | 
					
						
							|  |  |  | 	return Vector2(frame % hframes, frame / hframes); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | void Sprite3D::set_vframes(int p_amount) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_COND(p_amount < 1); | 
					
						
							|  |  |  | 	vframes = p_amount; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	_queue_update(); | 
					
						
							| 
									
										
										
										
											2017-08-05 16:19:36 -03:00
										 |  |  | 	_change_notify(); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | } | 
					
						
							|  |  |  | int Sprite3D::get_vframes() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return vframes; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void Sprite3D::set_hframes(int p_amount) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_COND(p_amount < 1); | 
					
						
							|  |  |  | 	hframes = p_amount; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	_queue_update(); | 
					
						
							| 
									
										
										
										
											2017-08-05 16:19:36 -03:00
										 |  |  | 	_change_notify(); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | } | 
					
						
							|  |  |  | int Sprite3D::get_hframes() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return hframes; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Rect2 Sprite3D::get_item_rect() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (texture.is_null()) | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		return Rect2(0, 0, 1, 1); | 
					
						
							| 
									
										
										
										
											2017-01-14 12:26:56 +01:00
										 |  |  | 	/*
 | 
					
						
							|  |  |  | 	if (texture.is_null()) | 
					
						
							|  |  |  | 		return CanvasItem::get_item_rect(); | 
					
						
							|  |  |  | 	*/ | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Size2i s; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (region) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		s = region_rect.size; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		s = texture->get_size(); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		s = s / Point2(hframes, vframes); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-26 11:50:21 +02:00
										 |  |  | 	Point2 ofs = get_offset(); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 	if (is_centered()) | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		ofs -= s / 2; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (s == Size2(0, 0)) | 
					
						
							|  |  |  | 		s = Size2(1, 1); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	return Rect2(ofs, s); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void Sprite3D::_validate_property(PropertyInfo &property) const { | 
					
						
							| 
									
										
										
										
											2016-07-06 23:46:04 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (property.name == "frame") { | 
					
						
							| 
									
										
										
										
											2019-07-25 09:11:41 +02:00
										 |  |  | 		property.hint = PROPERTY_HINT_RANGE; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		property.hint_string = "0," + itos(vframes * hframes - 1) + ",1"; | 
					
						
							| 
									
										
										
										
											2019-07-25 09:11:41 +02:00
										 |  |  | 		property.usage |= PROPERTY_USAGE_KEYING_INCREMENTS; | 
					
						
							| 
									
										
										
										
											2016-07-06 23:46:04 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-10-22 19:01:23 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (property.name == "frame_coords") { | 
					
						
							|  |  |  | 		property.usage |= PROPERTY_USAGE_KEYING_INCREMENTS; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-07-06 23:46:04 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | void Sprite3D::_bind_methods() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-09 13:19:41 +02:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_texture", "texture"), &Sprite3D::set_texture); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_texture"), &Sprite3D::get_texture); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_region", "enabled"), &Sprite3D::set_region); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("is_region"), &Sprite3D::is_region); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_region_rect", "rect"), &Sprite3D::set_region_rect); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_region_rect"), &Sprite3D::get_region_rect); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_frame", "frame"), &Sprite3D::set_frame); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_frame"), &Sprite3D::get_frame); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-25 19:21:23 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_frame_coords", "coords"), &Sprite3D::set_frame_coords); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_frame_coords"), &Sprite3D::get_frame_coords); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_vframes", "vframes"), &Sprite3D::set_vframes); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_vframes"), &Sprite3D::get_vframes); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_hframes", "hframes"), &Sprite3D::set_hframes); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_hframes"), &Sprite3D::get_hframes); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture"); | 
					
						
							| 
									
										
										
										
											2017-06-25 18:57:28 -03:00
										 |  |  | 	ADD_GROUP("Animation", ""); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::INT, "vframes", PROPERTY_HINT_RANGE, "1,16384,1"), "set_vframes", "get_vframes"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::INT, "hframes", PROPERTY_HINT_RANGE, "1,16384,1"), "set_hframes", "get_hframes"); | 
					
						
							| 
									
										
										
										
											2019-07-25 09:11:41 +02:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::INT, "frame"), "set_frame", "get_frame"); | 
					
						
							| 
									
										
										
										
											2019-01-25 19:21:23 +01:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "frame_coords", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR), "set_frame_coords", "get_frame_coords"); | 
					
						
							| 
									
										
										
										
											2017-06-25 18:57:28 -03:00
										 |  |  | 	ADD_GROUP("Region", "region_"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "region_enabled"), "set_region", "is_region"); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::RECT2, "region_rect"), "set_region_rect", "get_region_rect"); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-07 02:04:20 -03:00
										 |  |  | 	ADD_SIGNAL(MethodInfo("frame_changed")); | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Sprite3D::Sprite3D() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	region = false; | 
					
						
							|  |  |  | 	frame = 0; | 
					
						
							|  |  |  | 	vframes = 1; | 
					
						
							|  |  |  | 	hframes = 1; | 
					
						
							| 
									
										
										
										
											2014-05-29 10:56:39 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | void AnimatedSprite3D::_draw() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-26 20:22:25 -07:00
										 |  |  | 	set_base(RID()); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (frames.is_null()) { | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (frame < 0) { | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!frames->has_animation(animation)) { | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Ref<Texture> texture = frames->get_frame(animation, frame); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 	if (!texture.is_valid()) | 
					
						
							|  |  |  | 		return; //no texuture no life
 | 
					
						
							|  |  |  | 	Vector2 tsize = texture->get_size(); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (tsize.x == 0 || tsize.y == 0) | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Size2i s = tsize; | 
					
						
							| 
									
										
										
										
											2018-10-26 11:50:21 +02:00
										 |  |  | 	Rect2 src_rect; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	src_rect.size = s; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-26 11:50:21 +02:00
										 |  |  | 	Point2 ofs = get_offset(); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 	if (is_centered()) | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		ofs -= s / 2; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-26 11:50:21 +02:00
										 |  |  | 	Rect2 dst_rect(ofs, s); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Rect2 final_rect; | 
					
						
							|  |  |  | 	Rect2 final_src_rect; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (!texture->get_rect_region(dst_rect, src_rect, final_rect, final_src_rect)) | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (final_rect.size.x == 0 || final_rect.size.y == 0) | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Color color = _get_color_accum(); | 
					
						
							|  |  |  | 	color.a *= get_opacity(); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	float pixel_size = get_pixel_size(); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Vector2 vertices[4] = { | 
					
						
							| 
									
										
										
										
											2018-05-07 15:44:27 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-04 00:25:13 +02:00
										 |  |  | 		(final_rect.position + Vector2(0, final_rect.size.y)) * pixel_size, | 
					
						
							|  |  |  | 		(final_rect.position + final_rect.size) * pixel_size, | 
					
						
							|  |  |  | 		(final_rect.position + Vector2(final_rect.size.x, 0)) * pixel_size, | 
					
						
							|  |  |  | 		final_rect.position * pixel_size, | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2018-05-07 16:05:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-27 15:24:56 -04:00
										 |  |  | 	Vector2 src_tsize = tsize; | 
					
						
							| 
									
										
										
										
											2018-05-07 16:05:28 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Properly setup UVs for impostor textures (AtlasTexture).
 | 
					
						
							|  |  |  | 	Ref<AtlasTexture> atlas_tex = texture; | 
					
						
							|  |  |  | 	if (atlas_tex != NULL) { | 
					
						
							|  |  |  | 		src_tsize[0] = atlas_tex->get_atlas()->get_width(); | 
					
						
							|  |  |  | 		src_tsize[1] = atlas_tex->get_atlas()->get_height(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Vector2 uvs[4] = { | 
					
						
							| 
									
										
										
										
											2018-08-27 15:24:56 -04:00
										 |  |  | 		final_src_rect.position / src_tsize, | 
					
						
							|  |  |  | 		(final_src_rect.position + Vector2(final_src_rect.size.x, 0)) / src_tsize, | 
					
						
							|  |  |  | 		(final_src_rect.position + final_src_rect.size) / src_tsize, | 
					
						
							|  |  |  | 		(final_src_rect.position + Vector2(0, final_src_rect.size.y)) / src_tsize, | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (is_flipped_h()) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		SWAP(uvs[0], uvs[1]); | 
					
						
							|  |  |  | 		SWAP(uvs[2], uvs[3]); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	if (is_flipped_v()) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		SWAP(uvs[0], uvs[3]); | 
					
						
							|  |  |  | 		SWAP(uvs[1], uvs[2]); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Vector3 normal; | 
					
						
							|  |  |  | 	int axis = get_axis(); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	normal[axis] = 1.0; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-17 12:11:35 +11:00
										 |  |  | 	Plane tangent; | 
					
						
							|  |  |  | 	if (axis == Vector3::AXIS_X) { | 
					
						
							|  |  |  | 		tangent = Plane(0, 0, -1, -1); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		tangent = Plane(1, 0, 0, -1); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 	int x_axis = ((axis + 1) % 3); | 
					
						
							|  |  |  | 	int y_axis = ((axis + 2) % 3); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (axis != Vector3::AXIS_Z) { | 
					
						
							|  |  |  | 		SWAP(x_axis, y_axis); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		for (int i = 0; i < 4; i++) { | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 			//uvs[i] = Vector2(1.0,1.0)-uvs[i];
 | 
					
						
							|  |  |  | 			//SWAP(vertices[i].x,vertices[i].y);
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			if (axis == Vector3::AXIS_Y) { | 
					
						
							|  |  |  | 				vertices[i].y = -vertices[i].y; | 
					
						
							|  |  |  | 			} else if (axis == Vector3::AXIS_X) { | 
					
						
							|  |  |  | 				vertices[i].x = -vertices[i].x; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 21:09:00 -05:00
										 |  |  | 	AABB aabb; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-26 20:22:25 -07:00
										 |  |  | 	// Buffer is using default compression, so everything except position is compressed
 | 
					
						
							|  |  |  | 	PoolVector<uint8_t>::Write write_buffer = mesh_buffer.write(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	int8_t v_normal[4] = { | 
					
						
							|  |  |  | 		(int8_t)CLAMP(normal.x * 127, -128, 127), | 
					
						
							|  |  |  | 		(int8_t)CLAMP(normal.y * 127, -128, 127), | 
					
						
							|  |  |  | 		(int8_t)CLAMP(normal.z * 127, -128, 127), | 
					
						
							|  |  |  | 		0, | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	int8_t v_tangent[4] = { | 
					
						
							|  |  |  | 		(int8_t)CLAMP(tangent.normal.x * 127, -128, 127), | 
					
						
							|  |  |  | 		(int8_t)CLAMP(tangent.normal.y * 127, -128, 127), | 
					
						
							|  |  |  | 		(int8_t)CLAMP(tangent.normal.z * 127, -128, 127), | 
					
						
							|  |  |  | 		(int8_t)CLAMP(tangent.d * 127, -128, 127) | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	uint8_t v_color[4] = { | 
					
						
							|  |  |  | 		(uint8_t)CLAMP(int(color.r * 255.0), 0, 255), | 
					
						
							|  |  |  | 		(uint8_t)CLAMP(int(color.g * 255.0), 0, 255), | 
					
						
							|  |  |  | 		(uint8_t)CLAMP(int(color.b * 255.0), 0, 255), | 
					
						
							|  |  |  | 		(uint8_t)CLAMP(int(color.a * 255.0), 0, 255) | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-26 20:22:25 -07:00
										 |  |  | 	for (int i = 0; i < 4; i++) { | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 		Vector3 vtx; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		vtx[x_axis] = vertices[i][0]; | 
					
						
							|  |  |  | 		vtx[y_axis] = vertices[i][1]; | 
					
						
							|  |  |  | 		if (i == 0) { | 
					
						
							| 
									
										
										
										
											2017-06-06 20:33:51 +02:00
										 |  |  | 			aabb.position = vtx; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			aabb.size = Vector3(); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 		} else { | 
					
						
							|  |  |  | 			aabb.expand_to(vtx); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-06-26 20:22:25 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-16 19:19:14 -07:00
										 |  |  | 		if (mesh_surface_format & VS::ARRAY_COMPRESS_TEX_UV) { | 
					
						
							|  |  |  | 			uint16_t v_uv[2] = { Math::make_half_float(uvs[i].x), Math::make_half_float(uvs[i].y) }; | 
					
						
							|  |  |  | 			copymem(&write_buffer[i * mesh_stride + mesh_surface_offsets[VS::ARRAY_TEX_UV]], v_uv, 4); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			float v_uv[2] = { uvs[i].x, uvs[i].y }; | 
					
						
							|  |  |  | 			copymem(&write_buffer[i * mesh_stride + mesh_surface_offsets[VS::ARRAY_TEX_UV]], v_uv, 8); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-26 20:22:25 -07:00
										 |  |  | 		copymem(&write_buffer[i * mesh_stride + mesh_surface_offsets[VS::ARRAY_VERTEX]], &vertices[i], sizeof(float) * 2); | 
					
						
							|  |  |  | 		copymem(&write_buffer[i * mesh_stride + mesh_surface_offsets[VS::ARRAY_NORMAL]], v_normal, 4); | 
					
						
							|  |  |  | 		copymem(&write_buffer[i * mesh_stride + mesh_surface_offsets[VS::ARRAY_TANGENT]], v_tangent, 4); | 
					
						
							|  |  |  | 		copymem(&write_buffer[i * mesh_stride + mesh_surface_offsets[VS::ARRAY_COLOR]], v_color, 4); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-06-26 20:22:25 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	write_buffer.release(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	RID mesh = get_mesh(); | 
					
						
							|  |  |  | 	VS::get_singleton()->mesh_surface_update_region(mesh, 0, 0, mesh_buffer); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-20 20:22:12 -07:00
										 |  |  | 	VS::get_singleton()->mesh_set_custom_aabb(mesh, aabb); | 
					
						
							|  |  |  | 	set_aabb(aabb); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-26 20:22:25 -07:00
										 |  |  | 	set_base(mesh); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	RID mat = SpatialMaterial::get_material_rid_for_2d(get_draw_flag(FLAG_SHADED), get_draw_flag(FLAG_TRANSPARENT), get_draw_flag(FLAG_DOUBLE_SIDED), get_alpha_cut_mode() == ALPHA_CUT_DISCARD, get_alpha_cut_mode() == ALPHA_CUT_OPAQUE_PREPASS, get_billboard_mode() == SpatialMaterial::BILLBOARD_ENABLED, get_billboard_mode() == SpatialMaterial::BILLBOARD_FIXED_Y); | 
					
						
							|  |  |  | 	VS::get_singleton()->material_set_shader(get_material(), VS::get_singleton()->material_get_shader(mat)); | 
					
						
							|  |  |  | 	VS::get_singleton()->material_set_param(get_material(), "texture_albedo", texture->get_rid()); | 
					
						
							|  |  |  | 	VS::get_singleton()->instance_set_surface_material(get_instance(), 0, get_material()); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void AnimatedSprite3D::_validate_property(PropertyInfo &property) const { | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (!frames.is_valid()) | 
					
						
							|  |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (property.name == "animation") { | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		property.hint = PROPERTY_HINT_ENUM; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 		List<StringName> names; | 
					
						
							|  |  |  | 		frames->get_animation_list(&names); | 
					
						
							|  |  |  | 		names.sort_custom<StringName::AlphCompare>(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		bool current_found = false; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		for (List<StringName>::Element *E = names.front(); E; E = E->next()) { | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 			if (E->prev()) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				property.hint_string += ","; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			property.hint_string += String(E->get()); | 
					
						
							|  |  |  | 			if (animation == E->get()) { | 
					
						
							|  |  |  | 				current_found = true; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (!current_found) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			if (property.hint_string == String()) { | 
					
						
							|  |  |  | 				property.hint_string = String(animation); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				property.hint_string = String(animation) + "," + property.hint_string; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (property.name == "frame") { | 
					
						
							|  |  |  | 		property.hint = PROPERTY_HINT_RANGE; | 
					
						
							| 
									
										
										
										
											2019-07-25 09:11:41 +02:00
										 |  |  | 		if (frames->has_animation(animation) && frames->get_frame_count(animation) > 1) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			property.hint_string = "0," + itos(frames->get_frame_count(animation) - 1) + ",1"; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-07-25 09:11:41 +02:00
										 |  |  | 		property.usage |= PROPERTY_USAGE_KEYING_INCREMENTS; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AnimatedSprite3D::_notification(int p_what) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	switch (p_what) { | 
					
						
							| 
									
										
										
										
											2017-01-10 18:02:19 -03:00
										 |  |  | 		case NOTIFICATION_INTERNAL_PROCESS: { | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			if (frames.is_null()) | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			if (!frames->has_animation(animation)) | 
					
						
							|  |  |  | 				return; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			if (frame < 0) | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 				return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			float speed = frames->get_animation_speed(animation); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			if (speed == 0) | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 				return; //do nothing
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			float remaining = get_process_delta_time(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			while (remaining) { | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				if (timeout <= 0) { | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					timeout = 1.0 / speed; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					int fc = frames->get_frame_count(animation); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					if (frame >= fc - 1) { | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 						if (frames->get_animation_loop(animation)) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 							frame = 0; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 						} else { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 							frame = fc - 1; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 						} | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						frame++; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					_queue_update(); | 
					
						
							|  |  |  | 					_change_notify("frame"); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				float to_process = MIN(timeout, remaining); | 
					
						
							|  |  |  | 				remaining -= to_process; | 
					
						
							|  |  |  | 				timeout -= to_process; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AnimatedSprite3D::set_sprite_frames(const Ref<SpriteFrames> &p_frames) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (frames.is_valid()) | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		frames->disconnect("changed", this, "_res_changed"); | 
					
						
							|  |  |  | 	frames = p_frames; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 	if (frames.is_valid()) | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		frames->connect("changed", this, "_res_changed"); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (!frames.is_valid()) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		frame = 0; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		set_frame(frame); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_change_notify(); | 
					
						
							|  |  |  | 	_reset_timeout(); | 
					
						
							|  |  |  | 	_queue_update(); | 
					
						
							|  |  |  | 	update_configuration_warning(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Ref<SpriteFrames> AnimatedSprite3D::get_sprite_frames() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return frames; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AnimatedSprite3D::set_frame(int p_frame) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!frames.is_valid()) { | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (frames->has_animation(animation)) { | 
					
						
							|  |  |  | 		int limit = frames->get_frame_count(animation); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		if (p_frame >= limit) | 
					
						
							|  |  |  | 			p_frame = limit - 1; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (p_frame < 0) | 
					
						
							|  |  |  | 		p_frame = 0; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (frame == p_frame) | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	frame = p_frame; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 	_reset_timeout(); | 
					
						
							| 
									
										
										
										
											2017-01-14 18:03:38 +01:00
										 |  |  | 	_queue_update(); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 	_change_notify("frame"); | 
					
						
							|  |  |  | 	emit_signal(SceneStringNames::get_singleton()->frame_changed); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | int AnimatedSprite3D::get_frame() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return frame; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Rect2 AnimatedSprite3D::get_item_rect() const { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (!frames.is_valid() || !frames->has_animation(animation) || frame < 0 || frame >= frames->get_frame_count(animation)) { | 
					
						
							|  |  |  | 		return Rect2(0, 0, 1, 1); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Ref<Texture> t; | 
					
						
							|  |  |  | 	if (animation) | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		t = frames->get_frame(animation, frame); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 	if (t.is_null()) | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		return Rect2(0, 0, 1, 1); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 	Size2i s = t->get_size(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-06 20:49:22 +02:00
										 |  |  | 	Point2 ofs = get_offset(); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 	if (centered) | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		ofs -= s / 2; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (s == Size2(0, 0)) | 
					
						
							|  |  |  | 		s = Size2(1, 1); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	return Rect2(ofs, s); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AnimatedSprite3D::_res_changed() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	set_frame(frame); | 
					
						
							|  |  |  | 	_change_notify("frame"); | 
					
						
							|  |  |  | 	_change_notify("animation"); | 
					
						
							|  |  |  | 	_queue_update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AnimatedSprite3D::_set_playing(bool p_playing) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (playing == p_playing) | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	playing = p_playing; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 	_reset_timeout(); | 
					
						
							| 
									
										
										
										
											2017-01-10 18:02:19 -03:00
										 |  |  | 	set_process_internal(playing); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool AnimatedSprite3D::_is_playing() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return playing; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void AnimatedSprite3D::play(const StringName &p_animation) { | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (p_animation) | 
					
						
							|  |  |  | 		set_animation(p_animation); | 
					
						
							|  |  |  | 	_set_playing(true); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void AnimatedSprite3D::stop() { | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	_set_playing(false); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool AnimatedSprite3D::is_playing() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return is_processing(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AnimatedSprite3D::_reset_timeout() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!playing) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (frames.is_valid() && frames->has_animation(animation)) { | 
					
						
							|  |  |  | 		float speed = frames->get_animation_speed(animation); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		if (speed > 0) { | 
					
						
							|  |  |  | 			timeout = 1.0 / speed; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			timeout = 0; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		timeout = 0; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void AnimatedSprite3D::set_animation(const StringName &p_animation) { | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (animation == p_animation) | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	animation = p_animation; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 	_reset_timeout(); | 
					
						
							|  |  |  | 	set_frame(0); | 
					
						
							|  |  |  | 	_change_notify(); | 
					
						
							| 
									
										
										
										
											2017-01-14 18:03:38 +01:00
										 |  |  | 	_queue_update(); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | StringName AnimatedSprite3D::get_animation() const { | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return animation; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | String AnimatedSprite3D::get_configuration_warning() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (frames.is_null()) { | 
					
						
							| 
									
										
										
										
											2019-07-09 00:17:04 +02:00
										 |  |  | 		return TTR("A SpriteFrames resource must be created or set in the \"Frames\" property in order for AnimatedSprite3D to display frames."); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return String(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AnimatedSprite3D::_bind_methods() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-09 13:19:41 +02:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_sprite_frames", "sprite_frames"), &AnimatedSprite3D::set_sprite_frames); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_sprite_frames"), &AnimatedSprite3D::get_sprite_frames); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_animation", "animation"), &AnimatedSprite3D::set_animation); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_animation"), &AnimatedSprite3D::get_animation); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("_set_playing", "playing"), &AnimatedSprite3D::_set_playing); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("_is_playing"), &AnimatedSprite3D::_is_playing); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("play", "anim"), &AnimatedSprite3D::play, DEFVAL(StringName())); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("stop"), &AnimatedSprite3D::stop); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("is_playing"), &AnimatedSprite3D::is_playing); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_frame", "frame"), &AnimatedSprite3D::set_frame); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_frame"), &AnimatedSprite3D::get_frame); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("_res_changed"), &AnimatedSprite3D::_res_changed); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	ADD_SIGNAL(MethodInfo("frame_changed")); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-08 11:30:02 -03:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "frames", PROPERTY_HINT_RESOURCE_TYPE, "SpriteFrames"), "set_sprite_frames", "get_sprite_frames"); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "animation"), "set_animation", "get_animation"); | 
					
						
							| 
									
										
										
										
											2019-07-25 09:11:41 +02:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::INT, "frame"), "set_frame", "get_frame"); | 
					
						
							| 
									
										
										
										
											2018-11-08 11:30:02 -03:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "playing"), "_set_playing", "_is_playing"); | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AnimatedSprite3D::AnimatedSprite3D() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	frame = 0; | 
					
						
							|  |  |  | 	playing = false; | 
					
						
							|  |  |  | 	animation = "default"; | 
					
						
							|  |  |  | 	timeout = 0; | 
					
						
							| 
									
										
										
										
											2016-06-08 18:03:06 -03:00
										 |  |  | } |