Implemented Soft body
- Soft Body Physics node - Soft Body Rendering - Soft body Editor - Soft body importer
This commit is contained in:
parent
fbf3ad2841
commit
17ebbfb56d
32 changed files with 2086 additions and 274 deletions
|
|
@ -234,6 +234,72 @@ public:
|
|||
// this function only works on physics process, errors and returns null otherwise
|
||||
virtual PhysicsDirectBodyState *body_get_direct_state(RID p_body);
|
||||
|
||||
/* SOFT BODY */
|
||||
|
||||
virtual RID soft_body_create(bool p_init_sleeping = false) { return RID(); }
|
||||
|
||||
virtual void soft_body_update_visual_server(RID p_body, class SoftBodyVisualServerHandler *p_visual_server_handler) {}
|
||||
|
||||
virtual void soft_body_set_space(RID p_body, RID p_space) {}
|
||||
virtual RID soft_body_get_space(RID p_body) const { return RID(); }
|
||||
|
||||
virtual void soft_body_set_collision_layer(RID p_body, uint32_t p_layer) {}
|
||||
virtual uint32_t soft_body_get_collision_layer(RID p_body) const { return 0; }
|
||||
|
||||
virtual void soft_body_set_collision_mask(RID p_body, uint32_t p_mask) {}
|
||||
virtual uint32_t soft_body_get_collision_mask(RID p_body) const { return 0; }
|
||||
|
||||
virtual void soft_body_add_collision_exception(RID p_body, RID p_body_b) {}
|
||||
virtual void soft_body_remove_collision_exception(RID p_body, RID p_body_b) {}
|
||||
virtual void soft_body_get_collision_exceptions(RID p_body, List<RID> *p_exceptions) {}
|
||||
|
||||
virtual void soft_body_set_state(RID p_body, BodyState p_state, const Variant &p_variant) {}
|
||||
virtual Variant soft_body_get_state(RID p_body, BodyState p_state) const { return Variant(); }
|
||||
|
||||
virtual void soft_body_set_transform(RID p_body, const Transform &p_transform) {}
|
||||
virtual Vector3 soft_body_get_vertex_position(RID p_body, int vertex_index) const { return Vector3(); }
|
||||
|
||||
virtual void soft_body_set_ray_pickable(RID p_body, bool p_enable) {}
|
||||
virtual bool soft_body_is_ray_pickable(RID p_body) const { return false; }
|
||||
|
||||
virtual void soft_body_set_simulation_precision(RID p_body, int p_simulation_precision) {}
|
||||
virtual int soft_body_get_simulation_precision(RID p_body) { return 0; }
|
||||
|
||||
virtual void soft_body_set_total_mass(RID p_body, real_t p_total_mass) {}
|
||||
virtual real_t soft_body_get_total_mass(RID p_body) { return 0.; }
|
||||
|
||||
virtual void soft_body_set_linear_stiffness(RID p_body, real_t p_stiffness) {}
|
||||
virtual real_t soft_body_get_linear_stiffness(RID p_body) { return 0.; }
|
||||
|
||||
virtual void soft_body_set_areaAngular_stiffness(RID p_body, real_t p_stiffness) {}
|
||||
virtual real_t soft_body_get_areaAngular_stiffness(RID p_body) { return 0.; }
|
||||
|
||||
virtual void soft_body_set_volume_stiffness(RID p_body, real_t p_stiffness) {}
|
||||
virtual real_t soft_body_get_volume_stiffness(RID p_body) { return 0.; }
|
||||
|
||||
virtual void soft_body_set_pressure_coefficient(RID p_body, real_t p_pressure_coefficient) {}
|
||||
virtual real_t soft_body_get_pressure_coefficient(RID p_body) { return 0.; }
|
||||
|
||||
virtual void soft_body_set_pose_matching_coefficient(RID p_body, real_t p_pose_matching_coefficient) {}
|
||||
virtual real_t soft_body_get_pose_matching_coefficient(RID p_body) { return 0.; }
|
||||
|
||||
virtual void soft_body_set_damping_coefficient(RID p_body, real_t p_damping_coefficient) {}
|
||||
virtual real_t soft_body_get_damping_coefficient(RID p_body) { return 0.; }
|
||||
|
||||
virtual void soft_body_set_drag_coefficient(RID p_body, real_t p_drag_coefficient) {}
|
||||
virtual real_t soft_body_get_drag_coefficient(RID p_body) { return 0.; }
|
||||
|
||||
virtual void soft_body_set_mesh(RID p_body, const REF &p_mesh) {}
|
||||
|
||||
virtual void soft_body_move_point(RID p_body, int p_point_index, const Vector3 &p_global_position) {}
|
||||
virtual Vector3 soft_body_get_point_global_position(RID p_body, int p_point_index) { return Vector3(); }
|
||||
|
||||
virtual Vector3 soft_body_get_point_offset(RID p_body, int p_point_index) const { return Vector3(); }
|
||||
|
||||
virtual void soft_body_remove_all_pinned_points(RID p_body) {}
|
||||
virtual void soft_body_pin_point(RID p_body, int p_point_index, bool p_pin) {}
|
||||
virtual bool soft_body_is_point_pinned(RID p_body, int p_point_index) { return 0; }
|
||||
|
||||
/* JOINT API */
|
||||
|
||||
virtual RID joint_create_pin(RID p_body_A, const Vector3 &p_local_A, RID p_body_B, const Vector3 &p_local_B);
|
||||
|
|
|
|||
|
|
@ -490,6 +490,72 @@ public:
|
|||
|
||||
virtual bool body_test_motion(RID p_body, const Transform &p_from, const Vector3 &p_motion, bool p_infinite_inertia, MotionResult *r_result = NULL) = 0;
|
||||
|
||||
/* SOFT BODY */
|
||||
|
||||
virtual RID soft_body_create(bool p_init_sleeping = false) = 0;
|
||||
|
||||
virtual void soft_body_update_visual_server(RID p_body, class SoftBodyVisualServerHandler *p_visual_server_handler) = 0;
|
||||
|
||||
virtual void soft_body_set_space(RID p_body, RID p_space) = 0;
|
||||
virtual RID soft_body_get_space(RID p_body) const = 0;
|
||||
|
||||
virtual void soft_body_set_mesh(RID p_body, const REF &p_mesh) = 0;
|
||||
|
||||
virtual void soft_body_set_collision_layer(RID p_body, uint32_t p_layer) = 0;
|
||||
virtual uint32_t soft_body_get_collision_layer(RID p_body) const = 0;
|
||||
|
||||
virtual void soft_body_set_collision_mask(RID p_body, uint32_t p_mask) = 0;
|
||||
virtual uint32_t soft_body_get_collision_mask(RID p_body) const = 0;
|
||||
|
||||
virtual void soft_body_add_collision_exception(RID p_body, RID p_body_b) = 0;
|
||||
virtual void soft_body_remove_collision_exception(RID p_body, RID p_body_b) = 0;
|
||||
virtual void soft_body_get_collision_exceptions(RID p_body, List<RID> *p_exceptions) = 0;
|
||||
|
||||
virtual void soft_body_set_state(RID p_body, BodyState p_state, const Variant &p_variant) = 0;
|
||||
virtual Variant soft_body_get_state(RID p_body, BodyState p_state) const = 0;
|
||||
|
||||
virtual void soft_body_set_transform(RID p_body, const Transform &p_transform) = 0;
|
||||
virtual Vector3 soft_body_get_vertex_position(RID p_body, int vertex_index) const = 0;
|
||||
|
||||
virtual void soft_body_set_ray_pickable(RID p_body, bool p_enable) = 0;
|
||||
virtual bool soft_body_is_ray_pickable(RID p_body) const = 0;
|
||||
|
||||
virtual void soft_body_set_simulation_precision(RID p_body, int p_simulation_precision) = 0;
|
||||
virtual int soft_body_get_simulation_precision(RID p_body) = 0;
|
||||
|
||||
virtual void soft_body_set_total_mass(RID p_body, real_t p_total_mass) = 0;
|
||||
virtual real_t soft_body_get_total_mass(RID p_body) = 0;
|
||||
|
||||
virtual void soft_body_set_linear_stiffness(RID p_body, real_t p_stiffness) = 0;
|
||||
virtual real_t soft_body_get_linear_stiffness(RID p_body) = 0;
|
||||
|
||||
virtual void soft_body_set_areaAngular_stiffness(RID p_body, real_t p_stiffness) = 0;
|
||||
virtual real_t soft_body_get_areaAngular_stiffness(RID p_body) = 0;
|
||||
|
||||
virtual void soft_body_set_volume_stiffness(RID p_body, real_t p_stiffness) = 0;
|
||||
virtual real_t soft_body_get_volume_stiffness(RID p_body) = 0;
|
||||
|
||||
virtual void soft_body_set_pressure_coefficient(RID p_body, real_t p_pressure_coefficient) = 0;
|
||||
virtual real_t soft_body_get_pressure_coefficient(RID p_body) = 0;
|
||||
|
||||
virtual void soft_body_set_pose_matching_coefficient(RID p_body, real_t p_pose_matching_coefficient) = 0;
|
||||
virtual real_t soft_body_get_pose_matching_coefficient(RID p_body) = 0;
|
||||
|
||||
virtual void soft_body_set_damping_coefficient(RID p_body, real_t p_damping_coefficient) = 0;
|
||||
virtual real_t soft_body_get_damping_coefficient(RID p_body) = 0;
|
||||
|
||||
virtual void soft_body_set_drag_coefficient(RID p_body, real_t p_drag_coefficient) = 0;
|
||||
virtual real_t soft_body_get_drag_coefficient(RID p_body) = 0;
|
||||
|
||||
virtual void soft_body_move_point(RID p_body, int p_point_index, const Vector3 &p_global_position) = 0;
|
||||
virtual Vector3 soft_body_get_point_global_position(RID p_body, int p_point_index) = 0;
|
||||
|
||||
virtual Vector3 soft_body_get_point_offset(RID p_body, int p_point_index) const = 0;
|
||||
|
||||
virtual void soft_body_remove_all_pinned_points(RID p_body) = 0;
|
||||
virtual void soft_body_pin_point(RID p_body, int p_point_index, bool p_pin) = 0;
|
||||
virtual bool soft_body_is_point_pinned(RID p_body, int p_point_index) = 0;
|
||||
|
||||
/* JOINT API */
|
||||
|
||||
enum JointType {
|
||||
|
|
|
|||
|
|
@ -252,8 +252,6 @@ public:
|
|||
virtual void mesh_set_blend_shape_mode(RID p_mesh, VS::BlendShapeMode p_mode) = 0;
|
||||
virtual VS::BlendShapeMode mesh_get_blend_shape_mode(RID p_mesh) const = 0;
|
||||
|
||||
virtual uint32_t mesh_surface_get_stride_in_array(RID p_mesh, int p_surface, int p_array_index) const = 0;
|
||||
virtual uint32_t mesh_surface_get_offset_in_array(RID p_mesh, int p_surface, int p_array_index) const = 0;
|
||||
virtual void mesh_surface_update_region(RID p_mesh, int p_surface, int p_offset, const PoolVector<uint8_t> &p_data) = 0;
|
||||
|
||||
virtual void mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material) = 0;
|
||||
|
|
|
|||
|
|
@ -97,7 +97,6 @@ public:
|
|||
#define DISPLAY_CHANGED \
|
||||
changes++;
|
||||
#endif
|
||||
// print_line(String("CHANGED: ") + __FUNCTION__);
|
||||
|
||||
#define BIND0R(m_r, m_name) \
|
||||
m_r m_name() { return BINDBASE->m_name(); }
|
||||
|
|
@ -219,8 +218,6 @@ public:
|
|||
BIND2(mesh_set_blend_shape_mode, RID, BlendShapeMode)
|
||||
BIND1RC(BlendShapeMode, mesh_get_blend_shape_mode, RID)
|
||||
|
||||
BIND3RC(uint32_t, mesh_surface_get_stride_in_array, RID, int, int)
|
||||
BIND3RC(uint32_t, mesh_surface_get_offset_in_array, RID, int, int)
|
||||
BIND4(mesh_surface_update_region, RID, int, int, const PoolVector<uint8_t> &)
|
||||
|
||||
BIND3(mesh_surface_set_material, RID, int, RID)
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ class VisualServerWrapMT : public VisualServer {
|
|||
|
||||
int pool_max_size;
|
||||
|
||||
//#define DEBUG_SYNC
|
||||
//#define DEBUG_SYNC
|
||||
|
||||
static VisualServerWrapMT *singleton_mt;
|
||||
|
||||
|
|
@ -152,8 +152,6 @@ public:
|
|||
FUNC2(mesh_set_blend_shape_mode, RID, BlendShapeMode)
|
||||
FUNC1RC(BlendShapeMode, mesh_get_blend_shape_mode, RID)
|
||||
|
||||
FUNC3RC(uint32_t, mesh_surface_get_stride_in_array, RID, int, int)
|
||||
FUNC3RC(uint32_t, mesh_surface_get_offset_in_array, RID, int, int)
|
||||
FUNC4(mesh_surface_update_region, RID, int, int, const PoolVector<uint8_t> &)
|
||||
|
||||
FUNC3(mesh_surface_set_material, RID, int, RID)
|
||||
|
|
|
|||
|
|
@ -795,6 +795,140 @@ Error VisualServer::_surface_set_data(Array p_arrays, uint32_t p_format, uint32_
|
|||
return OK;
|
||||
}
|
||||
|
||||
uint32_t VisualServer::mesh_surface_get_format_offset(uint32_t p_format, int p_vertex_len, int p_index_len, int p_array_index) const {
|
||||
uint32_t offsets[ARRAY_MAX];
|
||||
mesh_surface_make_offsets_from_format(p_format, p_vertex_len, p_index_len, offsets);
|
||||
return offsets[p_array_index];
|
||||
}
|
||||
|
||||
uint32_t VisualServer::mesh_surface_get_format_stride(uint32_t p_format, int p_vertex_len, int p_index_len) const {
|
||||
uint32_t offsets[ARRAY_MAX];
|
||||
return mesh_surface_make_offsets_from_format(p_format, p_vertex_len, p_index_len, offsets);
|
||||
}
|
||||
|
||||
uint32_t VisualServer::mesh_surface_make_offsets_from_format(uint32_t p_format, int p_vertex_len, int p_index_len, uint32_t *r_offsets) const {
|
||||
|
||||
int total_elem_size = 0;
|
||||
|
||||
for (int i = 0; i < VS::ARRAY_MAX; i++) {
|
||||
|
||||
r_offsets[i] = 0; //reset
|
||||
|
||||
if (!(p_format & (1 << i))) // no array
|
||||
continue;
|
||||
|
||||
int elem_size = 0;
|
||||
|
||||
switch (i) {
|
||||
|
||||
case VS::ARRAY_VERTEX: {
|
||||
|
||||
if (p_format & ARRAY_FLAG_USE_2D_VERTICES) {
|
||||
elem_size = 2;
|
||||
} else {
|
||||
elem_size = 3;
|
||||
}
|
||||
|
||||
if (p_format & ARRAY_COMPRESS_VERTEX) {
|
||||
elem_size *= sizeof(int16_t);
|
||||
} else {
|
||||
elem_size *= sizeof(float);
|
||||
}
|
||||
|
||||
if (elem_size == 6) {
|
||||
elem_size = 8;
|
||||
}
|
||||
|
||||
} break;
|
||||
case VS::ARRAY_NORMAL: {
|
||||
|
||||
if (p_format & ARRAY_COMPRESS_NORMAL) {
|
||||
elem_size = sizeof(uint32_t);
|
||||
} else {
|
||||
elem_size = sizeof(float) * 3;
|
||||
}
|
||||
|
||||
} break;
|
||||
|
||||
case VS::ARRAY_TANGENT: {
|
||||
if (p_format & ARRAY_COMPRESS_TANGENT) {
|
||||
elem_size = sizeof(uint32_t);
|
||||
} else {
|
||||
elem_size = sizeof(float) * 4;
|
||||
}
|
||||
|
||||
} break;
|
||||
case VS::ARRAY_COLOR: {
|
||||
|
||||
if (p_format & ARRAY_COMPRESS_COLOR) {
|
||||
elem_size = sizeof(uint32_t);
|
||||
} else {
|
||||
elem_size = sizeof(float) * 4;
|
||||
}
|
||||
} break;
|
||||
case VS::ARRAY_TEX_UV: {
|
||||
if (p_format & ARRAY_COMPRESS_TEX_UV) {
|
||||
elem_size = sizeof(uint32_t);
|
||||
} else {
|
||||
elem_size = sizeof(float) * 2;
|
||||
}
|
||||
|
||||
} break;
|
||||
|
||||
case VS::ARRAY_TEX_UV2: {
|
||||
if (p_format & ARRAY_COMPRESS_TEX_UV2) {
|
||||
elem_size = sizeof(uint32_t);
|
||||
} else {
|
||||
elem_size = sizeof(float) * 2;
|
||||
}
|
||||
|
||||
} break;
|
||||
case VS::ARRAY_WEIGHTS: {
|
||||
|
||||
if (p_format & ARRAY_COMPRESS_WEIGHTS) {
|
||||
elem_size = sizeof(uint16_t) * 4;
|
||||
} else {
|
||||
elem_size = sizeof(float) * 4;
|
||||
}
|
||||
|
||||
} break;
|
||||
case VS::ARRAY_BONES: {
|
||||
|
||||
if (p_format & ARRAY_FLAG_USE_16_BIT_BONES) {
|
||||
elem_size = sizeof(uint16_t) * 4;
|
||||
} else {
|
||||
elem_size = sizeof(uint32_t);
|
||||
}
|
||||
|
||||
} break;
|
||||
case VS::ARRAY_INDEX: {
|
||||
|
||||
if (p_index_len <= 0) {
|
||||
ERR_PRINT("index_array_len==NO_INDEX_ARRAY");
|
||||
break;
|
||||
}
|
||||
/* determine whether using 16 or 32 bits indices */
|
||||
if (p_vertex_len >= (1 << 16)) {
|
||||
|
||||
elem_size = 4;
|
||||
|
||||
} else {
|
||||
elem_size = 2;
|
||||
}
|
||||
r_offsets[i] = elem_size;
|
||||
continue;
|
||||
} break;
|
||||
default: {
|
||||
ERR_FAIL_V(0);
|
||||
}
|
||||
}
|
||||
|
||||
r_offsets[i] = total_elem_size;
|
||||
total_elem_size += elem_size;
|
||||
}
|
||||
return total_elem_size;
|
||||
}
|
||||
|
||||
void VisualServer::mesh_add_surface_from_arrays(RID p_mesh, PrimitiveType p_primitive, const Array &p_arrays, const Array &p_blend_shapes, uint32_t p_compress_format) {
|
||||
|
||||
ERR_FAIL_INDEX(p_primitive, VS::PRIMITIVE_MAX);
|
||||
|
|
@ -1564,13 +1698,13 @@ void VisualServer::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("material_set_next_pass", "material", "next_material"), &VisualServer::material_set_next_pass);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("mesh_create"), &VisualServer::mesh_create);
|
||||
ClassDB::bind_method(D_METHOD("mesh_surface_get_format_offset", "format", "vertex_len", "index_len", "array_index"), &VisualServer::mesh_surface_get_format_offset);
|
||||
ClassDB::bind_method(D_METHOD("mesh_surface_get_format_stride", "format", "vertex_len", "index_len"), &VisualServer::mesh_surface_get_format_stride);
|
||||
ClassDB::bind_method(D_METHOD("mesh_add_surface_from_arrays", "mesh", "primtive", "arrays", "blend_shapes", "compress_format"), &VisualServer::mesh_add_surface_from_arrays, DEFVAL(Array()), DEFVAL(ARRAY_COMPRESS_DEFAULT));
|
||||
ClassDB::bind_method(D_METHOD("mesh_set_blend_shape_count", "mesh", "amount"), &VisualServer::mesh_set_blend_shape_count);
|
||||
ClassDB::bind_method(D_METHOD("mesh_get_blend_shape_count", "mesh"), &VisualServer::mesh_get_blend_shape_count);
|
||||
ClassDB::bind_method(D_METHOD("mesh_set_blend_shape_mode", "mesh", "mode"), &VisualServer::mesh_set_blend_shape_mode);
|
||||
ClassDB::bind_method(D_METHOD("mesh_get_blend_shape_mode", "mesh"), &VisualServer::mesh_get_blend_shape_mode);
|
||||
ClassDB::bind_method(D_METHOD("mesh_surface_get_stride_in_array", "mesh", "surface", "array_index"), &VisualServer::mesh_surface_get_stride_in_array);
|
||||
ClassDB::bind_method(D_METHOD("mesh_surface_get_offset_in_array", "mesh", "surface", "array_index"), &VisualServer::mesh_surface_get_offset_in_array);
|
||||
ClassDB::bind_method(D_METHOD("mesh_surface_update_region", "mesh", "surface", "offset", "data"), &VisualServer::mesh_surface_update_region);
|
||||
ClassDB::bind_method(D_METHOD("mesh_surface_set_material", "mesh", "surface", "material"), &VisualServer::mesh_surface_set_material);
|
||||
ClassDB::bind_method(D_METHOD("mesh_surface_get_material", "mesh", "surface"), &VisualServer::mesh_surface_get_material);
|
||||
|
|
|
|||
|
|
@ -251,6 +251,10 @@ public:
|
|||
|
||||
virtual RID mesh_create() = 0;
|
||||
|
||||
virtual uint32_t mesh_surface_get_format_offset(uint32_t p_format, int p_vertex_len, int p_index_len, int p_array_index) const;
|
||||
virtual uint32_t mesh_surface_get_format_stride(uint32_t p_format, int p_vertex_len, int p_index_len) const;
|
||||
/// Returns stride
|
||||
virtual uint32_t mesh_surface_make_offsets_from_format(uint32_t p_format, int p_vertex_len, int p_index_len, uint32_t *r_offsets) const;
|
||||
virtual void mesh_add_surface_from_arrays(RID p_mesh, PrimitiveType p_primitive, const Array &p_arrays, const Array &p_blend_shapes = Array(), uint32_t p_compress_format = ARRAY_COMPRESS_DEFAULT);
|
||||
virtual void mesh_add_surface(RID p_mesh, uint32_t p_format, PrimitiveType p_primitive, const PoolVector<uint8_t> &p_array, int p_vertex_count, const PoolVector<uint8_t> &p_index_array, int p_index_count, const AABB &p_aabb, const Vector<PoolVector<uint8_t> > &p_blend_shapes = Vector<PoolVector<uint8_t> >(), const Vector<AABB> &p_bone_aabbs = Vector<AABB>()) = 0;
|
||||
|
||||
|
|
@ -265,8 +269,6 @@ public:
|
|||
virtual void mesh_set_blend_shape_mode(RID p_mesh, BlendShapeMode p_mode) = 0;
|
||||
virtual BlendShapeMode mesh_get_blend_shape_mode(RID p_mesh) const = 0;
|
||||
|
||||
virtual uint32_t mesh_surface_get_stride_in_array(RID p_mesh, int p_surface, int p_array_index) const = 0;
|
||||
virtual uint32_t mesh_surface_get_offset_in_array(RID p_mesh, int p_surface, int p_array_index) const = 0;
|
||||
virtual void mesh_surface_update_region(RID p_mesh, int p_surface, int p_offset, const PoolVector<uint8_t> &p_data) = 0;
|
||||
|
||||
virtual void mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material) = 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue