Pārlūkot izejas kodu

"On Top" flag for Sprite3D

elasota 8 gadi atpakaļ
vecāks
revīzija
0895f02d87

+ 5 - 3
scene/3d/sprite_3d.cpp

@@ -273,11 +273,13 @@ void SpriteBase3D::_bind_methods() {
 	ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "flags/transparent"), _SCS("set_draw_flag"), _SCS("get_draw_flag"), FLAG_TRANSPARENT);
 	ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "flags/transparent"), _SCS("set_draw_flag"), _SCS("get_draw_flag"), FLAG_TRANSPARENT);
 	ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "flags/shaded"), _SCS("set_draw_flag"), _SCS("get_draw_flag"), FLAG_SHADED);
 	ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "flags/shaded"), _SCS("set_draw_flag"), _SCS("get_draw_flag"), FLAG_SHADED);
 	ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "flags/double_sided"), _SCS("set_draw_flag"), _SCS("get_draw_flag"), FLAG_DOUBLE_SIDED);
 	ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "flags/double_sided"), _SCS("set_draw_flag"), _SCS("get_draw_flag"), FLAG_DOUBLE_SIDED);
+	ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "flags/on_top"), _SCS("set_draw_flag"), _SCS("get_draw_flag"), FLAG_ONTOP);
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "flags/alpha_cut", PROPERTY_HINT_ENUM, "Disabled,Discard,Opaque Pre-Pass"), _SCS("set_alpha_cut_mode"), _SCS("get_alpha_cut_mode"));
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "flags/alpha_cut", PROPERTY_HINT_ENUM, "Disabled,Discard,Opaque Pre-Pass"), _SCS("set_alpha_cut_mode"), _SCS("get_alpha_cut_mode"));
 
 
 	BIND_CONSTANT(FLAG_TRANSPARENT);
 	BIND_CONSTANT(FLAG_TRANSPARENT);
 	BIND_CONSTANT(FLAG_SHADED);
 	BIND_CONSTANT(FLAG_SHADED);
 	BIND_CONSTANT(FLAG_DOUBLE_SIDED);
 	BIND_CONSTANT(FLAG_DOUBLE_SIDED);
+	BIND_CONSTANT(FLAG_ONTOP);
 	BIND_CONSTANT(FLAG_MAX);
 	BIND_CONSTANT(FLAG_MAX);
 
 
 	BIND_CONSTANT(ALPHA_CUT_DISABLED);
 	BIND_CONSTANT(ALPHA_CUT_DISABLED);
@@ -388,7 +390,7 @@ void Sprite3D::_draw() {
 	int axis = get_axis();
 	int axis = get_axis();
 	normal[axis] = 1.0;
 	normal[axis] = 1.0;
 
 
-	RID mat = VS::get_singleton()->material_2d_get(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);
+	RID mat = VS::get_singleton()->material_2d_get(get_draw_flag(FLAG_SHADED), get_draw_flag(FLAG_TRANSPARENT), get_draw_flag(FLAG_DOUBLE_SIDED), get_draw_flag(FLAG_ONTOP), get_alpha_cut_mode() == ALPHA_CUT_DISCARD, get_alpha_cut_mode() == ALPHA_CUT_OPAQUE_PREPASS);
 	VS::get_singleton()->immediate_set_material(immediate, mat);
 	VS::get_singleton()->immediate_set_material(immediate, mat);
 
 
 	VS::get_singleton()->immediate_begin(immediate, VS::PRIMITIVE_TRIANGLE_FAN, texture->get_rid());
 	VS::get_singleton()->immediate_begin(immediate, VS::PRIMITIVE_TRIANGLE_FAN, texture->get_rid());
@@ -672,7 +674,7 @@ void AnimatedSprite3D::_draw() {
 	int axis = get_axis();
 	int axis = get_axis();
 	normal[axis]=1.0;
 	normal[axis]=1.0;
 
 
-	RID mat = VS::get_singleton()->material_2d_get(get_draw_flag(FLAG_SHADED),get_draw_flag(FLAG_TRANSPARENT),get_alpha_cut_mode()==ALPHA_CUT_DISCARD,get_alpha_cut_mode()==ALPHA_CUT_OPAQUE_PREPASS);
+	RID mat = VS::get_singleton()->material_2d_get(get_draw_flag(FLAG_SHADED),get_draw_flag(FLAG_TRANSPARENT),get_draw_flag(FLAG_ONTOP),get_alpha_cut_mode()==ALPHA_CUT_DISCARD,get_alpha_cut_mode()==ALPHA_CUT_OPAQUE_PREPASS);
 	VS::get_singleton()->immediate_set_material(immediate,mat);
 	VS::get_singleton()->immediate_set_material(immediate,mat);
 
 
 	VS::get_singleton()->immediate_begin(immediate,VS::PRIMITIVE_TRIANGLE_FAN,texture->get_rid());
 	VS::get_singleton()->immediate_begin(immediate,VS::PRIMITIVE_TRIANGLE_FAN,texture->get_rid());
@@ -895,7 +897,7 @@ void AnimatedSprite3D::_draw() {
 	int axis = get_axis();
 	int axis = get_axis();
 	normal[axis] = 1.0;
 	normal[axis] = 1.0;
 
 
-	RID mat = VS::get_singleton()->material_2d_get(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);
+	RID mat = VS::get_singleton()->material_2d_get(get_draw_flag(FLAG_SHADED), get_draw_flag(FLAG_TRANSPARENT), get_draw_flag(FLAG_DOUBLE_SIDED), get_draw_flag(FLAG_ONTOP), get_alpha_cut_mode() == ALPHA_CUT_DISCARD, get_alpha_cut_mode() == ALPHA_CUT_OPAQUE_PREPASS);
 	VS::get_singleton()->immediate_set_material(immediate, mat);
 	VS::get_singleton()->immediate_set_material(immediate, mat);
 
 
 	VS::get_singleton()->immediate_begin(immediate, VS::PRIMITIVE_TRIANGLE_FAN, texture->get_rid());
 	VS::get_singleton()->immediate_begin(immediate, VS::PRIMITIVE_TRIANGLE_FAN, texture->get_rid());

+ 1 - 0
scene/3d/sprite_3d.h

@@ -42,6 +42,7 @@ public:
 		FLAG_TRANSPARENT,
 		FLAG_TRANSPARENT,
 		FLAG_SHADED,
 		FLAG_SHADED,
 		FLAG_DOUBLE_SIDED,
 		FLAG_DOUBLE_SIDED,
+		FLAG_ONTOP,
 		FLAG_MAX
 		FLAG_MAX
 
 
 	};
 	};

+ 4 - 1
servers/visual_server.cpp

@@ -283,7 +283,7 @@ RID VisualServer::make_sphere_mesh(int p_lats, int p_lons, float p_radius) {
 	return mesh;
 	return mesh;
 }
 }
 
 
-RID VisualServer::material_2d_get(bool p_shaded, bool p_transparent, bool p_double_sided, bool p_cut_alpha, bool p_opaque_prepass) {
+RID VisualServer::material_2d_get(bool p_shaded, bool p_transparent, bool p_double_sided, bool p_ontop, bool p_cut_alpha, bool p_opaque_prepass) {
 
 
 	int version = 0;
 	int version = 0;
 	if (p_shaded)
 	if (p_shaded)
@@ -296,6 +296,8 @@ RID VisualServer::material_2d_get(bool p_shaded, bool p_transparent, bool p_doub
 		version |= 8;
 		version |= 8;
 	if (p_double_sided)
 	if (p_double_sided)
 		version |= 16;
 		version |= 16;
+	if (p_ontop)
+		version |= 32;
 	if (material_2d[version].is_valid())
 	if (material_2d[version].is_valid())
 		return material_2d[version];
 		return material_2d[version];
 
 
@@ -307,6 +309,7 @@ RID VisualServer::material_2d_get(bool p_shaded, bool p_transparent, bool p_doub
 	fixed_material_set_flag(material_2d[version], FIXED_MATERIAL_FLAG_DISCARD_ALPHA, p_cut_alpha);
 	fixed_material_set_flag(material_2d[version], FIXED_MATERIAL_FLAG_DISCARD_ALPHA, p_cut_alpha);
 	material_set_flag(material_2d[version], MATERIAL_FLAG_UNSHADED, !p_shaded);
 	material_set_flag(material_2d[version], MATERIAL_FLAG_UNSHADED, !p_shaded);
 	material_set_flag(material_2d[version], MATERIAL_FLAG_DOUBLE_SIDED, p_double_sided);
 	material_set_flag(material_2d[version], MATERIAL_FLAG_DOUBLE_SIDED, p_double_sided);
+	material_set_flag(material_2d[version], MATERIAL_FLAG_ONTOP, p_ontop);
 	material_set_depth_draw_mode(material_2d[version], p_opaque_prepass ? MATERIAL_DEPTH_DRAW_OPAQUE_PRE_PASS_ALPHA : MATERIAL_DEPTH_DRAW_OPAQUE_ONLY);
 	material_set_depth_draw_mode(material_2d[version], p_opaque_prepass ? MATERIAL_DEPTH_DRAW_OPAQUE_PRE_PASS_ALPHA : MATERIAL_DEPTH_DRAW_OPAQUE_ONLY);
 	fixed_material_set_texture(material_2d[version], FIXED_MATERIAL_PARAM_DIFFUSE, get_white_texture());
 	fixed_material_set_texture(material_2d[version], FIXED_MATERIAL_PARAM_DIFFUSE, get_white_texture());
 	//material cut alpha?
 	//material cut alpha?

+ 1 - 1
servers/visual_server.h

@@ -1120,7 +1120,7 @@ public:
 
 
 	/* Materials for 2D on 3D */
 	/* Materials for 2D on 3D */
 
 
-	RID material_2d_get(bool p_shaded, bool p_transparent, bool p_double_sided, bool p_cut_alpha, bool p_opaque_prepass);
+	RID material_2d_get(bool p_shaded, bool p_transparent, bool p_double_sided, bool p_ontop, bool p_cut_alpha, bool p_opaque_prepass);
 
 
 	/* TESTING */
 	/* TESTING */