Path: blob/master/scene/3d/gpu_particles_collision_3d.h
9896 views
/**************************************************************************/1/* gpu_particles_collision_3d.h */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#pragma once3132#include "core/templates/local_vector.h"33#include "scene/3d/visual_instance_3d.h"3435class GPUParticlesCollision3D : public VisualInstance3D {36GDCLASS(GPUParticlesCollision3D, VisualInstance3D);3738uint32_t cull_mask = 0xFFFFFFFF;39RID collision;4041protected:42_FORCE_INLINE_ RID _get_collision() { return collision; }43static void _bind_methods();4445GPUParticlesCollision3D(RS::ParticlesCollisionType p_type);4647public:48void set_cull_mask(uint32_t p_cull_mask);49uint32_t get_cull_mask() const;5051~GPUParticlesCollision3D();52};5354class GPUParticlesCollisionSphere3D : public GPUParticlesCollision3D {55GDCLASS(GPUParticlesCollisionSphere3D, GPUParticlesCollision3D);5657real_t radius = 1.0;5859protected:60static void _bind_methods();6162public:63void set_radius(real_t p_radius);64real_t get_radius() const;6566virtual AABB get_aabb() const override;6768GPUParticlesCollisionSphere3D();69~GPUParticlesCollisionSphere3D();70};7172class GPUParticlesCollisionBox3D : public GPUParticlesCollision3D {73GDCLASS(GPUParticlesCollisionBox3D, GPUParticlesCollision3D);7475Vector3 size = Vector3(2, 2, 2);7677protected:78static void _bind_methods();79#ifndef DISABLE_DEPRECATED80bool _set(const StringName &p_name, const Variant &p_value);81bool _get(const StringName &p_name, Variant &r_property) const;82#endif // DISABLE_DEPRECATED8384public:85void set_size(const Vector3 &p_size);86Vector3 get_size() const;8788virtual AABB get_aabb() const override;8990GPUParticlesCollisionBox3D();91~GPUParticlesCollisionBox3D();92};9394class GPUParticlesCollisionSDF3D : public GPUParticlesCollision3D {95GDCLASS(GPUParticlesCollisionSDF3D, GPUParticlesCollision3D);9697public:98enum Resolution {99RESOLUTION_16,100RESOLUTION_32,101RESOLUTION_64,102RESOLUTION_128,103RESOLUTION_256,104RESOLUTION_512,105RESOLUTION_MAX,106};107108typedef void (*BakeBeginFunc)(int);109typedef void (*BakeStepFunc)(int, const String &);110typedef void (*BakeEndFunc)();111112private:113Vector3 size = Vector3(2, 2, 2);114Resolution resolution = RESOLUTION_64;115uint32_t bake_mask = 0xFFFFFFFF;116Ref<Texture3D> texture;117float thickness = 1.0;118119struct PlotMesh {120Ref<Mesh> mesh;121Transform3D local_xform;122};123124void _find_meshes(const AABB &p_aabb, Node *p_at_node, List<PlotMesh> &plot_meshes);125126struct BVH {127enum {128LEAF_BIT = 1 << 30,129LEAF_MASK = LEAF_BIT - 1130};131AABB bounds;132uint32_t children[2] = {};133};134135struct FacePos {136Vector3 center;137uint32_t index = 0;138};139140struct FaceSort {141uint32_t axis = 0;142bool operator()(const FacePos &p_left, const FacePos &p_right) const {143return p_left.center[axis] < p_right.center[axis];144}145};146147uint32_t _create_bvh(LocalVector<BVH> &bvh_tree, FacePos *p_faces, uint32_t p_face_count, const Face3 *p_triangles, float p_thickness);148149struct ComputeSDFParams {150float *cells = nullptr;151Vector3i size;152float cell_size = 0.0;153Vector3 cell_offset;154const BVH *bvh = nullptr;155const Face3 *triangles = nullptr;156float thickness = 0.0;157};158159void _find_closest_distance(const Vector3 &p_pos, const BVH *p_bvh, uint32_t p_bvh_cell, const Face3 *p_triangles, float p_thickness, float &r_closest_distance);160void _compute_sdf_z(uint32_t p_z, ComputeSDFParams *params);161void _compute_sdf(ComputeSDFParams *params);162163protected:164static void _bind_methods();165#ifndef DISABLE_DEPRECATED166bool _set(const StringName &p_name, const Variant &p_value);167bool _get(const StringName &p_name, Variant &r_property) const;168#endif // DISABLE_DEPRECATED169170public:171virtual PackedStringArray get_configuration_warnings() const override;172173void set_thickness(float p_thickness);174float get_thickness() const;175176void set_size(const Vector3 &p_size);177Vector3 get_size() const;178179void set_resolution(Resolution p_resolution);180Resolution get_resolution() const;181182void set_bake_mask(uint32_t p_mask);183uint32_t get_bake_mask() const;184185void set_bake_mask_value(int p_layer_number, bool p_enable);186bool get_bake_mask_value(int p_layer_number) const;187188void set_texture(const Ref<Texture3D> &p_texture);189Ref<Texture3D> get_texture() const;190191Vector3i get_estimated_cell_size() const;192Ref<Image> bake();193194virtual AABB get_aabb() const override;195196static BakeBeginFunc bake_begin_function;197static BakeStepFunc bake_step_function;198static BakeEndFunc bake_end_function;199200GPUParticlesCollisionSDF3D();201~GPUParticlesCollisionSDF3D();202};203204VARIANT_ENUM_CAST(GPUParticlesCollisionSDF3D::Resolution)205206class GPUParticlesCollisionHeightField3D : public GPUParticlesCollision3D {207GDCLASS(GPUParticlesCollisionHeightField3D, GPUParticlesCollision3D);208209public:210enum Resolution {211RESOLUTION_256,212RESOLUTION_512,213RESOLUTION_1024,214RESOLUTION_2048,215RESOLUTION_4096,216RESOLUTION_8192,217RESOLUTION_MAX,218};219220enum UpdateMode {221UPDATE_MODE_WHEN_MOVED,222UPDATE_MODE_ALWAYS,223};224225private:226uint32_t heightfield_mask = (1 << 20) - 1; // Only the first 20 bits are set by default to ignore editor layers.227Vector3 size = Vector3(2, 2, 2);228Resolution resolution = RESOLUTION_1024;229bool follow_camera_mode = false;230231UpdateMode update_mode = UPDATE_MODE_WHEN_MOVED;232233protected:234void _notification(int p_what);235static void _bind_methods();236#ifndef DISABLE_DEPRECATED237bool _set(const StringName &p_name, const Variant &p_value);238bool _get(const StringName &p_name, Variant &r_property) const;239#endif // DISABLE_DEPRECATED240241public:242void set_size(const Vector3 &p_size);243Vector3 get_size() const;244245void set_resolution(Resolution p_resolution);246Resolution get_resolution() const;247248void set_update_mode(UpdateMode p_update_mode);249UpdateMode get_update_mode() const;250251void set_heightfield_mask(uint32_t p_heightfield_mask);252uint32_t get_heightfield_mask() const;253254void set_heightfield_mask_value(int p_layer_number, bool p_value);255bool get_heightfield_mask_value(int p_layer_number) const;256257void set_follow_camera_enabled(bool p_enabled);258bool is_follow_camera_enabled() const;259260virtual AABB get_aabb() const override;261262GPUParticlesCollisionHeightField3D();263~GPUParticlesCollisionHeightField3D();264};265266VARIANT_ENUM_CAST(GPUParticlesCollisionHeightField3D::Resolution)267VARIANT_ENUM_CAST(GPUParticlesCollisionHeightField3D::UpdateMode)268269class GPUParticlesAttractor3D : public VisualInstance3D {270GDCLASS(GPUParticlesAttractor3D, VisualInstance3D);271272uint32_t cull_mask = 0xFFFFFFFF;273RID collision;274real_t strength = 1.0;275real_t attenuation = 1.0;276real_t directionality = 0.0;277278protected:279_FORCE_INLINE_ RID _get_collision() { return collision; }280static void _bind_methods();281282GPUParticlesAttractor3D(RS::ParticlesCollisionType p_type);283284public:285void set_cull_mask(uint32_t p_cull_mask);286uint32_t get_cull_mask() const;287288void set_strength(real_t p_strength);289real_t get_strength() const;290291void set_attenuation(real_t p_attenuation);292real_t get_attenuation() const;293294void set_directionality(real_t p_directionality);295real_t get_directionality() const;296297~GPUParticlesAttractor3D();298};299300class GPUParticlesAttractorSphere3D : public GPUParticlesAttractor3D {301GDCLASS(GPUParticlesAttractorSphere3D, GPUParticlesAttractor3D);302303real_t radius = 1.0;304305protected:306static void _bind_methods();307308public:309void set_radius(real_t p_radius);310real_t get_radius() const;311312virtual AABB get_aabb() const override;313314GPUParticlesAttractorSphere3D();315~GPUParticlesAttractorSphere3D();316};317318class GPUParticlesAttractorBox3D : public GPUParticlesAttractor3D {319GDCLASS(GPUParticlesAttractorBox3D, GPUParticlesAttractor3D);320321Vector3 size = Vector3(2, 2, 2);322323protected:324static void _bind_methods();325#ifndef DISABLE_DEPRECATED326bool _set(const StringName &p_name, const Variant &p_value);327bool _get(const StringName &p_name, Variant &r_property) const;328#endif // DISABLE_DEPRECATED329330public:331void set_size(const Vector3 &p_size);332Vector3 get_size() const;333334virtual AABB get_aabb() const override;335336GPUParticlesAttractorBox3D();337~GPUParticlesAttractorBox3D();338};339340class GPUParticlesAttractorVectorField3D : public GPUParticlesAttractor3D {341GDCLASS(GPUParticlesAttractorVectorField3D, GPUParticlesAttractor3D);342343Vector3 size = Vector3(2, 2, 2);344Ref<Texture3D> texture;345346protected:347static void _bind_methods();348#ifndef DISABLE_DEPRECATED349bool _set(const StringName &p_name, const Variant &p_value);350bool _get(const StringName &p_name, Variant &r_property) const;351#endif // DISABLE_DEPRECATED352353public:354void set_size(const Vector3 &p_size);355Vector3 get_size() const;356357void set_texture(const Ref<Texture3D> &p_texture);358Ref<Texture3D> get_texture() const;359360virtual AABB get_aabb() const override;361362GPUParticlesAttractorVectorField3D();363~GPUParticlesAttractorVectorField3D();364};365366367