diff options
Diffstat (limited to 'modules/csg/csg_shape.cpp')
| -rw-r--r-- | modules/csg/csg_shape.cpp | 73 | 
1 files changed, 37 insertions, 36 deletions
diff --git a/modules/csg/csg_shape.cpp b/modules/csg/csg_shape.cpp index 40ba457e43..67dfdfb5eb 100644 --- a/modules/csg/csg_shape.cpp +++ b/modules/csg/csg_shape.cpp @@ -89,6 +89,7 @@ uint32_t CSGShape3D::get_collision_mask() const {  }  void CSGShape3D::set_collision_mask_bit(int p_bit, bool p_value) { +	ERR_FAIL_INDEX_MSG(p_bit, 32, "Collision mask bit must be between 0 and 31 inclusive.");  	uint32_t mask = get_collision_mask();  	if (p_value) {  		mask |= 1 << p_bit; @@ -99,20 +100,23 @@ void CSGShape3D::set_collision_mask_bit(int p_bit, bool p_value) {  }  bool CSGShape3D::get_collision_mask_bit(int p_bit) const { +	ERR_FAIL_INDEX_V_MSG(p_bit, 32, false, "Collision mask bit must be between 0 and 31 inclusive.");  	return get_collision_mask() & (1 << p_bit);  }  void CSGShape3D::set_collision_layer_bit(int p_bit, bool p_value) { -	uint32_t mask = get_collision_layer(); +	ERR_FAIL_INDEX_MSG(p_bit, 32, "Collision layer bit must be between 0 and 31 inclusive."); +	uint32_t layer = get_collision_layer();  	if (p_value) { -		mask |= 1 << p_bit; +		layer |= 1 << p_bit;  	} else { -		mask &= ~(1 << p_bit); +		layer &= ~(1 << p_bit);  	} -	set_collision_layer(mask); +	set_collision_layer(layer);  }  bool CSGShape3D::get_collision_layer_bit(int p_bit) const { +	ERR_FAIL_INDEX_V_MSG(p_bit, 32, false, "Collision layer bit must be between 0 and 31 inclusive.");  	return get_collision_layer() & (1 << p_bit);  } @@ -880,7 +884,7 @@ void CSGMesh3D::set_mesh(const Ref<Mesh> &p_mesh) {  		mesh->connect("changed", callable_mp(this, &CSGMesh3D::_mesh_changed));  	} -	_make_dirty(); +	_mesh_changed();  }  Ref<Mesh> CSGMesh3D::get_mesh() { @@ -919,45 +923,43 @@ CSGBrush *CSGSphere3D::_build_brush() {  		Ref<Material> *materialsw = materials.ptrw();  		bool *invertw = invert.ptrw(); +		const double lat_step = 1.0 / rings; +		const double lon_step = 1.0 / radial_segments;  		int face = 0; -		const double lat_step = Math_TAU / rings; -		const double lon_step = Math_TAU / radial_segments; -  		for (int i = 1; i <= rings; i++) { -			double lat0 = lat_step * (i - 1) - Math_TAU / 4; -			double z0 = Math::sin(lat0); -			double zr0 = Math::cos(lat0); -			double u0 = double(i - 1) / rings; - -			double lat1 = lat_step * i - Math_TAU / 4; -			double z1 = Math::sin(lat1); -			double zr1 = Math::cos(lat1); -			double u1 = double(i) / rings; - -			for (int j = radial_segments; j >= 1; j--) { -				double lng0 = lon_step * (j - 1); +			double lat0 = Math_PI * (0.5 - (i - 1) * lat_step); +			double c0 = Math::cos(lat0); +			double s0 = Math::sin(lat0); +			double v0 = double(i - 1) / rings; + +			double lat1 = Math_PI * (0.5 - i * lat_step); +			double c1 = Math::cos(lat1); +			double s1 = Math::sin(lat1); +			double v1 = double(i) / rings; + +			for (int j = 1; j <= radial_segments; j++) { +				double lng0 = Math_TAU * (0.5 - (j - 1) * lon_step);  				double x0 = Math::cos(lng0);  				double y0 = Math::sin(lng0); -				double v0 = double(i - 1) / radial_segments; +				double u0 = double(j - 1) / radial_segments; -				double lng1 = lon_step * j; +				double lng1 = Math_TAU * (0.5 - j * lon_step);  				double x1 = Math::cos(lng1);  				double y1 = Math::sin(lng1); -				double v1 = double(i) / radial_segments; +				double u1 = double(j) / radial_segments;  				Vector3 v[4] = { -					Vector3(x1 * zr0, z0, y1 * zr0) * radius, -					Vector3(x1 * zr1, z1, y1 * zr1) * radius, -					Vector3(x0 * zr1, z1, y0 * zr1) * radius, -					Vector3(x0 * zr0, z0, y0 * zr0) * radius +					Vector3(x0 * c0, s0, y0 * c0) * radius, +					Vector3(x1 * c0, s0, y1 * c0) * radius, +					Vector3(x1 * c1, s1, y1 * c1) * radius, +					Vector3(x0 * c1, s1, y0 * c1) * radius,  				};  				Vector2 u[4] = { -					Vector2(v1, u0), -					Vector2(v1, u1), -					Vector2(v0, u1), -					Vector2(v0, u0), - +					Vector2(u0, v0), +					Vector2(u1, v0), +					Vector2(u1, v1), +					Vector2(u0, v1),  				};  				if (i < rings) { @@ -1160,7 +1162,7 @@ CSGBrush *CSGBox3D::_build_brush() {  				materialsw[face] = material;  				face++; -				//face 1 +				//face 2  				facesw[face * 3 + 0] = face_points[2] * vertex_mul;  				facesw[face * 3 + 1] = face_points[3] * vertex_mul;  				facesw[face * 3 + 2] = face_points[0] * vertex_mul; @@ -1679,7 +1681,7 @@ CSGBrush *CSGPolygon3D::_build_brush() {  	Vector<Point2> final_polygon = polygon;  	if (Triangulate::get_area(final_polygon) > 0) { -		final_polygon.invert(); +		final_polygon.reverse();  	}  	Vector<int> triangles = Geometry2D::triangulate_polygon(final_polygon); @@ -1741,7 +1743,6 @@ CSGBrush *CSGPolygon3D::_build_brush() {  			path_cache->connect("tree_exited", callable_mp(this, &CSGPolygon3D::_path_exited));  			path_cache->connect("curve_changed", callable_mp(this, &CSGPolygon3D::_path_changed)); -			path_cache = nullptr;  		}  		curve = path->get_curve();  		if (curve.is_null()) { @@ -2226,7 +2227,7 @@ void CSGPolygon3D::_bind_methods() {  	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "depth", PROPERTY_HINT_EXP_RANGE, "0.001,1000.0,0.001,or_greater"), "set_depth", "get_depth");  	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "spin_degrees", PROPERTY_HINT_RANGE, "1,360,0.1"), "set_spin_degrees", "get_spin_degrees");  	ADD_PROPERTY(PropertyInfo(Variant::INT, "spin_sides", PROPERTY_HINT_RANGE, "3,64,1"), "set_spin_sides", "get_spin_sides"); -	ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "path_node", PROPERTY_HINT_NODE_PATH_VALID_TYPES, "Path"), "set_path_node", "get_path_node"); +	ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "path_node", PROPERTY_HINT_NODE_PATH_VALID_TYPES, "Path3D"), "set_path_node", "get_path_node");  	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "path_interval", PROPERTY_HINT_EXP_RANGE, "0.001,1000.0,0.001,or_greater"), "set_path_interval", "get_path_interval");  	ADD_PROPERTY(PropertyInfo(Variant::INT, "path_rotation", PROPERTY_HINT_ENUM, "Polygon,Path,PathFollow"), "set_path_rotation", "get_path_rotation");  	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "path_local"), "set_path_local", "is_path_local");  |