aboutsummaryrefslogtreecommitdiff
path: root/servers
diff options
context:
space:
mode:
authorRémi Verschelde2017-03-19 00:36:26 +0100
committerRémi Verschelde2017-03-19 00:36:26 +0100
commitf8db8a3faa30b71dca33ced38be16d3f93f43e8a (patch)
tree3b798318132cca7eccfbca5818ab55656a2896d7 /servers
parent1d418afe863c9e553b69174ce63aef203c46d2f0 (diff)
downloadgodot-f8db8a3faa30b71dca33ced38be16d3f93f43e8a.tar.gz
godot-f8db8a3faa30b71dca33ced38be16d3f93f43e8a.tar.zst
godot-f8db8a3faa30b71dca33ced38be16d3f93f43e8a.zip
Bring that Whole New World to the Old Continent too
Applies the clang-format style to the 2.1 branch as done for master in 5dbf1809c6e3e905b94b8764e99491e608122261.
Diffstat (limited to '')
-rw-r--r--servers/audio/audio_driver_dummy.cpp37
-rw-r--r--servers/audio/audio_driver_dummy.h14
-rw-r--r--servers/audio/audio_filter_sw.cpp242
-rw-r--r--servers/audio/audio_filter_sw.h43
-rw-r--r--servers/audio/audio_mixer_sw.cpp974
-rw-r--r--servers/audio/audio_mixer_sw.h85
-rw-r--r--servers/audio/audio_rb_resampler.cpp321
-rw-r--r--servers/audio/audio_rb_resampler.h92
-rw-r--r--servers/audio/audio_server_sw.cpp593
-rw-r--r--servers/audio/audio_server_sw.h98
-rw-r--r--servers/audio/reverb_sw.cpp620
-rw-r--r--servers/audio/reverb_sw.h16
-rw-r--r--servers/audio/sample_manager_sw.cpp159
-rw-r--r--servers/audio/sample_manager_sw.h57
-rw-r--r--servers/audio/voice_rb_sw.h36
-rw-r--r--servers/audio_server.cpp189
-rw-r--r--servers/audio_server.h223
-rw-r--r--servers/physics/area_pair_sw.cpp83
-rw-r--r--servers/physics/area_pair_sw.h15
-rw-r--r--servers/physics/area_sw.cpp194
-rw-r--r--servers/physics/area_sw.h93
-rw-r--r--servers/physics/body_pair_sw.cpp321
-rw-r--r--servers/physics/body_pair_sw.h22
-rw-r--r--servers/physics/body_sw.cpp401
-rw-r--r--servers/physics/body_sw.h254
-rw-r--r--servers/physics/broad_phase_basic.cpp135
-rw-r--r--servers/physics/broad_phase_basic.h34
-rw-r--r--servers/physics/broad_phase_octree.cpp76
-rw-r--r--servers/physics/broad_phase_octree.h21
-rw-r--r--servers/physics/broad_phase_sw.cpp5
-rw-r--r--servers/physics/broad_phase_sw.h35
-rw-r--r--servers/physics/collision_object_sw.cpp134
-rw-r--r--servers/physics/collision_object_sw.h66
-rw-r--r--servers/physics/collision_solver_sat.cpp1271
-rw-r--r--servers/physics/collision_solver_sat.h3
-rw-r--r--servers/physics/collision_solver_sw.cpp294
-rw-r--r--servers/physics/collision_solver_sw.h22
-rw-r--r--servers/physics/constraint_sw.h30
-rw-r--r--servers/physics/gjk_epa.cpp1399
-rw-r--r--servers/physics/gjk_epa.h4
-rw-r--r--servers/physics/joints/cone_twist_joint_sw.cpp236
-rw-r--r--servers/physics/joints/cone_twist_joint_sw.h74
-rw-r--r--servers/physics/joints/generic_6dof_joint_sw.cpp646
-rw-r--r--servers/physics/joints/generic_6dof_joint_sw.h485
-rw-r--r--servers/physics/joints/hinge_joint_sw.cpp305
-rw-r--r--servers/physics/joints/hinge_joint_sw.h46
-rw-r--r--servers/physics/joints/jacobian_entry_sw.h123
-rw-r--r--servers/physics/joints/pin_joint_sw.cpp93
-rw-r--r--servers/physics/joints/pin_joint_sw.h29
-rw-r--r--servers/physics/joints/slider_joint_sw.cpp301
-rw-r--r--servers/physics/joints/slider_joint_sw.h87
-rw-r--r--servers/physics/joints_sw.h11
-rw-r--r--servers/physics/physics_server_sw.cpp755
-rw-r--r--servers/physics/physics_server_sw.h135
-rw-r--r--servers/physics/shape_sw.cpp1198
-rw-r--r--servers/physics/shape_sw.h227
-rw-r--r--servers/physics/space_sw.cpp559
-rw-r--r--servers/physics/space_sw.h84
-rw-r--r--servers/physics/step_sw.cpp203
-rw-r--r--servers/physics/step_sw.h12
-rw-r--r--servers/physics_2d/area_2d_sw.cpp196
-rw-r--r--servers/physics_2d/area_2d_sw.h91
-rw-r--r--servers/physics_2d/area_pair_2d_sw.cpp83
-rw-r--r--servers/physics_2d/area_pair_2d_sw.h15
-rw-r--r--servers/physics_2d/body_2d_sw.cpp393
-rw-r--r--servers/physics_2d/body_2d_sw.h241
-rw-r--r--servers/physics_2d/body_pair_2d_sw.cpp329
-rw-r--r--servers/physics_2d/body_pair_2d_sw.h22
-rw-r--r--servers/physics_2d/broad_phase_2d_basic.cpp120
-rw-r--r--servers/physics_2d/broad_phase_2d_basic.h36
-rw-r--r--servers/physics_2d/broad_phase_2d_hash_grid.cpp487
-rw-r--r--servers/physics_2d/broad_phase_2d_hash_grid.h80
-rw-r--r--servers/physics_2d/broad_phase_2d_sw.cpp5
-rw-r--r--servers/physics_2d/broad_phase_2d_sw.h35
-rw-r--r--servers/physics_2d/collision_object_2d_sw.cpp144
-rw-r--r--servers/physics_2d/collision_object_2d_sw.h68
-rw-r--r--servers/physics_2d/collision_solver_2d_sat.cpp1169
-rw-r--r--servers/physics_2d/collision_solver_2d_sat.h3
-rw-r--r--servers/physics_2d/collision_solver_2d_sw.cpp190
-rw-r--r--servers/physics_2d/collision_solver_2d_sw.h16
-rw-r--r--servers/physics_2d/constraint_2d_sw.h27
-rw-r--r--servers/physics_2d/joints_2d_sw.cpp264
-rw-r--r--servers/physics_2d/joints_2d_sw.h44
-rw-r--r--servers/physics_2d/physics_2d_server_sw.cpp636
-rw-r--r--servers/physics_2d/physics_2d_server_sw.h121
-rw-r--r--servers/physics_2d/physics_2d_server_wrap_mt.cpp78
-rw-r--r--servers/physics_2d/physics_2d_server_wrap_mt.h279
-rw-r--r--servers/physics_2d/shape_2d_sw.cpp876
-rw-r--r--servers/physics_2d/shape_2d_sw.h412
-rw-r--r--servers/physics_2d/space_2d_sw.cpp919
-rw-r--r--servers/physics_2d/space_2d_sw.h94
-rw-r--r--servers/physics_2d/step_2d_sw.cpp206
-rw-r--r--servers/physics_2d/step_2d_sw.h12
-rw-r--r--servers/physics_2d_server.cpp708
-rw-r--r--servers/physics_2d_server.h409
-rw-r--r--servers/physics_server.cpp729
-rw-r--r--servers/physics_server.h442
-rw-r--r--servers/register_server_types.cpp54
-rw-r--r--servers/server_wrap_mt_common.h1209
-rw-r--r--servers/spatial_sound/spatial_sound_server_sw.cpp740
-rw-r--r--servers/spatial_sound/spatial_sound_server_sw.h59
-rw-r--r--servers/spatial_sound_2d/spatial_sound_2d_server_sw.cpp709
-rw-r--r--servers/spatial_sound_2d/spatial_sound_2d_server_sw.h57
-rw-r--r--servers/spatial_sound_2d_server.cpp8
-rw-r--r--servers/spatial_sound_2d_server.h91
-rw-r--r--servers/spatial_sound_server.cpp8
-rw-r--r--servers/spatial_sound_server.h90
-rw-r--r--servers/visual/particle_system_sw.cpp312
-rw-r--r--servers/visual/particle_system_sw.h23
-rw-r--r--servers/visual/rasterizer.cpp554
-rw-r--r--servers/visual/rasterizer.h891
-rw-r--r--servers/visual/rasterizer_dummy.cpp1230
-rw-r--r--servers/visual/rasterizer_dummy.h441
-rw-r--r--servers/visual/shader_language.cpp2261
-rw-r--r--servers/visual/shader_language.h179
-rw-r--r--servers/visual/visual_server_raster.cpp5089
-rw-r--r--servers/visual/visual_server_raster.h784
-rw-r--r--servers/visual/visual_server_wrap_mt.cpp72
-rw-r--r--servers/visual/visual_server_wrap_mt.h813
-rw-r--r--servers/visual_server.cpp893
-rw-r--r--servers/visual_server.h999
121 files changed, 19117 insertions, 22748 deletions
diff --git a/servers/audio/audio_driver_dummy.cpp b/servers/audio/audio_driver_dummy.cpp
index 6fe14b0fc..470f79971 100644
--- a/servers/audio/audio_driver_dummy.cpp
+++ b/servers/audio/audio_driver_dummy.cpp
@@ -31,42 +31,37 @@
#include "globals.h"
#include "os/os.h"
-
-
Error AudioDriverDummy::init() {
- active=false;
- thread_exited=false;
- exit_thread=false;
+ active = false;
+ thread_exited = false;
+ exit_thread = false;
pcm_open = false;
samples_in = NULL;
-
mix_rate = 44100;
output_format = OUTPUT_STEREO;
channels = 2;
- int latency = GLOBAL_DEF("audio/output_latency",25);
- buffer_size = nearest_power_of_2( latency * mix_rate / 1000 );
+ int latency = GLOBAL_DEF("audio/output_latency", 25);
+ buffer_size = nearest_power_of_2(latency * mix_rate / 1000);
- samples_in = memnew_arr(int32_t, buffer_size*channels);
+ samples_in = memnew_arr(int32_t, buffer_size * channels);
- mutex=Mutex::create();
+ mutex = Mutex::create();
thread = Thread::create(AudioDriverDummy::thread_func, this);
return OK;
};
-void AudioDriverDummy::thread_func(void* p_udata) {
+void AudioDriverDummy::thread_func(void *p_udata) {
- AudioDriverDummy* ad = (AudioDriverDummy*)p_udata;
-
- uint64_t usdelay = (ad->buffer_size / float(ad->mix_rate))*1000000;
+ AudioDriverDummy *ad = (AudioDriverDummy *)p_udata;
+ uint64_t usdelay = (ad->buffer_size / float(ad->mix_rate)) * 1000000;
while (!ad->exit_thread) {
-
if (!ad->active) {
} else {
@@ -76,15 +71,12 @@ void AudioDriverDummy::thread_func(void* p_udata) {
ad->audio_server_process(ad->buffer_size, ad->samples_in);
ad->unlock();
-
};
OS::get_singleton()->delay_usec(usdelay);
-
};
- ad->thread_exited=true;
-
+ ad->thread_exited = true;
};
void AudioDriverDummy::start() {
@@ -135,12 +127,9 @@ void AudioDriverDummy::finish() {
AudioDriverDummy::AudioDriverDummy() {
mutex = NULL;
- thread=NULL;
-
+ thread = NULL;
};
-AudioDriverDummy::~AudioDriverDummy() {
+AudioDriverDummy::~AudioDriverDummy(){
};
-
-
diff --git a/servers/audio/audio_driver_dummy.h b/servers/audio/audio_driver_dummy.h
index c91a0db43..d07ee9c21 100644
--- a/servers/audio/audio_driver_dummy.h
+++ b/servers/audio/audio_driver_dummy.h
@@ -31,18 +31,17 @@
#include "servers/audio/audio_server_sw.h"
-#include "core/os/thread.h"
#include "core/os/mutex.h"
-
+#include "core/os/thread.h"
class AudioDriverDummy : public AudioDriverSW {
- Thread* thread;
- Mutex* mutex;
+ Thread *thread;
+ Mutex *mutex;
- int32_t* samples_in;
+ int32_t *samples_in;
- static void thread_func(void* p_udata);
+ static void thread_func(void *p_udata);
int buffer_size;
unsigned int mix_rate;
@@ -56,8 +55,7 @@ class AudioDriverDummy : public AudioDriverSW {
bool pcm_open;
public:
-
- const char* get_name() const {
+ const char *get_name() const {
return "Dummy";
};
diff --git a/servers/audio/audio_filter_sw.cpp b/servers/audio/audio_filter_sw.cpp
index cdfe1a29f..aa141a031 100644
--- a/servers/audio/audio_filter_sw.cpp
+++ b/servers/audio/audio_filter_sw.cpp
@@ -34,62 +34,57 @@ void AudioFilterSW::set_mode(Mode p_mode) {
}
void AudioFilterSW::set_cutoff(float p_cutoff) {
- cutoff=p_cutoff;
+ cutoff = p_cutoff;
}
void AudioFilterSW::set_resonance(float p_resonance) {
- resonance=p_resonance;
+ resonance = p_resonance;
}
void AudioFilterSW::set_gain(float p_gain) {
- gain=p_gain;
+ gain = p_gain;
}
void AudioFilterSW::set_sampling_rate(float p_srate) {
- sampling_rate=p_srate;
+ sampling_rate = p_srate;
}
-
void AudioFilterSW::prepare_coefficients(Coeffs *p_coeffs) {
- int sr_limit = (sampling_rate/2)+512;
-
-
- double final_cutoff=(cutoff>sr_limit)?sr_limit:cutoff;
- if (final_cutoff<1) //avoid crapness
- final_cutoff=1; //dont allow less than this
+ int sr_limit = (sampling_rate / 2) + 512;
+ double final_cutoff = (cutoff > sr_limit) ? sr_limit : cutoff;
+ if (final_cutoff < 1) //avoid crapness
+ final_cutoff = 1; //dont allow less than this
+ double omega = 2.0 * Math_PI * final_cutoff / sampling_rate;
- double omega=2.0*Math_PI*final_cutoff/sampling_rate;
+ double sin_v = Math::sin(omega);
+ double cos_v = Math::cos(omega);
- double sin_v=Math::sin(omega);
- double cos_v=Math::cos(omega);
-
- double Q=resonance;
- if (Q<=0.0) {
- Q=0.0001;
+ double Q = resonance;
+ if (Q <= 0.0) {
+ Q = 0.0001;
}
+ if (mode == BANDPASS)
+ Q *= 2.0;
+ else if (mode == PEAK)
+ Q *= 3.0;
- if (mode==BANDPASS)
- Q*=2.0;
- else if (mode==PEAK)
- Q*=3.0;
-
- double tmpgain=gain;
+ double tmpgain = gain;
- if (tmpgain<0.001)
- tmpgain=0.001;
+ if (tmpgain < 0.001)
+ tmpgain = 0.001;
- if (stages>1) {
+ if (stages > 1) {
- Q=(Q>1.0 ? Math::pow(Q,1.0/stages) : Q);
- tmpgain = Math::pow(tmpgain,1.0/(stages+1));
+ Q = (Q > 1.0 ? Math::pow(Q, 1.0 / stages) : Q);
+ tmpgain = Math::pow(tmpgain, 1.0 / (stages + 1));
}
- double alpha = sin_v/(2*Q);
+ double alpha = sin_v / (2 * Q);
double a0 = 1.0 + alpha;
@@ -97,169 +92,159 @@ void AudioFilterSW::prepare_coefficients(Coeffs *p_coeffs) {
case LOWPASS: {
- p_coeffs->b0= (1.0 - cos_v)/2.0 ;
- p_coeffs->b1= 1.0 - cos_v ;
- p_coeffs->b2= (1.0 - cos_v)/2.0 ;
- p_coeffs->a1= -2.0*cos_v;
- p_coeffs->a2= 1.0 - alpha ;
+ p_coeffs->b0 = (1.0 - cos_v) / 2.0;
+ p_coeffs->b1 = 1.0 - cos_v;
+ p_coeffs->b2 = (1.0 - cos_v) / 2.0;
+ p_coeffs->a1 = -2.0 * cos_v;
+ p_coeffs->a2 = 1.0 - alpha;
} break;
-
case HIGHPASS: {
- p_coeffs->b0 = (1.0 + cos_v)/2.0;
+ p_coeffs->b0 = (1.0 + cos_v) / 2.0;
p_coeffs->b1 = -(1.0 + cos_v);
- p_coeffs->b2 = (1.0 + cos_v)/2.0;
- p_coeffs->a1 = -2.0*cos_v;
- p_coeffs->a2 = 1.0 - alpha;
+ p_coeffs->b2 = (1.0 + cos_v) / 2.0;
+ p_coeffs->a1 = -2.0 * cos_v;
+ p_coeffs->a2 = 1.0 - alpha;
} break;
case BANDPASS: {
- p_coeffs->b0 = alpha*sqrt(Q+1);
- p_coeffs->b1 = 0.0 ;
- p_coeffs->b2 = -alpha*sqrt(Q+1);
- p_coeffs->a1 = -2.0*cos_v;
- p_coeffs->a2 = 1.0 - alpha;
+ p_coeffs->b0 = alpha * sqrt(Q + 1);
+ p_coeffs->b1 = 0.0;
+ p_coeffs->b2 = -alpha * sqrt(Q + 1);
+ p_coeffs->a1 = -2.0 * cos_v;
+ p_coeffs->a2 = 1.0 - alpha;
} break;
case NOTCH: {
- p_coeffs->b0 = 1.0;
- p_coeffs->b1 = -2.0*cos_v;
- p_coeffs->b2 = 1.0;
- p_coeffs->a1 = -2.0*cos_v;
- p_coeffs->a2 = 1.0 - alpha;
+ p_coeffs->b0 = 1.0;
+ p_coeffs->b1 = -2.0 * cos_v;
+ p_coeffs->b2 = 1.0;
+ p_coeffs->a1 = -2.0 * cos_v;
+ p_coeffs->a2 = 1.0 - alpha;
} break;
case PEAK: {
- p_coeffs->b0 = (1.0+alpha*tmpgain);
- p_coeffs->b1 = (-2.0*cos_v);
- p_coeffs->b2 = (1.0-alpha*tmpgain);
- p_coeffs->a1 = -2*cos_v;
- p_coeffs->a2 = (1-alpha/tmpgain);
+ p_coeffs->b0 = (1.0 + alpha * tmpgain);
+ p_coeffs->b1 = (-2.0 * cos_v);
+ p_coeffs->b2 = (1.0 - alpha * tmpgain);
+ p_coeffs->a1 = -2 * cos_v;
+ p_coeffs->a2 = (1 - alpha / tmpgain);
} break;
case BANDLIMIT: {
//this one is extra tricky
- double hicutoff=resonance;
- double centercutoff = (cutoff+resonance)/2.0;
- double bandwidth=(Math::log(centercutoff)-Math::log(hicutoff))/Math::log(2);
- omega=2.0*Math_PI*centercutoff/sampling_rate;
- alpha = Math::sin(omega)*Math::sinh( Math::log(2)/2 * bandwidth * omega/Math::sin(omega) );
- a0=1+alpha;
+ double hicutoff = resonance;
+ double centercutoff = (cutoff + resonance) / 2.0;
+ double bandwidth = (Math::log(centercutoff) - Math::log(hicutoff)) / Math::log(2);
+ omega = 2.0 * Math_PI * centercutoff / sampling_rate;
+ alpha = Math::sin(omega) * Math::sinh(Math::log(2) / 2 * bandwidth * omega / Math::sin(omega));
+ a0 = 1 + alpha;
- p_coeffs->b0 = alpha;
- p_coeffs->b1 = 0;
- p_coeffs->b2 = -alpha;
- p_coeffs->a1 = -2*Math::cos(omega);
- p_coeffs->a2 = 1-alpha;
+ p_coeffs->b0 = alpha;
+ p_coeffs->b1 = 0;
+ p_coeffs->b2 = -alpha;
+ p_coeffs->a1 = -2 * Math::cos(omega);
+ p_coeffs->a2 = 1 - alpha;
} break;
case LOWSHELF: {
- double tmpq = Math::sqrt(Q);
- if (tmpq<=0)
- tmpq=0.001;
+ double tmpq = Math::sqrt(Q);
+ if (tmpq <= 0)
+ tmpq = 0.001;
alpha = sin_v / (2 * tmpq);
- double beta = Math::sqrt(tmpgain) / tmpq;
+ double beta = Math::sqrt(tmpgain) / tmpq;
- a0=(tmpgain+1.0)+(tmpgain-1.0)*cos_v+beta*sin_v;
- p_coeffs->b0=tmpgain*((tmpgain+1.0)-(tmpgain-1.0)*cos_v+beta*sin_v);
- p_coeffs->b1=2.0*tmpgain*((tmpgain-1.0)-(tmpgain+1.0)*cos_v);
- p_coeffs->b2=tmpgain*((tmpgain+1.0)-(tmpgain-1.0)*cos_v-beta*sin_v);
- p_coeffs->a1=-2.0*((tmpgain-1.0)+(tmpgain+1.0)*cos_v);
- p_coeffs->a2=((tmpgain+1.0)+(tmpgain-1.0)*cos_v-beta*sin_v);
+ a0 = (tmpgain + 1.0) + (tmpgain - 1.0) * cos_v + beta * sin_v;
+ p_coeffs->b0 = tmpgain * ((tmpgain + 1.0) - (tmpgain - 1.0) * cos_v + beta * sin_v);
+ p_coeffs->b1 = 2.0 * tmpgain * ((tmpgain - 1.0) - (tmpgain + 1.0) * cos_v);
+ p_coeffs->b2 = tmpgain * ((tmpgain + 1.0) - (tmpgain - 1.0) * cos_v - beta * sin_v);
+ p_coeffs->a1 = -2.0 * ((tmpgain - 1.0) + (tmpgain + 1.0) * cos_v);
+ p_coeffs->a2 = ((tmpgain + 1.0) + (tmpgain - 1.0) * cos_v - beta * sin_v);
} break;
case HIGHSHELF: {
- double tmpq= Math::sqrt(Q);
- if (tmpq<=0)
- tmpq=0.001;
+ double tmpq = Math::sqrt(Q);
+ if (tmpq <= 0)
+ tmpq = 0.001;
alpha = sin_v / (2 * tmpq);
- double beta = Math::sqrt(tmpgain) / tmpq;
-
- a0=(tmpgain+1.0)-(tmpgain-1.0)*cos_v+beta*sin_v;
- p_coeffs->b0=tmpgain*((tmpgain+1.0)+(tmpgain-1.0)*cos_v+beta*sin_v);
- p_coeffs->b1=-2.0*tmpgain*((tmpgain-1.0)+(tmpgain+1.0)*cos_v);
- p_coeffs->b2=tmpgain*((tmpgain+1.0)+(tmpgain-1.0)*cos_v-beta*sin_v);
- p_coeffs->a1=2.0*((tmpgain-1.0)-(tmpgain+1.0)*cos_v);
- p_coeffs->a2=((tmpgain+1.0)-(tmpgain-1.0)*cos_v-beta*sin_v);
+ double beta = Math::sqrt(tmpgain) / tmpq;
+ a0 = (tmpgain + 1.0) - (tmpgain - 1.0) * cos_v + beta * sin_v;
+ p_coeffs->b0 = tmpgain * ((tmpgain + 1.0) + (tmpgain - 1.0) * cos_v + beta * sin_v);
+ p_coeffs->b1 = -2.0 * tmpgain * ((tmpgain - 1.0) + (tmpgain + 1.0) * cos_v);
+ p_coeffs->b2 = tmpgain * ((tmpgain + 1.0) + (tmpgain - 1.0) * cos_v - beta * sin_v);
+ p_coeffs->a1 = 2.0 * ((tmpgain - 1.0) - (tmpgain + 1.0) * cos_v);
+ p_coeffs->a2 = ((tmpgain + 1.0) - (tmpgain - 1.0) * cos_v - beta * sin_v);
} break;
+ };
- };
+ p_coeffs->b0 /= a0;
+ p_coeffs->b1 /= a0;
+ p_coeffs->b2 /= a0;
+ p_coeffs->a1 /= 0.0 - a0;
+ p_coeffs->a2 /= 0.0 - a0;
- p_coeffs->b0/=a0;
- p_coeffs->b1/=a0;
- p_coeffs->b2/=a0;
- p_coeffs->a1/=0.0-a0;
- p_coeffs->a2/=0.0-a0;
-
- //undenormalise
-/* p_coeffs->b0=undenormalise(p_coeffs->b0);
+ //undenormalise
+ /* p_coeffs->b0=undenormalise(p_coeffs->b0);
p_coeffs->b1=undenormalise(p_coeffs->b1);
p_coeffs->b2=undenormalise(p_coeffs->b2);
p_coeffs->a1=undenormalise(p_coeffs->a1);
p_coeffs->a2=undenormalise(p_coeffs->a2);*/
-
}
void AudioFilterSW::set_stages(int p_stages) { //adjust for multiple stages
- stages=p_stages;
+ stages = p_stages;
}
/* Fouriertransform kernel to obtain response */
-float AudioFilterSW::get_response(float p_freq,Coeffs *p_coeffs) {
+float AudioFilterSW::get_response(float p_freq, Coeffs *p_coeffs) {
- float freq=p_freq / sampling_rate * Math_PI * 2.0f;
+ float freq = p_freq / sampling_rate * Math_PI * 2.0f;
- float cx=p_coeffs->b0,cy=0.0;
+ float cx = p_coeffs->b0, cy = 0.0;
cx += cos(freq) * p_coeffs->b1;
cy -= sin(freq) * p_coeffs->b1;
- cx += cos(2*freq) * p_coeffs->b2;
- cy -= sin(2*freq) * p_coeffs->b2;
-
-
- float H=cx*cx+cy*cy;
- cx=1.0;
- cy=0.0;
+ cx += cos(2 * freq) * p_coeffs->b2;
+ cy -= sin(2 * freq) * p_coeffs->b2;
+ float H = cx * cx + cy * cy;
+ cx = 1.0;
+ cy = 0.0;
cx -= cos(freq) * p_coeffs->a1;
cy += sin(freq) * p_coeffs->a1;
- cx -= cos(2*freq) * p_coeffs->a2;
- cy += sin(2*freq) * p_coeffs->a2;
-
+ cx -= cos(2 * freq) * p_coeffs->a2;
+ cy += sin(2 * freq) * p_coeffs->a2;
- H=H/(cx*cx+cy*cy);
+ H = H / (cx * cx + cy * cy);
return H;
}
-
AudioFilterSW::AudioFilterSW() {
-
- sampling_rate=44100;
- resonance=0.5;
- cutoff=5000;
- gain=1.0;
- mode=LOWPASS;
- stages=1;
+ sampling_rate = 44100;
+ resonance = 0.5;
+ cutoff = 5000;
+ gain = 1.0;
+ mode = LOWPASS;
+ stages = 1;
}
AudioFilterSW::Processor::Processor() {
set_filter(NULL);
-
}
-void AudioFilterSW::Processor::set_filter(AudioFilterSW * p_filter) {
+void AudioFilterSW::Processor::set_filter(AudioFilterSW *p_filter) {
- ha1=ha2=hb1=hb2=0;
- filter=p_filter;
+ ha1 = ha2 = hb1 = hb2 = 0;
+ filter = p_filter;
}
void AudioFilterSW::Processor::update_coeffs() {
@@ -268,19 +253,16 @@ void AudioFilterSW::Processor::update_coeffs() {
return;
filter->prepare_coefficients(&coeffs);
-
}
-void AudioFilterSW::Processor::process(float *p_samples,int p_amount, int p_stride) {
+void AudioFilterSW::Processor::process(float *p_samples, int p_amount, int p_stride) {
if (!filter)
return;
- for (int i=0;i<p_amount;i++) {
+ for (int i = 0; i < p_amount; i++) {
process_one(*p_samples);
- p_samples+=p_stride;
+ p_samples += p_stride;
}
-
-
}
diff --git a/servers/audio/audio_filter_sw.h b/servers/audio/audio_filter_sw.h
index 0f3e2410f..3954e4918 100644
--- a/servers/audio/audio_filter_sw.h
+++ b/servers/audio/audio_filter_sw.h
@@ -29,19 +29,17 @@
#ifndef AUDIO_FILTER_SW_H
#define AUDIO_FILTER_SW_H
-
#include "math_funcs.h"
class AudioFilterSW {
public:
-
struct Coeffs {
- float a1,a2;
- float b0,b1,b2;
+ float a1, a2;
+ float b0, b1, b2;
//bool operator==(const Coeffs &p_rv) { return (FLOATS_EQ(a1,p_rv.a1) && FLOATS_EQ(a2,p_rv.a2) && FLOATS_EQ(b1,p_rv.b1) && FLOATS_EQ(b2,p_rv.b2) && FLOATS_EQ(b0,p_rv.b0) ); }
- Coeffs() { a1=a2=b0=b1=b2=0.0; }
+ Coeffs() { a1 = a2 = b0 = b1 = b2 = 0.0; }
};
enum Mode {
@@ -58,21 +56,19 @@ public:
class Processor { // simple filter processor
- AudioFilterSW * filter;
+ AudioFilterSW *filter;
Coeffs coeffs;
- float ha1,ha2,hb1,hb2; //history
+ float ha1, ha2, hb1, hb2; //history
public:
- void set_filter(AudioFilterSW * p_filter);
- void process(float *p_samples,int p_amount, int p_stride=1);
+ void set_filter(AudioFilterSW *p_filter);
+ void process(float *p_samples, int p_amount, int p_stride = 1);
void update_coeffs();
- inline void process_one(float& p_sample);
+ inline void process_one(float &p_sample);
Processor();
};
private:
-
-
float cutoff;
float resonance;
float gain;
@@ -80,11 +76,8 @@ private:
int stages;
Mode mode;
-
-
public:
-
- float get_response(float p_freq,Coeffs *p_coeffs);
+ float get_response(float p_freq, Coeffs *p_coeffs);
void set_mode(Mode p_mode);
void set_cutoff(float p_cutoff);
@@ -96,24 +89,18 @@ public:
void prepare_coefficients(Coeffs *p_coeffs);
AudioFilterSW();
-
};
-
-
-
/* inline methods */
-
void AudioFilterSW::Processor::process_one(float &p_val) {
- float pre=p_val;
- p_val = (p_val * coeffs.b0 + hb1 * coeffs.b1 + hb2 * coeffs.b2 + ha1 * coeffs.a1 + ha2 * coeffs.a2);
- ha2=ha1;
- hb2=hb1;
- hb1=pre;
- ha1=p_val;
+ float pre = p_val;
+ p_val = (p_val * coeffs.b0 + hb1 * coeffs.b1 + hb2 * coeffs.b2 + ha1 * coeffs.a1 + ha2 * coeffs.a2);
+ ha2 = ha1;
+ hb2 = hb1;
+ hb1 = pre;
+ ha1 = p_val;
}
-
#endif // AUDIO_FILTER_SW_H
diff --git a/servers/audio/audio_mixer_sw.cpp b/servers/audio/audio_mixer_sw.cpp
index faed6905e..bf2a2c905 100644
--- a/servers/audio/audio_mixer_sw.cpp
+++ b/servers/audio/audio_mixer_sw.cpp
@@ -27,33 +27,32 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include "audio_mixer_sw.h"
-#include "print_string.h"
#include "os/os.h"
+#include "print_string.h"
//TODO implement FAST_AUDIO macro
#ifdef FAST_AUDIO
#define NO_REVERB
#endif
-template<class Depth,bool is_stereo,bool is_ima_adpcm,bool use_filter,bool use_fx,AudioMixerSW::InterpolationType type,AudioMixerSW::MixChannels mix_mode>
-void AudioMixerSW::do_resample(const Depth* p_src, int32_t *p_dst, ResamplerState *p_state) {
+template <class Depth, bool is_stereo, bool is_ima_adpcm, bool use_filter, bool use_fx, AudioMixerSW::InterpolationType type, AudioMixerSW::MixChannels mix_mode>
+void AudioMixerSW::do_resample(const Depth *p_src, int32_t *p_dst, ResamplerState *p_state) {
// this function will be compiled branchless by any decent compiler
- int32_t final,final_r,next,next_r;
+ int32_t final, final_r, next, next_r;
int32_t *reverb_dst = p_state->reverb_buffer;
while (p_state->amount--) {
- int32_t pos=p_state->pos >> MIX_FRAC_BITS;
+ int32_t pos = p_state->pos >> MIX_FRAC_BITS;
if (is_stereo && !is_ima_adpcm)
- pos<<=1;
+ pos <<= 1;
if (is_ima_adpcm) {
int sample_pos = pos + p_state->ima_adpcm[0].window_ofs;
- while(sample_pos>p_state->ima_adpcm[0].last_nibble) {
-
+ while (sample_pos > p_state->ima_adpcm[0].last_nibble) {
static const int16_t _ima_adpcm_step_table[89] = {
7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
@@ -72,238 +71,223 @@ void AudioMixerSW::do_resample(const Depth* p_src, int32_t *p_dst, ResamplerStat
-1, -1, -1, -1, 2, 4, 6, 8
};
- for(int i=0;i<(is_stereo?2:1);i++) {
+ for (int i = 0; i < (is_stereo ? 2 : 1); i++) {
-
- int16_t nibble,diff,step;
+ int16_t nibble, diff, step;
p_state->ima_adpcm[i].last_nibble++;
- const uint8_t *src_ptr=p_state->ima_adpcm[i].ptr;
-
-
- uint8_t nbb = src_ptr[ (p_state->ima_adpcm[i].last_nibble>>1) * (is_stereo?2:1) + i ];
- nibble = (p_state->ima_adpcm[i].last_nibble&1)?(nbb>>4):(nbb&0xF);
- step=_ima_adpcm_step_table[p_state->ima_adpcm[i].step_index];
+ const uint8_t *src_ptr = p_state->ima_adpcm[i].ptr;
+ uint8_t nbb = src_ptr[(p_state->ima_adpcm[i].last_nibble >> 1) * (is_stereo ? 2 : 1) + i];
+ nibble = (p_state->ima_adpcm[i].last_nibble & 1) ? (nbb >> 4) : (nbb & 0xF);
+ step = _ima_adpcm_step_table[p_state->ima_adpcm[i].step_index];
p_state->ima_adpcm[i].step_index += _ima_adpcm_index_table[nibble];
- if (p_state->ima_adpcm[i].step_index<0)
- p_state->ima_adpcm[i].step_index=0;
- if (p_state->ima_adpcm[i].step_index>88)
- p_state->ima_adpcm[i].step_index=88;
+ if (p_state->ima_adpcm[i].step_index < 0)
+ p_state->ima_adpcm[i].step_index = 0;
+ if (p_state->ima_adpcm[i].step_index > 88)
+ p_state->ima_adpcm[i].step_index = 88;
- diff = step >> 3 ;
+ diff = step >> 3;
if (nibble & 1)
- diff += step >> 2 ;
+ diff += step >> 2;
if (nibble & 2)
- diff += step >> 1 ;
+ diff += step >> 1;
if (nibble & 4)
- diff += step ;
+ diff += step;
if (nibble & 8)
- diff = -diff ;
-
- p_state->ima_adpcm[i].predictor+=diff;
- if (p_state->ima_adpcm[i].predictor<-0x8000)
- p_state->ima_adpcm[i].predictor=-0x8000;
- else if (p_state->ima_adpcm[i].predictor>0x7FFF)
- p_state->ima_adpcm[i].predictor=0x7FFF;
+ diff = -diff;
+ p_state->ima_adpcm[i].predictor += diff;
+ if (p_state->ima_adpcm[i].predictor < -0x8000)
+ p_state->ima_adpcm[i].predictor = -0x8000;
+ else if (p_state->ima_adpcm[i].predictor > 0x7FFF)
+ p_state->ima_adpcm[i].predictor = 0x7FFF;
/* store loop if there */
- if (p_state->ima_adpcm[i].last_nibble==p_state->ima_adpcm[i].loop_pos) {
+ if (p_state->ima_adpcm[i].last_nibble == p_state->ima_adpcm[i].loop_pos) {
p_state->ima_adpcm[i].loop_step_index = p_state->ima_adpcm[i].step_index;
p_state->ima_adpcm[i].loop_predictor = p_state->ima_adpcm[i].predictor;
}
//printf("%i - %i - pred %i\n",int(p_state->ima_adpcm[i].last_nibble),int(nibble),int(p_state->ima_adpcm[i].predictor));
-
}
-
}
- final=p_state->ima_adpcm[0].predictor;
+ final = p_state->ima_adpcm[0].predictor;
if (is_stereo) {
- final_r=p_state->ima_adpcm[1].predictor;
+ final_r = p_state->ima_adpcm[1].predictor;
}
} else {
- final=p_src[pos];
+ final = p_src[pos];
if (is_stereo)
- final_r=p_src[pos+1];
+ final_r = p_src[pos + 1];
- if (sizeof(Depth)==1) { /* conditions will not exist anymore when compiled! */
- final<<=8;
+ if (sizeof(Depth) == 1) { /* conditions will not exist anymore when compiled! */
+ final <<= 8;
if (is_stereo)
- final_r<<=8;
+ final_r <<= 8;
}
- if (type==INTERPOLATION_LINEAR) {
+ if (type == INTERPOLATION_LINEAR) {
if (is_stereo) {
- next=p_src[pos+2];
- next_r=p_src[pos+3];
+ next = p_src[pos + 2];
+ next_r = p_src[pos + 3];
} else {
- next=p_src[pos+1];
+ next = p_src[pos + 1];
}
- if (sizeof(Depth)==1) {
- next<<=8;
+ if (sizeof(Depth) == 1) {
+ next <<= 8;
if (is_stereo)
- next_r<<=8;
+ next_r <<= 8;
}
- int32_t frac=int32_t(p_state->pos&MIX_FRAC_MASK);
+ int32_t frac = int32_t(p_state->pos & MIX_FRAC_MASK);
- final=final+((next-final)*frac >> MIX_FRAC_BITS);
+ final = final + ((next - final) * frac >> MIX_FRAC_BITS);
if (is_stereo)
- final_r=final_r+((next_r-final_r)*frac >> MIX_FRAC_BITS);
+ final_r = final_r + ((next_r - final_r) * frac >> MIX_FRAC_BITS);
}
}
if (use_filter) {
Channel::Mix::Filter *f = p_state->filter_l;
- float finalf=final;
+ float finalf = final;
float pre = finalf;
- finalf = ((finalf*p_state->coefs.b0) + (f->hb[0]*p_state->coefs.b1) + (f->hb[1]*p_state->coefs.b2) + (f->ha[0]*p_state->coefs.a1) + (f->ha[1]*p_state->coefs.a2)
- );
+ finalf = ((finalf * p_state->coefs.b0) + (f->hb[0] * p_state->coefs.b1) + (f->hb[1] * p_state->coefs.b2) + (f->ha[0] * p_state->coefs.a1) + (f->ha[1] * p_state->coefs.a2));
- f->ha[1]=f->ha[0];
- f->hb[1]=f->hb[0];
- f->hb[0]=pre;
- f->ha[0]=finalf;
+ f->ha[1] = f->ha[0];
+ f->hb[1] = f->hb[0];
+ f->hb[0] = pre;
+ f->ha[0] = finalf;
- final=Math::fast_ftoi(finalf);
+ final = Math::fast_ftoi(finalf);
if (is_stereo) {
f = p_state->filter_r;
- finalf=final_r;
+ finalf = final_r;
pre = finalf;
- finalf = ((finalf*p_state->coefs.b0) + (f->hb[0]*p_state->coefs.b1) + (f->hb[1]*p_state->coefs.b2) + (f->ha[0]*p_state->coefs.a1) + (f->ha[1]*p_state->coefs.a2)
- );
- f->ha[1]=f->ha[0];
- f->hb[1]=f->hb[0];
- f->hb[0]=pre;
- f->ha[0]=finalf;
-
- final_r=Math::fast_ftoi(finalf);
+ finalf = ((finalf * p_state->coefs.b0) + (f->hb[0] * p_state->coefs.b1) + (f->hb[1] * p_state->coefs.b2) + (f->ha[0] * p_state->coefs.a1) + (f->ha[1] * p_state->coefs.a2));
+ f->ha[1] = f->ha[0];
+ f->hb[1] = f->hb[0];
+ f->hb[0] = pre;
+ f->ha[0] = finalf;
+ final_r = Math::fast_ftoi(finalf);
}
- p_state->coefs.b0+=p_state->coefs_inc.b0;
- p_state->coefs.b1+=p_state->coefs_inc.b1;
- p_state->coefs.b2+=p_state->coefs_inc.b2;
- p_state->coefs.a1+=p_state->coefs_inc.a1;
- p_state->coefs.a2+=p_state->coefs_inc.a2;
+ p_state->coefs.b0 += p_state->coefs_inc.b0;
+ p_state->coefs.b1 += p_state->coefs_inc.b1;
+ p_state->coefs.b2 += p_state->coefs_inc.b2;
+ p_state->coefs.a1 += p_state->coefs_inc.a1;
+ p_state->coefs.a2 += p_state->coefs_inc.a2;
}
if (!is_stereo) {
- final_r=final; //copy to right channel if stereo
+ final_r = final; //copy to right channel if stereo
}
//convert back to 24 bits and mix to buffers
- if (mix_mode==MIX_STEREO) {
- *p_dst++ +=(final*(p_state->vol[0]>>MIX_VOLRAMP_FRAC_BITS))>>MIX_VOL_MOVE_TO_24;
- *p_dst++ +=(final_r*(p_state->vol[1]>>MIX_VOLRAMP_FRAC_BITS))>>MIX_VOL_MOVE_TO_24;
+ if (mix_mode == MIX_STEREO) {
+ *p_dst++ += (final * (p_state->vol[0] >> MIX_VOLRAMP_FRAC_BITS)) >> MIX_VOL_MOVE_TO_24;
+ *p_dst++ += (final_r * (p_state->vol[1] >> MIX_VOLRAMP_FRAC_BITS)) >> MIX_VOL_MOVE_TO_24;
- p_state->vol[0]+=p_state->vol_inc[0];
- p_state->vol[1]+=p_state->vol_inc[1];
+ p_state->vol[0] += p_state->vol_inc[0];
+ p_state->vol[1] += p_state->vol_inc[1];
if (use_fx) {
- *reverb_dst++ +=(final*(p_state->reverb_vol[0]>>MIX_VOLRAMP_FRAC_BITS))>>MIX_VOL_MOVE_TO_24;
- *reverb_dst++ +=(final_r*(p_state->reverb_vol[1]>>MIX_VOLRAMP_FRAC_BITS))>>MIX_VOL_MOVE_TO_24;
- p_state->reverb_vol[0]+=p_state->reverb_vol_inc[0];
- p_state->reverb_vol[1]+=p_state->reverb_vol_inc[1];
+ *reverb_dst++ += (final * (p_state->reverb_vol[0] >> MIX_VOLRAMP_FRAC_BITS)) >> MIX_VOL_MOVE_TO_24;
+ *reverb_dst++ += (final_r * (p_state->reverb_vol[1] >> MIX_VOLRAMP_FRAC_BITS)) >> MIX_VOL_MOVE_TO_24;
+ p_state->reverb_vol[0] += p_state->reverb_vol_inc[0];
+ p_state->reverb_vol[1] += p_state->reverb_vol_inc[1];
}
+ } else if (mix_mode == MIX_QUAD) {
- } else if (mix_mode==MIX_QUAD) {
-
- *p_dst++ +=(final*(p_state->vol[0]>>MIX_VOLRAMP_FRAC_BITS))>>MIX_VOL_MOVE_TO_24;
- *p_dst++ +=(final_r*(p_state->vol[1]>>MIX_VOLRAMP_FRAC_BITS))>>MIX_VOL_MOVE_TO_24;
+ *p_dst++ += (final * (p_state->vol[0] >> MIX_VOLRAMP_FRAC_BITS)) >> MIX_VOL_MOVE_TO_24;
+ *p_dst++ += (final_r * (p_state->vol[1] >> MIX_VOLRAMP_FRAC_BITS)) >> MIX_VOL_MOVE_TO_24;
- *p_dst++ +=(final*(p_state->vol[2]>>MIX_VOLRAMP_FRAC_BITS))>>MIX_VOL_MOVE_TO_24;
- *p_dst++ +=(final_r*(p_state->vol[3]>>MIX_VOLRAMP_FRAC_BITS))>>MIX_VOL_MOVE_TO_24;
+ *p_dst++ += (final * (p_state->vol[2] >> MIX_VOLRAMP_FRAC_BITS)) >> MIX_VOL_MOVE_TO_24;
+ *p_dst++ += (final_r * (p_state->vol[3] >> MIX_VOLRAMP_FRAC_BITS)) >> MIX_VOL_MOVE_TO_24;
- p_state->vol[0]+=p_state->vol_inc[0];
- p_state->vol[1]+=p_state->vol_inc[1];
- p_state->vol[2]+=p_state->vol_inc[2];
- p_state->vol[3]+=p_state->vol_inc[3];
+ p_state->vol[0] += p_state->vol_inc[0];
+ p_state->vol[1] += p_state->vol_inc[1];
+ p_state->vol[2] += p_state->vol_inc[2];
+ p_state->vol[3] += p_state->vol_inc[3];
if (use_fx) {
- *reverb_dst++ +=(final*(p_state->reverb_vol[0]>>MIX_VOLRAMP_FRAC_BITS))>>MIX_VOL_MOVE_TO_24;
- *reverb_dst++ +=(final_r*(p_state->reverb_vol[1]>>MIX_VOLRAMP_FRAC_BITS))>>MIX_VOL_MOVE_TO_24;
- *reverb_dst++ +=(final*(p_state->reverb_vol[2]>>MIX_VOLRAMP_FRAC_BITS))>>MIX_VOL_MOVE_TO_24;
- *reverb_dst++ +=(final_r*(p_state->reverb_vol[3]>>MIX_VOLRAMP_FRAC_BITS))>>MIX_VOL_MOVE_TO_24;
- p_state->reverb_vol[0]+=p_state->reverb_vol_inc[0];
- p_state->reverb_vol[1]+=p_state->reverb_vol_inc[1];
- p_state->reverb_vol[2]+=p_state->reverb_vol_inc[2];
- p_state->reverb_vol[3]+=p_state->reverb_vol_inc[3];
+ *reverb_dst++ += (final * (p_state->reverb_vol[0] >> MIX_VOLRAMP_FRAC_BITS)) >> MIX_VOL_MOVE_TO_24;
+ *reverb_dst++ += (final_r * (p_state->reverb_vol[1] >> MIX_VOLRAMP_FRAC_BITS)) >> MIX_VOL_MOVE_TO_24;
+ *reverb_dst++ += (final * (p_state->reverb_vol[2] >> MIX_VOLRAMP_FRAC_BITS)) >> MIX_VOL_MOVE_TO_24;
+ *reverb_dst++ += (final_r * (p_state->reverb_vol[3] >> MIX_VOLRAMP_FRAC_BITS)) >> MIX_VOL_MOVE_TO_24;
+ p_state->reverb_vol[0] += p_state->reverb_vol_inc[0];
+ p_state->reverb_vol[1] += p_state->reverb_vol_inc[1];
+ p_state->reverb_vol[2] += p_state->reverb_vol_inc[2];
+ p_state->reverb_vol[3] += p_state->reverb_vol_inc[3];
}
}
- p_state->pos+=p_state->increment;
+ p_state->pos += p_state->increment;
}
}
-
-void AudioMixerSW::mix_channel(Channel& c) {
-
+void AudioMixerSW::mix_channel(Channel &c) {
if (!sample_manager->is_sample(c.sample)) {
// sample is gone!
- c.active=false;
+ c.active = false;
return;
}
-
/* some 64-bit fixed point precaches */
- int64_t loop_begin_fp=((int64_t)sample_manager->sample_get_loop_begin(c.sample) << MIX_FRAC_BITS);
- int64_t loop_end_fp=((int64_t)sample_manager->sample_get_loop_end(c.sample) << MIX_FRAC_BITS);
- int64_t length_fp=((int64_t)sample_manager->sample_get_length(c.sample) << MIX_FRAC_BITS);
- int64_t begin_limit=(sample_manager->sample_get_loop_format(c.sample)!=AS::SAMPLE_LOOP_NONE)?loop_begin_fp:0;
- int64_t end_limit=(sample_manager->sample_get_loop_format(c.sample)!=AS::SAMPLE_LOOP_NONE)?loop_end_fp:length_fp;
- bool is_stereo=sample_manager->sample_is_stereo(c.sample);
+ int64_t loop_begin_fp = ((int64_t)sample_manager->sample_get_loop_begin(c.sample) << MIX_FRAC_BITS);
+ int64_t loop_end_fp = ((int64_t)sample_manager->sample_get_loop_end(c.sample) << MIX_FRAC_BITS);
+ int64_t length_fp = ((int64_t)sample_manager->sample_get_length(c.sample) << MIX_FRAC_BITS);
+ int64_t begin_limit = (sample_manager->sample_get_loop_format(c.sample) != AS::SAMPLE_LOOP_NONE) ? loop_begin_fp : 0;
+ int64_t end_limit = (sample_manager->sample_get_loop_format(c.sample) != AS::SAMPLE_LOOP_NONE) ? loop_end_fp : length_fp;
+ bool is_stereo = sample_manager->sample_is_stereo(c.sample);
- int32_t todo=mix_chunk_size;
-// int mixed=0;
- bool use_filter=false;
+ int32_t todo = mix_chunk_size;
+ // int mixed=0;
+ bool use_filter = false;
ResamplerState rstate;
/* compute voume ramps, increment, etc */
-
-
- for(int i=0;i<mix_channels;i++) {
- c.mix.old_vol[i]=c.mix.vol[i];
- c.mix.old_reverb_vol[i]=c.mix.reverb_vol[i];
- c.mix.old_chorus_vol[i]=c.mix.chorus_vol[i];
+ for (int i = 0; i < mix_channels; i++) {
+ c.mix.old_vol[i] = c.mix.vol[i];
+ c.mix.old_reverb_vol[i] = c.mix.reverb_vol[i];
+ c.mix.old_chorus_vol[i] = c.mix.chorus_vol[i];
}
- float vol = c.vol*channel_nrg;
+ float vol = c.vol * channel_nrg;
- float reverb_vol = c.reverb_send*channel_nrg;
- float chorus_vol = c.chorus_send*channel_nrg;
+ float reverb_vol = c.reverb_send * channel_nrg;
+ float chorus_vol = c.chorus_send * channel_nrg;
- if (mix_channels==2) {
+ if (mix_channels == 2) {
//stereo pan
float pan = c.pan * 0.5 + 0.5;
- float panv[2]={
- (1.0 - pan)*(1<<MIX_VOL_FRAC_BITS),
- (pan)*(1<<MIX_VOL_FRAC_BITS)
+ float panv[2] = {
+ (1.0 - pan) * (1 << MIX_VOL_FRAC_BITS),
+ (pan) * (1 << MIX_VOL_FRAC_BITS)
};
- for(int i=0;i<2;i++) {
+ for (int i = 0; i < 2; i++) {
- c.mix.vol[i]=Math::fast_ftoi(vol*panv[i]);
- c.mix.reverb_vol[i]=Math::fast_ftoi(reverb_vol*panv[i]);
- c.mix.chorus_vol[i]=Math::fast_ftoi(chorus_vol*panv[i]);
+ c.mix.vol[i] = Math::fast_ftoi(vol * panv[i]);
+ c.mix.reverb_vol[i] = Math::fast_ftoi(reverb_vol * panv[i]);
+ c.mix.chorus_vol[i] = Math::fast_ftoi(chorus_vol * panv[i]);
}
} else {
@@ -311,79 +295,74 @@ void AudioMixerSW::mix_channel(Channel& c) {
float panx = c.pan * 0.5 + 0.5;
float pany = c.depth * 0.5 + 0.5;
// with this model every speaker plays at 0.25 energy at the center.. i'm not sure if it's correct but it seems to be balanced
- float panv[4]={
- (1.0-pany)*(1.0-panx)*(1<<MIX_VOL_FRAC_BITS),
- (1.0-pany)*( panx)*(1<<MIX_VOL_FRAC_BITS),
- ( pany)*(1.0-panx)*(1<<MIX_VOL_FRAC_BITS),
- ( pany)*( panx)*(1<<MIX_VOL_FRAC_BITS)
+ float panv[4] = {
+ (1.0 - pany) * (1.0 - panx) * (1 << MIX_VOL_FRAC_BITS),
+ (1.0 - pany) * (panx) * (1 << MIX_VOL_FRAC_BITS),
+ (pany) * (1.0 - panx) * (1 << MIX_VOL_FRAC_BITS),
+ (pany) * (panx) * (1 << MIX_VOL_FRAC_BITS)
};
- for(int i=0;i<4;i++) {
+ for (int i = 0; i < 4; i++) {
- c.mix.vol[i]=Math::fast_ftoi(vol*panv[i]);
- c.mix.reverb_vol[i]=Math::fast_ftoi(reverb_vol*panv[i]);
- c.mix.chorus_vol[i]=Math::fast_ftoi(chorus_vol*panv[i]);
+ c.mix.vol[i] = Math::fast_ftoi(vol * panv[i]);
+ c.mix.reverb_vol[i] = Math::fast_ftoi(reverb_vol * panv[i]);
+ c.mix.chorus_vol[i] = Math::fast_ftoi(chorus_vol * panv[i]);
}
-
}
if (c.first_mix) { // avoid ramp up
- for(int i=0;i<mix_channels;i++) {
- c.mix.old_vol[i]=c.mix.vol[i];
- c.mix.old_reverb_vol[i]=c.mix.reverb_vol[i];
- c.mix.old_chorus_vol[i]=c.mix.chorus_vol[i];
+ for (int i = 0; i < mix_channels; i++) {
+ c.mix.old_vol[i] = c.mix.vol[i];
+ c.mix.old_reverb_vol[i] = c.mix.reverb_vol[i];
+ c.mix.old_chorus_vol[i] = c.mix.chorus_vol[i];
}
- c.first_mix=false;
+ c.first_mix = false;
}
-
-
Channel::Filter::Coefs filter_coefs;
Channel::Filter::Coefs filter_inc;
- if (c.filter.type!=AudioMixer::FILTER_NONE) {
+ if (c.filter.type != AudioMixer::FILTER_NONE) {
- filter_coefs=c.filter.old_coefs;
- filter_inc.b0=(c.filter.coefs.b0-filter_coefs.b0)/(1<<mix_chunk_bits);
- filter_inc.b1=(c.filter.coefs.b1-filter_coefs.b1)/(1<<mix_chunk_bits);
- filter_inc.b2=(c.filter.coefs.b2-filter_coefs.b2)/(1<<mix_chunk_bits);
- filter_inc.a1=(c.filter.coefs.a1-filter_coefs.a1)/(1<<mix_chunk_bits);
- filter_inc.a2=(c.filter.coefs.a2-filter_coefs.a2)/(1<<mix_chunk_bits);
- use_filter=true;
+ filter_coefs = c.filter.old_coefs;
+ filter_inc.b0 = (c.filter.coefs.b0 - filter_coefs.b0) / (1 << mix_chunk_bits);
+ filter_inc.b1 = (c.filter.coefs.b1 - filter_coefs.b1) / (1 << mix_chunk_bits);
+ filter_inc.b2 = (c.filter.coefs.b2 - filter_coefs.b2) / (1 << mix_chunk_bits);
+ filter_inc.a1 = (c.filter.coefs.a1 - filter_coefs.a1) / (1 << mix_chunk_bits);
+ filter_inc.a2 = (c.filter.coefs.a2 - filter_coefs.a2) / (1 << mix_chunk_bits);
+ use_filter = true;
}
- if (c.mix.increment>0)
- c.mix.increment=((int64_t)c.speed<<MIX_FRAC_BITS)/mix_rate;
+ if (c.mix.increment > 0)
+ c.mix.increment = ((int64_t)c.speed << MIX_FRAC_BITS) / mix_rate;
else
- c.mix.increment=-((int64_t)c.speed<<MIX_FRAC_BITS)/mix_rate;
+ c.mix.increment = -((int64_t)c.speed << MIX_FRAC_BITS) / mix_rate;
//volume ramp
-
- for(int i=0;i<mix_channels;i++) {
- rstate.vol_inc[i]=((c.mix.vol[i]-c.mix.old_vol[i])<<MIX_VOLRAMP_FRAC_BITS)>>mix_chunk_bits;
- rstate.vol[i]=c.mix.old_vol[i]<<MIX_VOLRAMP_FRAC_BITS;
- rstate.reverb_vol_inc[i]=((c.mix.reverb_vol[i]-c.mix.old_reverb_vol[i])<<MIX_VOLRAMP_FRAC_BITS)>>mix_chunk_bits;
- rstate.reverb_vol[i]=c.mix.old_reverb_vol[i]<<MIX_VOLRAMP_FRAC_BITS;
- rstate.chorus_vol_inc[i]=((c.mix.chorus_vol[i]-c.mix.old_chorus_vol[i])<<MIX_VOLRAMP_FRAC_BITS)>>mix_chunk_bits;
- rstate.chorus_vol[i]=c.mix.old_chorus_vol[i]<<MIX_VOLRAMP_FRAC_BITS;
+ for (int i = 0; i < mix_channels; i++) {
+ rstate.vol_inc[i] = ((c.mix.vol[i] - c.mix.old_vol[i]) << MIX_VOLRAMP_FRAC_BITS) >> mix_chunk_bits;
+ rstate.vol[i] = c.mix.old_vol[i] << MIX_VOLRAMP_FRAC_BITS;
+ rstate.reverb_vol_inc[i] = ((c.mix.reverb_vol[i] - c.mix.old_reverb_vol[i]) << MIX_VOLRAMP_FRAC_BITS) >> mix_chunk_bits;
+ rstate.reverb_vol[i] = c.mix.old_reverb_vol[i] << MIX_VOLRAMP_FRAC_BITS;
+ rstate.chorus_vol_inc[i] = ((c.mix.chorus_vol[i] - c.mix.old_chorus_vol[i]) << MIX_VOLRAMP_FRAC_BITS) >> mix_chunk_bits;
+ rstate.chorus_vol[i] = c.mix.old_chorus_vol[i] << MIX_VOLRAMP_FRAC_BITS;
}
-
//looping
- AS::SampleLoopFormat loop_format=sample_manager->sample_get_loop_format(c.sample);
- AS::SampleFormat format=sample_manager->sample_get_format(c.sample);
+ AS::SampleLoopFormat loop_format = sample_manager->sample_get_loop_format(c.sample);
+ AS::SampleFormat format = sample_manager->sample_get_format(c.sample);
- bool use_fx=false;
+ bool use_fx = false;
if (fx_enabled) {
- for(int i=0;i<mix_channels;i++) {
- if (c.mix.old_reverb_vol[i] || c.mix.reverb_vol[i] || c.mix.old_chorus_vol[i] || c.mix.chorus_vol[i] ) {
- use_fx=true;
+ for (int i = 0; i < mix_channels; i++) {
+ if (c.mix.old_reverb_vol[i] || c.mix.reverb_vol[i] || c.mix.old_chorus_vol[i] || c.mix.chorus_vol[i]) {
+ use_fx = true;
break;
}
}
@@ -391,87 +370,86 @@ void AudioMixerSW::mix_channel(Channel& c) {
/* audio data */
- const void *data=sample_manager->sample_get_data_ptr(c.sample);
- int32_t *dst_buff=mix_buffer;
+ const void *data = sample_manager->sample_get_data_ptr(c.sample);
+ int32_t *dst_buff = mix_buffer;
#ifndef NO_REVERB
- rstate.reverb_buffer=reverb_state[c.reverb_room].buffer;
+ rstate.reverb_buffer = reverb_state[c.reverb_room].buffer;
#endif
/* @TODO validar loops al registrar? */
- rstate.coefs=filter_coefs;
- rstate.coefs_inc=filter_inc;
- rstate.filter_l=&c.mix.filter_l;
- rstate.filter_r=&c.mix.filter_r;
+ rstate.coefs = filter_coefs;
+ rstate.coefs_inc = filter_inc;
+ rstate.filter_l = &c.mix.filter_l;
+ rstate.filter_r = &c.mix.filter_r;
- if (format==AS::SAMPLE_FORMAT_IMA_ADPCM) {
+ if (format == AS::SAMPLE_FORMAT_IMA_ADPCM) {
- rstate.ima_adpcm=c.mix.ima_adpcm;
- if (loop_format!=AS::SAMPLE_LOOP_NONE) {
- c.mix.ima_adpcm[0].loop_pos=loop_begin_fp>>MIX_FRAC_BITS;
- c.mix.ima_adpcm[1].loop_pos=loop_begin_fp>>MIX_FRAC_BITS;
- loop_format=AS::SAMPLE_LOOP_FORWARD;
+ rstate.ima_adpcm = c.mix.ima_adpcm;
+ if (loop_format != AS::SAMPLE_LOOP_NONE) {
+ c.mix.ima_adpcm[0].loop_pos = loop_begin_fp >> MIX_FRAC_BITS;
+ c.mix.ima_adpcm[1].loop_pos = loop_begin_fp >> MIX_FRAC_BITS;
+ loop_format = AS::SAMPLE_LOOP_FORWARD;
}
}
- while (todo>0) {
+ while (todo > 0) {
- int64_t limit=0;
- int32_t target=0,aux=0;
+ int64_t limit = 0;
+ int32_t target = 0, aux = 0;
/** LOOP CHECKING **/
- if ( c.mix.increment < 0 ) {
+ if (c.mix.increment < 0) {
/* going backwards */
- if ( loop_format!=AS::SAMPLE_LOOP_NONE && c.mix.offset < loop_begin_fp ) {
+ if (loop_format != AS::SAMPLE_LOOP_NONE && c.mix.offset < loop_begin_fp) {
/* loopstart reached */
- if ( loop_format==AS::SAMPLE_LOOP_PING_PONG ) {
+ if (loop_format == AS::SAMPLE_LOOP_PING_PONG) {
/* bounce ping pong */
- c.mix.offset= loop_begin_fp + ( loop_begin_fp-c.mix.offset );
- c.mix.increment=-c.mix.increment;
+ c.mix.offset = loop_begin_fp + (loop_begin_fp - c.mix.offset);
+ c.mix.increment = -c.mix.increment;
} else {
/* go to loop-end */
- c.mix.offset=loop_end_fp-(loop_begin_fp-c.mix.offset);
+ c.mix.offset = loop_end_fp - (loop_begin_fp - c.mix.offset);
}
} else {
/* check for sample not reaching begining */
- if(c.mix.offset < 0) {
+ if (c.mix.offset < 0) {
- c.active=false;
+ c.active = false;
break;
}
}
} else {
/* going forward */
- if( loop_format!=AS::SAMPLE_LOOP_NONE && c.mix.offset >= loop_end_fp ) {
+ if (loop_format != AS::SAMPLE_LOOP_NONE && c.mix.offset >= loop_end_fp) {
/* loopend reached */
- if ( loop_format==AS::SAMPLE_LOOP_PING_PONG ) {
+ if (loop_format == AS::SAMPLE_LOOP_PING_PONG) {
/* bounce ping pong */
- c.mix.offset=loop_end_fp-(c.mix.offset-loop_end_fp);
- c.mix.increment=-c.mix.increment;
+ c.mix.offset = loop_end_fp - (c.mix.offset - loop_end_fp);
+ c.mix.increment = -c.mix.increment;
} else {
/* go to loop-begin */
- if (format==AS::SAMPLE_FORMAT_IMA_ADPCM) {
- for(int i=0;i<2;i++) {
- c.mix.ima_adpcm[i].step_index=c.mix.ima_adpcm[i].loop_step_index;
- c.mix.ima_adpcm[i].predictor=c.mix.ima_adpcm[i].loop_predictor;
- c.mix.ima_adpcm[i].last_nibble=loop_begin_fp>>MIX_FRAC_BITS;
+ if (format == AS::SAMPLE_FORMAT_IMA_ADPCM) {
+ for (int i = 0; i < 2; i++) {
+ c.mix.ima_adpcm[i].step_index = c.mix.ima_adpcm[i].loop_step_index;
+ c.mix.ima_adpcm[i].predictor = c.mix.ima_adpcm[i].loop_predictor;
+ c.mix.ima_adpcm[i].last_nibble = loop_begin_fp >> MIX_FRAC_BITS;
}
- c.mix.offset=loop_begin_fp;
+ c.mix.offset = loop_begin_fp;
} else {
- c.mix.offset=loop_begin_fp+(c.mix.offset-loop_end_fp);
+ c.mix.offset = loop_begin_fp + (c.mix.offset - loop_end_fp);
}
-
}
} else {
/* no loop, check for end of sample */
- if(c.mix.offset >= length_fp) {
+ if (c.mix.offset >= length_fp) {
- c.active=false;
+ c.active = false;
break;
}
}
@@ -480,214 +458,202 @@ void AudioMixerSW::mix_channel(Channel& c) {
/** MIXCOUNT COMPUTING **/
/* next possible limit (looppoints or sample begin/end */
- limit=(c.mix.increment < 0) ?begin_limit:end_limit;
+ limit = (c.mix.increment < 0) ? begin_limit : end_limit;
/* compute what is shorter, the todo or the limit? */
- aux=(limit-c.mix.offset)/c.mix.increment+1;
- target=(aux<todo)?aux:todo; /* mix target is the shorter buffer */
+ aux = (limit - c.mix.offset) / c.mix.increment + 1;
+ target = (aux < todo) ? aux : todo; /* mix target is the shorter buffer */
/* check just in case */
- if ( target<=0 ) {
- c.active=false;
+ if (target <= 0) {
+ c.active = false;
break;
}
- todo-=target;
+ todo -= target;
- int32_t offset=c.mix.offset&mix_chunk_mask; /* strip integer */
- c.mix.offset-=offset;
+ int32_t offset = c.mix.offset & mix_chunk_mask; /* strip integer */
+ c.mix.offset -= offset;
- rstate.increment=c.mix.increment;
- rstate.amount=target;
- rstate.pos=offset;
+ rstate.increment = c.mix.increment;
+ rstate.amount = target;
+ rstate.pos = offset;
/* Macros to call the resample function for all possibilities, creating a dedicated-non branchy function call for each thanks to template magic*/
-#define CALL_RESAMPLE_FUNC( m_depth, m_stereo, m_ima_adpcm, m_use_filter, m_use_fx, m_interp, m_mode)\
- do_resample<m_depth,m_stereo,m_ima_adpcm, m_use_filter,m_use_fx,m_interp, m_mode>(\
- src_ptr,\
- dst_buff,&rstate);
-
-
-#define CALL_RESAMPLE_INTERP( m_depth, m_stereo, m_ima_adpcm, m_use_filter, m_use_fx, m_interp, m_mode)\
- if(m_interp==INTERPOLATION_RAW) {\
- CALL_RESAMPLE_FUNC(m_depth,m_stereo, m_ima_adpcm,m_use_filter,m_use_fx,INTERPOLATION_RAW,m_mode);\
- } else if(m_interp==INTERPOLATION_LINEAR) {\
- CALL_RESAMPLE_FUNC(m_depth,m_stereo, m_ima_adpcm,m_use_filter,m_use_fx,INTERPOLATION_LINEAR,m_mode);\
- } else if(m_interp==INTERPOLATION_CUBIC) {\
- CALL_RESAMPLE_FUNC(m_depth,m_stereo, m_ima_adpcm,m_use_filter,m_use_fx,INTERPOLATION_CUBIC,m_mode);\
- }\
-
-#define CALL_RESAMPLE_FX( m_depth, m_stereo, m_ima_adpcm, m_use_filter, m_use_fx, m_interp, m_mode)\
- if(m_use_fx) {\
- CALL_RESAMPLE_INTERP(m_depth,m_stereo, m_ima_adpcm,m_use_filter,true,m_interp, m_mode);\
- } else {\
- CALL_RESAMPLE_INTERP(m_depth,m_stereo, m_ima_adpcm,m_use_filter,false,m_interp, m_mode);\
- }\
-
+#define CALL_RESAMPLE_FUNC(m_depth, m_stereo, m_ima_adpcm, m_use_filter, m_use_fx, m_interp, m_mode) \
+ do_resample<m_depth, m_stereo, m_ima_adpcm, m_use_filter, m_use_fx, m_interp, m_mode>( \
+ src_ptr, \
+ dst_buff, &rstate);
-#define CALL_RESAMPLE_FILTER( m_depth, m_stereo, m_ima_adpcm, m_use_filter, m_use_fx, m_interp, m_mode)\
- if(m_use_filter) {\
- CALL_RESAMPLE_FX(m_depth,m_stereo, m_ima_adpcm,true,m_use_fx,m_interp, m_mode);\
- } else {\
- CALL_RESAMPLE_FX(m_depth,m_stereo, m_ima_adpcm,false,m_use_fx,m_interp, m_mode);\
- }\
-
-#define CALL_RESAMPLE_STEREO( m_depth, m_stereo, m_ima_adpcm, m_use_filter, m_use_fx, m_interp, m_mode)\
- if(m_stereo) {\
- CALL_RESAMPLE_FILTER(m_depth,true,m_ima_adpcm, m_use_filter,m_use_fx,m_interp, m_mode);\
- } else {\
- CALL_RESAMPLE_FILTER(m_depth,false,m_ima_adpcm,m_use_filter,m_use_fx,m_interp, m_mode);\
- }\
+#define CALL_RESAMPLE_INTERP(m_depth, m_stereo, m_ima_adpcm, m_use_filter, m_use_fx, m_interp, m_mode) \
+ if (m_interp == INTERPOLATION_RAW) { \
+ CALL_RESAMPLE_FUNC(m_depth, m_stereo, m_ima_adpcm, m_use_filter, m_use_fx, INTERPOLATION_RAW, m_mode); \
+ } else if (m_interp == INTERPOLATION_LINEAR) { \
+ CALL_RESAMPLE_FUNC(m_depth, m_stereo, m_ima_adpcm, m_use_filter, m_use_fx, INTERPOLATION_LINEAR, m_mode); \
+ } else if (m_interp == INTERPOLATION_CUBIC) { \
+ CALL_RESAMPLE_FUNC(m_depth, m_stereo, m_ima_adpcm, m_use_filter, m_use_fx, INTERPOLATION_CUBIC, m_mode); \
+ }
-#define CALL_RESAMPLE_MODE( m_depth, m_stereo, m_ima_adpcm, m_use_filter, m_use_fx, m_interp, m_mode)\
- if(m_mode==MIX_STEREO) {\
- CALL_RESAMPLE_STEREO(m_depth,m_stereo, m_ima_adpcm,m_use_filter,m_use_fx,m_interp, MIX_STEREO);\
- } else {\
- CALL_RESAMPLE_STEREO(m_depth,m_stereo, m_ima_adpcm,m_use_filter,m_use_fx,m_interp, MIX_QUAD);\
- }\
+#define CALL_RESAMPLE_FX(m_depth, m_stereo, m_ima_adpcm, m_use_filter, m_use_fx, m_interp, m_mode) \
+ if (m_use_fx) { \
+ CALL_RESAMPLE_INTERP(m_depth, m_stereo, m_ima_adpcm, m_use_filter, true, m_interp, m_mode); \
+ } else { \
+ CALL_RESAMPLE_INTERP(m_depth, m_stereo, m_ima_adpcm, m_use_filter, false, m_interp, m_mode); \
+ }
+#define CALL_RESAMPLE_FILTER(m_depth, m_stereo, m_ima_adpcm, m_use_filter, m_use_fx, m_interp, m_mode) \
+ if (m_use_filter) { \
+ CALL_RESAMPLE_FX(m_depth, m_stereo, m_ima_adpcm, true, m_use_fx, m_interp, m_mode); \
+ } else { \
+ CALL_RESAMPLE_FX(m_depth, m_stereo, m_ima_adpcm, false, m_use_fx, m_interp, m_mode); \
+ }
+#define CALL_RESAMPLE_STEREO(m_depth, m_stereo, m_ima_adpcm, m_use_filter, m_use_fx, m_interp, m_mode) \
+ if (m_stereo) { \
+ CALL_RESAMPLE_FILTER(m_depth, true, m_ima_adpcm, m_use_filter, m_use_fx, m_interp, m_mode); \
+ } else { \
+ CALL_RESAMPLE_FILTER(m_depth, false, m_ima_adpcm, m_use_filter, m_use_fx, m_interp, m_mode); \
+ }
+#define CALL_RESAMPLE_MODE(m_depth, m_stereo, m_ima_adpcm, m_use_filter, m_use_fx, m_interp, m_mode) \
+ if (m_mode == MIX_STEREO) { \
+ CALL_RESAMPLE_STEREO(m_depth, m_stereo, m_ima_adpcm, m_use_filter, m_use_fx, m_interp, MIX_STEREO); \
+ } else { \
+ CALL_RESAMPLE_STEREO(m_depth, m_stereo, m_ima_adpcm, m_use_filter, m_use_fx, m_interp, MIX_QUAD); \
+ }
- if (format==AS::SAMPLE_FORMAT_PCM8) {
+ if (format == AS::SAMPLE_FORMAT_PCM8) {
- int8_t *src_ptr = &((int8_t*)data)[(c.mix.offset >> MIX_FRAC_BITS)<<(is_stereo?1:0) ];
- CALL_RESAMPLE_MODE(int8_t,is_stereo,false,use_filter,use_fx,interpolation_type,mix_channels);
+ int8_t *src_ptr = &((int8_t *)data)[(c.mix.offset >> MIX_FRAC_BITS) << (is_stereo ? 1 : 0)];
+ CALL_RESAMPLE_MODE(int8_t, is_stereo, false, use_filter, use_fx, interpolation_type, mix_channels);
- } else if (format==AS::SAMPLE_FORMAT_PCM16) {
- int16_t *src_ptr = &((int16_t*)data)[(c.mix.offset >> MIX_FRAC_BITS)<<(is_stereo?1:0) ];
- CALL_RESAMPLE_MODE(int16_t,is_stereo,false,use_filter,use_fx,interpolation_type,mix_channels);
+ } else if (format == AS::SAMPLE_FORMAT_PCM16) {
+ int16_t *src_ptr = &((int16_t *)data)[(c.mix.offset >> MIX_FRAC_BITS) << (is_stereo ? 1 : 0)];
+ CALL_RESAMPLE_MODE(int16_t, is_stereo, false, use_filter, use_fx, interpolation_type, mix_channels);
- } else if (format==AS::SAMPLE_FORMAT_IMA_ADPCM) {
- for(int i=0;i<2;i++) {
- c.mix.ima_adpcm[i].window_ofs=c.mix.offset>>MIX_FRAC_BITS;
- c.mix.ima_adpcm[i].ptr=(const uint8_t*)data;
+ } else if (format == AS::SAMPLE_FORMAT_IMA_ADPCM) {
+ for (int i = 0; i < 2; i++) {
+ c.mix.ima_adpcm[i].window_ofs = c.mix.offset >> MIX_FRAC_BITS;
+ c.mix.ima_adpcm[i].ptr = (const uint8_t *)data;
}
- int8_t *src_ptr = NULL;
- CALL_RESAMPLE_MODE(int8_t,is_stereo,true,use_filter,use_fx,interpolation_type,mix_channels);
-
+ int8_t *src_ptr = NULL;
+ CALL_RESAMPLE_MODE(int8_t, is_stereo, true, use_filter, use_fx, interpolation_type, mix_channels);
}
- c.mix.offset+=rstate.pos;
- dst_buff+=target*mix_channels;
- rstate.reverb_buffer+=target*mix_channels;
+ c.mix.offset += rstate.pos;
+ dst_buff += target * mix_channels;
+ rstate.reverb_buffer += target * mix_channels;
}
- c.filter.old_coefs=c.filter.coefs;
+ c.filter.old_coefs = c.filter.coefs;
}
void AudioMixerSW::mix_chunk() {
ERR_FAIL_COND(mix_chunk_left);
- inside_mix=true;
+ inside_mix = true;
// emit tick in usecs
- for (int i=0;i<mix_chunk_size*mix_channels;i++) {
+ for (int i = 0; i < mix_chunk_size * mix_channels; i++) {
- mix_buffer[i]=0;
+ mix_buffer[i] = 0;
}
#ifndef NO_REVERB
- for(int i=0;i<max_reverbs;i++)
- reverb_state[i].used_in_chunk=false;
+ for (int i = 0; i < max_reverbs; i++)
+ reverb_state[i].used_in_chunk = false;
#endif
-
audio_mixer_chunk_call(mix_chunk_size);
- int ac=0;
- for (int i=0;i<MAX_CHANNELS;i++) {
+ int ac = 0;
+ for (int i = 0; i < MAX_CHANNELS; i++) {
if (!channels[i].active)
continue;
ac++;
/* process volume */
- Channel&c=channels[i];
+ Channel &c = channels[i];
#ifndef NO_REVERB
- bool has_reverb = c.reverb_send>CMP_EPSILON && fx_enabled;
+ bool has_reverb = c.reverb_send > CMP_EPSILON && fx_enabled;
if (has_reverb || c.had_prev_reverb) {
if (!reverb_state[c.reverb_room].used_in_chunk) {
//zero the room
int32_t *buff = reverb_state[c.reverb_room].buffer;
- int len = mix_chunk_size*mix_channels;
- for (int j=0;j<len;j++) {
+ int len = mix_chunk_size * mix_channels;
+ for (int j = 0; j < len; j++) {
- buff[j]=0; // buffer in use, clear it for appending
+ buff[j] = 0; // buffer in use, clear it for appending
}
- reverb_state[c.reverb_room].used_in_chunk=true;
+ reverb_state[c.reverb_room].used_in_chunk = true;
}
}
#else
bool has_reverb = false;
#endif
- bool has_chorus = c.chorus_send>CMP_EPSILON && fx_enabled;
-
+ bool has_chorus = c.chorus_send > CMP_EPSILON && fx_enabled;
mix_channel(c);
- c.had_prev_reverb=has_reverb;
- c.had_prev_chorus=has_chorus;
-
+ c.had_prev_reverb = has_reverb;
+ c.had_prev_chorus = has_chorus;
}
- //process reverb
+//process reverb
#ifndef NO_REVERB
if (fx_enabled) {
-
- for(int i=0;i<max_reverbs;i++) {
+ for (int i = 0; i < max_reverbs; i++) {
if (!reverb_state[i].enabled && !reverb_state[i].used_in_chunk)
continue; //this reverb is not in use
- int32_t *src=NULL;
+ int32_t *src = NULL;
if (reverb_state[i].used_in_chunk)
- src=reverb_state[i].buffer;
+ src = reverb_state[i].buffer;
else
- src=zero_buffer;
+ src = zero_buffer;
- bool in_use=false;
+ bool in_use = false;
- int passes=mix_channels/2;
+ int passes = mix_channels / 2;
- for(int j=0;j<passes;j++) {
+ for (int j = 0; j < passes; j++) {
- if (reverb_state[i].reverb[j].process((int*)&src[j*2],(int*)&mix_buffer[j*2],mix_chunk_size,passes))
- in_use=true;
+ if (reverb_state[i].reverb[j].process((int *)&src[j * 2], (int *)&mix_buffer[j * 2], mix_chunk_size, passes))
+ in_use = true;
}
if (in_use) {
- reverb_state[i].enabled=true;
- reverb_state[i].frames_idle=0;
+ reverb_state[i].enabled = true;
+ reverb_state[i].frames_idle = 0;
//copy data over
} else {
- reverb_state[i].frames_idle+=mix_chunk_size;
+ reverb_state[i].frames_idle += mix_chunk_size;
if (false) { // go idle because too many frames passed
//disable this reverb, as nothing important happened on it
- reverb_state[i].enabled=false;
- reverb_state[i].frames_idle=0;
+ reverb_state[i].enabled = false;
+ reverb_state[i].frames_idle = 0;
}
}
-
}
}
#endif
- mix_chunk_left=mix_chunk_size;
- inside_mix=false;
+ mix_chunk_left = mix_chunk_size;
+ inside_mix = false;
}
-int AudioMixerSW::mix(int32_t *p_buffer,int p_frames) {
-
- int todo=p_frames;
- int mixes=0;
+int AudioMixerSW::mix(int32_t *p_buffer, int p_frames) {
- while(todo) {
+ int todo = p_frames;
+ int mixes = 0;
+ while (todo) {
if (!mix_chunk_left) {
@@ -697,16 +663,16 @@ int AudioMixerSW::mix(int32_t *p_buffer,int p_frames) {
mixes++;
}
- int to_mix=MIN(mix_chunk_left,todo);
- int from=mix_chunk_size-mix_chunk_left;
+ int to_mix = MIN(mix_chunk_left, todo);
+ int from = mix_chunk_size - mix_chunk_left;
- for (int i=0;i<to_mix*2;i++) {
+ for (int i = 0; i < to_mix * 2; i++) {
- (*p_buffer++)=mix_buffer[from*2+i];
+ (*p_buffer++) = mix_buffer[from * 2 + i];
}
- mix_chunk_left-=to_mix;
- todo-=to_mix;
+ mix_chunk_left -= to_mix;
+ todo -= to_mix;
}
return mixes;
@@ -714,20 +680,20 @@ int AudioMixerSW::mix(int32_t *p_buffer,int p_frames) {
uint64_t AudioMixerSW::get_step_usecs() const {
- double mct = (1<<mix_chunk_bits)/double(mix_rate);
- return mct*1000000.0;
+ double mct = (1 << mix_chunk_bits) / double(mix_rate);
+ return mct * 1000000.0;
}
int AudioMixerSW::_get_channel(ChannelID p_channel) const {
- if (p_channel<0) {
+ if (p_channel < 0) {
return -1;
}
- int idx=p_channel%MAX_CHANNELS;
- int check=p_channel/MAX_CHANNELS;
- ERR_FAIL_INDEX_V(idx,MAX_CHANNELS,-1);
- if (channels[idx].check!=check) {
+ int idx = p_channel % MAX_CHANNELS;
+ int check = p_channel / MAX_CHANNELS;
+ ERR_FAIL_INDEX_V(idx, MAX_CHANNELS, -1);
+ if (channels[idx].check != check) {
return -1;
}
if (!channels[idx].active) {
@@ -739,130 +705,123 @@ int AudioMixerSW::_get_channel(ChannelID p_channel) const {
AudioMixer::ChannelID AudioMixerSW::channel_alloc(RID p_sample) {
- ERR_FAIL_COND_V( !sample_manager->is_sample(p_sample), INVALID_CHANNEL );
+ ERR_FAIL_COND_V(!sample_manager->is_sample(p_sample), INVALID_CHANNEL);
-
- int index=-1;
- for (int i=0;i<MAX_CHANNELS;i++) {
+ int index = -1;
+ for (int i = 0; i < MAX_CHANNELS; i++) {
if (!channels[i].active) {
- index=i;
+ index = i;
break;
}
}
- if (index==-1)
+ if (index == -1)
return INVALID_CHANNEL;
- Channel &c=channels[index];
+ Channel &c = channels[index];
// init variables
- c.sample=p_sample;
- c.vol=1;
- c.pan=0;
- c.depth=0;
- c.height=0;
- c.chorus_send=0;
- c.reverb_send=0;
- c.reverb_room=REVERB_HALL;
- c.positional=false;
- c.filter.type=FILTER_NONE;
- c.speed=sample_manager->sample_get_mix_rate(p_sample);
- c.active=true;
- c.check=channel_id_count++;
- c.first_mix=true;
+ c.sample = p_sample;
+ c.vol = 1;
+ c.pan = 0;
+ c.depth = 0;
+ c.height = 0;
+ c.chorus_send = 0;
+ c.reverb_send = 0;
+ c.reverb_room = REVERB_HALL;
+ c.positional = false;
+ c.filter.type = FILTER_NONE;
+ c.speed = sample_manager->sample_get_mix_rate(p_sample);
+ c.active = true;
+ c.check = channel_id_count++;
+ c.first_mix = true;
// init mix variables
- c.mix.offset=0;
- c.mix.increment=1;
+ c.mix.offset = 0;
+ c.mix.increment = 1;
//zero everything when this errors
- for(int i=0;i<4;i++) {
- c.mix.vol[i]=0;
- c.mix.reverb_vol[i]=0;
- c.mix.chorus_vol[i]=0;
+ for (int i = 0; i < 4; i++) {
+ c.mix.vol[i] = 0;
+ c.mix.reverb_vol[i] = 0;
+ c.mix.chorus_vol[i] = 0;
- c.mix.old_vol[i]=0;
- c.mix.old_reverb_vol[i]=0;
- c.mix.old_chorus_vol[i]=0;
+ c.mix.old_vol[i] = 0;
+ c.mix.old_reverb_vol[i] = 0;
+ c.mix.old_chorus_vol[i] = 0;
}
- c.had_prev_chorus=false;
- c.had_prev_reverb=false;
- c.had_prev_vol=false;
-
+ c.had_prev_chorus = false;
+ c.had_prev_reverb = false;
+ c.had_prev_vol = false;
- if (sample_manager->sample_get_format(c.sample)==AudioServer::SAMPLE_FORMAT_IMA_ADPCM) {
+ if (sample_manager->sample_get_format(c.sample) == AudioServer::SAMPLE_FORMAT_IMA_ADPCM) {
- for(int i=0;i<2;i++) {
- c.mix.ima_adpcm[i].step_index=0;
- c.mix.ima_adpcm[i].predictor=0;
- c.mix.ima_adpcm[i].loop_step_index=0;
- c.mix.ima_adpcm[i].loop_predictor=0;
- c.mix.ima_adpcm[i].last_nibble=-1;
- c.mix.ima_adpcm[i].loop_pos=0x7FFFFFFF;
- c.mix.ima_adpcm[i].window_ofs=0;
- c.mix.ima_adpcm[i].ptr=NULL;
+ for (int i = 0; i < 2; i++) {
+ c.mix.ima_adpcm[i].step_index = 0;
+ c.mix.ima_adpcm[i].predictor = 0;
+ c.mix.ima_adpcm[i].loop_step_index = 0;
+ c.mix.ima_adpcm[i].loop_predictor = 0;
+ c.mix.ima_adpcm[i].last_nibble = -1;
+ c.mix.ima_adpcm[i].loop_pos = 0x7FFFFFFF;
+ c.mix.ima_adpcm[i].window_ofs = 0;
+ c.mix.ima_adpcm[i].ptr = NULL;
}
}
- ChannelID ret_id = index+c.check*MAX_CHANNELS;
+ ChannelID ret_id = index + c.check * MAX_CHANNELS;
return ret_id;
-
}
void AudioMixerSW::channel_set_volume(ChannelID p_channel, float p_gain) {
- if (p_gain>3) // avoid gain going too high
- p_gain=3;
- if (p_gain<0)
- p_gain=0;
+ if (p_gain > 3) // avoid gain going too high
+ p_gain = 3;
+ if (p_gain < 0)
+ p_gain = 0;
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return;
Channel &c = channels[chan];
//Math::exp( p_db * 0.11512925464970228420089957273422 );
- c.vol=p_gain;
-
+ c.vol = p_gain;
}
-void AudioMixerSW::channel_set_pan(ChannelID p_channel, float p_pan, float p_depth,float p_height) {
+void AudioMixerSW::channel_set_pan(ChannelID p_channel, float p_pan, float p_depth, float p_height) {
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return;
Channel &c = channels[chan];
- c.pan=p_pan;
- c.depth=p_depth;
- c.height=p_height;
-
+ c.pan = p_pan;
+ c.depth = p_depth;
+ c.height = p_height;
}
void AudioMixerSW::channel_set_filter(ChannelID p_channel, FilterType p_type, float p_cutoff, float p_resonance, float p_gain) {
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return;
Channel &c = channels[chan];
- if (c.filter.type==p_type && c.filter.cutoff==p_cutoff && c.filter.resonance==p_resonance && c.filter.gain==p_gain)
+ if (c.filter.type == p_type && c.filter.cutoff == p_cutoff && c.filter.resonance == p_resonance && c.filter.gain == p_gain)
return; //bye
+ bool type_changed = p_type != c.filter.type;
- bool type_changed = p_type!=c.filter.type;
-
- c.filter.type=p_type;
- c.filter.cutoff=p_cutoff;
- c.filter.resonance=p_resonance;
- c.filter.gain=p_gain;
-
+ c.filter.type = p_type;
+ c.filter.cutoff = p_cutoff;
+ c.filter.resonance = p_resonance;
+ c.filter.gain = p_gain;
AudioFilterSW filter;
- switch(p_type) {
+ switch (p_type) {
case FILTER_NONE: {
return; //do nothing else
@@ -903,77 +862,71 @@ void AudioMixerSW::channel_set_filter(ChannelID p_channel, FilterType p_type, fl
filter.prepare_coefficients(&coefs);
if (!type_changed)
- c.filter.old_coefs=c.filter.coefs;
-
- c.filter.coefs.b0=coefs.b0;
- c.filter.coefs.b1=coefs.b1;
- c.filter.coefs.b2=coefs.b2;
- c.filter.coefs.a1=coefs.a1;
- c.filter.coefs.a2=coefs.a2;
+ c.filter.old_coefs = c.filter.coefs;
+ c.filter.coefs.b0 = coefs.b0;
+ c.filter.coefs.b1 = coefs.b1;
+ c.filter.coefs.b2 = coefs.b2;
+ c.filter.coefs.a1 = coefs.a1;
+ c.filter.coefs.a2 = coefs.a2;
if (type_changed) {
//type changed reset filter
- c.filter.old_coefs=c.filter.coefs;
- c.mix.filter_l.ha[0]=0;
- c.mix.filter_l.ha[1]=0;
- c.mix.filter_l.hb[0]=0;
- c.mix.filter_l.hb[1]=0;
- c.mix.filter_r.ha[0]=0;
- c.mix.filter_r.ha[1]=0;
- c.mix.filter_r.hb[0]=0;
- c.mix.filter_r.hb[1]=0;
+ c.filter.old_coefs = c.filter.coefs;
+ c.mix.filter_l.ha[0] = 0;
+ c.mix.filter_l.ha[1] = 0;
+ c.mix.filter_l.hb[0] = 0;
+ c.mix.filter_l.hb[1] = 0;
+ c.mix.filter_r.ha[0] = 0;
+ c.mix.filter_r.ha[1] = 0;
+ c.mix.filter_r.hb[0] = 0;
+ c.mix.filter_r.hb[1] = 0;
}
-
-
}
-void AudioMixerSW::channel_set_chorus(ChannelID p_channel, float p_chorus ) {
+void AudioMixerSW::channel_set_chorus(ChannelID p_channel, float p_chorus) {
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return;
Channel &c = channels[chan];
- c.chorus_send=p_chorus;
-
+ c.chorus_send = p_chorus;
}
void AudioMixerSW::channel_set_reverb(ChannelID p_channel, ReverbRoomType p_room_type, float p_reverb) {
- ERR_FAIL_INDEX(p_room_type,MAX_REVERBS);
+ ERR_FAIL_INDEX(p_room_type, MAX_REVERBS);
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return;
Channel &c = channels[chan];
- c.reverb_room=p_room_type;
- c.reverb_send=p_reverb;
-
+ c.reverb_room = p_room_type;
+ c.reverb_send = p_reverb;
}
void AudioMixerSW::channel_set_mix_rate(ChannelID p_channel, int p_mix_rate) {
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return;
Channel &c = channels[chan];
- c.speed=p_mix_rate;
-
+ c.speed = p_mix_rate;
}
void AudioMixerSW::channel_set_positional(ChannelID p_channel, bool p_positional) {
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return;
Channel &c = channels[chan];
- c.positional=p_positional;
+ c.positional = p_positional;
}
float AudioMixerSW::channel_get_volume(ChannelID p_channel) const {
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return 0;
const Channel &c = channels[chan];
@@ -984,7 +937,7 @@ float AudioMixerSW::channel_get_volume(ChannelID p_channel) const {
float AudioMixerSW::channel_get_pan(ChannelID p_channel) const {
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return 0;
const Channel &c = channels[chan];
@@ -993,7 +946,7 @@ float AudioMixerSW::channel_get_pan(ChannelID p_channel) const {
float AudioMixerSW::channel_get_pan_depth(ChannelID p_channel) const {
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return 0;
const Channel &c = channels[chan];
@@ -1002,17 +955,16 @@ float AudioMixerSW::channel_get_pan_depth(ChannelID p_channel) const {
float AudioMixerSW::channel_get_pan_height(ChannelID p_channel) const {
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return 0;
const Channel &c = channels[chan];
return c.height;
-
}
AudioMixer::FilterType AudioMixerSW::channel_get_filter_type(ChannelID p_channel) const {
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return FILTER_NONE;
const Channel &c = channels[chan];
@@ -1020,61 +972,55 @@ AudioMixer::FilterType AudioMixerSW::channel_get_filter_type(ChannelID p_channel
}
float AudioMixerSW::channel_get_filter_cutoff(ChannelID p_channel) const {
-
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return 0;
const Channel &c = channels[chan];
return c.filter.cutoff;
-
}
float AudioMixerSW::channel_get_filter_resonance(ChannelID p_channel) const {
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return 0;
const Channel &c = channels[chan];
return c.filter.resonance;
-
}
float AudioMixerSW::channel_get_filter_gain(ChannelID p_channel) const {
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return 0;
const Channel &c = channels[chan];
return c.filter.gain;
}
-
float AudioMixerSW::channel_get_chorus(ChannelID p_channel) const {
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return 0;
const Channel &c = channels[chan];
return c.chorus_send;
-
}
AudioMixer::ReverbRoomType AudioMixerSW::channel_get_reverb_type(ChannelID p_channel) const {
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return REVERB_HALL;
const Channel &c = channels[chan];
return c.reverb_room;
-
}
float AudioMixerSW::channel_get_reverb(ChannelID p_channel) const {
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return 0;
const Channel &c = channels[chan];
@@ -1084,7 +1030,7 @@ float AudioMixerSW::channel_get_reverb(ChannelID p_channel) const {
int AudioMixerSW::channel_get_mix_rate(ChannelID p_channel) const {
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return 0;
const Channel &c = channels[chan];
@@ -1093,7 +1039,7 @@ int AudioMixerSW::channel_get_mix_rate(ChannelID p_channel) const {
bool AudioMixerSW::channel_is_positional(ChannelID p_channel) const {
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return false;
const Channel &c = channels[chan];
@@ -1103,106 +1049,100 @@ bool AudioMixerSW::channel_is_positional(ChannelID p_channel) const {
bool AudioMixerSW::channel_is_valid(ChannelID p_channel) const {
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return false;
return channels[chan].active;
}
-
void AudioMixerSW::channel_free(ChannelID p_channel) {
int chan = _get_channel(p_channel);
- if (chan<0 || chan >=MAX_CHANNELS)
+ if (chan < 0 || chan >= MAX_CHANNELS)
return;
- Channel &c=channels[chan];
+ Channel &c = channels[chan];
if (!c.active)
return;
- bool has_vol=false;
+ bool has_vol = false;
- for(int i=0;i<mix_channels;i++) {
+ for (int i = 0; i < mix_channels; i++) {
if (c.mix.vol[i])
- has_vol=true;
+ has_vol = true;
if (c.mix.reverb_vol[i])
- has_vol=true;
+ has_vol = true;
if (c.mix.chorus_vol[i])
- has_vol=true;
+ has_vol = true;
}
if (c.active && has_vol && inside_mix) {
// drive voice to zero, and run a chunk, the VRAMP will fade it good
- c.vol=0;
- c.reverb_send=0;
- c.chorus_send=0;
+ c.vol = 0;
+ c.reverb_send = 0;
+ c.chorus_send = 0;
mix_channel(c);
}
/* @TODO RAMP DOWN ON STOP */
- c.active=false;
+ c.active = false;
}
-
-
-AudioMixerSW::AudioMixerSW(SampleManagerSW *p_sample_manager,int p_desired_latency_ms,int p_mix_rate,MixChannels p_mix_channels,bool p_use_fx,InterpolationType p_interp,MixStepCallback p_step_callback,void *p_step_udata) {
+AudioMixerSW::AudioMixerSW(SampleManagerSW *p_sample_manager, int p_desired_latency_ms, int p_mix_rate, MixChannels p_mix_channels, bool p_use_fx, InterpolationType p_interp, MixStepCallback p_step_callback, void *p_step_udata) {
if (OS::get_singleton()->is_stdout_verbose()) {
print_line("AudioServerSW Params: ");
- print_line(" -mix chans: "+itos(p_mix_channels));
- print_line(" -mix rate: "+itos(p_mix_rate));
- print_line(" -latency: "+itos(p_desired_latency_ms));
- print_line(" -fx: "+itos(p_use_fx));
- print_line(" -interp: "+itos(p_interp));
+ print_line(" -mix chans: " + itos(p_mix_channels));
+ print_line(" -mix rate: " + itos(p_mix_rate));
+ print_line(" -latency: " + itos(p_desired_latency_ms));
+ print_line(" -fx: " + itos(p_use_fx));
+ print_line(" -interp: " + itos(p_interp));
}
- sample_manager=p_sample_manager;
- mix_channels=p_mix_channels;
- mix_rate=p_mix_rate;
- step_callback=p_step_callback;
- step_udata=p_step_udata;
-
+ sample_manager = p_sample_manager;
+ mix_channels = p_mix_channels;
+ mix_rate = p_mix_rate;
+ step_callback = p_step_callback;
+ step_udata = p_step_udata;
- mix_chunk_bits=nearest_shift( p_desired_latency_ms * p_mix_rate / 1000 );
+ mix_chunk_bits = nearest_shift(p_desired_latency_ms * p_mix_rate / 1000);
- mix_chunk_size=(1<<mix_chunk_bits);
- mix_chunk_mask=mix_chunk_size-1;
- mix_buffer = memnew_arr(int32_t,mix_chunk_size*mix_channels);
+ mix_chunk_size = (1 << mix_chunk_bits);
+ mix_chunk_mask = mix_chunk_size - 1;
+ mix_buffer = memnew_arr(int32_t, mix_chunk_size * mix_channels);
#ifndef NO_REVERB
- zero_buffer = memnew_arr(int32_t,mix_chunk_size*mix_channels);
- for(int i=0;i<mix_chunk_size*mix_channels;i++)
- zero_buffer[i]=0; //zero buffer is zero...
+ zero_buffer = memnew_arr(int32_t, mix_chunk_size * mix_channels);
+ for (int i = 0; i < mix_chunk_size * mix_channels; i++)
+ zero_buffer[i] = 0; //zero buffer is zero...
- max_reverbs=MAX_REVERBS;
- int reverberators=mix_channels/2;
+ max_reverbs = MAX_REVERBS;
+ int reverberators = mix_channels / 2;
- reverb_state = memnew_arr(ReverbState,max_reverbs);
- for(int i=0;i<max_reverbs;i++) {
- reverb_state[i].enabled=false;
- reverb_state[i].reverb = memnew_arr(ReverbSW,reverberators);
- reverb_state[i].buffer = memnew_arr(int32_t,mix_chunk_size*mix_channels);
- reverb_state[i].frames_idle=0;
- for(int j=0;j<reverberators;j++) {
- static ReverbSW::ReverbMode modes[MAX_REVERBS]={ReverbSW::REVERB_MODE_STUDIO_SMALL,ReverbSW::REVERB_MODE_STUDIO_MEDIUM,ReverbSW::REVERB_MODE_STUDIO_LARGE,ReverbSW::REVERB_MODE_HALL};
+ reverb_state = memnew_arr(ReverbState, max_reverbs);
+ for (int i = 0; i < max_reverbs; i++) {
+ reverb_state[i].enabled = false;
+ reverb_state[i].reverb = memnew_arr(ReverbSW, reverberators);
+ reverb_state[i].buffer = memnew_arr(int32_t, mix_chunk_size * mix_channels);
+ reverb_state[i].frames_idle = 0;
+ for (int j = 0; j < reverberators; j++) {
+ static ReverbSW::ReverbMode modes[MAX_REVERBS] = { ReverbSW::REVERB_MODE_STUDIO_SMALL, ReverbSW::REVERB_MODE_STUDIO_MEDIUM, ReverbSW::REVERB_MODE_STUDIO_LARGE, ReverbSW::REVERB_MODE_HALL };
reverb_state[i].reverb[j].set_mix_rate(p_mix_rate);
reverb_state[i].reverb[j].set_mode(modes[i]);
}
-
}
- fx_enabled=p_use_fx;
+ fx_enabled = p_use_fx;
#else
- fx_enabled=false;
+ fx_enabled = false;
#endif
- mix_chunk_left=0;
-
- interpolation_type=p_interp;
- channel_id_count=1;
- inside_mix=false;
- channel_nrg=1.0;
+ mix_chunk_left = 0;
+ interpolation_type = p_interp;
+ channel_id_count = 1;
+ inside_mix = false;
+ channel_nrg = 1.0;
}
void AudioMixerSW::set_mixer_volume(float p_volume) {
- channel_nrg=p_volume;
+ channel_nrg = p_volume;
}
AudioMixerSW::~AudioMixerSW() {
@@ -1211,12 +1151,10 @@ AudioMixerSW::~AudioMixerSW() {
#ifndef NO_REVERB
memdelete_arr(zero_buffer);
- for(int i=0;i<max_reverbs;i++) {
+ for (int i = 0; i < max_reverbs; i++) {
memdelete_arr(reverb_state[i].reverb);
memdelete_arr(reverb_state[i].buffer);
}
memdelete_arr(reverb_state);
#endif
-
-
}
diff --git a/servers/audio/audio_mixer_sw.h b/servers/audio/audio_mixer_sw.h
index 952cad4cf..a02133199 100644
--- a/servers/audio/audio_mixer_sw.h
+++ b/servers/audio/audio_mixer_sw.h
@@ -29,14 +29,13 @@
#ifndef AUDIO_MIXER_SW_H
#define AUDIO_MIXER_SW_H
-#include "servers/audio_server.h"
-#include "servers/audio/sample_manager_sw.h"
#include "servers/audio/audio_filter_sw.h"
#include "servers/audio/reverb_sw.h"
+#include "servers/audio/sample_manager_sw.h"
+#include "servers/audio_server.h"
class AudioMixerSW : public AudioMixer {
public:
-
enum InterpolationType {
INTERPOLATION_RAW,
@@ -46,33 +45,32 @@ public:
enum MixChannels {
- MIX_STEREO=2,
- MIX_QUAD=4
+ MIX_STEREO = 2,
+ MIX_QUAD = 4
};
- typedef void (*MixStepCallback)(void*);
+ typedef void (*MixStepCallback)(void *);
private:
SampleManagerSW *sample_manager;
enum {
- MAX_CHANNELS=64,
+ MAX_CHANNELS = 64,
// fixed point defs
- MIX_FRAC_BITS=13,
- MIX_FRAC_LEN=(1<<MIX_FRAC_BITS),
- MIX_FRAC_MASK=MIX_FRAC_LEN-1,
- MIX_VOL_FRAC_BITS=12,
- MIX_VOLRAMP_FRAC_BITS=16,
- MIX_VOLRAMP_FRAC_LEN=(1<<MIX_VOLRAMP_FRAC_BITS),
- MIX_VOLRAMP_FRAC_MASK=MIX_VOLRAMP_FRAC_LEN-1,
- MIX_FILTER_FRAC_BITS=16,
- MIX_FILTER_RAMP_FRAC_BITS=8,
- MIX_VOL_MOVE_TO_24=4
+ MIX_FRAC_BITS = 13,
+ MIX_FRAC_LEN = (1 << MIX_FRAC_BITS),
+ MIX_FRAC_MASK = MIX_FRAC_LEN - 1,
+ MIX_VOL_FRAC_BITS = 12,
+ MIX_VOLRAMP_FRAC_BITS = 16,
+ MIX_VOLRAMP_FRAC_LEN = (1 << MIX_VOLRAMP_FRAC_BITS),
+ MIX_VOLRAMP_FRAC_MASK = MIX_VOLRAMP_FRAC_LEN - 1,
+ MIX_FILTER_FRAC_BITS = 16,
+ MIX_FILTER_RAMP_FRAC_BITS = 8,
+ MIX_VOL_MOVE_TO_24 = 4
};
-
struct Channel {
RID sample;
@@ -88,10 +86,9 @@ private:
int32_t old_reverb_vol[4];
int32_t old_chorus_vol[4];
-
struct Filter { //history (stereo)
- float ha[2],hb[2];
- } filter_l,filter_r;
+ float ha[2], hb[2];
+ } filter_l, filter_r;
struct IMA_ADPCM_State {
@@ -135,14 +132,23 @@ private:
struct Coefs {
- float a1,a2,b0,b1,b2; // fixed point coefficients
- } coefs,old_coefs;
+ float a1, a2, b0, b1, b2; // fixed point coefficients
+ } coefs, old_coefs;
} filter;
bool first_mix;
bool active;
- Channel() { active=false; check=-1; first_mix=false; filter.dirty=true; filter.type=FILTER_NONE; filter.cutoff=8000; filter.resonance=0; filter.gain=0; }
+ Channel() {
+ active = false;
+ check = -1;
+ first_mix = false;
+ filter.dirty = true;
+ filter.type = FILTER_NONE;
+ filter.cutoff = 8000;
+ filter.resonance = 0;
+ filter.gain = 0;
+ }
};
Channel channels[MAX_CHANNELS];
@@ -163,10 +169,8 @@ private:
uint32_t amount;
int32_t increment;
-
int32_t pos;
-
int32_t vol[4];
int32_t reverb_vol[4];
int32_t chorus_vol[4];
@@ -175,8 +179,6 @@ private:
int32_t reverb_vol_inc[4];
int32_t chorus_vol_inc[4];
-
-
Channel::Mix::Filter *filter_l;
Channel::Mix::Filter *filter_r;
Channel::Filter::Coefs coefs;
@@ -187,14 +189,12 @@ private:
int32_t *reverb_buffer;
};
-
-
- template<class Depth,bool is_stereo,bool use_filter,bool is_ima_adpcm,bool use_fx,InterpolationType type,MixChannels>
- _FORCE_INLINE_ void do_resample(const Depth* p_src, int32_t *p_dst, ResamplerState *p_state);
+ template <class Depth, bool is_stereo, bool use_filter, bool is_ima_adpcm, bool use_fx, InterpolationType type, MixChannels>
+ _FORCE_INLINE_ void do_resample(const Depth *p_src, int32_t *p_dst, ResamplerState *p_state);
MixChannels mix_channels;
- void mix_channel(Channel& p_channel);
+ void mix_channel(Channel &p_channel);
int mix_chunk_left;
void mix_chunk();
@@ -213,21 +213,22 @@ private:
ReverbSW *reverb;
int frames_idle;
int32_t *buffer; //reverb is sent here
- ReverbState() { enabled=false; frames_idle=0; used_in_chunk=false; }
+ ReverbState() {
+ enabled = false;
+ frames_idle = 0;
+ used_in_chunk = false;
+ }
};
ReverbState *reverb_state;
-
public:
-
-
virtual ChannelID channel_alloc(RID p_sample);
virtual void channel_set_volume(ChannelID p_channel, float p_gain);
- virtual void channel_set_pan(ChannelID p_channel, float p_pan, float p_depth=0,float height=0); //pan and depth go from -1 to 1
- virtual void channel_set_filter(ChannelID p_channel, FilterType p_type, float p_cutoff, float p_resonance, float p_gain=1.0);
- virtual void channel_set_chorus(ChannelID p_channel, float p_chorus );
+ virtual void channel_set_pan(ChannelID p_channel, float p_pan, float p_depth = 0, float height = 0); //pan and depth go from -1 to 1
+ virtual void channel_set_filter(ChannelID p_channel, FilterType p_type, float p_cutoff, float p_resonance, float p_gain = 1.0);
+ virtual void channel_set_chorus(ChannelID p_channel, float p_chorus);
virtual void channel_set_reverb(ChannelID p_channel, ReverbRoomType p_room_type, float p_reverb);
virtual void channel_set_mix_rate(ChannelID p_channel, int p_mix_rate);
virtual void channel_set_positional(ChannelID p_channel, bool p_positional);
@@ -252,12 +253,12 @@ public:
virtual void channel_free(ChannelID p_channel);
- int mix(int32_t *p_buffer,int p_frames); //return amount of mixsteps
+ int mix(int32_t *p_buffer, int p_frames); //return amount of mixsteps
uint64_t get_step_usecs() const;
virtual void set_mixer_volume(float p_volume);
- AudioMixerSW(SampleManagerSW *p_sample_manager,int p_desired_latency_ms,int p_mix_rate,MixChannels p_mix_channels,bool p_use_fx=true,InterpolationType p_interp=INTERPOLATION_LINEAR,MixStepCallback p_step_callback=NULL,void *p_callback_udata=NULL);
+ AudioMixerSW(SampleManagerSW *p_sample_manager, int p_desired_latency_ms, int p_mix_rate, MixChannels p_mix_channels, bool p_use_fx = true, InterpolationType p_interp = INTERPOLATION_LINEAR, MixStepCallback p_step_callback = NULL, void *p_callback_udata = NULL);
~AudioMixerSW();
};
diff --git a/servers/audio/audio_rb_resampler.cpp b/servers/audio/audio_rb_resampler.cpp
index 28f0007b5..bf10f813a 100644
--- a/servers/audio/audio_rb_resampler.cpp
+++ b/servers/audio/audio_rb_resampler.cpp
@@ -28,7 +28,6 @@
/*************************************************************************/
#include "audio_rb_resampler.h"
-
int AudioRBResampler::get_channel_count() const {
if (!rb)
@@ -37,153 +36,142 @@ int AudioRBResampler::get_channel_count() const {
return channels;
}
+template <int C>
+uint32_t AudioRBResampler::_resample(int32_t *p_dest, int p_todo, int32_t p_increment) {
-template<int C>
-uint32_t AudioRBResampler::_resample(int32_t *p_dest,int p_todo,int32_t p_increment) {
-
- uint32_t read=offset&MIX_FRAC_MASK;
+ uint32_t read = offset & MIX_FRAC_MASK;
- for (int i=0;i<p_todo;i++) {
+ for (int i = 0; i < p_todo; i++) {
- offset = (offset + p_increment)&(((1<<(rb_bits+MIX_FRAC_BITS))-1));
- read+=p_increment;
+ offset = (offset + p_increment) & (((1 << (rb_bits + MIX_FRAC_BITS)) - 1));
+ read += p_increment;
uint32_t pos = offset >> MIX_FRAC_BITS;
uint32_t frac = offset & MIX_FRAC_MASK;
#ifndef FAST_AUDIO
- ERR_FAIL_COND_V(pos>=rb_len,0);
+ ERR_FAIL_COND_V(pos >= rb_len, 0);
#endif
- uint32_t pos_next = (pos+1)&rb_mask;
+ uint32_t pos_next = (pos + 1) & rb_mask;
//printf("rb pos %i\n",pos);
// since this is a template with a known compile time value (C), conditionals go away when compiling.
- if (C==1) {
+ if (C == 1) {
int32_t v0 = rb[pos];
- int32_t v0n=rb[pos_next];
+ int32_t v0n = rb[pos_next];
#ifndef FAST_AUDIO
- v0+=(v0n-v0)*(int32_t)frac >> MIX_FRAC_BITS;
+ v0 += (v0n - v0) * (int32_t)frac >> MIX_FRAC_BITS;
#endif
- v0<<=16;
- p_dest[i]=v0;
-
+ v0 <<= 16;
+ p_dest[i] = v0;
}
- if (C==2) {
+ if (C == 2) {
- int32_t v0 = rb[(pos<<1)+0];
- int32_t v1 = rb[(pos<<1)+1];
- int32_t v0n=rb[(pos_next<<1)+0];
- int32_t v1n=rb[(pos_next<<1)+1];
+ int32_t v0 = rb[(pos << 1) + 0];
+ int32_t v1 = rb[(pos << 1) + 1];
+ int32_t v0n = rb[(pos_next << 1) + 0];
+ int32_t v1n = rb[(pos_next << 1) + 1];
#ifndef FAST_AUDIO
- v0+=(v0n-v0)*(int32_t)frac >> MIX_FRAC_BITS;
- v1+=(v1n-v1)*(int32_t)frac >> MIX_FRAC_BITS;
+ v0 += (v0n - v0) * (int32_t)frac >> MIX_FRAC_BITS;
+ v1 += (v1n - v1) * (int32_t)frac >> MIX_FRAC_BITS;
#endif
- v0<<=16;
- v1<<=16;
- p_dest[(i<<1)+0]=v0;
- p_dest[(i<<1)+1]=v1;
-
+ v0 <<= 16;
+ v1 <<= 16;
+ p_dest[(i << 1) + 0] = v0;
+ p_dest[(i << 1) + 1] = v1;
}
- if (C==4) {
+ if (C == 4) {
- int32_t v0 = rb[(pos<<2)+0];
- int32_t v1 = rb[(pos<<2)+1];
- int32_t v2 = rb[(pos<<2)+2];
- int32_t v3 = rb[(pos<<2)+3];
- int32_t v0n = rb[(pos_next<<2)+0];
- int32_t v1n=rb[(pos_next<<2)+1];
- int32_t v2n=rb[(pos_next<<2)+2];
- int32_t v3n=rb[(pos_next<<2)+3];
+ int32_t v0 = rb[(pos << 2) + 0];
+ int32_t v1 = rb[(pos << 2) + 1];
+ int32_t v2 = rb[(pos << 2) + 2];
+ int32_t v3 = rb[(pos << 2) + 3];
+ int32_t v0n = rb[(pos_next << 2) + 0];
+ int32_t v1n = rb[(pos_next << 2) + 1];
+ int32_t v2n = rb[(pos_next << 2) + 2];
+ int32_t v3n = rb[(pos_next << 2) + 3];
#ifndef FAST_AUDIO
- v0+=(v0n-v0)*(int32_t)frac >> MIX_FRAC_BITS;
- v1+=(v1n-v1)*(int32_t)frac >> MIX_FRAC_BITS;
- v2+=(v2n-v2)*(int32_t)frac >> MIX_FRAC_BITS;
- v3+=(v3n-v3)*(int32_t)frac >> MIX_FRAC_BITS;
+ v0 += (v0n - v0) * (int32_t)frac >> MIX_FRAC_BITS;
+ v1 += (v1n - v1) * (int32_t)frac >> MIX_FRAC_BITS;
+ v2 += (v2n - v2) * (int32_t)frac >> MIX_FRAC_BITS;
+ v3 += (v3n - v3) * (int32_t)frac >> MIX_FRAC_BITS;
#endif
- v0<<=16;
- v1<<=16;
- v2<<=16;
- v3<<=16;
- p_dest[(i<<2)+0]=v0;
- p_dest[(i<<2)+1]=v1;
- p_dest[(i<<2)+2]=v2;
- p_dest[(i<<2)+3]=v3;
-
+ v0 <<= 16;
+ v1 <<= 16;
+ v2 <<= 16;
+ v3 <<= 16;
+ p_dest[(i << 2) + 0] = v0;
+ p_dest[(i << 2) + 1] = v1;
+ p_dest[(i << 2) + 2] = v2;
+ p_dest[(i << 2) + 3] = v3;
}
- if (C==6) {
+ if (C == 6) {
- int32_t v0 = rb[(pos*6)+0];
- int32_t v1 = rb[(pos*6)+1];
- int32_t v2 = rb[(pos*6)+2];
- int32_t v3 = rb[(pos*6)+3];
- int32_t v4 = rb[(pos*6)+4];
- int32_t v5 = rb[(pos*6)+5];
- int32_t v0n = rb[(pos_next*6)+0];
- int32_t v1n=rb[(pos_next*6)+1];
- int32_t v2n=rb[(pos_next*6)+2];
- int32_t v3n=rb[(pos_next*6)+3];
- int32_t v4n=rb[(pos_next*6)+4];
- int32_t v5n=rb[(pos_next*6)+5];
+ int32_t v0 = rb[(pos * 6) + 0];
+ int32_t v1 = rb[(pos * 6) + 1];
+ int32_t v2 = rb[(pos * 6) + 2];
+ int32_t v3 = rb[(pos * 6) + 3];
+ int32_t v4 = rb[(pos * 6) + 4];
+ int32_t v5 = rb[(pos * 6) + 5];
+ int32_t v0n = rb[(pos_next * 6) + 0];
+ int32_t v1n = rb[(pos_next * 6) + 1];
+ int32_t v2n = rb[(pos_next * 6) + 2];
+ int32_t v3n = rb[(pos_next * 6) + 3];
+ int32_t v4n = rb[(pos_next * 6) + 4];
+ int32_t v5n = rb[(pos_next * 6) + 5];
#ifndef FAST_AUDIO
- v0+=(v0n-v0)*(int32_t)frac >> MIX_FRAC_BITS;
- v1+=(v1n-v1)*(int32_t)frac >> MIX_FRAC_BITS;
- v2+=(v2n-v2)*(int32_t)frac >> MIX_FRAC_BITS;
- v3+=(v3n-v3)*(int32_t)frac >> MIX_FRAC_BITS;
- v4+=(v4n-v4)*(int32_t)frac >> MIX_FRAC_BITS;
- v5+=(v5n-v5)*(int32_t)frac >> MIX_FRAC_BITS;
+ v0 += (v0n - v0) * (int32_t)frac >> MIX_FRAC_BITS;
+ v1 += (v1n - v1) * (int32_t)frac >> MIX_FRAC_BITS;
+ v2 += (v2n - v2) * (int32_t)frac >> MIX_FRAC_BITS;
+ v3 += (v3n - v3) * (int32_t)frac >> MIX_FRAC_BITS;
+ v4 += (v4n - v4) * (int32_t)frac >> MIX_FRAC_BITS;
+ v5 += (v5n - v5) * (int32_t)frac >> MIX_FRAC_BITS;
#endif
- v0<<=16;
- v1<<=16;
- v2<<=16;
- v3<<=16;
- v4<<=16;
- v5<<=16;
- p_dest[(i*6)+0]=v0;
- p_dest[(i*6)+1]=v1;
- p_dest[(i*6)+2]=v2;
- p_dest[(i*6)+3]=v3;
- p_dest[(i*6)+4]=v4;
- p_dest[(i*6)+5]=v5;
-
+ v0 <<= 16;
+ v1 <<= 16;
+ v2 <<= 16;
+ v3 <<= 16;
+ v4 <<= 16;
+ v5 <<= 16;
+ p_dest[(i * 6) + 0] = v0;
+ p_dest[(i * 6) + 1] = v1;
+ p_dest[(i * 6) + 2] = v2;
+ p_dest[(i * 6) + 3] = v3;
+ p_dest[(i * 6) + 4] = v4;
+ p_dest[(i * 6) + 5] = v5;
}
-
-
}
-
- return read>>MIX_FRAC_BITS;//rb_read_pos=offset>>MIX_FRAC_BITS;
-
+ return read >> MIX_FRAC_BITS; //rb_read_pos=offset>>MIX_FRAC_BITS;
}
-
bool AudioRBResampler::mix(int32_t *p_dest, int p_frames) {
-
if (!rb)
return false;
- int write_pos_cache=rb_write_pos;
+ int write_pos_cache = rb_write_pos;
- int32_t increment=(src_mix_rate*MIX_FRAC_LEN)/target_mix_rate;
+ int32_t increment = (src_mix_rate * MIX_FRAC_LEN) / target_mix_rate;
int rb_todo;
- if (write_pos_cache==rb_read_pos) {
+ if (write_pos_cache == rb_read_pos) {
return false; //out of buffer
- } else if (rb_read_pos<write_pos_cache) {
+ } else if (rb_read_pos < write_pos_cache) {
- rb_todo=write_pos_cache-rb_read_pos; //-1?
+ rb_todo = write_pos_cache - rb_read_pos; //-1?
} else {
- rb_todo=(rb_len-rb_read_pos)+write_pos_cache; //-1?
+ rb_todo = (rb_len - rb_read_pos) + write_pos_cache; //-1?
}
- int todo = MIN( ((int64_t(rb_todo)<<MIX_FRAC_BITS)/increment)+1, p_frames );
+ int todo = MIN(((int64_t(rb_todo) << MIX_FRAC_BITS) / increment) + 1, p_frames);
#if 0
if (int(src_mix_rate)==target_mix_rate) {
@@ -224,118 +212,104 @@ bool AudioRBResampler::mix(int32_t *p_dest, int p_frames) {
#endif
{
- uint32_t read=0;
- switch(channels) {
- case 1: read=_resample<1>(p_dest,todo,increment); break;
- case 2: read=_resample<2>(p_dest,todo,increment); break;
- case 4: read=_resample<4>(p_dest,todo,increment); break;
- case 6: read=_resample<6>(p_dest,todo,increment); break;
+ uint32_t read = 0;
+ switch (channels) {
+ case 1: read = _resample<1>(p_dest, todo, increment); break;
+ case 2: read = _resample<2>(p_dest, todo, increment); break;
+ case 4: read = _resample<4>(p_dest, todo, increment); break;
+ case 6: read = _resample<6>(p_dest, todo, increment); break;
}
#if 1
//end of stream, fadeout
- int remaining = p_frames-todo;
- if (remaining && todo>0) {
+ int remaining = p_frames - todo;
+ if (remaining && todo > 0) {
//print_line("fadeout");
- for(int c=0;c<channels;c++) {
+ for (int c = 0; c < channels; c++) {
- for(int i=0;i<todo;i++) {
+ for (int i = 0; i < todo; i++) {
- int32_t samp = p_dest[i*channels+c]>>8;
- uint32_t mul = (todo-i) * 256 /todo;
+ int32_t samp = p_dest[i * channels + c] >> 8;
+ uint32_t mul = (todo - i) * 256 / todo;
//print_line("mul: "+itos(i)+" "+itos(mul));
- p_dest[i*channels+c]=samp*mul;
+ p_dest[i * channels + c] = samp * mul;
}
-
}
-
}
#else
- int remaining = p_frames-todo;
- if (remaining && todo>0) {
-
+ int remaining = p_frames - todo;
+ if (remaining && todo > 0) {
- for(int c=0;c<channels;c++) {
+ for (int c = 0; c < channels; c++) {
- int32_t from = p_dest[(todo-1)*channels+c]>>8;
+ int32_t from = p_dest[(todo - 1) * channels + c] >> 8;
- for(int i=0;i<remaining;i++) {
+ for (int i = 0; i < remaining; i++) {
- uint32_t mul = (remaining-i) * 256 /remaining;
- p_dest[(todo+i)*channels+c]=from*mul;
+ uint32_t mul = (remaining - i) * 256 / remaining;
+ p_dest[(todo + i) * channels + c] = from * mul;
}
-
}
-
}
#endif
//zero out what remains there to avoid glitches
- for(int i=todo*channels;i<int(p_frames)*channels;i++) {
+ for (int i = todo * channels; i < int(p_frames) * channels; i++) {
- p_dest[i]=0;
+ p_dest[i] = 0;
}
- if (read>rb_todo)
- read=rb_todo;
-
- rb_read_pos = (rb_read_pos+read)&rb_mask;
-
-
-
+ if (read > rb_todo)
+ read = rb_todo;
+ rb_read_pos = (rb_read_pos + read) & rb_mask;
}
return true;
}
+Error AudioRBResampler::setup(int p_channels, int p_src_mix_rate, int p_target_mix_rate, int p_buffer_msec, int p_minbuff_needed) {
-Error AudioRBResampler::setup(int p_channels,int p_src_mix_rate,int p_target_mix_rate,int p_buffer_msec,int p_minbuff_needed) {
-
- ERR_FAIL_COND_V(p_channels!=1 && p_channels!=2 && p_channels!=4 && p_channels!=6,ERR_INVALID_PARAMETER);
-
+ ERR_FAIL_COND_V(p_channels != 1 && p_channels != 2 && p_channels != 4 && p_channels != 6, ERR_INVALID_PARAMETER);
//float buffering_sec = int(GLOBAL_DEF("audio/stream_buffering_ms",500))/1000.0;
- int desired_rb_bits =nearest_shift(MAX((p_buffer_msec/1000.0)*p_src_mix_rate,p_minbuff_needed));
+ int desired_rb_bits = nearest_shift(MAX((p_buffer_msec / 1000.0) * p_src_mix_rate, p_minbuff_needed));
- bool recreate=!rb;
+ bool recreate = !rb;
- if (rb && (uint32_t(desired_rb_bits)!=rb_bits || channels!=uint32_t(p_channels))) {
+ if (rb && (uint32_t(desired_rb_bits) != rb_bits || channels != uint32_t(p_channels))) {
//recreate
memdelete_arr(rb);
memdelete_arr(read_buf);
- recreate=true;
-
+ recreate = true;
}
if (recreate) {
- channels=p_channels;
- rb_bits=desired_rb_bits;
- rb_len=(1<<rb_bits);
- rb_mask=rb_len-1;
- rb = memnew_arr( int16_t, rb_len * p_channels );
- read_buf = memnew_arr( int16_t, rb_len * p_channels );
-
+ channels = p_channels;
+ rb_bits = desired_rb_bits;
+ rb_len = (1 << rb_bits);
+ rb_mask = rb_len - 1;
+ rb = memnew_arr(int16_t, rb_len * p_channels);
+ read_buf = memnew_arr(int16_t, rb_len * p_channels);
}
- src_mix_rate=p_src_mix_rate;
- target_mix_rate=p_target_mix_rate;
- offset=0;
- rb_read_pos=0;
- rb_write_pos=0;
+ src_mix_rate = p_src_mix_rate;
+ target_mix_rate = p_target_mix_rate;
+ offset = 0;
+ rb_read_pos = 0;
+ rb_write_pos = 0;
//avoid maybe strange noises upon load
- for (int i=0;i<(rb_len*channels);i++) {
+ for (int i = 0; i < (rb_len * channels); i++) {
- rb[i]=0;
- read_buf[i]=0;
+ rb[i] = 0;
+ read_buf[i] = 0;
}
return OK;
-
}
void AudioRBResampler::clear() {
@@ -348,29 +322,28 @@ void AudioRBResampler::clear() {
memdelete_arr(rb);
memdelete_arr(read_buf);
}
- rb=NULL;
- offset=0;
- rb_read_pos=0;
- rb_write_pos=0;
- read_buf=NULL;
+ rb = NULL;
+ offset = 0;
+ rb_read_pos = 0;
+ rb_write_pos = 0;
+ read_buf = NULL;
}
AudioRBResampler::AudioRBResampler() {
- rb=NULL;
- offset=0;
- read_buf=NULL;
- rb_read_pos=0;
- rb_write_pos=0;
-
- rb_bits=0;
- rb_len=0;
- rb_mask=0;
- read_buff_len=0;
- channels=0;
- src_mix_rate=0;
- target_mix_rate=0;
+ rb = NULL;
+ offset = 0;
+ read_buf = NULL;
+ rb_read_pos = 0;
+ rb_write_pos = 0;
+ rb_bits = 0;
+ rb_len = 0;
+ rb_mask = 0;
+ read_buff_len = 0;
+ channels = 0;
+ src_mix_rate = 0;
+ target_mix_rate = 0;
}
AudioRBResampler::~AudioRBResampler() {
@@ -379,6 +352,4 @@ AudioRBResampler::~AudioRBResampler() {
memdelete_arr(rb);
memdelete_arr(read_buf);
}
-
}
-
diff --git a/servers/audio/audio_rb_resampler.h b/servers/audio/audio_rb_resampler.h
index e97e275b6..d775aed0d 100644
--- a/servers/audio/audio_rb_resampler.h
+++ b/servers/audio/audio_rb_resampler.h
@@ -29,8 +29,8 @@
#ifndef AUDIO_RB_RESAMPLER_H
#define AUDIO_RB_RESAMPLER_H
-#include "typedefs.h"
#include "os/memory.h"
+#include "typedefs.h"
struct AudioRBResampler {
@@ -47,58 +47,53 @@ struct AudioRBResampler {
int32_t offset; //contains the fractional remainder of the resampler
enum {
- MIX_FRAC_BITS=13,
- MIX_FRAC_LEN=(1<<MIX_FRAC_BITS),
- MIX_FRAC_MASK=MIX_FRAC_LEN-1,
+ MIX_FRAC_BITS = 13,
+ MIX_FRAC_LEN = (1 << MIX_FRAC_BITS),
+ MIX_FRAC_MASK = MIX_FRAC_LEN - 1,
};
int16_t *read_buf;
int16_t *rb;
-
- template<int C>
- uint32_t _resample(int32_t *p_dest,int p_todo,int32_t p_increment);
-
+ template <int C>
+ uint32_t _resample(int32_t *p_dest, int p_todo, int32_t p_increment);
public:
-
_FORCE_INLINE_ void flush() {
- rb_read_pos=0;
- rb_write_pos=0;
- offset=0;
+ rb_read_pos = 0;
+ rb_write_pos = 0;
+ offset = 0;
}
- _FORCE_INLINE_ bool is_ready() const{
- return rb!=NULL;
+ _FORCE_INLINE_ bool is_ready() const {
+ return rb != NULL;
}
-
_FORCE_INLINE_ int get_total() const {
- return rb_len-1;
+ return rb_len - 1;
}
_FORCE_INLINE_ int get_todo() const { //return amount of frames to mix
int todo;
- int read_pos_cache=rb_read_pos;
+ int read_pos_cache = rb_read_pos;
- if (read_pos_cache==rb_write_pos) {
- todo=rb_len-1;
- } else if (read_pos_cache>rb_write_pos) {
+ if (read_pos_cache == rb_write_pos) {
+ todo = rb_len - 1;
+ } else if (read_pos_cache > rb_write_pos) {
- todo=read_pos_cache-rb_write_pos-1;
+ todo = read_pos_cache - rb_write_pos - 1;
} else {
- todo=(rb_len-rb_write_pos)+read_pos_cache-1;
+ todo = (rb_len - rb_write_pos) + read_pos_cache - 1;
}
return todo;
}
-
_FORCE_INLINE_ bool has_data() const {
- return rb && rb_read_pos!=rb_write_pos;
+ return rb && rb_read_pos != rb_write_pos;
}
_FORCE_INLINE_ int16_t *get_write_buffer() { return read_buf; }
@@ -106,57 +101,54 @@ public:
ERR_FAIL_COND(p_frames >= rb_len);
- switch(channels) {
+ switch (channels) {
case 1: {
- for(uint32_t i=0;i<p_frames;i++) {
+ for (uint32_t i = 0; i < p_frames; i++) {
- rb[ rb_write_pos ] = read_buf[i];
- rb_write_pos=(rb_write_pos+1)&rb_mask;
+ rb[rb_write_pos] = read_buf[i];
+ rb_write_pos = (rb_write_pos + 1) & rb_mask;
}
} break;
case 2: {
- for(uint32_t i=0;i<p_frames;i++) {
+ for (uint32_t i = 0; i < p_frames; i++) {
- rb[ (rb_write_pos<<1)+0 ] = read_buf[(i<<1)+0];
- rb[ (rb_write_pos<<1)+1 ] = read_buf[(i<<1)+1];
- rb_write_pos=(rb_write_pos+1)&rb_mask;
+ rb[(rb_write_pos << 1) + 0] = read_buf[(i << 1) + 0];
+ rb[(rb_write_pos << 1) + 1] = read_buf[(i << 1) + 1];
+ rb_write_pos = (rb_write_pos + 1) & rb_mask;
}
} break;
case 4: {
- for(uint32_t i=0;i<p_frames;i++) {
+ for (uint32_t i = 0; i < p_frames; i++) {
- rb[ (rb_write_pos<<2)+0 ] = read_buf[(i<<2)+0];
- rb[ (rb_write_pos<<2)+1 ] = read_buf[(i<<2)+1];
- rb[ (rb_write_pos<<2)+2 ] = read_buf[(i<<2)+2];
- rb[ (rb_write_pos<<2)+3 ] = read_buf[(i<<2)+3];
- rb_write_pos=(rb_write_pos+1)&rb_mask;
+ rb[(rb_write_pos << 2) + 0] = read_buf[(i << 2) + 0];
+ rb[(rb_write_pos << 2) + 1] = read_buf[(i << 2) + 1];
+ rb[(rb_write_pos << 2) + 2] = read_buf[(i << 2) + 2];
+ rb[(rb_write_pos << 2) + 3] = read_buf[(i << 2) + 3];
+ rb_write_pos = (rb_write_pos + 1) & rb_mask;
}
} break;
case 6: {
- for(uint32_t i=0;i<p_frames;i++) {
+ for (uint32_t i = 0; i < p_frames; i++) {
- rb[ (rb_write_pos*6)+0 ] = read_buf[(i*6)+0];
- rb[ (rb_write_pos*6)+1 ] = read_buf[(i*6)+1];
- rb[ (rb_write_pos*6)+2 ] = read_buf[(i*6)+2];
- rb[ (rb_write_pos*6)+3 ] = read_buf[(i*6)+3];
- rb[ (rb_write_pos*6)+4 ] = read_buf[(i*6)+4];
- rb[ (rb_write_pos*6)+5 ] = read_buf[(i*6)+5];
- rb_write_pos=(rb_write_pos+1)&rb_mask;
+ rb[(rb_write_pos * 6) + 0] = read_buf[(i * 6) + 0];
+ rb[(rb_write_pos * 6) + 1] = read_buf[(i * 6) + 1];
+ rb[(rb_write_pos * 6) + 2] = read_buf[(i * 6) + 2];
+ rb[(rb_write_pos * 6) + 3] = read_buf[(i * 6) + 3];
+ rb[(rb_write_pos * 6) + 4] = read_buf[(i * 6) + 4];
+ rb[(rb_write_pos * 6) + 5] = read_buf[(i * 6) + 5];
+ rb_write_pos = (rb_write_pos + 1) & rb_mask;
}
} break;
-
-
}
-
}
int get_channel_count() const;
- Error setup(int p_channels, int p_src_mix_rate, int p_target_mix_rate, int p_buffer_msec, int p_minbuff_needed=-1);
+ Error setup(int p_channels, int p_src_mix_rate, int p_target_mix_rate, int p_buffer_msec, int p_minbuff_needed = -1);
void clear();
bool mix(int32_t *p_dest, int p_frames);
diff --git a/servers/audio/audio_server_sw.cpp b/servers/audio/audio_server_sw.cpp
index b786d9d53..5b394e585 100644
--- a/servers/audio/audio_server_sw.cpp
+++ b/servers/audio/audio_server_sw.cpp
@@ -32,9 +32,12 @@
struct _AudioDriverLock {
- _AudioDriverLock() { if (AudioDriverSW::get_singleton()) AudioDriverSW::get_singleton()->lock(); }
- ~_AudioDriverLock() { if (AudioDriverSW::get_singleton()) AudioDriverSW::get_singleton()->unlock(); }
-
+ _AudioDriverLock() {
+ if (AudioDriverSW::get_singleton()) AudioDriverSW::get_singleton()->lock();
+ }
+ ~_AudioDriverLock() {
+ if (AudioDriverSW::get_singleton()) AudioDriverSW::get_singleton()->unlock();
+ }
};
#define AUDIO_LOCK _AudioDriverLock _adlock;
@@ -47,7 +50,7 @@ AudioMixer *AudioServerSW::get_mixer() {
/* CALLBACKS */
void AudioServerSW::audio_mixer_chunk_callback(int p_frames) {
-/*
+ /*
for(List<Stream*>::Element *E=event_streams.front();E;E=E->next()) {
if (E->get()->active)
@@ -58,45 +61,42 @@ void AudioServerSW::audio_mixer_chunk_callback(int p_frames) {
void AudioServerSW::_mixer_callback(void *p_udata) {
- AudioServerSW *self = (AudioServerSW*)p_udata;
- for(List<Stream*>::Element *E=self->active_audio_streams.front();E;E=E->next()) {
+ AudioServerSW *self = (AudioServerSW *)p_udata;
+ for (List<Stream *>::Element *E = self->active_audio_streams.front(); E; E = E->next()) {
if (!E->get()->active)
continue;
- EventStream *es=E->get()->event_stream;
+ EventStream *es = E->get()->event_stream;
if (!es)
continue;
es->update(self->mixer_step_usecs);
}
-
}
-void AudioServerSW::driver_process_chunk(int p_frames,int32_t *p_buffer) {
-
-
+void AudioServerSW::driver_process_chunk(int p_frames, int32_t *p_buffer) {
- int samples=p_frames*internal_buffer_channels;
+ int samples = p_frames * internal_buffer_channels;
- for(int i=0;i<samples;i++) {
- internal_buffer[i]=0;
+ for (int i = 0; i < samples; i++) {
+ internal_buffer[i] = 0;
}
- while(voice_rb.commands_left()) {
+ while (voice_rb.commands_left()) {
VoiceRBSW::Command cmd = voice_rb.pop_command();
- if (cmd.type==VoiceRBSW::Command::CMD_CHANGE_ALL_FX_VOLUMES) {
+ if (cmd.type == VoiceRBSW::Command::CMD_CHANGE_ALL_FX_VOLUMES) {
- SelfList<Voice>*al = active_list.first();
- while(al) {
+ SelfList<Voice> *al = active_list.first();
+ while (al) {
- Voice *v=al->self();
- if (v->channel!=AudioMixer::INVALID_CHANNEL) {
- mixer->channel_set_volume(v->channel,v->volume*fx_volume_scale);
+ Voice *v = al->self();
+ if (v->channel != AudioMixer::INVALID_CHANNEL) {
+ mixer->channel_set_volume(v->channel, v->volume * fx_volume_scale);
}
- al=al->next();
+ al = al->next();
}
continue;
@@ -104,246 +104,234 @@ void AudioServerSW::driver_process_chunk(int p_frames,int32_t *p_buffer) {
if (!voice_owner.owns(cmd.voice))
continue;
-
Voice *v = voice_owner.get(cmd.voice);
- switch(cmd.type) {
+ switch (cmd.type) {
case VoiceRBSW::Command::CMD_NONE: {
-
} break;
case VoiceRBSW::Command::CMD_PLAY: {
- if (v->channel!=AudioMixer::INVALID_CHANNEL)
+ if (v->channel != AudioMixer::INVALID_CHANNEL)
mixer->channel_free(v->channel);
RID sample = cmd.play.sample;
if (!sample_manager->is_sample(sample))
continue;
- v->channel=mixer->channel_alloc(sample);
- v->volume=1.0;
- mixer->channel_set_volume(v->channel,fx_volume_scale);
- if (v->channel==AudioMixer::INVALID_CHANNEL) {
+ v->channel = mixer->channel_alloc(sample);
+ v->volume = 1.0;
+ mixer->channel_set_volume(v->channel, fx_volume_scale);
+ if (v->channel == AudioMixer::INVALID_CHANNEL) {
#ifdef AUDIO_DEBUG
WARN_PRINT("AUDIO: all channels used, failed to allocate voice");
#endif
- v->active=false;
+ v->active = false;
break; // no voices left?
}
- v->active=true; // this kind of ensures it works
+ v->active = true; // this kind of ensures it works
if (!v->active_item.in_list())
active_list.add(&v->active_item);
} break;
case VoiceRBSW::Command::CMD_STOP: {
- if (v->channel!=AudioMixer::INVALID_CHANNEL) {
+ if (v->channel != AudioMixer::INVALID_CHANNEL) {
mixer->channel_free(v->channel);
if (v->active_item.in_list()) {
active_list.remove(&v->active_item);
}
}
- v->active=false;
+ v->active = false;
} break;
case VoiceRBSW::Command::CMD_SET_VOLUME: {
-
- if (v->channel!=AudioMixer::INVALID_CHANNEL) {
- v->volume=cmd.volume.volume;
- mixer->channel_set_volume(v->channel,cmd.volume.volume*fx_volume_scale);
+ if (v->channel != AudioMixer::INVALID_CHANNEL) {
+ v->volume = cmd.volume.volume;
+ mixer->channel_set_volume(v->channel, cmd.volume.volume * fx_volume_scale);
}
} break;
case VoiceRBSW::Command::CMD_SET_PAN: {
- if (v->channel!=AudioMixer::INVALID_CHANNEL)
- mixer->channel_set_pan(v->channel,cmd.pan.pan,cmd.pan.depth,cmd.pan.height);
+ if (v->channel != AudioMixer::INVALID_CHANNEL)
+ mixer->channel_set_pan(v->channel, cmd.pan.pan, cmd.pan.depth, cmd.pan.height);
} break;
case VoiceRBSW::Command::CMD_SET_FILTER: {
-
- if (v->channel!=AudioMixer::INVALID_CHANNEL)
- mixer->channel_set_filter(v->channel,(AudioMixer::FilterType)cmd.filter.type,cmd.filter.cutoff,cmd.filter.resonance,cmd.filter.gain);
+ if (v->channel != AudioMixer::INVALID_CHANNEL)
+ mixer->channel_set_filter(v->channel, (AudioMixer::FilterType)cmd.filter.type, cmd.filter.cutoff, cmd.filter.resonance, cmd.filter.gain);
} break;
case VoiceRBSW::Command::CMD_SET_CHORUS: {
- if (v->channel!=AudioMixer::INVALID_CHANNEL)
- mixer->channel_set_chorus(v->channel,cmd.chorus.send);
+ if (v->channel != AudioMixer::INVALID_CHANNEL)
+ mixer->channel_set_chorus(v->channel, cmd.chorus.send);
} break;
case VoiceRBSW::Command::CMD_SET_REVERB: {
- if (v->channel!=AudioMixer::INVALID_CHANNEL)
- mixer->channel_set_reverb(v->channel,(AudioMixer::ReverbRoomType)cmd.reverb.room,cmd.reverb.send);
+ if (v->channel != AudioMixer::INVALID_CHANNEL)
+ mixer->channel_set_reverb(v->channel, (AudioMixer::ReverbRoomType)cmd.reverb.room, cmd.reverb.send);
} break;
case VoiceRBSW::Command::CMD_SET_MIX_RATE: {
- if (v->channel!=AudioMixer::INVALID_CHANNEL)
- mixer->channel_set_mix_rate(v->channel,cmd.mix_rate.mix_rate);
+ if (v->channel != AudioMixer::INVALID_CHANNEL)
+ mixer->channel_set_mix_rate(v->channel, cmd.mix_rate.mix_rate);
} break;
case VoiceRBSW::Command::CMD_SET_POSITIONAL: {
- if (v->channel!=AudioMixer::INVALID_CHANNEL)
- mixer->channel_set_positional(v->channel,cmd.positional.positional);
+ if (v->channel != AudioMixer::INVALID_CHANNEL)
+ mixer->channel_set_positional(v->channel, cmd.positional.positional);
} break;
default: {}
-
}
}
- mixer->mix(internal_buffer,p_frames);
+ mixer->mix(internal_buffer, p_frames);
//uint64_t stepsize=mixer->get_step_usecs();
-
- for(List<Stream*>::Element *E=active_audio_streams.front();E;E=E->next()) {
+ for (List<Stream *>::Element *E = active_audio_streams.front(); E; E = E->next()) {
ERR_CONTINUE(!E->get()->active); // bug?
-
- AudioStream *as=E->get()->audio_stream;
+ AudioStream *as = E->get()->audio_stream;
if (!as)
continue;
- int channels=as->get_channel_count();
- if (channels==0)
+ int channels = as->get_channel_count();
+ if (channels == 0)
continue; // does not want mix
- if (!as->mix(stream_buffer,p_frames))
+ if (!as->mix(stream_buffer, p_frames))
continue; //nothing was mixed!!
- int32_t stream_vol_scale=(stream_volume*stream_volume_scale*E->get()->volume_scale)*(1<<STREAM_SCALE_BITS);
+ int32_t stream_vol_scale = (stream_volume * stream_volume_scale * E->get()->volume_scale) * (1 << STREAM_SCALE_BITS);
-#define STRSCALE(m_val) (((m_val>>STREAM_SCALE_BITS)*stream_vol_scale)>>8)
- switch(internal_buffer_channels) {
+#define STRSCALE(m_val) (((m_val >> STREAM_SCALE_BITS) * stream_vol_scale) >> 8)
+ switch (internal_buffer_channels) {
case 2: {
- switch(channels) {
+ switch (channels) {
case 1: {
- for(int i=0;i<p_frames;i++) {
+ for (int i = 0; i < p_frames; i++) {
- internal_buffer[(i<<1)+0]+=STRSCALE(stream_buffer[i]);
- internal_buffer[(i<<1)+1]+=STRSCALE(stream_buffer[i]);
+ internal_buffer[(i << 1) + 0] += STRSCALE(stream_buffer[i]);
+ internal_buffer[(i << 1) + 1] += STRSCALE(stream_buffer[i]);
}
} break;
case 2: {
- for(int i=0;i<p_frames*2;i++) {
+ for (int i = 0; i < p_frames * 2; i++) {
- internal_buffer[i]+=STRSCALE(stream_buffer[i]);
+ internal_buffer[i] += STRSCALE(stream_buffer[i]);
}
} break;
case 4: {
- for(int i=0;i<p_frames;i++) {
+ for (int i = 0; i < p_frames; i++) {
- internal_buffer[(i<<2)+0]+=STRSCALE((stream_buffer[(i<<2)+0]+stream_buffer[(i<<2)+2])>>1);
- internal_buffer[(i<<2)+1]+=STRSCALE((stream_buffer[(i<<2)+1]+stream_buffer[(i<<2)+3])>>1);
+ internal_buffer[(i << 2) + 0] += STRSCALE((stream_buffer[(i << 2) + 0] + stream_buffer[(i << 2) + 2]) >> 1);
+ internal_buffer[(i << 2) + 1] += STRSCALE((stream_buffer[(i << 2) + 1] + stream_buffer[(i << 2) + 3]) >> 1);
}
} break;
-
- } break;
+ }
+ break;
} break;
case 4: {
- switch(channels) {
+ switch (channels) {
case 1: {
- for(int i=0;i<p_frames;i++) {
+ for (int i = 0; i < p_frames; i++) {
- internal_buffer[(i<<2)+0]+=STRSCALE(stream_buffer[i]);
- internal_buffer[(i<<2)+1]+=STRSCALE(stream_buffer[i]);
- internal_buffer[(i<<2)+2]+=STRSCALE(stream_buffer[i]);
- internal_buffer[(i<<2)+3]+=STRSCALE(stream_buffer[i]);
+ internal_buffer[(i << 2) + 0] += STRSCALE(stream_buffer[i]);
+ internal_buffer[(i << 2) + 1] += STRSCALE(stream_buffer[i]);
+ internal_buffer[(i << 2) + 2] += STRSCALE(stream_buffer[i]);
+ internal_buffer[(i << 2) + 3] += STRSCALE(stream_buffer[i]);
}
} break;
case 2: {
- for(int i=0;i<p_frames*2;i++) {
+ for (int i = 0; i < p_frames * 2; i++) {
- internal_buffer[(i<<2)+0]+=STRSCALE(stream_buffer[(i<<1)+0]);
- internal_buffer[(i<<2)+1]+=STRSCALE(stream_buffer[(i<<1)+1]);
- internal_buffer[(i<<2)+2]+=STRSCALE(stream_buffer[(i<<1)+0]);
- internal_buffer[(i<<2)+3]+=STRSCALE(stream_buffer[(i<<1)+1]);
+ internal_buffer[(i << 2) + 0] += STRSCALE(stream_buffer[(i << 1) + 0]);
+ internal_buffer[(i << 2) + 1] += STRSCALE(stream_buffer[(i << 1) + 1]);
+ internal_buffer[(i << 2) + 2] += STRSCALE(stream_buffer[(i << 1) + 0]);
+ internal_buffer[(i << 2) + 3] += STRSCALE(stream_buffer[(i << 1) + 1]);
}
} break;
case 4: {
- for(int i=0;i<p_frames*4;i++) {
- internal_buffer[i]+=STRSCALE(stream_buffer[i]);
+ for (int i = 0; i < p_frames * 4; i++) {
+ internal_buffer[i] += STRSCALE(stream_buffer[i]);
}
} break;
-
- } break;
+ }
+ break;
} break;
case 6: {
-
} break;
}
#undef STRSCALE
}
- SelfList<Voice> *activeE=active_list.first();
- while(activeE) {
+ SelfList<Voice> *activeE = active_list.first();
+ while (activeE) {
- SelfList<Voice> *activeN=activeE->next();
- if (activeE->self()->channel==AudioMixer::INVALID_CHANNEL || !mixer->channel_is_valid(activeE->self()->channel)) {
+ SelfList<Voice> *activeN = activeE->next();
+ if (activeE->self()->channel == AudioMixer::INVALID_CHANNEL || !mixer->channel_is_valid(activeE->self()->channel)) {
active_list.remove(activeE);
- activeE->self()->active=false;
-
+ activeE->self()->active = false;
}
- activeE=activeN;
+ activeE = activeN;
}
- uint32_t peak=0;
- for(int i=0;i<samples;i++) {
+ uint32_t peak = 0;
+ for (int i = 0; i < samples; i++) {
//clamp to (1<<24) using branchless code
int32_t in = internal_buffer[i];
#ifdef DEBUG_ENABLED
{
- int mask = (in >> (32 - 1));
- uint32_t p = (in + mask) ^ mask;
- if (p>peak)
- peak=p;
+ int mask = (in >> (32 - 1));
+ uint32_t p = (in + mask) ^ mask;
+ if (p > peak)
+ peak = p;
}
#endif
- int32_t lo = -0x800000, hi=0x7FFFFF;
- lo-=in;
- hi-=in;
+ int32_t lo = -0x800000, hi = 0x7FFFFF;
+ lo -= in;
+ hi -= in;
in += (lo & ((lo < 0) - 1)) + (hi & ((hi > 0) - 1));
- p_buffer[i]=in<<8;
+ p_buffer[i] = in << 8;
}
- if (peak>max_peak)
- max_peak=peak;
+ if (peak > max_peak)
+ max_peak = peak;
}
-void AudioServerSW::driver_process(int p_frames,int32_t *p_buffer) {
-
+void AudioServerSW::driver_process(int p_frames, int32_t *p_buffer) {
- _output_delay=p_frames/double(AudioDriverSW::get_singleton()->get_mix_rate());
+ _output_delay = p_frames / double(AudioDriverSW::get_singleton()->get_mix_rate());
//process in chunks to make sure to never process more than INTERNAL_BUFFER_SIZE
- int todo=p_frames;
- while(todo) {
+ int todo = p_frames;
+ while (todo) {
- int tomix=MIN(todo,INTERNAL_BUFFER_SIZE);
- driver_process_chunk(tomix,p_buffer);
- p_buffer+=tomix;
- todo-=tomix;
+ int tomix = MIN(todo, INTERNAL_BUFFER_SIZE);
+ driver_process_chunk(tomix, p_buffer);
+ p_buffer += tomix;
+ todo -= tomix;
}
-
-
}
/* SAMPLE API */
@@ -352,13 +340,13 @@ RID AudioServerSW::sample_create(SampleFormat p_format, bool p_stereo, int p_len
AUDIO_LOCK
- return sample_manager->sample_create(p_format,p_stereo,p_length);
+ return sample_manager->sample_create(p_format, p_stereo, p_length);
}
-void AudioServerSW::sample_set_description(RID p_sample, const String& p_description) {
+void AudioServerSW::sample_set_description(RID p_sample, const String &p_description) {
AUDIO_LOCK
- sample_manager->sample_set_description(p_sample,p_description);
+ sample_manager->sample_set_description(p_sample, p_description);
}
String AudioServerSW::sample_get_description(RID p_sample) const {
@@ -374,55 +362,55 @@ bool AudioServerSW::sample_is_stereo(RID p_sample) const {
//AUDIO_LOCK
return sample_manager->sample_is_stereo(p_sample);
}
-int AudioServerSW::sample_get_length(RID p_sample) const {
+int AudioServerSW::sample_get_length(RID p_sample) const {
///AUDIO_LOCK
return sample_manager->sample_get_length(p_sample);
}
-const void* AudioServerSW::sample_get_data_ptr(RID p_sample) const {
+const void *AudioServerSW::sample_get_data_ptr(RID p_sample) const {
///AUDIO_LOCK
return sample_manager->sample_get_data_ptr(p_sample);
}
-void AudioServerSW::sample_set_data(RID p_sample, const DVector<uint8_t>& p_buffer) {
+void AudioServerSW::sample_set_data(RID p_sample, const DVector<uint8_t> &p_buffer) {
AUDIO_LOCK
- sample_manager->sample_set_data(p_sample,p_buffer);
+ sample_manager->sample_set_data(p_sample, p_buffer);
}
DVector<uint8_t> AudioServerSW::sample_get_data(RID p_sample) const {
AUDIO_LOCK
return sample_manager->sample_get_data(p_sample);
}
-void AudioServerSW::sample_set_mix_rate(RID p_sample,int p_rate) {
+void AudioServerSW::sample_set_mix_rate(RID p_sample, int p_rate) {
AUDIO_LOCK
- sample_manager->sample_set_mix_rate(p_sample,p_rate);
+ sample_manager->sample_set_mix_rate(p_sample, p_rate);
}
int AudioServerSW::sample_get_mix_rate(RID p_sample) const {
AUDIO_LOCK
return sample_manager->sample_get_mix_rate(p_sample);
}
-void AudioServerSW::sample_set_loop_format(RID p_sample,SampleLoopFormat p_format) {
+void AudioServerSW::sample_set_loop_format(RID p_sample, SampleLoopFormat p_format) {
AUDIO_LOCK
- sample_manager->sample_set_loop_format(p_sample,p_format);
+ sample_manager->sample_set_loop_format(p_sample, p_format);
}
AS::SampleLoopFormat AudioServerSW::sample_get_loop_format(RID p_sample) const {
AUDIO_LOCK
return sample_manager->sample_get_loop_format(p_sample);
}
-void AudioServerSW::sample_set_loop_begin(RID p_sample,int p_pos) {
+void AudioServerSW::sample_set_loop_begin(RID p_sample, int p_pos) {
AUDIO_LOCK
- sample_manager->sample_set_loop_begin(p_sample,p_pos);
+ sample_manager->sample_set_loop_begin(p_sample, p_pos);
}
int AudioServerSW::sample_get_loop_begin(RID p_sample) const {
AUDIO_LOCK
return sample_manager->sample_get_loop_begin(p_sample);
}
-void AudioServerSW::sample_set_loop_end(RID p_sample,int p_pos) {
+void AudioServerSW::sample_set_loop_end(RID p_sample, int p_pos) {
AUDIO_LOCK
- sample_manager->sample_set_loop_end(p_sample,p_pos);
+ sample_manager->sample_set_loop_end(p_sample, p_pos);
}
int AudioServerSW::sample_get_loop_end(RID p_sample) const {
AUDIO_LOCK
@@ -433,226 +421,203 @@ int AudioServerSW::sample_get_loop_end(RID p_sample) const {
RID AudioServerSW::voice_create() {
- Voice * v = memnew( Voice );
- v->channel=AudioMixer::INVALID_CHANNEL;
+ Voice *v = memnew(Voice);
+ v->channel = AudioMixer::INVALID_CHANNEL;
AUDIO_LOCK
return voice_owner.make_rid(v);
-
}
void AudioServerSW::voice_play(RID p_voice, RID p_sample) {
- Voice *v = voice_owner.get( p_voice );
+ Voice *v = voice_owner.get(p_voice);
ERR_FAIL_COND(!v);
- v->active=true; // force actvive (will be disabled later i gues..)
+ v->active = true; // force actvive (will be disabled later i gues..)
//stop old, start new
VoiceRBSW::Command cmd;
- cmd.type=VoiceRBSW::Command::CMD_PLAY;
- cmd.voice=p_voice;
- cmd.play.sample=p_sample;
+ cmd.type = VoiceRBSW::Command::CMD_PLAY;
+ cmd.voice = p_voice;
+ cmd.play.sample = p_sample;
voice_rb.push_command(cmd);
-
}
void AudioServerSW::voice_set_volume(RID p_voice, float p_volume) {
VoiceRBSW::Command cmd;
- cmd.type=VoiceRBSW::Command::CMD_SET_VOLUME;
- cmd.voice=p_voice;
- cmd.volume.volume=p_volume;
+ cmd.type = VoiceRBSW::Command::CMD_SET_VOLUME;
+ cmd.voice = p_voice;
+ cmd.volume.volume = p_volume;
voice_rb.push_command(cmd);
-
}
-void AudioServerSW::voice_set_pan(RID p_voice, float p_pan, float p_depth,float p_height) {
+void AudioServerSW::voice_set_pan(RID p_voice, float p_pan, float p_depth, float p_height) {
VoiceRBSW::Command cmd;
- cmd.type=VoiceRBSW::Command::CMD_SET_PAN;
- cmd.voice=p_voice;
- cmd.pan.pan=p_pan;
- cmd.pan.depth=p_depth;
- cmd.pan.height=p_height;
+ cmd.type = VoiceRBSW::Command::CMD_SET_PAN;
+ cmd.voice = p_voice;
+ cmd.pan.pan = p_pan;
+ cmd.pan.depth = p_depth;
+ cmd.pan.height = p_height;
voice_rb.push_command(cmd);
-
}
-void AudioServerSW::voice_set_filter(RID p_voice, FilterType p_type, float p_cutoff, float p_resonance,float p_gain) {
+void AudioServerSW::voice_set_filter(RID p_voice, FilterType p_type, float p_cutoff, float p_resonance, float p_gain) {
VoiceRBSW::Command cmd;
- cmd.type=VoiceRBSW::Command::CMD_SET_FILTER;
- cmd.voice=p_voice;
- cmd.filter.type=p_type;
- cmd.filter.cutoff=p_cutoff;
- cmd.filter.resonance=p_resonance;
- cmd.filter.gain=p_gain;
+ cmd.type = VoiceRBSW::Command::CMD_SET_FILTER;
+ cmd.voice = p_voice;
+ cmd.filter.type = p_type;
+ cmd.filter.cutoff = p_cutoff;
+ cmd.filter.resonance = p_resonance;
+ cmd.filter.gain = p_gain;
voice_rb.push_command(cmd);
-
}
-void AudioServerSW::voice_set_chorus(RID p_voice, float p_chorus ) {
+void AudioServerSW::voice_set_chorus(RID p_voice, float p_chorus) {
VoiceRBSW::Command cmd;
- cmd.type=VoiceRBSW::Command::CMD_SET_CHORUS;
- cmd.voice=p_voice;
- cmd.chorus.send=p_chorus;
+ cmd.type = VoiceRBSW::Command::CMD_SET_CHORUS;
+ cmd.voice = p_voice;
+ cmd.chorus.send = p_chorus;
voice_rb.push_command(cmd);
-
}
void AudioServerSW::voice_set_reverb(RID p_voice, ReverbRoomType p_room_type, float p_reverb) {
VoiceRBSW::Command cmd;
- cmd.type=VoiceRBSW::Command::CMD_SET_REVERB;
- cmd.voice=p_voice;
- cmd.reverb.room=p_room_type;
- cmd.reverb.send=p_reverb;
+ cmd.type = VoiceRBSW::Command::CMD_SET_REVERB;
+ cmd.voice = p_voice;
+ cmd.reverb.room = p_room_type;
+ cmd.reverb.send = p_reverb;
voice_rb.push_command(cmd);
-
}
void AudioServerSW::voice_set_mix_rate(RID p_voice, int p_mix_rate) {
VoiceRBSW::Command cmd;
- cmd.type=VoiceRBSW::Command::CMD_SET_MIX_RATE;
- cmd.voice=p_voice;
- cmd.mix_rate.mix_rate=p_mix_rate;
+ cmd.type = VoiceRBSW::Command::CMD_SET_MIX_RATE;
+ cmd.voice = p_voice;
+ cmd.mix_rate.mix_rate = p_mix_rate;
voice_rb.push_command(cmd);
-
}
void AudioServerSW::voice_set_positional(RID p_voice, bool p_positional) {
VoiceRBSW::Command cmd;
- cmd.type=VoiceRBSW::Command::CMD_SET_POSITIONAL;
- cmd.voice=p_voice;
- cmd.positional.positional=p_positional;
+ cmd.type = VoiceRBSW::Command::CMD_SET_POSITIONAL;
+ cmd.voice = p_voice;
+ cmd.positional.positional = p_positional;
voice_rb.push_command(cmd);
-
}
float AudioServerSW::voice_get_volume(RID p_voice) const {
AUDIO_LOCK
- Voice *v = voice_owner.get( p_voice );
+ Voice *v = voice_owner.get(p_voice);
ERR_FAIL_COND_V(!v, 0);
- return mixer->channel_get_volume( v->channel );
-
+ return mixer->channel_get_volume(v->channel);
}
float AudioServerSW::voice_get_pan(RID p_voice) const {
AUDIO_LOCK
- Voice *v = voice_owner.get( p_voice );
+ Voice *v = voice_owner.get(p_voice);
ERR_FAIL_COND_V(!v, 0);
- return mixer->channel_get_pan( v->channel );
-
+ return mixer->channel_get_pan(v->channel);
}
float AudioServerSW::voice_get_pan_depth(RID p_voice) const {
AUDIO_LOCK
- Voice *v = voice_owner.get( p_voice );
+ Voice *v = voice_owner.get(p_voice);
ERR_FAIL_COND_V(!v, 0);
- return mixer->channel_get_pan_depth( v->channel );
-
+ return mixer->channel_get_pan_depth(v->channel);
}
float AudioServerSW::voice_get_pan_height(RID p_voice) const {
AUDIO_LOCK
- Voice *v = voice_owner.get( p_voice );
+ Voice *v = voice_owner.get(p_voice);
ERR_FAIL_COND_V(!v, 0);
- return mixer->channel_get_pan_height( v->channel );
-
+ return mixer->channel_get_pan_height(v->channel);
}
AS::FilterType AudioServerSW::voice_get_filter_type(RID p_voice) const {
AUDIO_LOCK
- Voice *v = voice_owner.get( p_voice );
+ Voice *v = voice_owner.get(p_voice);
ERR_FAIL_COND_V(!v, AS::FILTER_NONE);
return (AS::FilterType)mixer->channel_get_filter_type(v->channel);
-
}
float AudioServerSW::voice_get_filter_cutoff(RID p_voice) const {
AUDIO_LOCK
- Voice *v = voice_owner.get( p_voice );
+ Voice *v = voice_owner.get(p_voice);
ERR_FAIL_COND_V(!v, 0);
- return mixer->channel_get_filter_cutoff( v->channel );
-
+ return mixer->channel_get_filter_cutoff(v->channel);
}
float AudioServerSW::voice_get_filter_resonance(RID p_voice) const {
AUDIO_LOCK
- Voice *v = voice_owner.get( p_voice );
+ Voice *v = voice_owner.get(p_voice);
ERR_FAIL_COND_V(!v, 0);
- return mixer->channel_get_filter_resonance( v->channel );
-
+ return mixer->channel_get_filter_resonance(v->channel);
}
float AudioServerSW::voice_get_chorus(RID p_voice) const {
AUDIO_LOCK
- Voice *v = voice_owner.get( p_voice );
+ Voice *v = voice_owner.get(p_voice);
ERR_FAIL_COND_V(!v, 0);
- return mixer->channel_get_chorus( v->channel );
-
+ return mixer->channel_get_chorus(v->channel);
}
AS::ReverbRoomType AudioServerSW::voice_get_reverb_type(RID p_voice) const {
AUDIO_LOCK
- Voice *v = voice_owner.get( p_voice );
+ Voice *v = voice_owner.get(p_voice);
ERR_FAIL_COND_V(!v, REVERB_SMALL);
- return (AS::ReverbRoomType)mixer->channel_get_reverb_type( v->channel );
-
+ return (AS::ReverbRoomType)mixer->channel_get_reverb_type(v->channel);
}
float AudioServerSW::voice_get_reverb(RID p_voice) const {
AUDIO_LOCK
- Voice *v = voice_owner.get( p_voice );
+ Voice *v = voice_owner.get(p_voice);
ERR_FAIL_COND_V(!v, 0);
- return mixer->channel_get_reverb( v->channel );
-
+ return mixer->channel_get_reverb(v->channel);
}
int AudioServerSW::voice_get_mix_rate(RID p_voice) const {
AUDIO_LOCK
- Voice *v = voice_owner.get( p_voice );
+ Voice *v = voice_owner.get(p_voice);
ERR_FAIL_COND_V(!v, 0);
- return mixer->channel_get_mix_rate( v->channel );
-
+ return mixer->channel_get_mix_rate(v->channel);
}
bool AudioServerSW::voice_is_positional(RID p_voice) const {
AUDIO_LOCK
- Voice *v = voice_owner.get( p_voice );
+ Voice *v = voice_owner.get(p_voice);
ERR_FAIL_COND_V(!v, 0);
- return mixer->channel_is_positional( v->channel );
-
+ return mixer->channel_is_positional(v->channel);
}
void AudioServerSW::voice_stop(RID p_voice) {
VoiceRBSW::Command cmd;
- cmd.type=VoiceRBSW::Command::CMD_STOP;
- cmd.voice=p_voice;
+ cmd.type = VoiceRBSW::Command::CMD_STOP;
+ cmd.voice = p_voice;
voice_rb.push_command(cmd);
//return mixer->channel_free( v->channel );
-
}
bool AudioServerSW::voice_is_active(RID p_voice) const {
Voice *v = voice_owner.get(p_voice);
- ERR_FAIL_COND_V(!v,false);
+ ERR_FAIL_COND_V(!v, false);
return v->active;
-
}
/* STREAM API */
@@ -661,11 +626,11 @@ RID AudioServerSW::audio_stream_create(AudioStream *p_stream) {
AUDIO_LOCK
Stream *s = memnew(Stream);
- s->audio_stream=p_stream;
- s->event_stream=NULL;
- s->active=false;
- s->E=NULL;
- s->volume_scale=1.0;
+ s->audio_stream = p_stream;
+ s->event_stream = NULL;
+ s->active = false;
+ s->E = NULL;
+ s->volume_scale = 1.0;
p_stream->set_mix_rate(AudioDriverSW::get_singleton()->get_mix_rate());
return stream_owner.make_rid(s);
@@ -675,44 +640,38 @@ RID AudioServerSW::event_stream_create(EventStream *p_stream) {
AUDIO_LOCK
Stream *s = memnew(Stream);
- s->audio_stream=NULL;
- s->event_stream=p_stream;
- s->active=false;
- s->E=NULL;
- s->volume_scale=1.0;
+ s->audio_stream = NULL;
+ s->event_stream = p_stream;
+ s->active = false;
+ s->E = NULL;
+ s->volume_scale = 1.0;
//p_stream->set_mix_rate(AudioDriverSW::get_singleton()->get_mix_rate());
return stream_owner.make_rid(s);
-
-
}
-
void AudioServerSW::stream_set_active(RID p_stream, bool p_active) {
-
Stream *s = stream_owner.get(p_stream);
ERR_FAIL_COND(!s);
_THREAD_SAFE_METHOD_
- if (s->active==p_active)
+ if (s->active == p_active)
return;
AUDIO_LOCK;
- s->active=p_active;
+ s->active = p_active;
if (p_active)
- s->E=active_audio_streams.push_back(s);
+ s->E = active_audio_streams.push_back(s);
else {
active_audio_streams.erase(s->E);
- s->E=NULL;
+ s->E = NULL;
}
-
-
}
bool AudioServerSW::stream_is_active(RID p_stream) const {
Stream *s = stream_owner.get(p_stream);
- ERR_FAIL_COND_V(!s,false);
+ ERR_FAIL_COND_V(!s, false);
return s->active;
}
@@ -720,36 +679,32 @@ void AudioServerSW::stream_set_volume_scale(RID p_stream, float p_scale) {
Stream *s = stream_owner.get(p_stream);
ERR_FAIL_COND(!s);
- s->volume_scale=p_scale;
-
+ s->volume_scale = p_scale;
}
float AudioServerSW::stream_set_volume_scale(RID p_stream) const {
Stream *s = stream_owner.get(p_stream);
- ERR_FAIL_COND_V(!s,0);
+ ERR_FAIL_COND_V(!s, 0);
return s->volume_scale;
-
}
-
void AudioServerSW::free(RID p_id) {
- if(voice_owner.owns(p_id)) {
+ if (voice_owner.owns(p_id)) {
Voice *v = voice_owner.get(p_id);
AUDIO_LOCK
- mixer->channel_free( v->channel );
+ mixer->channel_free(v->channel);
voice_owner.free(p_id);
memdelete(v);
} else if (stream_owner.owns(p_id)) {
-
- Stream *s=stream_owner.get(p_id);
+ Stream *s = stream_owner.get(p_id);
if (s->active) {
- stream_set_active(p_id,false);
+ stream_set_active(p_id, false);
}
memdelete(s);
@@ -760,63 +715,60 @@ void AudioServerSW::free(RID p_id) {
AUDIO_LOCK
sample_manager->free(p_id);
}
-
}
void AudioServerSW::_thread_func(void *self) {
Thread::set_name("AudioServerSW");
- AudioServerSW *as=(AudioServerSW *)self;
+ AudioServerSW *as = (AudioServerSW *)self;
while (!as->exit_update_thread) {
as->_update_streams(true);
OS::get_singleton()->delay_usec(5000);
}
-
}
void AudioServerSW::init() {
- int latency = GLOBAL_DEF("audio/mixer_latency",10);
- internal_buffer_channels=2; // read from driver
- internal_buffer = memnew_arr(int32_t,INTERNAL_BUFFER_SIZE*internal_buffer_channels);
- stream_buffer = memnew_arr(int32_t,INTERNAL_BUFFER_SIZE*4); //max 4 channels
+ int latency = GLOBAL_DEF("audio/mixer_latency", 10);
+ internal_buffer_channels = 2; // read from driver
+ internal_buffer = memnew_arr(int32_t, INTERNAL_BUFFER_SIZE * internal_buffer_channels);
+ stream_buffer = memnew_arr(int32_t, INTERNAL_BUFFER_SIZE * 4); //max 4 channels
AudioMixerSW::MixChannels mix_chans = AudioMixerSW::MIX_STEREO;
- switch(AudioDriverSW::get_singleton()->get_output_format()) {
+ switch (AudioDriverSW::get_singleton()->get_output_format()) {
case AudioDriverSW::OUTPUT_MONO:
case AudioDriverSW::OUTPUT_STEREO:
- mix_chans=AudioMixerSW::MIX_STEREO;
+ mix_chans = AudioMixerSW::MIX_STEREO;
break;
case AudioDriverSW::OUTPUT_QUAD:
case AudioDriverSW::OUTPUT_5_1:
- mix_chans=AudioMixerSW::MIX_QUAD;
+ mix_chans = AudioMixerSW::MIX_QUAD;
break;
}
- mixer = memnew( AudioMixerSW( sample_manager, latency, AudioDriverSW::get_singleton()->get_mix_rate(),mix_chans,mixer_use_fx,mixer_interp,_mixer_callback,this ) );
- mixer_step_usecs=mixer->get_step_usecs();
+ mixer = memnew(AudioMixerSW(sample_manager, latency, AudioDriverSW::get_singleton()->get_mix_rate(), mix_chans, mixer_use_fx, mixer_interp, _mixer_callback, this));
+ mixer_step_usecs = mixer->get_step_usecs();
- _output_delay=0;
+ _output_delay = 0;
- stream_volume=0.3;
+ stream_volume = 0.3;
// start the audio driver
if (AudioDriverSW::get_singleton())
AudioDriverSW::get_singleton()->start();
#ifndef NO_THREADS
- exit_update_thread=false;
- thread = Thread::create(_thread_func,this);
+ exit_update_thread = false;
+ thread = Thread::create(_thread_func, this);
#endif
-
}
void AudioServerSW::finish() {
#ifndef NO_THREADS
- exit_update_thread=true;
+ exit_update_thread = true;
Thread::wait_to_finish(thread);
memdelete(thread);
#endif
@@ -827,22 +779,20 @@ void AudioServerSW::finish() {
memdelete_arr(internal_buffer);
memdelete_arr(stream_buffer);
memdelete(mixer);
-
}
void AudioServerSW::_update_streams(bool p_thread) {
_THREAD_SAFE_METHOD_
- for(List<Stream*>::Element *E=active_audio_streams.front();E;) { //stream might be removed durnig this callback
+ for (List<Stream *>::Element *E = active_audio_streams.front(); E;) { //stream might be removed durnig this callback
- List<Stream*>::Element *N=E->next();
+ List<Stream *>::Element *N = E->next();
if (E->get()->audio_stream && p_thread == E->get()->audio_stream->can_update_mt())
E->get()->audio_stream->update();
- E=N;
+ E = N;
}
-
}
void AudioServerSW::update() {
@@ -854,7 +804,6 @@ void AudioServerSW::update() {
#endif
}
-
void AudioServerSW::lock() {
AudioDriverSW::get_singleton()->lock();
@@ -862,7 +811,6 @@ void AudioServerSW::lock() {
void AudioServerSW::unlock() {
AudioDriverSW::get_singleton()->unlock();
-
}
int AudioServerSW::get_default_mix_rate() const {
@@ -875,35 +823,31 @@ int AudioServerSW::get_default_channel_count() const {
void AudioServerSW::set_mixer_params(AudioMixerSW::InterpolationType p_interp, bool p_use_fx) {
- mixer_interp=p_interp;
- mixer_use_fx=p_use_fx;
+ mixer_interp = p_interp;
+ mixer_use_fx = p_use_fx;
}
void AudioServerSW::set_stream_global_volume_scale(float p_volume) {
- stream_volume_scale=p_volume;
+ stream_volume_scale = p_volume;
}
float AudioServerSW::get_stream_global_volume_scale() const {
return stream_volume_scale;
-
-
}
void AudioServerSW::set_fx_global_volume_scale(float p_volume) {
- fx_volume_scale=p_volume;
+ fx_volume_scale = p_volume;
//mixer->set_mixer_volume(fx_volume_scale);
VoiceRBSW::Command cmd;
- cmd.type=VoiceRBSW::Command::CMD_CHANGE_ALL_FX_VOLUMES;
- cmd.voice=RID();
- cmd.volume.volume=p_volume;
+ cmd.type = VoiceRBSW::Command::CMD_CHANGE_ALL_FX_VOLUMES;
+ cmd.voice = RID();
+ cmd.volume.volume = p_volume;
voice_rb.push_command(cmd);
-
}
-
float AudioServerSW::get_fx_global_volume_scale() const {
return fx_volume_scale;
@@ -911,11 +855,10 @@ float AudioServerSW::get_fx_global_volume_scale() const {
void AudioServerSW::set_event_voice_global_volume_scale(float p_volume) {
- event_voice_volume_scale=p_volume;
+ event_voice_volume_scale = p_volume;
//mixer->set_mixer_volume(event_voice_volume_scale);
}
-
float AudioServerSW::get_event_voice_global_volume_scale() const {
return event_voice_volume_scale;
@@ -923,7 +866,7 @@ float AudioServerSW::get_event_voice_global_volume_scale() const {
double AudioServerSW::get_output_delay() const {
- return _output_delay+AudioDriverSW::get_singleton()->get_latency();
+ return _output_delay + AudioDriverSW::get_singleton()->get_latency();
}
double AudioServerSW::get_mix_time() const {
@@ -934,37 +877,33 @@ double AudioServerSW::get_mix_time() const {
uint32_t AudioServerSW::read_output_peak() const {
uint32_t val = max_peak;
- uint32_t *p = (uint32_t*)&max_peak;
- *p=0;
+ uint32_t *p = (uint32_t *)&max_peak;
+ *p = 0;
return val;
}
AudioServerSW::AudioServerSW(SampleManagerSW *p_sample_manager) {
- sample_manager=p_sample_manager;
- String interp = GLOBAL_DEF("audio/mixer_interp","linear");
- Globals::get_singleton()->set_custom_property_info("audio/mixer_interp",PropertyInfo(Variant::STRING,"audio/mixer_interp",PROPERTY_HINT_ENUM,"raw,linear,cubic"));
- if (interp=="raw")
- mixer_interp=AudioMixerSW::INTERPOLATION_RAW;
- else if (interp=="cubic")
- mixer_interp=AudioMixerSW::INTERPOLATION_CUBIC;
+ sample_manager = p_sample_manager;
+ String interp = GLOBAL_DEF("audio/mixer_interp", "linear");
+ Globals::get_singleton()->set_custom_property_info("audio/mixer_interp", PropertyInfo(Variant::STRING, "audio/mixer_interp", PROPERTY_HINT_ENUM, "raw,linear,cubic"));
+ if (interp == "raw")
+ mixer_interp = AudioMixerSW::INTERPOLATION_RAW;
+ else if (interp == "cubic")
+ mixer_interp = AudioMixerSW::INTERPOLATION_CUBIC;
else
- mixer_interp=AudioMixerSW::INTERPOLATION_LINEAR;
- mixer_use_fx = GLOBAL_DEF("audio/use_chorus_reverb",true);
- stream_volume_scale=GLOBAL_DEF("audio/stream_volume_scale",1.0);
- fx_volume_scale=GLOBAL_DEF("audio/fx_volume_scale",1.0);
- event_voice_volume_scale=GLOBAL_DEF("audio/event_voice_volume_scale",0.5);
- max_peak=0;
-
-
+ mixer_interp = AudioMixerSW::INTERPOLATION_LINEAR;
+ mixer_use_fx = GLOBAL_DEF("audio/use_chorus_reverb", true);
+ stream_volume_scale = GLOBAL_DEF("audio/stream_volume_scale", 1.0);
+ fx_volume_scale = GLOBAL_DEF("audio/fx_volume_scale", 1.0);
+ event_voice_volume_scale = GLOBAL_DEF("audio/event_voice_volume_scale", 0.5);
+ max_peak = 0;
}
AudioServerSW::~AudioServerSW() {
-
}
-
-AudioDriverSW *AudioDriverSW::singleton=NULL;
+AudioDriverSW *AudioDriverSW::singleton = NULL;
AudioDriverSW *AudioDriverSW::get_singleton() {
return singleton;
@@ -972,48 +911,43 @@ AudioDriverSW *AudioDriverSW::get_singleton() {
void AudioDriverSW::set_singleton() {
- singleton=this;
+ singleton = this;
}
-void AudioDriverSW::audio_server_process(int p_frames,int32_t *p_buffer,bool p_update_mix_time) {
+void AudioDriverSW::audio_server_process(int p_frames, int32_t *p_buffer, bool p_update_mix_time) {
- AudioServerSW * audio_server = static_cast<AudioServerSW*>(AudioServer::get_singleton());
+ AudioServerSW *audio_server = static_cast<AudioServerSW *>(AudioServer::get_singleton());
if (p_update_mix_time)
update_mix_time(p_frames);
- audio_server->driver_process(p_frames,p_buffer);
+ audio_server->driver_process(p_frames, p_buffer);
}
void AudioDriverSW::update_mix_time(int p_frames) {
- _mix_amount+=p_frames;
- _last_mix_time=OS::get_singleton()->get_ticks_usec();
+ _mix_amount += p_frames;
+ _last_mix_time = OS::get_singleton()->get_ticks_usec();
}
double AudioDriverSW::get_mix_time() const {
double total = (OS::get_singleton()->get_ticks_usec() - _last_mix_time) / 1000000.0;
- total+=_mix_amount/(double)get_mix_rate();
+ total += _mix_amount / (double)get_mix_rate();
return total;
-
}
-
AudioDriverSW::AudioDriverSW() {
- _last_mix_time=0;
- _mix_amount=0;
+ _last_mix_time = 0;
+ _mix_amount = 0;
}
-
AudioDriverSW *AudioDriverManagerSW::drivers[MAX_DRIVERS];
-int AudioDriverManagerSW::driver_count=0;
-
-
+int AudioDriverManagerSW::driver_count = 0;
void AudioDriverManagerSW::add_driver(AudioDriverSW *p_driver) {
- ERR_FAIL_COND(driver_count>=MAX_DRIVERS);
- drivers[driver_count++]=p_driver;
+ ERR_FAIL_COND(driver_count >= MAX_DRIVERS);
+ drivers[driver_count++] = p_driver;
}
int AudioDriverManagerSW::get_driver_count() {
@@ -1022,7 +956,6 @@ int AudioDriverManagerSW::get_driver_count() {
}
AudioDriverSW *AudioDriverManagerSW::get_driver(int p_driver) {
- ERR_FAIL_INDEX_V(p_driver,driver_count,NULL);
+ ERR_FAIL_INDEX_V(p_driver, driver_count, NULL);
return drivers[p_driver];
}
-
diff --git a/servers/audio/audio_server_sw.h b/servers/audio/audio_server_sw.h
index 60af87e6f..2a166395f 100644
--- a/servers/audio/audio_server_sw.h
+++ b/servers/audio/audio_server_sw.h
@@ -29,21 +29,21 @@
#ifndef AUDIO_SERVER_SW_H
#define AUDIO_SERVER_SW_H
-#include "servers/audio_server.h"
+#include "os/thread.h"
+#include "os/thread_safe.h"
+#include "self_list.h"
#include "servers/audio/audio_mixer_sw.h"
#include "servers/audio/voice_rb_sw.h"
-#include "self_list.h"
-#include "os/thread_safe.h"
-#include "os/thread.h"
+#include "servers/audio_server.h"
class AudioServerSW : public AudioServer {
- OBJ_TYPE( AudioServerSW, AudioServer );
+ OBJ_TYPE(AudioServerSW, AudioServer);
_THREAD_SAFE_CLASS_
enum {
- INTERNAL_BUFFER_SIZE=4096,
- STREAM_SCALE_BITS=12
+ INTERNAL_BUFFER_SIZE = 4096,
+ STREAM_SCALE_BITS = 12
};
@@ -60,8 +60,11 @@ class AudioServerSW : public AudioServer {
SelfList<Voice> active_item;
AudioMixer::ChannelID channel;
-
- Voice () : active_item(this) { channel=AudioMixer::INVALID_CHANNEL; active=false;}
+ Voice()
+ : active_item(this) {
+ channel = AudioMixer::INVALID_CHANNEL;
+ active = false;
+ }
};
mutable RID_Owner<Voice> voice_owner;
@@ -69,19 +72,19 @@ class AudioServerSW : public AudioServer {
struct Stream {
bool active;
- List<Stream*>::Element *E;
+ List<Stream *>::Element *E;
AudioStream *audio_stream;
EventStream *event_stream;
float volume_scale;
};
- List<Stream*> active_audio_streams;
+ List<Stream *> active_audio_streams;
//List<Stream*> event_streams;
- int32_t * internal_buffer;
+ int32_t *internal_buffer;
int internal_buffer_channels;
- int32_t * stream_buffer;
+ int32_t *stream_buffer;
mutable RID_Owner<Stream> stream_owner;
@@ -89,7 +92,7 @@ class AudioServerSW : public AudioServer {
float stream_volume_scale;
float fx_volume_scale;
float event_voice_volume_scale;
- float peak_left,peak_right;
+ float peak_left, peak_right;
uint32_t max_peak;
double _output_delay;
@@ -101,43 +104,42 @@ class AudioServerSW : public AudioServer {
static void _thread_func(void *self);
void _update_streams(bool p_thread);
- void driver_process_chunk(int p_frames,int32_t *p_buffer);
+ void driver_process_chunk(int p_frames, int32_t *p_buffer);
AudioMixerSW::InterpolationType mixer_interp;
bool mixer_use_fx;
uint64_t mixer_step_usecs;
static void _mixer_callback(void *p_udata);
-friend class AudioDriverSW;
- void driver_process(int p_frames,int32_t *p_buffer);
-public:
-
+ friend class AudioDriverSW;
+ void driver_process(int p_frames, int32_t *p_buffer);
+public:
/* SAMPLE API */
virtual RID sample_create(SampleFormat p_format, bool p_stereo, int p_length);
- virtual void sample_set_description(RID p_sample, const String& p_description);
+ virtual void sample_set_description(RID p_sample, const String &p_description);
virtual String sample_get_description(RID p_sample) const;
virtual SampleFormat sample_get_format(RID p_sample) const;
virtual bool sample_is_stereo(RID p_sample) const;
virtual int sample_get_length(RID p_sample) const;
- const void* sample_get_data_ptr(RID p_sample) const;
+ const void *sample_get_data_ptr(RID p_sample) const;
- virtual void sample_set_data(RID p_sample, const DVector<uint8_t>& p_buffer);
+ virtual void sample_set_data(RID p_sample, const DVector<uint8_t> &p_buffer);
virtual DVector<uint8_t> sample_get_data(RID p_sample) const;
- virtual void sample_set_mix_rate(RID p_sample,int p_rate);
+ virtual void sample_set_mix_rate(RID p_sample, int p_rate);
virtual int sample_get_mix_rate(RID p_sample) const;
- virtual void sample_set_loop_format(RID p_sample,SampleLoopFormat p_format);
+ virtual void sample_set_loop_format(RID p_sample, SampleLoopFormat p_format);
virtual SampleLoopFormat sample_get_loop_format(RID p_sample) const;
- virtual void sample_set_loop_begin(RID p_sample,int p_pos);
+ virtual void sample_set_loop_begin(RID p_sample, int p_pos);
virtual int sample_get_loop_begin(RID p_sample) const;
- virtual void sample_set_loop_end(RID p_sample,int p_pos);
+ virtual void sample_set_loop_end(RID p_sample, int p_pos);
virtual int sample_get_loop_end(RID p_sample) const;
/* VOICE API */
@@ -147,9 +149,9 @@ public:
virtual void voice_play(RID p_voice, RID p_sample);
virtual void voice_set_volume(RID p_voice, float p_volume);
- virtual void voice_set_pan(RID p_voice, float p_pan, float p_depth=0,float height=0); //pan and depth go from -1 to 1
- virtual void voice_set_filter(RID p_voice, FilterType p_type, float p_cutoff, float p_resonance,float p_gain=0);
- virtual void voice_set_chorus(RID p_voice, float p_chorus );
+ virtual void voice_set_pan(RID p_voice, float p_pan, float p_depth = 0, float height = 0); //pan and depth go from -1 to 1
+ virtual void voice_set_filter(RID p_voice, FilterType p_type, float p_cutoff, float p_resonance, float p_gain = 0);
+ virtual void voice_set_chorus(RID p_voice, float p_chorus);
virtual void voice_set_reverb(RID p_voice, ReverbRoomType p_room_type, float p_reverb);
virtual void voice_set_mix_rate(RID p_voice, int p_mix_rate);
virtual void voice_set_positional(RID p_voice, bool p_positional);
@@ -199,7 +201,6 @@ public:
virtual void set_fx_global_volume_scale(float p_volume);
virtual void set_event_voice_global_volume_scale(float p_volume);
-
virtual float get_stream_global_volume_scale() const;
virtual float get_fx_global_volume_scale() const;
virtual float get_event_voice_global_volume_scale() const;
@@ -210,29 +211,21 @@ public:
virtual double get_output_delay() const;
-
AudioServerSW(SampleManagerSW *p_sample_manager);
~AudioServerSW();
-
};
-
class AudioDriverSW {
-
static AudioDriverSW *singleton;
uint64_t _last_mix_time;
uint64_t _mix_amount;
-
protected:
-
- void audio_server_process(int p_frames,int32_t *p_buffer,bool p_update_mix_time=true);
+ void audio_server_process(int p_frames, int32_t *p_buffer, bool p_update_mix_time = true);
void update_mix_time(int p_frames);
public:
-
-
double get_mix_time() const; //useful for video -> audio sync
enum OutputFormat {
@@ -246,38 +239,33 @@ public:
static AudioDriverSW *get_singleton();
void set_singleton();
- virtual const char* get_name() const=0;
+ virtual const char *get_name() const = 0;
- virtual Error init()=0;
- virtual void start()=0;
- virtual int get_mix_rate() const =0;
- virtual OutputFormat get_output_format() const=0;
- virtual void lock()=0;
- virtual void unlock()=0;
- virtual void finish()=0;
+ virtual Error init() = 0;
+ virtual void start() = 0;
+ virtual int get_mix_rate() const = 0;
+ virtual OutputFormat get_output_format() const = 0;
+ virtual void lock() = 0;
+ virtual void unlock() = 0;
+ virtual void finish() = 0;
virtual float get_latency() { return 0; }
-
-
-
AudioDriverSW();
- virtual ~AudioDriverSW() {};
+ virtual ~AudioDriverSW(){};
};
-
-
class AudioDriverManagerSW {
enum {
- MAX_DRIVERS=10
+ MAX_DRIVERS = 10
};
static AudioDriverSW *drivers[MAX_DRIVERS];
static int driver_count;
-public:
+public:
static void add_driver(AudioDriverSW *p_driver);
static int get_driver_count();
static AudioDriverSW *get_driver(int p_driver);
diff --git a/servers/audio/reverb_sw.cpp b/servers/audio/reverb_sw.cpp
index 0050dbede..c00a91d24 100644
--- a/servers/audio/reverb_sw.cpp
+++ b/servers/audio/reverb_sw.cpp
@@ -27,223 +27,217 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include "reverb_sw.h"
-#include "stdlib.h"
#include "print_string.h"
-#define SETMIN( x, y ) (x) = MIN ( (x), (y) )
-#define rangeloop( c, min, max ) \
- for ( (c) = (min) ; (c) < (max) ; (c)++ )
-
-#define ABSDIFF(x, y)\
- ( ((x) < (y)) ? ((y) - (x)) : ((x) - (y)) )
+#include "stdlib.h"
+#define SETMIN(x, y) (x) = MIN((x), (y))
+#define rangeloop(c, min, max) \
+ for ((c) = (min); (c) < (max); (c)++)
+#define ABSDIFF(x, y) \
+ (((x) < (y)) ? ((y) - (x)) : ((x) - (y)))
#ifdef bleh_MSC_VER
#if _MSC_VER >= 1400
- _FORCE_INLINE_ int32_tMULSHIFT_S32 (
+_FORCE_INLINE_ int32_tMULSHIFT_S32(
int32_t Factor1,
int32_t Factor2,
- uint8_t Bits
- ) {
+ uint8_t Bits) {
- return __ll_rshift (
- __emul ( Factor1, Factor2 ),
- Bits
- );
- }
+ return __ll_rshift(
+ __emul(Factor1, Factor2),
+ Bits);
+}
#endif
#else
-#define MULSHIFT_S32( Factor1, Factor2, Bits )\
- ( (int) (( (int64_t)(Factor1) * (Factor2) ) >> (Bits)) )
+#define MULSHIFT_S32(Factor1, Factor2, Bits) \
+ ((int)(((int64_t)(Factor1) * (Factor2)) >> (Bits)))
#endif
-
-
struct ReverbParamsSW {
- unsigned int BufferSize; // Required buffer size
- int gLPF; // Coefficient
- int gEcho0; // Coefficient
- int gEcho1; // Coefficient
- int gEcho2; // Coefficient
- int gEcho3; // Coefficient
- int gWall; // Coefficient
- int gReva; // Coefficient
- int gRevb; // Coefficient
- int gInputL; // Coefficient
- int gInputR; // Coefficient
- unsigned int nRevaOldL; // Offset
- unsigned int nRevaOldR; // Offset
- unsigned int nRevbOldL; // Offset
- unsigned int nRevbOldR; // Offset
- unsigned int nLwlNew; // Offset
- unsigned int nRwrNew; // Offset
- unsigned int nEcho0L; // Offset
- unsigned int nEcho0R; // Offset
- unsigned int nEcho1L; // Offset
- unsigned int nEcho1R; // Offset
- unsigned int nLwlOld; // Offset
- unsigned int nRwrOld; // Offset
- unsigned int nLwrNew; // Offset
- unsigned int nRwlNew; // Offset
- unsigned int nEcho2L; // Offset
- unsigned int nEcho2R; // Offset
- unsigned int nEcho3L; // Offset
- unsigned int nEcho3R; // Offset
- unsigned int nLwrOld; // Offset
- unsigned int nRwlOld; // Offset
- unsigned int nRevaNewL; // Offset
- unsigned int nRevaNewR; // Offset
- unsigned int nRevbNewL; // Offset
- unsigned int nRevbNewR; // Offset
+ unsigned int BufferSize; // Required buffer size
+ int gLPF; // Coefficient
+ int gEcho0; // Coefficient
+ int gEcho1; // Coefficient
+ int gEcho2; // Coefficient
+ int gEcho3; // Coefficient
+ int gWall; // Coefficient
+ int gReva; // Coefficient
+ int gRevb; // Coefficient
+ int gInputL; // Coefficient
+ int gInputR; // Coefficient
+ unsigned int nRevaOldL; // Offset
+ unsigned int nRevaOldR; // Offset
+ unsigned int nRevbOldL; // Offset
+ unsigned int nRevbOldR; // Offset
+ unsigned int nLwlNew; // Offset
+ unsigned int nRwrNew; // Offset
+ unsigned int nEcho0L; // Offset
+ unsigned int nEcho0R; // Offset
+ unsigned int nEcho1L; // Offset
+ unsigned int nEcho1R; // Offset
+ unsigned int nLwlOld; // Offset
+ unsigned int nRwrOld; // Offset
+ unsigned int nLwrNew; // Offset
+ unsigned int nRwlNew; // Offset
+ unsigned int nEcho2L; // Offset
+ unsigned int nEcho2R; // Offset
+ unsigned int nEcho3L; // Offset
+ unsigned int nEcho3R; // Offset
+ unsigned int nLwrOld; // Offset
+ unsigned int nRwlOld; // Offset
+ unsigned int nRevaNewL; // Offset
+ unsigned int nRevaNewR; // Offset
+ unsigned int nRevbNewL; // Offset
+ unsigned int nRevbNewR; // Offset
};
static ReverbParamsSW reverb_params_Room = {
- 0x26C0/2,
-// gLPF gEcho0 gEcho1 gEcho2 gEcho3 gWall
- 0x6D80, 0x54B8, -0x4130, 0x0000, 0x0000, -0x4580,
-// gReva gRevb gInputL gInputR
- 0x5800, 0x5300, -0x8000, -0x8000,
-// nRevaOldL nRevaOldR nRevbOldL nRevbOldR
- 0x01B4 - 0x007D, 0x0136 - 0x007D, 0x00B8 - 0x005B, 0x005C - 0x005B,
-// nLwlNew nRwrNew nEcho0L nEcho0R nEcho1L nEcho1R
- 0x04D6, 0x0333, 0x03F0, 0x0227, 0x0374, 0x01EF,
-// nLwlOld nRwrOld nLwrNew nRwlNew nEcho2L nEcho2R nEcho3L nEcho3R
- 0x0334, 0x01B5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
-// nLwrOld nRwlOld nRevaNewL nRevaNewR nRevbNewL nRevbNewR
- 0x0000, 0x0000, 0x01B4, 0x0136, 0x00B8, 0x005C
+ 0x26C0 / 2,
+ // gLPF gEcho0 gEcho1 gEcho2 gEcho3 gWall
+ 0x6D80, 0x54B8, -0x4130, 0x0000, 0x0000, -0x4580,
+ // gReva gRevb gInputL gInputR
+ 0x5800, 0x5300, -0x8000, -0x8000,
+ // nRevaOldL nRevaOldR nRevbOldL nRevbOldR
+ 0x01B4 - 0x007D, 0x0136 - 0x007D, 0x00B8 - 0x005B, 0x005C - 0x005B,
+ // nLwlNew nRwrNew nEcho0L nEcho0R nEcho1L nEcho1R
+ 0x04D6, 0x0333, 0x03F0, 0x0227, 0x0374, 0x01EF,
+ // nLwlOld nRwrOld nLwrNew nRwlNew nEcho2L nEcho2R nEcho3L nEcho3R
+ 0x0334, 0x01B5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // nLwrOld nRwlOld nRevaNewL nRevaNewR nRevbNewL nRevbNewR
+ 0x0000, 0x0000, 0x01B4, 0x0136, 0x00B8, 0x005C
};
static ReverbParamsSW reverb_params_StudioSmall = {
- 0x1F40/2,
-// gLPF gEcho0 gEcho1 gEcho2 gEcho3 gWall
- 0x70F0, 0x4FA8, -0x4320, 0x4410, -0x3F10, -0x6400,
-// gReva gRevb gInputL gInputR
- 0x5280, 0x4EC0, -0x8000, -0x8000,
-// nRevaOldL nRevaOldR nRevbOldL nRevbOldR
- 0x00B4 - 0x0033, 0x0080 - 0x0033, 0x004C - 0x0025, 0x0026 - 0x0025,
-// nLwlNew nRwrNew nEcho0L nEcho0R nEcho1L nEcho1R
- 0x03E4, 0x031B, 0x03A4, 0x02AF, 0x0372, 0x0266,
-// nLwlOld nRwrOld nLwrNew nRwlNew nEcho2L nEcho2R nEcho3L nEcho3R
- 0x031C, 0x025D, 0x025C, 0x018E, 0x022F, 0x0135, 0x01D2, 0x00B7,
-// nLwrOld nRwlOld nRevaNewL nRevaNewR nRevbNewL nRevbNewR
- 0x018F, 0x00B5, 0x00B4, 0x0080, 0x004C, 0x0026
+ 0x1F40 / 2,
+ // gLPF gEcho0 gEcho1 gEcho2 gEcho3 gWall
+ 0x70F0, 0x4FA8, -0x4320, 0x4410, -0x3F10, -0x6400,
+ // gReva gRevb gInputL gInputR
+ 0x5280, 0x4EC0, -0x8000, -0x8000,
+ // nRevaOldL nRevaOldR nRevbOldL nRevbOldR
+ 0x00B4 - 0x0033, 0x0080 - 0x0033, 0x004C - 0x0025, 0x0026 - 0x0025,
+ // nLwlNew nRwrNew nEcho0L nEcho0R nEcho1L nEcho1R
+ 0x03E4, 0x031B, 0x03A4, 0x02AF, 0x0372, 0x0266,
+ // nLwlOld nRwrOld nLwrNew nRwlNew nEcho2L nEcho2R nEcho3L nEcho3R
+ 0x031C, 0x025D, 0x025C, 0x018E, 0x022F, 0x0135, 0x01D2, 0x00B7,
+ // nLwrOld nRwlOld nRevaNewL nRevaNewR nRevbNewL nRevbNewR
+ 0x018F, 0x00B5, 0x00B4, 0x0080, 0x004C, 0x0026
};
static ReverbParamsSW reverb_params_StudioMedium = {
- 0x4840/2,
-// gLPF gEcho0 gEcho1 gEcho2 gEcho3 gWall
- 0x70F0, 0x4FA8, -0x4320, 0x4510, -0x4110, -0x4B40,
-// gReva gRevb gInputL gInputR
- 0x5280, 0x4EC0, -0x8000, -0x8000,
-// nRevaOldL nRevaOldR nRevbOldL nRevbOldR
- 0x0264 - 0x00B1, 0x01B2 - 0x00B1, 0x0100 - 0x007F, 0x0080 - 0x007F,
-// nLwlNew nRwrNew nEcho0L nEcho0R nEcho1L nEcho1R
- 0x0904, 0x076B, 0x0824, 0x065F, 0x07A2, 0x0616,
-// nLwlOld nRwrOld nLwrNew nRwlNew nEcho2L nEcho2R nEcho3L nEcho3R
- 0x076C, 0x05ED, 0x05EC, 0x042E, 0x050F, 0x0305, 0x0462, 0x02B7,
-// nLwrOld nRwlOld nRevaNewL nRevaNewR nRevbNewL nRevbNewR
- 0x042F, 0x0265, 0x0264, 0x01B2, 0x0100, 0x0080
+ 0x4840 / 2,
+ // gLPF gEcho0 gEcho1 gEcho2 gEcho3 gWall
+ 0x70F0, 0x4FA8, -0x4320, 0x4510, -0x4110, -0x4B40,
+ // gReva gRevb gInputL gInputR
+ 0x5280, 0x4EC0, -0x8000, -0x8000,
+ // nRevaOldL nRevaOldR nRevbOldL nRevbOldR
+ 0x0264 - 0x00B1, 0x01B2 - 0x00B1, 0x0100 - 0x007F, 0x0080 - 0x007F,
+ // nLwlNew nRwrNew nEcho0L nEcho0R nEcho1L nEcho1R
+ 0x0904, 0x076B, 0x0824, 0x065F, 0x07A2, 0x0616,
+ // nLwlOld nRwrOld nLwrNew nRwlNew nEcho2L nEcho2R nEcho3L nEcho3R
+ 0x076C, 0x05ED, 0x05EC, 0x042E, 0x050F, 0x0305, 0x0462, 0x02B7,
+ // nLwrOld nRwlOld nRevaNewL nRevaNewR nRevbNewL nRevbNewR
+ 0x042F, 0x0265, 0x0264, 0x01B2, 0x0100, 0x0080
};
static ReverbParamsSW reverb_params_StudioLarge = {
- 0x6FE0/2,
-// gLPF gEcho0 gEcho1 gEcho2 gEcho3 gWall
- 0x6F60, 0x4FA8, -0x4320, 0x4510, -0x4110, -0x5980,
-// gReva gRevb gInputL gInputR
- 0x5680, 0x52C0, -0x8000, -0x8000,
-// nRevaOldL nRevaOldR nRevbOldL nRevbOldR
- 0x031C - 0x00E3, 0x0238 - 0x00E3, 0x0154 - 0x00A9, 0x00AA - 0x00A9,
-// nLwlNew nRwrNew nEcho0L nEcho0R nEcho1L nEcho1R
- 0x0DFB, 0x0B58, 0x0D09, 0x0A3C, 0x0BD9, 0x0973,
-// nLwlOld nRwrOld nLwrNew nRwlNew nEcho2L nEcho2R nEcho3L nEcho3R
- 0x0B59, 0x08DA, 0x08D9, 0x05E9, 0x07EC, 0x04B0, 0x06EF, 0x03D2,
-// nLwrOld nRwlOld nRevaNewL nRevaNewR nRevbNewL nRevbNewR
- 0x05EA, 0x031D, 0x031C, 0x0238, 0x0154, 0x00AA
+ 0x6FE0 / 2,
+ // gLPF gEcho0 gEcho1 gEcho2 gEcho3 gWall
+ 0x6F60, 0x4FA8, -0x4320, 0x4510, -0x4110, -0x5980,
+ // gReva gRevb gInputL gInputR
+ 0x5680, 0x52C0, -0x8000, -0x8000,
+ // nRevaOldL nRevaOldR nRevbOldL nRevbOldR
+ 0x031C - 0x00E3, 0x0238 - 0x00E3, 0x0154 - 0x00A9, 0x00AA - 0x00A9,
+ // nLwlNew nRwrNew nEcho0L nEcho0R nEcho1L nEcho1R
+ 0x0DFB, 0x0B58, 0x0D09, 0x0A3C, 0x0BD9, 0x0973,
+ // nLwlOld nRwrOld nLwrNew nRwlNew nEcho2L nEcho2R nEcho3L nEcho3R
+ 0x0B59, 0x08DA, 0x08D9, 0x05E9, 0x07EC, 0x04B0, 0x06EF, 0x03D2,
+ // nLwrOld nRwlOld nRevaNewL nRevaNewR nRevbNewL nRevbNewR
+ 0x05EA, 0x031D, 0x031C, 0x0238, 0x0154, 0x00AA
};
static ReverbParamsSW reverb_params_Hall = {
- 0xADE0/2,
-// gLPF gEcho0 gEcho1 gEcho2 gEcho3 gWall
- 0x6000, 0x5000, 0x4C00, -0x4800, -0x4400, -0x4000,
-// gReva gRevb gInputL gInputR
- 0x6000, 0x5C00, -0x8000, -0x8000,
-// nRevaOldL nRevaOldR nRevbOldL nRevbOldR
- 0x05C0 - 0x01A5, 0x041A - 0x01A5, 0x0274 - 0x0139, 0x013A - 0x0139,
-// nLwlNew nRwrNew nEcho0L nEcho0R nEcho1L nEcho1R
- 0x15BA, 0x11BB, 0x14C2, 0x10BD, 0x11BC, 0x0DC1,
-// nLwlOld nRwrOld nLwrNew nRwlNew nEcho2L nEcho2R nEcho3L nEcho3R
- 0x11C0, 0x0DC3, 0x0DC0, 0x09C1, 0x0BC4, 0x07C1, 0x0A00, 0x06CD,
-// nLwrOld nRwlOld nRevaNewL nRevaNewR nRevbNewL nRevbNewR
- 0x09C2, 0x05C1, 0x05C0, 0x041A, 0x0274, 0x013A
+ 0xADE0 / 2,
+ // gLPF gEcho0 gEcho1 gEcho2 gEcho3 gWall
+ 0x6000, 0x5000, 0x4C00, -0x4800, -0x4400, -0x4000,
+ // gReva gRevb gInputL gInputR
+ 0x6000, 0x5C00, -0x8000, -0x8000,
+ // nRevaOldL nRevaOldR nRevbOldL nRevbOldR
+ 0x05C0 - 0x01A5, 0x041A - 0x01A5, 0x0274 - 0x0139, 0x013A - 0x0139,
+ // nLwlNew nRwrNew nEcho0L nEcho0R nEcho1L nEcho1R
+ 0x15BA, 0x11BB, 0x14C2, 0x10BD, 0x11BC, 0x0DC1,
+ // nLwlOld nRwrOld nLwrNew nRwlNew nEcho2L nEcho2R nEcho3L nEcho3R
+ 0x11C0, 0x0DC3, 0x0DC0, 0x09C1, 0x0BC4, 0x07C1, 0x0A00, 0x06CD,
+ // nLwrOld nRwlOld nRevaNewL nRevaNewR nRevbNewL nRevbNewR
+ 0x09C2, 0x05C1, 0x05C0, 0x041A, 0x0274, 0x013A
};
static ReverbParamsSW reverb_params_SpaceEcho = {
- 0xF6C0/2,
-// gLPF gEcho0 gEcho1 gEcho2 gEcho3 gWall
- 0x7E00, 0x5000, -0x4C00, -0x5000, 0x4C00, -0x5000,
-// gReva gRevb gInputL gInputR
- 0x6000, 0x5400, -0x8000, -0x8000,
-// nRevaOldL nRevaOldR nRevbOldL nRevbOldR
- 0x0AE0 - 0x033D, 0x07A2 - 0x033D, 0x0464 - 0x0231, 0x0232 - 0x0231,
-// nLwlNew nRwrNew nEcho0L nEcho0R nEcho1L nEcho1R
- 0x1ED6, 0x1A31, 0x1D14, 0x183B, 0x1BC2, 0x16B2,
-// nLwlOld nRwrOld nLwrNew nRwlNew nEcho2L nEcho2R nEcho3L nEcho3R
- 0x1A32, 0x15EF, 0x15EE, 0x1055, 0x1334, 0x0F2D, 0x11F6, 0x0C5D,
-// nLwrOld nRwlOld nRevaNewL nRevaNewR nRevbNewL nRevbNewR
- 0x1056, 0x0AE1, 0x0AE0, 0x07A2, 0x0464, 0x0232
+ 0xF6C0 / 2,
+ // gLPF gEcho0 gEcho1 gEcho2 gEcho3 gWall
+ 0x7E00, 0x5000, -0x4C00, -0x5000, 0x4C00, -0x5000,
+ // gReva gRevb gInputL gInputR
+ 0x6000, 0x5400, -0x8000, -0x8000,
+ // nRevaOldL nRevaOldR nRevbOldL nRevbOldR
+ 0x0AE0 - 0x033D, 0x07A2 - 0x033D, 0x0464 - 0x0231, 0x0232 - 0x0231,
+ // nLwlNew nRwrNew nEcho0L nEcho0R nEcho1L nEcho1R
+ 0x1ED6, 0x1A31, 0x1D14, 0x183B, 0x1BC2, 0x16B2,
+ // nLwlOld nRwrOld nLwrNew nRwlNew nEcho2L nEcho2R nEcho3L nEcho3R
+ 0x1A32, 0x15EF, 0x15EE, 0x1055, 0x1334, 0x0F2D, 0x11F6, 0x0C5D,
+ // nLwrOld nRwlOld nRevaNewL nRevaNewR nRevbNewL nRevbNewR
+ 0x1056, 0x0AE1, 0x0AE0, 0x07A2, 0x0464, 0x0232
};
static ReverbParamsSW reverb_params_Echo = {
- 0x18040/2,
-// gLPF gEcho0 gEcho1 gEcho2 gEcho3 gWall
- 0x7FFF, 0x7FFF, 0x0000, 0x0000, 0x0000, -0x7F00,
-// gReva gRevb gInputL gInputR
- 0x0000, 0x0000, -0x8000, -0x8000,
-// nRevaOldL nRevaOldR nRevbOldL nRevbOldR
- 0x1004 - 0x0001, 0x1002 - 0x0001, 0x0004 - 0x0001, 0x0002 - 0x0001,
-// nLwlNew nRwrNew nEcho0L nEcho0R nEcho1L nEcho1R
- 0x1FFF, 0x0FFF, 0x1005, 0x0005, 0x0000, 0x0000,
-// nLwlOld nRwrOld nLwrNew nRwlNew nEcho2L nEcho2R nEcho3L nEcho3R
- 0x1005, 0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
-// nLwrOld nRwlOld nRevaNewL nRevaNewR nRevbNewL nRevbNewR
- 0x0000, 0x0000, 0x1004, 0x1002, 0x0004, 0x0002
+ 0x18040 / 2,
+ // gLPF gEcho0 gEcho1 gEcho2 gEcho3 gWall
+ 0x7FFF, 0x7FFF, 0x0000, 0x0000, 0x0000, -0x7F00,
+ // gReva gRevb gInputL gInputR
+ 0x0000, 0x0000, -0x8000, -0x8000,
+ // nRevaOldL nRevaOldR nRevbOldL nRevbOldR
+ 0x1004 - 0x0001, 0x1002 - 0x0001, 0x0004 - 0x0001, 0x0002 - 0x0001,
+ // nLwlNew nRwrNew nEcho0L nEcho0R nEcho1L nEcho1R
+ 0x1FFF, 0x0FFF, 0x1005, 0x0005, 0x0000, 0x0000,
+ // nLwlOld nRwrOld nLwrNew nRwlNew nEcho2L nEcho2R nEcho3L nEcho3R
+ 0x1005, 0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // nLwrOld nRwlOld nRevaNewL nRevaNewR nRevbNewL nRevbNewR
+ 0x0000, 0x0000, 0x1004, 0x1002, 0x0004, 0x0002
};
static ReverbParamsSW reverb_params_Delay = {
- 0x18040/2,
-// gLPF gEcho0 gEcho1 gEcho2 gEcho3 gWall
- 0x7FFF, 0x7FFF, 0x0000, 0x0000, 0x0000, 0x0000,
-// gReva gRevb gInputL gInputR
- 0x0000, 0x0000, -0x8000, -0x8000,
-// nRevaOldL nRevaOldR nRevbOldL nRevbOldR
- 0x1004 - 0x0001, 0x1002 - 0x0001, 0x0004 - 0x0001, 0x0002 - 0x0001,
-// nLwlNew nRwrNew nEcho0L nEcho0R nEcho1L nEcho1R
- 0x1FFF, 0x0FFF, 0x1005, 0x0005, 0x0000, 0x0000,
-// nLwlOld nRwrOld nLwrNew nRwlNew nEcho2L nEcho2R nEcho3L nEcho3R
- 0x1005, 0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
-// nLwrOld nRwlOld nRevaNewL nRevaNewR nRevbNewL nRevbNewR
- 0x0000, 0x0000, 0x1004, 0x1002, 0x0004, 0x0002
+ 0x18040 / 2,
+ // gLPF gEcho0 gEcho1 gEcho2 gEcho3 gWall
+ 0x7FFF, 0x7FFF, 0x0000, 0x0000, 0x0000, 0x0000,
+ // gReva gRevb gInputL gInputR
+ 0x0000, 0x0000, -0x8000, -0x8000,
+ // nRevaOldL nRevaOldR nRevbOldL nRevbOldR
+ 0x1004 - 0x0001, 0x1002 - 0x0001, 0x0004 - 0x0001, 0x0002 - 0x0001,
+ // nLwlNew nRwrNew nEcho0L nEcho0R nEcho1L nEcho1R
+ 0x1FFF, 0x0FFF, 0x1005, 0x0005, 0x0000, 0x0000,
+ // nLwlOld nRwrOld nLwrNew nRwlNew nEcho2L nEcho2R nEcho3L nEcho3R
+ 0x1005, 0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // nLwrOld nRwlOld nRevaNewL nRevaNewR nRevbNewL nRevbNewR
+ 0x0000, 0x0000, 0x1004, 0x1002, 0x0004, 0x0002
};
static ReverbParamsSW reverb_params_HalfEcho = {
- 0x3C00/2,
-// gLPF gEcho0 gEcho1 gEcho2 gEcho3 gWall
- 0x70F0, 0x4FA8, -0x4320, 0x4510, -0x4110, -0x7B00,
-// gReva gRevb gInputL gInputR
- 0x5F80, 0x54C0, -0x8000, -0x8000,
-// nRevaOldL nRevaOldR nRevbOldL nRevbOldR
- 0x0058 - 0x0017, 0x0040 - 0x0017, 0x0028 - 0x0013, 0x0014 - 0x0013,
-// nLwlNew nRwrNew nEcho0L nEcho0R nEcho1L nEcho1R
- 0x0371, 0x02AF, 0x02E5, 0x01DF, 0x02B0, 0x01D7,
-// nLwlOld nRwrOld nLwrNew nRwlNew nEcho2L nEcho2R nEcho3L nEcho3R
- 0x0358, 0x026A, 0x01D6, 0x011E, 0x012D, 0x00B1, 0x011F, 0x0059,
-// nLwrOld nRwlOld nRevaNewL nRevaNewR nRevbNewL nRevbNewR
- 0x01A0, 0x00E3, 0x0058, 0x0040, 0x0028, 0x0014
+ 0x3C00 / 2,
+ // gLPF gEcho0 gEcho1 gEcho2 gEcho3 gWall
+ 0x70F0, 0x4FA8, -0x4320, 0x4510, -0x4110, -0x7B00,
+ // gReva gRevb gInputL gInputR
+ 0x5F80, 0x54C0, -0x8000, -0x8000,
+ // nRevaOldL nRevaOldR nRevbOldL nRevbOldR
+ 0x0058 - 0x0017, 0x0040 - 0x0017, 0x0028 - 0x0013, 0x0014 - 0x0013,
+ // nLwlNew nRwrNew nEcho0L nEcho0R nEcho1L nEcho1R
+ 0x0371, 0x02AF, 0x02E5, 0x01DF, 0x02B0, 0x01D7,
+ // nLwlOld nRwrOld nLwrNew nRwlNew nEcho2L nEcho2R nEcho3L nEcho3R
+ 0x0358, 0x026A, 0x01D6, 0x011E, 0x012D, 0x00B1, 0x011F, 0x0059,
+ // nLwrOld nRwlOld nRevaNewL nRevaNewR nRevbNewL nRevbNewR
+ 0x01A0, 0x00E3, 0x0058, 0x0040, 0x0028, 0x0014
};
-
-static ReverbParamsSW * reverb_param_modes[] = {
+static ReverbParamsSW *reverb_param_modes[] = {
&reverb_params_Room,
&reverb_params_StudioSmall,
&reverb_params_StudioMedium,
@@ -255,25 +249,24 @@ static ReverbParamsSW * reverb_param_modes[] = {
&reverb_params_HalfEcho,
};
-bool ReverbSW::process(int *p_input,int *p_output,int p_frames,int p_stereo_stride) {
+bool ReverbSW::process(int *p_input, int *p_output, int p_frames, int p_stereo_stride) {
if (!reverb_buffer)
return false;
+//
+// p_input must point to a non-looping buffer.
+// BOTH p_input and p_output must be touched (use ClearModuleBuffer).
- //
- // p_input must point to a non-looping buffer.
- // BOTH p_input and p_output must be touched (use ClearModuleBuffer).
-
- // �������LOCAL MACROS ������۲
+// �������LOCAL MACROS ������۲
#undef LM_SETSRCOFFSET
-#define LM_SETSRCOFFSET(x) \
- (x) = current_params->x + Offset; \
- if ( (x) >= reverb_buffer_size ) { \
- (x) -= reverb_buffer_size; \
- } \
- SETMIN ( aSample, reverb_buffer_size - (x) );
+#define LM_SETSRCOFFSET(x) \
+ (x) = current_params->x + Offset; \
+ if ((x) >= reverb_buffer_size) { \
+ (x) -= reverb_buffer_size; \
+ } \
+ SETMIN(aSample, reverb_buffer_size - (x));
/*
#undef LM_SETSRCOFFSET2
@@ -286,35 +279,34 @@ bool ReverbSW::process(int *p_input,int *p_output,int p_frames,int p_stereo_stri
SETMIN ( aSample, reverb_buffer_size - (x) );
*/
#undef LM_SRCADVANCE
-#define LM_SRCADVANCE(x) \
- (x) += aSample;
+#define LM_SRCADVANCE(x) \
+ (x) += aSample;
#undef LM_MUL
-#define LM_MUL(x,y) \
-MULSHIFT_S32 ( x, current_params->y, 15 )
+#define LM_MUL(x, y) \
+ MULSHIFT_S32(x, current_params->y, 15)
#undef LM_REVERB
-#define LM_REVERB(x) reverb_buffer[ (x) + cSample ]
+#define LM_REVERB(x) reverb_buffer[(x) + cSample]
// �������LOCAL VARIABLES ������۲
unsigned int Offset;
int lwl, lwr, rwl, rwr;
-// unsigned char HZShift;
+ // unsigned char HZShift;
// �������CODE ������۲
-
lwl = state.lwl;
lwr = state.lwr;
rwl = state.rwl;
rwr = state.rwr;
Offset = state.Offset;
- int max=0;
+ int max = 0;
- while ( p_frames ) {
+ while (p_frames) {
// Offsets
@@ -354,109 +346,110 @@ MULSHIFT_S32 ( x, current_params->y, 15 )
// Set initial offsets
- LM_SETSRCOFFSET ( nLwlOld );
- LM_SETSRCOFFSET ( nRwrOld );
- LM_SETSRCOFFSET ( nLwlNew );
- LM_SETSRCOFFSET ( nRwrNew );
- LM_SETSRCOFFSET ( nLwrOld );
- LM_SETSRCOFFSET ( nRwlOld );
- LM_SETSRCOFFSET ( nLwrNew );
- LM_SETSRCOFFSET ( nRwlNew );
- LM_SETSRCOFFSET ( nEcho0L );
- LM_SETSRCOFFSET ( nEcho1L );
- LM_SETSRCOFFSET ( nEcho2L );
- LM_SETSRCOFFSET ( nEcho3L );
- LM_SETSRCOFFSET ( nEcho0R );
- LM_SETSRCOFFSET ( nEcho1R );
- LM_SETSRCOFFSET ( nEcho2R );
- LM_SETSRCOFFSET ( nEcho3R );
- LM_SETSRCOFFSET ( nRevaOldL );
- LM_SETSRCOFFSET ( nRevaOldR );
- LM_SETSRCOFFSET ( nRevbOldL );
- LM_SETSRCOFFSET ( nRevbOldR );
- LM_SETSRCOFFSET ( nRevaNewL );
- LM_SETSRCOFFSET ( nRevaNewR );
- LM_SETSRCOFFSET ( nRevbNewL );
- LM_SETSRCOFFSET ( nRevbNewR );
+ LM_SETSRCOFFSET(nLwlOld);
+ LM_SETSRCOFFSET(nRwrOld);
+ LM_SETSRCOFFSET(nLwlNew);
+ LM_SETSRCOFFSET(nRwrNew);
+ LM_SETSRCOFFSET(nLwrOld);
+ LM_SETSRCOFFSET(nRwlOld);
+ LM_SETSRCOFFSET(nLwrNew);
+ LM_SETSRCOFFSET(nRwlNew);
+ LM_SETSRCOFFSET(nEcho0L);
+ LM_SETSRCOFFSET(nEcho1L);
+ LM_SETSRCOFFSET(nEcho2L);
+ LM_SETSRCOFFSET(nEcho3L);
+ LM_SETSRCOFFSET(nEcho0R);
+ LM_SETSRCOFFSET(nEcho1R);
+ LM_SETSRCOFFSET(nEcho2R);
+ LM_SETSRCOFFSET(nEcho3R);
+ LM_SETSRCOFFSET(nRevaOldL);
+ LM_SETSRCOFFSET(nRevaOldR);
+ LM_SETSRCOFFSET(nRevbOldL);
+ LM_SETSRCOFFSET(nRevbOldR);
+ LM_SETSRCOFFSET(nRevaNewL);
+ LM_SETSRCOFFSET(nRevaNewR);
+ LM_SETSRCOFFSET(nRevbNewL);
+ LM_SETSRCOFFSET(nRevbNewR);
//SETMIN ( aSample, p_output.Size - p_output.Offset );
- for (unsigned int cSample=0;cSample<aSample;cSample++) {
+ for (unsigned int cSample = 0; cSample < aSample; cSample++) {
int tempL0, tempL1, tempR0, tempR1;
- tempL1 = p_input[(cSample<<p_stereo_stride)]>>8;
- tempR1 = p_input[(cSample<<p_stereo_stride) + 1]>>8;
+ tempL1 = p_input[(cSample << p_stereo_stride)] >> 8;
+ tempR1 = p_input[(cSample << p_stereo_stride) + 1] >> 8;
- tempL0 = LM_MUL ( tempL1, gInputL );
- tempR0 = LM_MUL ( tempR1, gInputR );
+ tempL0 = LM_MUL(tempL1, gInputL);
+ tempR0 = LM_MUL(tempR1, gInputR);
/*
Left -> Wall -> Left Reflection
*/
- tempL1 = tempL0 + LM_MUL ( LM_REVERB( nLwlOld ), gWall );
- tempR1 = tempR0 + LM_MUL ( LM_REVERB( nRwrOld ), gWall );
- lwl += LM_MUL ( tempL1 - lwl, gLPF );
- rwr += LM_MUL ( tempR1 - rwr, gLPF );
- LM_REVERB( nLwlNew ) = lwl;
- LM_REVERB( nRwrNew ) = rwr;
+ tempL1 = tempL0 + LM_MUL(LM_REVERB(nLwlOld), gWall);
+ tempR1 = tempR0 + LM_MUL(LM_REVERB(nRwrOld), gWall);
+ lwl += LM_MUL(tempL1 - lwl, gLPF);
+ rwr += LM_MUL(tempR1 - rwr, gLPF);
+ LM_REVERB(nLwlNew) = lwl;
+ LM_REVERB(nRwrNew) = rwr;
/*
Left -> Wall -> Right Reflection
*/
- tempL1 = tempL0 + LM_MUL ( LM_REVERB( nRwlOld ), gWall );
- tempR1 = tempR0 + LM_MUL ( LM_REVERB( nLwrOld ), gWall );
- lwr += LM_MUL ( tempL1 - lwr, gLPF );
- rwl += LM_MUL ( tempR1 - rwl, gLPF );
- LM_REVERB( nLwrNew ) = lwr;
- LM_REVERB( nRwlNew ) = rwl;
+ tempL1 = tempL0 + LM_MUL(LM_REVERB(nRwlOld), gWall);
+ tempR1 = tempR0 + LM_MUL(LM_REVERB(nLwrOld), gWall);
+ lwr += LM_MUL(tempL1 - lwr, gLPF);
+ rwl += LM_MUL(tempR1 - rwl, gLPF);
+ LM_REVERB(nLwrNew) = lwr;
+ LM_REVERB(nRwlNew) = rwl;
/*
Early Echo(Early Reflection)
*/
tempL0 =
- LM_MUL ( LM_REVERB( nEcho0L ), gEcho0 ) +
- LM_MUL ( LM_REVERB( nEcho1L ), gEcho1 ) +
- LM_MUL ( LM_REVERB( nEcho2L ), gEcho2 ) +
- LM_MUL ( LM_REVERB( nEcho3L ), gEcho3 );
+ LM_MUL(LM_REVERB(nEcho0L), gEcho0) +
+ LM_MUL(LM_REVERB(nEcho1L), gEcho1) +
+ LM_MUL(LM_REVERB(nEcho2L), gEcho2) +
+ LM_MUL(LM_REVERB(nEcho3L), gEcho3);
tempR0 =
- LM_MUL ( LM_REVERB( nEcho0R ), gEcho0 ) +
- LM_MUL ( LM_REVERB( nEcho1R ), gEcho1 ) +
- LM_MUL ( LM_REVERB( nEcho2R ), gEcho2 ) +
- LM_MUL ( LM_REVERB( nEcho3R ), gEcho3 );
+ LM_MUL(LM_REVERB(nEcho0R), gEcho0) +
+ LM_MUL(LM_REVERB(nEcho1R), gEcho1) +
+ LM_MUL(LM_REVERB(nEcho2R), gEcho2) +
+ LM_MUL(LM_REVERB(nEcho3R), gEcho3);
/*
Late Reverb
*/
- tempL1 = LM_REVERB( nRevaOldL );
- tempR1 = LM_REVERB( nRevaOldR );
- tempL0 -= LM_MUL ( tempL1, gReva );
- tempR0 -= LM_MUL ( tempR1, gReva );
- LM_REVERB( nRevaNewL ) = tempL0;
- LM_REVERB( nRevaNewR ) = tempR0;
- tempL0 = LM_MUL ( tempL0, gReva ) + tempL1;
- tempR0 = LM_MUL ( tempR0, gReva ) + tempR1;
- tempL1 = LM_REVERB( nRevbOldL );
- tempR1 = LM_REVERB( nRevbOldR );
- tempL0 -= LM_MUL ( tempL1, gRevb );
- tempR0 -= LM_MUL ( tempR1, gRevb );
- LM_REVERB( nRevbNewL ) = tempL0;
- LM_REVERB( nRevbNewR ) = tempR0;
- tempL0 = LM_MUL ( tempL0, gRevb ) + tempL1;
- tempR0 = LM_MUL ( tempR0, gRevb ) + tempR1;
+ tempL1 = LM_REVERB(nRevaOldL);
+ tempR1 = LM_REVERB(nRevaOldR);
+ tempL0 -= LM_MUL(tempL1, gReva);
+ tempR0 -= LM_MUL(tempR1, gReva);
+ LM_REVERB(nRevaNewL) = tempL0;
+ LM_REVERB(nRevaNewR) = tempR0;
+ tempL0 = LM_MUL(tempL0, gReva) + tempL1;
+ tempR0 = LM_MUL(tempR0, gReva) + tempR1;
+ tempL1 = LM_REVERB(nRevbOldL);
+ tempR1 = LM_REVERB(nRevbOldR);
+ tempL0 -= LM_MUL(tempL1, gRevb);
+ tempR0 -= LM_MUL(tempR1, gRevb);
+ LM_REVERB(nRevbNewL) = tempL0;
+ LM_REVERB(nRevbNewR) = tempR0;
+ tempL0 = LM_MUL(tempL0, gRevb) + tempL1;
+ tempR0 = LM_MUL(tempR0, gRevb) + tempR1;
/*
Output
*/
- max|=abs(tempL0);
- max|=abs(tempR0);
-
- p_output[(cSample<<p_stereo_stride)] += tempL0<<8;
- p_output[(cSample<<p_stereo_stride) + 1] += tempR0<<8;
+ max |= abs(tempL0);
+ max |= abs(tempR0);
+ p_output[(cSample << p_stereo_stride)] += tempL0 << 8;
+ p_output[(cSample << p_stereo_stride) + 1] += tempR0 << 8;
}
// Advance offsets
Offset += aSample;
- if ( Offset >= reverb_buffer_size ) { Offset -= reverb_buffer_size; }
+ if (Offset >= reverb_buffer_size) {
+ Offset -= reverb_buffer_size;
+ }
p_input += aSample << p_stereo_stride;
p_output += aSample << p_stereo_stride;
@@ -470,100 +463,91 @@ MULSHIFT_S32 ( x, current_params->y, 15 )
state.rwr = rwr;
state.Offset = Offset;
- return (max&0x7FFFFF00)!=0; // audio was mixed?
+ return (max & 0x7FFFFF00) != 0; // audio was mixed?
}
void ReverbSW::adjust_current_params() {
- *current_params=*reverb_param_modes[mode];
+ *current_params = *reverb_param_modes[mode];
- uint32_t maxofs=0;
+ uint32_t maxofs = 0;
-#define LM_CONFIG_PARAM( x )\
- current_params->x=(int)( ( (int64_t)current_params->x*(int64_t)mix_rate*8L)/(int64_t)44100);\
- if (current_params->x>maxofs)\
- maxofs=current_params->x;
+#define LM_CONFIG_PARAM(x) \
+ current_params->x = (int)(((int64_t)current_params->x * (int64_t)mix_rate * 8L) / (int64_t)44100); \
+ if (current_params->x > maxofs) \
+ maxofs = current_params->x;
+ LM_CONFIG_PARAM(nLwlOld);
+ LM_CONFIG_PARAM(nRwrOld);
+ LM_CONFIG_PARAM(nLwlNew);
+ LM_CONFIG_PARAM(nRwrNew);
+ LM_CONFIG_PARAM(nLwrOld);
+ LM_CONFIG_PARAM(nRwlOld);
+ LM_CONFIG_PARAM(nLwrNew);
+ LM_CONFIG_PARAM(nRwlNew);
+ LM_CONFIG_PARAM(nEcho0L);
+ LM_CONFIG_PARAM(nEcho1L);
+ LM_CONFIG_PARAM(nEcho2L);
+ LM_CONFIG_PARAM(nEcho3L);
+ LM_CONFIG_PARAM(nEcho0R);
+ LM_CONFIG_PARAM(nEcho1R);
+ LM_CONFIG_PARAM(nEcho2R);
+ LM_CONFIG_PARAM(nEcho3R);
+ LM_CONFIG_PARAM(nRevaOldL);
+ LM_CONFIG_PARAM(nRevaOldR);
+ LM_CONFIG_PARAM(nRevbOldL);
+ LM_CONFIG_PARAM(nRevbOldR);
+ LM_CONFIG_PARAM(nRevaNewL);
+ LM_CONFIG_PARAM(nRevaNewR);
+ LM_CONFIG_PARAM(nRevbNewL);
+ LM_CONFIG_PARAM(nRevbNewR);
- LM_CONFIG_PARAM ( nLwlOld );
- LM_CONFIG_PARAM ( nRwrOld );
- LM_CONFIG_PARAM ( nLwlNew );
- LM_CONFIG_PARAM ( nRwrNew );
- LM_CONFIG_PARAM ( nLwrOld );
- LM_CONFIG_PARAM ( nRwlOld );
- LM_CONFIG_PARAM ( nLwrNew );
- LM_CONFIG_PARAM ( nRwlNew );
- LM_CONFIG_PARAM ( nEcho0L );
- LM_CONFIG_PARAM ( nEcho1L );
- LM_CONFIG_PARAM ( nEcho2L );
- LM_CONFIG_PARAM ( nEcho3L );
- LM_CONFIG_PARAM ( nEcho0R );
- LM_CONFIG_PARAM ( nEcho1R );
- LM_CONFIG_PARAM ( nEcho2R );
- LM_CONFIG_PARAM ( nEcho3R );
- LM_CONFIG_PARAM ( nRevaOldL );
- LM_CONFIG_PARAM ( nRevaOldR );
- LM_CONFIG_PARAM ( nRevbOldL );
- LM_CONFIG_PARAM ( nRevbOldR );
- LM_CONFIG_PARAM ( nRevaNewL );
- LM_CONFIG_PARAM ( nRevaNewR );
- LM_CONFIG_PARAM ( nRevbNewL );
- LM_CONFIG_PARAM ( nRevbNewR );
-
- int needed_buffer_size=maxofs+1;
+ int needed_buffer_size = maxofs + 1;
if (reverb_buffer)
memdelete_arr(reverb_buffer);
- reverb_buffer = memnew_arr(int,needed_buffer_size);
- reverb_buffer_size=needed_buffer_size;
+ reverb_buffer = memnew_arr(int, needed_buffer_size);
+ reverb_buffer_size = needed_buffer_size;
- for (uint32_t i=0;i<reverb_buffer_size;i++)
- reverb_buffer[i]=0;
+ for (uint32_t i = 0; i < reverb_buffer_size; i++)
+ reverb_buffer[i] = 0;
state.reset();
-
-
}
void ReverbSW::set_mode(ReverbMode p_mode) {
- if (mode==p_mode)
+ if (mode == p_mode)
return;
- mode=p_mode;
+ mode = p_mode;
adjust_current_params();
}
void ReverbSW::set_mix_rate(int p_mix_rate) {
- if (p_mix_rate==mix_rate)
+ if (p_mix_rate == mix_rate)
return;
- mix_rate=p_mix_rate;
+ mix_rate = p_mix_rate;
adjust_current_params();
-
}
-
ReverbSW::ReverbSW() {
- reverb_buffer=0;
- reverb_buffer_size=0;
- mode=REVERB_MODE_ROOM;
- mix_rate=1;
+ reverb_buffer = 0;
+ reverb_buffer_size = 0;
+ mode = REVERB_MODE_ROOM;
+ mix_rate = 1;
current_params = memnew(ReverbParamsSW);
}
-
ReverbSW::~ReverbSW() {
-
if (reverb_buffer)
memdelete_arr(reverb_buffer);
memdelete(current_params);
-
}
-
diff --git a/servers/audio/reverb_sw.h b/servers/audio/reverb_sw.h
index d9f16a5fb..06a14322a 100644
--- a/servers/audio/reverb_sw.h
+++ b/servers/audio/reverb_sw.h
@@ -29,8 +29,8 @@
#ifndef REVERB_SW_H
#define REVERB_SW_H
-#include "typedefs.h"
#include "os/memory.h"
+#include "typedefs.h"
class ReverbParamsSW;
@@ -55,13 +55,18 @@ private:
int rwl;
int rwr;
unsigned int Offset;
- void reset() { lwl=0; lwr=0; rwl=0; rwr=0; Offset=0; }
+ void reset() {
+ lwl = 0;
+ lwr = 0;
+ rwl = 0;
+ rwr = 0;
+ Offset = 0;
+ }
State() { reset(); }
} state;
ReverbParamsSW *current_params;
-
int *reverb_buffer;
unsigned int reverb_buffer_size;
ReverbMode mode;
@@ -70,15 +75,12 @@ private:
void adjust_current_params();
public:
-
-
void set_mode(ReverbMode p_mode);
- bool process(int *p_input,int *p_output,int p_frames,int p_stereo_stride=1); // return tru if audio was created
+ bool process(int *p_input, int *p_output, int p_frames, int p_stereo_stride = 1); // return tru if audio was created
void set_mix_rate(int p_mix_rate);
ReverbSW();
~ReverbSW();
-
};
#endif
diff --git a/servers/audio/sample_manager_sw.cpp b/servers/audio/sample_manager_sw.cpp
index 623bb0f9c..b28291165 100644
--- a/servers/audio/sample_manager_sw.cpp
+++ b/servers/audio/sample_manager_sw.cpp
@@ -30,36 +30,33 @@
#include "print_string.h"
-SampleManagerSW::~SampleManagerSW()
-{
+SampleManagerSW::~SampleManagerSW() {
}
-
-
RID SampleManagerMallocSW::sample_create(AS::SampleFormat p_format, bool p_stereo, int p_length) {
- Sample *s = memnew( Sample );
+ Sample *s = memnew(Sample);
int datalen = p_length;
- if (p_format==AS::SAMPLE_FORMAT_PCM16)
- datalen*=2;
- else if (p_format==AS::SAMPLE_FORMAT_IMA_ADPCM) {
- if (datalen&1) {
+ if (p_format == AS::SAMPLE_FORMAT_PCM16)
+ datalen *= 2;
+ else if (p_format == AS::SAMPLE_FORMAT_IMA_ADPCM) {
+ if (datalen & 1) {
datalen++;
}
- datalen/=2;
- datalen+=4;
+ datalen /= 2;
+ datalen += 4;
}
if (p_stereo)
- datalen*=2;
+ datalen *= 2;
#define SAMPLE_EXTRA 16
- s->data = memalloc(datalen+SAMPLE_EXTRA); //help the interpolator by allocating a little more..
- for(int i=0;i<SAMPLE_EXTRA;i++) {
+ s->data = memalloc(datalen + SAMPLE_EXTRA); //help the interpolator by allocating a little more..
+ for (int i = 0; i < SAMPLE_EXTRA; i++) {
- uint8_t *data = (uint8_t*)s->data;
- data[datalen+i]=0;
+ uint8_t *data = (uint8_t *)s->data;
+ data[datalen + i] = 0;
}
if (!s->data) {
@@ -68,14 +65,14 @@ RID SampleManagerMallocSW::sample_create(AS::SampleFormat p_format, bool p_stere
ERR_FAIL_V(RID());
}
- s->format=p_format;
- s->length=p_length;
- s->length_bytes=datalen;
- s->stereo=p_stereo;
- s->loop_begin=0;
- s->loop_end=0;
- s->loop_format=AS::SAMPLE_LOOP_NONE;
- s->mix_rate=44100;
+ s->format = p_format;
+ s->length = p_length;
+ s->length_bytes = datalen;
+ s->stereo = p_stereo;
+ s->loop_begin = 0;
+ s->loop_end = 0;
+ s->loop_format = AS::SAMPLE_LOOP_NONE;
+ s->mix_rate = 44100;
AudioServer::get_singleton()->lock();
RID rid = sample_owner.make_rid(s);
@@ -84,27 +81,26 @@ RID SampleManagerMallocSW::sample_create(AS::SampleFormat p_format, bool p_stere
return rid;
}
-void SampleManagerMallocSW::sample_set_description(RID p_sample, const String& p_description) {
+void SampleManagerMallocSW::sample_set_description(RID p_sample, const String &p_description) {
Sample *s = sample_owner.get(p_sample);
ERR_FAIL_COND(!s);
- s->description=p_description;
+ s->description = p_description;
}
String SampleManagerMallocSW::sample_get_description(RID p_sample) const {
const Sample *s = sample_owner.get(p_sample);
- ERR_FAIL_COND_V(!s,String());
+ ERR_FAIL_COND_V(!s, String());
return s->description;
}
-
AS::SampleFormat SampleManagerMallocSW::sample_get_format(RID p_sample) const {
const Sample *s = sample_owner.get(p_sample);
- ERR_FAIL_COND_V(!s,AS::SAMPLE_FORMAT_PCM8);
+ ERR_FAIL_COND_V(!s, AS::SAMPLE_FORMAT_PCM8);
return s->format;
}
@@ -112,89 +108,83 @@ AS::SampleFormat SampleManagerMallocSW::sample_get_format(RID p_sample) const {
bool SampleManagerMallocSW::sample_is_stereo(RID p_sample) const {
const Sample *s = sample_owner.get(p_sample);
- ERR_FAIL_COND_V(!s,false);
+ ERR_FAIL_COND_V(!s, false);
return s->stereo;
-
}
int SampleManagerMallocSW::sample_get_length(RID p_sample) const {
const Sample *s = sample_owner.get(p_sample);
- ERR_FAIL_COND_V(!s,-1);
+ ERR_FAIL_COND_V(!s, -1);
return s->length;
}
-void SampleManagerMallocSW::sample_set_data(RID p_sample, const DVector<uint8_t>& p_buffer) {
+void SampleManagerMallocSW::sample_set_data(RID p_sample, const DVector<uint8_t> &p_buffer) {
Sample *s = sample_owner.get(p_sample);
ERR_FAIL_COND(!s);
- int buff_size=p_buffer.size();
- ERR_FAIL_COND(buff_size==0);
-
+ int buff_size = p_buffer.size();
+ ERR_FAIL_COND(buff_size == 0);
ERR_EXPLAIN("Sample buffer size does not match sample size.");
//print_line("len bytes: "+itos(s->length_bytes)+" bufsize: "+itos(buff_size));
- ERR_FAIL_COND(s->length_bytes!=buff_size);
- DVector<uint8_t>::Read buffer_r=p_buffer.read();
+ ERR_FAIL_COND(s->length_bytes != buff_size);
+ DVector<uint8_t>::Read buffer_r = p_buffer.read();
const uint8_t *src = buffer_r.ptr();
- uint8_t *dst = (uint8_t*)s->data;
+ uint8_t *dst = (uint8_t *)s->data;
//print_line("set data: "+itos(s->length_bytes));
- for(int i=0;i<s->length_bytes;i++) {
+ for (int i = 0; i < s->length_bytes; i++) {
- dst[i]=src[i];
+ dst[i] = src[i];
}
- switch(s->format) {
+ switch (s->format) {
case AS::SAMPLE_FORMAT_PCM8: {
if (s->stereo) {
- dst[s->length]=dst[s->length-2];
- dst[s->length+1]=dst[s->length-1];
+ dst[s->length] = dst[s->length - 2];
+ dst[s->length + 1] = dst[s->length - 1];
} else {
- dst[s->length]=dst[s->length-1];
+ dst[s->length] = dst[s->length - 1];
}
} break;
case AS::SAMPLE_FORMAT_PCM16: {
if (s->stereo) {
- dst[s->length]=dst[s->length-4];
- dst[s->length+1]=dst[s->length-3];
- dst[s->length+2]=dst[s->length-2];
- dst[s->length+3]=dst[s->length-1];
+ dst[s->length] = dst[s->length - 4];
+ dst[s->length + 1] = dst[s->length - 3];
+ dst[s->length + 2] = dst[s->length - 2];
+ dst[s->length + 3] = dst[s->length - 1];
} else {
- dst[s->length]=dst[s->length-2];
- dst[s->length+1]=dst[s->length-1];
+ dst[s->length] = dst[s->length - 2];
+ dst[s->length + 1] = dst[s->length - 1];
}
} break;
-
}
-
-
-
}
const DVector<uint8_t> SampleManagerMallocSW::sample_get_data(RID p_sample) const {
Sample *s = sample_owner.get(p_sample);
- ERR_FAIL_COND_V(!s,DVector<uint8_t>());
+ ERR_FAIL_COND_V(!s, DVector<uint8_t>());
DVector<uint8_t> ret_buffer;
ret_buffer.resize(s->length_bytes);
- DVector<uint8_t>::Write buffer_w=ret_buffer.write();
+ DVector<uint8_t>::Write buffer_w = ret_buffer.write();
uint8_t *dst = buffer_w.ptr();
- const uint8_t *src = (const uint8_t*)s->data;
+ const uint8_t *src = (const uint8_t *)s->data;
- for(int i=0;i<s->length_bytes;i++) {
+ for (int i = 0; i < s->length_bytes; i++) {
- dst[i]=src[i];
+ dst[i] = src[i];
}
buffer_w = DVector<uint8_t>::Write(); //unlock
@@ -205,76 +195,70 @@ const DVector<uint8_t> SampleManagerMallocSW::sample_get_data(RID p_sample) cons
void *SampleManagerMallocSW::sample_get_data_ptr(RID p_sample) const {
const Sample *s = sample_owner.get(p_sample);
- ERR_FAIL_COND_V(!s,NULL);
+ ERR_FAIL_COND_V(!s, NULL);
return s->data;
-
}
-void SampleManagerMallocSW::sample_set_mix_rate(RID p_sample,int p_rate) {
+void SampleManagerMallocSW::sample_set_mix_rate(RID p_sample, int p_rate) {
- ERR_FAIL_COND(p_rate<1);
+ ERR_FAIL_COND(p_rate < 1);
Sample *s = sample_owner.get(p_sample);
ERR_FAIL_COND(!s);
- s->mix_rate=p_rate;
-
-
+ s->mix_rate = p_rate;
}
int SampleManagerMallocSW::sample_get_mix_rate(RID p_sample) const {
const Sample *s = sample_owner.get(p_sample);
- ERR_FAIL_COND_V(!s,-1);
+ ERR_FAIL_COND_V(!s, -1);
return s->mix_rate;
-
}
-void SampleManagerMallocSW::sample_set_loop_format(RID p_sample,AS::SampleLoopFormat p_format) {
+void SampleManagerMallocSW::sample_set_loop_format(RID p_sample, AS::SampleLoopFormat p_format) {
Sample *s = sample_owner.get(p_sample);
ERR_FAIL_COND(!s);
- s->loop_format=p_format;
-
+ s->loop_format = p_format;
}
AS::SampleLoopFormat SampleManagerMallocSW::sample_get_loop_format(RID p_sample) const {
const Sample *s = sample_owner.get(p_sample);
- ERR_FAIL_COND_V(!s,AS::SAMPLE_LOOP_NONE);
+ ERR_FAIL_COND_V(!s, AS::SAMPLE_LOOP_NONE);
return s->loop_format;
}
-void SampleManagerMallocSW::sample_set_loop_begin(RID p_sample,int p_pos) {
+void SampleManagerMallocSW::sample_set_loop_begin(RID p_sample, int p_pos) {
Sample *s = sample_owner.get(p_sample);
ERR_FAIL_COND(!s);
- ERR_FAIL_INDEX(p_pos,s->length);
+ ERR_FAIL_INDEX(p_pos, s->length);
- s->loop_begin=p_pos;
+ s->loop_begin = p_pos;
}
int SampleManagerMallocSW::sample_get_loop_begin(RID p_sample) const {
const Sample *s = sample_owner.get(p_sample);
- ERR_FAIL_COND_V(!s,-1);
+ ERR_FAIL_COND_V(!s, -1);
return s->loop_begin;
}
-void SampleManagerMallocSW::sample_set_loop_end(RID p_sample,int p_pos) {
+void SampleManagerMallocSW::sample_set_loop_end(RID p_sample, int p_pos) {
Sample *s = sample_owner.get(p_sample);
ERR_FAIL_COND(!s);
- if (p_pos>s->length)
- p_pos=s->length;
- s->loop_end=p_pos;
-
+ if (p_pos > s->length)
+ p_pos = s->length;
+ s->loop_end = p_pos;
}
int SampleManagerMallocSW::sample_get_loop_end(RID p_sample) const {
const Sample *s = sample_owner.get(p_sample);
- ERR_FAIL_COND_V(!s,-1);
+ ERR_FAIL_COND_V(!s, -1);
return s->loop_end;
}
@@ -282,7 +266,6 @@ int SampleManagerMallocSW::sample_get_loop_end(RID p_sample) const {
bool SampleManagerMallocSW::is_sample(RID p_sample) const {
return sample_owner.owns(p_sample);
-
}
void SampleManagerMallocSW::free(RID p_sample) {
@@ -294,12 +277,9 @@ void SampleManagerMallocSW::free(RID p_sample) {
memfree(s->data);
memdelete(s);
-
}
SampleManagerMallocSW::SampleManagerMallocSW() {
-
-
}
SampleManagerMallocSW::~SampleManagerMallocSW() {
@@ -308,13 +288,12 @@ SampleManagerMallocSW::~SampleManagerMallocSW() {
List<RID> owned_list;
sample_owner.get_owned_list(&owned_list);
- while(owned_list.size()) {
+ while (owned_list.size()) {
Sample *s = sample_owner.get(owned_list.front()->get());
- String err="Leaked sample of size: "+itos(s->length_bytes)+" description: "+s->description;
+ String err = "Leaked sample of size: " + itos(s->length_bytes) + " description: " + s->description;
ERR_PRINT(err.utf8().get_data());
free(owned_list.front()->get());
owned_list.pop_front();
}
-
}
diff --git a/servers/audio/sample_manager_sw.h b/servers/audio/sample_manager_sw.h
index c0b5661a1..79cd603a5 100644
--- a/servers/audio/sample_manager_sw.h
+++ b/servers/audio/sample_manager_sw.h
@@ -33,47 +33,42 @@
class SampleManagerSW {
public:
-
/* SAMPLE API */
- virtual RID sample_create(AS::SampleFormat p_format, bool p_stereo, int p_length)=0;
-
- virtual void sample_set_description(RID p_sample, const String& p_description)=0;
- virtual String sample_get_description(RID p_sample) const=0;
+ virtual RID sample_create(AS::SampleFormat p_format, bool p_stereo, int p_length) = 0;
- virtual AS::SampleFormat sample_get_format(RID p_sample) const=0;
- virtual bool sample_is_stereo(RID p_sample) const=0;
- virtual int sample_get_length(RID p_sample) const=0;
+ virtual void sample_set_description(RID p_sample, const String &p_description) = 0;
+ virtual String sample_get_description(RID p_sample) const = 0;
- virtual void sample_set_data(RID p_sample, const DVector<uint8_t>& p_buffer)=0;
- virtual const DVector<uint8_t> sample_get_data(RID p_sample) const=0;
+ virtual AS::SampleFormat sample_get_format(RID p_sample) const = 0;
+ virtual bool sample_is_stereo(RID p_sample) const = 0;
+ virtual int sample_get_length(RID p_sample) const = 0;
- virtual void *sample_get_data_ptr(RID p_sample) const=0;
+ virtual void sample_set_data(RID p_sample, const DVector<uint8_t> &p_buffer) = 0;
+ virtual const DVector<uint8_t> sample_get_data(RID p_sample) const = 0;
- virtual void sample_set_mix_rate(RID p_sample,int p_rate)=0;
- virtual int sample_get_mix_rate(RID p_sample) const=0;
+ virtual void *sample_get_data_ptr(RID p_sample) const = 0;
- virtual void sample_set_loop_format(RID p_sample,AS::SampleLoopFormat p_format)=0;
- virtual AS::SampleLoopFormat sample_get_loop_format(RID p_sample) const=0;
+ virtual void sample_set_mix_rate(RID p_sample, int p_rate) = 0;
+ virtual int sample_get_mix_rate(RID p_sample) const = 0;
- virtual void sample_set_loop_begin(RID p_sample,int p_pos)=0;
- virtual int sample_get_loop_begin(RID p_sample) const=0;
+ virtual void sample_set_loop_format(RID p_sample, AS::SampleLoopFormat p_format) = 0;
+ virtual AS::SampleLoopFormat sample_get_loop_format(RID p_sample) const = 0;
- virtual void sample_set_loop_end(RID p_sample,int p_pos)=0;
- virtual int sample_get_loop_end(RID p_sample) const=0;
-
- virtual bool is_sample(RID) const=0;
- virtual void free(RID p_sample)=0;
+ virtual void sample_set_loop_begin(RID p_sample, int p_pos) = 0;
+ virtual int sample_get_loop_begin(RID p_sample) const = 0;
+ virtual void sample_set_loop_end(RID p_sample, int p_pos) = 0;
+ virtual int sample_get_loop_end(RID p_sample) const = 0;
+ virtual bool is_sample(RID) const = 0;
+ virtual void free(RID p_sample) = 0;
virtual ~SampleManagerSW();
};
-
class SampleManagerMallocSW : public SampleManagerSW {
-
struct Sample {
void *data;
@@ -89,34 +84,34 @@ class SampleManagerMallocSW : public SampleManagerSW {
};
mutable RID_Owner<Sample> sample_owner;
-public:
+public:
/* SAMPLE API */
virtual RID sample_create(AS::SampleFormat p_format, bool p_stereo, int p_length);
- virtual void sample_set_description(RID p_sample, const String& p_description);
+ virtual void sample_set_description(RID p_sample, const String &p_description);
virtual String sample_get_description(RID p_sample) const;
virtual AS::SampleFormat sample_get_format(RID p_sample) const;
virtual bool sample_is_stereo(RID p_sample) const;
virtual int sample_get_length(RID p_sample) const;
- virtual void sample_set_data(RID p_sample, const DVector<uint8_t>& p_buffer);
+ virtual void sample_set_data(RID p_sample, const DVector<uint8_t> &p_buffer);
virtual const DVector<uint8_t> sample_get_data(RID p_sample) const;
virtual void *sample_get_data_ptr(RID p_sample) const;
- virtual void sample_set_mix_rate(RID p_sample,int p_rate);
+ virtual void sample_set_mix_rate(RID p_sample, int p_rate);
virtual int sample_get_mix_rate(RID p_sample) const;
- virtual void sample_set_loop_format(RID p_sample,AS::SampleLoopFormat p_format);
+ virtual void sample_set_loop_format(RID p_sample, AS::SampleLoopFormat p_format);
virtual AS::SampleLoopFormat sample_get_loop_format(RID p_sample) const;
- virtual void sample_set_loop_begin(RID p_sample,int p_pos);
+ virtual void sample_set_loop_begin(RID p_sample, int p_pos);
virtual int sample_get_loop_begin(RID p_sample) const;
- virtual void sample_set_loop_end(RID p_sample,int p_pos);
+ virtual void sample_set_loop_end(RID p_sample, int p_pos);
virtual int sample_get_loop_end(RID p_sample) const;
virtual bool is_sample(RID) const;
diff --git a/servers/audio/voice_rb_sw.h b/servers/audio/voice_rb_sw.h
index cbf139248..117a62a43 100644
--- a/servers/audio/voice_rb_sw.h
+++ b/servers/audio/voice_rb_sw.h
@@ -29,13 +29,12 @@
#ifndef VOICE_RB_SW_H
#define VOICE_RB_SW_H
-#include "servers/audio_server.h"
#include "os/os.h"
+#include "servers/audio_server.h"
class VoiceRBSW {
public:
-
enum {
- VOICE_RB_SIZE=1024
+ VOICE_RB_SIZE = 1024
};
struct Command {
@@ -72,7 +71,7 @@ public:
struct {
- float pan,depth,height;
+ float pan, depth, height;
} pan;
struct {
@@ -100,47 +99,42 @@ public:
bool positional;
} positional;
-
};
- Command() { type=CMD_NONE; }
-
+ Command() { type = CMD_NONE; }
};
-private:
+private:
Command voice_cmd_rb[VOICE_RB_SIZE];
volatile int read_pos;
volatile int write_pos;
public:
-
- _FORCE_INLINE_ bool commands_left() const { return read_pos!=write_pos; }
+ _FORCE_INLINE_ bool commands_left() const { return read_pos != write_pos; }
_FORCE_INLINE_ Command pop_command() {
- ERR_FAIL_COND_V( read_pos==write_pos, Command() );
- Command cmd=voice_cmd_rb[read_pos];
- read_pos=(read_pos+1)%VOICE_RB_SIZE;
+ ERR_FAIL_COND_V(read_pos == write_pos, Command());
+ Command cmd = voice_cmd_rb[read_pos];
+ read_pos = (read_pos + 1) % VOICE_RB_SIZE;
return cmd;
}
- _FORCE_INLINE_ void push_command(const Command& p_command) {
+ _FORCE_INLINE_ void push_command(const Command &p_command) {
- bool full = ((write_pos+1)%VOICE_RB_SIZE)==read_pos;
+ bool full = ((write_pos + 1) % VOICE_RB_SIZE) == read_pos;
if (full) {
#ifdef DEBUG_ENABLED
if (OS::get_singleton()->is_stdout_verbose()) {
ERR_EXPLAIN("Audio Ring Buffer Full (too many commands");
- ERR_FAIL_COND( ((write_pos+1)%VOICE_RB_SIZE)==read_pos);
+ ERR_FAIL_COND(((write_pos + 1) % VOICE_RB_SIZE) == read_pos);
}
#endif
return;
}
- voice_cmd_rb[write_pos]=p_command;
- write_pos=(write_pos+1)%VOICE_RB_SIZE;
-
+ voice_cmd_rb[write_pos] = p_command;
+ write_pos = (write_pos + 1) % VOICE_RB_SIZE;
}
- VoiceRBSW() { read_pos=write_pos=0; }
-
+ VoiceRBSW() { read_pos = write_pos = 0; }
};
#endif // VOICE_RB_SW_H
diff --git a/servers/audio_server.cpp b/servers/audio_server.cpp
index 04e21e100..40cb701fb 100644
--- a/servers/audio_server.cpp
+++ b/servers/audio_server.cpp
@@ -39,166 +39,157 @@ AudioMixer *AudioServer::EventStream::get_mixer() const {
return AudioServer::get_singleton()->get_mixer();
}
-AudioServer *AudioServer::singleton=NULL;
+AudioServer *AudioServer::singleton = NULL;
AudioServer *AudioServer::get_singleton() {
return singleton;
}
-void AudioServer::sample_set_signed_data(RID p_sample, const DVector<float>& p_buffer) {
+void AudioServer::sample_set_signed_data(RID p_sample, const DVector<float> &p_buffer) {
SampleFormat format = sample_get_format(p_sample);
ERR_EXPLAIN("IMA ADPCM is not supported.");
- ERR_FAIL_COND(format==SAMPLE_FORMAT_IMA_ADPCM);
+ ERR_FAIL_COND(format == SAMPLE_FORMAT_IMA_ADPCM);
int len = p_buffer.size();
- ERR_FAIL_COND( len == 0 );
+ ERR_FAIL_COND(len == 0);
DVector<uint8_t> data;
DVector<uint8_t>::Write w;
DVector<float>::Read r = p_buffer.read();
- switch(format) {
+ switch (format) {
case SAMPLE_FORMAT_PCM8: {
data.resize(len);
- w=data.write();
+ w = data.write();
- int8_t *samples8 = (int8_t*)w.ptr();
+ int8_t *samples8 = (int8_t *)w.ptr();
- for(int i=0;i<len;i++) {
+ for (int i = 0; i < len; i++) {
- float sample = Math::floor( r[i] * (1<<8) );
- if (sample<-128)
- sample=-128;
- else if (sample>127)
- sample=127;
- samples8[i]=sample;
+ float sample = Math::floor(r[i] * (1 << 8));
+ if (sample < -128)
+ sample = -128;
+ else if (sample > 127)
+ sample = 127;
+ samples8[i] = sample;
}
} break;
case SAMPLE_FORMAT_PCM16: {
- data.resize(len*2);
- w=data.write();
+ data.resize(len * 2);
+ w = data.write();
- int16_t *samples16 = (int16_t*)w.ptr();
+ int16_t *samples16 = (int16_t *)w.ptr();
- for(int i=0;i<len;i++) {
+ for (int i = 0; i < len; i++) {
- float sample = Math::floor( r[i] * (1<<16) );
- if (sample<-32768)
- sample=-32768;
- else if (sample>32767)
- sample=32767;
- samples16[i]=sample;
+ float sample = Math::floor(r[i] * (1 << 16));
+ if (sample < -32768)
+ sample = -32768;
+ else if (sample > 32767)
+ sample = 32767;
+ samples16[i] = sample;
}
} break;
}
w = DVector<uint8_t>::Write();
- sample_set_data(p_sample,data);
-
-
+ sample_set_data(p_sample, data);
}
void AudioServer::_bind_methods() {
- ObjectTypeDB::bind_method(_MD("sample_create","format","stereo","length"), &AudioServer::sample_create );
- ObjectTypeDB::bind_method(_MD("sample_set_description","sample","description"), &AudioServer::sample_set_description );
- ObjectTypeDB::bind_method(_MD("sample_get_description","sample"), &AudioServer::sample_get_description );
-
- ObjectTypeDB::bind_method(_MD("sample_get_format","sample"), &AudioServer::sample_get_format );
- ObjectTypeDB::bind_method(_MD("sample_is_stereo","sample"), &AudioServer::sample_is_stereo );
- ObjectTypeDB::bind_method(_MD("sample_get_length","sample"), &AudioServer::sample_get_length );
-
- ObjectTypeDB::bind_method(_MD("sample_set_signed_data","sample","data"), &AudioServer::sample_set_signed_data );
- ObjectTypeDB::bind_method(_MD("sample_set_data","sample","data"), &AudioServer::sample_set_data );
- ObjectTypeDB::bind_method(_MD("sample_get_data","sample"), &AudioServer::sample_get_data );
-
- ObjectTypeDB::bind_method(_MD("sample_set_mix_rate","sample","mix_rate"), &AudioServer::sample_set_mix_rate );
- ObjectTypeDB::bind_method(_MD("sample_get_mix_rate","sample"), &AudioServer::sample_get_mix_rate );
+ ObjectTypeDB::bind_method(_MD("sample_create", "format", "stereo", "length"), &AudioServer::sample_create);
+ ObjectTypeDB::bind_method(_MD("sample_set_description", "sample", "description"), &AudioServer::sample_set_description);
+ ObjectTypeDB::bind_method(_MD("sample_get_description", "sample"), &AudioServer::sample_get_description);
- ObjectTypeDB::bind_method(_MD("sample_set_loop_format","sample","loop_format"), &AudioServer::sample_set_loop_format );
- ObjectTypeDB::bind_method(_MD("sample_get_loop_format","sample"), &AudioServer::sample_get_loop_format );
+ ObjectTypeDB::bind_method(_MD("sample_get_format", "sample"), &AudioServer::sample_get_format);
+ ObjectTypeDB::bind_method(_MD("sample_is_stereo", "sample"), &AudioServer::sample_is_stereo);
+ ObjectTypeDB::bind_method(_MD("sample_get_length", "sample"), &AudioServer::sample_get_length);
+ ObjectTypeDB::bind_method(_MD("sample_set_signed_data", "sample", "data"), &AudioServer::sample_set_signed_data);
+ ObjectTypeDB::bind_method(_MD("sample_set_data", "sample", "data"), &AudioServer::sample_set_data);
+ ObjectTypeDB::bind_method(_MD("sample_get_data", "sample"), &AudioServer::sample_get_data);
- ObjectTypeDB::bind_method(_MD("sample_set_loop_begin","sample","pos"), &AudioServer::sample_set_loop_begin );
- ObjectTypeDB::bind_method(_MD("sample_get_loop_begin","sample"), &AudioServer::sample_get_loop_begin );
+ ObjectTypeDB::bind_method(_MD("sample_set_mix_rate", "sample", "mix_rate"), &AudioServer::sample_set_mix_rate);
+ ObjectTypeDB::bind_method(_MD("sample_get_mix_rate", "sample"), &AudioServer::sample_get_mix_rate);
- ObjectTypeDB::bind_method(_MD("sample_set_loop_end","sample","pos"), &AudioServer::sample_set_loop_end );
- ObjectTypeDB::bind_method(_MD("sample_get_loop_end","sample"), &AudioServer::sample_get_loop_end );
+ ObjectTypeDB::bind_method(_MD("sample_set_loop_format", "sample", "loop_format"), &AudioServer::sample_set_loop_format);
+ ObjectTypeDB::bind_method(_MD("sample_get_loop_format", "sample"), &AudioServer::sample_get_loop_format);
+ ObjectTypeDB::bind_method(_MD("sample_set_loop_begin", "sample", "pos"), &AudioServer::sample_set_loop_begin);
+ ObjectTypeDB::bind_method(_MD("sample_get_loop_begin", "sample"), &AudioServer::sample_get_loop_begin);
+ ObjectTypeDB::bind_method(_MD("sample_set_loop_end", "sample", "pos"), &AudioServer::sample_set_loop_end);
+ ObjectTypeDB::bind_method(_MD("sample_get_loop_end", "sample"), &AudioServer::sample_get_loop_end);
- ObjectTypeDB::bind_method(_MD("voice_create"), &AudioServer::voice_create );
- ObjectTypeDB::bind_method(_MD("voice_play","voice","sample"), &AudioServer::voice_play );
- ObjectTypeDB::bind_method(_MD("voice_set_volume","voice","volume"), &AudioServer::voice_set_volume );
- ObjectTypeDB::bind_method(_MD("voice_set_pan","voice","pan","depth","height"), &AudioServer::voice_set_pan,DEFVAL(0),DEFVAL(0) );
- ObjectTypeDB::bind_method(_MD("voice_set_filter","voice","type","cutoff","resonance","gain"), &AudioServer::voice_set_filter,DEFVAL(0) );
- ObjectTypeDB::bind_method(_MD("voice_set_chorus","voice","chorus"), &AudioServer::voice_set_chorus );
- ObjectTypeDB::bind_method(_MD("voice_set_reverb","voice","room","reverb"), &AudioServer::voice_set_reverb );
- ObjectTypeDB::bind_method(_MD("voice_set_mix_rate","voice","rate"), &AudioServer::voice_set_mix_rate );
- ObjectTypeDB::bind_method(_MD("voice_set_positional","voice","enabled"), &AudioServer::voice_set_positional );
+ ObjectTypeDB::bind_method(_MD("voice_create"), &AudioServer::voice_create);
+ ObjectTypeDB::bind_method(_MD("voice_play", "voice", "sample"), &AudioServer::voice_play);
+ ObjectTypeDB::bind_method(_MD("voice_set_volume", "voice", "volume"), &AudioServer::voice_set_volume);
+ ObjectTypeDB::bind_method(_MD("voice_set_pan", "voice", "pan", "depth", "height"), &AudioServer::voice_set_pan, DEFVAL(0), DEFVAL(0));
+ ObjectTypeDB::bind_method(_MD("voice_set_filter", "voice", "type", "cutoff", "resonance", "gain"), &AudioServer::voice_set_filter, DEFVAL(0));
+ ObjectTypeDB::bind_method(_MD("voice_set_chorus", "voice", "chorus"), &AudioServer::voice_set_chorus);
+ ObjectTypeDB::bind_method(_MD("voice_set_reverb", "voice", "room", "reverb"), &AudioServer::voice_set_reverb);
+ ObjectTypeDB::bind_method(_MD("voice_set_mix_rate", "voice", "rate"), &AudioServer::voice_set_mix_rate);
+ ObjectTypeDB::bind_method(_MD("voice_set_positional", "voice", "enabled"), &AudioServer::voice_set_positional);
+ ObjectTypeDB::bind_method(_MD("voice_get_volume", "voice"), &AudioServer::voice_get_volume);
+ ObjectTypeDB::bind_method(_MD("voice_get_pan", "voice"), &AudioServer::voice_get_pan);
+ ObjectTypeDB::bind_method(_MD("voice_get_pan_height", "voice"), &AudioServer::voice_get_pan_height);
+ ObjectTypeDB::bind_method(_MD("voice_get_pan_depth", "voice"), &AudioServer::voice_get_pan_depth);
+ ObjectTypeDB::bind_method(_MD("voice_get_filter_type", "voice"), &AudioServer::voice_get_filter_type);
+ ObjectTypeDB::bind_method(_MD("voice_get_filter_cutoff", "voice"), &AudioServer::voice_get_filter_cutoff);
+ ObjectTypeDB::bind_method(_MD("voice_get_filter_resonance", "voice"), &AudioServer::voice_get_filter_resonance);
+ ObjectTypeDB::bind_method(_MD("voice_get_chorus", "voice"), &AudioServer::voice_get_chorus);
+ ObjectTypeDB::bind_method(_MD("voice_get_reverb_type", "voice"), &AudioServer::voice_get_reverb_type);
+ ObjectTypeDB::bind_method(_MD("voice_get_reverb", "voice"), &AudioServer::voice_get_reverb);
+ ObjectTypeDB::bind_method(_MD("voice_get_mix_rate", "voice"), &AudioServer::voice_get_mix_rate);
+ ObjectTypeDB::bind_method(_MD("voice_is_positional", "voice"), &AudioServer::voice_is_positional);
- ObjectTypeDB::bind_method(_MD("voice_get_volume","voice"), &AudioServer::voice_get_volume );
- ObjectTypeDB::bind_method(_MD("voice_get_pan","voice"), &AudioServer::voice_get_pan );
- ObjectTypeDB::bind_method(_MD("voice_get_pan_height","voice"), &AudioServer::voice_get_pan_height );
- ObjectTypeDB::bind_method(_MD("voice_get_pan_depth","voice"), &AudioServer::voice_get_pan_depth );
- ObjectTypeDB::bind_method(_MD("voice_get_filter_type","voice"), &AudioServer::voice_get_filter_type );
- ObjectTypeDB::bind_method(_MD("voice_get_filter_cutoff","voice"), &AudioServer::voice_get_filter_cutoff );
- ObjectTypeDB::bind_method(_MD("voice_get_filter_resonance","voice"), &AudioServer::voice_get_filter_resonance );
- ObjectTypeDB::bind_method(_MD("voice_get_chorus","voice"), &AudioServer::voice_get_chorus );
- ObjectTypeDB::bind_method(_MD("voice_get_reverb_type","voice"), &AudioServer::voice_get_reverb_type );
- ObjectTypeDB::bind_method(_MD("voice_get_reverb","voice"), &AudioServer::voice_get_reverb );
- ObjectTypeDB::bind_method(_MD("voice_get_mix_rate","voice"), &AudioServer::voice_get_mix_rate );
- ObjectTypeDB::bind_method(_MD("voice_is_positional","voice"), &AudioServer::voice_is_positional );
+ ObjectTypeDB::bind_method(_MD("voice_stop", "voice"), &AudioServer::voice_stop);
- ObjectTypeDB::bind_method(_MD("voice_stop","voice"), &AudioServer::voice_stop );
+ ObjectTypeDB::bind_method(_MD("free_rid", "rid"), &AudioServer::free);
- ObjectTypeDB::bind_method(_MD("free_rid","rid"), &AudioServer::free );
+ ObjectTypeDB::bind_method(_MD("set_stream_global_volume_scale", "scale"), &AudioServer::set_stream_global_volume_scale);
+ ObjectTypeDB::bind_method(_MD("get_stream_global_volume_scale"), &AudioServer::get_stream_global_volume_scale);
- ObjectTypeDB::bind_method(_MD("set_stream_global_volume_scale","scale"), &AudioServer::set_stream_global_volume_scale );
- ObjectTypeDB::bind_method(_MD("get_stream_global_volume_scale"), &AudioServer::get_stream_global_volume_scale );
+ ObjectTypeDB::bind_method(_MD("set_fx_global_volume_scale", "scale"), &AudioServer::set_fx_global_volume_scale);
+ ObjectTypeDB::bind_method(_MD("get_fx_global_volume_scale"), &AudioServer::get_fx_global_volume_scale);
- ObjectTypeDB::bind_method(_MD("set_fx_global_volume_scale","scale"), &AudioServer::set_fx_global_volume_scale );
- ObjectTypeDB::bind_method(_MD("get_fx_global_volume_scale"), &AudioServer::get_fx_global_volume_scale );
+ ObjectTypeDB::bind_method(_MD("set_event_voice_global_volume_scale", "scale"), &AudioServer::set_event_voice_global_volume_scale);
+ ObjectTypeDB::bind_method(_MD("get_event_voice_global_volume_scale"), &AudioServer::get_event_voice_global_volume_scale);
- ObjectTypeDB::bind_method(_MD("set_event_voice_global_volume_scale","scale"), &AudioServer::set_event_voice_global_volume_scale );
- ObjectTypeDB::bind_method(_MD("get_event_voice_global_volume_scale"), &AudioServer::get_event_voice_global_volume_scale );
+ BIND_CONSTANT(SAMPLE_FORMAT_PCM8);
+ BIND_CONSTANT(SAMPLE_FORMAT_PCM16);
+ BIND_CONSTANT(SAMPLE_FORMAT_IMA_ADPCM);
- BIND_CONSTANT( SAMPLE_FORMAT_PCM8 );
- BIND_CONSTANT( SAMPLE_FORMAT_PCM16 );
- BIND_CONSTANT( SAMPLE_FORMAT_IMA_ADPCM );
+ BIND_CONSTANT(SAMPLE_LOOP_NONE);
+ BIND_CONSTANT(SAMPLE_LOOP_FORWARD);
+ BIND_CONSTANT(SAMPLE_LOOP_PING_PONG);
- BIND_CONSTANT( SAMPLE_LOOP_NONE );
- BIND_CONSTANT( SAMPLE_LOOP_FORWARD );
- BIND_CONSTANT( SAMPLE_LOOP_PING_PONG );
+ BIND_CONSTANT(FILTER_NONE);
+ BIND_CONSTANT(FILTER_LOWPASS);
+ BIND_CONSTANT(FILTER_BANDPASS);
+ BIND_CONSTANT(FILTER_HIPASS);
+ BIND_CONSTANT(FILTER_NOTCH);
+ BIND_CONSTANT(FILTER_BANDLIMIT); ///< cutoff is LP resonace is HP
- BIND_CONSTANT( FILTER_NONE );
- BIND_CONSTANT( FILTER_LOWPASS );
- BIND_CONSTANT( FILTER_BANDPASS );
- BIND_CONSTANT( FILTER_HIPASS );
- BIND_CONSTANT( FILTER_NOTCH );
- BIND_CONSTANT( FILTER_BANDLIMIT ); ///< cutoff is LP resonace is HP
-
- BIND_CONSTANT( REVERB_SMALL );
- BIND_CONSTANT( REVERB_MEDIUM );
- BIND_CONSTANT( REVERB_LARGE );
- BIND_CONSTANT( REVERB_HALL );
-
- GLOBAL_DEF("audio/stream_buffering_ms",500);
- GLOBAL_DEF("audio/video_delay_compensation_ms",300);
+ BIND_CONSTANT(REVERB_SMALL);
+ BIND_CONSTANT(REVERB_MEDIUM);
+ BIND_CONSTANT(REVERB_LARGE);
+ BIND_CONSTANT(REVERB_HALL);
+ GLOBAL_DEF("audio/stream_buffering_ms", 500);
+ GLOBAL_DEF("audio/video_delay_compensation_ms", 300);
}
AudioServer::AudioServer() {
- singleton=this;
+ singleton = this;
}
AudioServer::~AudioServer() {
-
-
}
diff --git a/servers/audio_server.h b/servers/audio_server.h
index 0ec708a0a..8ccdb6d90 100644
--- a/servers/audio_server.h
+++ b/servers/audio_server.h
@@ -29,18 +29,17 @@
#ifndef AUDIO_SERVER_H
#define AUDIO_SERVER_H
-#include "variant.h"
#include "object.h"
+#include "variant.h"
class AudioMixer {
protected:
-
void audio_mixer_chunk_call(int p_frames);
-public:
+public:
enum {
- INVALID_CHANNEL=0xFFFFFFFF
+ INVALID_CHANNEL = 0xFFFFFFFF
};
typedef uint32_t ChannelID;
@@ -69,79 +68,76 @@ public:
MAX_REVERBS
};
- virtual ChannelID channel_alloc(RID p_sample)=0;
-
- virtual void channel_set_volume(ChannelID p_channel, float p_gain)=0;
- virtual void channel_set_pan(ChannelID p_channel, float p_pan, float p_depth=0,float height=0)=0; //pan and depth go from -1 to 1
- virtual void channel_set_filter(ChannelID p_channel, FilterType p_type, float p_cutoff, float p_resonance, float p_gain=1.0)=0;
- virtual void channel_set_chorus(ChannelID p_channel, float p_chorus )=0;
- virtual void channel_set_reverb(ChannelID p_channel, ReverbRoomType p_room_type, float p_reverb)=0;
- virtual void channel_set_mix_rate(ChannelID p_channel, int p_mix_rate)=0;
- virtual void channel_set_positional(ChannelID p_channel, bool p_positional)=0;
+ virtual ChannelID channel_alloc(RID p_sample) = 0;
- virtual float channel_get_volume(ChannelID p_channel) const=0;
- virtual float channel_get_pan(ChannelID p_channel) const=0; //pan and depth go from -1 to 1
- virtual float channel_get_pan_depth(ChannelID p_channel) const=0; //pan and depth go from -1 to 1
- virtual float channel_get_pan_height(ChannelID p_channel) const=0; //pan and depth go from -1 to 1
- virtual FilterType channel_get_filter_type(ChannelID p_channel) const=0;
- virtual float channel_get_filter_cutoff(ChannelID p_channel) const=0;
- virtual float channel_get_filter_resonance(ChannelID p_channel) const=0;
- virtual float channel_get_filter_gain(ChannelID p_channel) const=0;
- virtual float channel_get_chorus(ChannelID p_channel) const=0;
- virtual ReverbRoomType channel_get_reverb_type(ChannelID p_channel) const=0;
- virtual float channel_get_reverb(ChannelID p_channel) const=0;
+ virtual void channel_set_volume(ChannelID p_channel, float p_gain) = 0;
+ virtual void channel_set_pan(ChannelID p_channel, float p_pan, float p_depth = 0, float height = 0) = 0; //pan and depth go from -1 to 1
+ virtual void channel_set_filter(ChannelID p_channel, FilterType p_type, float p_cutoff, float p_resonance, float p_gain = 1.0) = 0;
+ virtual void channel_set_chorus(ChannelID p_channel, float p_chorus) = 0;
+ virtual void channel_set_reverb(ChannelID p_channel, ReverbRoomType p_room_type, float p_reverb) = 0;
+ virtual void channel_set_mix_rate(ChannelID p_channel, int p_mix_rate) = 0;
+ virtual void channel_set_positional(ChannelID p_channel, bool p_positional) = 0;
- virtual int channel_get_mix_rate(ChannelID p_channel) const=0;
- virtual bool channel_is_positional(ChannelID p_channel) const=0;
- virtual bool channel_is_valid(ChannelID p_channel) const=0;
+ virtual float channel_get_volume(ChannelID p_channel) const = 0;
+ virtual float channel_get_pan(ChannelID p_channel) const = 0; //pan and depth go from -1 to 1
+ virtual float channel_get_pan_depth(ChannelID p_channel) const = 0; //pan and depth go from -1 to 1
+ virtual float channel_get_pan_height(ChannelID p_channel) const = 0; //pan and depth go from -1 to 1
+ virtual FilterType channel_get_filter_type(ChannelID p_channel) const = 0;
+ virtual float channel_get_filter_cutoff(ChannelID p_channel) const = 0;
+ virtual float channel_get_filter_resonance(ChannelID p_channel) const = 0;
+ virtual float channel_get_filter_gain(ChannelID p_channel) const = 0;
+ virtual float channel_get_chorus(ChannelID p_channel) const = 0;
+ virtual ReverbRoomType channel_get_reverb_type(ChannelID p_channel) const = 0;
+ virtual float channel_get_reverb(ChannelID p_channel) const = 0;
+ virtual int channel_get_mix_rate(ChannelID p_channel) const = 0;
+ virtual bool channel_is_positional(ChannelID p_channel) const = 0;
+ virtual bool channel_is_valid(ChannelID p_channel) const = 0;
- virtual void channel_free(ChannelID p_channel)=0;
-
- virtual void set_mixer_volume(float p_volume)=0;
+ virtual void channel_free(ChannelID p_channel) = 0;
+ virtual void set_mixer_volume(float p_volume) = 0;
virtual ~AudioMixer() {}
};
-
class AudioServer : public Object {
- OBJ_TYPE( AudioServer, Object );
+ OBJ_TYPE(AudioServer, Object);
static AudioServer *singleton;
+
protected:
-friend class AudioStream;
-friend class EventStream;
-friend class AudioMixer;
+ friend class AudioStream;
+ friend class EventStream;
+ friend class AudioMixer;
- virtual AudioMixer *get_mixer()=0;
- virtual void audio_mixer_chunk_callback(int p_frames)=0;
+ virtual AudioMixer *get_mixer() = 0;
+ virtual void audio_mixer_chunk_callback(int p_frames) = 0;
static void _bind_methods();
-public:
-
+public:
class EventStream {
protected:
AudioMixer *get_mixer() const;
+
public:
- virtual void update(uint64_t p_usec)=0;
+ virtual void update(uint64_t p_usec) = 0;
virtual ~EventStream() {}
};
class AudioStream {
public:
- virtual int get_channel_count() const=0;
- virtual void set_mix_rate(int p_rate)=0; //notify the stream of the mix rate
- virtual bool mix(int32_t *p_buffer,int p_frames)=0;
- virtual void update()=0;
+ virtual int get_channel_count() const = 0;
+ virtual void set_mix_rate(int p_rate) = 0; //notify the stream of the mix rate
+ virtual bool mix(int32_t *p_buffer, int p_frames) = 0;
+ virtual void update() = 0;
virtual bool can_update_mt() const { return true; }
virtual ~AudioStream() {}
};
-
enum SampleFormat {
SAMPLE_FORMAT_PCM8,
@@ -158,32 +154,31 @@ public:
/* SAMPLE API */
- virtual RID sample_create(SampleFormat p_format, bool p_stereo, int p_length)=0;
-
- virtual void sample_set_description(RID p_sample, const String& p_description)=0;
- virtual String sample_get_description(RID p_sample) const=0;
+ virtual RID sample_create(SampleFormat p_format, bool p_stereo, int p_length) = 0;
- virtual SampleFormat sample_get_format(RID p_sample) const=0;
- virtual bool sample_is_stereo(RID p_sample) const=0;
- virtual int sample_get_length(RID p_sample) const=0;
- virtual const void* sample_get_data_ptr(RID p_sample) const=0;
+ virtual void sample_set_description(RID p_sample, const String &p_description) = 0;
+ virtual String sample_get_description(RID p_sample) const = 0;
- virtual void sample_set_signed_data(RID p_sample, const DVector<float>& p_buffer);
- virtual void sample_set_data(RID p_sample, const DVector<uint8_t>& p_buffer)=0;
- virtual DVector<uint8_t> sample_get_data(RID p_sample) const=0;
+ virtual SampleFormat sample_get_format(RID p_sample) const = 0;
+ virtual bool sample_is_stereo(RID p_sample) const = 0;
+ virtual int sample_get_length(RID p_sample) const = 0;
+ virtual const void *sample_get_data_ptr(RID p_sample) const = 0;
- virtual void sample_set_mix_rate(RID p_sample,int p_rate)=0;
- virtual int sample_get_mix_rate(RID p_sample) const=0;
+ virtual void sample_set_signed_data(RID p_sample, const DVector<float> &p_buffer);
+ virtual void sample_set_data(RID p_sample, const DVector<uint8_t> &p_buffer) = 0;
+ virtual DVector<uint8_t> sample_get_data(RID p_sample) const = 0;
- virtual void sample_set_loop_format(RID p_sample,SampleLoopFormat p_format)=0;
- virtual SampleLoopFormat sample_get_loop_format(RID p_sample) const=0;
+ virtual void sample_set_mix_rate(RID p_sample, int p_rate) = 0;
+ virtual int sample_get_mix_rate(RID p_sample) const = 0;
- virtual void sample_set_loop_begin(RID p_sample,int p_pos)=0;
- virtual int sample_get_loop_begin(RID p_sample) const=0;
+ virtual void sample_set_loop_format(RID p_sample, SampleLoopFormat p_format) = 0;
+ virtual SampleLoopFormat sample_get_loop_format(RID p_sample) const = 0;
- virtual void sample_set_loop_end(RID p_sample,int p_pos)=0;
- virtual int sample_get_loop_end(RID p_sample) const=0;
+ virtual void sample_set_loop_begin(RID p_sample, int p_pos) = 0;
+ virtual int sample_get_loop_begin(RID p_sample) const = 0;
+ virtual void sample_set_loop_end(RID p_sample, int p_pos) = 0;
+ virtual int sample_get_loop_end(RID p_sample) const = 0;
/* VOICE API */
@@ -207,84 +202,84 @@ public:
REVERB_HALL
};
- virtual RID voice_create()=0;
+ virtual RID voice_create() = 0;
- virtual void voice_play(RID p_voice, RID p_sample)=0;
+ virtual void voice_play(RID p_voice, RID p_sample) = 0;
- virtual void voice_set_volume(RID p_voice, float p_volume)=0;
- virtual void voice_set_pan(RID p_voice, float p_pan, float p_depth=0,float height=0)=0; //pan and depth go from -1 to 1
- virtual void voice_set_filter(RID p_voice, FilterType p_type, float p_cutoff, float p_resonance, float p_gain=0)=0;
- virtual void voice_set_chorus(RID p_voice, float p_chorus )=0;
- virtual void voice_set_reverb(RID p_voice, ReverbRoomType p_room_type, float p_reverb)=0;
- virtual void voice_set_mix_rate(RID p_voice, int p_mix_rate)=0;
- virtual void voice_set_positional(RID p_voice, bool p_positional)=0;
+ virtual void voice_set_volume(RID p_voice, float p_volume) = 0;
+ virtual void voice_set_pan(RID p_voice, float p_pan, float p_depth = 0, float height = 0) = 0; //pan and depth go from -1 to 1
+ virtual void voice_set_filter(RID p_voice, FilterType p_type, float p_cutoff, float p_resonance, float p_gain = 0) = 0;
+ virtual void voice_set_chorus(RID p_voice, float p_chorus) = 0;
+ virtual void voice_set_reverb(RID p_voice, ReverbRoomType p_room_type, float p_reverb) = 0;
+ virtual void voice_set_mix_rate(RID p_voice, int p_mix_rate) = 0;
+ virtual void voice_set_positional(RID p_voice, bool p_positional) = 0;
- virtual float voice_get_volume(RID p_voice) const=0;
- virtual float voice_get_pan(RID p_voice) const=0; //pan and depth go from -1 to 1
- virtual float voice_get_pan_depth(RID p_voice) const=0; //pan and depth go from -1 to 1
- virtual float voice_get_pan_height(RID p_voice) const=0; //pan and depth go from -1 to 1
- virtual FilterType voice_get_filter_type(RID p_voice) const=0;
- virtual float voice_get_filter_cutoff(RID p_voice) const=0;
- virtual float voice_get_filter_resonance(RID p_voice) const=0;
- virtual float voice_get_chorus(RID p_voice) const=0;
- virtual ReverbRoomType voice_get_reverb_type(RID p_voice) const=0;
- virtual float voice_get_reverb(RID p_voice) const=0;
+ virtual float voice_get_volume(RID p_voice) const = 0;
+ virtual float voice_get_pan(RID p_voice) const = 0; //pan and depth go from -1 to 1
+ virtual float voice_get_pan_depth(RID p_voice) const = 0; //pan and depth go from -1 to 1
+ virtual float voice_get_pan_height(RID p_voice) const = 0; //pan and depth go from -1 to 1
+ virtual FilterType voice_get_filter_type(RID p_voice) const = 0;
+ virtual float voice_get_filter_cutoff(RID p_voice) const = 0;
+ virtual float voice_get_filter_resonance(RID p_voice) const = 0;
+ virtual float voice_get_chorus(RID p_voice) const = 0;
+ virtual ReverbRoomType voice_get_reverb_type(RID p_voice) const = 0;
+ virtual float voice_get_reverb(RID p_voice) const = 0;
- virtual int voice_get_mix_rate(RID p_voice) const=0;
- virtual bool voice_is_positional(RID p_voice) const=0;
+ virtual int voice_get_mix_rate(RID p_voice) const = 0;
+ virtual bool voice_is_positional(RID p_voice) const = 0;
- virtual void voice_stop(RID p_voice)=0;
- virtual bool voice_is_active(RID p_voice) const=0;
+ virtual void voice_stop(RID p_voice) = 0;
+ virtual bool voice_is_active(RID p_voice) const = 0;
/* STREAM API */
- virtual RID audio_stream_create(AudioStream *p_stream)=0;
- virtual RID event_stream_create(EventStream *p_stream)=0;
+ virtual RID audio_stream_create(AudioStream *p_stream) = 0;
+ virtual RID event_stream_create(EventStream *p_stream) = 0;
- virtual void stream_set_active(RID p_stream, bool p_active)=0;
- virtual bool stream_is_active(RID p_stream) const=0;
+ virtual void stream_set_active(RID p_stream, bool p_active) = 0;
+ virtual bool stream_is_active(RID p_stream) const = 0;
- virtual void stream_set_volume_scale(RID p_stream, float p_scale)=0;
- virtual float stream_set_volume_scale(RID p_stream) const=0;
+ virtual void stream_set_volume_scale(RID p_stream, float p_scale) = 0;
+ virtual float stream_set_volume_scale(RID p_stream) const = 0;
/* Audio Physics API */
- virtual void free(RID p_id)=0;
+ virtual void free(RID p_id) = 0;
- virtual void init()=0;
- virtual void finish()=0;
- virtual void update()=0;
+ virtual void init() = 0;
+ virtual void finish() = 0;
+ virtual void update() = 0;
/* MISC config */
- virtual void lock()=0;
- virtual void unlock()=0;
- virtual int get_default_channel_count() const=0;
- virtual int get_default_mix_rate() const=0;
+ virtual void lock() = 0;
+ virtual void unlock() = 0;
+ virtual int get_default_channel_count() const = 0;
+ virtual int get_default_mix_rate() const = 0;
- virtual void set_stream_global_volume_scale(float p_volume)=0;
- virtual void set_fx_global_volume_scale(float p_volume)=0;
- virtual void set_event_voice_global_volume_scale(float p_volume)=0;
+ virtual void set_stream_global_volume_scale(float p_volume) = 0;
+ virtual void set_fx_global_volume_scale(float p_volume) = 0;
+ virtual void set_event_voice_global_volume_scale(float p_volume) = 0;
- virtual float get_stream_global_volume_scale() const=0;
- virtual float get_fx_global_volume_scale() const=0;
- virtual float get_event_voice_global_volume_scale() const=0;
+ virtual float get_stream_global_volume_scale() const = 0;
+ virtual float get_fx_global_volume_scale() const = 0;
+ virtual float get_event_voice_global_volume_scale() const = 0;
- virtual uint32_t read_output_peak() const=0;
+ virtual uint32_t read_output_peak() const = 0;
static AudioServer *get_singleton();
- virtual double get_mix_time() const=0; //useful for video -> audio sync
- virtual double get_output_delay() const=0;
+ virtual double get_mix_time() const = 0; //useful for video -> audio sync
+ virtual double get_output_delay() const = 0;
AudioServer();
virtual ~AudioServer();
};
-VARIANT_ENUM_CAST( AudioServer::SampleFormat );
-VARIANT_ENUM_CAST( AudioServer::SampleLoopFormat );
-VARIANT_ENUM_CAST( AudioServer::FilterType );
-VARIANT_ENUM_CAST( AudioServer::ReverbRoomType );
+VARIANT_ENUM_CAST(AudioServer::SampleFormat);
+VARIANT_ENUM_CAST(AudioServer::SampleLoopFormat);
+VARIANT_ENUM_CAST(AudioServer::FilterType);
+VARIANT_ENUM_CAST(AudioServer::ReverbRoomType);
typedef AudioServer AS;
diff --git a/servers/physics/area_pair_sw.cpp b/servers/physics/area_pair_sw.cpp
index 1131aa90d..2ea58c2f9 100644
--- a/servers/physics/area_pair_sw.cpp
+++ b/servers/physics/area_pair_sw.cpp
@@ -29,7 +29,6 @@
#include "area_pair_sw.h"
#include "collision_solver_sw.h"
-
bool AreaPairSW::setup(float p_step) {
if (!area->test_collision_mask(body)) {
@@ -37,63 +36,55 @@ bool AreaPairSW::setup(float p_step) {
return false;
}
- bool result = CollisionSolverSW::solve_static(body->get_shape(body_shape),body->get_transform() * body->get_shape_transform(body_shape),area->get_shape(area_shape),area->get_transform() * area->get_shape_transform(area_shape),NULL,this);
+ bool result = CollisionSolverSW::solve_static(body->get_shape(body_shape), body->get_transform() * body->get_shape_transform(body_shape), area->get_shape(area_shape), area->get_transform() * area->get_shape_transform(area_shape), NULL, this);
- if (result!=colliding) {
+ if (result != colliding) {
if (result) {
- if (area->get_space_override_mode()!=PhysicsServer::AREA_SPACE_OVERRIDE_DISABLED)
+ if (area->get_space_override_mode() != PhysicsServer::AREA_SPACE_OVERRIDE_DISABLED)
body->add_area(area);
if (area->has_monitor_callback())
- area->add_body_to_query(body,body_shape,area_shape);
+ area->add_body_to_query(body, body_shape, area_shape);
} else {
- if (area->get_space_override_mode()!=PhysicsServer::AREA_SPACE_OVERRIDE_DISABLED)
+ if (area->get_space_override_mode() != PhysicsServer::AREA_SPACE_OVERRIDE_DISABLED)
body->remove_area(area);
if (area->has_monitor_callback())
- area->remove_body_from_query(body,body_shape,area_shape);
-
+ area->remove_body_from_query(body, body_shape, area_shape);
}
- colliding=result;
-
+ colliding = result;
}
return false; //never do any post solving
}
void AreaPairSW::solve(float p_step) {
-
-
}
+AreaPairSW::AreaPairSW(BodySW *p_body, int p_body_shape, AreaSW *p_area, int p_area_shape) {
-AreaPairSW::AreaPairSW(BodySW *p_body,int p_body_shape, AreaSW *p_area,int p_area_shape) {
-
- body=p_body;
- area=p_area;
- body_shape=p_body_shape;
- area_shape=p_area_shape;
- colliding=false;
- body->add_constraint(this,0);
+ body = p_body;
+ area = p_area;
+ body_shape = p_body_shape;
+ area_shape = p_area_shape;
+ colliding = false;
+ body->add_constraint(this, 0);
area->add_constraint(this);
- if (p_body->get_mode()==PhysicsServer::BODY_MODE_KINEMATIC)
+ if (p_body->get_mode() == PhysicsServer::BODY_MODE_KINEMATIC)
p_body->set_active(true);
-
}
AreaPairSW::~AreaPairSW() {
if (colliding) {
- if (area->get_space_override_mode()!=PhysicsServer::AREA_SPACE_OVERRIDE_DISABLED)
+ if (area->get_space_override_mode() != PhysicsServer::AREA_SPACE_OVERRIDE_DISABLED)
body->remove_area(area);
if (area->has_monitor_callback())
- area->remove_body_from_query(body,body_shape,area_shape);
-
-
+ area->remove_body_from_query(body, body_shape, area_shape);
}
body->remove_constraint(this);
area->remove_constraint(this);
@@ -101,8 +92,6 @@ AreaPairSW::~AreaPairSW() {
////////////////////////////////////////////////////
-
-
bool Area2PairSW::setup(float p_step) {
if (!area_a->test_collision_mask(area_b)) {
@@ -110,52 +99,46 @@ bool Area2PairSW::setup(float p_step) {
return false;
}
-// bool result = area_a->test_collision_mask(area_b) && CollisionSolverSW::solve(area_a->get_shape(shape_a),area_a->get_transform() * area_a->get_shape_transform(shape_a),Vector2(),area_b->get_shape(shape_b),area_b->get_transform() * area_b->get_shape_transform(shape_b),Vector2(),NULL,this);
- bool result = CollisionSolverSW::solve_static(area_a->get_shape(shape_a),area_a->get_transform() * area_a->get_shape_transform(shape_a),area_b->get_shape(shape_b),area_b->get_transform() * area_b->get_shape_transform(shape_b),NULL,this);
+ // bool result = area_a->test_collision_mask(area_b) && CollisionSolverSW::solve(area_a->get_shape(shape_a),area_a->get_transform() * area_a->get_shape_transform(shape_a),Vector2(),area_b->get_shape(shape_b),area_b->get_transform() * area_b->get_shape_transform(shape_b),Vector2(),NULL,this);
+ bool result = CollisionSolverSW::solve_static(area_a->get_shape(shape_a), area_a->get_transform() * area_a->get_shape_transform(shape_a), area_b->get_shape(shape_b), area_b->get_transform() * area_b->get_shape_transform(shape_b), NULL, this);
- if (result!=colliding) {
+ if (result != colliding) {
if (result) {
if (area_b->has_area_monitor_callback() && area_a->is_monitorable())
- area_b->add_area_to_query(area_a,shape_a,shape_b);
+ area_b->add_area_to_query(area_a, shape_a, shape_b);
if (area_a->has_area_monitor_callback() && area_b->is_monitorable())
- area_a->add_area_to_query(area_b,shape_b,shape_a);
+ area_a->add_area_to_query(area_b, shape_b, shape_a);
} else {
if (area_b->has_area_monitor_callback() && area_a->is_monitorable())
- area_b->remove_area_from_query(area_a,shape_a,shape_b);
+ area_b->remove_area_from_query(area_a, shape_a, shape_b);
if (area_a->has_area_monitor_callback() && area_b->is_monitorable())
- area_a->remove_area_from_query(area_b,shape_b,shape_a);
+ area_a->remove_area_from_query(area_b, shape_b, shape_a);
}
- colliding=result;
-
+ colliding = result;
}
return false; //never do any post solving
}
void Area2PairSW::solve(float p_step) {
-
-
}
+Area2PairSW::Area2PairSW(AreaSW *p_area_a, int p_shape_a, AreaSW *p_area_b, int p_shape_b) {
-Area2PairSW::Area2PairSW(AreaSW *p_area_a,int p_shape_a, AreaSW *p_area_b,int p_shape_b) {
-
-
- area_a=p_area_a;
- area_b=p_area_b;
- shape_a=p_shape_a;
- shape_b=p_shape_b;
- colliding=false;
+ area_a = p_area_a;
+ area_b = p_area_b;
+ shape_a = p_shape_a;
+ shape_b = p_shape_b;
+ colliding = false;
area_a->add_constraint(this);
area_b->add_constraint(this);
-
}
Area2PairSW::~Area2PairSW() {
@@ -163,10 +146,10 @@ Area2PairSW::~Area2PairSW() {
if (colliding) {
if (area_b->has_area_monitor_callback() && area_a->is_monitorable())
- area_b->remove_area_from_query(area_a,shape_a,shape_b);
+ area_b->remove_area_from_query(area_a, shape_a, shape_b);
if (area_a->has_area_monitor_callback() && area_b->is_monitorable())
- area_a->remove_area_from_query(area_b,shape_b,shape_a);
+ area_a->remove_area_from_query(area_b, shape_b, shape_a);
}
area_a->remove_constraint(this);
diff --git a/servers/physics/area_pair_sw.h b/servers/physics/area_pair_sw.h
index 17477dcbd..e05040a36 100644
--- a/servers/physics/area_pair_sw.h
+++ b/servers/physics/area_pair_sw.h
@@ -29,9 +29,9 @@
#ifndef AREA_PAIR_SW_H
#define AREA_PAIR_SW_H
-#include "constraint_sw.h"
-#include "body_sw.h"
#include "area_sw.h"
+#include "body_sw.h"
+#include "constraint_sw.h"
class AreaPairSW : public ConstraintSW {
@@ -40,16 +40,15 @@ class AreaPairSW : public ConstraintSW {
int body_shape;
int area_shape;
bool colliding;
-public:
+public:
bool setup(float p_step);
void solve(float p_step);
- AreaPairSW(BodySW *p_body,int p_body_shape, AreaSW *p_area,int p_area_shape);
+ AreaPairSW(BodySW *p_body, int p_body_shape, AreaSW *p_area, int p_area_shape);
~AreaPairSW();
};
-
class Area2PairSW : public ConstraintSW {
AreaSW *area_a;
@@ -57,15 +56,13 @@ class Area2PairSW : public ConstraintSW {
int shape_a;
int shape_b;
bool colliding;
-public:
+public:
bool setup(float p_step);
void solve(float p_step);
- Area2PairSW(AreaSW *p_area_a,int p_shape_a, AreaSW *p_area_b,int p_shape_b);
+ Area2PairSW(AreaSW *p_area_a, int p_shape_a, AreaSW *p_area_b, int p_shape_b);
~Area2PairSW();
};
-
#endif // AREA_PAIR__SW_H
-
diff --git a/servers/physics/area_sw.cpp b/servers/physics/area_sw.cpp
index 84389c9b7..2b7e87155 100644
--- a/servers/physics/area_sw.cpp
+++ b/servers/physics/area_sw.cpp
@@ -27,18 +27,26 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include "area_sw.h"
-#include "space_sw.h"
#include "body_sw.h"
+#include "space_sw.h"
-AreaSW::BodyKey::BodyKey(BodySW *p_body, uint32_t p_body_shape,uint32_t p_area_shape) { rid=p_body->get_self(); instance_id=p_body->get_instance_id(); body_shape=p_body_shape; area_shape=p_area_shape; }
-AreaSW::BodyKey::BodyKey(AreaSW *p_body, uint32_t p_body_shape,uint32_t p_area_shape) { rid=p_body->get_self(); instance_id=p_body->get_instance_id(); body_shape=p_body_shape; area_shape=p_area_shape; }
+AreaSW::BodyKey::BodyKey(BodySW *p_body, uint32_t p_body_shape, uint32_t p_area_shape) {
+ rid = p_body->get_self();
+ instance_id = p_body->get_instance_id();
+ body_shape = p_body_shape;
+ area_shape = p_area_shape;
+}
+AreaSW::BodyKey::BodyKey(AreaSW *p_body, uint32_t p_body_shape, uint32_t p_area_shape) {
+ rid = p_body->get_self();
+ instance_id = p_body->get_instance_id();
+ body_shape = p_body_shape;
+ area_shape = p_area_shape;
+}
void AreaSW::_shapes_changed() {
-
-
}
-void AreaSW::set_transform(const Transform& p_transform) {
+void AreaSW::set_transform(const Transform &p_transform) {
if (!moved_list.in_list() && get_space())
get_space()->area_add_to_moved_list(&moved_list);
@@ -54,7 +62,6 @@ void AreaSW::set_space(SpaceSW *p_space) {
get_space()->area_remove_from_monitor_query_list(&monitor_query_list);
if (moved_list.in_list())
get_space()->area_remove_from_moved_list(&moved_list);
-
}
monitored_bodies.clear();
@@ -63,44 +70,38 @@ void AreaSW::set_space(SpaceSW *p_space) {
_set_space(p_space);
}
+void AreaSW::set_monitor_callback(ObjectID p_id, const StringName &p_method) {
-void AreaSW::set_monitor_callback(ObjectID p_id, const StringName& p_method) {
-
-
- if (p_id==monitor_callback_id) {
- monitor_callback_method=p_method;
+ if (p_id == monitor_callback_id) {
+ monitor_callback_method = p_method;
return;
}
_unregister_shapes();
- monitor_callback_id=p_id;
- monitor_callback_method=p_method;
+ monitor_callback_id = p_id;
+ monitor_callback_method = p_method;
monitored_bodies.clear();
monitored_areas.clear();
-
_shape_changed();
if (!moved_list.in_list() && get_space())
get_space()->area_add_to_moved_list(&moved_list);
-
-
}
-void AreaSW::set_area_monitor_callback(ObjectID p_id, const StringName& p_method) {
+void AreaSW::set_area_monitor_callback(ObjectID p_id, const StringName &p_method) {
-
- if (p_id==area_monitor_callback_id) {
- area_monitor_callback_method=p_method;
+ if (p_id == area_monitor_callback_id) {
+ area_monitor_callback_method = p_method;
return;
}
_unregister_shapes();
- area_monitor_callback_id=p_id;
- area_monitor_callback_method=p_method;
+ area_monitor_callback_id = p_id;
+ area_monitor_callback_method = p_method;
monitored_bodies.clear();
monitored_areas.clear();
@@ -109,45 +110,63 @@ void AreaSW::set_area_monitor_callback(ObjectID p_id, const StringName& p_method
if (!moved_list.in_list() && get_space())
get_space()->area_add_to_moved_list(&moved_list);
-
-
}
-
void AreaSW::set_space_override_mode(PhysicsServer::AreaSpaceOverrideMode p_mode) {
- bool do_override=p_mode!=PhysicsServer::AREA_SPACE_OVERRIDE_DISABLED;
- if (do_override==(space_override_mode!=PhysicsServer::AREA_SPACE_OVERRIDE_DISABLED))
+ bool do_override = p_mode != PhysicsServer::AREA_SPACE_OVERRIDE_DISABLED;
+ if (do_override == (space_override_mode != PhysicsServer::AREA_SPACE_OVERRIDE_DISABLED))
return;
_unregister_shapes();
- space_override_mode=p_mode;
+ space_override_mode = p_mode;
_shape_changed();
}
-void AreaSW::set_param(PhysicsServer::AreaParameter p_param, const Variant& p_value) {
+void AreaSW::set_param(PhysicsServer::AreaParameter p_param, const Variant &p_value) {
- switch(p_param) {
- case PhysicsServer::AREA_PARAM_GRAVITY: gravity=p_value; ; break;
- case PhysicsServer::AREA_PARAM_GRAVITY_VECTOR: gravity_vector=p_value; ; break;
- case PhysicsServer::AREA_PARAM_GRAVITY_IS_POINT: gravity_is_point=p_value; ; break;
- case PhysicsServer::AREA_PARAM_GRAVITY_DISTANCE_SCALE: gravity_distance_scale=p_value; ; break;
- case PhysicsServer::AREA_PARAM_GRAVITY_POINT_ATTENUATION: point_attenuation=p_value; ; break;
- case PhysicsServer::AREA_PARAM_LINEAR_DAMP: linear_damp=p_value; ; break;
- case PhysicsServer::AREA_PARAM_ANGULAR_DAMP: angular_damp=p_value; ; break;
- case PhysicsServer::AREA_PARAM_PRIORITY: priority=p_value; ; break;
+ switch (p_param) {
+ case PhysicsServer::AREA_PARAM_GRAVITY:
+ gravity = p_value;
+ ;
+ break;
+ case PhysicsServer::AREA_PARAM_GRAVITY_VECTOR:
+ gravity_vector = p_value;
+ ;
+ break;
+ case PhysicsServer::AREA_PARAM_GRAVITY_IS_POINT:
+ gravity_is_point = p_value;
+ ;
+ break;
+ case PhysicsServer::AREA_PARAM_GRAVITY_DISTANCE_SCALE:
+ gravity_distance_scale = p_value;
+ ;
+ break;
+ case PhysicsServer::AREA_PARAM_GRAVITY_POINT_ATTENUATION:
+ point_attenuation = p_value;
+ ;
+ break;
+ case PhysicsServer::AREA_PARAM_LINEAR_DAMP:
+ linear_damp = p_value;
+ ;
+ break;
+ case PhysicsServer::AREA_PARAM_ANGULAR_DAMP:
+ angular_damp = p_value;
+ ;
+ break;
+ case PhysicsServer::AREA_PARAM_PRIORITY:
+ priority = p_value;
+ ;
+ break;
}
-
-
}
Variant AreaSW::get_param(PhysicsServer::AreaParameter p_param) const {
-
- switch(p_param) {
+ switch (p_param) {
case PhysicsServer::AREA_PARAM_GRAVITY: return gravity;
case PhysicsServer::AREA_PARAM_GRAVITY_VECTOR: return gravity_vector;
case PhysicsServer::AREA_PARAM_GRAVITY_IS_POINT: return gravity_is_point;
case PhysicsServer::AREA_PARAM_GRAVITY_DISTANCE_SCALE: return gravity_distance_scale;
- case PhysicsServer::AREA_PARAM_GRAVITY_POINT_ATTENUATION: return point_attenuation;
+ case PhysicsServer::AREA_PARAM_GRAVITY_POINT_ATTENUATION: return point_attenuation;
case PhysicsServer::AREA_PARAM_LINEAR_DAMP: return linear_damp;
case PhysicsServer::AREA_PARAM_ANGULAR_DAMP: return angular_damp;
case PhysicsServer::AREA_PARAM_PRIORITY: return priority;
@@ -156,23 +175,20 @@ Variant AreaSW::get_param(PhysicsServer::AreaParameter p_param) const {
return Variant();
}
-
void AreaSW::_queue_monitor_update() {
ERR_FAIL_COND(!get_space());
if (!monitor_query_list.in_list())
get_space()->area_add_to_monitor_query_list(&monitor_query_list);
-
-
}
void AreaSW::set_monitorable(bool p_monitorable) {
- if (monitorable==p_monitorable)
+ if (monitorable == p_monitorable)
return;
- monitorable=p_monitorable;
+ monitorable = p_monitorable;
_set_static(!monitorable);
}
@@ -182,29 +198,29 @@ void AreaSW::call_queries() {
Variant res[5];
Variant *resptr[5];
- for(int i=0;i<5;i++)
- resptr[i]=&res[i];
+ for (int i = 0; i < 5; i++)
+ resptr[i] = &res[i];
Object *obj = ObjectDB::get_instance(monitor_callback_id);
if (!obj) {
monitored_bodies.clear();
- monitor_callback_id=0;
+ monitor_callback_id = 0;
return;
}
- for (Map<BodyKey,BodyState>::Element *E=monitored_bodies.front();E;E=E->next()) {
+ for (Map<BodyKey, BodyState>::Element *E = monitored_bodies.front(); E; E = E->next()) {
- if (E->get().state==0)
+ if (E->get().state == 0)
continue; //nothing happened
- res[0]=E->get().state>0 ? PhysicsServer::AREA_BODY_ADDED : PhysicsServer::AREA_BODY_REMOVED;
- res[1]=E->key().rid;
- res[2]=E->key().instance_id;
- res[3]=E->key().body_shape;
- res[4]=E->key().area_shape;
+ res[0] = E->get().state > 0 ? PhysicsServer::AREA_BODY_ADDED : PhysicsServer::AREA_BODY_REMOVED;
+ res[1] = E->key().rid;
+ res[2] = E->key().instance_id;
+ res[3] = E->key().body_shape;
+ res[4] = E->key().area_shape;
Variant::CallError ce;
- obj->call(monitor_callback_method,(const Variant**)resptr,5,ce);
+ obj->call(monitor_callback_method, (const Variant **)resptr, 5, ce);
}
}
@@ -212,64 +228,56 @@ void AreaSW::call_queries() {
if (area_monitor_callback_id && !monitored_areas.empty()) {
-
Variant res[5];
Variant *resptr[5];
- for(int i=0;i<5;i++)
- resptr[i]=&res[i];
+ for (int i = 0; i < 5; i++)
+ resptr[i] = &res[i];
Object *obj = ObjectDB::get_instance(area_monitor_callback_id);
if (!obj) {
monitored_areas.clear();
- area_monitor_callback_id=0;
+ area_monitor_callback_id = 0;
return;
}
+ for (Map<BodyKey, BodyState>::Element *E = monitored_areas.front(); E; E = E->next()) {
-
- for (Map<BodyKey,BodyState>::Element *E=monitored_areas.front();E;E=E->next()) {
-
- if (E->get().state==0)
+ if (E->get().state == 0)
continue; //nothing happened
- res[0]=E->get().state>0 ? PhysicsServer::AREA_BODY_ADDED : PhysicsServer::AREA_BODY_REMOVED;
- res[1]=E->key().rid;
- res[2]=E->key().instance_id;
- res[3]=E->key().body_shape;
- res[4]=E->key().area_shape;
-
+ res[0] = E->get().state > 0 ? PhysicsServer::AREA_BODY_ADDED : PhysicsServer::AREA_BODY_REMOVED;
+ res[1] = E->key().rid;
+ res[2] = E->key().instance_id;
+ res[3] = E->key().body_shape;
+ res[4] = E->key().area_shape;
Variant::CallError ce;
- obj->call(area_monitor_callback_method,(const Variant**)resptr,5,ce);
+ obj->call(area_monitor_callback_method, (const Variant **)resptr, 5, ce);
}
}
monitored_areas.clear();
//get_space()->area_remove_from_monitor_query_list(&monitor_query_list);
-
}
-AreaSW::AreaSW() : CollisionObjectSW(TYPE_AREA), monitor_query_list(this), moved_list(this) {
+AreaSW::AreaSW()
+ : CollisionObjectSW(TYPE_AREA), monitor_query_list(this), moved_list(this) {
_set_static(true); //areas are never active
- space_override_mode=PhysicsServer::AREA_SPACE_OVERRIDE_DISABLED;
- gravity=9.80665;
- gravity_vector=Vector3(0,-1,0);
- gravity_is_point=false;
- gravity_distance_scale=0;
- point_attenuation=1;
- angular_damp=1.0;
- linear_damp=0.1;
- priority=0;
+ space_override_mode = PhysicsServer::AREA_SPACE_OVERRIDE_DISABLED;
+ gravity = 9.80665;
+ gravity_vector = Vector3(0, -1, 0);
+ gravity_is_point = false;
+ gravity_distance_scale = 0;
+ point_attenuation = 1;
+ angular_damp = 1.0;
+ linear_damp = 0.1;
+ priority = 0;
set_ray_pickable(false);
- monitor_callback_id=0;
- area_monitor_callback_id=0;
- monitorable=false;
-
+ monitor_callback_id = 0;
+ area_monitor_callback_id = 0;
+ monitorable = false;
}
AreaSW::~AreaSW() {
-
-
}
-
diff --git a/servers/physics/area_sw.h b/servers/physics/area_sw.h
index 5ac698540..0bc6c2eab 100644
--- a/servers/physics/area_sw.h
+++ b/servers/physics/area_sw.h
@@ -29,17 +29,16 @@
#ifndef AREA_SW_H
#define AREA_SW_H
-#include "servers/physics_server.h"
#include "collision_object_sw.h"
#include "self_list.h"
+#include "servers/physics_server.h"
//#include "servers/physics/query_sw.h"
class SpaceSW;
class BodySW;
class ConstraintSW;
-class AreaSW : public CollisionObjectSW{
-
+class AreaSW : public CollisionObjectSW {
PhysicsServer::AreaSpaceOverrideMode space_override_mode;
float gravity;
@@ -68,24 +67,22 @@ class AreaSW : public CollisionObjectSW{
uint32_t body_shape;
uint32_t area_shape;
- _FORCE_INLINE_ bool operator<( const BodyKey& p_key) const {
+ _FORCE_INLINE_ bool operator<(const BodyKey &p_key) const {
- if (rid==p_key.rid) {
+ if (rid == p_key.rid) {
- if (body_shape==p_key.body_shape) {
+ if (body_shape == p_key.body_shape) {
return area_shape < p_key.area_shape;
} else
return body_shape < p_key.body_shape;
} else
return rid < p_key.rid;
-
}
_FORCE_INLINE_ BodyKey() {}
- BodyKey(BodySW *p_body, uint32_t p_body_shape,uint32_t p_area_shape);
- BodyKey(AreaSW *p_body, uint32_t p_body_shape,uint32_t p_area_shape);
-
+ BodyKey(BodySW *p_body, uint32_t p_body_shape, uint32_t p_area_shape);
+ BodyKey(AreaSW *p_body, uint32_t p_body_shape, uint32_t p_area_shape);
};
struct BodyState {
@@ -93,125 +90,111 @@ class AreaSW : public CollisionObjectSW{
int state;
_FORCE_INLINE_ void inc() { state++; }
_FORCE_INLINE_ void dec() { state--; }
- _FORCE_INLINE_ BodyState() { state=0; }
+ _FORCE_INLINE_ BodyState() { state = 0; }
};
- Map<BodyKey,BodyState> monitored_bodies;
- Map<BodyKey,BodyState> monitored_areas;
+ Map<BodyKey, BodyState> monitored_bodies;
+ Map<BodyKey, BodyState> monitored_areas;
//virtual void shape_changed_notify(ShapeSW *p_shape);
//virtual void shape_deleted_notify(ShapeSW *p_shape);
- Set<ConstraintSW*> constraints;
-
+ Set<ConstraintSW *> constraints;
virtual void _shapes_changed();
void _queue_monitor_update();
public:
-
//_FORCE_INLINE_ const Transform& get_inverse_transform() const { return inverse_transform; }
//_FORCE_INLINE_ SpaceSW* get_owner() { return owner; }
- void set_monitor_callback(ObjectID p_id, const StringName& p_method);
+ void set_monitor_callback(ObjectID p_id, const StringName &p_method);
_FORCE_INLINE_ bool has_monitor_callback() const { return monitor_callback_id; }
- void set_area_monitor_callback(ObjectID p_id, const StringName& p_method);
+ void set_area_monitor_callback(ObjectID p_id, const StringName &p_method);
_FORCE_INLINE_ bool has_area_monitor_callback() const { return area_monitor_callback_id; }
- _FORCE_INLINE_ void add_body_to_query(BodySW *p_body, uint32_t p_body_shape,uint32_t p_area_shape);
- _FORCE_INLINE_ void remove_body_from_query(BodySW *p_body, uint32_t p_body_shape,uint32_t p_area_shape);
+ _FORCE_INLINE_ void add_body_to_query(BodySW *p_body, uint32_t p_body_shape, uint32_t p_area_shape);
+ _FORCE_INLINE_ void remove_body_from_query(BodySW *p_body, uint32_t p_body_shape, uint32_t p_area_shape);
- _FORCE_INLINE_ void add_area_to_query(AreaSW *p_area, uint32_t p_area_shape,uint32_t p_self_shape);
- _FORCE_INLINE_ void remove_area_from_query(AreaSW *p_area, uint32_t p_area_shape,uint32_t p_self_shape);
+ _FORCE_INLINE_ void add_area_to_query(AreaSW *p_area, uint32_t p_area_shape, uint32_t p_self_shape);
+ _FORCE_INLINE_ void remove_area_from_query(AreaSW *p_area, uint32_t p_area_shape, uint32_t p_self_shape);
- void set_param(PhysicsServer::AreaParameter p_param, const Variant& p_value);
+ void set_param(PhysicsServer::AreaParameter p_param, const Variant &p_value);
Variant get_param(PhysicsServer::AreaParameter p_param) const;
void set_space_override_mode(PhysicsServer::AreaSpaceOverrideMode p_mode);
PhysicsServer::AreaSpaceOverrideMode get_space_override_mode() const { return space_override_mode; }
- _FORCE_INLINE_ void set_gravity(float p_gravity) { gravity=p_gravity; }
+ _FORCE_INLINE_ void set_gravity(float p_gravity) { gravity = p_gravity; }
_FORCE_INLINE_ float get_gravity() const { return gravity; }
- _FORCE_INLINE_ void set_gravity_vector(const Vector3& p_gravity) { gravity_vector=p_gravity; }
+ _FORCE_INLINE_ void set_gravity_vector(const Vector3 &p_gravity) { gravity_vector = p_gravity; }
_FORCE_INLINE_ Vector3 get_gravity_vector() const { return gravity_vector; }
- _FORCE_INLINE_ void set_gravity_as_point(bool p_enable) { gravity_is_point=p_enable; }
+ _FORCE_INLINE_ void set_gravity_as_point(bool p_enable) { gravity_is_point = p_enable; }
_FORCE_INLINE_ bool is_gravity_point() const { return gravity_is_point; }
- _FORCE_INLINE_ void set_gravity_distance_scale(float scale) { gravity_distance_scale=scale; }
+ _FORCE_INLINE_ void set_gravity_distance_scale(float scale) { gravity_distance_scale = scale; }
_FORCE_INLINE_ float get_gravity_distance_scale() const { return gravity_distance_scale; }
- _FORCE_INLINE_ void set_point_attenuation(float p_point_attenuation) { point_attenuation=p_point_attenuation; }
+ _FORCE_INLINE_ void set_point_attenuation(float p_point_attenuation) { point_attenuation = p_point_attenuation; }
_FORCE_INLINE_ float get_point_attenuation() const { return point_attenuation; }
- _FORCE_INLINE_ void set_linear_damp(float p_linear_damp) { linear_damp=p_linear_damp; }
+ _FORCE_INLINE_ void set_linear_damp(float p_linear_damp) { linear_damp = p_linear_damp; }
_FORCE_INLINE_ float get_linear_damp() const { return linear_damp; }
- _FORCE_INLINE_ void set_angular_damp(float p_angular_damp) { angular_damp=p_angular_damp; }
+ _FORCE_INLINE_ void set_angular_damp(float p_angular_damp) { angular_damp = p_angular_damp; }
_FORCE_INLINE_ float get_angular_damp() const { return angular_damp; }
- _FORCE_INLINE_ void set_priority(int p_priority) { priority=p_priority; }
+ _FORCE_INLINE_ void set_priority(int p_priority) { priority = p_priority; }
_FORCE_INLINE_ int get_priority() const { return priority; }
- _FORCE_INLINE_ void add_constraint( ConstraintSW* p_constraint) { constraints.insert(p_constraint); }
- _FORCE_INLINE_ void remove_constraint( ConstraintSW* p_constraint) { constraints.erase(p_constraint); }
- _FORCE_INLINE_ const Set<ConstraintSW*>& get_constraints() const { return constraints; }
+ _FORCE_INLINE_ void add_constraint(ConstraintSW *p_constraint) { constraints.insert(p_constraint); }
+ _FORCE_INLINE_ void remove_constraint(ConstraintSW *p_constraint) { constraints.erase(p_constraint); }
+ _FORCE_INLINE_ const Set<ConstraintSW *> &get_constraints() const { return constraints; }
void set_monitorable(bool p_monitorable);
_FORCE_INLINE_ bool is_monitorable() const { return monitorable; }
- void set_transform(const Transform& p_transform);
+ void set_transform(const Transform &p_transform);
void set_space(SpaceSW *p_space);
-
void call_queries();
AreaSW();
~AreaSW();
};
-void AreaSW::add_body_to_query(BodySW *p_body, uint32_t p_body_shape,uint32_t p_area_shape) {
+void AreaSW::add_body_to_query(BodySW *p_body, uint32_t p_body_shape, uint32_t p_area_shape) {
- BodyKey bk(p_body,p_body_shape,p_area_shape);
+ BodyKey bk(p_body, p_body_shape, p_area_shape);
monitored_bodies[bk].inc();
if (!monitor_query_list.in_list())
_queue_monitor_update();
}
-void AreaSW::remove_body_from_query(BodySW *p_body, uint32_t p_body_shape,uint32_t p_area_shape) {
+void AreaSW::remove_body_from_query(BodySW *p_body, uint32_t p_body_shape, uint32_t p_area_shape) {
- BodyKey bk(p_body,p_body_shape,p_area_shape);
+ BodyKey bk(p_body, p_body_shape, p_area_shape);
monitored_bodies[bk].dec();
if (!monitor_query_list.in_list())
_queue_monitor_update();
}
+void AreaSW::add_area_to_query(AreaSW *p_area, uint32_t p_area_shape, uint32_t p_self_shape) {
-void AreaSW::add_area_to_query(AreaSW *p_area, uint32_t p_area_shape,uint32_t p_self_shape) {
-
-
- BodyKey bk(p_area,p_area_shape,p_self_shape);
+ BodyKey bk(p_area, p_area_shape, p_self_shape);
monitored_areas[bk].inc();
if (!monitor_query_list.in_list())
_queue_monitor_update();
-
-
}
-void AreaSW::remove_area_from_query(AreaSW *p_area, uint32_t p_area_shape,uint32_t p_self_shape) {
-
+void AreaSW::remove_area_from_query(AreaSW *p_area, uint32_t p_area_shape, uint32_t p_self_shape) {
- BodyKey bk(p_area,p_area_shape,p_self_shape);
+ BodyKey bk(p_area, p_area_shape, p_self_shape);
monitored_areas[bk].dec();
if (!monitor_query_list.in_list())
_queue_monitor_update();
-
}
-
-
-
-
-
#endif // AREA__SW_H
diff --git a/servers/physics/body_pair_sw.cpp b/servers/physics/body_pair_sw.cpp
index 630d8e3d5..b232bae1e 100644
--- a/servers/physics/body_pair_sw.cpp
+++ b/servers/physics/body_pair_sw.cpp
@@ -28,8 +28,8 @@
/*************************************************************************/
#include "body_pair_sw.h"
#include "collision_solver_sw.h"
-#include "space_sw.h"
#include "os/os.h"
+#include "space_sw.h"
/*
#define NO_ACCUMULATE_IMPULSES
@@ -41,19 +41,17 @@
#define NO_TANGENTIALS
/* BODY PAIR */
-
//#define ALLOWED_PENETRATION 0.01
#define RELAXATION_TIMESTEPS 3
#define MIN_VELOCITY 0.0001
-void BodyPairSW::_contact_added_callback(const Vector3& p_point_A,const Vector3& p_point_B,void *p_userdata) {
-
- BodyPairSW* pair = (BodyPairSW*)p_userdata;
- pair->contact_added_callback(p_point_A,p_point_B);
+void BodyPairSW::_contact_added_callback(const Vector3 &p_point_A, const Vector3 &p_point_B, void *p_userdata) {
+ BodyPairSW *pair = (BodyPairSW *)p_userdata;
+ pair->contact_added_callback(p_point_A, p_point_B);
}
-void BodyPairSW::contact_added_callback(const Vector3& p_point_A,const Vector3& p_point_B) {
+void BodyPairSW::contact_added_callback(const Vector3 &p_point_A, const Vector3 &p_point_B) {
// check if we already have the contact
@@ -61,40 +59,36 @@ void BodyPairSW::contact_added_callback(const Vector3& p_point_A,const Vector3&
//Vector3 local_B = B->get_inv_transform().xform(p_point_B);
Vector3 local_A = A->get_inv_transform().basis.xform(p_point_A);
- Vector3 local_B = B->get_inv_transform().basis.xform(p_point_B-offset_B);
-
-
+ Vector3 local_B = B->get_inv_transform().basis.xform(p_point_B - offset_B);
int new_index = contact_count;
- ERR_FAIL_COND( new_index >= (MAX_CONTACTS+1) );
+ ERR_FAIL_COND(new_index >= (MAX_CONTACTS + 1));
Contact contact;
- contact.acc_normal_impulse=0;
- contact.acc_bias_impulse=0;
- contact.acc_tangent_impulse=Vector3();
- contact.local_A=local_A;
- contact.local_B=local_B;
- contact.normal=(p_point_A-p_point_B).normalized();
-
-
+ contact.acc_normal_impulse = 0;
+ contact.acc_bias_impulse = 0;
+ contact.acc_tangent_impulse = Vector3();
+ contact.local_A = local_A;
+ contact.local_B = local_B;
+ contact.normal = (p_point_A - p_point_B).normalized();
// attempt to determine if the contact will be reused
- real_t contact_recycle_radius=space->get_contact_recycle_radius();
+ real_t contact_recycle_radius = space->get_contact_recycle_radius();
- for (int i=0;i<contact_count;i++) {
+ for (int i = 0; i < contact_count; i++) {
- Contact& c = contacts[i];
+ Contact &c = contacts[i];
if (
- c.local_A.distance_squared_to( local_A ) < (contact_recycle_radius*contact_recycle_radius) &&
- c.local_B.distance_squared_to( local_B ) < (contact_recycle_radius*contact_recycle_radius) ) {
+ c.local_A.distance_squared_to(local_A) < (contact_recycle_radius * contact_recycle_radius) &&
+ c.local_B.distance_squared_to(local_B) < (contact_recycle_radius * contact_recycle_radius)) {
- contact.acc_normal_impulse=c.acc_normal_impulse;
- contact.acc_bias_impulse=c.acc_bias_impulse;
- contact.acc_tangent_impulse=c.acc_tangent_impulse;
- new_index=i;
- break;
+ contact.acc_normal_impulse = c.acc_normal_impulse;
+ contact.acc_bias_impulse = c.acc_bias_impulse;
+ contact.acc_tangent_impulse = c.acc_tangent_impulse;
+ new_index = i;
+ break;
}
}
@@ -104,66 +98,63 @@ void BodyPairSW::contact_added_callback(const Vector3& p_point_A,const Vector3&
// remove the contact with the minimum depth
- int least_deep=-1;
- float min_depth=1e10;
+ int least_deep = -1;
+ float min_depth = 1e10;
- for (int i=0;i<=contact_count;i++) {
+ for (int i = 0; i <= contact_count; i++) {
- Contact& c = (i==contact_count)?contact:contacts[i];
+ Contact &c = (i == contact_count) ? contact : contacts[i];
Vector3 global_A = A->get_transform().basis.xform(c.local_A);
- Vector3 global_B = B->get_transform().basis.xform(c.local_B)+offset_B;
+ Vector3 global_B = B->get_transform().basis.xform(c.local_B) + offset_B;
Vector3 axis = global_A - global_B;
- float depth = axis.dot( c.normal );
+ float depth = axis.dot(c.normal);
- if (depth<min_depth) {
+ if (depth < min_depth) {
- min_depth=depth;
- least_deep=i;
+ min_depth = depth;
+ least_deep = i;
}
}
- ERR_FAIL_COND(least_deep==-1);
+ ERR_FAIL_COND(least_deep == -1);
if (least_deep < contact_count) { //replace the last deep contact by the new one
- contacts[least_deep]=contact;
+ contacts[least_deep] = contact;
}
return;
}
- contacts[new_index]=contact;
+ contacts[new_index] = contact;
- if (new_index==contact_count) {
+ if (new_index == contact_count) {
contact_count++;
}
-
}
void BodyPairSW::validate_contacts() {
//make sure to erase contacts that are no longer valid
- real_t contact_max_separation=space->get_contact_max_separation();
- for (int i=0;i<contact_count;i++) {
+ real_t contact_max_separation = space->get_contact_max_separation();
+ for (int i = 0; i < contact_count; i++) {
- Contact& c = contacts[i];
+ Contact &c = contacts[i];
Vector3 global_A = A->get_transform().basis.xform(c.local_A);
- Vector3 global_B = B->get_transform().basis.xform(c.local_B)+offset_B;
+ Vector3 global_B = B->get_transform().basis.xform(c.local_B) + offset_B;
Vector3 axis = global_A - global_B;
- float depth = axis.dot( c.normal );
+ float depth = axis.dot(c.normal);
if (depth < -contact_max_separation || (global_B + c.normal * depth - global_A).length() > contact_max_separation) {
// contact no longer needed, remove
-
- if ((i+1) < contact_count) {
+ if ((i + 1) < contact_count) {
// swap with the last one
- SWAP( contacts[i], contacts[ contact_count-1 ] );
-
+ SWAP(contacts[i], contacts[contact_count - 1]);
}
i--;
@@ -172,21 +163,18 @@ void BodyPairSW::validate_contacts() {
}
}
+bool BodyPairSW::_test_ccd(float p_step, BodySW *p_A, int p_shape_A, const Transform &p_xform_A, BodySW *p_B, int p_shape_B, const Transform &p_xform_B) {
-bool BodyPairSW::_test_ccd(float p_step,BodySW *p_A, int p_shape_A,const Transform& p_xform_A,BodySW *p_B, int p_shape_B,const Transform& p_xform_B) {
-
-
-
- Vector3 motion = p_A->get_linear_velocity()*p_step;
+ Vector3 motion = p_A->get_linear_velocity() * p_step;
real_t mlen = motion.length();
- if (mlen<CMP_EPSILON)
+ if (mlen < CMP_EPSILON)
return false;
Vector3 mnormal = motion / mlen;
- real_t min,max;
- p_A->get_shape(p_shape_A)->project_range(mnormal,p_xform_A,min,max);
- bool fast_object = mlen > (max-min)*0.3; //going too fast in that direction
+ real_t min, max;
+ p_A->get_shape(p_shape_A)->project_range(mnormal, p_xform_A, min, max);
+ bool fast_object = mlen > (max - min) * 0.3; //going too fast in that direction
if (!fast_object) { //did it move enough in this direction to even attempt raycast? let's say it should move more than 1/3 the size of the object in that axis
return false;
@@ -194,35 +182,34 @@ bool BodyPairSW::_test_ccd(float p_step,BodySW *p_A, int p_shape_A,const Transfo
//cast a segment from support in motion normal, in the same direction of motion by motion length
//support is the worst case collision point, so real collision happened before
- Vector3 s=p_A->get_shape(p_shape_A)->get_support(p_xform_A.basis.xform(mnormal).normalized());
+ Vector3 s = p_A->get_shape(p_shape_A)->get_support(p_xform_A.basis.xform(mnormal).normalized());
Vector3 from = p_xform_A.xform(s);
Vector3 to = from + motion;
Transform from_inv = p_xform_B.affine_inverse();
- Vector3 local_from = from_inv.xform(from-mnormal*mlen*0.1); //start from a little inside the bounding box
+ Vector3 local_from = from_inv.xform(from - mnormal * mlen * 0.1); //start from a little inside the bounding box
Vector3 local_to = from_inv.xform(to);
- Vector3 rpos,rnorm;
- if (!p_B->get_shape(p_shape_B)->intersect_segment(local_from,local_to,rpos,rnorm)) {
+ Vector3 rpos, rnorm;
+ if (!p_B->get_shape(p_shape_B)->intersect_segment(local_from, local_to, rpos, rnorm)) {
return false;
}
//shorten the linear velocity so it does not hit, but gets close enough, next frame will hit softly or soft enough
Vector3 hitpos = p_xform_B.xform(rpos);
- float newlen = hitpos.distance_to(from)-(max-min)*0.01;
- p_A->set_linear_velocity((mnormal*newlen)/p_step);
+ float newlen = hitpos.distance_to(from) - (max - min) * 0.01;
+ p_A->set_linear_velocity((mnormal * newlen) / p_step);
return true;
}
-
bool BodyPairSW::setup(float p_step) {
//cannot collide
- if (!A->test_collision_mask(B) || A->has_exception(B->get_self()) || B->has_exception(A->get_self()) || (A->get_mode()<=PhysicsServer::BODY_MODE_KINEMATIC && B->get_mode()<=PhysicsServer::BODY_MODE_KINEMATIC && A->get_max_contacts_reported()==0 && B->get_max_contacts_reported()==0)) {
- collided=false;
+ if (!A->test_collision_mask(B) || A->has_exception(B->get_self()) || B->has_exception(A->get_self()) || (A->get_mode() <= PhysicsServer::BODY_MODE_KINEMATIC && B->get_mode() <= PhysicsServer::BODY_MODE_KINEMATIC && A->get_max_contacts_reported() == 0 && B->get_max_contacts_reported() == 0)) {
+ collided = false;
return false;
}
@@ -231,86 +218,79 @@ bool BodyPairSW::setup(float p_step) {
validate_contacts();
Vector3 offset_A = A->get_transform().get_origin();
- Transform xform_Au = Transform(A->get_transform().basis,Vector3());
+ Transform xform_Au = Transform(A->get_transform().basis, Vector3());
Transform xform_A = xform_Au * A->get_shape_transform(shape_A);
Transform xform_Bu = B->get_transform();
- xform_Bu.origin-=offset_A;
+ xform_Bu.origin -= offset_A;
Transform xform_B = xform_Bu * B->get_shape_transform(shape_B);
- ShapeSW *shape_A_ptr=A->get_shape(shape_A);
- ShapeSW *shape_B_ptr=B->get_shape(shape_B);
-
- bool collided = CollisionSolverSW::solve_static(shape_A_ptr,xform_A,shape_B_ptr,xform_B,_contact_added_callback,this,&sep_axis);
- this->collided=collided;
+ ShapeSW *shape_A_ptr = A->get_shape(shape_A);
+ ShapeSW *shape_B_ptr = B->get_shape(shape_B);
+ bool collided = CollisionSolverSW::solve_static(shape_A_ptr, xform_A, shape_B_ptr, xform_B, _contact_added_callback, this, &sep_axis);
+ this->collided = collided;
if (!collided) {
//test ccd (currently just a raycast)
- if (A->is_continuous_collision_detection_enabled() && A->get_mode()>PhysicsServer::BODY_MODE_KINEMATIC && B->get_mode()<=PhysicsServer::BODY_MODE_KINEMATIC) {
- _test_ccd(p_step,A,shape_A,xform_A,B,shape_B,xform_B);
+ if (A->is_continuous_collision_detection_enabled() && A->get_mode() > PhysicsServer::BODY_MODE_KINEMATIC && B->get_mode() <= PhysicsServer::BODY_MODE_KINEMATIC) {
+ _test_ccd(p_step, A, shape_A, xform_A, B, shape_B, xform_B);
}
- if (B->is_continuous_collision_detection_enabled() && B->get_mode()>PhysicsServer::BODY_MODE_KINEMATIC && A->get_mode()<=PhysicsServer::BODY_MODE_KINEMATIC) {
- _test_ccd(p_step,B,shape_B,xform_B,A,shape_A,xform_A);
+ if (B->is_continuous_collision_detection_enabled() && B->get_mode() > PhysicsServer::BODY_MODE_KINEMATIC && A->get_mode() <= PhysicsServer::BODY_MODE_KINEMATIC) {
+ _test_ccd(p_step, B, shape_B, xform_B, A, shape_A, xform_A);
}
return false;
}
-
-
real_t max_penetration = space->get_contact_max_allowed_penetration();
float bias = 0.3f;
if (shape_A_ptr->get_custom_bias() || shape_B_ptr->get_custom_bias()) {
- if (shape_A_ptr->get_custom_bias()==0)
- bias=shape_B_ptr->get_custom_bias();
- else if (shape_B_ptr->get_custom_bias()==0)
- bias=shape_A_ptr->get_custom_bias();
+ if (shape_A_ptr->get_custom_bias() == 0)
+ bias = shape_B_ptr->get_custom_bias();
+ else if (shape_B_ptr->get_custom_bias() == 0)
+ bias = shape_A_ptr->get_custom_bias();
else
- bias=(shape_B_ptr->get_custom_bias()+shape_A_ptr->get_custom_bias())*0.5;
+ bias = (shape_B_ptr->get_custom_bias() + shape_A_ptr->get_custom_bias()) * 0.5;
}
+ real_t inv_dt = 1.0 / p_step;
-
- real_t inv_dt = 1.0/p_step;
-
- for(int i=0;i<contact_count;i++) {
+ for (int i = 0; i < contact_count; i++) {
Contact &c = contacts[i];
- c.active=false;
+ c.active = false;
Vector3 global_A = xform_Au.xform(c.local_A);
Vector3 global_B = xform_Bu.xform(c.local_B);
-
real_t depth = c.normal.dot(global_A - global_B);
- if (depth<=0) {
- c.active=false;
+ if (depth <= 0) {
+ c.active = false;
continue;
}
- c.active=true;
+ c.active = true;
#ifdef DEBUG_ENABLED
-
if (space->is_debugging_contacts()) {
- space->add_debug_contact(global_A+offset_A);
- space->add_debug_contact(global_B+offset_A);
+ space->add_debug_contact(global_A + offset_A);
+ space->add_debug_contact(global_B + offset_A);
}
#endif
c.rA = global_A;
- c.rB = global_B-offset_B;
+ c.rB = global_B - offset_B;
- // contact query reporting...
+// contact query reporting...
#if 0
if (A->get_body_type() == PhysicsServer::BODY_CHARACTER)
static_cast<CharacterBodySW*>(A)->report_character_contact( global_A, global_B, B );
@@ -323,30 +303,28 @@ bool BodyPairSW::setup(float p_step) {
#endif
if (A->can_report_contacts()) {
- Vector3 crA = A->get_angular_velocity().cross( c.rA ) + A->get_linear_velocity();
- A->add_contact(global_A,-c.normal,depth,shape_A,global_B,shape_B,B->get_instance_id(),B->get_self(),crA);
+ Vector3 crA = A->get_angular_velocity().cross(c.rA) + A->get_linear_velocity();
+ A->add_contact(global_A, -c.normal, depth, shape_A, global_B, shape_B, B->get_instance_id(), B->get_self(), crA);
}
if (B->can_report_contacts()) {
- Vector3 crB = B->get_angular_velocity().cross( c.rB ) + B->get_linear_velocity();
- B->add_contact(global_B,c.normal,depth,shape_B,global_A,shape_A,A->get_instance_id(),A->get_self(),crB);
+ Vector3 crB = B->get_angular_velocity().cross(c.rB) + B->get_linear_velocity();
+ B->add_contact(global_B, c.normal, depth, shape_B, global_A, shape_A, A->get_instance_id(), A->get_self(), crB);
}
- if (A->is_shape_set_as_trigger(shape_A) || B->is_shape_set_as_trigger(shape_B) || (A->get_mode()<=PhysicsServer::BODY_MODE_KINEMATIC && B->get_mode()<=PhysicsServer::BODY_MODE_KINEMATIC)) {
- c.active=false;
- collided=false;
+ if (A->is_shape_set_as_trigger(shape_A) || B->is_shape_set_as_trigger(shape_B) || (A->get_mode() <= PhysicsServer::BODY_MODE_KINEMATIC && B->get_mode() <= PhysicsServer::BODY_MODE_KINEMATIC)) {
+ c.active = false;
+ collided = false;
continue;
-
}
-
- c.active=true;
+ c.active = true;
// Precompute normal mass, tangent mass, and bias.
- Vector3 inertia_A = A->get_inv_inertia_tensor().xform( c.rA.cross( c.normal ) );
- Vector3 inertia_B = B->get_inv_inertia_tensor().xform( c.rB.cross( c.normal ) );
+ Vector3 inertia_A = A->get_inv_inertia_tensor().xform(c.rA.cross(c.normal));
+ Vector3 inertia_B = B->get_inv_inertia_tensor().xform(c.rB.cross(c.normal));
real_t kNormal = A->get_inv_mass() + B->get_inv_mass();
- kNormal += c.normal.dot( inertia_A.cross(c.rA ) ) + c.normal.dot( inertia_B.cross( c.rB ));
+ kNormal += c.normal.dot(inertia_A.cross(c.rA)) + c.normal.dot(inertia_B.cross(c.rB));
c.mass_normal = 1.0f / kNormal;
#if 1
@@ -354,34 +332,32 @@ bool BodyPairSW::setup(float p_step) {
#else
if (depth > max_penetration) {
- c.bias = (depth - max_penetration) * (1.0/(p_step*(1.0/RELAXATION_TIMESTEPS)));
+ c.bias = (depth - max_penetration) * (1.0 / (p_step * (1.0 / RELAXATION_TIMESTEPS)));
} else {
float approach = -0.1f * (depth - max_penetration) / (CMP_EPSILON + max_penetration);
- approach = CLAMP( approach, CMP_EPSILON, 1.0 );
- c.bias = approach * (depth - max_penetration) * (1.0/p_step);
+ approach = CLAMP(approach, CMP_EPSILON, 1.0);
+ c.bias = approach * (depth - max_penetration) * (1.0 / p_step);
}
#endif
- c.depth=depth;
+ c.depth = depth;
Vector3 j_vec = c.normal * c.acc_normal_impulse + c.acc_tangent_impulse;
- A->apply_impulse( c.rA, -j_vec );
- B->apply_impulse( c.rB, j_vec );
- c.acc_bias_impulse=0;
+ A->apply_impulse(c.rA, -j_vec);
+ B->apply_impulse(c.rB, j_vec);
+ c.acc_bias_impulse = 0;
Vector3 jb_vec = c.normal * c.acc_bias_impulse;
- A->apply_bias_impulse( c.rA, -jb_vec );
- B->apply_bias_impulse( c.rB, jb_vec );
+ A->apply_bias_impulse(c.rA, -jb_vec);
+ B->apply_bias_impulse(c.rB, jb_vec);
- c.bounce = MAX(A->get_bounce(),B->get_bounce());
+ c.bounce = MAX(A->get_bounce(), B->get_bounce());
if (c.bounce) {
- Vector3 crA = A->get_angular_velocity().cross( c.rA );
- Vector3 crB = B->get_angular_velocity().cross( c.rB );
+ Vector3 crA = A->get_angular_velocity().cross(c.rA);
+ Vector3 crB = B->get_angular_velocity().cross(c.rB);
Vector3 dv = B->get_linear_velocity() + crB - A->get_linear_velocity() - crA;
//normal impule
c.bounce = c.bounce * dv.dot(c.normal);
}
-
-
}
return true;
@@ -392,68 +368,63 @@ void BodyPairSW::solve(float p_step) {
if (!collided)
return;
-
- for(int i=0;i<contact_count;i++) {
+ for (int i = 0; i < contact_count; i++) {
Contact &c = contacts[i];
if (!c.active)
continue;
- c.active=false; //try to deactivate, will activate itself if still needed
+ c.active = false; //try to deactivate, will activate itself if still needed
//bias impule
- Vector3 crbA = A->get_biased_angular_velocity().cross( c.rA );
- Vector3 crbB = B->get_biased_angular_velocity().cross( c.rB );
+ Vector3 crbA = A->get_biased_angular_velocity().cross(c.rA);
+ Vector3 crbB = B->get_biased_angular_velocity().cross(c.rB);
Vector3 dbv = B->get_biased_linear_velocity() + crbB - A->get_biased_linear_velocity() - crbA;
real_t vbn = dbv.dot(c.normal);
- if (Math::abs(-vbn+c.bias)>MIN_VELOCITY) {
+ if (Math::abs(-vbn + c.bias) > MIN_VELOCITY) {
- real_t jbn = (-vbn + c.bias)*c.mass_normal;
+ real_t jbn = (-vbn + c.bias) * c.mass_normal;
real_t jbnOld = c.acc_bias_impulse;
c.acc_bias_impulse = MAX(jbnOld + jbn, 0.0f);
Vector3 jb = c.normal * (c.acc_bias_impulse - jbnOld);
-
- A->apply_bias_impulse(c.rA,-jb);
+ A->apply_bias_impulse(c.rA, -jb);
B->apply_bias_impulse(c.rB, jb);
- c.active=true;
+ c.active = true;
}
-
- Vector3 crA = A->get_angular_velocity().cross( c.rA );
- Vector3 crB = B->get_angular_velocity().cross( c.rB );
+ Vector3 crA = A->get_angular_velocity().cross(c.rA);
+ Vector3 crB = B->get_angular_velocity().cross(c.rB);
Vector3 dv = B->get_linear_velocity() + crB - A->get_linear_velocity() - crA;
//normal impule
real_t vn = dv.dot(c.normal);
- if (Math::abs(vn)>MIN_VELOCITY) {
+ if (Math::abs(vn) > MIN_VELOCITY) {
- real_t jn = -(c.bounce + vn)*c.mass_normal;
+ real_t jn = -(c.bounce + vn) * c.mass_normal;
real_t jnOld = c.acc_normal_impulse;
c.acc_normal_impulse = MAX(jnOld + jn, 0.0f);
+ Vector3 j = c.normal * (c.acc_normal_impulse - jnOld);
- Vector3 j =c.normal * (c.acc_normal_impulse - jnOld);
-
-
- A->apply_impulse(c.rA,-j);
+ A->apply_impulse(c.rA, -j);
B->apply_impulse(c.rB, j);
- c.active=true;
+ c.active = true;
}
//friction impule
real_t friction = A->get_friction() * B->get_friction();
- Vector3 lvA = A->get_linear_velocity() + A->get_angular_velocity().cross( c.rA );
- Vector3 lvB = B->get_linear_velocity() + B->get_angular_velocity().cross( c.rB );
+ Vector3 lvA = A->get_linear_velocity() + A->get_angular_velocity().cross(c.rA);
+ Vector3 lvB = B->get_linear_velocity() + B->get_angular_velocity().cross(c.rB);
Vector3 dtv = lvB - lvA;
real_t tn = c.normal.dot(dtv);
@@ -466,15 +437,14 @@ void BodyPairSW::solve(float p_step) {
tv /= tvl;
- Vector3 temp1 = A->get_inv_inertia_tensor().xform( c.rA.cross( tv ) );
- Vector3 temp2 = B->get_inv_inertia_tensor().xform( c.rB.cross( tv ) );
+ Vector3 temp1 = A->get_inv_inertia_tensor().xform(c.rA.cross(tv));
+ Vector3 temp2 = B->get_inv_inertia_tensor().xform(c.rB.cross(tv));
real_t t = -tvl /
- (A->get_inv_mass() + B->get_inv_mass() + tv.dot(temp1.cross(c.rA) + temp2.cross(c.rB)));
+ (A->get_inv_mass() + B->get_inv_mass() + tv.dot(temp1.cross(c.rA) + temp2.cross(c.rB)));
Vector3 jt = t * tv;
-
Vector3 jtOld = c.acc_tangent_impulse;
c.acc_tangent_impulse += jt;
@@ -483,46 +453,35 @@ void BodyPairSW::solve(float p_step) {
if (fi_len > CMP_EPSILON && fi_len > jtMax) {
- c.acc_tangent_impulse*=jtMax / fi_len;
+ c.acc_tangent_impulse *= jtMax / fi_len;
}
jt = c.acc_tangent_impulse - jtOld;
+ A->apply_impulse(c.rA, -jt);
+ B->apply_impulse(c.rB, jt);
- A->apply_impulse( c.rA, -jt );
- B->apply_impulse( c.rB, jt );
-
- c.active=true;
-
+ c.active = true;
}
-
-
}
-
}
+BodyPairSW::BodyPairSW(BodySW *p_A, int p_shape_A, BodySW *p_B, int p_shape_B)
+ : ConstraintSW(_arr, 2) {
-
-
-
-BodyPairSW::BodyPairSW(BodySW *p_A, int p_shape_A,BodySW *p_B, int p_shape_B) : ConstraintSW(_arr,2) {
-
- A=p_A;
- B=p_B;
- shape_A=p_shape_A;
- shape_B=p_shape_B;
- space=A->get_space();
- A->add_constraint(this,0);
- B->add_constraint(this,1);
- contact_count=0;
- collided=false;
-
+ A = p_A;
+ B = p_B;
+ shape_A = p_shape_A;
+ shape_B = p_shape_B;
+ space = A->get_space();
+ A->add_constraint(this, 0);
+ B->add_constraint(this, 1);
+ contact_count = 0;
+ collided = false;
}
-
BodyPairSW::~BodyPairSW() {
A->remove_constraint(this);
B->remove_constraint(this);
-
}
diff --git a/servers/physics/body_pair_sw.h b/servers/physics/body_pair_sw.h
index 4962c78da..d33583545 100644
--- a/servers/physics/body_pair_sw.h
+++ b/servers/physics/body_pair_sw.h
@@ -35,7 +35,7 @@
class BodyPairSW : public ConstraintSW {
enum {
- MAX_CONTACTS=4
+ MAX_CONTACTS = 4
};
union {
@@ -50,22 +50,21 @@ class BodyPairSW : public ConstraintSW {
int shape_A;
int shape_B;
-
struct Contact {
Vector3 position;
Vector3 normal;
Vector3 local_A, local_B;
- real_t acc_normal_impulse; // accumulated normal impulse (Pn)
- Vector3 acc_tangent_impulse; // accumulated tangent impulse (Pt)
- real_t acc_bias_impulse; // accumulated normal impulse for position bias (Pnb)
+ real_t acc_normal_impulse; // accumulated normal impulse (Pn)
+ Vector3 acc_tangent_impulse; // accumulated tangent impulse (Pt)
+ real_t acc_bias_impulse; // accumulated normal impulse for position bias (Pnb)
real_t mass_normal;
real_t bias;
real_t bounce;
real_t depth;
bool active;
- Vector3 rA,rB;
+ Vector3 rA, rB;
};
Vector3 offset_B; //use local A coordinates to avoid numerical issues on collision detection
@@ -76,24 +75,21 @@ class BodyPairSW : public ConstraintSW {
bool collided;
int cc;
+ static void _contact_added_callback(const Vector3 &p_point_A, const Vector3 &p_point_B, void *p_userdata);
- static void _contact_added_callback(const Vector3& p_point_A,const Vector3& p_point_B,void *p_userdata);
-
- void contact_added_callback(const Vector3& p_point_A,const Vector3& p_point_B);
+ void contact_added_callback(const Vector3 &p_point_A, const Vector3 &p_point_B);
void validate_contacts();
- bool _test_ccd(float p_step,BodySW *p_A, int p_shape_A,const Transform& p_xform_A,BodySW *p_B, int p_shape_B,const Transform& p_xform_B);
+ bool _test_ccd(float p_step, BodySW *p_A, int p_shape_A, const Transform &p_xform_A, BodySW *p_B, int p_shape_B, const Transform &p_xform_B);
SpaceSW *space;
public:
-
bool setup(float p_step);
void solve(float p_step);
- BodyPairSW(BodySW *p_A, int p_shape_A,BodySW *p_B, int p_shape_B);
+ BodyPairSW(BodySW *p_A, int p_shape_A, BodySW *p_B, int p_shape_B);
~BodyPairSW();
-
};
#endif // BODY_PAIR__SW_H
diff --git a/servers/physics/body_sw.cpp b/servers/physics/body_sw.cpp
index 74bba4f97..935328a16 100644
--- a/servers/physics/body_sw.cpp
+++ b/servers/physics/body_sw.cpp
@@ -27,107 +27,99 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include "body_sw.h"
-#include "space_sw.h"
#include "area_sw.h"
+#include "space_sw.h"
void BodySW::_update_inertia() {
if (get_space() && !inertia_update_list.in_list())
get_space()->body_add_to_inertia_update_list(&inertia_update_list);
-
}
-
void BodySW::_update_inertia_tensor() {
Matrix3 tb = get_transform().basis;
tb.scale(_inv_inertia);
_inv_inertia_tensor = tb * get_transform().basis.transposed();
-
}
void BodySW::update_inertias() {
//update shapes and motions
- switch(mode) {
+ switch (mode) {
case PhysicsServer::BODY_MODE_RIGID: {
//update tensor for allshapes, not the best way but should be somehow OK. (inspired from bullet)
- float total_area=0;
+ float total_area = 0;
- for (int i=0;i<get_shape_count();i++) {
+ for (int i = 0; i < get_shape_count(); i++) {
- total_area+=get_shape_aabb(i).get_area();
+ total_area += get_shape_aabb(i).get_area();
}
Vector3 _inertia;
+ for (int i = 0; i < get_shape_count(); i++) {
- for (int i=0;i<get_shape_count();i++) {
-
- const ShapeSW* shape=get_shape(i);
+ const ShapeSW *shape = get_shape(i);
- float area=get_shape_aabb(i).get_area();
+ float area = get_shape_aabb(i).get_area();
float mass = area * this->mass / total_area;
_inertia += shape->get_moment_of_inertia(mass) + mass * get_shape_transform(i).get_origin();
-
}
- if (_inertia!=Vector3())
- _inv_inertia=_inertia.inverse();
+ if (_inertia != Vector3())
+ _inv_inertia = _inertia.inverse();
else
- _inv_inertia=Vector3();
+ _inv_inertia = Vector3();
if (mass)
- _inv_mass=1.0/mass;
+ _inv_mass = 1.0 / mass;
else
- _inv_mass=0;
+ _inv_mass = 0;
} break;
case PhysicsServer::BODY_MODE_KINEMATIC:
case PhysicsServer::BODY_MODE_STATIC: {
- _inv_inertia=Vector3();
- _inv_mass=0;
+ _inv_inertia = Vector3();
+ _inv_mass = 0;
} break;
case PhysicsServer::BODY_MODE_CHARACTER: {
- _inv_inertia=Vector3();
- _inv_mass=1.0/mass;
+ _inv_inertia = Vector3();
+ _inv_mass = 1.0 / mass;
} break;
}
_update_inertia_tensor();
//_update_shapes();
-
}
-
-
void BodySW::set_active(bool p_active) {
- if (active==p_active)
+ if (active == p_active)
return;
- active=p_active;
+ active = p_active;
if (!p_active) {
if (get_space())
get_space()->body_remove_from_active_list(&active_list);
} else {
- if (mode==PhysicsServer::BODY_MODE_STATIC)
+ if (mode == PhysicsServer::BODY_MODE_STATIC)
return; //static bodies can't become active
if (get_space())
get_space()->body_add_to_active_list(&active_list);
//still_time=0;
}
-/*
+ /*
if (!space)
return;
@@ -140,43 +132,41 @@ void BodySW::set_active(bool p_active) {
*/
}
-
-
void BodySW::set_param(PhysicsServer::BodyParameter p_param, float p_value) {
- switch(p_param) {
+ switch (p_param) {
case PhysicsServer::BODY_PARAM_BOUNCE: {
- bounce=p_value;
+ bounce = p_value;
} break;
case PhysicsServer::BODY_PARAM_FRICTION: {
- friction=p_value;
+ friction = p_value;
} break;
case PhysicsServer::BODY_PARAM_MASS: {
- ERR_FAIL_COND(p_value<=0);
- mass=p_value;
+ ERR_FAIL_COND(p_value <= 0);
+ mass = p_value;
_update_inertia();
} break;
case PhysicsServer::BODY_PARAM_GRAVITY_SCALE: {
- gravity_scale=p_value;
+ gravity_scale = p_value;
} break;
case PhysicsServer::BODY_PARAM_LINEAR_DAMP: {
- linear_damp=p_value;
+ linear_damp = p_value;
} break;
case PhysicsServer::BODY_PARAM_ANGULAR_DAMP: {
- angular_damp=p_value;
+ angular_damp = p_value;
} break;
- default:{}
+ default: {}
}
}
float BodySW::get_param(PhysicsServer::BodyParameter p_param) const {
- switch(p_param) {
+ switch (p_param) {
case PhysicsServer::BODY_PARAM_BOUNCE: {
return bounce;
@@ -200,7 +190,7 @@ float BodySW::get_param(PhysicsServer::BodyParameter p_param) const {
return angular_damp;
} break;
- default:{}
+ default: {}
}
return 0;
@@ -208,43 +198,42 @@ float BodySW::get_param(PhysicsServer::BodyParameter p_param) const {
void BodySW::set_mode(PhysicsServer::BodyMode p_mode) {
- PhysicsServer::BodyMode prev=mode;
- mode=p_mode;
+ PhysicsServer::BodyMode prev = mode;
+ mode = p_mode;
- switch(p_mode) {
+ switch (p_mode) {
//CLEAR UP EVERYTHING IN CASE IT NOT WORKS!
case PhysicsServer::BODY_MODE_STATIC:
case PhysicsServer::BODY_MODE_KINEMATIC: {
_set_inv_transform(get_transform().affine_inverse());
- _inv_mass=0;
- _set_static(p_mode==PhysicsServer::BODY_MODE_STATIC);
+ _inv_mass = 0;
+ _set_static(p_mode == PhysicsServer::BODY_MODE_STATIC);
//set_active(p_mode==PhysicsServer::BODY_MODE_KINEMATIC);
- set_active(p_mode==PhysicsServer::BODY_MODE_KINEMATIC && contacts.size());
- linear_velocity=Vector3();
- angular_velocity=Vector3();
- if (mode==PhysicsServer::BODY_MODE_KINEMATIC && prev!=mode) {
- first_time_kinematic=true;
+ set_active(p_mode == PhysicsServer::BODY_MODE_KINEMATIC && contacts.size());
+ linear_velocity = Vector3();
+ angular_velocity = Vector3();
+ if (mode == PhysicsServer::BODY_MODE_KINEMATIC && prev != mode) {
+ first_time_kinematic = true;
}
} break;
case PhysicsServer::BODY_MODE_RIGID: {
- _inv_mass=mass>0?(1.0/mass):0;
+ _inv_mass = mass > 0 ? (1.0 / mass) : 0;
_set_static(false);
} break;
case PhysicsServer::BODY_MODE_CHARACTER: {
- _inv_mass=mass>0?(1.0/mass):0;
+ _inv_mass = mass > 0 ? (1.0 / mass) : 0;
_set_static(false);
} break;
}
_update_inertia();
//if (get_space())
-// _update_queries();
-
+ // _update_queries();
}
PhysicsServer::BodyMode BodySW::get_mode() const {
@@ -256,35 +245,33 @@ void BodySW::_shapes_changed() {
_update_inertia();
}
-void BodySW::set_state(PhysicsServer::BodyState p_state, const Variant& p_variant) {
+void BodySW::set_state(PhysicsServer::BodyState p_state, const Variant &p_variant) {
- switch(p_state) {
+ switch (p_state) {
case PhysicsServer::BODY_STATE_TRANSFORM: {
-
- if (mode==PhysicsServer::BODY_MODE_KINEMATIC) {
- new_transform=p_variant;
+ if (mode == PhysicsServer::BODY_MODE_KINEMATIC) {
+ new_transform = p_variant;
//wakeup_neighbours();
set_active(true);
if (first_time_kinematic) {
_set_transform(p_variant);
_set_inv_transform(get_transform().affine_inverse());
- first_time_kinematic=false;
+ first_time_kinematic = false;
}
- } else if (mode==PhysicsServer::BODY_MODE_STATIC) {
+ } else if (mode == PhysicsServer::BODY_MODE_STATIC) {
_set_transform(p_variant);
_set_inv_transform(get_transform().affine_inverse());
wakeup_neighbours();
} else {
Transform t = p_variant;
t.orthonormalize();
- new_transform=get_transform(); //used as old to compute motion
- if (new_transform==t)
+ new_transform = get_transform(); //used as old to compute motion
+ if (new_transform == t)
break;
_set_transform(t);
_set_inv_transform(get_transform().inverse());
-
}
wakeup();
@@ -293,44 +280,43 @@ void BodySW::set_state(PhysicsServer::BodyState p_state, const Variant& p_varian
//if (mode==PhysicsServer::BODY_MODE_STATIC)
// break;
- linear_velocity=p_variant;
+ linear_velocity = p_variant;
wakeup();
} break;
case PhysicsServer::BODY_STATE_ANGULAR_VELOCITY: {
//if (mode!=PhysicsServer::BODY_MODE_RIGID)
// break;
- angular_velocity=p_variant;
+ angular_velocity = p_variant;
wakeup();
} break;
case PhysicsServer::BODY_STATE_SLEEPING: {
//?
- if (mode==PhysicsServer::BODY_MODE_STATIC || mode==PhysicsServer::BODY_MODE_KINEMATIC)
+ if (mode == PhysicsServer::BODY_MODE_STATIC || mode == PhysicsServer::BODY_MODE_KINEMATIC)
break;
- bool do_sleep=p_variant;
+ bool do_sleep = p_variant;
if (do_sleep) {
- linear_velocity=Vector3();
+ linear_velocity = Vector3();
//biased_linear_velocity=Vector3();
- angular_velocity=Vector3();
+ angular_velocity = Vector3();
//biased_angular_velocity=Vector3();
set_active(false);
} else {
- if (mode!=PhysicsServer::BODY_MODE_STATIC)
+ if (mode != PhysicsServer::BODY_MODE_STATIC)
set_active(true);
}
} break;
case PhysicsServer::BODY_STATE_CAN_SLEEP: {
- can_sleep=p_variant;
- if (mode==PhysicsServer::BODY_MODE_RIGID && !active && !can_sleep)
+ can_sleep = p_variant;
+ if (mode == PhysicsServer::BODY_MODE_RIGID && !active && !can_sleep)
set_active(true);
} break;
}
-
}
Variant BodySW::get_state(PhysicsServer::BodyState p_state) const {
- switch(p_state) {
+ switch (p_state) {
case PhysicsServer::BODY_STATE_TRANSFORM: {
return get_transform();
} break;
@@ -351,8 +337,7 @@ Variant BodySW::get_state(PhysicsServer::BodyState p_state) const {
return Variant();
}
-
-void BodySW::set_space(SpaceSW *p_space){
+void BodySW::set_space(SpaceSW *p_space) {
if (get_space()) {
@@ -362,7 +347,6 @@ void BodySW::set_space(SpaceSW *p_space){
get_space()->body_remove_from_active_list(&active_list);
if (direct_state_query_list.in_list())
get_space()->body_remove_from_state_query_list(&direct_state_query_list);
-
}
_set_space(p_space);
@@ -372,24 +356,22 @@ void BodySW::set_space(SpaceSW *p_space){
_update_inertia();
if (active)
get_space()->body_add_to_active_list(&active_list);
-// _update_queries();
+ // _update_queries();
//if (is_active()) {
// active=false;
// set_active(true);
//}
-
}
- first_integration=true;
-
+ first_integration = true;
}
void BodySW::_compute_area_gravity_and_dampenings(const AreaSW *p_area) {
if (p_area->is_gravity_point()) {
- if(p_area->get_gravity_distance_scale() > 0) {
+ if (p_area->get_gravity_distance_scale() > 0) {
Vector3 v = p_area->get_transform().xform(p_area->get_gravity_vector()) - get_transform().get_origin();
- gravity += v.normalized() * (p_area->get_gravity() / Math::pow(v.length() * p_area->get_gravity_distance_scale()+1, 2) );
+ gravity += v.normalized() * (p_area->get_gravity() / Math::pow(v.length() * p_area->get_gravity_distance_scale() + 1, 2));
} else {
gravity += (p_area->get_transform().xform(p_area->get_gravity_vector()) - get_transform().get_origin()).normalized() * p_area->get_gravity();
}
@@ -403,8 +385,7 @@ void BodySW::_compute_area_gravity_and_dampenings(const AreaSW *p_area) {
void BodySW::integrate_forces(real_t p_step) {
-
- if (mode==PhysicsServer::BODY_MODE_STATIC)
+ if (mode == PhysicsServer::BODY_MODE_STATIC)
return;
AreaSW *def_area = get_space()->get_default_area();
@@ -414,186 +395,173 @@ void BodySW::integrate_forces(real_t p_step) {
int ac = areas.size();
bool stopped = false;
- gravity = Vector3(0,0,0);
+ gravity = Vector3(0, 0, 0);
area_linear_damp = 0;
area_angular_damp = 0;
if (ac) {
areas.sort();
const AreaCMP *aa = &areas[0];
// damp_area = aa[ac-1].area;
- for(int i=ac-1;i>=0 && !stopped;i--) {
- PhysicsServer::AreaSpaceOverrideMode mode=aa[i].area->get_space_override_mode();
+ for (int i = ac - 1; i >= 0 && !stopped; i--) {
+ PhysicsServer::AreaSpaceOverrideMode mode = aa[i].area->get_space_override_mode();
switch (mode) {
case PhysicsServer::AREA_SPACE_OVERRIDE_COMBINE:
case PhysicsServer::AREA_SPACE_OVERRIDE_COMBINE_REPLACE: {
_compute_area_gravity_and_dampenings(aa[i].area);
- stopped = mode==PhysicsServer::AREA_SPACE_OVERRIDE_COMBINE_REPLACE;
+ stopped = mode == PhysicsServer::AREA_SPACE_OVERRIDE_COMBINE_REPLACE;
} break;
case PhysicsServer::AREA_SPACE_OVERRIDE_REPLACE:
case PhysicsServer::AREA_SPACE_OVERRIDE_REPLACE_COMBINE: {
- gravity = Vector3(0,0,0);
+ gravity = Vector3(0, 0, 0);
area_angular_damp = 0;
area_linear_damp = 0;
_compute_area_gravity_and_dampenings(aa[i].area);
- stopped = mode==PhysicsServer::AREA_SPACE_OVERRIDE_REPLACE;
+ stopped = mode == PhysicsServer::AREA_SPACE_OVERRIDE_REPLACE;
} break;
default: {}
}
}
}
- if( !stopped ) {
+ if (!stopped) {
_compute_area_gravity_and_dampenings(def_area);
}
- gravity*=gravity_scale;
+ gravity *= gravity_scale;
// If less than 0, override dampenings with that of the Body
- if (angular_damp>=0)
- area_angular_damp=angular_damp;
+ if (angular_damp >= 0)
+ area_angular_damp = angular_damp;
//else
// area_angular_damp=damp_area->get_angular_damp();
- if (linear_damp>=0)
- area_linear_damp=linear_damp;
+ if (linear_damp >= 0)
+ area_linear_damp = linear_damp;
//else
// area_linear_damp=damp_area->get_linear_damp();
-
Vector3 motion;
- bool do_motion=false;
+ bool do_motion = false;
- if (mode==PhysicsServer::BODY_MODE_KINEMATIC) {
+ if (mode == PhysicsServer::BODY_MODE_KINEMATIC) {
//compute motion, angular and etc. velocities from prev transform
- linear_velocity = (new_transform.origin - get_transform().origin)/p_step;
+ linear_velocity = (new_transform.origin - get_transform().origin) / p_step;
//compute a FAKE angular velocity, not so easy
- Matrix3 rot=new_transform.basis.orthonormalized().transposed() * get_transform().basis.orthonormalized();
+ Matrix3 rot = new_transform.basis.orthonormalized().transposed() * get_transform().basis.orthonormalized();
Vector3 axis;
float angle;
- rot.get_axis_and_angle(axis,angle);
+ rot.get_axis_and_angle(axis, angle);
axis.normalize();
- angular_velocity=axis.normalized() * (angle/p_step);
+ angular_velocity = axis.normalized() * (angle / p_step);
motion = new_transform.origin - get_transform().origin;
- do_motion=true;
+ do_motion = true;
} else {
if (!omit_force_integration && !first_integration) {
//overriden by direct state query
- Vector3 force=gravity*mass;
- force+=applied_force;
- Vector3 torque=applied_torque;
+ Vector3 force = gravity * mass;
+ force += applied_force;
+ Vector3 torque = applied_torque;
real_t damp = 1.0 - p_step * area_linear_damp;
- if (damp<0) // reached zero in the given time
- damp=0;
+ if (damp < 0) // reached zero in the given time
+ damp = 0;
real_t angular_damp = 1.0 - p_step * area_angular_damp;
- if (angular_damp<0) // reached zero in the given time
- angular_damp=0;
+ if (angular_damp < 0) // reached zero in the given time
+ angular_damp = 0;
- linear_velocity*=damp;
- angular_velocity*=angular_damp;
+ linear_velocity *= damp;
+ angular_velocity *= angular_damp;
- linear_velocity+=_inv_mass * force * p_step;
- angular_velocity+=_inv_inertia_tensor.xform(torque)*p_step;
+ linear_velocity += _inv_mass * force * p_step;
+ angular_velocity += _inv_inertia_tensor.xform(torque) * p_step;
}
if (continuous_cd) {
- motion=linear_velocity*p_step;
- do_motion=true;
+ motion = linear_velocity * p_step;
+ do_motion = true;
}
-
}
- applied_force=Vector3();
- applied_torque=Vector3();
- first_integration=false;
+ applied_force = Vector3();
+ applied_torque = Vector3();
+ first_integration = false;
//motion=linear_velocity*p_step;
- biased_angular_velocity=Vector3();
- biased_linear_velocity=Vector3();
-
+ biased_angular_velocity = Vector3();
+ biased_linear_velocity = Vector3();
- if (do_motion) {//shapes temporarily extend for raycast
+ if (do_motion) { //shapes temporarily extend for raycast
_update_shapes_with_motion(motion);
}
-
- def_area=NULL; // clear the area, so it is set in the next frame
- contact_count=0;
-
+ def_area = NULL; // clear the area, so it is set in the next frame
+ contact_count = 0;
}
void BodySW::integrate_velocities(real_t p_step) {
- if (mode==PhysicsServer::BODY_MODE_STATIC)
+ if (mode == PhysicsServer::BODY_MODE_STATIC)
return;
if (fi_callback)
get_space()->body_add_to_state_query_list(&direct_state_query_list);
- if (mode==PhysicsServer::BODY_MODE_KINEMATIC) {
+ if (mode == PhysicsServer::BODY_MODE_KINEMATIC) {
- _set_transform(new_transform,false);
+ _set_transform(new_transform, false);
_set_inv_transform(new_transform.affine_inverse());
- if (contacts.size()==0 && linear_velocity==Vector3() && angular_velocity==Vector3())
+ if (contacts.size() == 0 && linear_velocity == Vector3() && angular_velocity == Vector3())
set_active(false); //stopped moving, deactivate
return;
}
-
-
//apply axis lock
- if (axis_lock!=PhysicsServer::BODY_AXIS_LOCK_DISABLED) {
-
+ if (axis_lock != PhysicsServer::BODY_AXIS_LOCK_DISABLED) {
- int axis=axis_lock-1;
- for(int i=0;i<3;i++) {
- if (i==axis) {
- linear_velocity[i]=0;
- biased_linear_velocity[i]=0;
+ int axis = axis_lock - 1;
+ for (int i = 0; i < 3; i++) {
+ if (i == axis) {
+ linear_velocity[i] = 0;
+ biased_linear_velocity[i] = 0;
} else {
- angular_velocity[i]=0;
- biased_angular_velocity[i]=0;
+ angular_velocity[i] = 0;
+ biased_angular_velocity[i] = 0;
}
}
-
}
-
- Vector3 total_angular_velocity = angular_velocity+biased_angular_velocity;
-
-
+ Vector3 total_angular_velocity = angular_velocity + biased_angular_velocity;
float ang_vel = total_angular_velocity.length();
Transform transform = get_transform();
-
- if (ang_vel!=0.0) {
+ if (ang_vel != 0.0) {
Vector3 ang_vel_axis = total_angular_velocity / ang_vel;
- Matrix3 rot( ang_vel_axis, -ang_vel*p_step );
+ Matrix3 rot(ang_vel_axis, -ang_vel * p_step);
transform.basis = rot * transform.basis;
transform.orthonormalize();
}
- Vector3 total_linear_velocity=linear_velocity+biased_linear_velocity;
+ Vector3 total_linear_velocity = linear_velocity + biased_linear_velocity;
/*for(int i=0;i<3;i++) {
if (axis_lock&(1<<i)) {
transform.origin[i]=0.0;
}
}*/
- transform.origin+=total_linear_velocity * p_step;
+ transform.origin += total_linear_velocity * p_step;
_set_transform(transform);
_set_inv_transform(get_transform().inverse());
@@ -642,18 +610,18 @@ void BodySW::simulate_motion(const Transform& p_xform,real_t p_step) {
void BodySW::wakeup_neighbours() {
- for(Map<ConstraintSW*,int>::Element *E=constraint_map.front();E;E=E->next()) {
+ for (Map<ConstraintSW *, int>::Element *E = constraint_map.front(); E; E = E->next()) {
- const ConstraintSW *c=E->key();
+ const ConstraintSW *c = E->key();
BodySW **n = c->get_body_ptr();
- int bc=c->get_body_count();
+ int bc = c->get_body_count();
- for(int i=0;i<bc;i++) {
+ for (int i = 0; i < bc; i++) {
- if (i==E->get())
+ if (i == E->get())
continue;
BodySW *b = n[i];
- if (b->mode!=PhysicsServer::BODY_MODE_RIGID)
+ if (b->mode != PhysicsServer::BODY_MODE_RIGID)
continue;
if (!b->is_active())
@@ -664,109 +632,96 @@ void BodySW::wakeup_neighbours() {
void BodySW::call_queries() {
-
if (fi_callback) {
PhysicsDirectBodyStateSW *dbs = PhysicsDirectBodyStateSW::singleton;
- dbs->body=this;
+ dbs->body = this;
- Variant v=dbs;
+ Variant v = dbs;
Object *obj = ObjectDB::get_instance(fi_callback->id);
if (!obj) {
- set_force_integration_callback(0,StringName());
+ set_force_integration_callback(0, StringName());
} else {
- const Variant *vp[2]={&v,&fi_callback->udata};
+ const Variant *vp[2] = { &v, &fi_callback->udata };
Variant::CallError ce;
- int argc=(fi_callback->udata.get_type()==Variant::NIL)?1:2;
- obj->call(fi_callback->method,vp,argc,ce);
+ int argc = (fi_callback->udata.get_type() == Variant::NIL) ? 1 : 2;
+ obj->call(fi_callback->method, vp, argc, ce);
}
-
-
}
-
-
}
+bool BodySW::sleep_test(real_t p_step) {
-bool BodySW::sleep_test(real_t p_step) {
-
- if (mode==PhysicsServer::BODY_MODE_STATIC || mode==PhysicsServer::BODY_MODE_KINEMATIC)
+ if (mode == PhysicsServer::BODY_MODE_STATIC || mode == PhysicsServer::BODY_MODE_KINEMATIC)
return true; //
- else if (mode==PhysicsServer::BODY_MODE_CHARACTER)
+ else if (mode == PhysicsServer::BODY_MODE_CHARACTER)
return !active; // characters don't sleep unless asked to sleep
else if (!can_sleep)
return false;
+ if (Math::abs(angular_velocity.length()) < get_space()->get_body_angular_velocity_sleep_treshold() && Math::abs(linear_velocity.length_squared()) < get_space()->get_body_linear_velocity_sleep_treshold() * get_space()->get_body_linear_velocity_sleep_treshold()) {
-
-
- if (Math::abs(angular_velocity.length())<get_space()->get_body_angular_velocity_sleep_treshold() && Math::abs(linear_velocity.length_squared()) < get_space()->get_body_linear_velocity_sleep_treshold()*get_space()->get_body_linear_velocity_sleep_treshold()) {
-
- still_time+=p_step;
+ still_time += p_step;
return still_time > get_space()->get_body_time_to_sleep();
} else {
- still_time=0; //maybe this should be set to 0 on set_active?
+ still_time = 0; //maybe this should be set to 0 on set_active?
return false;
}
}
-
-void BodySW::set_force_integration_callback(ObjectID p_id,const StringName& p_method,const Variant& p_udata) {
+void BodySW::set_force_integration_callback(ObjectID p_id, const StringName &p_method, const Variant &p_udata) {
if (fi_callback) {
memdelete(fi_callback);
- fi_callback=NULL;
+ fi_callback = NULL;
}
+ if (p_id != 0) {
- if (p_id!=0) {
-
- fi_callback=memnew(ForceIntegrationCallback);
- fi_callback->id=p_id;
- fi_callback->method=p_method;
- fi_callback->udata=p_udata;
+ fi_callback = memnew(ForceIntegrationCallback);
+ fi_callback->id = p_id;
+ fi_callback->method = p_method;
+ fi_callback->udata = p_udata;
}
-
}
-BodySW::BodySW() : CollisionObjectSW(TYPE_BODY), active_list(this), inertia_update_list(this), direct_state_query_list(this) {
-
+BodySW::BodySW()
+ : CollisionObjectSW(TYPE_BODY), active_list(this), inertia_update_list(this), direct_state_query_list(this) {
- mode=PhysicsServer::BODY_MODE_RIGID;
- active=true;
+ mode = PhysicsServer::BODY_MODE_RIGID;
+ active = true;
- mass=1;
-// _inv_inertia=Transform();
- _inv_mass=1;
- bounce=0;
- friction=1;
- omit_force_integration=false;
-// applied_torque=0;
- island_step=0;
- island_next=NULL;
- island_list_next=NULL;
- first_time_kinematic=false;
- first_integration=false;
+ mass = 1;
+ // _inv_inertia=Transform();
+ _inv_mass = 1;
+ bounce = 0;
+ friction = 1;
+ omit_force_integration = false;
+ // applied_torque=0;
+ island_step = 0;
+ island_next = NULL;
+ island_list_next = NULL;
+ first_time_kinematic = false;
+ first_integration = false;
_set_static(false);
- contact_count=0;
- gravity_scale=1.0;
+ contact_count = 0;
+ gravity_scale = 1.0;
- area_angular_damp=0;
- area_linear_damp=0;
-
- still_time=0;
- continuous_cd=false;
- can_sleep=false;
- fi_callback=NULL;
- axis_lock=PhysicsServer::BODY_AXIS_LOCK_DISABLED;
+ area_angular_damp = 0;
+ area_linear_damp = 0;
+ still_time = 0;
+ continuous_cd = false;
+ can_sleep = false;
+ fi_callback = NULL;
+ axis_lock = PhysicsServer::BODY_AXIS_LOCK_DISABLED;
}
BodySW::~BodySW() {
@@ -775,9 +730,9 @@ BodySW::~BodySW() {
memdelete(fi_callback);
}
-PhysicsDirectBodyStateSW *PhysicsDirectBodyStateSW::singleton=NULL;
+PhysicsDirectBodyStateSW *PhysicsDirectBodyStateSW::singleton = NULL;
-PhysicsDirectSpaceState* PhysicsDirectBodyStateSW::get_space_state() {
+PhysicsDirectSpaceState *PhysicsDirectBodyStateSW::get_space_state() {
return body->get_space()->get_direct_state();
}
diff --git a/servers/physics/body_sw.h b/servers/physics/body_sw.h
index 2855e03a8..cb91f93fe 100644
--- a/servers/physics/body_sw.h
+++ b/servers/physics/body_sw.h
@@ -29,16 +29,14 @@
#ifndef BODY_SW_H
#define BODY_SW_H
+#include "area_sw.h"
#include "collision_object_sw.h"
#include "vset.h"
-#include "area_sw.h"
class ConstraintSW;
-
class BodySW : public CollisionObjectSW {
-
PhysicsServer::BodyMode mode;
Vector3 linear_velocity;
@@ -70,7 +68,6 @@ class BodySW : public CollisionObjectSW {
float area_angular_damp;
float area_linear_damp;
-
SelfList<BodySW> active_list;
SelfList<BodySW> inertia_update_list;
SelfList<BodySW> direct_state_query_list;
@@ -88,23 +85,25 @@ class BodySW : public CollisionObjectSW {
virtual void _shapes_changed();
Transform new_transform;
- Map<ConstraintSW*,int> constraint_map;
+ Map<ConstraintSW *, int> constraint_map;
struct AreaCMP {
AreaSW *area;
int refCount;
- _FORCE_INLINE_ bool operator==(const AreaCMP& p_cmp) const { return area->get_self() == p_cmp.area->get_self();}
- _FORCE_INLINE_ bool operator<(const AreaCMP& p_cmp) const { return area->get_priority() < p_cmp.area->get_priority();}
+ _FORCE_INLINE_ bool operator==(const AreaCMP &p_cmp) const { return area->get_self() == p_cmp.area->get_self(); }
+ _FORCE_INLINE_ bool operator<(const AreaCMP &p_cmp) const { return area->get_priority() < p_cmp.area->get_priority(); }
_FORCE_INLINE_ AreaCMP() {}
- _FORCE_INLINE_ AreaCMP(AreaSW *p_area) { area=p_area; refCount=1;}
+ _FORCE_INLINE_ AreaCMP(AreaSW *p_area) {
+ area = p_area;
+ refCount = 1;
+ }
};
Vector<AreaCMP> areas;
struct Contact {
-
Vector3 local_pos;
Vector3 local_normal;
float depth;
@@ -128,7 +127,6 @@ class BodySW : public CollisionObjectSW {
ForceIntegrationCallback *fi_callback;
-
uint64_t island_step;
BodySW *island_next;
BodySW *island_list_next;
@@ -137,16 +135,14 @@ class BodySW : public CollisionObjectSW {
_FORCE_INLINE_ void _update_inertia_tensor();
-friend class PhysicsDirectBodyStateSW; // i give up, too many functions to expose
+ friend class PhysicsDirectBodyStateSW; // i give up, too many functions to expose
public:
-
-
- void set_force_integration_callback(ObjectID p_id,const StringName& p_method,const Variant& p_udata=Variant());
+ void set_force_integration_callback(ObjectID p_id, const StringName &p_method, const Variant &p_udata = Variant());
_FORCE_INLINE_ void add_area(AreaSW *p_area) {
int index = areas.find(AreaCMP(p_area));
- if( index > -1 ) {
+ if (index > -1) {
areas[index].refCount += 1;
} else {
areas.ordered_insert(AreaCMP(p_area));
@@ -155,68 +151,71 @@ public:
_FORCE_INLINE_ void remove_area(AreaSW *p_area) {
int index = areas.find(AreaCMP(p_area));
- if( index > -1 ) {
+ if (index > -1) {
areas[index].refCount -= 1;
- if( areas[index].refCount < 1 )
+ if (areas[index].refCount < 1)
areas.remove(index);
}
}
- _FORCE_INLINE_ void set_max_contacts_reported(int p_size) { contacts.resize(p_size); contact_count=0; if (mode==PhysicsServer::BODY_MODE_KINEMATIC && p_size) set_active(true);}
+ _FORCE_INLINE_ void set_max_contacts_reported(int p_size) {
+ contacts.resize(p_size);
+ contact_count = 0;
+ if (mode == PhysicsServer::BODY_MODE_KINEMATIC && p_size) set_active(true);
+ }
_FORCE_INLINE_ int get_max_contacts_reported() const { return contacts.size(); }
_FORCE_INLINE_ bool can_report_contacts() const { return !contacts.empty(); }
- _FORCE_INLINE_ void add_contact(const Vector3& p_local_pos,const Vector3& p_local_normal, float p_depth, int p_local_shape, const Vector3& p_collider_pos, int p_collider_shape, ObjectID p_collider_instance_id, const RID& p_collider,const Vector3& p_collider_velocity_at_pos);
-
+ _FORCE_INLINE_ void add_contact(const Vector3 &p_local_pos, const Vector3 &p_local_normal, float p_depth, int p_local_shape, const Vector3 &p_collider_pos, int p_collider_shape, ObjectID p_collider_instance_id, const RID &p_collider, const Vector3 &p_collider_velocity_at_pos);
- _FORCE_INLINE_ void add_exception(const RID& p_exception) { exceptions.insert(p_exception);}
- _FORCE_INLINE_ void remove_exception(const RID& p_exception) { exceptions.erase(p_exception);}
- _FORCE_INLINE_ bool has_exception(const RID& p_exception) const { return exceptions.has(p_exception);}
- _FORCE_INLINE_ const VSet<RID>& get_exceptions() const { return exceptions;}
+ _FORCE_INLINE_ void add_exception(const RID &p_exception) { exceptions.insert(p_exception); }
+ _FORCE_INLINE_ void remove_exception(const RID &p_exception) { exceptions.erase(p_exception); }
+ _FORCE_INLINE_ bool has_exception(const RID &p_exception) const { return exceptions.has(p_exception); }
+ _FORCE_INLINE_ const VSet<RID> &get_exceptions() const { return exceptions; }
_FORCE_INLINE_ uint64_t get_island_step() const { return island_step; }
- _FORCE_INLINE_ void set_island_step(uint64_t p_step) { island_step=p_step; }
+ _FORCE_INLINE_ void set_island_step(uint64_t p_step) { island_step = p_step; }
- _FORCE_INLINE_ BodySW* get_island_next() const { return island_next; }
- _FORCE_INLINE_ void set_island_next(BodySW* p_next) { island_next=p_next; }
+ _FORCE_INLINE_ BodySW *get_island_next() const { return island_next; }
+ _FORCE_INLINE_ void set_island_next(BodySW *p_next) { island_next = p_next; }
- _FORCE_INLINE_ BodySW* get_island_list_next() const { return island_list_next; }
- _FORCE_INLINE_ void set_island_list_next(BodySW* p_next) { island_list_next=p_next; }
+ _FORCE_INLINE_ BodySW *get_island_list_next() const { return island_list_next; }
+ _FORCE_INLINE_ void set_island_list_next(BodySW *p_next) { island_list_next = p_next; }
- _FORCE_INLINE_ void add_constraint(ConstraintSW* p_constraint, int p_pos) { constraint_map[p_constraint]=p_pos; }
- _FORCE_INLINE_ void remove_constraint(ConstraintSW* p_constraint) { constraint_map.erase(p_constraint); }
- const Map<ConstraintSW*,int>& get_constraint_map() const { return constraint_map; }
+ _FORCE_INLINE_ void add_constraint(ConstraintSW *p_constraint, int p_pos) { constraint_map[p_constraint] = p_pos; }
+ _FORCE_INLINE_ void remove_constraint(ConstraintSW *p_constraint) { constraint_map.erase(p_constraint); }
+ const Map<ConstraintSW *, int> &get_constraint_map() const { return constraint_map; }
- _FORCE_INLINE_ void set_omit_force_integration(bool p_omit_force_integration) { omit_force_integration=p_omit_force_integration; }
+ _FORCE_INLINE_ void set_omit_force_integration(bool p_omit_force_integration) { omit_force_integration = p_omit_force_integration; }
_FORCE_INLINE_ bool get_omit_force_integration() const { return omit_force_integration; }
- _FORCE_INLINE_ void set_linear_velocity(const Vector3& p_velocity) {linear_velocity=p_velocity; }
+ _FORCE_INLINE_ void set_linear_velocity(const Vector3 &p_velocity) { linear_velocity = p_velocity; }
_FORCE_INLINE_ Vector3 get_linear_velocity() const { return linear_velocity; }
- _FORCE_INLINE_ void set_angular_velocity(const Vector3& p_velocity) { angular_velocity=p_velocity; }
+ _FORCE_INLINE_ void set_angular_velocity(const Vector3 &p_velocity) { angular_velocity = p_velocity; }
_FORCE_INLINE_ Vector3 get_angular_velocity() const { return angular_velocity; }
- _FORCE_INLINE_ const Vector3& get_biased_linear_velocity() const { return biased_linear_velocity; }
- _FORCE_INLINE_ const Vector3& get_biased_angular_velocity() const { return biased_angular_velocity; }
+ _FORCE_INLINE_ const Vector3 &get_biased_linear_velocity() const { return biased_linear_velocity; }
+ _FORCE_INLINE_ const Vector3 &get_biased_angular_velocity() const { return biased_angular_velocity; }
- _FORCE_INLINE_ void apply_impulse(const Vector3& p_pos, const Vector3& p_j) {
+ _FORCE_INLINE_ void apply_impulse(const Vector3 &p_pos, const Vector3 &p_j) {
linear_velocity += p_j * _inv_mass;
- angular_velocity += _inv_inertia_tensor.xform( p_pos.cross(p_j) );
+ angular_velocity += _inv_inertia_tensor.xform(p_pos.cross(p_j));
}
- _FORCE_INLINE_ void apply_bias_impulse(const Vector3& p_pos, const Vector3& p_j) {
+ _FORCE_INLINE_ void apply_bias_impulse(const Vector3 &p_pos, const Vector3 &p_j) {
biased_linear_velocity += p_j * _inv_mass;
- biased_angular_velocity += _inv_inertia_tensor.xform( p_pos.cross(p_j) );
+ biased_angular_velocity += _inv_inertia_tensor.xform(p_pos.cross(p_j));
}
- _FORCE_INLINE_ void apply_torque_impulse(const Vector3& p_j) {
+ _FORCE_INLINE_ void apply_torque_impulse(const Vector3 &p_j) {
angular_velocity += _inv_inertia_tensor.xform(p_j);
}
- _FORCE_INLINE_ void add_force(const Vector3& p_force, const Vector3& p_pos) {
+ _FORCE_INLINE_ void add_force(const Vector3 &p_force, const Vector3 &p_pos) {
applied_force += p_force;
applied_torque += p_pos.cross(p_force);
@@ -226,7 +225,7 @@ public:
_FORCE_INLINE_ bool is_active() const { return active; }
_FORCE_INLINE_ void wakeup() {
- if ((!get_space()) || mode==PhysicsServer::BODY_MODE_STATIC || mode==PhysicsServer::BODY_MODE_KINEMATIC)
+ if ((!get_space()) || mode == PhysicsServer::BODY_MODE_STATIC || mode == PhysicsServer::BODY_MODE_KINEMATIC)
return;
set_active(true);
}
@@ -237,16 +236,16 @@ public:
void set_mode(PhysicsServer::BodyMode p_mode);
PhysicsServer::BodyMode get_mode() const;
- void set_state(PhysicsServer::BodyState p_state, const Variant& p_variant);
+ void set_state(PhysicsServer::BodyState p_state, const Variant &p_variant);
Variant get_state(PhysicsServer::BodyState p_state) const;
- void set_applied_force(const Vector3& p_force) { applied_force=p_force; }
+ void set_applied_force(const Vector3 &p_force) { applied_force = p_force; }
Vector3 get_applied_force() const { return applied_force; }
- void set_applied_torque(const Vector3& p_torque) { applied_torque=p_torque; }
+ void set_applied_torque(const Vector3 &p_torque) { applied_torque = p_torque; }
Vector3 get_applied_torque() const { return applied_torque; }
- _FORCE_INLINE_ void set_continuous_collision_detection(bool p_enable) { continuous_cd=p_enable; }
+ _FORCE_INLINE_ void set_continuous_collision_detection(bool p_enable) { continuous_cd = p_enable; }
_FORCE_INLINE_ bool is_continuous_collision_detection_enabled() const { return continuous_cd; }
void set_space(SpaceSW *p_space);
@@ -260,33 +259,32 @@ public:
_FORCE_INLINE_ Vector3 get_gravity() const { return gravity; }
_FORCE_INLINE_ real_t get_bounce() const { return bounce; }
- _FORCE_INLINE_ void set_axis_lock(PhysicsServer::BodyAxisLock p_lock) { axis_lock=p_lock; }
+ _FORCE_INLINE_ void set_axis_lock(PhysicsServer::BodyAxisLock p_lock) { axis_lock = p_lock; }
_FORCE_INLINE_ PhysicsServer::BodyAxisLock get_axis_lock() const { return axis_lock; }
void integrate_forces(real_t p_step);
void integrate_velocities(real_t p_step);
- _FORCE_INLINE_ Vector3 get_velocity_in_local_point(const Vector3& rel_pos) const {
+ _FORCE_INLINE_ Vector3 get_velocity_in_local_point(const Vector3 &rel_pos) const {
return linear_velocity + angular_velocity.cross(rel_pos);
}
- _FORCE_INLINE_ real_t compute_impulse_denominator(const Vector3& p_pos, const Vector3& p_normal) const {
+ _FORCE_INLINE_ real_t compute_impulse_denominator(const Vector3 &p_pos, const Vector3 &p_normal) const {
- Vector3 r0 = p_pos - get_transform().origin;
+ Vector3 r0 = p_pos - get_transform().origin;
- Vector3 c0 = (r0).cross(p_normal);
+ Vector3 c0 = (r0).cross(p_normal);
- Vector3 vec = (_inv_inertia_tensor.xform_inv(c0)).cross(r0);
+ Vector3 vec = (_inv_inertia_tensor.xform_inv(c0)).cross(r0);
- return _inv_mass + p_normal.dot(vec);
-
- }
+ return _inv_mass + p_normal.dot(vec);
+ }
- _FORCE_INLINE_ real_t compute_angular_impulse_denominator(const Vector3& p_axis) const {
+ _FORCE_INLINE_ real_t compute_angular_impulse_denominator(const Vector3 &p_axis) const {
- return p_axis.dot( _inv_inertia_tensor.xform_inv(p_axis) );
- }
+ return p_axis.dot(_inv_inertia_tensor.xform_inv(p_axis));
+ }
//void simulate_motion(const Transform& p_xform,real_t p_step);
void call_queries();
@@ -296,113 +294,129 @@ public:
BodySW();
~BodySW();
-
};
-
//add contact inline
-void BodySW::add_contact(const Vector3& p_local_pos,const Vector3& p_local_normal, float p_depth, int p_local_shape, const Vector3& p_collider_pos, int p_collider_shape, ObjectID p_collider_instance_id, const RID& p_collider,const Vector3& p_collider_velocity_at_pos) {
+void BodySW::add_contact(const Vector3 &p_local_pos, const Vector3 &p_local_normal, float p_depth, int p_local_shape, const Vector3 &p_collider_pos, int p_collider_shape, ObjectID p_collider_instance_id, const RID &p_collider, const Vector3 &p_collider_velocity_at_pos) {
- int c_max=contacts.size();
+ int c_max = contacts.size();
- if (c_max==0)
+ if (c_max == 0)
return;
Contact *c = &contacts[0];
+ int idx = -1;
- int idx=-1;
-
- if (contact_count<c_max) {
- idx=contact_count++;
+ if (contact_count < c_max) {
+ idx = contact_count++;
} else {
- float least_depth=1e20;
- int least_deep=-1;
- for(int i=0;i<c_max;i++) {
+ float least_depth = 1e20;
+ int least_deep = -1;
+ for (int i = 0; i < c_max; i++) {
- if (i==0 || c[i].depth<least_depth) {
- least_deep=i;
- least_depth=c[i].depth;
+ if (i == 0 || c[i].depth < least_depth) {
+ least_deep = i;
+ least_depth = c[i].depth;
}
}
- if (least_deep>=0 && least_depth<p_depth) {
+ if (least_deep >= 0 && least_depth < p_depth) {
- idx=least_deep;
+ idx = least_deep;
}
- if (idx==-1)
+ if (idx == -1)
return; //none least deepe than this
}
- c[idx].local_pos=p_local_pos;
- c[idx].local_normal=p_local_normal;
- c[idx].depth=p_depth;
- c[idx].local_shape=p_local_shape;
- c[idx].collider_pos=p_collider_pos;
- c[idx].collider_shape=p_collider_shape;
- c[idx].collider_instance_id=p_collider_instance_id;
- c[idx].collider=p_collider;
- c[idx].collider_velocity_at_pos=p_collider_velocity_at_pos;
-
+ c[idx].local_pos = p_local_pos;
+ c[idx].local_normal = p_local_normal;
+ c[idx].depth = p_depth;
+ c[idx].local_shape = p_local_shape;
+ c[idx].collider_pos = p_collider_pos;
+ c[idx].collider_shape = p_collider_shape;
+ c[idx].collider_instance_id = p_collider_instance_id;
+ c[idx].collider = p_collider;
+ c[idx].collider_velocity_at_pos = p_collider_velocity_at_pos;
}
-
class PhysicsDirectBodyStateSW : public PhysicsDirectBodyState {
- OBJ_TYPE( PhysicsDirectBodyStateSW, PhysicsDirectBodyState );
+ OBJ_TYPE(PhysicsDirectBodyStateSW, PhysicsDirectBodyState);
public:
-
static PhysicsDirectBodyStateSW *singleton;
BodySW *body;
real_t step;
- virtual Vector3 get_total_gravity() const { return body->gravity; } // get gravity vector working on this body space/area
- virtual float get_total_angular_damp() const { return body->area_angular_damp; } // get density of this body space/area
- virtual float get_total_linear_damp() const { return body->area_linear_damp; } // get density of this body space/area
+ virtual Vector3 get_total_gravity() const { return body->gravity; } // get gravity vector working on this body space/area
+ virtual float get_total_angular_damp() const { return body->area_angular_damp; } // get density of this body space/area
+ virtual float get_total_linear_damp() const { return body->area_linear_damp; } // get density of this body space/area
- virtual float get_inverse_mass() const { return body->get_inv_mass(); } // get the mass
- virtual Vector3 get_inverse_inertia() const { return body->get_inv_inertia(); } // get density of this body space
- virtual Matrix3 get_inverse_inertia_tensor() const { return body->get_inv_inertia_tensor(); } // get density of this body space
+ virtual float get_inverse_mass() const { return body->get_inv_mass(); } // get the mass
+ virtual Vector3 get_inverse_inertia() const { return body->get_inv_inertia(); } // get density of this body space
+ virtual Matrix3 get_inverse_inertia_tensor() const { return body->get_inv_inertia_tensor(); } // get density of this body space
- virtual void set_linear_velocity(const Vector3& p_velocity) { body->set_linear_velocity(p_velocity); }
- virtual Vector3 get_linear_velocity() const { return body->get_linear_velocity(); }
+ virtual void set_linear_velocity(const Vector3 &p_velocity) { body->set_linear_velocity(p_velocity); }
+ virtual Vector3 get_linear_velocity() const { return body->get_linear_velocity(); }
- virtual void set_angular_velocity(const Vector3& p_velocity) { body->set_angular_velocity(p_velocity); }
- virtual Vector3 get_angular_velocity() const { return body->get_angular_velocity(); }
+ virtual void set_angular_velocity(const Vector3 &p_velocity) { body->set_angular_velocity(p_velocity); }
+ virtual Vector3 get_angular_velocity() const { return body->get_angular_velocity(); }
- virtual void set_transform(const Transform& p_transform) { body->set_state(PhysicsServer::BODY_STATE_TRANSFORM,p_transform); }
- virtual Transform get_transform() const { return body->get_transform(); }
+ virtual void set_transform(const Transform &p_transform) { body->set_state(PhysicsServer::BODY_STATE_TRANSFORM, p_transform); }
+ virtual Transform get_transform() const { return body->get_transform(); }
- virtual void add_force(const Vector3& p_force, const Vector3& p_pos) { body->add_force(p_force,p_pos); }
- virtual void apply_impulse(const Vector3& p_pos, const Vector3& p_j) { body->apply_impulse(p_pos,p_j); }
+ virtual void add_force(const Vector3 &p_force, const Vector3 &p_pos) { body->add_force(p_force, p_pos); }
+ virtual void apply_impulse(const Vector3 &p_pos, const Vector3 &p_j) { body->apply_impulse(p_pos, p_j); }
- virtual void set_sleep_state(bool p_enable) { body->set_active(!p_enable); }
- virtual bool is_sleeping() const { return !body->is_active(); }
+ virtual void set_sleep_state(bool p_enable) { body->set_active(!p_enable); }
+ virtual bool is_sleeping() const { return !body->is_active(); }
- virtual int get_contact_count() const { return body->contact_count; }
+ virtual int get_contact_count() const { return body->contact_count; }
virtual Vector3 get_contact_local_pos(int p_contact_idx) const {
- ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,Vector3());
+ ERR_FAIL_INDEX_V(p_contact_idx, body->contact_count, Vector3());
return body->contacts[p_contact_idx].local_pos;
}
- virtual Vector3 get_contact_local_normal(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,Vector3()); return body->contacts[p_contact_idx].local_normal; }
- virtual int get_contact_local_shape(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,-1); return body->contacts[p_contact_idx].local_shape; }
-
- virtual RID get_contact_collider(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,RID()); return body->contacts[p_contact_idx].collider; }
- virtual Vector3 get_contact_collider_pos(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,Vector3()); return body->contacts[p_contact_idx].collider_pos; }
- virtual ObjectID get_contact_collider_id(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,0); return body->contacts[p_contact_idx].collider_instance_id; }
- virtual int get_contact_collider_shape(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,0); return body->contacts[p_contact_idx].collider_shape; }
- virtual Vector3 get_contact_collider_velocity_at_pos(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,Vector3()); return body->contacts[p_contact_idx].collider_velocity_at_pos; }
+ virtual Vector3 get_contact_local_normal(int p_contact_idx) const {
+ ERR_FAIL_INDEX_V(p_contact_idx, body->contact_count, Vector3());
+ return body->contacts[p_contact_idx].local_normal;
+ }
+ virtual int get_contact_local_shape(int p_contact_idx) const {
+ ERR_FAIL_INDEX_V(p_contact_idx, body->contact_count, -1);
+ return body->contacts[p_contact_idx].local_shape;
+ }
- virtual PhysicsDirectSpaceState* get_space_state();
+ virtual RID get_contact_collider(int p_contact_idx) const {
+ ERR_FAIL_INDEX_V(p_contact_idx, body->contact_count, RID());
+ return body->contacts[p_contact_idx].collider;
+ }
+ virtual Vector3 get_contact_collider_pos(int p_contact_idx) const {
+ ERR_FAIL_INDEX_V(p_contact_idx, body->contact_count, Vector3());
+ return body->contacts[p_contact_idx].collider_pos;
+ }
+ virtual ObjectID get_contact_collider_id(int p_contact_idx) const {
+ ERR_FAIL_INDEX_V(p_contact_idx, body->contact_count, 0);
+ return body->contacts[p_contact_idx].collider_instance_id;
+ }
+ virtual int get_contact_collider_shape(int p_contact_idx) const {
+ ERR_FAIL_INDEX_V(p_contact_idx, body->contact_count, 0);
+ return body->contacts[p_contact_idx].collider_shape;
+ }
+ virtual Vector3 get_contact_collider_velocity_at_pos(int p_contact_idx) const {
+ ERR_FAIL_INDEX_V(p_contact_idx, body->contact_count, Vector3());
+ return body->contacts[p_contact_idx].collider_velocity_at_pos;
+ }
+ virtual PhysicsDirectSpaceState *get_space_state();
virtual real_t get_step() const { return step; }
- PhysicsDirectBodyStateSW() { singleton=this; body=NULL; }
+ PhysicsDirectBodyStateSW() {
+ singleton = this;
+ body = NULL;
+ }
};
-
#endif // BODY__SW_H
diff --git a/servers/physics/broad_phase_basic.cpp b/servers/physics/broad_phase_basic.cpp
index 30b597859..d6cca6710 100644
--- a/servers/physics/broad_phase_basic.cpp
+++ b/servers/physics/broad_phase_basic.cpp
@@ -31,117 +31,111 @@
#include "print_string.h"
BroadPhaseSW::ID BroadPhaseBasic::create(CollisionObjectSW *p_object_, int p_subindex) {
- if (p_object_==NULL) {
+ if (p_object_ == NULL) {
- ERR_FAIL_COND_V(p_object_==NULL,0);
+ ERR_FAIL_COND_V(p_object_ == NULL, 0);
}
current++;
Element e;
- e.owner=p_object_;
- e._static=false;
- e.subindex=p_subindex;
+ e.owner = p_object_;
+ e._static = false;
+ e.subindex = p_subindex;
- element_map[current]=e;
+ element_map[current] = e;
return current;
}
-void BroadPhaseBasic::move(ID p_id, const AABB& p_aabb) {
+void BroadPhaseBasic::move(ID p_id, const AABB &p_aabb) {
- Map<ID,Element>::Element *E=element_map.find(p_id);
+ Map<ID, Element>::Element *E = element_map.find(p_id);
ERR_FAIL_COND(!E);
- E->get().aabb=p_aabb;
-
+ E->get().aabb = p_aabb;
}
void BroadPhaseBasic::set_static(ID p_id, bool p_static) {
- Map<ID,Element>::Element *E=element_map.find(p_id);
+ Map<ID, Element>::Element *E = element_map.find(p_id);
ERR_FAIL_COND(!E);
- E->get()._static=p_static;
-
+ E->get()._static = p_static;
}
void BroadPhaseBasic::remove(ID p_id) {
- Map<ID,Element>::Element *E=element_map.find(p_id);
+ Map<ID, Element>::Element *E = element_map.find(p_id);
ERR_FAIL_COND(!E);
List<PairKey> to_erase;
//unpair must be done immediately on removal to avoid potential invalid pointers
- for (Map<PairKey,void*>::Element *F=pair_map.front();F;F=F->next()) {
+ for (Map<PairKey, void *>::Element *F = pair_map.front(); F; F = F->next()) {
- if (F->key().a==p_id || F->key().b==p_id) {
+ if (F->key().a == p_id || F->key().b == p_id) {
if (unpair_callback) {
- Element *elem_A=&element_map[F->key().a];
- Element *elem_B=&element_map[F->key().b];
- unpair_callback(elem_A->owner,elem_A->subindex,elem_B->owner,elem_B->subindex,F->get(),unpair_userdata);
+ Element *elem_A = &element_map[F->key().a];
+ Element *elem_B = &element_map[F->key().b];
+ unpair_callback(elem_A->owner, elem_A->subindex, elem_B->owner, elem_B->subindex, F->get(), unpair_userdata);
}
to_erase.push_back(F->key());
}
}
- while(to_erase.size()) {
+ while (to_erase.size()) {
pair_map.erase(to_erase.front()->get());
to_erase.pop_front();
}
element_map.erase(E);
-
}
CollisionObjectSW *BroadPhaseBasic::get_object(ID p_id) const {
- const Map<ID,Element>::Element *E=element_map.find(p_id);
- ERR_FAIL_COND_V(!E,NULL);
+ const Map<ID, Element>::Element *E = element_map.find(p_id);
+ ERR_FAIL_COND_V(!E, NULL);
return E->get().owner;
-
}
bool BroadPhaseBasic::is_static(ID p_id) const {
- const Map<ID,Element>::Element *E=element_map.find(p_id);
- ERR_FAIL_COND_V(!E,false);
+ const Map<ID, Element>::Element *E = element_map.find(p_id);
+ ERR_FAIL_COND_V(!E, false);
return E->get()._static;
-
}
int BroadPhaseBasic::get_subindex(ID p_id) const {
- const Map<ID,Element>::Element *E=element_map.find(p_id);
- ERR_FAIL_COND_V(!E,-1);
+ const Map<ID, Element>::Element *E = element_map.find(p_id);
+ ERR_FAIL_COND_V(!E, -1);
return E->get().subindex;
}
-int BroadPhaseBasic::cull_segment(const Vector3& p_from, const Vector3& p_to,CollisionObjectSW** p_results,int p_max_results,int *p_result_indices) {
+int BroadPhaseBasic::cull_segment(const Vector3 &p_from, const Vector3 &p_to, CollisionObjectSW **p_results, int p_max_results, int *p_result_indices) {
- int rc=0;
+ int rc = 0;
- for (Map<ID,Element>::Element *E=element_map.front();E;E=E->next()) {
+ for (Map<ID, Element>::Element *E = element_map.front(); E; E = E->next()) {
- const AABB aabb=E->get().aabb;
- if (aabb.intersects_segment(p_from,p_to)) {
+ const AABB aabb = E->get().aabb;
+ if (aabb.intersects_segment(p_from, p_to)) {
- p_results[rc]=E->get().owner;
- p_result_indices[rc]=E->get().subindex;
+ p_results[rc] = E->get().owner;
+ p_result_indices[rc] = E->get().subindex;
rc++;
- if (rc>=p_max_results)
+ if (rc >= p_max_results)
break;
}
}
return rc;
-
}
-int BroadPhaseBasic::cull_aabb(const AABB& p_aabb,CollisionObjectSW** p_results,int p_max_results,int *p_result_indices) {
+int BroadPhaseBasic::cull_aabb(const AABB &p_aabb, CollisionObjectSW **p_results, int p_max_results, int *p_result_indices) {
- int rc=0;
+ int rc = 0;
- for (Map<ID,Element>::Element *E=element_map.front();E;E=E->next()) {
+ for (Map<ID, Element>::Element *E = element_map.front(); E; E = E->next()) {
- const AABB aabb=E->get().aabb;
+ const AABB aabb = E->get().aabb;
if (aabb.intersects(p_aabb)) {
- p_results[rc]=E->get().owner;
- p_result_indices[rc]=E->get().subindex;
+ p_results[rc] = E->get().owner;
+ p_result_indices[rc] = E->get().subindex;
rc++;
- if (rc>=p_max_results)
+ if (rc >= p_max_results)
break;
}
}
@@ -149,68 +143,63 @@ int BroadPhaseBasic::cull_aabb(const AABB& p_aabb,CollisionObjectSW** p_results,
return rc;
}
-void BroadPhaseBasic::set_pair_callback(PairCallback p_pair_callback,void *p_userdata) {
-
- pair_userdata=p_userdata;
- pair_callback=p_pair_callback;
+void BroadPhaseBasic::set_pair_callback(PairCallback p_pair_callback, void *p_userdata) {
+ pair_userdata = p_userdata;
+ pair_callback = p_pair_callback;
}
-void BroadPhaseBasic::set_unpair_callback(UnpairCallback p_pair_callback,void *p_userdata) {
-
- unpair_userdata=p_userdata;
- unpair_callback=p_pair_callback;
+void BroadPhaseBasic::set_unpair_callback(UnpairCallback p_pair_callback, void *p_userdata) {
+ unpair_userdata = p_userdata;
+ unpair_callback = p_pair_callback;
}
void BroadPhaseBasic::update() {
// recompute pairs
- for(Map<ID,Element>::Element *I=element_map.front();I;I=I->next()) {
+ for (Map<ID, Element>::Element *I = element_map.front(); I; I = I->next()) {
- for(Map<ID,Element>::Element *J=I->next();J;J=J->next()) {
+ for (Map<ID, Element>::Element *J = I->next(); J; J = J->next()) {
- Element *elem_A=&I->get();
- Element *elem_B=&J->get();
+ Element *elem_A = &I->get();
+ Element *elem_B = &J->get();
if (elem_A->owner == elem_B->owner)
continue;
+ bool pair_ok = elem_A->aabb.intersects(elem_B->aabb) && (!elem_A->_static || !elem_B->_static);
- bool pair_ok=elem_A->aabb.intersects( elem_B->aabb ) && (!elem_A->_static || !elem_B->_static );
-
- PairKey key(I->key(),J->key());
+ PairKey key(I->key(), J->key());
- Map<PairKey,void*>::Element *E=pair_map.find(key);
+ Map<PairKey, void *>::Element *E = pair_map.find(key);
if (!pair_ok && E) {
if (unpair_callback)
- unpair_callback(elem_A->owner,elem_A->subindex,elem_B->owner,elem_B->subindex,E->get(),unpair_userdata);
+ unpair_callback(elem_A->owner, elem_A->subindex, elem_B->owner, elem_B->subindex, E->get(), unpair_userdata);
pair_map.erase(key);
}
if (pair_ok && !E) {
- void *data=NULL;
+ void *data = NULL;
if (pair_callback)
- data=pair_callback(elem_A->owner,elem_A->subindex,elem_B->owner,elem_B->subindex,unpair_userdata);
- pair_map.insert(key,data);
+ data = pair_callback(elem_A->owner, elem_A->subindex, elem_B->owner, elem_B->subindex, unpair_userdata);
+ pair_map.insert(key, data);
}
}
}
-
}
BroadPhaseSW *BroadPhaseBasic::_create() {
- return memnew( BroadPhaseBasic );
+ return memnew(BroadPhaseBasic);
}
BroadPhaseBasic::BroadPhaseBasic() {
- current=1;
- unpair_callback=NULL;
- unpair_userdata=NULL;
- pair_callback=NULL;
- pair_userdata=NULL;
-
+ current = 1;
+ unpair_callback = NULL;
+ unpair_userdata = NULL;
+ pair_callback = NULL;
+ pair_userdata = NULL;
}
diff --git a/servers/physics/broad_phase_basic.h b/servers/physics/broad_phase_basic.h
index 423ff0a6a..6c9309cec 100644
--- a/servers/physics/broad_phase_basic.h
+++ b/servers/physics/broad_phase_basic.h
@@ -42,8 +42,7 @@ class BroadPhaseBasic : public BroadPhaseSW {
int subindex;
};
-
- Map<ID,Element> element_map;
+ Map<ID, Element> element_map;
ID current;
@@ -57,17 +56,23 @@ class BroadPhaseBasic : public BroadPhaseSW {
uint64_t key;
};
- _FORCE_INLINE_ bool operator<(const PairKey& p_key) const {
+ _FORCE_INLINE_ bool operator<(const PairKey &p_key) const {
return key < p_key.key;
}
- PairKey() { key=0; }
- PairKey(ID p_a, ID p_b) { if (p_a>p_b) { a=p_b; b=p_a; } else { a=p_a; b=p_b; }}
-
+ PairKey() { key = 0; }
+ PairKey(ID p_a, ID p_b) {
+ if (p_a > p_b) {
+ a = p_b;
+ b = p_a;
+ } else {
+ a = p_a;
+ b = p_b;
+ }
+ }
};
- Map<PairKey,void*> pair_map;
-
+ Map<PairKey, void *> pair_map;
PairCallback pair_callback;
void *pair_userdata;
@@ -75,10 +80,9 @@ class BroadPhaseBasic : public BroadPhaseSW {
void *unpair_userdata;
public:
-
// 0 is an invalid ID
- virtual ID create(CollisionObjectSW *p_object_, int p_subindex=0);
- virtual void move(ID p_id, const AABB& p_aabb);
+ virtual ID create(CollisionObjectSW *p_object_, int p_subindex = 0);
+ virtual void move(ID p_id, const AABB &p_aabb);
virtual void set_static(ID p_id, bool p_static);
virtual void remove(ID p_id);
@@ -86,11 +90,11 @@ public:
virtual bool is_static(ID p_id) const;
virtual int get_subindex(ID p_id) const;
- virtual int cull_segment(const Vector3& p_from, const Vector3& p_to,CollisionObjectSW** p_results,int p_max_results,int *p_result_indices=NULL);
- virtual int cull_aabb(const AABB& p_aabb,CollisionObjectSW** p_results,int p_max_results,int *p_result_indices=NULL);
+ virtual int cull_segment(const Vector3 &p_from, const Vector3 &p_to, CollisionObjectSW **p_results, int p_max_results, int *p_result_indices = NULL);
+ virtual int cull_aabb(const AABB &p_aabb, CollisionObjectSW **p_results, int p_max_results, int *p_result_indices = NULL);
- virtual void set_pair_callback(PairCallback p_pair_callback,void *p_userdata);
- virtual void set_unpair_callback(UnpairCallback p_unpair_callback,void *p_userdata);
+ virtual void set_pair_callback(PairCallback p_pair_callback, void *p_userdata);
+ virtual void set_unpair_callback(UnpairCallback p_unpair_callback, void *p_userdata);
virtual void update();
diff --git a/servers/physics/broad_phase_octree.cpp b/servers/physics/broad_phase_octree.cpp
index e747ea93a..5adf0811e 100644
--- a/servers/physics/broad_phase_octree.cpp
+++ b/servers/physics/broad_phase_octree.cpp
@@ -31,85 +31,77 @@
ID BroadPhaseOctree::create(CollisionObjectSW *p_object, int p_subindex) {
- ID oid = octree.create(p_object,AABB(),p_subindex,false,1<<p_object->get_type(),0);
+ ID oid = octree.create(p_object, AABB(), p_subindex, false, 1 << p_object->get_type(), 0);
return oid;
}
-void BroadPhaseOctree::move(ID p_id, const AABB& p_aabb){
+void BroadPhaseOctree::move(ID p_id, const AABB &p_aabb) {
- octree.move(p_id,p_aabb);
+ octree.move(p_id, p_aabb);
}
-void BroadPhaseOctree::set_static(ID p_id, bool p_static){
+void BroadPhaseOctree::set_static(ID p_id, bool p_static) {
CollisionObjectSW *it = octree.get(p_id);
- octree.set_pairable(p_id,p_static?false:true,1<<it->get_type(),p_static?0:0xFFFFF); //pair everything, don't care 1?
-
+ octree.set_pairable(p_id, p_static ? false : true, 1 << it->get_type(), p_static ? 0 : 0xFFFFF); //pair everything, don't care 1?
}
-void BroadPhaseOctree::remove(ID p_id){
+void BroadPhaseOctree::remove(ID p_id) {
octree.erase(p_id);
}
-CollisionObjectSW *BroadPhaseOctree::get_object(ID p_id) const{
+CollisionObjectSW *BroadPhaseOctree::get_object(ID p_id) const {
CollisionObjectSW *it = octree.get(p_id);
- ERR_FAIL_COND_V(!it,NULL);
+ ERR_FAIL_COND_V(!it, NULL);
return it;
}
-bool BroadPhaseOctree::is_static(ID p_id) const{
+bool BroadPhaseOctree::is_static(ID p_id) const {
return !octree.is_pairable(p_id);
}
-int BroadPhaseOctree::get_subindex(ID p_id) const{
+int BroadPhaseOctree::get_subindex(ID p_id) const {
return octree.get_subindex(p_id);
}
-int BroadPhaseOctree::cull_segment(const Vector3& p_from, const Vector3& p_to,CollisionObjectSW** p_results,int p_max_results,int *p_result_indices){
+int BroadPhaseOctree::cull_segment(const Vector3 &p_from, const Vector3 &p_to, CollisionObjectSW **p_results, int p_max_results, int *p_result_indices) {
- return octree.cull_segment(p_from,p_to,p_results,p_max_results,p_result_indices);
+ return octree.cull_segment(p_from, p_to, p_results, p_max_results, p_result_indices);
}
-int BroadPhaseOctree::cull_aabb(const AABB& p_aabb,CollisionObjectSW** p_results,int p_max_results,int *p_result_indices) {
-
- return octree.cull_AABB(p_aabb,p_results,p_max_results,p_result_indices);
+int BroadPhaseOctree::cull_aabb(const AABB &p_aabb, CollisionObjectSW **p_results, int p_max_results, int *p_result_indices) {
+ return octree.cull_AABB(p_aabb, p_results, p_max_results, p_result_indices);
}
+void *BroadPhaseOctree::_pair_callback(void *self, OctreeElementID p_A, CollisionObjectSW *p_object_A, int subindex_A, OctreeElementID p_B, CollisionObjectSW *p_object_B, int subindex_B) {
-void* BroadPhaseOctree::_pair_callback(void*self,OctreeElementID p_A, CollisionObjectSW*p_object_A,int subindex_A,OctreeElementID p_B, CollisionObjectSW*p_object_B,int subindex_B) {
-
- BroadPhaseOctree *bpo=(BroadPhaseOctree*)(self);
+ BroadPhaseOctree *bpo = (BroadPhaseOctree *)(self);
if (!bpo->pair_callback)
return NULL;
- return bpo->pair_callback(p_object_A,subindex_A,p_object_B,subindex_B,bpo->pair_userdata);
-
+ return bpo->pair_callback(p_object_A, subindex_A, p_object_B, subindex_B, bpo->pair_userdata);
}
-void BroadPhaseOctree::_unpair_callback(void*self,OctreeElementID p_A, CollisionObjectSW*p_object_A,int subindex_A,OctreeElementID p_B, CollisionObjectSW*p_object_B,int subindex_B,void*pairdata) {
+void BroadPhaseOctree::_unpair_callback(void *self, OctreeElementID p_A, CollisionObjectSW *p_object_A, int subindex_A, OctreeElementID p_B, CollisionObjectSW *p_object_B, int subindex_B, void *pairdata) {
- BroadPhaseOctree *bpo=(BroadPhaseOctree*)(self);
+ BroadPhaseOctree *bpo = (BroadPhaseOctree *)(self);
if (!bpo->unpair_callback)
return;
- bpo->unpair_callback(p_object_A,subindex_A,p_object_B,subindex_B,pairdata,bpo->unpair_userdata);
-
+ bpo->unpair_callback(p_object_A, subindex_A, p_object_B, subindex_B, pairdata, bpo->unpair_userdata);
}
+void BroadPhaseOctree::set_pair_callback(PairCallback p_pair_callback, void *p_userdata) {
-void BroadPhaseOctree::set_pair_callback(PairCallback p_pair_callback,void *p_userdata){
-
- pair_callback=p_pair_callback;
- pair_userdata=p_userdata;
-
+ pair_callback = p_pair_callback;
+ pair_userdata = p_userdata;
}
-void BroadPhaseOctree::set_unpair_callback(UnpairCallback p_unpair_callback,void *p_userdata){
-
- unpair_callback=p_unpair_callback;
- unpair_userdata=p_userdata;
+void BroadPhaseOctree::set_unpair_callback(UnpairCallback p_unpair_callback, void *p_userdata) {
+ unpair_callback = p_unpair_callback;
+ unpair_userdata = p_userdata;
}
void BroadPhaseOctree::update() {
@@ -118,16 +110,14 @@ void BroadPhaseOctree::update() {
BroadPhaseSW *BroadPhaseOctree::_create() {
- return memnew( BroadPhaseOctree );
+ return memnew(BroadPhaseOctree);
}
BroadPhaseOctree::BroadPhaseOctree() {
- octree.set_pair_callback(_pair_callback,this);
- octree.set_unpair_callback(_unpair_callback,this);
- pair_callback=NULL;
- pair_userdata=NULL;
- pair_callback=NULL;
- unpair_userdata=NULL;
+ octree.set_pair_callback(_pair_callback, this);
+ octree.set_unpair_callback(_unpair_callback, this);
+ pair_callback = NULL;
+ pair_userdata = NULL;
+ pair_callback = NULL;
+ unpair_userdata = NULL;
}
-
-
diff --git a/servers/physics/broad_phase_octree.h b/servers/physics/broad_phase_octree.h
index 43005812e..188d0f9c7 100644
--- a/servers/physics/broad_phase_octree.h
+++ b/servers/physics/broad_phase_octree.h
@@ -34,12 +34,10 @@
class BroadPhaseOctree : public BroadPhaseSW {
+ Octree<CollisionObjectSW, true> octree;
- Octree<CollisionObjectSW,true> octree;
-
- static void* _pair_callback(void*,OctreeElementID, CollisionObjectSW*,int,OctreeElementID, CollisionObjectSW*,int);
- static void _unpair_callback(void*,OctreeElementID, CollisionObjectSW*,int,OctreeElementID, CollisionObjectSW*,int,void*);
-
+ static void *_pair_callback(void *, OctreeElementID, CollisionObjectSW *, int, OctreeElementID, CollisionObjectSW *, int);
+ static void _unpair_callback(void *, OctreeElementID, CollisionObjectSW *, int, OctreeElementID, CollisionObjectSW *, int, void *);
PairCallback pair_callback;
void *pair_userdata;
@@ -47,10 +45,9 @@ class BroadPhaseOctree : public BroadPhaseSW {
void *unpair_userdata;
public:
-
// 0 is an invalid ID
- virtual ID create(CollisionObjectSW *p_object_, int p_subindex=0);
- virtual void move(ID p_id, const AABB& p_aabb);
+ virtual ID create(CollisionObjectSW *p_object_, int p_subindex = 0);
+ virtual void move(ID p_id, const AABB &p_aabb);
virtual void set_static(ID p_id, bool p_static);
virtual void remove(ID p_id);
@@ -58,11 +55,11 @@ public:
virtual bool is_static(ID p_id) const;
virtual int get_subindex(ID p_id) const;
- virtual int cull_segment(const Vector3& p_from, const Vector3& p_to,CollisionObjectSW** p_results,int p_max_results,int *p_result_indices=NULL);
- virtual int cull_aabb(const AABB& p_aabb,CollisionObjectSW** p_results,int p_max_results,int *p_result_indices=NULL);
+ virtual int cull_segment(const Vector3 &p_from, const Vector3 &p_to, CollisionObjectSW **p_results, int p_max_results, int *p_result_indices = NULL);
+ virtual int cull_aabb(const AABB &p_aabb, CollisionObjectSW **p_results, int p_max_results, int *p_result_indices = NULL);
- virtual void set_pair_callback(PairCallback p_pair_callback,void *p_userdata);
- virtual void set_unpair_callback(UnpairCallback p_unpair_callback,void *p_userdata);
+ virtual void set_pair_callback(PairCallback p_pair_callback, void *p_userdata);
+ virtual void set_unpair_callback(UnpairCallback p_unpair_callback, void *p_userdata);
virtual void update();
diff --git a/servers/physics/broad_phase_sw.cpp b/servers/physics/broad_phase_sw.cpp
index 2a897dea2..f9a19e558 100644
--- a/servers/physics/broad_phase_sw.cpp
+++ b/servers/physics/broad_phase_sw.cpp
@@ -28,8 +28,7 @@
/*************************************************************************/
#include "broad_phase_sw.h"
-BroadPhaseSW::CreateFunction BroadPhaseSW::create_func=NULL;
+BroadPhaseSW::CreateFunction BroadPhaseSW::create_func = NULL;
-BroadPhaseSW::~BroadPhaseSW()
-{
+BroadPhaseSW::~BroadPhaseSW() {
}
diff --git a/servers/physics/broad_phase_sw.h b/servers/physics/broad_phase_sw.h
index 736b67418..c45f3c494 100644
--- a/servers/physics/broad_phase_sw.h
+++ b/servers/physics/broad_phase_sw.h
@@ -29,45 +29,42 @@
#ifndef BROAD_PHASE_SW_H
#define BROAD_PHASE_SW_H
-#include "math_funcs.h"
#include "aabb.h"
+#include "math_funcs.h"
class CollisionObjectSW;
-
class BroadPhaseSW {
public:
- typedef BroadPhaseSW* (*CreateFunction)();
+ typedef BroadPhaseSW *(*CreateFunction)();
static CreateFunction create_func;
typedef uint32_t ID;
-
- typedef void* (*PairCallback)(CollisionObjectSW *A,int p_subindex_A,CollisionObjectSW *B,int p_subindex_B,void *p_userdata);
- typedef void (*UnpairCallback)(CollisionObjectSW *A,int p_subindex_A,CollisionObjectSW *B,int p_subindex_B,void *p_data,void *p_userdata);
+ typedef void *(*PairCallback)(CollisionObjectSW *A, int p_subindex_A, CollisionObjectSW *B, int p_subindex_B, void *p_userdata);
+ typedef void (*UnpairCallback)(CollisionObjectSW *A, int p_subindex_A, CollisionObjectSW *B, int p_subindex_B, void *p_data, void *p_userdata);
// 0 is an invalid ID
- virtual ID create(CollisionObjectSW *p_object_, int p_subindex=0)=0;
- virtual void move(ID p_id, const AABB& p_aabb)=0;
- virtual void set_static(ID p_id, bool p_static)=0;
- virtual void remove(ID p_id)=0;
+ virtual ID create(CollisionObjectSW *p_object_, int p_subindex = 0) = 0;
+ virtual void move(ID p_id, const AABB &p_aabb) = 0;
+ virtual void set_static(ID p_id, bool p_static) = 0;
+ virtual void remove(ID p_id) = 0;
- virtual CollisionObjectSW *get_object(ID p_id) const=0;
- virtual bool is_static(ID p_id) const=0;
- virtual int get_subindex(ID p_id) const=0;
+ virtual CollisionObjectSW *get_object(ID p_id) const = 0;
+ virtual bool is_static(ID p_id) const = 0;
+ virtual int get_subindex(ID p_id) const = 0;
- virtual int cull_segment(const Vector3& p_from, const Vector3& p_to,CollisionObjectSW** p_results,int p_max_results,int *p_result_indices=NULL)=0;
- virtual int cull_aabb(const AABB& p_aabb,CollisionObjectSW** p_results,int p_max_results,int *p_result_indices=NULL)=0;
+ virtual int cull_segment(const Vector3 &p_from, const Vector3 &p_to, CollisionObjectSW **p_results, int p_max_results, int *p_result_indices = NULL) = 0;
+ virtual int cull_aabb(const AABB &p_aabb, CollisionObjectSW **p_results, int p_max_results, int *p_result_indices = NULL) = 0;
- virtual void set_pair_callback(PairCallback p_pair_callback,void *p_userdata)=0;
- virtual void set_unpair_callback(UnpairCallback p_unpair_callback,void *p_userdata)=0;
+ virtual void set_pair_callback(PairCallback p_pair_callback, void *p_userdata) = 0;
+ virtual void set_unpair_callback(UnpairCallback p_unpair_callback, void *p_userdata) = 0;
- virtual void update()=0;
+ virtual void update() = 0;
virtual ~BroadPhaseSW();
-
};
#endif // BROAD_PHASE__SW_H
diff --git a/servers/physics/collision_object_sw.cpp b/servers/physics/collision_object_sw.cpp
index c45b76da2..52c04e86c 100644
--- a/servers/physics/collision_object_sw.cpp
+++ b/servers/physics/collision_object_sw.cpp
@@ -29,37 +29,35 @@
#include "collision_object_sw.h"
#include "space_sw.h"
-void CollisionObjectSW::add_shape(ShapeSW *p_shape,const Transform& p_transform) {
+void CollisionObjectSW::add_shape(ShapeSW *p_shape, const Transform &p_transform) {
Shape s;
- s.shape=p_shape;
- s.xform=p_transform;
- s.xform_inv=s.xform.affine_inverse();
- s.bpid=0; //needs update
+ s.shape = p_shape;
+ s.xform = p_transform;
+ s.xform_inv = s.xform.affine_inverse();
+ s.bpid = 0; //needs update
shapes.push_back(s);
p_shape->add_owner(this);
_update_shapes();
_shapes_changed();
-
}
-void CollisionObjectSW::set_shape(int p_index,ShapeSW *p_shape){
+void CollisionObjectSW::set_shape(int p_index, ShapeSW *p_shape) {
- ERR_FAIL_INDEX(p_index,shapes.size());
+ ERR_FAIL_INDEX(p_index, shapes.size());
shapes[p_index].shape->remove_owner(this);
- shapes[p_index].shape=p_shape;
+ shapes[p_index].shape = p_shape;
p_shape->add_owner(this);
_update_shapes();
_shapes_changed();
-
}
-void CollisionObjectSW::set_shape_transform(int p_index,const Transform& p_transform){
+void CollisionObjectSW::set_shape_transform(int p_index, const Transform &p_transform) {
- ERR_FAIL_INDEX(p_index,shapes.size());
+ ERR_FAIL_INDEX(p_index, shapes.size());
- shapes[p_index].xform=p_transform;
- shapes[p_index].xform_inv=p_transform.affine_inverse();
+ shapes[p_index].xform = p_transform;
+ shapes[p_index].xform_inv = p_transform.affine_inverse();
_update_shapes();
_shapes_changed();
}
@@ -67,61 +65,58 @@ void CollisionObjectSW::set_shape_transform(int p_index,const Transform& p_trans
void CollisionObjectSW::remove_shape(ShapeSW *p_shape) {
//remove a shape, all the times it appears
- for(int i=0;i<shapes.size();i++) {
+ for (int i = 0; i < shapes.size(); i++) {
- if (shapes[i].shape==p_shape) {
+ if (shapes[i].shape == p_shape) {
remove_shape(i);
i--;
}
}
}
-void CollisionObjectSW::remove_shape(int p_index){
+void CollisionObjectSW::remove_shape(int p_index) {
//remove anything from shape to be erased to end, so subindices don't change
- ERR_FAIL_INDEX(p_index,shapes.size());
- for(int i=p_index;i<shapes.size();i++) {
+ ERR_FAIL_INDEX(p_index, shapes.size());
+ for (int i = p_index; i < shapes.size(); i++) {
- if (shapes[i].bpid==0)
+ if (shapes[i].bpid == 0)
continue;
//should never get here with a null owner
space->get_broadphase()->remove(shapes[i].bpid);
- shapes[i].bpid=0;
+ shapes[i].bpid = 0;
}
shapes[p_index].shape->remove_owner(this);
shapes.remove(p_index);
_shapes_changed();
-
}
void CollisionObjectSW::_set_static(bool p_static) {
- if (_static==p_static)
+ if (_static == p_static)
return;
- _static=p_static;
+ _static = p_static;
if (!space)
return;
- for(int i=0;i<get_shape_count();i++) {
- Shape &s=shapes[i];
- if (s.bpid>0) {
- space->get_broadphase()->set_static(s.bpid,_static);
+ for (int i = 0; i < get_shape_count(); i++) {
+ Shape &s = shapes[i];
+ if (s.bpid > 0) {
+ space->get_broadphase()->set_static(s.bpid, _static);
}
}
-
}
void CollisionObjectSW::_unregister_shapes() {
- for(int i=0;i<shapes.size();i++) {
+ for (int i = 0; i < shapes.size(); i++) {
- Shape &s=shapes[i];
- if (s.bpid>0) {
+ Shape &s = shapes[i];
+ if (s.bpid > 0) {
space->get_broadphase()->remove(s.bpid);
- s.bpid=0;
+ s.bpid = 0;
}
}
-
}
void CollisionObjectSW::_update_shapes() {
@@ -129,52 +124,47 @@ void CollisionObjectSW::_update_shapes() {
if (!space)
return;
- for(int i=0;i<shapes.size();i++) {
+ for (int i = 0; i < shapes.size(); i++) {
- Shape &s=shapes[i];
- if (s.bpid==0) {
- s.bpid=space->get_broadphase()->create(this,i);
- space->get_broadphase()->set_static(s.bpid,_static);
+ Shape &s = shapes[i];
+ if (s.bpid == 0) {
+ s.bpid = space->get_broadphase()->create(this, i);
+ space->get_broadphase()->set_static(s.bpid, _static);
}
//not quite correct, should compute the next matrix..
- AABB shape_aabb=s.shape->get_aabb();
+ AABB shape_aabb = s.shape->get_aabb();
Transform xform = transform * s.xform;
- shape_aabb=xform.xform(shape_aabb);
- s.aabb_cache=shape_aabb;
- s.aabb_cache=s.aabb_cache.grow( (s.aabb_cache.size.x + s.aabb_cache.size.y)*0.5*0.05 );
-
+ shape_aabb = xform.xform(shape_aabb);
+ s.aabb_cache = shape_aabb;
+ s.aabb_cache = s.aabb_cache.grow((s.aabb_cache.size.x + s.aabb_cache.size.y) * 0.5 * 0.05);
- space->get_broadphase()->move(s.bpid,s.aabb_cache);
+ space->get_broadphase()->move(s.bpid, s.aabb_cache);
}
-
}
-void CollisionObjectSW::_update_shapes_with_motion(const Vector3& p_motion) {
-
+void CollisionObjectSW::_update_shapes_with_motion(const Vector3 &p_motion) {
if (!space)
return;
- for(int i=0;i<shapes.size();i++) {
+ for (int i = 0; i < shapes.size(); i++) {
- Shape &s=shapes[i];
- if (s.bpid==0) {
- s.bpid=space->get_broadphase()->create(this,i);
- space->get_broadphase()->set_static(s.bpid,_static);
+ Shape &s = shapes[i];
+ if (s.bpid == 0) {
+ s.bpid = space->get_broadphase()->create(this, i);
+ space->get_broadphase()->set_static(s.bpid, _static);
}
//not quite correct, should compute the next matrix..
- AABB shape_aabb=s.shape->get_aabb();
+ AABB shape_aabb = s.shape->get_aabb();
Transform xform = transform * s.xform;
- shape_aabb=xform.xform(shape_aabb);
- shape_aabb=shape_aabb.merge(AABB( shape_aabb.pos+p_motion,shape_aabb.size)); //use motion
- s.aabb_cache=shape_aabb;
+ shape_aabb = xform.xform(shape_aabb);
+ shape_aabb = shape_aabb.merge(AABB(shape_aabb.pos + p_motion, shape_aabb.size)); //use motion
+ s.aabb_cache = shape_aabb;
- space->get_broadphase()->move(s.bpid,shape_aabb);
+ space->get_broadphase()->move(s.bpid, shape_aabb);
}
-
-
}
void CollisionObjectSW::_set_space(SpaceSW *p_space) {
@@ -183,25 +173,23 @@ void CollisionObjectSW::_set_space(SpaceSW *p_space) {
space->remove_object(this);
- for(int i=0;i<shapes.size();i++) {
+ for (int i = 0; i < shapes.size(); i++) {
- Shape &s=shapes[i];
+ Shape &s = shapes[i];
if (s.bpid) {
space->get_broadphase()->remove(s.bpid);
- s.bpid=0;
+ s.bpid = 0;
}
}
-
}
- space=p_space;
+ space = p_space;
if (space) {
space->add_object(this);
_update_shapes();
}
-
}
void CollisionObjectSW::_shape_changed() {
@@ -212,11 +200,11 @@ void CollisionObjectSW::_shape_changed() {
CollisionObjectSW::CollisionObjectSW(Type p_type) {
- _static=true;
- type=p_type;
- space=NULL;
- instance_id=0;
- layer_mask=1;
- collision_mask=1;
- ray_pickable=true;
+ _static = true;
+ type = p_type;
+ space = NULL;
+ instance_id = 0;
+ layer_mask = 1;
+ collision_mask = 1;
+ ray_pickable = true;
}
diff --git a/servers/physics/collision_object_sw.h b/servers/physics/collision_object_sw.h
index 5738a629d..ed6b2bdc6 100644
--- a/servers/physics/collision_object_sw.h
+++ b/servers/physics/collision_object_sw.h
@@ -29,14 +29,14 @@
#ifndef COLLISION_OBJECT_SW_H
#define COLLISION_OBJECT_SW_H
-#include "shape_sw.h"
-#include "servers/physics_server.h"
-#include "self_list.h"
#include "broad_phase_sw.h"
+#include "self_list.h"
+#include "servers/physics_server.h"
+#include "shape_sw.h"
#ifdef DEBUG_ENABLED
#define MAX_OBJECT_DISTANCE 10000000.0
-#define MAX_OBJECT_DISTANCE_X2 (MAX_OBJECT_DISTANCE*MAX_OBJECT_DISTANCE)
+#define MAX_OBJECT_DISTANCE_X2 (MAX_OBJECT_DISTANCE * MAX_OBJECT_DISTANCE)
#endif
class SpaceSW;
@@ -47,8 +47,8 @@ public:
TYPE_AREA,
TYPE_BODY
};
-private:
+private:
Type type;
RID self;
ObjectID instance_id;
@@ -64,7 +64,7 @@ private:
ShapeSW *shape;
bool trigger;
- Shape() { trigger=false; }
+ Shape() { trigger = false; }
};
Vector<Shape> shapes;
@@ -76,83 +76,79 @@ private:
void _update_shapes();
protected:
-
-
- void _update_shapes_with_motion(const Vector3& p_motion);
+ void _update_shapes_with_motion(const Vector3 &p_motion);
void _unregister_shapes();
- _FORCE_INLINE_ void _set_transform(const Transform& p_transform,bool p_update_shapes=true) {
+ _FORCE_INLINE_ void _set_transform(const Transform &p_transform, bool p_update_shapes = true) {
#ifdef DEBUG_ENABLED
if (p_transform.origin.length_squared() > MAX_OBJECT_DISTANCE_X2) {
- ERR_EXPLAIN("Object went too far away (more than "+itos(MAX_OBJECT_DISTANCE)+"mts from origin).");
+ ERR_EXPLAIN("Object went too far away (more than " + itos(MAX_OBJECT_DISTANCE) + "mts from origin).");
ERR_FAIL();
}
#endif
- transform=p_transform; if (p_update_shapes) _update_shapes();
-
+ transform = p_transform;
+ if (p_update_shapes) _update_shapes();
}
- _FORCE_INLINE_ void _set_inv_transform(const Transform& p_transform) { inv_transform=p_transform; }
+ _FORCE_INLINE_ void _set_inv_transform(const Transform &p_transform) { inv_transform = p_transform; }
void _set_static(bool p_static);
- virtual void _shapes_changed()=0;
+ virtual void _shapes_changed() = 0;
void _set_space(SpaceSW *space);
bool ray_pickable;
-
CollisionObjectSW(Type p_type);
-public:
- _FORCE_INLINE_ void set_self(const RID& p_self) { self=p_self; }
+public:
+ _FORCE_INLINE_ void set_self(const RID &p_self) { self = p_self; }
_FORCE_INLINE_ RID get_self() const { return self; }
- _FORCE_INLINE_ void set_instance_id(const ObjectID& p_instance_id) { instance_id=p_instance_id; }
+ _FORCE_INLINE_ void set_instance_id(const ObjectID &p_instance_id) { instance_id = p_instance_id; }
_FORCE_INLINE_ ObjectID get_instance_id() const { return instance_id; }
void _shape_changed();
_FORCE_INLINE_ Type get_type() const { return type; }
- void add_shape(ShapeSW *p_shape,const Transform& p_transform=Transform());
- void set_shape(int p_index,ShapeSW *p_shape);
- void set_shape_transform(int p_index,const Transform& p_transform);
+ void add_shape(ShapeSW *p_shape, const Transform &p_transform = Transform());
+ void set_shape(int p_index, ShapeSW *p_shape);
+ void set_shape_transform(int p_index, const Transform &p_transform);
_FORCE_INLINE_ int get_shape_count() const { return shapes.size(); }
_FORCE_INLINE_ ShapeSW *get_shape(int p_index) const { return shapes[p_index].shape; }
- _FORCE_INLINE_ const Transform& get_shape_transform(int p_index) const { return shapes[p_index].xform; }
- _FORCE_INLINE_ const Transform& get_shape_inv_transform(int p_index) const { return shapes[p_index].xform_inv; }
- _FORCE_INLINE_ const AABB& get_shape_aabb(int p_index) const { return shapes[p_index].aabb_cache; }
+ _FORCE_INLINE_ const Transform &get_shape_transform(int p_index) const { return shapes[p_index].xform; }
+ _FORCE_INLINE_ const Transform &get_shape_inv_transform(int p_index) const { return shapes[p_index].xform_inv; }
+ _FORCE_INLINE_ const AABB &get_shape_aabb(int p_index) const { return shapes[p_index].aabb_cache; }
_FORCE_INLINE_ Transform get_transform() const { return transform; }
_FORCE_INLINE_ Transform get_inv_transform() const { return inv_transform; }
- _FORCE_INLINE_ SpaceSW* get_space() const { return space; }
+ _FORCE_INLINE_ SpaceSW *get_space() const { return space; }
- _FORCE_INLINE_ void set_ray_pickable(bool p_enable) { ray_pickable=p_enable; }
+ _FORCE_INLINE_ void set_ray_pickable(bool p_enable) { ray_pickable = p_enable; }
_FORCE_INLINE_ bool is_ray_pickable() const { return ray_pickable; }
- _FORCE_INLINE_ void set_shape_as_trigger(int p_idx,bool p_enable) { shapes[p_idx].trigger=p_enable; }
+ _FORCE_INLINE_ void set_shape_as_trigger(int p_idx, bool p_enable) { shapes[p_idx].trigger = p_enable; }
_FORCE_INLINE_ bool is_shape_set_as_trigger(int p_idx) const { return shapes[p_idx].trigger; }
- _FORCE_INLINE_ void set_layer_mask(uint32_t p_mask) { layer_mask=p_mask; }
+ _FORCE_INLINE_ void set_layer_mask(uint32_t p_mask) { layer_mask = p_mask; }
_FORCE_INLINE_ uint32_t get_layer_mask() const { return layer_mask; }
- _FORCE_INLINE_ void set_collision_mask(uint32_t p_mask) { collision_mask=p_mask; }
+ _FORCE_INLINE_ void set_collision_mask(uint32_t p_mask) { collision_mask = p_mask; }
_FORCE_INLINE_ uint32_t get_collision_mask() const { return collision_mask; }
- _FORCE_INLINE_ bool test_collision_mask(CollisionObjectSW* p_other) const {
- return layer_mask&p_other->collision_mask || p_other->layer_mask&collision_mask;
+ _FORCE_INLINE_ bool test_collision_mask(CollisionObjectSW *p_other) const {
+ return layer_mask & p_other->collision_mask || p_other->layer_mask & collision_mask;
}
void remove_shape(ShapeSW *p_shape);
void remove_shape(int p_index);
- virtual void set_space(SpaceSW *p_space)=0;
+ virtual void set_space(SpaceSW *p_space) = 0;
- _FORCE_INLINE_ bool is_static() const { return _static; }
+ _FORCE_INLINE_ bool is_static() const { return _static; }
virtual ~CollisionObjectSW() {}
-
};
#endif // COLLISION_OBJECT_SW_H
diff --git a/servers/physics/collision_solver_sat.cpp b/servers/physics/collision_solver_sat.cpp
index 08490795f..2513a9fe6 100644
--- a/servers/physics/collision_solver_sat.cpp
+++ b/servers/physics/collision_solver_sat.cpp
@@ -40,76 +40,68 @@ struct _CollectorCallback {
Vector3 normal;
Vector3 *prev_axis;
- _FORCE_INLINE_ void call(const Vector3& p_point_A, const Vector3& p_point_B) {
+ _FORCE_INLINE_ void call(const Vector3 &p_point_A, const Vector3 &p_point_B) {
//if (normal.dot(p_point_A) >= normal.dot(p_point_B))
// return;
-// print_line("** A: "+p_point_A+" B: "+p_point_B+" D: "+rtos(p_point_A.distance_to(p_point_B)));
+ // print_line("** A: "+p_point_A+" B: "+p_point_B+" D: "+rtos(p_point_A.distance_to(p_point_B)));
if (swap)
- callback(p_point_B,p_point_A,userdata);
+ callback(p_point_B, p_point_A, userdata);
else
- callback(p_point_A,p_point_B,userdata);
+ callback(p_point_A, p_point_B, userdata);
}
-
};
-typedef void (*GenerateContactsFunc)(const Vector3 *,int, const Vector3 *,int ,_CollectorCallback *);
-
+typedef void (*GenerateContactsFunc)(const Vector3 *, int, const Vector3 *, int, _CollectorCallback *);
-static void _generate_contacts_point_point(const Vector3 * p_points_A,int p_point_count_A, const Vector3 * p_points_B,int p_point_count_B,_CollectorCallback *p_callback) {
+static void _generate_contacts_point_point(const Vector3 *p_points_A, int p_point_count_A, const Vector3 *p_points_B, int p_point_count_B, _CollectorCallback *p_callback) {
#ifdef DEBUG_ENABLED
- ERR_FAIL_COND( p_point_count_A != 1 );
- ERR_FAIL_COND( p_point_count_B != 1 );
+ ERR_FAIL_COND(p_point_count_A != 1);
+ ERR_FAIL_COND(p_point_count_B != 1);
#endif
- p_callback->call(*p_points_A,*p_points_B);
+ p_callback->call(*p_points_A, *p_points_B);
}
-static void _generate_contacts_point_edge(const Vector3 * p_points_A,int p_point_count_A, const Vector3 * p_points_B,int p_point_count_B,_CollectorCallback *p_callback) {
+static void _generate_contacts_point_edge(const Vector3 *p_points_A, int p_point_count_A, const Vector3 *p_points_B, int p_point_count_B, _CollectorCallback *p_callback) {
#ifdef DEBUG_ENABLED
- ERR_FAIL_COND( p_point_count_A != 1 );
- ERR_FAIL_COND( p_point_count_B != 2 );
+ ERR_FAIL_COND(p_point_count_A != 1);
+ ERR_FAIL_COND(p_point_count_B != 2);
#endif
- Vector3 closest_B = Geometry::get_closest_point_to_segment_uncapped(*p_points_A, p_points_B );
- p_callback->call(*p_points_A,closest_B);
-
+ Vector3 closest_B = Geometry::get_closest_point_to_segment_uncapped(*p_points_A, p_points_B);
+ p_callback->call(*p_points_A, closest_B);
}
-static void _generate_contacts_point_face(const Vector3 * p_points_A,int p_point_count_A, const Vector3 * p_points_B,int p_point_count_B,_CollectorCallback *p_callback) {
+static void _generate_contacts_point_face(const Vector3 *p_points_A, int p_point_count_A, const Vector3 *p_points_B, int p_point_count_B, _CollectorCallback *p_callback) {
#ifdef DEBUG_ENABLED
- ERR_FAIL_COND( p_point_count_A != 1 );
- ERR_FAIL_COND( p_point_count_B < 3 );
+ ERR_FAIL_COND(p_point_count_A != 1);
+ ERR_FAIL_COND(p_point_count_B < 3);
#endif
+ Vector3 closest_B = Plane(p_points_B[0], p_points_B[1], p_points_B[2]).project(*p_points_A);
- Vector3 closest_B=Plane(p_points_B[0],p_points_B[1],p_points_B[2]).project( *p_points_A );
-
- p_callback->call(*p_points_A,closest_B);
-
+ p_callback->call(*p_points_A, closest_B);
}
-
-static void _generate_contacts_edge_edge(const Vector3 * p_points_A,int p_point_count_A, const Vector3 * p_points_B,int p_point_count_B,_CollectorCallback *p_callback) {
+static void _generate_contacts_edge_edge(const Vector3 *p_points_A, int p_point_count_A, const Vector3 *p_points_B, int p_point_count_B, _CollectorCallback *p_callback) {
#ifdef DEBUG_ENABLED
- ERR_FAIL_COND( p_point_count_A != 2 );
- ERR_FAIL_COND( p_point_count_B != 2 ); // circle is actually a 4x3 matrix
+ ERR_FAIL_COND(p_point_count_A != 2);
+ ERR_FAIL_COND(p_point_count_B != 2); // circle is actually a 4x3 matrix
#endif
+ Vector3 rel_A = p_points_A[1] - p_points_A[0];
+ Vector3 rel_B = p_points_B[1] - p_points_B[0];
+ Vector3 c = rel_A.cross(rel_B).cross(rel_B);
- Vector3 rel_A=p_points_A[1]-p_points_A[0];
- Vector3 rel_B=p_points_B[1]-p_points_B[0];
-
- Vector3 c=rel_A.cross(rel_B).cross(rel_B);
-
-// if ( Math::abs(rel_A.dot(c) )<_EDGE_IS_VALID_SUPPORT_TRESHOLD ) {
- if ( Math::abs(rel_A.dot(c) )<CMP_EPSILON ) {
+ // if ( Math::abs(rel_A.dot(c) )<_EDGE_IS_VALID_SUPPORT_TRESHOLD ) {
+ if (Math::abs(rel_A.dot(c)) < CMP_EPSILON) {
// should handle somehow..
//ERR_PRINT("TODO FIX");
@@ -120,156 +112,146 @@ static void _generate_contacts_edge_edge(const Vector3 * p_points_A,int p_point_
Vector3 base_B = p_points_B[0] - axis * axis.dot(p_points_B[0]);
//sort all 4 points in axis
- float dvec[4]={ axis.dot(p_points_A[0]), axis.dot(p_points_A[1]), axis.dot(p_points_B[0]), axis.dot(p_points_B[1]) };
+ float dvec[4] = { axis.dot(p_points_A[0]), axis.dot(p_points_A[1]), axis.dot(p_points_B[0]), axis.dot(p_points_B[1]) };
SortArray<float> sa;
- sa.sort(dvec,4);
+ sa.sort(dvec, 4);
//use the middle ones as contacts
- p_callback->call(base_A+axis*dvec[1],base_B+axis*dvec[1]);
- p_callback->call(base_A+axis*dvec[2],base_B+axis*dvec[2]);
+ p_callback->call(base_A + axis * dvec[1], base_B + axis * dvec[1]);
+ p_callback->call(base_A + axis * dvec[2], base_B + axis * dvec[2]);
return;
-
}
- real_t d = (c.dot( p_points_B[0] ) - p_points_A[0].dot(c))/rel_A.dot(c);
+ real_t d = (c.dot(p_points_B[0]) - p_points_A[0].dot(c)) / rel_A.dot(c);
- if (d<0.0)
- d=0.0;
- else if (d>1.0)
- d=1.0;
-
- Vector3 closest_A=p_points_A[0]+rel_A*d;
- Vector3 closest_B=Geometry::get_closest_point_to_segment_uncapped(closest_A, p_points_B);
- p_callback->call(closest_A,closest_B);
+ if (d < 0.0)
+ d = 0.0;
+ else if (d > 1.0)
+ d = 1.0;
+ Vector3 closest_A = p_points_A[0] + rel_A * d;
+ Vector3 closest_B = Geometry::get_closest_point_to_segment_uncapped(closest_A, p_points_B);
+ p_callback->call(closest_A, closest_B);
}
-static void _generate_contacts_face_face(const Vector3 * p_points_A,int p_point_count_A, const Vector3 * p_points_B,int p_point_count_B,_CollectorCallback *p_callback) {
+static void _generate_contacts_face_face(const Vector3 *p_points_A, int p_point_count_A, const Vector3 *p_points_B, int p_point_count_B, _CollectorCallback *p_callback) {
#ifdef DEBUG_ENABLED
- ERR_FAIL_COND( p_point_count_A <2 );
- ERR_FAIL_COND( p_point_count_B <3 );
+ ERR_FAIL_COND(p_point_count_A < 2);
+ ERR_FAIL_COND(p_point_count_B < 3);
#endif
- static const int max_clip=32;
+ static const int max_clip = 32;
Vector3 _clipbuf1[max_clip];
Vector3 _clipbuf2[max_clip];
- Vector3 *clipbuf_src=_clipbuf1;
- Vector3 *clipbuf_dst=_clipbuf2;
- int clipbuf_len=p_point_count_A;
+ Vector3 *clipbuf_src = _clipbuf1;
+ Vector3 *clipbuf_dst = _clipbuf2;
+ int clipbuf_len = p_point_count_A;
// copy A points to clipbuf_src
- for (int i=0;i<p_point_count_A;i++) {
+ for (int i = 0; i < p_point_count_A; i++) {
- clipbuf_src[i]=p_points_A[i];
+ clipbuf_src[i] = p_points_A[i];
}
- Plane plane_B(p_points_B[0],p_points_B[1],p_points_B[2]);
+ Plane plane_B(p_points_B[0], p_points_B[1], p_points_B[2]);
// go through all of B points
- for (int i=0;i<p_point_count_B;i++) {
+ for (int i = 0; i < p_point_count_B; i++) {
- int i_n=(i+1)%p_point_count_B;
+ int i_n = (i + 1) % p_point_count_B;
- Vector3 edge0_B=p_points_B[i];
- Vector3 edge1_B=p_points_B[i_n];
+ Vector3 edge0_B = p_points_B[i];
+ Vector3 edge1_B = p_points_B[i_n];
- Vector3 clip_normal = (edge0_B - edge1_B).cross( plane_B.normal ).normalized();
+ Vector3 clip_normal = (edge0_B - edge1_B).cross(plane_B.normal).normalized();
// make a clip plane
-
- Plane clip(edge0_B,clip_normal);
+ Plane clip(edge0_B, clip_normal);
// avoid double clip if A is edge
- int dst_idx=0;
- bool edge = clipbuf_len==2;
- for (int j=0;j<clipbuf_len;j++) {
+ int dst_idx = 0;
+ bool edge = clipbuf_len == 2;
+ for (int j = 0; j < clipbuf_len; j++) {
- int j_n=(j+1)%clipbuf_len;
+ int j_n = (j + 1) % clipbuf_len;
- Vector3 edge0_A=clipbuf_src[j];
- Vector3 edge1_A=clipbuf_src[j_n];
+ Vector3 edge0_A = clipbuf_src[j];
+ Vector3 edge1_A = clipbuf_src[j_n];
real_t dist0 = clip.distance_to(edge0_A);
real_t dist1 = clip.distance_to(edge1_A);
+ if (dist0 <= 0) { // behind plane
- if ( dist0 <= 0 ) { // behind plane
-
- ERR_FAIL_COND( dst_idx >= max_clip );
- clipbuf_dst[dst_idx++]=clipbuf_src[j];
-
+ ERR_FAIL_COND(dst_idx >= max_clip);
+ clipbuf_dst[dst_idx++] = clipbuf_src[j];
}
-
// check for different sides and non coplanar
-// if ( (dist0*dist1) < -CMP_EPSILON && !(edge && j)) {
- if ( (dist0*dist1) < 0 && !(edge && j)) {
+ // if ( (dist0*dist1) < -CMP_EPSILON && !(edge && j)) {
+ if ((dist0 * dist1) < 0 && !(edge && j)) {
// calculate intersection
Vector3 rel = edge1_A - edge0_A;
- real_t den=clip.normal.dot( rel );
- real_t dist=-(clip.normal.dot( edge0_A )-clip.d)/den;
- Vector3 inters = edge0_A+rel*dist;
+ real_t den = clip.normal.dot(rel);
+ real_t dist = -(clip.normal.dot(edge0_A) - clip.d) / den;
+ Vector3 inters = edge0_A + rel * dist;
- ERR_FAIL_COND( dst_idx >= max_clip );
- clipbuf_dst[dst_idx]=inters;
+ ERR_FAIL_COND(dst_idx >= max_clip);
+ clipbuf_dst[dst_idx] = inters;
dst_idx++;
}
}
- clipbuf_len=dst_idx;
- SWAP(clipbuf_src,clipbuf_dst);
+ clipbuf_len = dst_idx;
+ SWAP(clipbuf_src, clipbuf_dst);
}
-
// generate contacts
//Plane plane_A(p_points_A[0],p_points_A[1],p_points_A[2]);
- int added=0;
+ int added = 0;
- for (int i=0;i<clipbuf_len;i++) {
+ for (int i = 0; i < clipbuf_len; i++) {
float d = plane_B.distance_to(clipbuf_src[i]);
//if (d>CMP_EPSILON)
// continue;
- Vector3 closest_B=clipbuf_src[i] - plane_B.normal*d;
+ Vector3 closest_B = clipbuf_src[i] - plane_B.normal * d;
if (p_callback->normal.dot(clipbuf_src[i]) >= p_callback->normal.dot(closest_B))
continue;
- p_callback->call(clipbuf_src[i],closest_B);
+ p_callback->call(clipbuf_src[i], closest_B);
added++;
-
}
-
}
-
-static void _generate_contacts_from_supports(const Vector3 * p_points_A,int p_point_count_A, const Vector3 * p_points_B,int p_point_count_B,_CollectorCallback *p_callback) {
-
+static void _generate_contacts_from_supports(const Vector3 *p_points_A, int p_point_count_A, const Vector3 *p_points_B, int p_point_count_B, _CollectorCallback *p_callback) {
#ifdef DEBUG_ENABLED
- ERR_FAIL_COND( p_point_count_A <1 );
- ERR_FAIL_COND( p_point_count_B <1 );
+ ERR_FAIL_COND(p_point_count_A < 1);
+ ERR_FAIL_COND(p_point_count_B < 1);
#endif
-
- static const GenerateContactsFunc generate_contacts_func_table[3][3]={
+ static const GenerateContactsFunc generate_contacts_func_table[3][3] = {
+ {
+ _generate_contacts_point_point,
+ _generate_contacts_point_edge,
+ _generate_contacts_point_face,
+ },
{
- _generate_contacts_point_point,
- _generate_contacts_point_edge,
- _generate_contacts_point_face,
- },{
- 0,
- _generate_contacts_edge_edge,
- _generate_contacts_face_face,
- },{
- 0,0,
- _generate_contacts_face_face,
+ 0,
+ _generate_contacts_edge_edge,
+ _generate_contacts_face_face,
+ },
+ {
+ 0, 0,
+ _generate_contacts_face_face,
}
};
@@ -285,28 +267,25 @@ static void _generate_contacts_from_supports(const Vector3 * p_points_A,int p_po
pointcount_B = p_point_count_A;
pointcount_A = p_point_count_B;
- points_A=p_points_B;
- points_B=p_points_A;
+ points_A = p_points_B;
+ points_B = p_points_A;
} else {
pointcount_B = p_point_count_B;
pointcount_A = p_point_count_A;
- points_A=p_points_A;
- points_B=p_points_B;
+ points_A = p_points_A;
+ points_B = p_points_B;
}
- int version_A = (pointcount_A > 3 ? 3 : pointcount_A) -1;
- int version_B = (pointcount_B > 3 ? 3 : pointcount_B) -1;
+ int version_A = (pointcount_A > 3 ? 3 : pointcount_A) - 1;
+ int version_B = (pointcount_B > 3 ? 3 : pointcount_B) - 1;
GenerateContactsFunc contacts_func = generate_contacts_func_table[version_A][version_B];
ERR_FAIL_COND(!contacts_func);
- contacts_func(points_A,pointcount_A,points_B,pointcount_B,p_callback);
-
+ contacts_func(points_A, pointcount_A, points_B, pointcount_B, p_callback);
}
-
-
-template<class ShapeA, class ShapeB, bool withMargin=false>
+template <class ShapeA, class ShapeB, bool withMargin = false>
class SeparatorAxisTest {
const ShapeA *shape_A;
@@ -321,46 +300,45 @@ class SeparatorAxisTest {
Vector3 separator_axis;
public:
-
_FORCE_INLINE_ bool test_previous_axis() {
- if (callback && callback->prev_axis && *callback->prev_axis!=Vector3())
+ if (callback && callback->prev_axis && *callback->prev_axis != Vector3())
return test_axis(*callback->prev_axis);
else
return true;
}
- _FORCE_INLINE_ bool test_axis(const Vector3& p_axis) {
+ _FORCE_INLINE_ bool test_axis(const Vector3 &p_axis) {
- Vector3 axis=p_axis;
+ Vector3 axis = p_axis;
- if ( Math::abs(axis.x)<CMP_EPSILON &&
- Math::abs(axis.y)<CMP_EPSILON &&
- Math::abs(axis.z)<CMP_EPSILON ) {
+ if (Math::abs(axis.x) < CMP_EPSILON &&
+ Math::abs(axis.y) < CMP_EPSILON &&
+ Math::abs(axis.z) < CMP_EPSILON) {
// strange case, try an upwards separator
- axis=Vector3(0.0,1.0,0.0);
+ axis = Vector3(0.0, 1.0, 0.0);
}
- real_t min_A,max_A,min_B,max_B;
+ real_t min_A, max_A, min_B, max_B;
- shape_A->project_range(axis,*transform_A,min_A,max_A);
- shape_B->project_range(axis,*transform_B,min_B,max_B);
+ shape_A->project_range(axis, *transform_A, min_A, max_A);
+ shape_B->project_range(axis, *transform_B, min_B, max_B);
if (withMargin) {
- min_A-=margin_A;
- max_A+=margin_A;
- min_B-=margin_B;
- max_B+=margin_B;
+ min_A -= margin_A;
+ max_A += margin_A;
+ min_B -= margin_B;
+ max_B += margin_B;
}
- min_B -= ( max_A - min_A ) * 0.5;
- max_B += ( max_A - min_A ) * 0.5;
+ min_B -= (max_A - min_A) * 0.5;
+ max_B += (max_A - min_A) * 0.5;
- real_t dmin = min_B - ( min_A + max_A ) * 0.5;
- real_t dmax = max_B - ( min_A + max_A ) * 0.5;
+ real_t dmin = min_B - (min_A + max_A) * 0.5;
+ real_t dmax = max_B - (min_A + max_A) * 0.5;
if (dmin > 0.0 || dmax < 0.0) {
- separator_axis=axis;
+ separator_axis = axis;
return false; // doesn't contain 0
}
@@ -368,68 +346,65 @@ public:
dmin = Math::abs(dmin);
- if ( dmax < dmin ) {
- if ( dmax < best_depth ) {
- best_depth=dmax;
- best_axis=axis;
+ if (dmax < dmin) {
+ if (dmax < best_depth) {
+ best_depth = dmax;
+ best_axis = axis;
}
} else {
- if ( dmin < best_depth ) {
- best_depth=dmin;
- best_axis=-axis; // keep it as A axis
+ if (dmin < best_depth) {
+ best_depth = dmin;
+ best_axis = -axis; // keep it as A axis
}
}
return true;
}
-
_FORCE_INLINE_ void generate_contacts() {
// nothing to do, don't generate
- if (best_axis==Vector3(0.0,0.0,0.0))
+ if (best_axis == Vector3(0.0, 0.0, 0.0))
return;
if (!callback->callback) {
//just was checking intersection?
- callback->collided=true;
+ callback->collided = true;
if (callback->prev_axis)
- *callback->prev_axis=best_axis;
+ *callback->prev_axis = best_axis;
return;
}
- static const int max_supports=16;
+ static const int max_supports = 16;
Vector3 supports_A[max_supports];
int support_count_A;
- shape_A->get_supports(transform_A->basis.xform_inv(-best_axis).normalized(),max_supports,supports_A,support_count_A);
- for(int i=0;i<support_count_A;i++) {
+ shape_A->get_supports(transform_A->basis.xform_inv(-best_axis).normalized(), max_supports, supports_A, support_count_A);
+ for (int i = 0; i < support_count_A; i++) {
supports_A[i] = transform_A->xform(supports_A[i]);
}
if (withMargin) {
- for(int i=0;i<support_count_A;i++) {
- supports_A[i]+=-best_axis*margin_A;
+ for (int i = 0; i < support_count_A; i++) {
+ supports_A[i] += -best_axis * margin_A;
}
-
}
-
Vector3 supports_B[max_supports];
int support_count_B;
- shape_B->get_supports(transform_B->basis.xform_inv(best_axis).normalized(),max_supports,supports_B,support_count_B);
- for(int i=0;i<support_count_B;i++) {
+ shape_B->get_supports(transform_B->basis.xform_inv(best_axis).normalized(), max_supports, supports_B, support_count_B);
+ for (int i = 0; i < support_count_B; i++) {
supports_B[i] = transform_B->xform(supports_B[i]);
}
if (withMargin) {
- for(int i=0;i<support_count_B;i++) {
- supports_B[i]+=best_axis*margin_B;
+ for (int i = 0; i < support_count_B; i++) {
+ supports_B[i] += best_axis * margin_B;
}
}
-/*
+ /*
print_line("best depth: "+rtos(best_depth));
print_line("best axis: "+(best_axis));
for(int i=0;i<support_count_A;i++) {
@@ -441,29 +416,26 @@ public:
print_line("B-"+itos(i)+": "+supports_B[i]);
}
*/
- callback->normal=best_axis;
+ callback->normal = best_axis;
if (callback->prev_axis)
- *callback->prev_axis=best_axis;
- _generate_contacts_from_supports(supports_A,support_count_A,supports_B,support_count_B,callback);
+ *callback->prev_axis = best_axis;
+ _generate_contacts_from_supports(supports_A, support_count_A, supports_B, support_count_B, callback);
- callback->collided=true;
+ callback->collided = true;
//CollisionSolverSW::CallbackResult cbk=NULL;
//cbk(Vector3(),Vector3(),NULL);
-
}
- _FORCE_INLINE_ SeparatorAxisTest(const ShapeA *p_shape_A,const Transform& p_transform_A, const ShapeB *p_shape_B,const Transform& p_transform_B,_CollectorCallback *p_callback,real_t p_margin_A=0,real_t p_margin_B=0) {
- best_depth=1e15;
- shape_A=p_shape_A;
- shape_B=p_shape_B;
- transform_A=&p_transform_A;
- transform_B=&p_transform_B;
- callback=p_callback;
- margin_A=p_margin_A;
- margin_B=p_margin_B;
-
+ _FORCE_INLINE_ SeparatorAxisTest(const ShapeA *p_shape_A, const Transform &p_transform_A, const ShapeB *p_shape_B, const Transform &p_transform_B, _CollectorCallback *p_callback, real_t p_margin_A = 0, real_t p_margin_B = 0) {
+ best_depth = 1e15;
+ shape_A = p_shape_A;
+ shape_B = p_shape_B;
+ transform_A = &p_transform_A;
+ transform_B = &p_transform_B;
+ callback = p_callback;
+ margin_A = p_margin_A;
+ margin_B = p_margin_B;
}
-
};
/****** SAT TESTS *******/
@@ -471,92 +443,84 @@ public:
/****** SAT TESTS *******/
/****** SAT TESTS *******/
+typedef void (*CollisionFunc)(const ShapeSW *, const Transform &, const ShapeSW *, const Transform &, _CollectorCallback *p_callback, float, float);
-typedef void (*CollisionFunc)(const ShapeSW*,const Transform&,const ShapeSW*,const Transform&,_CollectorCallback *p_callback,float,float);
-
-
-template<bool withMargin>
-static void _collision_sphere_sphere(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) {
+template <bool withMargin>
+static void _collision_sphere_sphere(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, float p_margin_a, float p_margin_b) {
+ const SphereShapeSW *sphere_A = static_cast<const SphereShapeSW *>(p_a);
+ const SphereShapeSW *sphere_B = static_cast<const SphereShapeSW *>(p_b);
- const SphereShapeSW *sphere_A = static_cast<const SphereShapeSW*>(p_a);
- const SphereShapeSW *sphere_B = static_cast<const SphereShapeSW*>(p_b);
-
- SeparatorAxisTest<SphereShapeSW,SphereShapeSW,withMargin> separator(sphere_A,p_transform_a,sphere_B,p_transform_b,p_collector,p_margin_a,p_margin_b);
+ SeparatorAxisTest<SphereShapeSW, SphereShapeSW, withMargin> separator(sphere_A, p_transform_a, sphere_B, p_transform_b, p_collector, p_margin_a, p_margin_b);
// previous axis
if (!separator.test_previous_axis())
return;
- if (!separator.test_axis( (p_transform_a.origin-p_transform_b.origin).normalized() ))
+ if (!separator.test_axis((p_transform_a.origin - p_transform_b.origin).normalized()))
return;
separator.generate_contacts();
}
-template<bool withMargin>
-static void _collision_sphere_box(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) {
-
+template <bool withMargin>
+static void _collision_sphere_box(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, float p_margin_a, float p_margin_b) {
- const SphereShapeSW *sphere_A = static_cast<const SphereShapeSW*>(p_a);
- const BoxShapeSW *box_B = static_cast<const BoxShapeSW*>(p_b);
+ const SphereShapeSW *sphere_A = static_cast<const SphereShapeSW *>(p_a);
+ const BoxShapeSW *box_B = static_cast<const BoxShapeSW *>(p_b);
- SeparatorAxisTest<SphereShapeSW,BoxShapeSW,withMargin> separator(sphere_A,p_transform_a,box_B,p_transform_b,p_collector,p_margin_a,p_margin_b);
+ SeparatorAxisTest<SphereShapeSW, BoxShapeSW, withMargin> separator(sphere_A, p_transform_a, box_B, p_transform_b, p_collector, p_margin_a, p_margin_b);
if (!separator.test_previous_axis())
return;
// test faces
- for (int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
Vector3 axis = p_transform_b.basis.get_axis(i).normalized();
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
-
}
// calculate closest point to sphere
- Vector3 cnormal=p_transform_b.xform_inv( p_transform_a.origin );
+ Vector3 cnormal = p_transform_b.xform_inv(p_transform_a.origin);
- Vector3 cpoint=p_transform_b.xform( Vector3(
+ Vector3 cpoint = p_transform_b.xform(Vector3(
- (cnormal.x<0) ? -box_B->get_half_extents().x : box_B->get_half_extents().x,
- (cnormal.y<0) ? -box_B->get_half_extents().y : box_B->get_half_extents().y,
- (cnormal.z<0) ? -box_B->get_half_extents().z : box_B->get_half_extents().z
- ) );
+ (cnormal.x < 0) ? -box_B->get_half_extents().x : box_B->get_half_extents().x,
+ (cnormal.y < 0) ? -box_B->get_half_extents().y : box_B->get_half_extents().y,
+ (cnormal.z < 0) ? -box_B->get_half_extents().z : box_B->get_half_extents().z));
// use point to test axis
Vector3 point_axis = (p_transform_a.origin - cpoint).normalized();
- if (!separator.test_axis( point_axis ))
+ if (!separator.test_axis(point_axis))
return;
// test edges
- for (int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
- Vector3 axis = point_axis.cross( p_transform_b.basis.get_axis(i) ).cross( p_transform_b.basis.get_axis(i) ).normalized();
+ Vector3 axis = point_axis.cross(p_transform_b.basis.get_axis(i)).cross(p_transform_b.basis.get_axis(i)).normalized();
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
}
separator.generate_contacts();
-
-
}
-template<bool withMargin>
-static void _collision_sphere_capsule(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) {
+template <bool withMargin>
+static void _collision_sphere_capsule(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, float p_margin_a, float p_margin_b) {
- const SphereShapeSW *sphere_A = static_cast<const SphereShapeSW*>(p_a);
- const CapsuleShapeSW *capsule_B = static_cast<const CapsuleShapeSW*>(p_b);
+ const SphereShapeSW *sphere_A = static_cast<const SphereShapeSW *>(p_a);
+ const CapsuleShapeSW *capsule_B = static_cast<const CapsuleShapeSW *>(p_b);
- SeparatorAxisTest<SphereShapeSW,CapsuleShapeSW,withMargin> separator(sphere_A,p_transform_a,capsule_B,p_transform_b,p_collector,p_margin_a,p_margin_b);
+ SeparatorAxisTest<SphereShapeSW, CapsuleShapeSW, withMargin> separator(sphere_A, p_transform_a, capsule_B, p_transform_b, p_collector, p_margin_a, p_margin_b);
if (!separator.test_previous_axis())
return;
@@ -567,38 +531,35 @@ static void _collision_sphere_capsule(const ShapeSW *p_a,const Transform &p_tran
Vector3 capsule_ball_1 = p_transform_b.origin + capsule_axis;
- if (!separator.test_axis( (capsule_ball_1 - p_transform_a.origin).normalized() ) )
+ if (!separator.test_axis((capsule_ball_1 - p_transform_a.origin).normalized()))
return;
//capsule sphere 2, sphere
Vector3 capsule_ball_2 = p_transform_b.origin - capsule_axis;
- if (!separator.test_axis( (capsule_ball_2 - p_transform_a.origin).normalized() ) )
+ if (!separator.test_axis((capsule_ball_2 - p_transform_a.origin).normalized()))
return;
//capsule edge, sphere
Vector3 b2a = p_transform_a.origin - p_transform_b.origin;
- Vector3 axis = b2a.cross( capsule_axis ).cross( capsule_axis ).normalized();
-
+ Vector3 axis = b2a.cross(capsule_axis).cross(capsule_axis).normalized();
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
separator.generate_contacts();
}
-template<bool withMargin>
-static void _collision_sphere_convex_polygon(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) {
+template <bool withMargin>
+static void _collision_sphere_convex_polygon(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, float p_margin_a, float p_margin_b) {
+ const SphereShapeSW *sphere_A = static_cast<const SphereShapeSW *>(p_a);
+ const ConvexPolygonShapeSW *convex_polygon_B = static_cast<const ConvexPolygonShapeSW *>(p_b);
- const SphereShapeSW *sphere_A = static_cast<const SphereShapeSW*>(p_a);
- const ConvexPolygonShapeSW *convex_polygon_B = static_cast<const ConvexPolygonShapeSW*>(p_b);
-
- SeparatorAxisTest<SphereShapeSW,ConvexPolygonShapeSW,withMargin> separator(sphere_A,p_transform_a,convex_polygon_B,p_transform_b,p_collector,p_margin_a,p_margin_b);
-
+ SeparatorAxisTest<SphereShapeSW, ConvexPolygonShapeSW, withMargin> separator(sphere_A, p_transform_a, convex_polygon_B, p_transform_b, p_collector, p_margin_a, p_margin_b);
if (!separator.test_previous_axis())
return;
@@ -612,146 +573,127 @@ static void _collision_sphere_convex_polygon(const ShapeSW *p_a,const Transform
const Vector3 *vertices = mesh.vertices.ptr();
int vertex_count = mesh.vertices.size();
-
// faces of B
- for (int i=0;i<face_count;i++) {
+ for (int i = 0; i < face_count; i++) {
- Vector3 axis = p_transform_b.xform( faces[i].plane ).normal;
+ Vector3 axis = p_transform_b.xform(faces[i].plane).normal;
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
}
-
// edges of B
- for(int i=0;i<edge_count;i++) {
+ for (int i = 0; i < edge_count; i++) {
+ Vector3 v1 = p_transform_b.xform(vertices[edges[i].a]);
+ Vector3 v2 = p_transform_b.xform(vertices[edges[i].b]);
+ Vector3 v3 = p_transform_a.origin;
- Vector3 v1=p_transform_b.xform( vertices[ edges[i].a ] );
- Vector3 v2=p_transform_b.xform( vertices[ edges[i].b ] );
- Vector3 v3=p_transform_a.origin;
-
-
- Vector3 n1=v2-v1;
- Vector3 n2=v2-v3;
+ Vector3 n1 = v2 - v1;
+ Vector3 n2 = v2 - v3;
Vector3 axis = n1.cross(n2).cross(n1).normalized();
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
-
}
// vertices of B
- for(int i=0;i<vertex_count;i++) {
-
+ for (int i = 0; i < vertex_count; i++) {
- Vector3 v1=p_transform_b.xform( vertices[i] );
- Vector3 v2=p_transform_a.origin;
+ Vector3 v1 = p_transform_b.xform(vertices[i]);
+ Vector3 v2 = p_transform_a.origin;
- Vector3 axis = (v2-v1).normalized();
+ Vector3 axis = (v2 - v1).normalized();
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
-
}
separator.generate_contacts();
-
-
}
-template<bool withMargin>
-static void _collision_sphere_face(const ShapeSW *p_a,const Transform &p_transform_a, const ShapeSW *p_b,const Transform& p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) {
-
- const SphereShapeSW *sphere_A = static_cast<const SphereShapeSW*>(p_a);
- const FaceShapeSW *face_B = static_cast<const FaceShapeSW*>(p_b);
+template <bool withMargin>
+static void _collision_sphere_face(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, float p_margin_a, float p_margin_b) {
+ const SphereShapeSW *sphere_A = static_cast<const SphereShapeSW *>(p_a);
+ const FaceShapeSW *face_B = static_cast<const FaceShapeSW *>(p_b);
+ SeparatorAxisTest<SphereShapeSW, FaceShapeSW, withMargin> separator(sphere_A, p_transform_a, face_B, p_transform_b, p_collector, p_margin_a, p_margin_b);
- SeparatorAxisTest<SphereShapeSW,FaceShapeSW,withMargin> separator(sphere_A,p_transform_a,face_B,p_transform_b,p_collector,p_margin_a,p_margin_b);
-
-
- Vector3 vertex[3]={
- p_transform_b.xform( face_B->vertex[0] ),
- p_transform_b.xform( face_B->vertex[1] ),
- p_transform_b.xform( face_B->vertex[2] ),
+ Vector3 vertex[3] = {
+ p_transform_b.xform(face_B->vertex[0]),
+ p_transform_b.xform(face_B->vertex[1]),
+ p_transform_b.xform(face_B->vertex[2]),
};
- if (!separator.test_axis( (vertex[0]-vertex[2]).cross(vertex[0]-vertex[1]).normalized() ))
+ if (!separator.test_axis((vertex[0] - vertex[2]).cross(vertex[0] - vertex[1]).normalized()))
return;
// edges and points of B
- for(int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
+ Vector3 n1 = vertex[i] - p_transform_a.origin;
- Vector3 n1=vertex[i]-p_transform_a.origin;
-
- if (!separator.test_axis( n1.normalized() )) {
+ if (!separator.test_axis(n1.normalized())) {
return;
}
- Vector3 n2=vertex[(i+1)%3]-vertex[i];
+ Vector3 n2 = vertex[(i + 1) % 3] - vertex[i];
Vector3 axis = n1.cross(n2).cross(n2).normalized();
- if (!separator.test_axis( axis )) {
+ if (!separator.test_axis(axis)) {
return;
}
-
}
separator.generate_contacts();
}
+template <bool withMargin>
+static void _collision_box_box(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, float p_margin_a, float p_margin_b) {
-template<bool withMargin>
-static void _collision_box_box(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) {
+ const BoxShapeSW *box_A = static_cast<const BoxShapeSW *>(p_a);
+ const BoxShapeSW *box_B = static_cast<const BoxShapeSW *>(p_b);
-
- const BoxShapeSW *box_A = static_cast<const BoxShapeSW*>(p_a);
- const BoxShapeSW *box_B = static_cast<const BoxShapeSW*>(p_b);
-
- SeparatorAxisTest<BoxShapeSW,BoxShapeSW,withMargin> separator(box_A,p_transform_a,box_B,p_transform_b,p_collector,p_margin_a,p_margin_b);
+ SeparatorAxisTest<BoxShapeSW, BoxShapeSW, withMargin> separator(box_A, p_transform_a, box_B, p_transform_b, p_collector, p_margin_a, p_margin_b);
if (!separator.test_previous_axis())
return;
// test faces of A
- for (int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
Vector3 axis = p_transform_a.basis.get_axis(i).normalized();
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
-
}
// test faces of B
- for (int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
Vector3 axis = p_transform_b.basis.get_axis(i).normalized();
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
-
}
// test combined edges
- for (int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
- for (int j=0;j<3;j++) {
+ for (int j = 0; j < 3; j++) {
- Vector3 axis = p_transform_a.basis.get_axis(i).cross( p_transform_b.basis.get_axis(j) );
+ Vector3 axis = p_transform_a.basis.get_axis(i).cross(p_transform_b.basis.get_axis(j));
- if (axis.length_squared()<CMP_EPSILON)
+ if (axis.length_squared() < CMP_EPSILON)
continue;
axis.normalize();
-
- if (!separator.test_axis( axis )) {
+ if (!separator.test_axis(axis)) {
return;
}
}
@@ -764,110 +706,103 @@ static void _collision_box_box(const ShapeSW *p_a,const Transform &p_transform_a
Vector3 ab_vec = p_transform_b.origin - p_transform_a.origin;
- Vector3 cnormal_a=p_transform_a.basis.xform_inv( ab_vec );
-
- Vector3 support_a=p_transform_a.xform( Vector3(
+ Vector3 cnormal_a = p_transform_a.basis.xform_inv(ab_vec);
- (cnormal_a.x<0) ? -box_A->get_half_extents().x : box_A->get_half_extents().x,
- (cnormal_a.y<0) ? -box_A->get_half_extents().y : box_A->get_half_extents().y,
- (cnormal_a.z<0) ? -box_A->get_half_extents().z : box_A->get_half_extents().z
- ) );
+ Vector3 support_a = p_transform_a.xform(Vector3(
+ (cnormal_a.x < 0) ? -box_A->get_half_extents().x : box_A->get_half_extents().x,
+ (cnormal_a.y < 0) ? -box_A->get_half_extents().y : box_A->get_half_extents().y,
+ (cnormal_a.z < 0) ? -box_A->get_half_extents().z : box_A->get_half_extents().z));
- Vector3 cnormal_b=p_transform_b.basis.xform_inv( -ab_vec );
+ Vector3 cnormal_b = p_transform_b.basis.xform_inv(-ab_vec);
- Vector3 support_b=p_transform_b.xform( Vector3(
+ Vector3 support_b = p_transform_b.xform(Vector3(
- (cnormal_b.x<0) ? -box_B->get_half_extents().x : box_B->get_half_extents().x,
- (cnormal_b.y<0) ? -box_B->get_half_extents().y : box_B->get_half_extents().y,
- (cnormal_b.z<0) ? -box_B->get_half_extents().z : box_B->get_half_extents().z
- ) );
+ (cnormal_b.x < 0) ? -box_B->get_half_extents().x : box_B->get_half_extents().x,
+ (cnormal_b.y < 0) ? -box_B->get_half_extents().y : box_B->get_half_extents().y,
+ (cnormal_b.z < 0) ? -box_B->get_half_extents().z : box_B->get_half_extents().z));
- Vector3 axis_ab = (support_a-support_b);
+ Vector3 axis_ab = (support_a - support_b);
- if (!separator.test_axis( axis_ab.normalized() )) {
+ if (!separator.test_axis(axis_ab.normalized())) {
return;
}
//now try edges, which become cylinders!
- for(int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
//a ->b
Vector3 axis_a = p_transform_a.basis.get_axis(i);
- if (!separator.test_axis( axis_ab.cross(axis_a).cross(axis_a).normalized() ))
+ if (!separator.test_axis(axis_ab.cross(axis_a).cross(axis_a).normalized()))
return;
//b ->a
Vector3 axis_b = p_transform_b.basis.get_axis(i);
- if (!separator.test_axis( axis_ab.cross(axis_b).cross(axis_b).normalized() ))
+ if (!separator.test_axis(axis_ab.cross(axis_b).cross(axis_b).normalized()))
return;
-
}
}
separator.generate_contacts();
-
-
}
-template<bool withMargin>
-static void _collision_box_capsule(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) {
+template <bool withMargin>
+static void _collision_box_capsule(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, float p_margin_a, float p_margin_b) {
- const BoxShapeSW *box_A = static_cast<const BoxShapeSW*>(p_a);
- const CapsuleShapeSW *capsule_B = static_cast<const CapsuleShapeSW*>(p_b);
+ const BoxShapeSW *box_A = static_cast<const BoxShapeSW *>(p_a);
+ const CapsuleShapeSW *capsule_B = static_cast<const CapsuleShapeSW *>(p_b);
- SeparatorAxisTest<BoxShapeSW,CapsuleShapeSW,withMargin> separator(box_A,p_transform_a,capsule_B,p_transform_b,p_collector,p_margin_a,p_margin_b);
+ SeparatorAxisTest<BoxShapeSW, CapsuleShapeSW, withMargin> separator(box_A, p_transform_a, capsule_B, p_transform_b, p_collector, p_margin_a, p_margin_b);
if (!separator.test_previous_axis())
return;
// faces of A
- for (int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
Vector3 axis = p_transform_a.basis.get_axis(i);
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
}
-
Vector3 cyl_axis = p_transform_b.basis.get_axis(2).normalized();
// edges of A, capsule cylinder
- for (int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
// cylinder
Vector3 box_axis = p_transform_a.basis.get_axis(i);
- Vector3 axis = box_axis.cross( cyl_axis );
+ Vector3 axis = box_axis.cross(cyl_axis);
if (axis.length_squared() < CMP_EPSILON)
continue;
- if (!separator.test_axis( axis.normalized() ))
+ if (!separator.test_axis(axis.normalized()))
return;
}
// points of A, capsule cylinder
// this sure could be made faster somehow..
- for (int i=0;i<2;i++) {
- for (int j=0;j<2;j++) {
- for (int k=0;k<2;k++) {
+ for (int i = 0; i < 2; i++) {
+ for (int j = 0; j < 2; j++) {
+ for (int k = 0; k < 2; k++) {
Vector3 he = box_A->get_half_extents();
- he.x*=(i*2-1);
- he.y*=(j*2-1);
- he.z*=(k*2-1);
- Vector3 point=p_transform_a.origin;
- for(int l=0;l<3;l++)
- point+=p_transform_a.basis.get_axis(l)*he[l];
+ he.x *= (i * 2 - 1);
+ he.y *= (j * 2 - 1);
+ he.z *= (k * 2 - 1);
+ Vector3 point = p_transform_a.origin;
+ for (int l = 0; l < 3; l++)
+ point += p_transform_a.basis.get_axis(l) * he[l];
//Vector3 axis = (point - cyl_axis * cyl_axis.dot(point)).normalized();
- Vector3 axis = Plane(cyl_axis,0).project(point).normalized();
+ Vector3 axis = Plane(cyl_axis, 0).project(point).normalized();
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
}
}
@@ -875,58 +810,51 @@ static void _collision_box_capsule(const ShapeSW *p_a,const Transform &p_transfo
// capsule balls, edges of A
- for (int i=0;i<2;i++) {
-
+ for (int i = 0; i < 2; i++) {
- Vector3 capsule_axis = p_transform_b.basis.get_axis(2)*(capsule_B->get_height()*0.5);
+ Vector3 capsule_axis = p_transform_b.basis.get_axis(2) * (capsule_B->get_height() * 0.5);
- Vector3 sphere_pos = p_transform_b.origin + ((i==0)?capsule_axis:-capsule_axis);
+ Vector3 sphere_pos = p_transform_b.origin + ((i == 0) ? capsule_axis : -capsule_axis);
+ Vector3 cnormal = p_transform_a.xform_inv(sphere_pos);
- Vector3 cnormal=p_transform_a.xform_inv( sphere_pos );
+ Vector3 cpoint = p_transform_a.xform(Vector3(
- Vector3 cpoint=p_transform_a.xform( Vector3(
-
- (cnormal.x<0) ? -box_A->get_half_extents().x : box_A->get_half_extents().x,
- (cnormal.y<0) ? -box_A->get_half_extents().y : box_A->get_half_extents().y,
- (cnormal.z<0) ? -box_A->get_half_extents().z : box_A->get_half_extents().z
- ) );
+ (cnormal.x < 0) ? -box_A->get_half_extents().x : box_A->get_half_extents().x,
+ (cnormal.y < 0) ? -box_A->get_half_extents().y : box_A->get_half_extents().y,
+ (cnormal.z < 0) ? -box_A->get_half_extents().z : box_A->get_half_extents().z));
// use point to test axis
Vector3 point_axis = (sphere_pos - cpoint).normalized();
- if (!separator.test_axis( point_axis ))
+ if (!separator.test_axis(point_axis))
return;
// test edges of A
- for (int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
- Vector3 axis = point_axis.cross( p_transform_a.basis.get_axis(i) ).cross( p_transform_a.basis.get_axis(i) ).normalized();
+ Vector3 axis = point_axis.cross(p_transform_a.basis.get_axis(i)).cross(p_transform_a.basis.get_axis(i)).normalized();
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
}
}
-
separator.generate_contacts();
}
-template<bool withMargin>
-static void _collision_box_convex_polygon(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) {
+template <bool withMargin>
+static void _collision_box_convex_polygon(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, float p_margin_a, float p_margin_b) {
+ const BoxShapeSW *box_A = static_cast<const BoxShapeSW *>(p_a);
+ const ConvexPolygonShapeSW *convex_polygon_B = static_cast<const ConvexPolygonShapeSW *>(p_b);
-
- const BoxShapeSW *box_A = static_cast<const BoxShapeSW*>(p_a);
- const ConvexPolygonShapeSW *convex_polygon_B = static_cast<const ConvexPolygonShapeSW*>(p_b);
-
- SeparatorAxisTest<BoxShapeSW,ConvexPolygonShapeSW,withMargin> separator(box_A,p_transform_a,convex_polygon_B,p_transform_b,p_collector,p_margin_a,p_margin_b);
+ SeparatorAxisTest<BoxShapeSW, ConvexPolygonShapeSW, withMargin> separator(box_A, p_transform_a, convex_polygon_B, p_transform_b, p_collector, p_margin_a, p_margin_b);
if (!separator.test_previous_axis())
return;
-
const Geometry::MeshData &mesh = convex_polygon_B->get_mesh();
const Geometry::MeshData::Face *faces = mesh.faces.ptr();
@@ -937,97 +865,92 @@ static void _collision_box_convex_polygon(const ShapeSW *p_a,const Transform &p_
int vertex_count = mesh.vertices.size();
// faces of A
- for (int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
Vector3 axis = p_transform_a.basis.get_axis(i).normalized();
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
}
// faces of B
- for (int i=0;i<face_count;i++) {
+ for (int i = 0; i < face_count; i++) {
- Vector3 axis = p_transform_b.xform( faces[i].plane ).normal;
+ Vector3 axis = p_transform_b.xform(faces[i].plane).normal;
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
}
// A<->B edges
- for (int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
Vector3 e1 = p_transform_a.basis.get_axis(i);
- for (int j=0;j<edge_count;j++) {
+ for (int j = 0; j < edge_count; j++) {
- Vector3 e2=p_transform_b.basis.xform(vertices[edges[j].a]) - p_transform_b.basis.xform(vertices[edges[j].b]);
+ Vector3 e2 = p_transform_b.basis.xform(vertices[edges[j].a]) - p_transform_b.basis.xform(vertices[edges[j].b]);
- Vector3 axis=e1.cross( e2 ).normalized();
+ Vector3 axis = e1.cross(e2).normalized();
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
-
}
}
if (withMargin) {
// calculate closest points between vertices and box edges
- for(int v=0;v<vertex_count;v++) {
-
+ for (int v = 0; v < vertex_count; v++) {
Vector3 vtxb = p_transform_b.xform(vertices[v]);
Vector3 ab_vec = vtxb - p_transform_a.origin;
- Vector3 cnormal_a=p_transform_a.basis.xform_inv( ab_vec );
-
- Vector3 support_a=p_transform_a.xform( Vector3(
+ Vector3 cnormal_a = p_transform_a.basis.xform_inv(ab_vec);
- (cnormal_a.x<0) ? -box_A->get_half_extents().x : box_A->get_half_extents().x,
- (cnormal_a.y<0) ? -box_A->get_half_extents().y : box_A->get_half_extents().y,
- (cnormal_a.z<0) ? -box_A->get_half_extents().z : box_A->get_half_extents().z
- ) );
+ Vector3 support_a = p_transform_a.xform(Vector3(
+ (cnormal_a.x < 0) ? -box_A->get_half_extents().x : box_A->get_half_extents().x,
+ (cnormal_a.y < 0) ? -box_A->get_half_extents().y : box_A->get_half_extents().y,
+ (cnormal_a.z < 0) ? -box_A->get_half_extents().z : box_A->get_half_extents().z));
- Vector3 axis_ab = support_a-vtxb;
+ Vector3 axis_ab = support_a - vtxb;
- if (!separator.test_axis( axis_ab.normalized() )) {
+ if (!separator.test_axis(axis_ab.normalized())) {
return;
}
//now try edges, which become cylinders!
- for(int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
//a ->b
Vector3 axis_a = p_transform_a.basis.get_axis(i);
- if (!separator.test_axis( axis_ab.cross(axis_a).cross(axis_a).normalized() ))
+ if (!separator.test_axis(axis_ab.cross(axis_a).cross(axis_a).normalized()))
return;
}
}
//convex edges and box points
- for (int i=0;i<2;i++) {
- for (int j=0;j<2;j++) {
- for (int k=0;k<2;k++) {
+ for (int i = 0; i < 2; i++) {
+ for (int j = 0; j < 2; j++) {
+ for (int k = 0; k < 2; k++) {
Vector3 he = box_A->get_half_extents();
- he.x*=(i*2-1);
- he.y*=(j*2-1);
- he.z*=(k*2-1);
- Vector3 point=p_transform_a.origin;
- for(int l=0;l<3;l++)
- point+=p_transform_a.basis.get_axis(l)*he[l];
+ he.x *= (i * 2 - 1);
+ he.y *= (j * 2 - 1);
+ he.z *= (k * 2 - 1);
+ Vector3 point = p_transform_a.origin;
+ for (int l = 0; l < 3; l++)
+ point += p_transform_a.basis.get_axis(l) * he[l];
- for(int e=0;e<edge_count;e++) {
+ for (int e = 0; e < edge_count; e++) {
- Vector3 p1=p_transform_b.xform(vertices[edges[e].a]);
- Vector3 p2=p_transform_b.xform(vertices[edges[e].b]);
- Vector3 n = (p2-p1);
+ Vector3 p1 = p_transform_b.xform(vertices[edges[e].a]);
+ Vector3 p2 = p_transform_b.xform(vertices[edges[e].b]);
+ Vector3 n = (p2 - p1);
-
- if (!separator.test_axis( (point-p2).cross(n).cross(n).normalized() ))
+ if (!separator.test_axis((point - p2).cross(n).cross(n).normalized()))
return;
}
}
@@ -1036,130 +959,119 @@ static void _collision_box_convex_polygon(const ShapeSW *p_a,const Transform &p_
}
separator.generate_contacts();
-
-
}
+template <bool withMargin>
+static void _collision_box_face(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, float p_margin_a, float p_margin_b) {
-template<bool withMargin>
-static void _collision_box_face(const ShapeSW *p_a,const Transform &p_transform_a, const ShapeSW *p_b,const Transform& p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) {
-
+ const BoxShapeSW *box_A = static_cast<const BoxShapeSW *>(p_a);
+ const FaceShapeSW *face_B = static_cast<const FaceShapeSW *>(p_b);
- const BoxShapeSW *box_A = static_cast<const BoxShapeSW*>(p_a);
- const FaceShapeSW *face_B = static_cast<const FaceShapeSW*>(p_b);
+ SeparatorAxisTest<BoxShapeSW, FaceShapeSW, withMargin> separator(box_A, p_transform_a, face_B, p_transform_b, p_collector, p_margin_a, p_margin_b);
- SeparatorAxisTest<BoxShapeSW,FaceShapeSW,withMargin> separator(box_A,p_transform_a,face_B,p_transform_b,p_collector,p_margin_a,p_margin_b);
-
- Vector3 vertex[3]={
- p_transform_b.xform( face_B->vertex[0] ),
- p_transform_b.xform( face_B->vertex[1] ),
- p_transform_b.xform( face_B->vertex[2] ),
+ Vector3 vertex[3] = {
+ p_transform_b.xform(face_B->vertex[0]),
+ p_transform_b.xform(face_B->vertex[1]),
+ p_transform_b.xform(face_B->vertex[2]),
};
- if (!separator.test_axis( (vertex[0]-vertex[2]).cross(vertex[0]-vertex[1]).normalized() ))
+ if (!separator.test_axis((vertex[0] - vertex[2]).cross(vertex[0] - vertex[1]).normalized()))
return;
// faces of A
- for (int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
Vector3 axis = p_transform_a.basis.get_axis(i).normalized();
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
}
// combined edges
- for(int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
- Vector3 e=vertex[i]-vertex[(i+1)%3];
+ Vector3 e = vertex[i] - vertex[(i + 1) % 3];
- for (int j=0;j<3;j++) {
+ for (int j = 0; j < 3; j++) {
Vector3 axis = p_transform_a.basis.get_axis(j);
- if (!separator.test_axis( e.cross(axis).normalized() ))
+ if (!separator.test_axis(e.cross(axis).normalized()))
return;
}
-
}
if (withMargin) {
// calculate closest points between vertices and box edges
- for(int v=0;v<3;v++) {
-
+ for (int v = 0; v < 3; v++) {
Vector3 ab_vec = vertex[v] - p_transform_a.origin;
- Vector3 cnormal_a=p_transform_a.basis.xform_inv( ab_vec );
-
- Vector3 support_a=p_transform_a.xform( Vector3(
+ Vector3 cnormal_a = p_transform_a.basis.xform_inv(ab_vec);
- (cnormal_a.x<0) ? -box_A->get_half_extents().x : box_A->get_half_extents().x,
- (cnormal_a.y<0) ? -box_A->get_half_extents().y : box_A->get_half_extents().y,
- (cnormal_a.z<0) ? -box_A->get_half_extents().z : box_A->get_half_extents().z
- ) );
+ Vector3 support_a = p_transform_a.xform(Vector3(
+ (cnormal_a.x < 0) ? -box_A->get_half_extents().x : box_A->get_half_extents().x,
+ (cnormal_a.y < 0) ? -box_A->get_half_extents().y : box_A->get_half_extents().y,
+ (cnormal_a.z < 0) ? -box_A->get_half_extents().z : box_A->get_half_extents().z));
- Vector3 axis_ab = support_a-vertex[v];
+ Vector3 axis_ab = support_a - vertex[v];
- if (!separator.test_axis( axis_ab.normalized() )) {
+ if (!separator.test_axis(axis_ab.normalized())) {
return;
}
//now try edges, which become cylinders!
- for(int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
//a ->b
Vector3 axis_a = p_transform_a.basis.get_axis(i);
- if (!separator.test_axis( axis_ab.cross(axis_a).cross(axis_a).normalized() ))
+ if (!separator.test_axis(axis_ab.cross(axis_a).cross(axis_a).normalized()))
return;
}
}
//convex edges and box points, there has to be a way to speed up this (get closest point?)
- for (int i=0;i<2;i++) {
- for (int j=0;j<2;j++) {
- for (int k=0;k<2;k++) {
+ for (int i = 0; i < 2; i++) {
+ for (int j = 0; j < 2; j++) {
+ for (int k = 0; k < 2; k++) {
Vector3 he = box_A->get_half_extents();
- he.x*=(i*2-1);
- he.y*=(j*2-1);
- he.z*=(k*2-1);
- Vector3 point=p_transform_a.origin;
- for(int l=0;l<3;l++)
- point+=p_transform_a.basis.get_axis(l)*he[l];
+ he.x *= (i * 2 - 1);
+ he.y *= (j * 2 - 1);
+ he.z *= (k * 2 - 1);
+ Vector3 point = p_transform_a.origin;
+ for (int l = 0; l < 3; l++)
+ point += p_transform_a.basis.get_axis(l) * he[l];
- for(int e=0;e<3;e++) {
+ for (int e = 0; e < 3; e++) {
- Vector3 p1=vertex[e];
- Vector3 p2=vertex[(e+1)%3];
+ Vector3 p1 = vertex[e];
+ Vector3 p2 = vertex[(e + 1) % 3];
- Vector3 n = (p2-p1);
+ Vector3 n = (p2 - p1);
- if (!separator.test_axis( (point-p2).cross(n).cross(n).normalized() ))
+ if (!separator.test_axis((point - p2).cross(n).cross(n).normalized()))
return;
}
}
}
}
-
}
separator.generate_contacts();
-
}
+template <bool withMargin>
+static void _collision_capsule_capsule(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, float p_margin_a, float p_margin_b) {
-template<bool withMargin>
-static void _collision_capsule_capsule(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) {
+ const CapsuleShapeSW *capsule_A = static_cast<const CapsuleShapeSW *>(p_a);
+ const CapsuleShapeSW *capsule_B = static_cast<const CapsuleShapeSW *>(p_b);
- const CapsuleShapeSW *capsule_A = static_cast<const CapsuleShapeSW*>(p_a);
- const CapsuleShapeSW *capsule_B = static_cast<const CapsuleShapeSW*>(p_b);
-
- SeparatorAxisTest<CapsuleShapeSW,CapsuleShapeSW,withMargin> separator(capsule_A,p_transform_a,capsule_B,p_transform_b,p_collector,p_margin_a,p_margin_b);
+ SeparatorAxisTest<CapsuleShapeSW, CapsuleShapeSW, withMargin> separator(capsule_A, p_transform_a, capsule_B, p_transform_b, p_collector, p_margin_a, p_margin_b);
if (!separator.test_previous_axis())
return;
@@ -1176,49 +1088,45 @@ static void _collision_capsule_capsule(const ShapeSW *p_a,const Transform &p_tra
//balls-balls
- if (!separator.test_axis( (capsule_A_ball_1 - capsule_B_ball_1 ).normalized() ) )
+ if (!separator.test_axis((capsule_A_ball_1 - capsule_B_ball_1).normalized()))
return;
- if (!separator.test_axis( (capsule_A_ball_1 - capsule_B_ball_2 ).normalized() ) )
+ if (!separator.test_axis((capsule_A_ball_1 - capsule_B_ball_2).normalized()))
return;
- if (!separator.test_axis( (capsule_A_ball_2 - capsule_B_ball_1 ).normalized() ) )
+ if (!separator.test_axis((capsule_A_ball_2 - capsule_B_ball_1).normalized()))
return;
- if (!separator.test_axis( (capsule_A_ball_2 - capsule_B_ball_2 ).normalized() ) )
+ if (!separator.test_axis((capsule_A_ball_2 - capsule_B_ball_2).normalized()))
return;
-
// edges-balls
- if (!separator.test_axis( (capsule_A_ball_1 - capsule_B_ball_1 ).cross(capsule_A_axis).cross(capsule_A_axis).normalized() ) )
+ if (!separator.test_axis((capsule_A_ball_1 - capsule_B_ball_1).cross(capsule_A_axis).cross(capsule_A_axis).normalized()))
return;
- if (!separator.test_axis( (capsule_A_ball_1 - capsule_B_ball_2 ).cross(capsule_A_axis).cross(capsule_A_axis).normalized() ) )
+ if (!separator.test_axis((capsule_A_ball_1 - capsule_B_ball_2).cross(capsule_A_axis).cross(capsule_A_axis).normalized()))
return;
- if (!separator.test_axis( (capsule_B_ball_1 - capsule_A_ball_1 ).cross(capsule_B_axis).cross(capsule_B_axis).normalized() ) )
+ if (!separator.test_axis((capsule_B_ball_1 - capsule_A_ball_1).cross(capsule_B_axis).cross(capsule_B_axis).normalized()))
return;
- if (!separator.test_axis( (capsule_B_ball_1 - capsule_A_ball_2 ).cross(capsule_B_axis).cross(capsule_B_axis).normalized() ) )
+ if (!separator.test_axis((capsule_B_ball_1 - capsule_A_ball_2).cross(capsule_B_axis).cross(capsule_B_axis).normalized()))
return;
// edges
- if (!separator.test_axis( capsule_A_axis.cross(capsule_B_axis).normalized() ) )
+ if (!separator.test_axis(capsule_A_axis.cross(capsule_B_axis).normalized()))
return;
-
separator.generate_contacts();
-
}
-template<bool withMargin>
-static void _collision_capsule_convex_polygon(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) {
+template <bool withMargin>
+static void _collision_capsule_convex_polygon(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, float p_margin_a, float p_margin_b) {
+ const CapsuleShapeSW *capsule_A = static_cast<const CapsuleShapeSW *>(p_a);
+ const ConvexPolygonShapeSW *convex_polygon_B = static_cast<const ConvexPolygonShapeSW *>(p_b);
- const CapsuleShapeSW *capsule_A = static_cast<const CapsuleShapeSW*>(p_a);
- const ConvexPolygonShapeSW *convex_polygon_B = static_cast<const ConvexPolygonShapeSW*>(p_b);
-
- SeparatorAxisTest<CapsuleShapeSW,ConvexPolygonShapeSW,withMargin> separator(capsule_A,p_transform_a,convex_polygon_B,p_transform_b,p_collector,p_margin_a,p_margin_b);
+ SeparatorAxisTest<CapsuleShapeSW, ConvexPolygonShapeSW, withMargin> separator(capsule_A, p_transform_a, convex_polygon_B, p_transform_b, p_collector, p_margin_a, p_margin_b);
if (!separator.test_previous_axis())
return;
@@ -1232,127 +1140,113 @@ static void _collision_capsule_convex_polygon(const ShapeSW *p_a,const Transform
const Vector3 *vertices = mesh.vertices.ptr();
// faces of B
- for (int i=0;i<face_count;i++) {
+ for (int i = 0; i < face_count; i++) {
- Vector3 axis = p_transform_b.xform( faces[i].plane ).normal;
+ Vector3 axis = p_transform_b.xform(faces[i].plane).normal;
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
}
// edges of B, capsule cylinder
- for (int i=0;i<edge_count;i++) {
+ for (int i = 0; i < edge_count; i++) {
// cylinder
- Vector3 edge_axis = p_transform_b.basis.xform( vertices[ edges[i].a] ) - p_transform_b.basis.xform( vertices[ edges[i].b] );
- Vector3 axis = edge_axis.cross( p_transform_a.basis.get_axis(2) ).normalized();
-
+ Vector3 edge_axis = p_transform_b.basis.xform(vertices[edges[i].a]) - p_transform_b.basis.xform(vertices[edges[i].b]);
+ Vector3 axis = edge_axis.cross(p_transform_a.basis.get_axis(2)).normalized();
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
}
// capsule balls, edges of B
- for (int i=0;i<2;i++) {
+ for (int i = 0; i < 2; i++) {
// edges of B, capsule cylinder
- Vector3 capsule_axis = p_transform_a.basis.get_axis(2)*(capsule_A->get_height()*0.5);
+ Vector3 capsule_axis = p_transform_a.basis.get_axis(2) * (capsule_A->get_height() * 0.5);
- Vector3 sphere_pos = p_transform_a.origin + ((i==0)?capsule_axis:-capsule_axis);
+ Vector3 sphere_pos = p_transform_a.origin + ((i == 0) ? capsule_axis : -capsule_axis);
- for (int j=0;j<edge_count;j++) {
+ for (int j = 0; j < edge_count; j++) {
-
- Vector3 n1=sphere_pos - p_transform_b.xform( vertices[ edges[j].a] );
- Vector3 n2=p_transform_b.basis.xform( vertices[ edges[j].a] ) - p_transform_b.basis.xform( vertices[ edges[j].b] );
+ Vector3 n1 = sphere_pos - p_transform_b.xform(vertices[edges[j].a]);
+ Vector3 n2 = p_transform_b.basis.xform(vertices[edges[j].a]) - p_transform_b.basis.xform(vertices[edges[j].b]);
Vector3 axis = n1.cross(n2).cross(n2).normalized();
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
}
}
-
separator.generate_contacts();
-
}
+template <bool withMargin>
+static void _collision_capsule_face(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, float p_margin_a, float p_margin_b) {
-template<bool withMargin>
-static void _collision_capsule_face(const ShapeSW *p_a,const Transform &p_transform_a, const ShapeSW *p_b,const Transform& p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) {
-
- const CapsuleShapeSW *capsule_A = static_cast<const CapsuleShapeSW*>(p_a);
- const FaceShapeSW *face_B = static_cast<const FaceShapeSW*>(p_b);
-
- SeparatorAxisTest<CapsuleShapeSW,FaceShapeSW,withMargin> separator(capsule_A,p_transform_a,face_B,p_transform_b,p_collector,p_margin_a,p_margin_b);
-
+ const CapsuleShapeSW *capsule_A = static_cast<const CapsuleShapeSW *>(p_a);
+ const FaceShapeSW *face_B = static_cast<const FaceShapeSW *>(p_b);
+ SeparatorAxisTest<CapsuleShapeSW, FaceShapeSW, withMargin> separator(capsule_A, p_transform_a, face_B, p_transform_b, p_collector, p_margin_a, p_margin_b);
- Vector3 vertex[3]={
- p_transform_b.xform( face_B->vertex[0] ),
- p_transform_b.xform( face_B->vertex[1] ),
- p_transform_b.xform( face_B->vertex[2] ),
+ Vector3 vertex[3] = {
+ p_transform_b.xform(face_B->vertex[0]),
+ p_transform_b.xform(face_B->vertex[1]),
+ p_transform_b.xform(face_B->vertex[2]),
};
- if (!separator.test_axis( (vertex[0]-vertex[2]).cross(vertex[0]-vertex[1]).normalized() ))
+ if (!separator.test_axis((vertex[0] - vertex[2]).cross(vertex[0] - vertex[1]).normalized()))
return;
// edges of B, capsule cylinder
- Vector3 capsule_axis = p_transform_a.basis.get_axis(2)*(capsule_A->get_height()*0.5);
+ Vector3 capsule_axis = p_transform_a.basis.get_axis(2) * (capsule_A->get_height() * 0.5);
- for (int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
// edge-cylinder
- Vector3 edge_axis = vertex[i]-vertex[(i+1)%3];
- Vector3 axis = edge_axis.cross( capsule_axis ).normalized();
+ Vector3 edge_axis = vertex[i] - vertex[(i + 1) % 3];
+ Vector3 axis = edge_axis.cross(capsule_axis).normalized();
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
- if (!separator.test_axis( (p_transform_a.origin-vertex[i]).cross(capsule_axis).cross(capsule_axis).normalized() ))
+ if (!separator.test_axis((p_transform_a.origin - vertex[i]).cross(capsule_axis).cross(capsule_axis).normalized()))
return;
- for (int j=0;j<2;j++) {
+ for (int j = 0; j < 2; j++) {
// point-spheres
- Vector3 sphere_pos = p_transform_a.origin + ( (j==0) ? capsule_axis : -capsule_axis );
+ Vector3 sphere_pos = p_transform_a.origin + ((j == 0) ? capsule_axis : -capsule_axis);
- Vector3 n1=sphere_pos - vertex[i];
+ Vector3 n1 = sphere_pos - vertex[i];
- if (!separator.test_axis( n1.normalized() ))
+ if (!separator.test_axis(n1.normalized()))
return;
- Vector3 n2=edge_axis;
+ Vector3 n2 = edge_axis;
axis = n1.cross(n2).cross(n2);
- if (!separator.test_axis( axis.normalized() ))
+ if (!separator.test_axis(axis.normalized()))
return;
-
-
}
-
}
-
separator.generate_contacts();
-
}
+template <bool withMargin>
+static void _collision_convex_polygon_convex_polygon(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, float p_margin_a, float p_margin_b) {
-template<bool withMargin>
-static void _collision_convex_polygon_convex_polygon(const ShapeSW *p_a,const Transform &p_transform_a,const ShapeSW *p_b,const Transform &p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) {
-
+ const ConvexPolygonShapeSW *convex_polygon_A = static_cast<const ConvexPolygonShapeSW *>(p_a);
+ const ConvexPolygonShapeSW *convex_polygon_B = static_cast<const ConvexPolygonShapeSW *>(p_b);
- const ConvexPolygonShapeSW *convex_polygon_A = static_cast<const ConvexPolygonShapeSW*>(p_a);
- const ConvexPolygonShapeSW *convex_polygon_B = static_cast<const ConvexPolygonShapeSW*>(p_b);
-
- SeparatorAxisTest<ConvexPolygonShapeSW,ConvexPolygonShapeSW,withMargin> separator(convex_polygon_A,p_transform_a,convex_polygon_B,p_transform_b,p_collector,p_margin_a,p_margin_b);
+ SeparatorAxisTest<ConvexPolygonShapeSW, ConvexPolygonShapeSW, withMargin> separator(convex_polygon_A, p_transform_a, convex_polygon_B, p_transform_b, p_collector, p_margin_a, p_margin_b);
if (!separator.test_previous_axis())
return;
@@ -1376,107 +1270,97 @@ static void _collision_convex_polygon_convex_polygon(const ShapeSW *p_a,const Tr
int vertex_count_B = mesh_B.vertices.size();
// faces of A
- for (int i=0;i<face_count_A;i++) {
+ for (int i = 0; i < face_count_A; i++) {
- Vector3 axis = p_transform_a.xform( faces_A[i].plane ).normal;
-// Vector3 axis = p_transform_a.basis.xform( faces_A[i].plane.normal ).normalized();
+ Vector3 axis = p_transform_a.xform(faces_A[i].plane).normal;
+ // Vector3 axis = p_transform_a.basis.xform( faces_A[i].plane.normal ).normalized();
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
}
// faces of B
- for (int i=0;i<face_count_B;i++) {
-
- Vector3 axis = p_transform_b.xform( faces_B[i].plane ).normal;
-// Vector3 axis = p_transform_b.basis.xform( faces_B[i].plane.normal ).normalized();
+ for (int i = 0; i < face_count_B; i++) {
+ Vector3 axis = p_transform_b.xform(faces_B[i].plane).normal;
+ // Vector3 axis = p_transform_b.basis.xform( faces_B[i].plane.normal ).normalized();
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
}
// A<->B edges
- for (int i=0;i<edge_count_A;i++) {
+ for (int i = 0; i < edge_count_A; i++) {
- Vector3 e1=p_transform_a.basis.xform( vertices_A[ edges_A[i].a] ) -p_transform_a.basis.xform( vertices_A[ edges_A[i].b] );
+ Vector3 e1 = p_transform_a.basis.xform(vertices_A[edges_A[i].a]) - p_transform_a.basis.xform(vertices_A[edges_A[i].b]);
- for (int j=0;j<edge_count_B;j++) {
+ for (int j = 0; j < edge_count_B; j++) {
- Vector3 e2=p_transform_b.basis.xform( vertices_B[ edges_B[j].a] ) -p_transform_b.basis.xform( vertices_B[ edges_B[j].b] );
+ Vector3 e2 = p_transform_b.basis.xform(vertices_B[edges_B[j].a]) - p_transform_b.basis.xform(vertices_B[edges_B[j].b]);
- Vector3 axis=e1.cross( e2 ).normalized();
+ Vector3 axis = e1.cross(e2).normalized();
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
-
}
}
if (withMargin) {
//vertex-vertex
- for(int i=0;i<vertex_count_A;i++) {
+ for (int i = 0; i < vertex_count_A; i++) {
Vector3 va = p_transform_a.xform(vertices_A[i]);
- for(int j=0;j<vertex_count_B;j++) {
+ for (int j = 0; j < vertex_count_B; j++) {
- if (!separator.test_axis( (va-p_transform_b.xform(vertices_B[j])).normalized() ))
+ if (!separator.test_axis((va - p_transform_b.xform(vertices_B[j])).normalized()))
return;
-
}
}
//edge-vertex( hsell)
- for (int i=0;i<edge_count_A;i++) {
+ for (int i = 0; i < edge_count_A; i++) {
- Vector3 e1=p_transform_a.basis.xform( vertices_A[ edges_A[i].a] );
- Vector3 e2=p_transform_a.basis.xform( vertices_A[ edges_A[i].b] );
- Vector3 n = (e2-e1);
+ Vector3 e1 = p_transform_a.basis.xform(vertices_A[edges_A[i].a]);
+ Vector3 e2 = p_transform_a.basis.xform(vertices_A[edges_A[i].b]);
+ Vector3 n = (e2 - e1);
- for(int j=0;j<vertex_count_B;j++) {
+ for (int j = 0; j < vertex_count_B; j++) {
- Vector3 e3=p_transform_b.xform(vertices_B[j]);
+ Vector3 e3 = p_transform_b.xform(vertices_B[j]);
-
- if (!separator.test_axis( (e1-e3).cross(n).cross(n).normalized() ))
+ if (!separator.test_axis((e1 - e3).cross(n).cross(n).normalized()))
return;
}
}
- for (int i=0;i<edge_count_B;i++) {
-
- Vector3 e1=p_transform_b.basis.xform( vertices_B[ edges_B[i].a] );
- Vector3 e2=p_transform_b.basis.xform( vertices_B[ edges_B[i].b] );
- Vector3 n = (e2-e1);
+ for (int i = 0; i < edge_count_B; i++) {
- for(int j=0;j<vertex_count_A;j++) {
+ Vector3 e1 = p_transform_b.basis.xform(vertices_B[edges_B[i].a]);
+ Vector3 e2 = p_transform_b.basis.xform(vertices_B[edges_B[i].b]);
+ Vector3 n = (e2 - e1);
- Vector3 e3=p_transform_a.xform(vertices_A[j]);
+ for (int j = 0; j < vertex_count_A; j++) {
+ Vector3 e3 = p_transform_a.xform(vertices_A[j]);
- if (!separator.test_axis( (e1-e3).cross(n).cross(n).normalized() ))
+ if (!separator.test_axis((e1 - e3).cross(n).cross(n).normalized()))
return;
}
}
-
-
}
separator.generate_contacts();
-
}
+template <bool withMargin>
+static void _collision_convex_polygon_face(const ShapeSW *p_a, const Transform &p_transform_a, const ShapeSW *p_b, const Transform &p_transform_b, _CollectorCallback *p_collector, float p_margin_a, float p_margin_b) {
-template<bool withMargin>
-static void _collision_convex_polygon_face(const ShapeSW *p_a,const Transform &p_transform_a, const ShapeSW *p_b,const Transform& p_transform_b,_CollectorCallback *p_collector,float p_margin_a,float p_margin_b) {
-
+ const ConvexPolygonShapeSW *convex_polygon_A = static_cast<const ConvexPolygonShapeSW *>(p_a);
+ const FaceShapeSW *face_B = static_cast<const FaceShapeSW *>(p_b);
- const ConvexPolygonShapeSW *convex_polygon_A = static_cast<const ConvexPolygonShapeSW*>(p_a);
- const FaceShapeSW *face_B = static_cast<const FaceShapeSW*>(p_b);
-
- SeparatorAxisTest<ConvexPolygonShapeSW,FaceShapeSW,withMargin> separator(convex_polygon_A,p_transform_a,face_B,p_transform_b,p_collector,p_margin_a,p_margin_b);
+ SeparatorAxisTest<ConvexPolygonShapeSW, FaceShapeSW, withMargin> separator(convex_polygon_A, p_transform_a, face_B, p_transform_b, p_collector, p_margin_a, p_margin_b);
const Geometry::MeshData &mesh = convex_polygon_A->get_mesh();
@@ -1487,207 +1371,192 @@ static void _collision_convex_polygon_face(const ShapeSW *p_a,const Transform &p
const Vector3 *vertices = mesh.vertices.ptr();
int vertex_count = mesh.vertices.size();
-
-
- Vector3 vertex[3]={
- p_transform_b.xform( face_B->vertex[0] ),
- p_transform_b.xform( face_B->vertex[1] ),
- p_transform_b.xform( face_B->vertex[2] ),
+ Vector3 vertex[3] = {
+ p_transform_b.xform(face_B->vertex[0]),
+ p_transform_b.xform(face_B->vertex[1]),
+ p_transform_b.xform(face_B->vertex[2]),
};
- if (!separator.test_axis( (vertex[0]-vertex[2]).cross(vertex[0]-vertex[1]).normalized() ))
+ if (!separator.test_axis((vertex[0] - vertex[2]).cross(vertex[0] - vertex[1]).normalized()))
return;
-
// faces of A
- for (int i=0;i<face_count;i++) {
+ for (int i = 0; i < face_count; i++) {
-// Vector3 axis = p_transform_a.xform( faces[i].plane ).normal;
- Vector3 axis = p_transform_a.basis.xform( faces[i].plane.normal ).normalized();
+ // Vector3 axis = p_transform_a.xform( faces[i].plane ).normal;
+ Vector3 axis = p_transform_a.basis.xform(faces[i].plane.normal).normalized();
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
}
-
// A<->B edges
- for (int i=0;i<edge_count;i++) {
+ for (int i = 0; i < edge_count; i++) {
- Vector3 e1=p_transform_a.xform( vertices[edges[i].a] ) - p_transform_a.xform( vertices[edges[i].b] );
+ Vector3 e1 = p_transform_a.xform(vertices[edges[i].a]) - p_transform_a.xform(vertices[edges[i].b]);
- for (int j=0;j<3;j++) {
+ for (int j = 0; j < 3; j++) {
- Vector3 e2=vertex[j]-vertex[(j+1)%3];
+ Vector3 e2 = vertex[j] - vertex[(j + 1) % 3];
- Vector3 axis=e1.cross( e2 ).normalized();
+ Vector3 axis = e1.cross(e2).normalized();
- if (!separator.test_axis( axis ))
+ if (!separator.test_axis(axis))
return;
}
}
-
if (withMargin) {
//vertex-vertex
- for(int i=0;i<vertex_count;i++) {
+ for (int i = 0; i < vertex_count; i++) {
Vector3 va = p_transform_a.xform(vertices[i]);
- for(int j=0;j<3;j++) {
+ for (int j = 0; j < 3; j++) {
- if (!separator.test_axis( (va-vertex[j]).normalized() ))
+ if (!separator.test_axis((va - vertex[j]).normalized()))
return;
-
}
}
//edge-vertex( hsell)
- for (int i=0;i<edge_count;i++) {
-
- Vector3 e1=p_transform_a.basis.xform( vertices[ edges[i].a] );
- Vector3 e2=p_transform_a.basis.xform( vertices[ edges[i].b] );
- Vector3 n = (e2-e1);
+ for (int i = 0; i < edge_count; i++) {
- for(int j=0;j<3;j++) {
+ Vector3 e1 = p_transform_a.basis.xform(vertices[edges[i].a]);
+ Vector3 e2 = p_transform_a.basis.xform(vertices[edges[i].b]);
+ Vector3 n = (e2 - e1);
- Vector3 e3=vertex[j];
+ for (int j = 0; j < 3; j++) {
+ Vector3 e3 = vertex[j];
- if (!separator.test_axis( (e1-e3).cross(n).cross(n).normalized() ))
+ if (!separator.test_axis((e1 - e3).cross(n).cross(n).normalized()))
return;
}
}
- for (int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
- Vector3 e1=vertex[i];
- Vector3 e2=vertex[(i+1)%3];
- Vector3 n = (e2-e1);
+ Vector3 e1 = vertex[i];
+ Vector3 e2 = vertex[(i + 1) % 3];
+ Vector3 n = (e2 - e1);
- for(int j=0;j<vertex_count;j++) {
+ for (int j = 0; j < vertex_count; j++) {
- Vector3 e3=p_transform_a.xform(vertices[j]);
+ Vector3 e3 = p_transform_a.xform(vertices[j]);
-
- if (!separator.test_axis( (e1-e3).cross(n).cross(n).normalized() ))
+ if (!separator.test_axis((e1 - e3).cross(n).cross(n).normalized()))
return;
}
}
}
separator.generate_contacts();
-
}
+bool sat_calculate_penetration(const ShapeSW *p_shape_A, const Transform &p_transform_A, const ShapeSW *p_shape_B, const Transform &p_transform_B, CollisionSolverSW::CallbackResult p_result_callback, void *p_userdata, bool p_swap, Vector3 *r_prev_axis, float p_margin_a, float p_margin_b) {
-bool sat_calculate_penetration(const ShapeSW *p_shape_A, const Transform& p_transform_A, const ShapeSW *p_shape_B, const Transform& p_transform_B, CollisionSolverSW::CallbackResult p_result_callback,void *p_userdata,bool p_swap,Vector3* r_prev_axis,float p_margin_a,float p_margin_b) {
-
- PhysicsServer::ShapeType type_A=p_shape_A->get_type();
-
- ERR_FAIL_COND_V(type_A==PhysicsServer::SHAPE_PLANE,false);
- ERR_FAIL_COND_V(type_A==PhysicsServer::SHAPE_RAY,false);
- ERR_FAIL_COND_V(p_shape_A->is_concave(),false);
+ PhysicsServer::ShapeType type_A = p_shape_A->get_type();
- PhysicsServer::ShapeType type_B=p_shape_B->get_type();
+ ERR_FAIL_COND_V(type_A == PhysicsServer::SHAPE_PLANE, false);
+ ERR_FAIL_COND_V(type_A == PhysicsServer::SHAPE_RAY, false);
+ ERR_FAIL_COND_V(p_shape_A->is_concave(), false);
- ERR_FAIL_COND_V(type_B==PhysicsServer::SHAPE_PLANE,false);
- ERR_FAIL_COND_V(type_B==PhysicsServer::SHAPE_RAY,false);
- ERR_FAIL_COND_V(p_shape_B->is_concave(),false);
+ PhysicsServer::ShapeType type_B = p_shape_B->get_type();
+ ERR_FAIL_COND_V(type_B == PhysicsServer::SHAPE_PLANE, false);
+ ERR_FAIL_COND_V(type_B == PhysicsServer::SHAPE_RAY, false);
+ ERR_FAIL_COND_V(p_shape_B->is_concave(), false);
- static const CollisionFunc collision_table[5][5]={
- {_collision_sphere_sphere<false>,
- _collision_sphere_box<false>,
- _collision_sphere_capsule<false>,
- _collision_sphere_convex_polygon<false>,
- _collision_sphere_face<false>},
- {0,
- _collision_box_box<false>,
- _collision_box_capsule<false>,
- _collision_box_convex_polygon<false>,
- _collision_box_face<false>},
- {0,
- 0,
- _collision_capsule_capsule<false>,
- _collision_capsule_convex_polygon<false>,
- _collision_capsule_face<false>},
- {0,
- 0,
- 0,
- _collision_convex_polygon_convex_polygon<false>,
- _collision_convex_polygon_face<false>},
- {0,
- 0,
- 0,
- 0,
- 0},
+ static const CollisionFunc collision_table[5][5] = {
+ { _collision_sphere_sphere<false>,
+ _collision_sphere_box<false>,
+ _collision_sphere_capsule<false>,
+ _collision_sphere_convex_polygon<false>,
+ _collision_sphere_face<false> },
+ { 0,
+ _collision_box_box<false>,
+ _collision_box_capsule<false>,
+ _collision_box_convex_polygon<false>,
+ _collision_box_face<false> },
+ { 0,
+ 0,
+ _collision_capsule_capsule<false>,
+ _collision_capsule_convex_polygon<false>,
+ _collision_capsule_face<false> },
+ { 0,
+ 0,
+ 0,
+ _collision_convex_polygon_convex_polygon<false>,
+ _collision_convex_polygon_face<false> },
+ { 0,
+ 0,
+ 0,
+ 0,
+ 0 },
};
- static const CollisionFunc collision_table_margin[5][5]={
- {_collision_sphere_sphere<true>,
- _collision_sphere_box<true>,
- _collision_sphere_capsule<true>,
- _collision_sphere_convex_polygon<true>,
- _collision_sphere_face<true>},
- {0,
- _collision_box_box<true>,
- _collision_box_capsule<true>,
- _collision_box_convex_polygon<true>,
- _collision_box_face<true>},
- {0,
- 0,
- _collision_capsule_capsule<true>,
- _collision_capsule_convex_polygon<true>,
- _collision_capsule_face<true>},
- {0,
- 0,
- 0,
- _collision_convex_polygon_convex_polygon<true>,
- _collision_convex_polygon_face<true>},
- {0,
- 0,
- 0,
- 0,
- 0},
+ static const CollisionFunc collision_table_margin[5][5] = {
+ { _collision_sphere_sphere<true>,
+ _collision_sphere_box<true>,
+ _collision_sphere_capsule<true>,
+ _collision_sphere_convex_polygon<true>,
+ _collision_sphere_face<true> },
+ { 0,
+ _collision_box_box<true>,
+ _collision_box_capsule<true>,
+ _collision_box_convex_polygon<true>,
+ _collision_box_face<true> },
+ { 0,
+ 0,
+ _collision_capsule_capsule<true>,
+ _collision_capsule_convex_polygon<true>,
+ _collision_capsule_face<true> },
+ { 0,
+ 0,
+ 0,
+ _collision_convex_polygon_convex_polygon<true>,
+ _collision_convex_polygon_face<true> },
+ { 0,
+ 0,
+ 0,
+ 0,
+ 0 },
};
_CollectorCallback callback;
- callback.callback=p_result_callback;
- callback.swap=p_swap;
- callback.userdata=p_userdata;
- callback.collided=false;
- callback.prev_axis=r_prev_axis;
+ callback.callback = p_result_callback;
+ callback.swap = p_swap;
+ callback.userdata = p_userdata;
+ callback.collided = false;
+ callback.prev_axis = r_prev_axis;
- const ShapeSW *A=p_shape_A;
- const ShapeSW *B=p_shape_B;
- const Transform *transform_A=&p_transform_A;
- const Transform *transform_B=&p_transform_B;
- float margin_A=p_margin_a;
- float margin_B=p_margin_b;
+ const ShapeSW *A = p_shape_A;
+ const ShapeSW *B = p_shape_B;
+ const Transform *transform_A = &p_transform_A;
+ const Transform *transform_B = &p_transform_B;
+ float margin_A = p_margin_a;
+ float margin_B = p_margin_b;
if (type_A > type_B) {
- SWAP(A,B);
- SWAP(transform_A,transform_B);
- SWAP(type_A,type_B);
- SWAP(margin_A,margin_B);
+ SWAP(A, B);
+ SWAP(transform_A, transform_B);
+ SWAP(type_A, type_B);
+ SWAP(margin_A, margin_B);
callback.swap = !callback.swap;
}
-
CollisionFunc collision_func;
- if (margin_A!=0.0 || margin_B!=0.0) {
- collision_func = collision_table_margin[type_A-2][type_B-2];
+ if (margin_A != 0.0 || margin_B != 0.0) {
+ collision_func = collision_table_margin[type_A - 2][type_B - 2];
} else {
- collision_func = collision_table[type_A-2][type_B-2];
-
+ collision_func = collision_table[type_A - 2][type_B - 2];
}
- ERR_FAIL_COND_V(!collision_func,false);
+ ERR_FAIL_COND_V(!collision_func, false);
-
- collision_func(A,*transform_A,B,*transform_B,&callback,margin_A,margin_B);
+ collision_func(A, *transform_A, B, *transform_B, &callback, margin_A, margin_B);
return callback.collided;
-
}
diff --git a/servers/physics/collision_solver_sat.h b/servers/physics/collision_solver_sat.h
index 60387a978..2f49e266d 100644
--- a/servers/physics/collision_solver_sat.h
+++ b/servers/physics/collision_solver_sat.h
@@ -31,7 +31,6 @@
#include "collision_solver_sw.h"
-
-bool sat_calculate_penetration(const ShapeSW *p_shape_A, const Transform& p_transform_A, const ShapeSW *p_shape_B, const Transform& p_transform_B, CollisionSolverSW::CallbackResult p_result_callback,void *p_userdata, bool p_swap=false,Vector3* r_prev_axis=NULL,float p_margin_a=0,float p_margin_b=0);
+bool sat_calculate_penetration(const ShapeSW *p_shape_A, const Transform &p_transform_A, const ShapeSW *p_shape_B, const Transform &p_transform_B, CollisionSolverSW::CallbackResult p_result_callback, void *p_userdata, bool p_swap = false, Vector3 *r_prev_axis = NULL, float p_margin_a = 0, float p_margin_b = 0);
#endif // COLLISION_SOLVER_SAT_H
diff --git a/servers/physics/collision_solver_sw.cpp b/servers/physics/collision_solver_sw.cpp
index 886d93c4b..3ffb6f017 100644
--- a/servers/physics/collision_solver_sw.cpp
+++ b/servers/physics/collision_solver_sw.cpp
@@ -29,18 +29,16 @@
#include "collision_solver_sw.h"
#include "collision_solver_sat.h"
-#include "gjk_epa.h"
#include "collision_solver_sat.h"
-
+#include "gjk_epa.h"
#define collision_solver sat_calculate_penetration
//#define collision_solver gjk_epa_calculate_penetration
+bool CollisionSolverSW::solve_static_plane(const ShapeSW *p_shape_A, const Transform &p_transform_A, const ShapeSW *p_shape_B, const Transform &p_transform_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result) {
-bool CollisionSolverSW::solve_static_plane(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result) {
-
- const PlaneShapeSW *plane = static_cast<const PlaneShapeSW*>(p_shape_A);
- if (p_shape_B->get_type()==PhysicsServer::SHAPE_PLANE)
+ const PlaneShapeSW *plane = static_cast<const PlaneShapeSW *>(p_shape_A);
+ if (p_shape_B->get_type() == PhysicsServer::SHAPE_PLANE)
return false;
Plane p = p_transform_A.xform(plane->get_plane());
@@ -48,57 +46,54 @@ bool CollisionSolverSW::solve_static_plane(const ShapeSW *p_shape_A,const Transf
Vector3 supports[max_supports];
int support_count;
- p_shape_B->get_supports(p_transform_B.basis.xform_inv(-p.normal).normalized(),max_supports,supports,support_count);
+ p_shape_B->get_supports(p_transform_B.basis.xform_inv(-p.normal).normalized(), max_supports, supports, support_count);
- bool found=false;
+ bool found = false;
- for(int i=0;i<support_count;i++) {
+ for (int i = 0; i < support_count; i++) {
- supports[i] = p_transform_B.xform( supports[i] );
- if (p.distance_to(supports[i])>=0)
+ supports[i] = p_transform_B.xform(supports[i]);
+ if (p.distance_to(supports[i]) >= 0)
continue;
- found=true;
+ found = true;
Vector3 support_A = p.project(supports[i]);
if (p_result_callback) {
if (p_swap_result)
- p_result_callback(supports[i],support_A,p_userdata);
+ p_result_callback(supports[i], support_A, p_userdata);
else
- p_result_callback(support_A,supports[i],p_userdata);
+ p_result_callback(support_A, supports[i], p_userdata);
}
-
}
-
return found;
}
-bool CollisionSolverSW::solve_ray(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result) {
+bool CollisionSolverSW::solve_ray(const ShapeSW *p_shape_A, const Transform &p_transform_A, const ShapeSW *p_shape_B, const Transform &p_transform_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result) {
-
- const RayShapeSW *ray = static_cast<const RayShapeSW*>(p_shape_A);
+ const RayShapeSW *ray = static_cast<const RayShapeSW *>(p_shape_A);
Vector3 from = p_transform_A.origin;
- Vector3 to = from+p_transform_A.basis.get_axis(2)*ray->get_length();
- Vector3 support_A=to;
+ Vector3 to = from + p_transform_A.basis.get_axis(2) * ray->get_length();
+ Vector3 support_A = to;
Transform ai = p_transform_B.affine_inverse();
from = ai.xform(from);
to = ai.xform(to);
- Vector3 p,n;
- if (!p_shape_B->intersect_segment(from,to,p,n))
+ Vector3 p, n;
+ if (!p_shape_B->intersect_segment(from, to, p, n))
return false;
- Vector3 support_B=p_transform_B.xform(p);
+ Vector3 support_B = p_transform_B.xform(p);
if (p_result_callback) {
if (p_swap_result)
- p_result_callback(support_B,support_A,p_userdata);
+ p_result_callback(support_B, support_A, p_userdata);
else
- p_result_callback(support_A,support_B,p_userdata);
+ p_result_callback(support_A, support_B, p_userdata);
}
return true;
}
@@ -117,169 +112,153 @@ struct _ConcaveCollisionInfo {
bool tested;
float margin_A;
float margin_B;
- Vector3 close_A,close_B;
-
+ Vector3 close_A, close_B;
};
void CollisionSolverSW::concave_callback(void *p_userdata, ShapeSW *p_convex) {
-
- _ConcaveCollisionInfo &cinfo = *(_ConcaveCollisionInfo*)(p_userdata);
+ _ConcaveCollisionInfo &cinfo = *(_ConcaveCollisionInfo *)(p_userdata);
cinfo.aabb_tests++;
- bool collided = collision_solver(cinfo.shape_A, *cinfo.transform_A, p_convex,*cinfo.transform_B, cinfo.result_callback, cinfo.userdata, cinfo.swap_result,NULL,cinfo.margin_A,cinfo.margin_B);
+ bool collided = collision_solver(cinfo.shape_A, *cinfo.transform_A, p_convex, *cinfo.transform_B, cinfo.result_callback, cinfo.userdata, cinfo.swap_result, NULL, cinfo.margin_A, cinfo.margin_B);
if (!collided)
return;
- cinfo.collided=true;
+ cinfo.collided = true;
cinfo.collisions++;
-
}
-bool CollisionSolverSW::solve_concave(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result,float p_margin_A,float p_margin_B) {
+bool CollisionSolverSW::solve_concave(const ShapeSW *p_shape_A, const Transform &p_transform_A, const ShapeSW *p_shape_B, const Transform &p_transform_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result, float p_margin_A, float p_margin_B) {
-
- const ConcaveShapeSW *concave_B=static_cast<const ConcaveShapeSW*>(p_shape_B);
+ const ConcaveShapeSW *concave_B = static_cast<const ConcaveShapeSW *>(p_shape_B);
_ConcaveCollisionInfo cinfo;
- cinfo.transform_A=&p_transform_A;
- cinfo.shape_A=p_shape_A;
- cinfo.transform_B=&p_transform_B;
- cinfo.result_callback=p_result_callback;
- cinfo.userdata=p_userdata;
- cinfo.swap_result=p_swap_result;
- cinfo.collided=false;
- cinfo.collisions=0;
- cinfo.margin_A=p_margin_A;
- cinfo.margin_B=p_margin_B;
+ cinfo.transform_A = &p_transform_A;
+ cinfo.shape_A = p_shape_A;
+ cinfo.transform_B = &p_transform_B;
+ cinfo.result_callback = p_result_callback;
+ cinfo.userdata = p_userdata;
+ cinfo.swap_result = p_swap_result;
+ cinfo.collided = false;
+ cinfo.collisions = 0;
+ cinfo.margin_A = p_margin_A;
+ cinfo.margin_B = p_margin_B;
- cinfo.aabb_tests=0;
+ cinfo.aabb_tests = 0;
Transform rel_transform = p_transform_A;
- rel_transform.origin-=p_transform_B.origin;
+ rel_transform.origin -= p_transform_B.origin;
//quickly compute a local AABB
AABB local_aabb;
- for(int i=0;i<3;i++) {
-
- Vector3 axis( p_transform_B.basis.get_axis(i) );
- float axis_scale = 1.0/axis.length();
- axis*=axis_scale;
+ for (int i = 0; i < 3; i++) {
- float smin,smax;
- p_shape_A->project_range(axis,rel_transform,smin,smax);
- smin-=p_margin_A;
- smax+=p_margin_A;
- smin*=axis_scale;
- smax*=axis_scale;
+ Vector3 axis(p_transform_B.basis.get_axis(i));
+ float axis_scale = 1.0 / axis.length();
+ axis *= axis_scale;
+ float smin, smax;
+ p_shape_A->project_range(axis, rel_transform, smin, smax);
+ smin -= p_margin_A;
+ smax += p_margin_A;
+ smin *= axis_scale;
+ smax *= axis_scale;
- local_aabb.pos[i]=smin;
- local_aabb.size[i]=smax-smin;
+ local_aabb.pos[i] = smin;
+ local_aabb.size[i] = smax - smin;
}
- concave_B->cull(local_aabb,concave_callback,&cinfo);
+ concave_B->cull(local_aabb, concave_callback, &cinfo);
//print_line("COL AABB TESTS: "+itos(cinfo.aabb_tests));
return cinfo.collided;
}
+bool CollisionSolverSW::solve_static(const ShapeSW *p_shape_A, const Transform &p_transform_A, const ShapeSW *p_shape_B, const Transform &p_transform_B, CallbackResult p_result_callback, void *p_userdata, Vector3 *r_sep_axis, float p_margin_A, float p_margin_B) {
-bool CollisionSolverSW::solve_static(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,CallbackResult p_result_callback,void *p_userdata,Vector3 *r_sep_axis,float p_margin_A,float p_margin_B) {
-
-
- PhysicsServer::ShapeType type_A=p_shape_A->get_type();
- PhysicsServer::ShapeType type_B=p_shape_B->get_type();
- bool concave_A=p_shape_A->is_concave();
- bool concave_B=p_shape_B->is_concave();
+ PhysicsServer::ShapeType type_A = p_shape_A->get_type();
+ PhysicsServer::ShapeType type_B = p_shape_B->get_type();
+ bool concave_A = p_shape_A->is_concave();
+ bool concave_B = p_shape_B->is_concave();
bool swap = false;
- if (type_A>type_B) {
- SWAP(type_A,type_B);
- SWAP(concave_A,concave_B);
- swap=true;
+ if (type_A > type_B) {
+ SWAP(type_A, type_B);
+ SWAP(concave_A, concave_B);
+ swap = true;
}
- if (type_A==PhysicsServer::SHAPE_PLANE) {
+ if (type_A == PhysicsServer::SHAPE_PLANE) {
- if (type_B==PhysicsServer::SHAPE_PLANE)
+ if (type_B == PhysicsServer::SHAPE_PLANE)
return false;
- if (type_B==PhysicsServer::SHAPE_RAY) {
+ if (type_B == PhysicsServer::SHAPE_RAY) {
return false;
}
if (swap) {
- return solve_static_plane(p_shape_B,p_transform_B,p_shape_A,p_transform_A,p_result_callback,p_userdata,true);
+ return solve_static_plane(p_shape_B, p_transform_B, p_shape_A, p_transform_A, p_result_callback, p_userdata, true);
} else {
- return solve_static_plane(p_shape_A,p_transform_A,p_shape_B,p_transform_B,p_result_callback,p_userdata,false);
+ return solve_static_plane(p_shape_A, p_transform_A, p_shape_B, p_transform_B, p_result_callback, p_userdata, false);
}
- } else if (type_A==PhysicsServer::SHAPE_RAY) {
+ } else if (type_A == PhysicsServer::SHAPE_RAY) {
- if (type_B==PhysicsServer::SHAPE_RAY)
+ if (type_B == PhysicsServer::SHAPE_RAY)
return false;
if (swap) {
- return solve_ray(p_shape_B,p_transform_B,p_shape_A,p_transform_A,p_result_callback,p_userdata,true);
+ return solve_ray(p_shape_B, p_transform_B, p_shape_A, p_transform_A, p_result_callback, p_userdata, true);
} else {
- return solve_ray(p_shape_A,p_transform_A,p_shape_B,p_transform_B,p_result_callback,p_userdata,false);
+ return solve_ray(p_shape_A, p_transform_A, p_shape_B, p_transform_B, p_result_callback, p_userdata, false);
}
} else if (concave_B) {
-
if (concave_A)
return false;
if (!swap)
- return solve_concave(p_shape_A,p_transform_A,p_shape_B,p_transform_B,p_result_callback,p_userdata,false,p_margin_A,p_margin_B);
+ return solve_concave(p_shape_A, p_transform_A, p_shape_B, p_transform_B, p_result_callback, p_userdata, false, p_margin_A, p_margin_B);
else
- return solve_concave(p_shape_B,p_transform_B,p_shape_A,p_transform_A,p_result_callback,p_userdata,true,p_margin_A,p_margin_B);
-
-
+ return solve_concave(p_shape_B, p_transform_B, p_shape_A, p_transform_A, p_result_callback, p_userdata, true, p_margin_A, p_margin_B);
} else {
- return collision_solver(p_shape_A, p_transform_A, p_shape_B, p_transform_B, p_result_callback,p_userdata,false,r_sep_axis,p_margin_A,p_margin_B);
+ return collision_solver(p_shape_A, p_transform_A, p_shape_B, p_transform_B, p_result_callback, p_userdata, false, r_sep_axis, p_margin_A, p_margin_B);
}
-
return false;
}
-
void CollisionSolverSW::concave_distance_callback(void *p_userdata, ShapeSW *p_convex) {
-
- _ConcaveCollisionInfo &cinfo = *(_ConcaveCollisionInfo*)(p_userdata);
+ _ConcaveCollisionInfo &cinfo = *(_ConcaveCollisionInfo *)(p_userdata);
cinfo.aabb_tests++;
if (cinfo.collided)
return;
- Vector3 close_A,close_B;
- cinfo.collided = !gjk_epa_calculate_distance(cinfo.shape_A,*cinfo.transform_A,p_convex,*cinfo.transform_B,close_A,close_B);
+ Vector3 close_A, close_B;
+ cinfo.collided = !gjk_epa_calculate_distance(cinfo.shape_A, *cinfo.transform_A, p_convex, *cinfo.transform_B, close_A, close_B);
if (cinfo.collided)
return;
if (!cinfo.tested || close_A.distance_squared_to(close_B) < cinfo.close_A.distance_squared_to(cinfo.close_B)) {
- cinfo.close_A=close_A;
- cinfo.close_B=close_B;
- cinfo.tested=true;
+ cinfo.close_A = close_A;
+ cinfo.close_B = close_B;
+ cinfo.tested = true;
}
cinfo.collisions++;
-
}
+bool CollisionSolverSW::solve_distance_plane(const ShapeSW *p_shape_A, const Transform &p_transform_A, const ShapeSW *p_shape_B, const Transform &p_transform_B, Vector3 &r_point_A, Vector3 &r_point_B) {
-
-bool CollisionSolverSW::solve_distance_plane(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,Vector3& r_point_A,Vector3& r_point_B) {
-
- const PlaneShapeSW *plane = static_cast<const PlaneShapeSW*>(p_shape_A);
- if (p_shape_B->get_type()==PhysicsServer::SHAPE_PLANE)
+ const PlaneShapeSW *plane = static_cast<const PlaneShapeSW *>(p_shape_A);
+ if (p_shape_B->get_type() == PhysicsServer::SHAPE_PLANE)
return false;
Plane p = p_transform_A.xform(plane->get_plane());
@@ -287,43 +266,41 @@ bool CollisionSolverSW::solve_distance_plane(const ShapeSW *p_shape_A,const Tran
Vector3 supports[max_supports];
int support_count;
- p_shape_B->get_supports(p_transform_B.basis.xform_inv(-p.normal).normalized(),max_supports,supports,support_count);
+ p_shape_B->get_supports(p_transform_B.basis.xform_inv(-p.normal).normalized(), max_supports, supports, support_count);
- bool collided=false;
+ bool collided = false;
Vector3 closest;
float closest_d;
+ for (int i = 0; i < support_count; i++) {
- for(int i=0;i<support_count;i++) {
-
- supports[i] = p_transform_B.xform( supports[i] );
+ supports[i] = p_transform_B.xform(supports[i]);
real_t d = p.distance_to(supports[i]);
- if (i==0 || d<closest_d) {
- closest=supports[i];
- closest_d=d;
- if (d<=0)
- collided=true;
+ if (i == 0 || d < closest_d) {
+ closest = supports[i];
+ closest_d = d;
+ if (d <= 0)
+ collided = true;
}
-
}
- r_point_A=p.project(closest);
- r_point_B=closest;
+ r_point_A = p.project(closest);
+ r_point_B = closest;
return collided;
}
-bool CollisionSolverSW::solve_distance(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,Vector3& r_point_A,Vector3& r_point_B,const AABB& p_concave_hint,Vector3 *r_sep_axis) {
+bool CollisionSolverSW::solve_distance(const ShapeSW *p_shape_A, const Transform &p_transform_A, const ShapeSW *p_shape_B, const Transform &p_transform_B, Vector3 &r_point_A, Vector3 &r_point_B, const AABB &p_concave_hint, Vector3 *r_sep_axis) {
if (p_shape_A->is_concave())
return false;
- if (p_shape_B->get_type()==PhysicsServer::SHAPE_PLANE) {
+ if (p_shape_B->get_type() == PhysicsServer::SHAPE_PLANE) {
- Vector3 a,b;
- bool col = solve_distance_plane(p_shape_B,p_transform_B,p_shape_A,p_transform_A,a,b);
- r_point_A=b;
- r_point_B=a;
+ Vector3 a, b;
+ bool col = solve_distance_plane(p_shape_B, p_transform_B, p_shape_A, p_transform_A, a, b);
+ r_point_A = b;
+ r_point_B = a;
return !col;
} else if (p_shape_B->is_concave()) {
@@ -331,62 +308,59 @@ bool CollisionSolverSW::solve_distance(const ShapeSW *p_shape_A,const Transform&
if (p_shape_A->is_concave())
return false;
-
- const ConcaveShapeSW *concave_B=static_cast<const ConcaveShapeSW*>(p_shape_B);
+ const ConcaveShapeSW *concave_B = static_cast<const ConcaveShapeSW *>(p_shape_B);
_ConcaveCollisionInfo cinfo;
- cinfo.transform_A=&p_transform_A;
- cinfo.shape_A=p_shape_A;
- cinfo.transform_B=&p_transform_B;
- cinfo.result_callback=NULL;
- cinfo.userdata=NULL;
- cinfo.swap_result=false;
- cinfo.collided=false;
- cinfo.collisions=0;
- cinfo.aabb_tests=0;
- cinfo.tested=false;
+ cinfo.transform_A = &p_transform_A;
+ cinfo.shape_A = p_shape_A;
+ cinfo.transform_B = &p_transform_B;
+ cinfo.result_callback = NULL;
+ cinfo.userdata = NULL;
+ cinfo.swap_result = false;
+ cinfo.collided = false;
+ cinfo.collisions = 0;
+ cinfo.aabb_tests = 0;
+ cinfo.tested = false;
Transform rel_transform = p_transform_A;
- rel_transform.origin-=p_transform_B.origin;
+ rel_transform.origin -= p_transform_B.origin;
//quickly compute a local AABB
- bool use_cc_hint=p_concave_hint!=AABB();
+ bool use_cc_hint = p_concave_hint != AABB();
AABB cc_hint_aabb;
if (use_cc_hint) {
- cc_hint_aabb=p_concave_hint;
- cc_hint_aabb.pos-=p_transform_B.origin;
+ cc_hint_aabb = p_concave_hint;
+ cc_hint_aabb.pos -= p_transform_B.origin;
}
AABB local_aabb;
- for(int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
- Vector3 axis( p_transform_B.basis.get_axis(i) );
- float axis_scale = 1.0/axis.length();
- axis*=axis_scale;
+ Vector3 axis(p_transform_B.basis.get_axis(i));
+ float axis_scale = 1.0 / axis.length();
+ axis *= axis_scale;
- float smin,smax;
+ float smin, smax;
- if (use_cc_hint) {
- cc_hint_aabb.project_range_in_plane(Plane(axis,0),smin,smax);
- } else {
- p_shape_A->project_range(axis,rel_transform,smin,smax);
- }
+ if (use_cc_hint) {
+ cc_hint_aabb.project_range_in_plane(Plane(axis, 0), smin, smax);
+ } else {
+ p_shape_A->project_range(axis, rel_transform, smin, smax);
+ }
- smin*=axis_scale;
- smax*=axis_scale;
+ smin *= axis_scale;
+ smax *= axis_scale;
- local_aabb.pos[i]=smin;
- local_aabb.size[i]=smax-smin;
+ local_aabb.pos[i] = smin;
+ local_aabb.size[i] = smax - smin;
}
-
- concave_B->cull(local_aabb,concave_distance_callback,&cinfo);
+ concave_B->cull(local_aabb, concave_distance_callback, &cinfo);
if (!cinfo.collided) {
-// print_line(itos(cinfo.tested));
- r_point_A=cinfo.close_A;
- r_point_B=cinfo.close_B;
-
+ // print_line(itos(cinfo.tested));
+ r_point_A = cinfo.close_A;
+ r_point_B = cinfo.close_B;
}
//print_line("DIST AABB TESTS: "+itos(cinfo.aabb_tests));
@@ -394,10 +368,8 @@ bool CollisionSolverSW::solve_distance(const ShapeSW *p_shape_A,const Transform&
return !cinfo.collided;
} else {
- return gjk_epa_calculate_distance(p_shape_A,p_transform_A,p_shape_B,p_transform_B,r_point_A,r_point_B); //should pass sepaxis..
+ return gjk_epa_calculate_distance(p_shape_A, p_transform_A, p_shape_B, p_transform_B, r_point_A, r_point_B); //should pass sepaxis..
}
-
return false;
}
-
diff --git a/servers/physics/collision_solver_sw.h b/servers/physics/collision_solver_sw.h
index 82ac77f73..8ff3b69ff 100644
--- a/servers/physics/collision_solver_sw.h
+++ b/servers/physics/collision_solver_sw.h
@@ -31,25 +31,21 @@
#include "shape_sw.h"
-class CollisionSolverSW
-{
+class CollisionSolverSW {
public:
- typedef void (*CallbackResult)(const Vector3& p_point_A,const Vector3& p_point_B,void *p_userdata);
-private:
+ typedef void (*CallbackResult)(const Vector3 &p_point_A, const Vector3 &p_point_B, void *p_userdata);
+private:
static void concave_callback(void *p_userdata, ShapeSW *p_convex);
- static bool solve_static_plane(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result);
- static bool solve_ray(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result);
- static bool solve_concave(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result,float p_margin_A=0,float p_margin_B=0);
+ static bool solve_static_plane(const ShapeSW *p_shape_A, const Transform &p_transform_A, const ShapeSW *p_shape_B, const Transform &p_transform_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result);
+ static bool solve_ray(const ShapeSW *p_shape_A, const Transform &p_transform_A, const ShapeSW *p_shape_B, const Transform &p_transform_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result);
+ static bool solve_concave(const ShapeSW *p_shape_A, const Transform &p_transform_A, const ShapeSW *p_shape_B, const Transform &p_transform_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result, float p_margin_A = 0, float p_margin_B = 0);
static void concave_distance_callback(void *p_userdata, ShapeSW *p_convex);
- static bool solve_distance_plane(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,Vector3& r_point_A,Vector3& r_point_B);
+ static bool solve_distance_plane(const ShapeSW *p_shape_A, const Transform &p_transform_A, const ShapeSW *p_shape_B, const Transform &p_transform_B, Vector3 &r_point_A, Vector3 &r_point_B);
public:
-
-
- static bool solve_static(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,CallbackResult p_result_callback,void *p_userdata,Vector3 *r_sep_axis=NULL,float p_margin_A=0,float p_margin_B=0);
- static bool solve_distance(const ShapeSW *p_shape_A,const Transform& p_transform_A,const ShapeSW *p_shape_B,const Transform& p_transform_B,Vector3& r_point_A,Vector3& r_point_B,const AABB& p_concave_hint,Vector3 *r_sep_axis=NULL);
-
+ static bool solve_static(const ShapeSW *p_shape_A, const Transform &p_transform_A, const ShapeSW *p_shape_B, const Transform &p_transform_B, CallbackResult p_result_callback, void *p_userdata, Vector3 *r_sep_axis = NULL, float p_margin_A = 0, float p_margin_B = 0);
+ static bool solve_distance(const ShapeSW *p_shape_A, const Transform &p_transform_A, const ShapeSW *p_shape_B, const Transform &p_transform_B, Vector3 &r_point_A, Vector3 &r_point_B, const AABB &p_concave_hint, Vector3 *r_sep_axis = NULL);
};
#endif // COLLISION_SOLVER__SW_H
diff --git a/servers/physics/constraint_sw.h b/servers/physics/constraint_sw.h
index e178de441..56a738440 100644
--- a/servers/physics/constraint_sw.h
+++ b/servers/physics/constraint_sw.h
@@ -40,35 +40,37 @@ class ConstraintSW {
ConstraintSW *island_list_next;
int priority;
-
RID self;
protected:
- ConstraintSW(BodySW **p_body_ptr=NULL,int p_body_count=0) { _body_ptr=p_body_ptr; _body_count=p_body_count; island_step=0; priority=1; }
-public:
+ ConstraintSW(BodySW **p_body_ptr = NULL, int p_body_count = 0) {
+ _body_ptr = p_body_ptr;
+ _body_count = p_body_count;
+ island_step = 0;
+ priority = 1;
+ }
- _FORCE_INLINE_ void set_self(const RID& p_self) { self=p_self; }
+public:
+ _FORCE_INLINE_ void set_self(const RID &p_self) { self = p_self; }
_FORCE_INLINE_ RID get_self() const { return self; }
_FORCE_INLINE_ uint64_t get_island_step() const { return island_step; }
- _FORCE_INLINE_ void set_island_step(uint64_t p_step) { island_step=p_step; }
+ _FORCE_INLINE_ void set_island_step(uint64_t p_step) { island_step = p_step; }
+ _FORCE_INLINE_ ConstraintSW *get_island_next() const { return island_next; }
+ _FORCE_INLINE_ void set_island_next(ConstraintSW *p_next) { island_next = p_next; }
- _FORCE_INLINE_ ConstraintSW* get_island_next() const { return island_next; }
- _FORCE_INLINE_ void set_island_next(ConstraintSW* p_next) { island_next=p_next; }
-
- _FORCE_INLINE_ ConstraintSW* get_island_list_next() const { return island_list_next; }
- _FORCE_INLINE_ void set_island_list_next(ConstraintSW* p_next) { island_list_next=p_next; }
+ _FORCE_INLINE_ ConstraintSW *get_island_list_next() const { return island_list_next; }
+ _FORCE_INLINE_ void set_island_list_next(ConstraintSW *p_next) { island_list_next = p_next; }
_FORCE_INLINE_ BodySW **get_body_ptr() const { return _body_ptr; }
_FORCE_INLINE_ int get_body_count() const { return _body_count; }
- _FORCE_INLINE_ void set_priority(int p_priority) { priority=p_priority; }
+ _FORCE_INLINE_ void set_priority(int p_priority) { priority = p_priority; }
_FORCE_INLINE_ int get_priority() const { return priority; }
-
- virtual bool setup(float p_step)=0;
- virtual void solve(float p_step)=0;
+ virtual bool setup(float p_step) = 0;
+ virtual void solve(float p_step) = 0;
virtual ~ConstraintSW() {}
};
diff --git a/servers/physics/gjk_epa.cpp b/servers/physics/gjk_epa.cpp
index 92ca5ea8d..980ef1763 100644
--- a/servers/physics/gjk_epa.cpp
+++ b/servers/physics/gjk_epa.cpp
@@ -30,471 +30,434 @@
/*************** Bullet's GJK-EPA2 IMPLEMENTATION *******************/
- // Config
+// Config
/* GJK */
-#define GJK_MAX_ITERATIONS 128
-#define GJK_ACCURARY ((real_t)0.0001)
-#define GJK_MIN_DISTANCE ((real_t)0.0001)
-#define GJK_DUPLICATED_EPS ((real_t)0.0001)
-#define GJK_SIMPLEX2_EPS ((real_t)0.0)
-#define GJK_SIMPLEX3_EPS ((real_t)0.0)
-#define GJK_SIMPLEX4_EPS ((real_t)0.0)
+#define GJK_MAX_ITERATIONS 128
+#define GJK_ACCURARY ((real_t)0.0001)
+#define GJK_MIN_DISTANCE ((real_t)0.0001)
+#define GJK_DUPLICATED_EPS ((real_t)0.0001)
+#define GJK_SIMPLEX2_EPS ((real_t)0.0)
+#define GJK_SIMPLEX3_EPS ((real_t)0.0)
+#define GJK_SIMPLEX4_EPS ((real_t)0.0)
/* EPA */
-#define EPA_MAX_VERTICES 64
-#define EPA_MAX_FACES (EPA_MAX_VERTICES*2)
-#define EPA_MAX_ITERATIONS 255
-#define EPA_ACCURACY ((real_t)0.0001)
-#define EPA_FALLBACK (10*EPA_ACCURACY)
-#define EPA_PLANE_EPS ((real_t)0.00001)
-#define EPA_INSIDE_EPS ((real_t)0.01)
+#define EPA_MAX_VERTICES 64
+#define EPA_MAX_FACES (EPA_MAX_VERTICES * 2)
+#define EPA_MAX_ITERATIONS 255
+#define EPA_ACCURACY ((real_t)0.0001)
+#define EPA_FALLBACK (10 * EPA_ACCURACY)
+#define EPA_PLANE_EPS ((real_t)0.00001)
+#define EPA_INSIDE_EPS ((real_t)0.01)
namespace GjkEpa2 {
-
-struct sResults {
+struct sResults {
enum eStatus {
- Separated, /* Shapes doesnt penetrate */
- Penetrating, /* Shapes are penetrating */
- GJK_Failed, /* GJK phase fail, no big issue, shapes are probably just 'touching' */
+ Separated, /* Shapes doesnt penetrate */
+ Penetrating, /* Shapes are penetrating */
+ GJK_Failed, /* GJK phase fail, no big issue, shapes are probably just 'touching' */
EPA_Failed /* EPA phase fail, bigger problem, need to save parameters, and debug */
} status;
- Vector3 witnesses[2];
- Vector3 normal;
- real_t distance;
+ Vector3 witnesses[2];
+ Vector3 normal;
+ real_t distance;
};
// Shorthands
-typedef unsigned int U;
-typedef unsigned char U1;
+typedef unsigned int U;
+typedef unsigned char U1;
// MinkowskiDiff
-struct MinkowskiDiff {
+struct MinkowskiDiff {
- const ShapeSW* m_shapes[2];
+ const ShapeSW *m_shapes[2];
Transform transform_A;
Transform transform_B;
// i wonder how this could be sped up... if it can
- _FORCE_INLINE_ Vector3 Support0 ( const Vector3& d ) const {
- return transform_A.xform( m_shapes[0]->get_support( transform_A.basis.xform_inv(d).normalized() ) );
+ _FORCE_INLINE_ Vector3 Support0(const Vector3 &d) const {
+ return transform_A.xform(m_shapes[0]->get_support(transform_A.basis.xform_inv(d).normalized()));
}
- _FORCE_INLINE_ Vector3 Support1 ( const Vector3& d ) const {
- return transform_B.xform( m_shapes[1]->get_support( transform_B.basis.xform_inv(d).normalized() ) );
+ _FORCE_INLINE_ Vector3 Support1(const Vector3 &d) const {
+ return transform_B.xform(m_shapes[1]->get_support(transform_B.basis.xform_inv(d).normalized()));
}
- _FORCE_INLINE_ Vector3 Support ( const Vector3& d ) const {
- return ( Support0 ( d )-Support1 ( -d ) );
+ _FORCE_INLINE_ Vector3 Support(const Vector3 &d) const {
+ return (Support0(d) - Support1(-d));
}
- _FORCE_INLINE_ Vector3 Support ( const Vector3& d,U index ) const
- {
- if ( index )
- return ( Support1 ( d ) );
+ _FORCE_INLINE_ Vector3 Support(const Vector3 &d, U index) const {
+ if (index)
+ return (Support1(d));
else
- return ( Support0 ( d ) );
+ return (Support0(d));
}
};
-typedef MinkowskiDiff tShape;
-
+typedef MinkowskiDiff tShape;
// GJK
-struct GJK
-{
+struct GJK {
/* Types */
- struct sSV
- {
- Vector3 d,w;
+ struct sSV {
+ Vector3 d, w;
};
- struct sSimplex
- {
- sSV* c[4];
- real_t p[4];
- U rank;
+ struct sSimplex {
+ sSV *c[4];
+ real_t p[4];
+ U rank;
};
- struct eStatus { enum _ {
- Valid,
- Inside,
- Failed };};
- /* Fields */
- tShape m_shape;
- Vector3 m_ray;
- real_t m_distance;
- sSimplex m_simplices[2];
- sSV m_store[4];
- sSV* m_free[4];
- U m_nfree;
- U m_current;
- sSimplex* m_simplex;
- eStatus::_ m_status;
- /* Methods */
- GJK()
- {
- Initialize();
- }
- void Initialize()
- {
- m_ray = Vector3(0,0,0);
- m_nfree = 0;
- m_status = eStatus::Failed;
- m_current = 0;
- m_distance = 0;
- }
- eStatus::_ Evaluate(const tShape& shapearg,const Vector3& guess)
- {
- U iterations=0;
- real_t sqdist=0;
- real_t alpha=0;
- Vector3 lastw[4];
- U clastw=0;
- /* Initialize solver */
- m_free[0] = &m_store[0];
- m_free[1] = &m_store[1];
- m_free[2] = &m_store[2];
- m_free[3] = &m_store[3];
- m_nfree = 4;
- m_current = 0;
- m_status = eStatus::Valid;
- m_shape = shapearg;
- m_distance = 0;
- /* Initialize simplex */
- m_simplices[0].rank = 0;
- m_ray = guess;
- const real_t sqrl= m_ray.length_squared();
- appendvertice(m_simplices[0],sqrl>0?-m_ray:Vector3(1,0,0));
- m_simplices[0].p[0] = 1;
- m_ray = m_simplices[0].c[0]->w;
- sqdist = sqrl;
- lastw[0] =
- lastw[1] =
- lastw[2] =
- lastw[3] = m_ray;
- /* Loop */
- do {
- const U next=1-m_current;
- sSimplex& cs=m_simplices[m_current];
- sSimplex& ns=m_simplices[next];
- /* Check zero */
- const real_t rl=m_ray.length();
- if(rl<GJK_MIN_DISTANCE)
- {/* Touching or inside */
- m_status=eStatus::Inside;
- break;
- }
- /* Append new vertice in -'v' direction */
- appendvertice(cs,-m_ray);
- const Vector3& w=cs.c[cs.rank-1]->w;
- bool found=false;
- for(U i=0;i<4;++i)
- {
- if((w-lastw[i]).length_squared()<GJK_DUPLICATED_EPS)
- { found=true;break; }
- }
- if(found)
- {/* Return old simplex */
- removevertice(m_simplices[m_current]);
- break;
- }
- else
- {/* Update lastw */
- lastw[clastw=(clastw+1)&3]=w;
- }
- /* Check for termination */
- const real_t omega=vec3_dot(m_ray,w)/rl;
- alpha=MAX(omega,alpha);
- if(((rl-alpha)-(GJK_ACCURARY*rl))<=0)
- {/* Return old simplex */
- removevertice(m_simplices[m_current]);
+ struct eStatus {
+ enum _ {
+ Valid,
+ Inside,
+ Failed
+ };
+ };
+ /* Fields */
+ tShape m_shape;
+ Vector3 m_ray;
+ real_t m_distance;
+ sSimplex m_simplices[2];
+ sSV m_store[4];
+ sSV *m_free[4];
+ U m_nfree;
+ U m_current;
+ sSimplex *m_simplex;
+ eStatus::_ m_status;
+ /* Methods */
+ GJK() {
+ Initialize();
+ }
+ void Initialize() {
+ m_ray = Vector3(0, 0, 0);
+ m_nfree = 0;
+ m_status = eStatus::Failed;
+ m_current = 0;
+ m_distance = 0;
+ }
+ eStatus::_ Evaluate(const tShape &shapearg, const Vector3 &guess) {
+ U iterations = 0;
+ real_t sqdist = 0;
+ real_t alpha = 0;
+ Vector3 lastw[4];
+ U clastw = 0;
+ /* Initialize solver */
+ m_free[0] = &m_store[0];
+ m_free[1] = &m_store[1];
+ m_free[2] = &m_store[2];
+ m_free[3] = &m_store[3];
+ m_nfree = 4;
+ m_current = 0;
+ m_status = eStatus::Valid;
+ m_shape = shapearg;
+ m_distance = 0;
+ /* Initialize simplex */
+ m_simplices[0].rank = 0;
+ m_ray = guess;
+ const real_t sqrl = m_ray.length_squared();
+ appendvertice(m_simplices[0], sqrl > 0 ? -m_ray : Vector3(1, 0, 0));
+ m_simplices[0].p[0] = 1;
+ m_ray = m_simplices[0].c[0]->w;
+ sqdist = sqrl;
+ lastw[0] =
+ lastw[1] =
+ lastw[2] =
+ lastw[3] = m_ray;
+ /* Loop */
+ do {
+ const U next = 1 - m_current;
+ sSimplex &cs = m_simplices[m_current];
+ sSimplex &ns = m_simplices[next];
+ /* Check zero */
+ const real_t rl = m_ray.length();
+ if (rl < GJK_MIN_DISTANCE) { /* Touching or inside */
+ m_status = eStatus::Inside;
+ break;
+ }
+ /* Append new vertice in -'v' direction */
+ appendvertice(cs, -m_ray);
+ const Vector3 &w = cs.c[cs.rank - 1]->w;
+ bool found = false;
+ for (U i = 0; i < 4; ++i) {
+ if ((w - lastw[i]).length_squared() < GJK_DUPLICATED_EPS) {
+ found = true;
break;
}
- /* Reduce simplex */
- real_t weights[4];
- U mask=0;
- switch(cs.rank)
- {
- case 2: sqdist=projectorigin( cs.c[0]->w,
+ }
+ if (found) { /* Return old simplex */
+ removevertice(m_simplices[m_current]);
+ break;
+ } else { /* Update lastw */
+ lastw[clastw = (clastw + 1) & 3] = w;
+ }
+ /* Check for termination */
+ const real_t omega = vec3_dot(m_ray, w) / rl;
+ alpha = MAX(omega, alpha);
+ if (((rl - alpha) - (GJK_ACCURARY * rl)) <= 0) { /* Return old simplex */
+ removevertice(m_simplices[m_current]);
+ break;
+ }
+ /* Reduce simplex */
+ real_t weights[4];
+ U mask = 0;
+ switch (cs.rank) {
+ case 2: sqdist = projectorigin(cs.c[0]->w,
cs.c[1]->w,
- weights,mask);break;
- case 3: sqdist=projectorigin( cs.c[0]->w,
+ weights, mask);
+ break;
+ case 3: sqdist = projectorigin(cs.c[0]->w,
cs.c[1]->w,
cs.c[2]->w,
- weights,mask);break;
- case 4: sqdist=projectorigin( cs.c[0]->w,
+ weights, mask);
+ break;
+ case 4: sqdist = projectorigin(cs.c[0]->w,
cs.c[1]->w,
cs.c[2]->w,
cs.c[3]->w,
- weights,mask);break;
- }
- if(sqdist>=0)
- {/* Valid */
- ns.rank = 0;
- m_ray = Vector3(0,0,0);
- m_current = next;
- for(U i=0,ni=cs.rank;i<ni;++i)
- {
- if(mask&(1<<i))
- {
- ns.c[ns.rank] = cs.c[i];
- ns.p[ns.rank++] = weights[i];
- m_ray += cs.c[i]->w*weights[i];
- }
- else
- {
- m_free[m_nfree++] = cs.c[i];
- }
- }
- if(mask==15) m_status=eStatus::Inside;
- }
- else
- {/* Return old simplex */
- removevertice(m_simplices[m_current]);
- break;
- }
- m_status=((++iterations)<GJK_MAX_ITERATIONS)?m_status:eStatus::Failed;
- } while(m_status==eStatus::Valid);
- m_simplex=&m_simplices[m_current];
- switch(m_status)
- {
- case eStatus::Valid: m_distance=m_ray.length();break;
- case eStatus::Inside: m_distance=0;break;
- default: {}
+ weights, mask);
+ break;
}
- return(m_status);
- }
- bool EncloseOrigin()
- {
- switch(m_simplex->rank)
- {
- case 1:
- {
- for(U i=0;i<3;++i)
- {
- Vector3 axis=Vector3(0,0,0);
- axis[i]=1;
- appendvertice(*m_simplex, axis);
- if(EncloseOrigin()) return(true);
- removevertice(*m_simplex);
- appendvertice(*m_simplex,-axis);
- if(EncloseOrigin()) return(true);
- removevertice(*m_simplex);
+ if (sqdist >= 0) { /* Valid */
+ ns.rank = 0;
+ m_ray = Vector3(0, 0, 0);
+ m_current = next;
+ for (U i = 0, ni = cs.rank; i < ni; ++i) {
+ if (mask & (1 << i)) {
+ ns.c[ns.rank] = cs.c[i];
+ ns.p[ns.rank++] = weights[i];
+ m_ray += cs.c[i]->w * weights[i];
+ } else {
+ m_free[m_nfree++] = cs.c[i];
}
}
+ if (mask == 15) m_status = eStatus::Inside;
+ } else { /* Return old simplex */
+ removevertice(m_simplices[m_current]);
break;
- case 2:
- {
- const Vector3 d=m_simplex->c[1]->w-m_simplex->c[0]->w;
- for(U i=0;i<3;++i)
- {
- Vector3 axis=Vector3(0,0,0);
- axis[i]=1;
- const Vector3 p=vec3_cross(d,axis);
- if(p.length_squared()>0)
- {
- appendvertice(*m_simplex, p);
- if(EncloseOrigin()) return(true);
- removevertice(*m_simplex);
- appendvertice(*m_simplex,-p);
- if(EncloseOrigin()) return(true);
- removevertice(*m_simplex);
- }
- }
+ }
+ m_status = ((++iterations) < GJK_MAX_ITERATIONS) ? m_status : eStatus::Failed;
+ } while (m_status == eStatus::Valid);
+ m_simplex = &m_simplices[m_current];
+ switch (m_status) {
+ case eStatus::Valid: m_distance = m_ray.length(); break;
+ case eStatus::Inside: m_distance = 0; break;
+ default: {}
+ }
+ return (m_status);
+ }
+ bool EncloseOrigin() {
+ switch (m_simplex->rank) {
+ case 1: {
+ for (U i = 0; i < 3; ++i) {
+ Vector3 axis = Vector3(0, 0, 0);
+ axis[i] = 1;
+ appendvertice(*m_simplex, axis);
+ if (EncloseOrigin()) return (true);
+ removevertice(*m_simplex);
+ appendvertice(*m_simplex, -axis);
+ if (EncloseOrigin()) return (true);
+ removevertice(*m_simplex);
}
- break;
- case 3:
- {
- const Vector3 n=vec3_cross(m_simplex->c[1]->w-m_simplex->c[0]->w,
- m_simplex->c[2]->w-m_simplex->c[0]->w);
- if(n.length_squared()>0)
- {
- appendvertice(*m_simplex,n);
- if(EncloseOrigin()) return(true);
+ } break;
+ case 2: {
+ const Vector3 d = m_simplex->c[1]->w - m_simplex->c[0]->w;
+ for (U i = 0; i < 3; ++i) {
+ Vector3 axis = Vector3(0, 0, 0);
+ axis[i] = 1;
+ const Vector3 p = vec3_cross(d, axis);
+ if (p.length_squared() > 0) {
+ appendvertice(*m_simplex, p);
+ if (EncloseOrigin()) return (true);
removevertice(*m_simplex);
- appendvertice(*m_simplex,-n);
- if(EncloseOrigin()) return(true);
+ appendvertice(*m_simplex, -p);
+ if (EncloseOrigin()) return (true);
removevertice(*m_simplex);
}
}
- break;
- case 4:
- {
- if(Math::abs(det( m_simplex->c[0]->w-m_simplex->c[3]->w,
- m_simplex->c[1]->w-m_simplex->c[3]->w,
- m_simplex->c[2]->w-m_simplex->c[3]->w))>0)
- return(true);
+ } break;
+ case 3: {
+ const Vector3 n = vec3_cross(m_simplex->c[1]->w - m_simplex->c[0]->w,
+ m_simplex->c[2]->w - m_simplex->c[0]->w);
+ if (n.length_squared() > 0) {
+ appendvertice(*m_simplex, n);
+ if (EncloseOrigin()) return (true);
+ removevertice(*m_simplex);
+ appendvertice(*m_simplex, -n);
+ if (EncloseOrigin()) return (true);
+ removevertice(*m_simplex);
}
- break;
- }
- return(false);
- }
- /* Internals */
- void getsupport(const Vector3& d,sSV& sv) const
- {
- sv.d = d/d.length();
- sv.w = m_shape.Support(sv.d);
- }
- void removevertice(sSimplex& simplex)
- {
- m_free[m_nfree++]=simplex.c[--simplex.rank];
- }
- void appendvertice(sSimplex& simplex,const Vector3& v)
- {
- simplex.p[simplex.rank]=0;
- simplex.c[simplex.rank]=m_free[--m_nfree];
- getsupport(v,*simplex.c[simplex.rank++]);
+ } break;
+ case 4: {
+ if (Math::abs(det(m_simplex->c[0]->w - m_simplex->c[3]->w,
+ m_simplex->c[1]->w - m_simplex->c[3]->w,
+ m_simplex->c[2]->w - m_simplex->c[3]->w)) > 0)
+ return (true);
+ } break;
}
- static real_t det(const Vector3& a,const Vector3& b,const Vector3& c)
- {
- return( a.y*b.z*c.x+a.z*b.x*c.y-
- a.x*b.z*c.y-a.y*b.x*c.z+
- a.x*b.y*c.z-a.z*b.y*c.x);
- }
- static real_t projectorigin( const Vector3& a,
- const Vector3& b,
- real_t* w,U& m)
- {
- const Vector3 d=b-a;
- const real_t l=d.length_squared();
- if(l>GJK_SIMPLEX2_EPS)
- {
- const real_t t(l>0?-vec3_dot(a,d)/l:0);
- if(t>=1) { w[0]=0;w[1]=1;m=2;return(b.length_squared()); }
- else if(t<=0) { w[0]=1;w[1]=0;m=1;return(a.length_squared()); }
- else { w[0]=1-(w[1]=t);m=3;return((a+d*t).length_squared()); }
+ return (false);
+ }
+ /* Internals */
+ void getsupport(const Vector3 &d, sSV &sv) const {
+ sv.d = d / d.length();
+ sv.w = m_shape.Support(sv.d);
+ }
+ void removevertice(sSimplex &simplex) {
+ m_free[m_nfree++] = simplex.c[--simplex.rank];
+ }
+ void appendvertice(sSimplex &simplex, const Vector3 &v) {
+ simplex.p[simplex.rank] = 0;
+ simplex.c[simplex.rank] = m_free[--m_nfree];
+ getsupport(v, *simplex.c[simplex.rank++]);
+ }
+ static real_t det(const Vector3 &a, const Vector3 &b, const Vector3 &c) {
+ return (a.y * b.z * c.x + a.z * b.x * c.y -
+ a.x * b.z * c.y - a.y * b.x * c.z +
+ a.x * b.y * c.z - a.z * b.y * c.x);
+ }
+ static real_t projectorigin(const Vector3 &a,
+ const Vector3 &b,
+ real_t *w, U &m) {
+ const Vector3 d = b - a;
+ const real_t l = d.length_squared();
+ if (l > GJK_SIMPLEX2_EPS) {
+ const real_t t(l > 0 ? -vec3_dot(a, d) / l : 0);
+ if (t >= 1) {
+ w[0] = 0;
+ w[1] = 1;
+ m = 2;
+ return (b.length_squared());
+ } else if (t <= 0) {
+ w[0] = 1;
+ w[1] = 0;
+ m = 1;
+ return (a.length_squared());
+ } else {
+ w[0] = 1 - (w[1] = t);
+ m = 3;
+ return ((a + d * t).length_squared());
}
- return(-1);
}
- static real_t projectorigin( const Vector3& a,
- const Vector3& b,
- const Vector3& c,
- real_t* w,U& m)
- {
- static const U imd3[]={1,2,0};
- const Vector3* vt[]={&a,&b,&c};
- const Vector3 dl[]={a-b,b-c,c-a};
- const Vector3 n=vec3_cross(dl[0],dl[1]);
- const real_t l=n.length_squared();
- if(l>GJK_SIMPLEX3_EPS)
- {
- real_t mindist=-1;
- real_t subw[2];
- U subm;
- for(U i=0;i<3;++i)
- {
- if(vec3_dot(*vt[i],vec3_cross(dl[i],n))>0)
- {
- const U j=imd3[i];
- const real_t subd(projectorigin(*vt[i],*vt[j],subw,subm));
- if((mindist<0)||(subd<mindist))
- {
- mindist = subd;
- m = static_cast<U>(((subm&1)?1<<i:0)+((subm&2)?1<<j:0));
- w[i] = subw[0];
- w[j] = subw[1];
- w[imd3[j]] = 0;
- }
+ return (-1);
+ }
+ static real_t projectorigin(const Vector3 &a,
+ const Vector3 &b,
+ const Vector3 &c,
+ real_t *w, U &m) {
+ static const U imd3[] = { 1, 2, 0 };
+ const Vector3 *vt[] = { &a, &b, &c };
+ const Vector3 dl[] = { a - b, b - c, c - a };
+ const Vector3 n = vec3_cross(dl[0], dl[1]);
+ const real_t l = n.length_squared();
+ if (l > GJK_SIMPLEX3_EPS) {
+ real_t mindist = -1;
+ real_t subw[2];
+ U subm;
+ for (U i = 0; i < 3; ++i) {
+ if (vec3_dot(*vt[i], vec3_cross(dl[i], n)) > 0) {
+ const U j = imd3[i];
+ const real_t subd(projectorigin(*vt[i], *vt[j], subw, subm));
+ if ((mindist < 0) || (subd < mindist)) {
+ mindist = subd;
+ m = static_cast<U>(((subm & 1) ? 1 << i : 0) + ((subm & 2) ? 1 << j : 0));
+ w[i] = subw[0];
+ w[j] = subw[1];
+ w[imd3[j]] = 0;
}
}
- if(mindist<0)
- {
- const real_t d=vec3_dot(a,n);
- const real_t s=Math::sqrt(l);
- const Vector3 p=n*(d/l);
- mindist = p.length_squared();
- m = 7;
- w[0] = (vec3_cross(dl[1],b-p)).length()/s;
- w[1] = (vec3_cross(dl[2],c-p)).length()/s;
- w[2] = 1-(w[0]+w[1]);
- }
- return(mindist);
}
- return(-1);
+ if (mindist < 0) {
+ const real_t d = vec3_dot(a, n);
+ const real_t s = Math::sqrt(l);
+ const Vector3 p = n * (d / l);
+ mindist = p.length_squared();
+ m = 7;
+ w[0] = (vec3_cross(dl[1], b - p)).length() / s;
+ w[1] = (vec3_cross(dl[2], c - p)).length() / s;
+ w[2] = 1 - (w[0] + w[1]);
+ }
+ return (mindist);
}
- static real_t projectorigin( const Vector3& a,
- const Vector3& b,
- const Vector3& c,
- const Vector3& d,
- real_t* w,U& m)
- {
- static const U imd3[]={1,2,0};
- const Vector3* vt[]={&a,&b,&c,&d};
- const Vector3 dl[]={a-d,b-d,c-d};
- const real_t vl=det(dl[0],dl[1],dl[2]);
- const bool ng=(vl*vec3_dot(a,vec3_cross(b-c,a-b)))<=0;
- if(ng&&(Math::abs(vl)>GJK_SIMPLEX4_EPS))
- {
- real_t mindist=-1;
- real_t subw[3];
- U subm;
- for(U i=0;i<3;++i)
- {
- const U j=imd3[i];
- const real_t s=vl*vec3_dot(d,vec3_cross(dl[i],dl[j]));
- if(s>0)
- {
- const real_t subd=projectorigin(*vt[i],*vt[j],d,subw,subm);
- if((mindist<0)||(subd<mindist))
- {
- mindist = subd;
- m = static_cast<U>((subm&1?1<<i:0)+
- (subm&2?1<<j:0)+
- (subm&4?8:0));
- w[i] = subw[0];
- w[j] = subw[1];
- w[imd3[j]] = 0;
- w[3] = subw[2];
- }
+ return (-1);
+ }
+ static real_t projectorigin(const Vector3 &a,
+ const Vector3 &b,
+ const Vector3 &c,
+ const Vector3 &d,
+ real_t *w, U &m) {
+ static const U imd3[] = { 1, 2, 0 };
+ const Vector3 *vt[] = { &a, &b, &c, &d };
+ const Vector3 dl[] = { a - d, b - d, c - d };
+ const real_t vl = det(dl[0], dl[1], dl[2]);
+ const bool ng = (vl * vec3_dot(a, vec3_cross(b - c, a - b))) <= 0;
+ if (ng && (Math::abs(vl) > GJK_SIMPLEX4_EPS)) {
+ real_t mindist = -1;
+ real_t subw[3];
+ U subm;
+ for (U i = 0; i < 3; ++i) {
+ const U j = imd3[i];
+ const real_t s = vl * vec3_dot(d, vec3_cross(dl[i], dl[j]));
+ if (s > 0) {
+ const real_t subd = projectorigin(*vt[i], *vt[j], d, subw, subm);
+ if ((mindist < 0) || (subd < mindist)) {
+ mindist = subd;
+ m = static_cast<U>((subm & 1 ? 1 << i : 0) +
+ (subm & 2 ? 1 << j : 0) +
+ (subm & 4 ? 8 : 0));
+ w[i] = subw[0];
+ w[j] = subw[1];
+ w[imd3[j]] = 0;
+ w[3] = subw[2];
}
}
- if(mindist<0)
- {
- mindist = 0;
- m = 15;
- w[0] = det(c,b,d)/vl;
- w[1] = det(a,c,d)/vl;
- w[2] = det(b,a,d)/vl;
- w[3] = 1-(w[0]+w[1]+w[2]);
- }
- return(mindist);
}
- return(-1);
+ if (mindist < 0) {
+ mindist = 0;
+ m = 15;
+ w[0] = det(c, b, d) / vl;
+ w[1] = det(a, c, d) / vl;
+ w[2] = det(b, a, d) / vl;
+ w[3] = 1 - (w[0] + w[1] + w[2]);
+ }
+ return (mindist);
}
+ return (-1);
+ }
};
- // EPA
- struct EPA
- {
- /* Types */
- typedef GJK::sSV sSV;
- struct sFace
- {
- Vector3 n;
- real_t d;
- real_t p;
- sSV* c[3];
- sFace* f[3];
- sFace* l[2];
- U1 e[3];
- U1 pass;
- };
- struct sList
- {
- sFace* root;
- U count;
- sList() : root(0),count(0) {}
- };
- struct sHorizon
- {
- sFace* cf;
- sFace* ff;
- U nf;
- sHorizon() : cf(0),ff(0),nf(0) {}
- };
- struct eStatus { enum _ {
+// EPA
+struct EPA {
+ /* Types */
+ typedef GJK::sSV sSV;
+ struct sFace {
+ Vector3 n;
+ real_t d;
+ real_t p;
+ sSV *c[3];
+ sFace *f[3];
+ sFace *l[2];
+ U1 e[3];
+ U1 pass;
+ };
+ struct sList {
+ sFace *root;
+ U count;
+ sList()
+ : root(0), count(0) {}
+ };
+ struct sHorizon {
+ sFace *cf;
+ sFace *ff;
+ U nf;
+ sHorizon()
+ : cf(0), ff(0), nf(0) {}
+ };
+ struct eStatus {
+ enum _ {
Valid,
Touching,
Degenerated,
@@ -504,271 +467,255 @@ struct GJK
OutOfVertices,
AccuraryReached,
FallBack,
- Failed };};
- /* Fields */
- eStatus::_ m_status;
- GJK::sSimplex m_result;
- Vector3 m_normal;
- real_t m_depth;
- sSV m_sv_store[EPA_MAX_VERTICES];
- sFace m_fc_store[EPA_MAX_FACES];
- U m_nextsv;
- sList m_hull;
- sList m_stock;
- /* Methods */
- EPA()
- {
- Initialize();
- }
-
+ Failed
+ };
+ };
+ /* Fields */
+ eStatus::_ m_status;
+ GJK::sSimplex m_result;
+ Vector3 m_normal;
+ real_t m_depth;
+ sSV m_sv_store[EPA_MAX_VERTICES];
+ sFace m_fc_store[EPA_MAX_FACES];
+ U m_nextsv;
+ sList m_hull;
+ sList m_stock;
+ /* Methods */
+ EPA() {
+ Initialize();
+ }
- static inline void bind(sFace* fa,U ea,sFace* fb,U eb)
- {
- fa->e[ea]=(U1)eb;fa->f[ea]=fb;
- fb->e[eb]=(U1)ea;fb->f[eb]=fa;
- }
- static inline void append(sList& list,sFace* face)
- {
- face->l[0] = 0;
- face->l[1] = list.root;
- if(list.root) list.root->l[0]=face;
- list.root = face;
- ++list.count;
- }
- static inline void remove(sList& list,sFace* face)
- {
- if(face->l[1]) face->l[1]->l[0]=face->l[0];
- if(face->l[0]) face->l[0]->l[1]=face->l[1];
- if(face==list.root) list.root=face->l[1];
- --list.count;
- }
+ static inline void bind(sFace *fa, U ea, sFace *fb, U eb) {
+ fa->e[ea] = (U1)eb;
+ fa->f[ea] = fb;
+ fb->e[eb] = (U1)ea;
+ fb->f[eb] = fa;
+ }
+ static inline void append(sList &list, sFace *face) {
+ face->l[0] = 0;
+ face->l[1] = list.root;
+ if (list.root) list.root->l[0] = face;
+ list.root = face;
+ ++list.count;
+ }
+ static inline void remove(sList &list, sFace *face) {
+ if (face->l[1]) face->l[1]->l[0] = face->l[0];
+ if (face->l[0]) face->l[0]->l[1] = face->l[1];
+ if (face == list.root) list.root = face->l[1];
+ --list.count;
+ }
+ void Initialize() {
+ m_status = eStatus::Failed;
+ m_normal = Vector3(0, 0, 0);
+ m_depth = 0;
+ m_nextsv = 0;
+ for (U i = 0; i < EPA_MAX_FACES; ++i) {
+ append(m_stock, &m_fc_store[EPA_MAX_FACES - i - 1]);
+ }
+ }
+ eStatus::_ Evaluate(GJK &gjk, const Vector3 &guess) {
+ GJK::sSimplex &simplex = *gjk.m_simplex;
+ if ((simplex.rank > 1) && gjk.EncloseOrigin()) {
- void Initialize()
- {
- m_status = eStatus::Failed;
- m_normal = Vector3(0,0,0);
- m_depth = 0;
- m_nextsv = 0;
- for(U i=0;i<EPA_MAX_FACES;++i)
- {
- append(m_stock,&m_fc_store[EPA_MAX_FACES-i-1]);
- }
+ /* Clean up */
+ while (m_hull.root) {
+ sFace *f = m_hull.root;
+ remove(m_hull, f);
+ append(m_stock, f);
}
- eStatus::_ Evaluate(GJK& gjk,const Vector3& guess)
- {
- GJK::sSimplex& simplex=*gjk.m_simplex;
- if((simplex.rank>1)&&gjk.EncloseOrigin())
- {
-
- /* Clean up */
- while(m_hull.root)
- {
- sFace* f = m_hull.root;
- remove(m_hull,f);
- append(m_stock,f);
- }
- m_status = eStatus::Valid;
- m_nextsv = 0;
- /* Orient simplex */
- if(gjk.det( simplex.c[0]->w-simplex.c[3]->w,
- simplex.c[1]->w-simplex.c[3]->w,
- simplex.c[2]->w-simplex.c[3]->w)<0)
- {
- SWAP(simplex.c[0],simplex.c[1]);
- SWAP(simplex.p[0],simplex.p[1]);
- }
- /* Build initial hull */
- sFace* tetra[]={newface(simplex.c[0],simplex.c[1],simplex.c[2],true),
- newface(simplex.c[1],simplex.c[0],simplex.c[3],true),
- newface(simplex.c[2],simplex.c[1],simplex.c[3],true),
- newface(simplex.c[0],simplex.c[2],simplex.c[3],true)};
- if(m_hull.count==4)
- {
- sFace* best=findbest();
- sFace outer=*best;
- U pass=0;
- U iterations=0;
- bind(tetra[0],0,tetra[1],0);
- bind(tetra[0],1,tetra[2],0);
- bind(tetra[0],2,tetra[3],0);
- bind(tetra[1],1,tetra[3],2);
- bind(tetra[1],2,tetra[2],1);
- bind(tetra[2],2,tetra[3],1);
- m_status=eStatus::Valid;
- for(;iterations<EPA_MAX_ITERATIONS;++iterations)
- {
- if(m_nextsv<EPA_MAX_VERTICES)
- {
- sHorizon horizon;
- sSV* w=&m_sv_store[m_nextsv++];
- bool valid=true;
- best->pass = (U1)(++pass);
- gjk.getsupport(best->n,*w);
- const real_t wdist=vec3_dot(best->n,w->w)-best->d;
- if(wdist>EPA_ACCURACY)
- {
- for(U j=0;(j<3)&&valid;++j)
- {
- valid&=expand( pass,w,
- best->f[j],best->e[j],
- horizon);
- }
- if(valid&&(horizon.nf>=3))
- {
- bind(horizon.cf,1,horizon.ff,2);
- remove(m_hull,best);
- append(m_stock,best);
- best=findbest();
- if(best->p>=outer.p) outer=*best;
- } else { m_status=eStatus::InvalidHull;break; }
- } else { m_status=eStatus::AccuraryReached;break; }
- } else { m_status=eStatus::OutOfVertices;break; }
+ m_status = eStatus::Valid;
+ m_nextsv = 0;
+ /* Orient simplex */
+ if (gjk.det(simplex.c[0]->w - simplex.c[3]->w,
+ simplex.c[1]->w - simplex.c[3]->w,
+ simplex.c[2]->w - simplex.c[3]->w) < 0) {
+ SWAP(simplex.c[0], simplex.c[1]);
+ SWAP(simplex.p[0], simplex.p[1]);
+ }
+ /* Build initial hull */
+ sFace *tetra[] = { newface(simplex.c[0], simplex.c[1], simplex.c[2], true),
+ newface(simplex.c[1], simplex.c[0], simplex.c[3], true),
+ newface(simplex.c[2], simplex.c[1], simplex.c[3], true),
+ newface(simplex.c[0], simplex.c[2], simplex.c[3], true) };
+ if (m_hull.count == 4) {
+ sFace *best = findbest();
+ sFace outer = *best;
+ U pass = 0;
+ U iterations = 0;
+ bind(tetra[0], 0, tetra[1], 0);
+ bind(tetra[0], 1, tetra[2], 0);
+ bind(tetra[0], 2, tetra[3], 0);
+ bind(tetra[1], 1, tetra[3], 2);
+ bind(tetra[1], 2, tetra[2], 1);
+ bind(tetra[2], 2, tetra[3], 1);
+ m_status = eStatus::Valid;
+ for (; iterations < EPA_MAX_ITERATIONS; ++iterations) {
+ if (m_nextsv < EPA_MAX_VERTICES) {
+ sHorizon horizon;
+ sSV *w = &m_sv_store[m_nextsv++];
+ bool valid = true;
+ best->pass = (U1)(++pass);
+ gjk.getsupport(best->n, *w);
+ const real_t wdist = vec3_dot(best->n, w->w) - best->d;
+ if (wdist > EPA_ACCURACY) {
+ for (U j = 0; (j < 3) && valid; ++j) {
+ valid &= expand(pass, w,
+ best->f[j], best->e[j],
+ horizon);
+ }
+ if (valid && (horizon.nf >= 3)) {
+ bind(horizon.cf, 1, horizon.ff, 2);
+ remove(m_hull, best);
+ append(m_stock, best);
+ best = findbest();
+ if (best->p >= outer.p) outer = *best;
+ } else {
+ m_status = eStatus::InvalidHull;
+ break;
+ }
+ } else {
+ m_status = eStatus::AccuraryReached;
+ break;
}
- const Vector3 projection=outer.n*outer.d;
- m_normal = outer.n;
- m_depth = outer.d;
- m_result.rank = 3;
- m_result.c[0] = outer.c[0];
- m_result.c[1] = outer.c[1];
- m_result.c[2] = outer.c[2];
- m_result.p[0] = vec3_cross( outer.c[1]->w-projection,
- outer.c[2]->w-projection).length();
- m_result.p[1] = vec3_cross( outer.c[2]->w-projection,
- outer.c[0]->w-projection).length();
- m_result.p[2] = vec3_cross( outer.c[0]->w-projection,
- outer.c[1]->w-projection).length();
- const real_t sum=m_result.p[0]+m_result.p[1]+m_result.p[2];
- m_result.p[0] /= sum;
- m_result.p[1] /= sum;
- m_result.p[2] /= sum;
- return(m_status);
+ } else {
+ m_status = eStatus::OutOfVertices;
+ break;
}
}
- /* Fallback */
- m_status = eStatus::FallBack;
- m_normal = -guess;
- const real_t nl=m_normal.length();
- if(nl>0)
- m_normal = m_normal/nl;
- else
- m_normal = Vector3(1,0,0);
- m_depth = 0;
- m_result.rank=1;
- m_result.c[0]=simplex.c[0];
- m_result.p[0]=1;
- return(m_status);
- }
- sFace* newface(sSV* a,sSV* b,sSV* c,bool forced)
- {
- if(m_stock.root)
- {
- sFace* face=m_stock.root;
- remove(m_stock,face);
- append(m_hull,face);
- face->pass = 0;
- face->c[0] = a;
- face->c[1] = b;
- face->c[2] = c;
- face->n = vec3_cross(b->w-a->w,c->w-a->w);
- const real_t l=face->n.length();
- const bool v=l>EPA_ACCURACY;
- face->p = MIN(MIN(
- vec3_dot(a->w,vec3_cross(face->n,a->w-b->w)),
- vec3_dot(b->w,vec3_cross(face->n,b->w-c->w))),
- vec3_dot(c->w,vec3_cross(face->n,c->w-a->w))) /
- (v?l:1);
- face->p = face->p>=-EPA_INSIDE_EPS?0:face->p;
- if(v)
- {
- face->d = vec3_dot(a->w,face->n)/l;
- face->n /= l;
- if(forced||(face->d>=-EPA_PLANE_EPS))
- {
- return(face);
- } else m_status=eStatus::NonConvex;
- } else m_status=eStatus::Degenerated;
- remove(m_hull,face);
- append(m_stock,face);
- return(0);
- }
- m_status=m_stock.root?eStatus::OutOfVertices:eStatus::OutOfFaces;
- return(0);
+ const Vector3 projection = outer.n * outer.d;
+ m_normal = outer.n;
+ m_depth = outer.d;
+ m_result.rank = 3;
+ m_result.c[0] = outer.c[0];
+ m_result.c[1] = outer.c[1];
+ m_result.c[2] = outer.c[2];
+ m_result.p[0] = vec3_cross(outer.c[1]->w - projection,
+ outer.c[2]->w - projection)
+ .length();
+ m_result.p[1] = vec3_cross(outer.c[2]->w - projection,
+ outer.c[0]->w - projection)
+ .length();
+ m_result.p[2] = vec3_cross(outer.c[0]->w - projection,
+ outer.c[1]->w - projection)
+ .length();
+ const real_t sum = m_result.p[0] + m_result.p[1] + m_result.p[2];
+ m_result.p[0] /= sum;
+ m_result.p[1] /= sum;
+ m_result.p[2] /= sum;
+ return (m_status);
}
- sFace* findbest()
- {
- sFace* minf=m_hull.root;
- real_t mind=minf->d*minf->d;
- real_t maxp=minf->p;
- for(sFace* f=minf->l[1];f;f=f->l[1])
- {
- const real_t sqd=f->d*f->d;
- if((f->p>=maxp)&&(sqd<mind))
- {
- minf=f;
- mind=sqd;
- maxp=f->p;
- }
- }
- return(minf);
+ }
+ /* Fallback */
+ m_status = eStatus::FallBack;
+ m_normal = -guess;
+ const real_t nl = m_normal.length();
+ if (nl > 0)
+ m_normal = m_normal / nl;
+ else
+ m_normal = Vector3(1, 0, 0);
+ m_depth = 0;
+ m_result.rank = 1;
+ m_result.c[0] = simplex.c[0];
+ m_result.p[0] = 1;
+ return (m_status);
+ }
+ sFace *newface(sSV *a, sSV *b, sSV *c, bool forced) {
+ if (m_stock.root) {
+ sFace *face = m_stock.root;
+ remove(m_stock, face);
+ append(m_hull, face);
+ face->pass = 0;
+ face->c[0] = a;
+ face->c[1] = b;
+ face->c[2] = c;
+ face->n = vec3_cross(b->w - a->w, c->w - a->w);
+ const real_t l = face->n.length();
+ const bool v = l > EPA_ACCURACY;
+ face->p = MIN(MIN(
+ vec3_dot(a->w, vec3_cross(face->n, a->w - b->w)),
+ vec3_dot(b->w, vec3_cross(face->n, b->w - c->w))),
+ vec3_dot(c->w, vec3_cross(face->n, c->w - a->w))) /
+ (v ? l : 1);
+ face->p = face->p >= -EPA_INSIDE_EPS ? 0 : face->p;
+ if (v) {
+ face->d = vec3_dot(a->w, face->n) / l;
+ face->n /= l;
+ if (forced || (face->d >= -EPA_PLANE_EPS)) {
+ return (face);
+ } else
+ m_status = eStatus::NonConvex;
+ } else
+ m_status = eStatus::Degenerated;
+ remove(m_hull, face);
+ append(m_stock, face);
+ return (0);
+ }
+ m_status = m_stock.root ? eStatus::OutOfVertices : eStatus::OutOfFaces;
+ return (0);
+ }
+ sFace *findbest() {
+ sFace *minf = m_hull.root;
+ real_t mind = minf->d * minf->d;
+ real_t maxp = minf->p;
+ for (sFace *f = minf->l[1]; f; f = f->l[1]) {
+ const real_t sqd = f->d * f->d;
+ if ((f->p >= maxp) && (sqd < mind)) {
+ minf = f;
+ mind = sqd;
+ maxp = f->p;
}
- bool expand(U pass,sSV* w,sFace* f,U e,sHorizon& horizon)
- {
- static const U i1m3[]={1,2,0};
- static const U i2m3[]={2,0,1};
- if(f->pass!=pass)
- {
- const U e1=i1m3[e];
- if((vec3_dot(f->n,w->w)-f->d)<-EPA_PLANE_EPS)
- {
- sFace* nf=newface(f->c[e1],f->c[e],w,false);
- if(nf)
- {
- bind(nf,0,f,e);
- if(horizon.cf) bind(horizon.cf,1,nf,2); else horizon.ff=nf;
- horizon.cf=nf;
- ++horizon.nf;
- return(true);
- }
- }
+ }
+ return (minf);
+ }
+ bool expand(U pass, sSV *w, sFace *f, U e, sHorizon &horizon) {
+ static const U i1m3[] = { 1, 2, 0 };
+ static const U i2m3[] = { 2, 0, 1 };
+ if (f->pass != pass) {
+ const U e1 = i1m3[e];
+ if ((vec3_dot(f->n, w->w) - f->d) < -EPA_PLANE_EPS) {
+ sFace *nf = newface(f->c[e1], f->c[e], w, false);
+ if (nf) {
+ bind(nf, 0, f, e);
+ if (horizon.cf)
+ bind(horizon.cf, 1, nf, 2);
else
- {
- const U e2=i2m3[e];
- f->pass = (U1)pass;
- if( expand(pass,w,f->f[e1],f->e[e1],horizon)&&
- expand(pass,w,f->f[e2],f->e[e2],horizon))
- {
- remove(m_hull,f);
- append(m_stock,f);
- return(true);
- }
- }
+ horizon.ff = nf;
+ horizon.cf = nf;
+ ++horizon.nf;
+ return (true);
+ }
+ } else {
+ const U e2 = i2m3[e];
+ f->pass = (U1)pass;
+ if (expand(pass, w, f->f[e1], f->e[e1], horizon) &&
+ expand(pass, w, f->f[e2], f->e[e2], horizon)) {
+ remove(m_hull, f);
+ append(m_stock, f);
+ return (true);
}
- return(false);
}
-
- };
-
- //
- static void Initialize( const ShapeSW* shape0,const Transform& wtrs0,
- const ShapeSW* shape1,const Transform& wtrs1,
- sResults& results,
- tShape& shape,
- bool withmargins)
- {
- /* Results */
- results.witnesses[0] =
- results.witnesses[1] = Vector3(0,0,0);
- results.status = sResults::Separated;
- /* Shape */
- shape.m_shapes[0] = shape0;
- shape.m_shapes[1] = shape1;
- shape.transform_A = wtrs0;
- shape.transform_B = wtrs1;
-
+ }
+ return (false);
}
+};
-
+//
+static void Initialize(const ShapeSW *shape0, const Transform &wtrs0,
+ const ShapeSW *shape1, const Transform &wtrs1,
+ sResults &results,
+ tShape &shape,
+ bool withmargins) {
+ /* Results */
+ results.witnesses[0] =
+ results.witnesses[1] = Vector3(0, 0, 0);
+ results.status = sResults::Separated;
+ /* Shape */
+ shape.m_shapes[0] = shape0;
+ shape.m_shapes[1] = shape1;
+ shape.transform_A = wtrs0;
+ shape.transform_B = wtrs1;
+}
//
// Api
@@ -777,87 +724,75 @@ struct GJK
//
//
-bool Distance( const ShapeSW* shape0,
- const Transform& wtrs0,
- const ShapeSW* shape1,
- const Transform& wtrs1,
- const Vector3& guess,
- sResults& results)
-{
- tShape shape;
- Initialize(shape0,wtrs0,shape1,wtrs1,results,shape,false);
- GJK gjk;
- GJK::eStatus::_ gjk_status=gjk.Evaluate(shape,guess);
- if(gjk_status==GJK::eStatus::Valid)
- {
- Vector3 w0=Vector3(0,0,0);
- Vector3 w1=Vector3(0,0,0);
- for(U i=0;i<gjk.m_simplex->rank;++i)
- {
- const real_t p=gjk.m_simplex->p[i];
- w0+=shape.Support( gjk.m_simplex->c[i]->d,0)*p;
- w1+=shape.Support(-gjk.m_simplex->c[i]->d,1)*p;
+bool Distance(const ShapeSW *shape0,
+ const Transform &wtrs0,
+ const ShapeSW *shape1,
+ const Transform &wtrs1,
+ const Vector3 &guess,
+ sResults &results) {
+ tShape shape;
+ Initialize(shape0, wtrs0, shape1, wtrs1, results, shape, false);
+ GJK gjk;
+ GJK::eStatus::_ gjk_status = gjk.Evaluate(shape, guess);
+ if (gjk_status == GJK::eStatus::Valid) {
+ Vector3 w0 = Vector3(0, 0, 0);
+ Vector3 w1 = Vector3(0, 0, 0);
+ for (U i = 0; i < gjk.m_simplex->rank; ++i) {
+ const real_t p = gjk.m_simplex->p[i];
+ w0 += shape.Support(gjk.m_simplex->c[i]->d, 0) * p;
+ w1 += shape.Support(-gjk.m_simplex->c[i]->d, 1) * p;
}
- results.witnesses[0] = w0;
- results.witnesses[1] = w1;
- results.normal = w0-w1;
- results.distance = results.normal.length();
- results.normal /= results.distance>GJK_MIN_DISTANCE?results.distance:1;
- return(true);
- }
- else
- {
- results.status = gjk_status==GJK::eStatus::Inside?
- sResults::Penetrating :
- sResults::GJK_Failed ;
- return(false);
+ results.witnesses[0] = w0;
+ results.witnesses[1] = w1;
+ results.normal = w0 - w1;
+ results.distance = results.normal.length();
+ results.normal /= results.distance > GJK_MIN_DISTANCE ? results.distance : 1;
+ return (true);
+ } else {
+ results.status = gjk_status == GJK::eStatus::Inside ?
+ sResults::Penetrating :
+ sResults::GJK_Failed;
+ return (false);
}
}
//
-bool Penetration( const ShapeSW* shape0,
- const Transform& wtrs0,
- const ShapeSW* shape1,
- const Transform& wtrs1,
- const Vector3& guess,
- sResults& results
- )
-{
- tShape shape;
- Initialize(shape0,wtrs0,shape1,wtrs1,results,shape,false);
- GJK gjk;
- GJK::eStatus::_ gjk_status=gjk.Evaluate(shape,-guess);
- switch(gjk_status)
- {
- case GJK::eStatus::Inside:
- {
- EPA epa;
- EPA::eStatus::_ epa_status=epa.Evaluate(gjk,-guess);
- if(epa_status!=EPA::eStatus::Failed)
- {
- Vector3 w0=Vector3(0,0,0);
- for(U i=0;i<epa.m_result.rank;++i)
- {
- w0+=shape.Support(epa.m_result.c[i]->d,0)*epa.m_result.p[i];
+bool Penetration(const ShapeSW *shape0,
+ const Transform &wtrs0,
+ const ShapeSW *shape1,
+ const Transform &wtrs1,
+ const Vector3 &guess,
+ sResults &results) {
+ tShape shape;
+ Initialize(shape0, wtrs0, shape1, wtrs1, results, shape, false);
+ GJK gjk;
+ GJK::eStatus::_ gjk_status = gjk.Evaluate(shape, -guess);
+ switch (gjk_status) {
+ case GJK::eStatus::Inside: {
+ EPA epa;
+ EPA::eStatus::_ epa_status = epa.Evaluate(gjk, -guess);
+ if (epa_status != EPA::eStatus::Failed) {
+ Vector3 w0 = Vector3(0, 0, 0);
+ for (U i = 0; i < epa.m_result.rank; ++i) {
+ w0 += shape.Support(epa.m_result.c[i]->d, 0) * epa.m_result.p[i];
}
- results.status = sResults::Penetrating;
- results.witnesses[0] = w0;
- results.witnesses[1] = w0-epa.m_normal*epa.m_depth;
- results.normal = -epa.m_normal;
- results.distance = -epa.m_depth;
- return(true);
- } else results.status=sResults::EPA_Failed;
- }
- break;
- case GJK::eStatus::Failed:
- results.status=sResults::GJK_Failed;
- break;
- default: {}
+ results.status = sResults::Penetrating;
+ results.witnesses[0] = w0;
+ results.witnesses[1] = w0 - epa.m_normal * epa.m_depth;
+ results.normal = -epa.m_normal;
+ results.distance = -epa.m_depth;
+ return (true);
+ } else
+ results.status = sResults::EPA_Failed;
+ } break;
+ case GJK::eStatus::Failed:
+ results.status = sResults::GJK_Failed;
+ break;
+ default: {}
}
- return(false);
+ return (false);
}
-
/* Symbols cleanup */
#undef GJK_MAX_ITERATIONS
@@ -876,43 +811,35 @@ bool Penetration( const ShapeSW* shape0,
#undef EPA_PLANE_EPS
#undef EPA_INSIDE_EPS
-
} // end of namespace
-
-
-
-
-bool gjk_epa_calculate_distance(const ShapeSW *p_shape_A, const Transform& p_transform_A, const ShapeSW *p_shape_B, const Transform& p_transform_B, Vector3& r_result_A, Vector3& r_result_B) {
-
+bool gjk_epa_calculate_distance(const ShapeSW *p_shape_A, const Transform &p_transform_A, const ShapeSW *p_shape_B, const Transform &p_transform_B, Vector3 &r_result_A, Vector3 &r_result_B) {
GjkEpa2::sResults res;
- if (GjkEpa2::Distance(p_shape_A,p_transform_A,p_shape_B,p_transform_B,p_transform_B.origin-p_transform_A.origin,res)) {
+ if (GjkEpa2::Distance(p_shape_A, p_transform_A, p_shape_B, p_transform_B, p_transform_B.origin - p_transform_A.origin, res)) {
- r_result_A=res.witnesses[0];
- r_result_B=res.witnesses[1];
+ r_result_A = res.witnesses[0];
+ r_result_B = res.witnesses[1];
return true;
}
return false;
-
}
-bool gjk_epa_calculate_penetration(const ShapeSW *p_shape_A, const Transform& p_transform_A, const ShapeSW *p_shape_B, const Transform& p_transform_B, CollisionSolverSW::CallbackResult p_result_callback,void *p_userdata, bool p_swap ) {
+bool gjk_epa_calculate_penetration(const ShapeSW *p_shape_A, const Transform &p_transform_A, const ShapeSW *p_shape_B, const Transform &p_transform_B, CollisionSolverSW::CallbackResult p_result_callback, void *p_userdata, bool p_swap) {
GjkEpa2::sResults res;
- if (GjkEpa2::Penetration(p_shape_A,p_transform_A,p_shape_B,p_transform_B,p_transform_B.origin-p_transform_A.origin,res)) {
+ if (GjkEpa2::Penetration(p_shape_A, p_transform_A, p_shape_B, p_transform_B, p_transform_B.origin - p_transform_A.origin, res)) {
if (p_result_callback) {
if (p_swap)
- p_result_callback(res.witnesses[1],res.witnesses[0],p_userdata);
+ p_result_callback(res.witnesses[1], res.witnesses[0], p_userdata);
else
- p_result_callback(res.witnesses[0],res.witnesses[1],p_userdata);
+ p_result_callback(res.witnesses[0], res.witnesses[1], p_userdata);
}
return true;
}
return false;
}
-
diff --git a/servers/physics/gjk_epa.h b/servers/physics/gjk_epa.h
index 58cf8f50c..ae5db733b 100644
--- a/servers/physics/gjk_epa.h
+++ b/servers/physics/gjk_epa.h
@@ -35,7 +35,7 @@
*/
#include "collision_solver_sw.h"
-bool gjk_epa_calculate_penetration(const ShapeSW *p_shape_A, const Transform& p_transform_A, const ShapeSW *p_shape_B, const Transform& p_transform_B, CollisionSolverSW::CallbackResult p_result_callback,void *p_userdata, bool p_swap=false);
-bool gjk_epa_calculate_distance(const ShapeSW *p_shape_A, const Transform& p_transform_A, const ShapeSW *p_shape_B, const Transform& p_transform_B, Vector3& r_result_A, Vector3& r_result_B);
+bool gjk_epa_calculate_penetration(const ShapeSW *p_shape_A, const Transform &p_transform_A, const ShapeSW *p_shape_B, const Transform &p_transform_B, CollisionSolverSW::CallbackResult p_result_callback, void *p_userdata, bool p_swap = false);
+bool gjk_epa_calculate_distance(const ShapeSW *p_shape_A, const Transform &p_transform_A, const ShapeSW *p_shape_B, const Transform &p_transform_B, Vector3 &r_result_A, Vector3 &r_result_B);
#endif
diff --git a/servers/physics/joints/cone_twist_joint_sw.cpp b/servers/physics/joints/cone_twist_joint_sw.cpp
index c94cc8bd8..08f1d1e1a 100644
--- a/servers/physics/joints/cone_twist_joint_sw.cpp
+++ b/servers/physics/joints/cone_twist_joint_sw.cpp
@@ -34,29 +34,26 @@ See corresponding header file for licensing info.
#include "cone_twist_joint_sw.h"
-static void plane_space(const Vector3& n, Vector3& p, Vector3& q) {
+static void plane_space(const Vector3 &n, Vector3 &p, Vector3 &q) {
- if (Math::abs(n.z) > 0.707106781186547524400844362) {
- // choose p in y-z plane
- real_t a = n[1]*n[1] + n[2]*n[2];
- real_t k = 1.0/Math::sqrt(a);
- p=Vector3(0,-n[2]*k,n[1]*k);
- // set q = n x p
- q=Vector3(a*k,-n[0]*p[2],n[0]*p[1]);
- }
- else {
- // choose p in x-y plane
- real_t a = n.x*n.x + n.y*n.y;
- real_t k = 1.0/Math::sqrt(a);
- p=Vector3(-n.y*k,n.x*k,0);
- // set q = n x p
- q=Vector3(-n.z*p.y,n.z*p.x,a*k);
- }
+ if (Math::abs(n.z) > 0.707106781186547524400844362) {
+ // choose p in y-z plane
+ real_t a = n[1] * n[1] + n[2] * n[2];
+ real_t k = 1.0 / Math::sqrt(a);
+ p = Vector3(0, -n[2] * k, n[1] * k);
+ // set q = n x p
+ q = Vector3(a * k, -n[0] * p[2], n[0] * p[1]);
+ } else {
+ // choose p in x-y plane
+ real_t a = n.x * n.x + n.y * n.y;
+ real_t k = 1.0 / Math::sqrt(a);
+ p = Vector3(-n.y * k, n.x * k, 0);
+ // set q = n x p
+ q = Vector3(-n.z * p.y, n.z * p.x, a * k);
+ }
}
-
-static _FORCE_INLINE_ real_t atan2fast(real_t y, real_t x)
-{
+static _FORCE_INLINE_ real_t atan2fast(real_t y, real_t x) {
real_t coeff_1 = Math_PI / 4.0f;
real_t coeff_2 = 3.0f * coeff_1;
real_t abs_y = Math::abs(y);
@@ -71,32 +68,31 @@ static _FORCE_INLINE_ real_t atan2fast(real_t y, real_t x)
return (y < 0.0f) ? -angle : angle;
}
-ConeTwistJointSW::ConeTwistJointSW(BodySW* rbA,BodySW* rbB,const Transform& rbAFrame, const Transform& rbBFrame) : JointSW(_arr,2) {
+ConeTwistJointSW::ConeTwistJointSW(BodySW *rbA, BodySW *rbB, const Transform &rbAFrame, const Transform &rbBFrame)
+ : JointSW(_arr, 2) {
- A=rbA;
- B=rbB;
+ A = rbA;
+ B = rbB;
+ m_rbAFrame = rbAFrame;
+ m_rbBFrame = rbBFrame;
- m_rbAFrame=rbAFrame;
- m_rbBFrame=rbBFrame;
-
- m_swingSpan1 = Math_PI/4.0;
- m_swingSpan2 = Math_PI/4.0;
- m_twistSpan = Math_PI*2;
+ m_swingSpan1 = Math_PI / 4.0;
+ m_swingSpan2 = Math_PI / 4.0;
+ m_twistSpan = Math_PI * 2;
m_biasFactor = 0.3f;
m_relaxationFactor = 1.0f;
m_solveTwistLimit = false;
m_solveSwingLimit = false;
- A->add_constraint(this,0);
- B->add_constraint(this,1);
+ A->add_constraint(this, 0);
+ B->add_constraint(this, 1);
- m_appliedImpulse=0;
+ m_appliedImpulse = 0;
}
-
-bool ConeTwistJointSW::setup(float p_step) {
+bool ConeTwistJointSW::setup(float p_step) {
m_appliedImpulse = real_t(0.);
//set bias, sign, clear accumulator
@@ -107,109 +103,97 @@ bool ConeTwistJointSW::setup(float p_step) {
m_accTwistLimitImpulse = real_t(0.);
m_accSwingLimitImpulse = real_t(0.);
- if (!m_angularOnly)
- {
+ if (!m_angularOnly) {
Vector3 pivotAInW = A->get_transform().xform(m_rbAFrame.origin);
Vector3 pivotBInW = B->get_transform().xform(m_rbBFrame.origin);
Vector3 relPos = pivotBInW - pivotAInW;
Vector3 normal[3];
- if (relPos.length_squared() > CMP_EPSILON)
- {
+ if (relPos.length_squared() > CMP_EPSILON) {
normal[0] = relPos.normalized();
- }
- else
- {
- normal[0]=Vector3(real_t(1.0),0,0);
+ } else {
+ normal[0] = Vector3(real_t(1.0), 0, 0);
}
plane_space(normal[0], normal[1], normal[2]);
- for (int i=0;i<3;i++)
- {
+ for (int i = 0; i < 3; i++) {
memnew_placement(&m_jac[i], JacobianEntrySW(
- A->get_transform().basis.transposed(),
- B->get_transform().basis.transposed(),
- pivotAInW - A->get_transform().origin,
- pivotBInW - B->get_transform().origin,
- normal[i],
- A->get_inv_inertia(),
- A->get_inv_mass(),
- B->get_inv_inertia(),
- B->get_inv_mass()));
+ A->get_transform().basis.transposed(),
+ B->get_transform().basis.transposed(),
+ pivotAInW - A->get_transform().origin,
+ pivotBInW - B->get_transform().origin,
+ normal[i],
+ A->get_inv_inertia(),
+ A->get_inv_mass(),
+ B->get_inv_inertia(),
+ B->get_inv_mass()));
}
}
- Vector3 b1Axis1,b1Axis2,b1Axis3;
- Vector3 b2Axis1,b2Axis2;
+ Vector3 b1Axis1, b1Axis2, b1Axis3;
+ Vector3 b2Axis1, b2Axis2;
- b1Axis1 = A->get_transform().basis.xform( this->m_rbAFrame.basis.get_axis(0) );
- b2Axis1 = B->get_transform().basis.xform( this->m_rbBFrame.basis.get_axis(0) );
+ b1Axis1 = A->get_transform().basis.xform(this->m_rbAFrame.basis.get_axis(0));
+ b2Axis1 = B->get_transform().basis.xform(this->m_rbBFrame.basis.get_axis(0));
- real_t swing1=real_t(0.),swing2 = real_t(0.);
+ real_t swing1 = real_t(0.), swing2 = real_t(0.);
- real_t swx=real_t(0.),swy = real_t(0.);
+ real_t swx = real_t(0.), swy = real_t(0.);
real_t thresh = real_t(10.);
real_t fact;
// Get Frame into world space
- if (m_swingSpan1 >= real_t(0.05f))
- {
- b1Axis2 = A->get_transform().basis.xform( this->m_rbAFrame.basis.get_axis(1) );
-// swing1 = btAtan2Fast( b2Axis1.dot(b1Axis2),b2Axis1.dot(b1Axis1) );
+ if (m_swingSpan1 >= real_t(0.05f)) {
+ b1Axis2 = A->get_transform().basis.xform(this->m_rbAFrame.basis.get_axis(1));
+ // swing1 = btAtan2Fast( b2Axis1.dot(b1Axis2),b2Axis1.dot(b1Axis1) );
swx = b2Axis1.dot(b1Axis1);
swy = b2Axis1.dot(b1Axis2);
- swing1 = atan2fast(swy, swx);
- fact = (swy*swy + swx*swx) * thresh * thresh;
+ swing1 = atan2fast(swy, swx);
+ fact = (swy * swy + swx * swx) * thresh * thresh;
fact = fact / (fact + real_t(1.0));
swing1 *= fact;
-
}
- if (m_swingSpan2 >= real_t(0.05f))
- {
- b1Axis3 = A->get_transform().basis.xform( this->m_rbAFrame.basis.get_axis(2) );
-// swing2 = btAtan2Fast( b2Axis1.dot(b1Axis3),b2Axis1.dot(b1Axis1) );
+ if (m_swingSpan2 >= real_t(0.05f)) {
+ b1Axis3 = A->get_transform().basis.xform(this->m_rbAFrame.basis.get_axis(2));
+ // swing2 = btAtan2Fast( b2Axis1.dot(b1Axis3),b2Axis1.dot(b1Axis1) );
swx = b2Axis1.dot(b1Axis1);
swy = b2Axis1.dot(b1Axis3);
- swing2 = atan2fast(swy, swx);
- fact = (swy*swy + swx*swx) * thresh * thresh;
+ swing2 = atan2fast(swy, swx);
+ fact = (swy * swy + swx * swx) * thresh * thresh;
fact = fact / (fact + real_t(1.0));
swing2 *= fact;
}
- real_t RMaxAngle1Sq = 1.0f / (m_swingSpan1*m_swingSpan1);
- real_t RMaxAngle2Sq = 1.0f / (m_swingSpan2*m_swingSpan2);
- real_t EllipseAngle = Math::abs(swing1*swing1)* RMaxAngle1Sq + Math::abs(swing2*swing2) * RMaxAngle2Sq;
+ real_t RMaxAngle1Sq = 1.0f / (m_swingSpan1 * m_swingSpan1);
+ real_t RMaxAngle2Sq = 1.0f / (m_swingSpan2 * m_swingSpan2);
+ real_t EllipseAngle = Math::abs(swing1 * swing1) * RMaxAngle1Sq + Math::abs(swing2 * swing2) * RMaxAngle2Sq;
- if (EllipseAngle > 1.0f)
- {
- m_swingCorrection = EllipseAngle-1.0f;
+ if (EllipseAngle > 1.0f) {
+ m_swingCorrection = EllipseAngle - 1.0f;
m_solveSwingLimit = true;
// Calculate necessary axis & factors
- m_swingAxis = b2Axis1.cross(b1Axis2* b2Axis1.dot(b1Axis2) + b1Axis3* b2Axis1.dot(b1Axis3));
+ m_swingAxis = b2Axis1.cross(b1Axis2 * b2Axis1.dot(b1Axis2) + b1Axis3 * b2Axis1.dot(b1Axis3));
m_swingAxis.normalize();
real_t swingAxisSign = (b2Axis1.dot(b1Axis1) >= 0.0f) ? 1.0f : -1.0f;
m_swingAxis *= swingAxisSign;
- m_kSwing = real_t(1.) / (A->compute_angular_impulse_denominator(m_swingAxis) +
- B->compute_angular_impulse_denominator(m_swingAxis));
-
+ m_kSwing = real_t(1.) / (A->compute_angular_impulse_denominator(m_swingAxis) +
+ B->compute_angular_impulse_denominator(m_swingAxis));
}
// Twist limits
- if (m_twistSpan >= real_t(0.))
- {
- Vector3 b2Axis2 = B->get_transform().basis.xform( this->m_rbBFrame.basis.get_axis(1) );
- Quat rotationArc = Quat(b2Axis1,b1Axis1);
+ if (m_twistSpan >= real_t(0.)) {
+ Vector3 b2Axis2 = B->get_transform().basis.xform(this->m_rbBFrame.basis.get_axis(1));
+ Quat rotationArc = Quat(b2Axis1, b1Axis1);
Vector3 TwistRef = rotationArc.xform(b2Axis2);
- real_t twist = atan2fast( TwistRef.dot(b1Axis3), TwistRef.dot(b1Axis2) );
+ real_t twist = atan2fast(TwistRef.dot(b1Axis3), TwistRef.dot(b1Axis2));
real_t lockedFreeFactor = (m_twistSpan > real_t(0.05f)) ? m_limitSoftness : real_t(0.);
- if (twist <= -m_twistSpan*lockedFreeFactor)
- {
+ if (twist <= -m_twistSpan * lockedFreeFactor) {
m_twistCorrection = -(twist + m_twistSpan);
m_solveTwistLimit = true;
@@ -218,28 +202,24 @@ bool ConeTwistJointSW::setup(float p_step) {
m_twistAxis *= -1.0f;
m_kTwist = real_t(1.) / (A->compute_angular_impulse_denominator(m_twistAxis) +
- B->compute_angular_impulse_denominator(m_twistAxis));
-
- } else
- if (twist > m_twistSpan*lockedFreeFactor)
- {
- m_twistCorrection = (twist - m_twistSpan);
- m_solveTwistLimit = true;
+ B->compute_angular_impulse_denominator(m_twistAxis));
- m_twistAxis = (b2Axis1 + b1Axis1) * 0.5f;
- m_twistAxis.normalize();
+ } else if (twist > m_twistSpan * lockedFreeFactor) {
+ m_twistCorrection = (twist - m_twistSpan);
+ m_solveTwistLimit = true;
- m_kTwist = real_t(1.) / (A->compute_angular_impulse_denominator(m_twistAxis) +
- B->compute_angular_impulse_denominator(m_twistAxis));
+ m_twistAxis = (b2Axis1 + b1Axis1) * 0.5f;
+ m_twistAxis.normalize();
- }
+ m_kTwist = real_t(1.) / (A->compute_angular_impulse_denominator(m_twistAxis) +
+ B->compute_angular_impulse_denominator(m_twistAxis));
+ }
}
return true;
}
-void ConeTwistJointSW::solve(real_t timeStep)
-{
+void ConeTwistJointSW::solve(real_t timeStep) {
Vector3 pivotAInW = A->get_transform().xform(m_rbAFrame.origin);
Vector3 pivotBInW = B->get_transform().xform(m_rbBFrame.origin);
@@ -247,8 +227,7 @@ void ConeTwistJointSW::solve(real_t timeStep)
real_t tau = real_t(0.3);
//linear part
- if (!m_angularOnly)
- {
+ if (!m_angularOnly) {
Vector3 rel_pos1 = pivotAInW - A->get_transform().origin;
Vector3 rel_pos2 = pivotBInW - B->get_transform().origin;
@@ -256,16 +235,15 @@ void ConeTwistJointSW::solve(real_t timeStep)
Vector3 vel2 = B->get_velocity_in_local_point(rel_pos2);
Vector3 vel = vel1 - vel2;
- for (int i=0;i<3;i++)
- {
- const Vector3& normal = m_jac[i].m_linearJointAxis;
+ for (int i = 0; i < 3; i++) {
+ const Vector3 &normal = m_jac[i].m_linearJointAxis;
real_t jacDiagABInv = real_t(1.) / m_jac[i].getDiagonal();
real_t rel_vel;
rel_vel = normal.dot(vel);
//positional error (zeroth order error)
real_t depth = -(pivotAInW - pivotBInW).dot(normal); //this is the error projected on the normal
- real_t impulse = depth*tau/timeStep * jacDiagABInv - rel_vel * jacDiagABInv;
+ real_t impulse = depth * tau / timeStep * jacDiagABInv - rel_vel * jacDiagABInv;
m_appliedImpulse += impulse;
Vector3 impulse_vector = normal * impulse;
A->apply_impulse(pivotAInW - A->get_transform().origin, impulse_vector);
@@ -275,79 +253,73 @@ void ConeTwistJointSW::solve(real_t timeStep)
{
///solve angular part
- const Vector3& angVelA = A->get_angular_velocity();
- const Vector3& angVelB = B->get_angular_velocity();
+ const Vector3 &angVelA = A->get_angular_velocity();
+ const Vector3 &angVelB = B->get_angular_velocity();
// solve swing limit
- if (m_solveSwingLimit)
- {
- real_t amplitude = ((angVelB - angVelA).dot( m_swingAxis )*m_relaxationFactor*m_relaxationFactor + m_swingCorrection*(real_t(1.)/timeStep)*m_biasFactor);
+ if (m_solveSwingLimit) {
+ real_t amplitude = ((angVelB - angVelA).dot(m_swingAxis) * m_relaxationFactor * m_relaxationFactor + m_swingCorrection * (real_t(1.) / timeStep) * m_biasFactor);
real_t impulseMag = amplitude * m_kSwing;
// Clamp the accumulated impulse
real_t temp = m_accSwingLimitImpulse;
- m_accSwingLimitImpulse = MAX(m_accSwingLimitImpulse + impulseMag, real_t(0.0) );
+ m_accSwingLimitImpulse = MAX(m_accSwingLimitImpulse + impulseMag, real_t(0.0));
impulseMag = m_accSwingLimitImpulse - temp;
Vector3 impulse = m_swingAxis * impulseMag;
A->apply_torque_impulse(impulse);
B->apply_torque_impulse(-impulse);
-
}
// solve twist limit
- if (m_solveTwistLimit)
- {
- real_t amplitude = ((angVelB - angVelA).dot( m_twistAxis )*m_relaxationFactor*m_relaxationFactor + m_twistCorrection*(real_t(1.)/timeStep)*m_biasFactor );
+ if (m_solveTwistLimit) {
+ real_t amplitude = ((angVelB - angVelA).dot(m_twistAxis) * m_relaxationFactor * m_relaxationFactor + m_twistCorrection * (real_t(1.) / timeStep) * m_biasFactor);
real_t impulseMag = amplitude * m_kTwist;
// Clamp the accumulated impulse
real_t temp = m_accTwistLimitImpulse;
- m_accTwistLimitImpulse = MAX(m_accTwistLimitImpulse + impulseMag, real_t(0.0) );
+ m_accTwistLimitImpulse = MAX(m_accTwistLimitImpulse + impulseMag, real_t(0.0));
impulseMag = m_accTwistLimitImpulse - temp;
Vector3 impulse = m_twistAxis * impulseMag;
A->apply_torque_impulse(impulse);
B->apply_torque_impulse(-impulse);
-
}
-
}
-
}
void ConeTwistJointSW::set_param(PhysicsServer::ConeTwistJointParam p_param, float p_value) {
- switch(p_param) {
+ switch (p_param) {
case PhysicsServer::CONE_TWIST_JOINT_SWING_SPAN: {
- m_swingSpan1=p_value;
- m_swingSpan2=p_value;
+ m_swingSpan1 = p_value;
+ m_swingSpan2 = p_value;
} break;
case PhysicsServer::CONE_TWIST_JOINT_TWIST_SPAN: {
- m_twistSpan=p_value;
+ m_twistSpan = p_value;
} break;
case PhysicsServer::CONE_TWIST_JOINT_BIAS: {
- m_biasFactor=p_value;
+ m_biasFactor = p_value;
} break;
case PhysicsServer::CONE_TWIST_JOINT_SOFTNESS: {
- m_limitSoftness=p_value;
+ m_limitSoftness = p_value;
} break;
case PhysicsServer::CONE_TWIST_JOINT_RELAXATION: {
- m_relaxationFactor=p_value;
+ m_relaxationFactor = p_value;
} break;
}
}
-float ConeTwistJointSW::get_param(PhysicsServer::ConeTwistJointParam p_param) const{
+float ConeTwistJointSW::get_param(PhysicsServer::ConeTwistJointParam p_param) const {
- switch(p_param) {
+ switch (p_param) {
case PhysicsServer::CONE_TWIST_JOINT_SWING_SPAN: {
return m_swingSpan1;
diff --git a/servers/physics/joints/cone_twist_joint_sw.h b/servers/physics/joints/cone_twist_joint_sw.h
index 0d64d6744..f38806cbd 100644
--- a/servers/physics/joints/cone_twist_joint_sw.h
+++ b/servers/physics/joints/cone_twist_joint_sw.h
@@ -51,14 +51,11 @@ Written by: Marcus Hennix
#ifndef CONE_TWIST_JOINT_SW_H
#define CONE_TWIST_JOINT_SW_H
-#include "servers/physics/joints_sw.h"
#include "servers/physics/joints/jacobian_entry_sw.h"
-
-
+#include "servers/physics/joints_sw.h"
///ConeTwistJointSW can be used to simulate ragdoll joints (upper arm, leg etc)
-class ConeTwistJointSW : public JointSW
-{
+class ConeTwistJointSW : public JointSW {
#ifdef IN_PARALLELL_SOLVER
public:
#endif
@@ -72,86 +69,73 @@ public:
BodySW *_arr[2];
};
- JacobianEntrySW m_jac[3]; //3 orthogonal linear constraints
-
+ JacobianEntrySW m_jac[3]; //3 orthogonal linear constraints
real_t m_appliedImpulse;
Transform m_rbAFrame;
Transform m_rbBFrame;
- real_t m_limitSoftness;
- real_t m_biasFactor;
- real_t m_relaxationFactor;
-
- real_t m_swingSpan1;
- real_t m_swingSpan2;
- real_t m_twistSpan;
+ real_t m_limitSoftness;
+ real_t m_biasFactor;
+ real_t m_relaxationFactor;
- Vector3 m_swingAxis;
- Vector3 m_twistAxis;
+ real_t m_swingSpan1;
+ real_t m_swingSpan2;
+ real_t m_twistSpan;
- real_t m_kSwing;
- real_t m_kTwist;
+ Vector3 m_swingAxis;
+ Vector3 m_twistAxis;
- real_t m_twistLimitSign;
- real_t m_swingCorrection;
- real_t m_twistCorrection;
+ real_t m_kSwing;
+ real_t m_kTwist;
- real_t m_accSwingLimitImpulse;
- real_t m_accTwistLimitImpulse;
+ real_t m_twistLimitSign;
+ real_t m_swingCorrection;
+ real_t m_twistCorrection;
- bool m_angularOnly;
- bool m_solveTwistLimit;
- bool m_solveSwingLimit;
+ real_t m_accSwingLimitImpulse;
+ real_t m_accTwistLimitImpulse;
+ bool m_angularOnly;
+ bool m_solveTwistLimit;
+ bool m_solveSwingLimit;
public:
-
virtual PhysicsServer::JointType get_type() const { return PhysicsServer::JOINT_CONE_TWIST; }
virtual bool setup(float p_step);
virtual void solve(float p_step);
- ConeTwistJointSW(BodySW* rbA,BodySW* rbB,const Transform& rbAFrame, const Transform& rbBFrame);
-
+ ConeTwistJointSW(BodySW *rbA, BodySW *rbB, const Transform &rbAFrame, const Transform &rbBFrame);
- void setAngularOnly(bool angularOnly)
- {
+ void setAngularOnly(bool angularOnly) {
m_angularOnly = angularOnly;
}
- void setLimit(real_t _swingSpan1,real_t _swingSpan2,real_t _twistSpan, real_t _softness = 0.8f, real_t _biasFactor = 0.3f, real_t _relaxationFactor = 1.0f)
- {
+ void setLimit(real_t _swingSpan1, real_t _swingSpan2, real_t _twistSpan, real_t _softness = 0.8f, real_t _biasFactor = 0.3f, real_t _relaxationFactor = 1.0f) {
m_swingSpan1 = _swingSpan1;
m_swingSpan2 = _swingSpan2;
- m_twistSpan = _twistSpan;
+ m_twistSpan = _twistSpan;
- m_limitSoftness = _softness;
+ m_limitSoftness = _softness;
m_biasFactor = _biasFactor;
m_relaxationFactor = _relaxationFactor;
}
- inline int getSolveTwistLimit()
- {
+ inline int getSolveTwistLimit() {
return m_solveTwistLimit;
}
- inline int getSolveSwingLimit()
- {
+ inline int getSolveSwingLimit() {
return m_solveTwistLimit;
}
- inline real_t getTwistLimitSign()
- {
+ inline real_t getTwistLimitSign() {
return m_twistLimitSign;
}
void set_param(PhysicsServer::ConeTwistJointParam p_param, float p_value);
float get_param(PhysicsServer::ConeTwistJointParam p_param) const;
-
-
};
-
-
#endif // CONE_TWIST_JOINT_SW_H
diff --git a/servers/physics/joints/generic_6dof_joint_sw.cpp b/servers/physics/joints/generic_6dof_joint_sw.cpp
index cd643a853..929bf0f0b 100644
--- a/servers/physics/joints/generic_6dof_joint_sw.cpp
+++ b/servers/physics/joints/generic_6dof_joint_sw.cpp
@@ -34,167 +34,128 @@ See corresponding header file for licensing info.
#include "generic_6dof_joint_sw.h"
-
-
#define GENERIC_D6_DISABLE_WARMSTARTING 1
-real_t btGetMatrixElem(const Matrix3& mat, int index);
-real_t btGetMatrixElem(const Matrix3& mat, int index)
-{
- int i = index%3;
- int j = index/3;
+real_t btGetMatrixElem(const Matrix3 &mat, int index);
+real_t btGetMatrixElem(const Matrix3 &mat, int index) {
+ int i = index % 3;
+ int j = index / 3;
return mat[i][j];
}
///MatrixToEulerXYZ from http://www.geometrictools.com/LibFoundation/Mathematics/Wm4Matrix3.inl.html
-bool matrixToEulerXYZ(const Matrix3& mat,Vector3& xyz);
-bool matrixToEulerXYZ(const Matrix3& mat,Vector3& xyz)
-{
-// // rot = cy*cz -cy*sz sy
-// // cz*sx*sy+cx*sz cx*cz-sx*sy*sz -cy*sx
-// // -cx*cz*sy+sx*sz cz*sx+cx*sy*sz cx*cy
-//
-
- if (btGetMatrixElem(mat,2) < real_t(1.0))
- {
- if (btGetMatrixElem(mat,2) > real_t(-1.0))
- {
- xyz[0] = Math::atan2(-btGetMatrixElem(mat,5),btGetMatrixElem(mat,8));
- xyz[1] = Math::asin(btGetMatrixElem(mat,2));
- xyz[2] = Math::atan2(-btGetMatrixElem(mat,1),btGetMatrixElem(mat,0));
- return true;
- }
- else
- {
- // WARNING. Not unique. XA - ZA = -atan2(r10,r11)
- xyz[0] = -Math::atan2(btGetMatrixElem(mat,3),btGetMatrixElem(mat,4));
- xyz[1] = -Math_PI*0.5;
- xyz[2] = real_t(0.0);
- return false;
- }
- }
- else
- {
- // WARNING. Not unique. XAngle + ZAngle = atan2(r10,r11)
- xyz[0] = Math::atan2(btGetMatrixElem(mat,3),btGetMatrixElem(mat,4));
- xyz[1] = Math_PI*0.5;
- xyz[2] = 0.0;
+bool matrixToEulerXYZ(const Matrix3 &mat, Vector3 &xyz);
+bool matrixToEulerXYZ(const Matrix3 &mat, Vector3 &xyz) {
+ // // rot = cy*cz -cy*sz sy
+ // // cz*sx*sy+cx*sz cx*cz-sx*sy*sz -cy*sx
+ // // -cx*cz*sy+sx*sz cz*sx+cx*sy*sz cx*cy
+ //
+ if (btGetMatrixElem(mat, 2) < real_t(1.0)) {
+ if (btGetMatrixElem(mat, 2) > real_t(-1.0)) {
+ xyz[0] = Math::atan2(-btGetMatrixElem(mat, 5), btGetMatrixElem(mat, 8));
+ xyz[1] = Math::asin(btGetMatrixElem(mat, 2));
+ xyz[2] = Math::atan2(-btGetMatrixElem(mat, 1), btGetMatrixElem(mat, 0));
+ return true;
+ } else {
+ // WARNING. Not unique. XA - ZA = -atan2(r10,r11)
+ xyz[0] = -Math::atan2(btGetMatrixElem(mat, 3), btGetMatrixElem(mat, 4));
+ xyz[1] = -Math_PI * 0.5;
+ xyz[2] = real_t(0.0);
+ return false;
}
-
+ } else {
+ // WARNING. Not unique. XAngle + ZAngle = atan2(r10,r11)
+ xyz[0] = Math::atan2(btGetMatrixElem(mat, 3), btGetMatrixElem(mat, 4));
+ xyz[1] = Math_PI * 0.5;
+ xyz[2] = 0.0;
+ }
return false;
}
-
-
//////////////////////////// G6DOFRotationalLimitMotorSW ////////////////////////////////////
-
-int G6DOFRotationalLimitMotorSW::testLimitValue(real_t test_value)
-{
- if(m_loLimit>m_hiLimit)
- {
- m_currentLimit = 0;//Free from violation
+int G6DOFRotationalLimitMotorSW::testLimitValue(real_t test_value) {
+ if (m_loLimit > m_hiLimit) {
+ m_currentLimit = 0; //Free from violation
return 0;
}
- if (test_value < m_loLimit)
- {
- m_currentLimit = 1;//low limit violation
- m_currentLimitError = test_value - m_loLimit;
+ if (test_value < m_loLimit) {
+ m_currentLimit = 1; //low limit violation
+ m_currentLimitError = test_value - m_loLimit;
return 1;
- }
- else if (test_value> m_hiLimit)
- {
- m_currentLimit = 2;//High limit violation
+ } else if (test_value > m_hiLimit) {
+ m_currentLimit = 2; //High limit violation
m_currentLimitError = test_value - m_hiLimit;
return 2;
};
- m_currentLimit = 0;//Free from violation
+ m_currentLimit = 0; //Free from violation
return 0;
-
}
-
real_t G6DOFRotationalLimitMotorSW::solveAngularLimits(
- real_t timeStep,Vector3& axis,real_t jacDiagABInv,
- BodySW * body0, BodySW * body1)
-{
- if (needApplyTorques()==false) return 0.0f;
+ real_t timeStep, Vector3 &axis, real_t jacDiagABInv,
+ BodySW *body0, BodySW *body1) {
+ if (needApplyTorques() == false) return 0.0f;
- real_t target_velocity = m_targetVelocity;
- real_t maxMotorForce = m_maxMotorForce;
+ real_t target_velocity = m_targetVelocity;
+ real_t maxMotorForce = m_maxMotorForce;
//current error correction
- if (m_currentLimit!=0)
- {
- target_velocity = -m_ERP*m_currentLimitError/(timeStep);
- maxMotorForce = m_maxLimitForce;
- }
-
- maxMotorForce *= timeStep;
-
- // current velocity difference
- Vector3 vel_diff = body0->get_angular_velocity();
- if (body1)
- {
- vel_diff -= body1->get_angular_velocity();
- }
+ if (m_currentLimit != 0) {
+ target_velocity = -m_ERP * m_currentLimitError / (timeStep);
+ maxMotorForce = m_maxLimitForce;
+ }
+ maxMotorForce *= timeStep;
+ // current velocity difference
+ Vector3 vel_diff = body0->get_angular_velocity();
+ if (body1) {
+ vel_diff -= body1->get_angular_velocity();
+ }
- real_t rel_vel = axis.dot(vel_diff);
+ real_t rel_vel = axis.dot(vel_diff);
// correction velocity
- real_t motor_relvel = m_limitSoftness*(target_velocity - m_damping*rel_vel);
-
-
- if ( motor_relvel < CMP_EPSILON && motor_relvel > -CMP_EPSILON )
- {
- return 0.0f;//no need for applying force
- }
+ real_t motor_relvel = m_limitSoftness * (target_velocity - m_damping * rel_vel);
+ if (motor_relvel < CMP_EPSILON && motor_relvel > -CMP_EPSILON) {
+ return 0.0f; //no need for applying force
+ }
// correction impulse
- real_t unclippedMotorImpulse = (1+m_bounce)*motor_relvel*jacDiagABInv;
+ real_t unclippedMotorImpulse = (1 + m_bounce) * motor_relvel * jacDiagABInv;
// clip correction impulse
- real_t clippedMotorImpulse;
-
- ///@todo: should clip against accumulated impulse
- if (unclippedMotorImpulse>0.0f)
- {
- clippedMotorImpulse = unclippedMotorImpulse > maxMotorForce? maxMotorForce: unclippedMotorImpulse;
- }
- else
- {
- clippedMotorImpulse = unclippedMotorImpulse < -maxMotorForce ? -maxMotorForce: unclippedMotorImpulse;
- }
+ real_t clippedMotorImpulse;
+ ///@todo: should clip against accumulated impulse
+ if (unclippedMotorImpulse > 0.0f) {
+ clippedMotorImpulse = unclippedMotorImpulse > maxMotorForce ? maxMotorForce : unclippedMotorImpulse;
+ } else {
+ clippedMotorImpulse = unclippedMotorImpulse < -maxMotorForce ? -maxMotorForce : unclippedMotorImpulse;
+ }
// sort with accumulated impulses
- real_t lo = real_t(-1e30);
- real_t hi = real_t(1e30);
-
- real_t oldaccumImpulse = m_accumulatedImpulse;
- real_t sum = oldaccumImpulse + clippedMotorImpulse;
- m_accumulatedImpulse = sum > hi ? real_t(0.) : sum < lo ? real_t(0.) : sum;
-
- clippedMotorImpulse = m_accumulatedImpulse - oldaccumImpulse;
-
+ real_t lo = real_t(-1e30);
+ real_t hi = real_t(1e30);
+ real_t oldaccumImpulse = m_accumulatedImpulse;
+ real_t sum = oldaccumImpulse + clippedMotorImpulse;
+ m_accumulatedImpulse = sum > hi ? real_t(0.) : sum < lo ? real_t(0.) : sum;
- Vector3 motorImp = clippedMotorImpulse * axis;
+ clippedMotorImpulse = m_accumulatedImpulse - oldaccumImpulse;
+ Vector3 motorImp = clippedMotorImpulse * axis;
- body0->apply_torque_impulse(motorImp);
- if (body1) body1->apply_torque_impulse(-motorImp);
-
- return clippedMotorImpulse;
-
+ body0->apply_torque_impulse(motorImp);
+ if (body1) body1->apply_torque_impulse(-motorImp);
+ return clippedMotorImpulse;
}
//////////////////////////// End G6DOFRotationalLimitMotorSW ////////////////////////////////////
@@ -202,120 +163,96 @@ real_t G6DOFRotationalLimitMotorSW::solveAngularLimits(
//////////////////////////// G6DOFTranslationalLimitMotorSW ////////////////////////////////////
real_t G6DOFTranslationalLimitMotorSW::solveLinearAxis(
real_t timeStep,
- real_t jacDiagABInv,
- BodySW* body1,const Vector3 &pointInA,
- BodySW* body2,const Vector3 &pointInB,
- int limit_index,
- const Vector3 & axis_normal_on_a,
- const Vector3 & anchorPos)
-{
-
-///find relative velocity
-// Vector3 rel_pos1 = pointInA - body1->get_transform().origin;
-// Vector3 rel_pos2 = pointInB - body2->get_transform().origin;
- Vector3 rel_pos1 = anchorPos - body1->get_transform().origin;
- Vector3 rel_pos2 = anchorPos - body2->get_transform().origin;
-
- Vector3 vel1 = body1->get_velocity_in_local_point(rel_pos1);
- Vector3 vel2 = body2->get_velocity_in_local_point(rel_pos2);
- Vector3 vel = vel1 - vel2;
+ real_t jacDiagABInv,
+ BodySW *body1, const Vector3 &pointInA,
+ BodySW *body2, const Vector3 &pointInB,
+ int limit_index,
+ const Vector3 &axis_normal_on_a,
+ const Vector3 &anchorPos) {
- real_t rel_vel = axis_normal_on_a.dot(vel);
+ ///find relative velocity
+ // Vector3 rel_pos1 = pointInA - body1->get_transform().origin;
+ // Vector3 rel_pos2 = pointInB - body2->get_transform().origin;
+ Vector3 rel_pos1 = anchorPos - body1->get_transform().origin;
+ Vector3 rel_pos2 = anchorPos - body2->get_transform().origin;
+ Vector3 vel1 = body1->get_velocity_in_local_point(rel_pos1);
+ Vector3 vel2 = body2->get_velocity_in_local_point(rel_pos2);
+ Vector3 vel = vel1 - vel2;
+ real_t rel_vel = axis_normal_on_a.dot(vel);
-/// apply displacement correction
+ /// apply displacement correction
-//positional error (zeroth order error)
- real_t depth = -(pointInA - pointInB).dot(axis_normal_on_a);
- real_t lo = real_t(-1e30);
- real_t hi = real_t(1e30);
+ //positional error (zeroth order error)
+ real_t depth = -(pointInA - pointInB).dot(axis_normal_on_a);
+ real_t lo = real_t(-1e30);
+ real_t hi = real_t(1e30);
- real_t minLimit = m_lowerLimit[limit_index];
- real_t maxLimit = m_upperLimit[limit_index];
+ real_t minLimit = m_lowerLimit[limit_index];
+ real_t maxLimit = m_upperLimit[limit_index];
- //handle the limits
- if (minLimit < maxLimit)
- {
- {
- if (depth > maxLimit)
- {
- depth -= maxLimit;
- lo = real_t(0.);
-
- }
- else
- {
- if (depth < minLimit)
- {
- depth -= minLimit;
- hi = real_t(0.);
- }
- else
+ //handle the limits
+ if (minLimit < maxLimit) {
{
- return 0.0f;
+ if (depth > maxLimit) {
+ depth -= maxLimit;
+ lo = real_t(0.);
+
+ } else {
+ if (depth < minLimit) {
+ depth -= minLimit;
+ hi = real_t(0.);
+ } else {
+ return 0.0f;
+ }
+ }
}
- }
}
- }
- real_t normalImpulse= m_limitSoftness[limit_index]*(m_restitution[limit_index]*depth/timeStep - m_damping[limit_index]*rel_vel) * jacDiagABInv;
+ real_t normalImpulse = m_limitSoftness[limit_index] * (m_restitution[limit_index] * depth / timeStep - m_damping[limit_index] * rel_vel) * jacDiagABInv;
+ real_t oldNormalImpulse = m_accumulatedImpulse[limit_index];
+ real_t sum = oldNormalImpulse + normalImpulse;
+ m_accumulatedImpulse[limit_index] = sum > hi ? real_t(0.) : sum < lo ? real_t(0.) : sum;
+ normalImpulse = m_accumulatedImpulse[limit_index] - oldNormalImpulse;
-
-
- real_t oldNormalImpulse = m_accumulatedImpulse[limit_index];
- real_t sum = oldNormalImpulse + normalImpulse;
- m_accumulatedImpulse[limit_index] = sum > hi ? real_t(0.) : sum < lo ? real_t(0.) : sum;
- normalImpulse = m_accumulatedImpulse[limit_index] - oldNormalImpulse;
-
- Vector3 impulse_vector = axis_normal_on_a * normalImpulse;
- body1->apply_impulse( rel_pos1, impulse_vector);
- body2->apply_impulse( rel_pos2, -impulse_vector);
- return normalImpulse;
+ Vector3 impulse_vector = axis_normal_on_a * normalImpulse;
+ body1->apply_impulse(rel_pos1, impulse_vector);
+ body2->apply_impulse(rel_pos2, -impulse_vector);
+ return normalImpulse;
}
//////////////////////////// G6DOFTranslationalLimitMotorSW ////////////////////////////////////
-
-Generic6DOFJointSW::Generic6DOFJointSW(BodySW* rbA, BodySW* rbB, const Transform& frameInA, const Transform& frameInB, bool useLinearReferenceFrameA)
- : JointSW(_arr,2)
- , m_frameInA(frameInA)
- , m_frameInB(frameInB),
- m_useLinearReferenceFrameA(useLinearReferenceFrameA)
-{
- A=rbA;
- B=rbB;
- A->add_constraint(this,0);
- B->add_constraint(this,1);
+Generic6DOFJointSW::Generic6DOFJointSW(BodySW *rbA, BodySW *rbB, const Transform &frameInA, const Transform &frameInB, bool useLinearReferenceFrameA)
+ : JointSW(_arr, 2), m_frameInA(frameInA), m_frameInB(frameInB),
+ m_useLinearReferenceFrameA(useLinearReferenceFrameA) {
+ A = rbA;
+ B = rbB;
+ A->add_constraint(this, 0);
+ B->add_constraint(this, 1);
}
+void Generic6DOFJointSW::calculateAngleInfo() {
+ Matrix3 relative_frame = m_calculatedTransformA.basis.inverse() * m_calculatedTransformB.basis;
-
-
-
-void Generic6DOFJointSW::calculateAngleInfo()
-{
- Matrix3 relative_frame = m_calculatedTransformA.basis.inverse()*m_calculatedTransformB.basis;
-
- matrixToEulerXYZ(relative_frame,m_calculatedAxisAngleDiff);
-
-
+ matrixToEulerXYZ(relative_frame, m_calculatedAxisAngleDiff);
// in euler angle mode we do not actually constrain the angular velocity
- // along the axes axis[0] and axis[2] (although we do use axis[1]) :
- //
- // to get constrain w2-w1 along ...not
- // ------ --------------------- ------
- // d(angle[0])/dt = 0 ax[1] x ax[2] ax[0]
- // d(angle[1])/dt = 0 ax[1]
- // d(angle[2])/dt = 0 ax[0] x ax[1] ax[2]
- //
- // constraining w2-w1 along an axis 'a' means that a'*(w2-w1)=0.
- // to prove the result for angle[0], write the expression for angle[0] from
- // GetInfo1 then take the derivative. to prove this for angle[2] it is
- // easier to take the euler rate expression for d(angle[2])/dt with respect
- // to the components of w and set that to 0.
+ // along the axes axis[0] and axis[2] (although we do use axis[1]) :
+ //
+ // to get constrain w2-w1 along ...not
+ // ------ --------------------- ------
+ // d(angle[0])/dt = 0 ax[1] x ax[2] ax[0]
+ // d(angle[1])/dt = 0 ax[1]
+ // d(angle[2])/dt = 0 ax[0] x ax[1] ax[2]
+ //
+ // constraining w2-w1 along an axis 'a' means that a'*(w2-w1)=0.
+ // to prove the result for angle[0], write the expression for angle[0] from
+ // GetInfo1 then take the derivative. to prove this for angle[2] it is
+ // easier to take the euler rate expression for d(angle[2])/dt with respect
+ // to the components of w and set that to 0.
Vector3 axis0 = m_calculatedTransformB.basis.get_axis(0);
Vector3 axis2 = m_calculatedTransformA.basis.get_axis(2);
@@ -324,291 +261,260 @@ void Generic6DOFJointSW::calculateAngleInfo()
m_calculatedAxis[0] = m_calculatedAxis[1].cross(axis2);
m_calculatedAxis[2] = axis0.cross(m_calculatedAxis[1]);
-
-// if(m_debugDrawer)
-// {
-//
-// char buff[300];
-// sprintf(buff,"\n X: %.2f ; Y: %.2f ; Z: %.2f ",
-// m_calculatedAxisAngleDiff[0],
-// m_calculatedAxisAngleDiff[1],
-// m_calculatedAxisAngleDiff[2]);
-// m_debugDrawer->reportErrorWarning(buff);
-// }
-
+ // if(m_debugDrawer)
+ // {
+ //
+ // char buff[300];
+ // sprintf(buff,"\n X: %.2f ; Y: %.2f ; Z: %.2f ",
+ // m_calculatedAxisAngleDiff[0],
+ // m_calculatedAxisAngleDiff[1],
+ // m_calculatedAxisAngleDiff[2]);
+ // m_debugDrawer->reportErrorWarning(buff);
+ // }
}
-void Generic6DOFJointSW::calculateTransforms()
-{
- m_calculatedTransformA = A->get_transform() * m_frameInA;
- m_calculatedTransformB = B->get_transform() * m_frameInB;
+void Generic6DOFJointSW::calculateTransforms() {
+ m_calculatedTransformA = A->get_transform() * m_frameInA;
+ m_calculatedTransformB = B->get_transform() * m_frameInB;
- calculateAngleInfo();
+ calculateAngleInfo();
}
-
void Generic6DOFJointSW::buildLinearJacobian(
- JacobianEntrySW & jacLinear,const Vector3 & normalWorld,
- const Vector3 & pivotAInW,const Vector3 & pivotBInW)
-{
- memnew_placement(&jacLinear, JacobianEntrySW(
- A->get_transform().basis.transposed(),
- B->get_transform().basis.transposed(),
- pivotAInW - A->get_transform().origin,
- pivotBInW - B->get_transform().origin,
- normalWorld,
- A->get_inv_inertia(),
- A->get_inv_mass(),
- B->get_inv_inertia(),
- B->get_inv_mass()));
-
+ JacobianEntrySW &jacLinear, const Vector3 &normalWorld,
+ const Vector3 &pivotAInW, const Vector3 &pivotBInW) {
+ memnew_placement(&jacLinear, JacobianEntrySW(
+ A->get_transform().basis.transposed(),
+ B->get_transform().basis.transposed(),
+ pivotAInW - A->get_transform().origin,
+ pivotBInW - B->get_transform().origin,
+ normalWorld,
+ A->get_inv_inertia(),
+ A->get_inv_mass(),
+ B->get_inv_inertia(),
+ B->get_inv_mass()));
}
void Generic6DOFJointSW::buildAngularJacobian(
- JacobianEntrySW & jacAngular,const Vector3 & jointAxisW)
-{
- memnew_placement(&jacAngular, JacobianEntrySW(jointAxisW,
- A->get_transform().basis.transposed(),
- B->get_transform().basis.transposed(),
- A->get_inv_inertia(),
- B->get_inv_inertia()));
-
+ JacobianEntrySW &jacAngular, const Vector3 &jointAxisW) {
+ memnew_placement(&jacAngular, JacobianEntrySW(jointAxisW,
+ A->get_transform().basis.transposed(),
+ B->get_transform().basis.transposed(),
+ A->get_inv_inertia(),
+ B->get_inv_inertia()));
}
-bool Generic6DOFJointSW::testAngularLimitMotor(int axis_index)
-{
- real_t angle = m_calculatedAxisAngleDiff[axis_index];
+bool Generic6DOFJointSW::testAngularLimitMotor(int axis_index) {
+ real_t angle = m_calculatedAxisAngleDiff[axis_index];
- //test limits
- m_angularLimits[axis_index].testLimitValue(angle);
- return m_angularLimits[axis_index].needApplyTorques();
+ //test limits
+ m_angularLimits[axis_index].testLimitValue(angle);
+ return m_angularLimits[axis_index].needApplyTorques();
}
bool Generic6DOFJointSW::setup(float p_step) {
// Clear accumulated impulses for the next simulation step
- m_linearLimits.m_accumulatedImpulse=Vector3(real_t(0.), real_t(0.), real_t(0.));
- int i;
- for(i = 0; i < 3; i++)
- {
- m_angularLimits[i].m_accumulatedImpulse = real_t(0.);
- }
- //calculates transform
- calculateTransforms();
+ m_linearLimits.m_accumulatedImpulse = Vector3(real_t(0.), real_t(0.), real_t(0.));
+ int i;
+ for (i = 0; i < 3; i++) {
+ m_angularLimits[i].m_accumulatedImpulse = real_t(0.);
+ }
+ //calculates transform
+ calculateTransforms();
-// const Vector3& pivotAInW = m_calculatedTransformA.origin;
-// const Vector3& pivotBInW = m_calculatedTransformB.origin;
+ // const Vector3& pivotAInW = m_calculatedTransformA.origin;
+ // const Vector3& pivotBInW = m_calculatedTransformB.origin;
calcAnchorPos();
Vector3 pivotAInW = m_AnchorPos;
Vector3 pivotBInW = m_AnchorPos;
-// not used here
-// Vector3 rel_pos1 = pivotAInW - A->get_transform().origin;
-// Vector3 rel_pos2 = pivotBInW - B->get_transform().origin;
+ // not used here
+ // Vector3 rel_pos1 = pivotAInW - A->get_transform().origin;
+ // Vector3 rel_pos2 = pivotBInW - B->get_transform().origin;
- Vector3 normalWorld;
- //linear part
- for (i=0;i<3;i++)
- {
- if (m_linearLimits.enable_limit[i] && m_linearLimits.isLimited(i))
- {
+ Vector3 normalWorld;
+ //linear part
+ for (i = 0; i < 3; i++) {
+ if (m_linearLimits.enable_limit[i] && m_linearLimits.isLimited(i)) {
if (m_useLinearReferenceFrameA)
- normalWorld = m_calculatedTransformA.basis.get_axis(i);
+ normalWorld = m_calculatedTransformA.basis.get_axis(i);
else
- normalWorld = m_calculatedTransformB.basis.get_axis(i);
-
- buildLinearJacobian(
- m_jacLinear[i],normalWorld ,
- pivotAInW,pivotBInW);
+ normalWorld = m_calculatedTransformB.basis.get_axis(i);
+ buildLinearJacobian(
+ m_jacLinear[i], normalWorld,
+ pivotAInW, pivotBInW);
+ }
}
- }
- // angular part
- for (i=0;i<3;i++)
- {
- //calculates error angle
- if (m_angularLimits[i].m_enableLimit && testAngularLimitMotor(i))
- {
- normalWorld = this->getAxis(i);
- // Create angular atom
- buildAngularJacobian(m_jacAng[i],normalWorld);
+ // angular part
+ for (i = 0; i < 3; i++) {
+ //calculates error angle
+ if (m_angularLimits[i].m_enableLimit && testAngularLimitMotor(i)) {
+ normalWorld = this->getAxis(i);
+ // Create angular atom
+ buildAngularJacobian(m_jacAng[i], normalWorld);
+ }
}
- }
return true;
}
+void Generic6DOFJointSW::solve(real_t timeStep) {
+ m_timeStep = timeStep;
-void Generic6DOFJointSW::solve(real_t timeStep)
-{
- m_timeStep = timeStep;
-
- //calculateTransforms();
+ //calculateTransforms();
- int i;
+ int i;
- // linear
+ // linear
- Vector3 pointInA = m_calculatedTransformA.origin;
+ Vector3 pointInA = m_calculatedTransformA.origin;
Vector3 pointInB = m_calculatedTransformB.origin;
real_t jacDiagABInv;
Vector3 linear_axis;
- for (i=0;i<3;i++)
- {
- if (m_linearLimits.enable_limit[i] && m_linearLimits.isLimited(i))
- {
- jacDiagABInv = real_t(1.) / m_jacLinear[i].getDiagonal();
+ for (i = 0; i < 3; i++) {
+ if (m_linearLimits.enable_limit[i] && m_linearLimits.isLimited(i)) {
+ jacDiagABInv = real_t(1.) / m_jacLinear[i].getDiagonal();
if (m_useLinearReferenceFrameA)
- linear_axis = m_calculatedTransformA.basis.get_axis(i);
+ linear_axis = m_calculatedTransformA.basis.get_axis(i);
else
- linear_axis = m_calculatedTransformB.basis.get_axis(i);
-
- m_linearLimits.solveLinearAxis(
- m_timeStep,
- jacDiagABInv,
- A,pointInA,
- B,pointInB,
- i,linear_axis, m_AnchorPos);
+ linear_axis = m_calculatedTransformB.basis.get_axis(i);
+ m_linearLimits.solveLinearAxis(
+ m_timeStep,
+ jacDiagABInv,
+ A, pointInA,
+ B, pointInB,
+ i, linear_axis, m_AnchorPos);
+ }
}
- }
- // angular
- Vector3 angular_axis;
- real_t angularJacDiagABInv;
- for (i=0;i<3;i++)
- {
- if (m_angularLimits[i].m_enableLimit && m_angularLimits[i].needApplyTorques())
- {
+ // angular
+ Vector3 angular_axis;
+ real_t angularJacDiagABInv;
+ for (i = 0; i < 3; i++) {
+ if (m_angularLimits[i].m_enableLimit && m_angularLimits[i].needApplyTorques()) {
// get axis
angular_axis = getAxis(i);
angularJacDiagABInv = real_t(1.) / m_jacAng[i].getDiagonal();
- m_angularLimits[i].solveAngularLimits(m_timeStep,angular_axis,angularJacDiagABInv, A,B);
+ m_angularLimits[i].solveAngularLimits(m_timeStep, angular_axis, angularJacDiagABInv, A, B);
+ }
}
- }
}
-void Generic6DOFJointSW::updateRHS(real_t timeStep)
-{
- (void)timeStep;
-
+void Generic6DOFJointSW::updateRHS(real_t timeStep) {
+ (void)timeStep;
}
-Vector3 Generic6DOFJointSW::getAxis(int axis_index) const
-{
- return m_calculatedAxis[axis_index];
+Vector3 Generic6DOFJointSW::getAxis(int axis_index) const {
+ return m_calculatedAxis[axis_index];
}
-real_t Generic6DOFJointSW::getAngle(int axis_index) const
-{
- return m_calculatedAxisAngleDiff[axis_index];
+real_t Generic6DOFJointSW::getAngle(int axis_index) const {
+ return m_calculatedAxisAngleDiff[axis_index];
}
-void Generic6DOFJointSW::calcAnchorPos(void)
-{
+void Generic6DOFJointSW::calcAnchorPos(void) {
real_t imA = A->get_inv_mass();
real_t imB = B->get_inv_mass();
real_t weight;
- if(imB == real_t(0.0))
- {
+ if (imB == real_t(0.0)) {
weight = real_t(1.0);
- }
- else
- {
+ } else {
weight = imA / (imA + imB);
}
- const Vector3& pA = m_calculatedTransformA.origin;
- const Vector3& pB = m_calculatedTransformB.origin;
+ const Vector3 &pA = m_calculatedTransformA.origin;
+ const Vector3 &pB = m_calculatedTransformB.origin;
m_AnchorPos = pA * weight + pB * (real_t(1.0) - weight);
return;
} // Generic6DOFJointSW::calcAnchorPos()
+void Generic6DOFJointSW::set_param(Vector3::Axis p_axis, PhysicsServer::G6DOFJointAxisParam p_param, float p_value) {
-void Generic6DOFJointSW::set_param(Vector3::Axis p_axis,PhysicsServer::G6DOFJointAxisParam p_param, float p_value) {
-
- ERR_FAIL_INDEX(p_axis,3);
- switch(p_param) {
+ ERR_FAIL_INDEX(p_axis, 3);
+ switch (p_param) {
case PhysicsServer::G6DOF_JOINT_LINEAR_LOWER_LIMIT: {
- m_linearLimits.m_lowerLimit[p_axis]=p_value;
+ m_linearLimits.m_lowerLimit[p_axis] = p_value;
} break;
case PhysicsServer::G6DOF_JOINT_LINEAR_UPPER_LIMIT: {
- m_linearLimits.m_upperLimit[p_axis]=p_value;
+ m_linearLimits.m_upperLimit[p_axis] = p_value;
} break;
case PhysicsServer::G6DOF_JOINT_LINEAR_LIMIT_SOFTNESS: {
- m_linearLimits.m_limitSoftness[p_axis]=p_value;
+ m_linearLimits.m_limitSoftness[p_axis] = p_value;
} break;
case PhysicsServer::G6DOF_JOINT_LINEAR_RESTITUTION: {
- m_linearLimits.m_restitution[p_axis]=p_value;
+ m_linearLimits.m_restitution[p_axis] = p_value;
} break;
case PhysicsServer::G6DOF_JOINT_LINEAR_DAMPING: {
- m_linearLimits.m_damping[p_axis]=p_value;
+ m_linearLimits.m_damping[p_axis] = p_value;
} break;
case PhysicsServer::G6DOF_JOINT_ANGULAR_LOWER_LIMIT: {
- m_angularLimits[p_axis].m_loLimit=p_value;
+ m_angularLimits[p_axis].m_loLimit = p_value;
} break;
case PhysicsServer::G6DOF_JOINT_ANGULAR_UPPER_LIMIT: {
- m_angularLimits[p_axis].m_hiLimit=p_value;
+ m_angularLimits[p_axis].m_hiLimit = p_value;
} break;
case PhysicsServer::G6DOF_JOINT_ANGULAR_LIMIT_SOFTNESS: {
- m_angularLimits[p_axis].m_limitSoftness=p_value;
+ m_angularLimits[p_axis].m_limitSoftness = p_value;
} break;
case PhysicsServer::G6DOF_JOINT_ANGULAR_DAMPING: {
- m_angularLimits[p_axis].m_damping=p_value;
+ m_angularLimits[p_axis].m_damping = p_value;
} break;
case PhysicsServer::G6DOF_JOINT_ANGULAR_RESTITUTION: {
- m_angularLimits[p_axis].m_bounce=p_value;
+ m_angularLimits[p_axis].m_bounce = p_value;
} break;
case PhysicsServer::G6DOF_JOINT_ANGULAR_FORCE_LIMIT: {
- m_angularLimits[p_axis].m_maxLimitForce=p_value;
+ m_angularLimits[p_axis].m_maxLimitForce = p_value;
} break;
case PhysicsServer::G6DOF_JOINT_ANGULAR_ERP: {
- m_angularLimits[p_axis].m_ERP=p_value;
+ m_angularLimits[p_axis].m_ERP = p_value;
} break;
case PhysicsServer::G6DOF_JOINT_ANGULAR_MOTOR_TARGET_VELOCITY: {
- m_angularLimits[p_axis].m_targetVelocity=p_value;
+ m_angularLimits[p_axis].m_targetVelocity = p_value;
} break;
case PhysicsServer::G6DOF_JOINT_ANGULAR_MOTOR_FORCE_LIMIT: {
- m_angularLimits[p_axis].m_maxLimitForce=p_value;
+ m_angularLimits[p_axis].m_maxLimitForce = p_value;
} break;
}
}
-float Generic6DOFJointSW::get_param(Vector3::Axis p_axis,PhysicsServer::G6DOFJointAxisParam p_param) const{
- ERR_FAIL_INDEX_V(p_axis,3,0);
- switch(p_param) {
+float Generic6DOFJointSW::get_param(Vector3::Axis p_axis, PhysicsServer::G6DOFJointAxisParam p_param) const {
+ ERR_FAIL_INDEX_V(p_axis, 3, 0);
+ switch (p_param) {
case PhysicsServer::G6DOF_JOINT_LINEAR_LOWER_LIMIT: {
return m_linearLimits.m_lowerLimit[p_axis];
@@ -682,31 +588,29 @@ float Generic6DOFJointSW::get_param(Vector3::Axis p_axis,PhysicsServer::G6DOFJoi
return 0;
}
-void Generic6DOFJointSW::set_flag(Vector3::Axis p_axis,PhysicsServer::G6DOFJointAxisFlag p_flag, bool p_value){
+void Generic6DOFJointSW::set_flag(Vector3::Axis p_axis, PhysicsServer::G6DOFJointAxisFlag p_flag, bool p_value) {
- ERR_FAIL_INDEX(p_axis,3);
+ ERR_FAIL_INDEX(p_axis, 3);
- switch(p_flag) {
+ switch (p_flag) {
case PhysicsServer::G6DOF_JOINT_FLAG_ENABLE_LINEAR_LIMIT: {
- m_linearLimits.enable_limit[p_axis]=p_value;
+ m_linearLimits.enable_limit[p_axis] = p_value;
} break;
case PhysicsServer::G6DOF_JOINT_FLAG_ENABLE_ANGULAR_LIMIT: {
- m_angularLimits[p_axis].m_enableLimit=p_value;
+ m_angularLimits[p_axis].m_enableLimit = p_value;
} break;
case PhysicsServer::G6DOF_JOINT_FLAG_ENABLE_MOTOR: {
- m_angularLimits[p_axis].m_enableMotor=p_value;
+ m_angularLimits[p_axis].m_enableMotor = p_value;
} break;
}
-
-
}
-bool Generic6DOFJointSW::get_flag(Vector3::Axis p_axis,PhysicsServer::G6DOFJointAxisFlag p_flag) const{
+bool Generic6DOFJointSW::get_flag(Vector3::Axis p_axis, PhysicsServer::G6DOFJointAxisFlag p_flag) const {
- ERR_FAIL_INDEX_V(p_axis,3,0);
- switch(p_flag) {
+ ERR_FAIL_INDEX_V(p_axis, 3, 0);
+ switch (p_flag) {
case PhysicsServer::G6DOF_JOINT_FLAG_ENABLE_LINEAR_LIMIT: {
return m_linearLimits.enable_limit[p_axis];
diff --git a/servers/physics/joints/generic_6dof_joint_sw.h b/servers/physics/joints/generic_6dof_joint_sw.h
index 4ac727c12..c226c5990 100644
--- a/servers/physics/joints/generic_6dof_joint_sw.h
+++ b/servers/physics/joints/generic_6dof_joint_sw.h
@@ -34,9 +34,8 @@ Adapted to Godot from the Bullet library.
#ifndef GENERIC_6DOF_JOINT_SW_H
#define GENERIC_6DOF_JOINT_SW_H
-#include "servers/physics/joints_sw.h"
#include "servers/physics/joints/jacobian_entry_sw.h"
-
+#include "servers/physics/joints_sw.h"
/*
Bullet Continuous Collision Detection and Physics Library
@@ -53,7 +52,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
/*
2007-09-09
Generic6DOFJointSW Refactored by Francisco Le?n
@@ -61,80 +59,73 @@ email: projectileman@yahoo.com
http://gimpact.sf.net
*/
-
//! Rotation Limit structure for generic joints
class G6DOFRotationalLimitMotorSW {
public:
- //! limit_parameters
- //!@{
- real_t m_loLimit;//!< joint limit
- real_t m_hiLimit;//!< joint limit
- real_t m_targetVelocity;//!< target motor velocity
- real_t m_maxMotorForce;//!< max force on motor
- real_t m_maxLimitForce;//!< max force on limit
- real_t m_damping;//!< Damping.
- real_t m_limitSoftness;//! Relaxation factor
- real_t m_ERP;//!< Error tolerance factor when joint is at limit
- real_t m_bounce;//!< restitution factor
- bool m_enableMotor;
- bool m_enableLimit;
+ //! limit_parameters
+ //!@{
+ real_t m_loLimit; //!< joint limit
+ real_t m_hiLimit; //!< joint limit
+ real_t m_targetVelocity; //!< target motor velocity
+ real_t m_maxMotorForce; //!< max force on motor
+ real_t m_maxLimitForce; //!< max force on limit
+ real_t m_damping; //!< Damping.
+ real_t m_limitSoftness; //! Relaxation factor
+ real_t m_ERP; //!< Error tolerance factor when joint is at limit
+ real_t m_bounce; //!< restitution factor
+ bool m_enableMotor;
+ bool m_enableLimit;
- //!@}
-
- //! temp_variables
- //!@{
- real_t m_currentLimitError;//! How much is violated this limit
- int m_currentLimit;//!< 0=free, 1=at lo limit, 2=at hi limit
- real_t m_accumulatedImpulse;
- //!@}
-
- G6DOFRotationalLimitMotorSW()
- {
- m_accumulatedImpulse = 0.f;
- m_targetVelocity = 0;
- m_maxMotorForce = 0.1f;
- m_maxLimitForce = 300.0f;
- m_loLimit = -1e30;
- m_hiLimit = 1e30;
- m_ERP = 0.5f;
- m_bounce = 0.0f;
- m_damping = 1.0f;
- m_limitSoftness = 0.5f;
- m_currentLimit = 0;
- m_currentLimitError = 0;
- m_enableMotor = false;
- m_enableLimit=false;
- }
+ //!@}
- G6DOFRotationalLimitMotorSW(const G6DOFRotationalLimitMotorSW & limot)
- {
- m_targetVelocity = limot.m_targetVelocity;
- m_maxMotorForce = limot.m_maxMotorForce;
- m_limitSoftness = limot.m_limitSoftness;
- m_loLimit = limot.m_loLimit;
- m_hiLimit = limot.m_hiLimit;
- m_ERP = limot.m_ERP;
- m_bounce = limot.m_bounce;
- m_currentLimit = limot.m_currentLimit;
- m_currentLimitError = limot.m_currentLimitError;
- m_enableMotor = limot.m_enableMotor;
- }
+ //! temp_variables
+ //!@{
+ real_t m_currentLimitError; //! How much is violated this limit
+ int m_currentLimit; //!< 0=free, 1=at lo limit, 2=at hi limit
+ real_t m_accumulatedImpulse;
+ //!@}
+ G6DOFRotationalLimitMotorSW() {
+ m_accumulatedImpulse = 0.f;
+ m_targetVelocity = 0;
+ m_maxMotorForce = 0.1f;
+ m_maxLimitForce = 300.0f;
+ m_loLimit = -1e30;
+ m_hiLimit = 1e30;
+ m_ERP = 0.5f;
+ m_bounce = 0.0f;
+ m_damping = 1.0f;
+ m_limitSoftness = 0.5f;
+ m_currentLimit = 0;
+ m_currentLimitError = 0;
+ m_enableMotor = false;
+ m_enableLimit = false;
+ }
+ G6DOFRotationalLimitMotorSW(const G6DOFRotationalLimitMotorSW &limot) {
+ m_targetVelocity = limot.m_targetVelocity;
+ m_maxMotorForce = limot.m_maxMotorForce;
+ m_limitSoftness = limot.m_limitSoftness;
+ m_loLimit = limot.m_loLimit;
+ m_hiLimit = limot.m_hiLimit;
+ m_ERP = limot.m_ERP;
+ m_bounce = limot.m_bounce;
+ m_currentLimit = limot.m_currentLimit;
+ m_currentLimitError = limot.m_currentLimitError;
+ m_enableMotor = limot.m_enableMotor;
+ }
//! Is limited
- bool isLimited()
- {
- if(m_loLimit>=m_hiLimit) return false;
- return true;
- }
+ bool isLimited() {
+ if (m_loLimit >= m_hiLimit) return false;
+ return true;
+ }
//! Need apply correction
- bool needApplyTorques()
- {
- if(m_currentLimit == 0 && m_enableMotor == false) return false;
- return true;
- }
+ bool needApplyTorques() {
+ if (m_currentLimit == 0 && m_enableMotor == false) return false;
+ return true;
+ }
//! calculates error
/*!
@@ -143,84 +134,69 @@ public:
int testLimitValue(real_t test_value);
//! apply the correction impulses for two bodies
- real_t solveAngularLimits(real_t timeStep,Vector3& axis, real_t jacDiagABInv,BodySW * body0, BodySW * body1);
-
-
+ real_t solveAngularLimits(real_t timeStep, Vector3 &axis, real_t jacDiagABInv, BodySW *body0, BodySW *body1);
};
-
-
-class G6DOFTranslationalLimitMotorSW
-{
+class G6DOFTranslationalLimitMotorSW {
public:
- Vector3 m_lowerLimit;//!< the constraint lower limits
- Vector3 m_upperLimit;//!< the constraint upper limits
- Vector3 m_accumulatedImpulse;
- //! Linear_Limit_parameters
- //!@{
- Vector3 m_limitSoftness;//!< Softness for linear limit
- Vector3 m_damping;//!< Damping for linear limit
- Vector3 m_restitution;//! Bounce parameter for linear limit
- //!@}
- bool enable_limit[3];
+ Vector3 m_lowerLimit; //!< the constraint lower limits
+ Vector3 m_upperLimit; //!< the constraint upper limits
+ Vector3 m_accumulatedImpulse;
+ //! Linear_Limit_parameters
+ //!@{
+ Vector3 m_limitSoftness; //!< Softness for linear limit
+ Vector3 m_damping; //!< Damping for linear limit
+ Vector3 m_restitution; //! Bounce parameter for linear limit
+ //!@}
+ bool enable_limit[3];
- G6DOFTranslationalLimitMotorSW()
- {
- m_lowerLimit=Vector3(0.f,0.f,0.f);
- m_upperLimit=Vector3(0.f,0.f,0.f);
- m_accumulatedImpulse=Vector3(0.f,0.f,0.f);
+ G6DOFTranslationalLimitMotorSW() {
+ m_lowerLimit = Vector3(0.f, 0.f, 0.f);
+ m_upperLimit = Vector3(0.f, 0.f, 0.f);
+ m_accumulatedImpulse = Vector3(0.f, 0.f, 0.f);
- m_limitSoftness = Vector3(1,1,1)*0.7f;
- m_damping = Vector3(1,1,1)*real_t(1.0f);
- m_restitution = Vector3(1,1,1)*real_t(0.5f);
+ m_limitSoftness = Vector3(1, 1, 1) * 0.7f;
+ m_damping = Vector3(1, 1, 1) * real_t(1.0f);
+ m_restitution = Vector3(1, 1, 1) * real_t(0.5f);
- enable_limit[0]=true;
- enable_limit[1]=true;
- enable_limit[2]=true;
- }
+ enable_limit[0] = true;
+ enable_limit[1] = true;
+ enable_limit[2] = true;
+ }
- G6DOFTranslationalLimitMotorSW(const G6DOFTranslationalLimitMotorSW & other )
- {
- m_lowerLimit = other.m_lowerLimit;
- m_upperLimit = other.m_upperLimit;
- m_accumulatedImpulse = other.m_accumulatedImpulse;
+ G6DOFTranslationalLimitMotorSW(const G6DOFTranslationalLimitMotorSW &other) {
+ m_lowerLimit = other.m_lowerLimit;
+ m_upperLimit = other.m_upperLimit;
+ m_accumulatedImpulse = other.m_accumulatedImpulse;
- m_limitSoftness = other.m_limitSoftness ;
- m_damping = other.m_damping;
- m_restitution = other.m_restitution;
- }
+ m_limitSoftness = other.m_limitSoftness;
+ m_damping = other.m_damping;
+ m_restitution = other.m_restitution;
+ }
- //! Test limit
+ //! Test limit
/*!
- free means upper < lower,
- locked means upper == lower
- limited means upper > lower
- limitIndex: first 3 are linear, next 3 are angular
*/
- inline bool isLimited(int limitIndex)
- {
- return (m_upperLimit[limitIndex] >= m_lowerLimit[limitIndex]);
- }
-
-
- real_t solveLinearAxis(
- real_t timeStep,
- real_t jacDiagABInv,
- BodySW* body1,const Vector3 &pointInA,
- BodySW* body2,const Vector3 &pointInB,
- int limit_index,
- const Vector3 & axis_normal_on_a,
- const Vector3 & anchorPos);
-
+ inline bool isLimited(int limitIndex) {
+ return (m_upperLimit[limitIndex] >= m_lowerLimit[limitIndex]);
+ }
+ real_t solveLinearAxis(
+ real_t timeStep,
+ real_t jacDiagABInv,
+ BodySW *body1, const Vector3 &pointInA,
+ BodySW *body2, const Vector3 &pointInB,
+ int limit_index,
+ const Vector3 &axis_normal_on_a,
+ const Vector3 &anchorPos);
};
-
-class Generic6DOFJointSW : public JointSW
-{
+class Generic6DOFJointSW : public JointSW {
protected:
-
-
union {
struct {
BodySW *A;
@@ -231,195 +207,167 @@ protected:
};
//! relative_frames
- //!@{
- Transform m_frameInA;//!< the constraint space w.r.t body A
- Transform m_frameInB;//!< the constraint space w.r.t body B
- //!@}
+ //!@{
+ Transform m_frameInA; //!< the constraint space w.r.t body A
+ Transform m_frameInB; //!< the constraint space w.r.t body B
+ //!@}
- //! Jacobians
- //!@{
- JacobianEntrySW m_jacLinear[3];//!< 3 orthogonal linear constraints
- JacobianEntrySW m_jacAng[3];//!< 3 orthogonal angular constraints
- //!@}
+ //! Jacobians
+ //!@{
+ JacobianEntrySW m_jacLinear[3]; //!< 3 orthogonal linear constraints
+ JacobianEntrySW m_jacAng[3]; //!< 3 orthogonal angular constraints
+ //!@}
//! Linear_Limit_parameters
- //!@{
- G6DOFTranslationalLimitMotorSW m_linearLimits;
- //!@}
-
-
- //! hinge_parameters
- //!@{
- G6DOFRotationalLimitMotorSW m_angularLimits[3];
+ //!@{
+ G6DOFTranslationalLimitMotorSW m_linearLimits;
//!@}
+ //! hinge_parameters
+ //!@{
+ G6DOFRotationalLimitMotorSW m_angularLimits[3];
+ //!@}
protected:
- //! temporal variables
- //!@{
- real_t m_timeStep;
- Transform m_calculatedTransformA;
- Transform m_calculatedTransformB;
- Vector3 m_calculatedAxisAngleDiff;
- Vector3 m_calculatedAxis[3];
+ //! temporal variables
+ //!@{
+ real_t m_timeStep;
+ Transform m_calculatedTransformA;
+ Transform m_calculatedTransformB;
+ Vector3 m_calculatedAxisAngleDiff;
+ Vector3 m_calculatedAxis[3];
Vector3 m_AnchorPos; // point betwen pivots of bodies A and B to solve linear axes
- bool m_useLinearReferenceFrameA;
-
- //!@}
-
- Generic6DOFJointSW& operator=(Generic6DOFJointSW& other)
- {
- ERR_PRINT("pito");
- (void) other;
- return *this;
- }
-
+ bool m_useLinearReferenceFrameA;
+ //!@}
- void buildLinearJacobian(
- JacobianEntrySW & jacLinear,const Vector3 & normalWorld,
- const Vector3 & pivotAInW,const Vector3 & pivotBInW);
+ Generic6DOFJointSW &operator=(Generic6DOFJointSW &other) {
+ ERR_PRINT("pito");
+ (void)other;
+ return *this;
+ }
- void buildAngularJacobian(JacobianEntrySW & jacAngular,const Vector3 & jointAxisW);
+ void buildLinearJacobian(
+ JacobianEntrySW &jacLinear, const Vector3 &normalWorld,
+ const Vector3 &pivotAInW, const Vector3 &pivotBInW);
+ void buildAngularJacobian(JacobianEntrySW &jacAngular, const Vector3 &jointAxisW);
//! calcs the euler angles between the two bodies.
- void calculateAngleInfo();
-
-
+ void calculateAngleInfo();
public:
- Generic6DOFJointSW(BodySW* rbA, BodySW* rbB, const Transform& frameInA, const Transform& frameInB ,bool useLinearReferenceFrameA);
-
- virtual PhysicsServer::JointType get_type() const { return PhysicsServer::JOINT_6DOF; }
+ Generic6DOFJointSW(BodySW *rbA, BodySW *rbB, const Transform &frameInA, const Transform &frameInB, bool useLinearReferenceFrameA);
- virtual bool setup(float p_step);
- virtual void solve(float p_step);
+ virtual PhysicsServer::JointType get_type() const { return PhysicsServer::JOINT_6DOF; }
+ virtual bool setup(float p_step);
+ virtual void solve(float p_step);
//! Calcs global transform of the offsets
/*!
Calcs the global transform for the joint offset for body A an B, and also calcs the agle differences between the bodies.
\sa Generic6DOFJointSW.getCalculatedTransformA , Generic6DOFJointSW.getCalculatedTransformB, Generic6DOFJointSW.calculateAngleInfo
*/
- void calculateTransforms();
+ void calculateTransforms();
//! Gets the global transform of the offset for body A
- /*!
+ /*!
\sa Generic6DOFJointSW.getFrameOffsetA, Generic6DOFJointSW.getFrameOffsetB, Generic6DOFJointSW.calculateAngleInfo.
*/
- const Transform & getCalculatedTransformA() const
- {
- return m_calculatedTransformA;
- }
+ const Transform &getCalculatedTransformA() const {
+ return m_calculatedTransformA;
+ }
- //! Gets the global transform of the offset for body B
- /*!
+ //! Gets the global transform of the offset for body B
+ /*!
\sa Generic6DOFJointSW.getFrameOffsetA, Generic6DOFJointSW.getFrameOffsetB, Generic6DOFJointSW.calculateAngleInfo.
*/
- const Transform & getCalculatedTransformB() const
- {
- return m_calculatedTransformB;
- }
-
- const Transform & getFrameOffsetA() const
- {
- return m_frameInA;
- }
-
- const Transform & getFrameOffsetB() const
- {
- return m_frameInB;
- }
+ const Transform &getCalculatedTransformB() const {
+ return m_calculatedTransformB;
+ }
+ const Transform &getFrameOffsetA() const {
+ return m_frameInA;
+ }
- Transform & getFrameOffsetA()
- {
- return m_frameInA;
- }
+ const Transform &getFrameOffsetB() const {
+ return m_frameInB;
+ }
- Transform & getFrameOffsetB()
- {
- return m_frameInB;
- }
+ Transform &getFrameOffsetA() {
+ return m_frameInA;
+ }
+ Transform &getFrameOffsetB() {
+ return m_frameInB;
+ }
//! performs Jacobian calculation, and also calculates angle differences and axis
-
- void updateRHS(real_t timeStep);
+ void updateRHS(real_t timeStep);
//! Get the rotation axis in global coordinates
/*!
\pre Generic6DOFJointSW.buildJacobian must be called previously.
*/
- Vector3 getAxis(int axis_index) const;
+ Vector3 getAxis(int axis_index) const;
- //! Get the relative Euler angle
- /*!
+ //! Get the relative Euler angle
+ /*!
\pre Generic6DOFJointSW.buildJacobian must be called previously.
*/
- real_t getAngle(int axis_index) const;
+ real_t getAngle(int axis_index) const;
//! Test angular limit.
/*!
Calculates angular correction and returns true if limit needs to be corrected.
\pre Generic6DOFJointSW.buildJacobian must be called previously.
*/
- bool testAngularLimitMotor(int axis_index);
+ bool testAngularLimitMotor(int axis_index);
- void setLinearLowerLimit(const Vector3& linearLower)
- {
- m_linearLimits.m_lowerLimit = linearLower;
- }
+ void setLinearLowerLimit(const Vector3 &linearLower) {
+ m_linearLimits.m_lowerLimit = linearLower;
+ }
- void setLinearUpperLimit(const Vector3& linearUpper)
- {
- m_linearLimits.m_upperLimit = linearUpper;
- }
+ void setLinearUpperLimit(const Vector3 &linearUpper) {
+ m_linearLimits.m_upperLimit = linearUpper;
+ }
- void setAngularLowerLimit(const Vector3& angularLower)
- {
- m_angularLimits[0].m_loLimit = angularLower.x;
- m_angularLimits[1].m_loLimit = angularLower.y;
- m_angularLimits[2].m_loLimit = angularLower.z;
- }
+ void setAngularLowerLimit(const Vector3 &angularLower) {
+ m_angularLimits[0].m_loLimit = angularLower.x;
+ m_angularLimits[1].m_loLimit = angularLower.y;
+ m_angularLimits[2].m_loLimit = angularLower.z;
+ }
- void setAngularUpperLimit(const Vector3& angularUpper)
- {
- m_angularLimits[0].m_hiLimit = angularUpper.x;
- m_angularLimits[1].m_hiLimit = angularUpper.y;
- m_angularLimits[2].m_hiLimit = angularUpper.z;
- }
+ void setAngularUpperLimit(const Vector3 &angularUpper) {
+ m_angularLimits[0].m_hiLimit = angularUpper.x;
+ m_angularLimits[1].m_hiLimit = angularUpper.y;
+ m_angularLimits[2].m_hiLimit = angularUpper.z;
+ }
//! Retrieves the angular limit informacion
- G6DOFRotationalLimitMotorSW * getRotationalLimitMotor(int index)
- {
- return &m_angularLimits[index];
- }
-
- //! Retrieves the limit informacion
- G6DOFTranslationalLimitMotorSW * getTranslationalLimitMotor()
- {
- return &m_linearLimits;
- }
+ G6DOFRotationalLimitMotorSW *getRotationalLimitMotor(int index) {
+ return &m_angularLimits[index];
+ }
- //first 3 are linear, next 3 are angular
- void setLimit(int axis, real_t lo, real_t hi)
- {
- if(axis<3)
- {
- m_linearLimits.m_lowerLimit[axis] = lo;
- m_linearLimits.m_upperLimit[axis] = hi;
+ //! Retrieves the limit informacion
+ G6DOFTranslationalLimitMotorSW *getTranslationalLimitMotor() {
+ return &m_linearLimits;
}
- else
- {
- m_angularLimits[axis-3].m_loLimit = lo;
- m_angularLimits[axis-3].m_hiLimit = hi;
+
+ //first 3 are linear, next 3 are angular
+ void setLimit(int axis, real_t lo, real_t hi) {
+ if (axis < 3) {
+ m_linearLimits.m_lowerLimit[axis] = lo;
+ m_linearLimits.m_upperLimit[axis] = hi;
+ } else {
+ m_angularLimits[axis - 3].m_loLimit = lo;
+ m_angularLimits[axis - 3].m_hiLimit = hi;
+ }
}
- }
//! Test limit
/*!
@@ -428,34 +376,27 @@ public:
- limited means upper > lower
- limitIndex: first 3 are linear, next 3 are angular
*/
- bool isLimited(int limitIndex)
- {
- if(limitIndex<3)
- {
+ bool isLimited(int limitIndex) {
+ if (limitIndex < 3) {
return m_linearLimits.isLimited(limitIndex);
-
+ }
+ return m_angularLimits[limitIndex - 3].isLimited();
}
- return m_angularLimits[limitIndex-3].isLimited();
- }
- const BodySW* getRigidBodyA() const
- {
- return A;
- }
- const BodySW* getRigidBodyB() const
- {
- return B;
- }
+ const BodySW *getRigidBodyA() const {
+ return A;
+ }
+ const BodySW *getRigidBodyB() const {
+ return B;
+ }
virtual void calcAnchorPos(void); // overridable
- void set_param(Vector3::Axis p_axis,PhysicsServer::G6DOFJointAxisParam p_param, float p_value);
- float get_param(Vector3::Axis p_axis,PhysicsServer::G6DOFJointAxisParam p_param) const;
-
- void set_flag(Vector3::Axis p_axis,PhysicsServer::G6DOFJointAxisFlag p_flag, bool p_value);
- bool get_flag(Vector3::Axis p_axis,PhysicsServer::G6DOFJointAxisFlag p_flag) const;
+ void set_param(Vector3::Axis p_axis, PhysicsServer::G6DOFJointAxisParam p_param, float p_value);
+ float get_param(Vector3::Axis p_axis, PhysicsServer::G6DOFJointAxisParam p_param) const;
+ void set_flag(Vector3::Axis p_axis, PhysicsServer::G6DOFJointAxisFlag p_flag, bool p_value);
+ bool get_flag(Vector3::Axis p_axis, PhysicsServer::G6DOFJointAxisFlag p_flag) const;
};
-
#endif // GENERIC_6DOF_JOINT_SW_H
diff --git a/servers/physics/joints/hinge_joint_sw.cpp b/servers/physics/joints/hinge_joint_sw.cpp
index 6f552db3a..190f8fe33 100644
--- a/servers/physics/joints/hinge_joint_sw.cpp
+++ b/servers/physics/joints/hinge_joint_sw.cpp
@@ -34,65 +34,63 @@ See corresponding header file for licensing info.
#include "hinge_joint_sw.h"
-static void plane_space(const Vector3& n, Vector3& p, Vector3& q) {
+static void plane_space(const Vector3 &n, Vector3 &p, Vector3 &q) {
- if (Math::abs(n.z) > 0.707106781186547524400844362) {
- // choose p in y-z plane
- real_t a = n[1]*n[1] + n[2]*n[2];
- real_t k = 1.0/Math::sqrt(a);
- p=Vector3(0,-n[2]*k,n[1]*k);
- // set q = n x p
- q=Vector3(a*k,-n[0]*p[2],n[0]*p[1]);
- }
- else {
- // choose p in x-y plane
- real_t a = n.x*n.x + n.y*n.y;
- real_t k = 1.0/Math::sqrt(a);
- p=Vector3(-n.y*k,n.x*k,0);
- // set q = n x p
- q=Vector3(-n.z*p.y,n.z*p.x,a*k);
- }
+ if (Math::abs(n.z) > 0.707106781186547524400844362) {
+ // choose p in y-z plane
+ real_t a = n[1] * n[1] + n[2] * n[2];
+ real_t k = 1.0 / Math::sqrt(a);
+ p = Vector3(0, -n[2] * k, n[1] * k);
+ // set q = n x p
+ q = Vector3(a * k, -n[0] * p[2], n[0] * p[1]);
+ } else {
+ // choose p in x-y plane
+ real_t a = n.x * n.x + n.y * n.y;
+ real_t k = 1.0 / Math::sqrt(a);
+ p = Vector3(-n.y * k, n.x * k, 0);
+ // set q = n x p
+ q = Vector3(-n.z * p.y, n.z * p.x, a * k);
+ }
}
-HingeJointSW::HingeJointSW(BodySW* rbA,BodySW* rbB, const Transform& frameA, const Transform& frameB) : JointSW(_arr,2) {
+HingeJointSW::HingeJointSW(BodySW *rbA, BodySW *rbB, const Transform &frameA, const Transform &frameB)
+ : JointSW(_arr, 2) {
- A=rbA;
- B=rbB;
+ A = rbA;
+ B = rbB;
- m_rbAFrame=frameA;
- m_rbBFrame=frameB;
+ m_rbAFrame = frameA;
+ m_rbBFrame = frameB;
// flip axis
m_rbBFrame.basis[0][2] *= real_t(-1.);
m_rbBFrame.basis[1][2] *= real_t(-1.);
m_rbBFrame.basis[2][2] *= real_t(-1.);
-
//start with free
m_lowerLimit = Math_PI;
m_upperLimit = -Math_PI;
-
m_useLimit = false;
m_biasFactor = 0.3f;
m_relaxationFactor = 1.0f;
m_limitSoftness = 0.9f;
m_solveLimit = false;
- tau=0.3;
-
- m_angularOnly=false;
- m_enableAngularMotor=false;
+ tau = 0.3;
- A->add_constraint(this,0);
- B->add_constraint(this,1);
+ m_angularOnly = false;
+ m_enableAngularMotor = false;
+ A->add_constraint(this, 0);
+ B->add_constraint(this, 1);
}
-HingeJointSW::HingeJointSW(BodySW* rbA,BodySW* rbB, const Vector3& pivotInA,const Vector3& pivotInB,
- const Vector3& axisInA,const Vector3& axisInB) : JointSW(_arr,2) {
+HingeJointSW::HingeJointSW(BodySW *rbA, BodySW *rbB, const Vector3 &pivotInA, const Vector3 &pivotInB,
+ const Vector3 &axisInA, const Vector3 &axisInB)
+ : JointSW(_arr, 2) {
- A=rbA;
- B=rbB;
+ A = rbA;
+ B = rbB;
m_rbAFrame.origin = pivotInA;
@@ -112,76 +110,67 @@ HingeJointSW::HingeJointSW(BodySW* rbA,BodySW* rbB, const Vector3& pivotInA,cons
rbAxisA1 = rbAxisA2.cross(axisInA);
}
- m_rbAFrame.basis=Matrix3( rbAxisA1.x,rbAxisA2.x,axisInA.x,
- rbAxisA1.y,rbAxisA2.y,axisInA.y,
- rbAxisA1.z,rbAxisA2.z,axisInA.z );
+ m_rbAFrame.basis = Matrix3(rbAxisA1.x, rbAxisA2.x, axisInA.x,
+ rbAxisA1.y, rbAxisA2.y, axisInA.y,
+ rbAxisA1.z, rbAxisA2.z, axisInA.z);
- Quat rotationArc = Quat(axisInA,axisInB);
- Vector3 rbAxisB1 = rotationArc.xform(rbAxisA1);
- Vector3 rbAxisB2 = axisInB.cross(rbAxisB1);
+ Quat rotationArc = Quat(axisInA, axisInB);
+ Vector3 rbAxisB1 = rotationArc.xform(rbAxisA1);
+ Vector3 rbAxisB2 = axisInB.cross(rbAxisB1);
m_rbBFrame.origin = pivotInB;
- m_rbBFrame.basis=Matrix3( rbAxisB1.x,rbAxisB2.x,-axisInB.x,
- rbAxisB1.y,rbAxisB2.y,-axisInB.y,
- rbAxisB1.z,rbAxisB2.z,-axisInB.z );
+ m_rbBFrame.basis = Matrix3(rbAxisB1.x, rbAxisB2.x, -axisInB.x,
+ rbAxisB1.y, rbAxisB2.y, -axisInB.y,
+ rbAxisB1.z, rbAxisB2.z, -axisInB.z);
//start with free
m_lowerLimit = Math_PI;
m_upperLimit = -Math_PI;
-
m_useLimit = false;
m_biasFactor = 0.3f;
m_relaxationFactor = 1.0f;
m_limitSoftness = 0.9f;
m_solveLimit = false;
- tau=0.3;
-
- m_angularOnly=false;
- m_enableAngularMotor=false;
+ tau = 0.3;
- A->add_constraint(this,0);
- B->add_constraint(this,1);
+ m_angularOnly = false;
+ m_enableAngularMotor = false;
+ A->add_constraint(this, 0);
+ B->add_constraint(this, 1);
}
-
-
bool HingeJointSW::setup(float p_step) {
m_appliedImpulse = real_t(0.);
- if (!m_angularOnly)
- {
+ if (!m_angularOnly) {
Vector3 pivotAInW = A->get_transform().xform(m_rbAFrame.origin);
Vector3 pivotBInW = B->get_transform().xform(m_rbBFrame.origin);
Vector3 relPos = pivotBInW - pivotAInW;
Vector3 normal[3];
- if (relPos.length_squared() > CMP_EPSILON)
- {
+ if (relPos.length_squared() > CMP_EPSILON) {
normal[0] = relPos.normalized();
- }
- else
- {
- normal[0]=Vector3(real_t(1.0),0,0);
+ } else {
+ normal[0] = Vector3(real_t(1.0), 0, 0);
}
plane_space(normal[0], normal[1], normal[2]);
- for (int i=0;i<3;i++)
- {
+ for (int i = 0; i < 3; i++) {
memnew_placement(&m_jac[i], JacobianEntrySW(
- A->get_transform().basis.transposed(),
- B->get_transform().basis.transposed(),
- pivotAInW - A->get_transform().origin,
- pivotBInW - B->get_transform().origin,
- normal[i],
- A->get_inv_inertia(),
- A->get_inv_mass(),
- B->get_inv_inertia(),
- B->get_inv_mass()) );
+ A->get_transform().basis.transposed(),
+ B->get_transform().basis.transposed(),
+ pivotAInW - A->get_transform().origin,
+ pivotBInW - B->get_transform().origin,
+ normal[i],
+ A->get_inv_inertia(),
+ A->get_inv_mass(),
+ B->get_inv_inertia(),
+ B->get_inv_mass()));
}
}
@@ -192,62 +181,56 @@ bool HingeJointSW::setup(float p_step) {
Vector3 jointAxis0local;
Vector3 jointAxis1local;
- plane_space(m_rbAFrame.basis.get_axis(2),jointAxis0local,jointAxis1local);
-
- A->get_transform().basis.xform( m_rbAFrame.basis.get_axis(2) );
- Vector3 jointAxis0 = A->get_transform().basis.xform( jointAxis0local );
- Vector3 jointAxis1 = A->get_transform().basis.xform( jointAxis1local );
- Vector3 hingeAxisWorld = A->get_transform().basis.xform( m_rbAFrame.basis.get_axis(2) );
+ plane_space(m_rbAFrame.basis.get_axis(2), jointAxis0local, jointAxis1local);
- memnew_placement(&m_jacAng[0], JacobianEntrySW(jointAxis0,
- A->get_transform().basis.transposed(),
- B->get_transform().basis.transposed(),
- A->get_inv_inertia(),
- B->get_inv_inertia()));
+ A->get_transform().basis.xform(m_rbAFrame.basis.get_axis(2));
+ Vector3 jointAxis0 = A->get_transform().basis.xform(jointAxis0local);
+ Vector3 jointAxis1 = A->get_transform().basis.xform(jointAxis1local);
+ Vector3 hingeAxisWorld = A->get_transform().basis.xform(m_rbAFrame.basis.get_axis(2));
- memnew_placement(&m_jacAng[1], JacobianEntrySW(jointAxis1,
- A->get_transform().basis.transposed(),
- B->get_transform().basis.transposed(),
- A->get_inv_inertia(),
- B->get_inv_inertia()));
+ memnew_placement(&m_jacAng[0], JacobianEntrySW(jointAxis0,
+ A->get_transform().basis.transposed(),
+ B->get_transform().basis.transposed(),
+ A->get_inv_inertia(),
+ B->get_inv_inertia()));
- memnew_placement(&m_jacAng[2], JacobianEntrySW(hingeAxisWorld,
- A->get_transform().basis.transposed(),
- B->get_transform().basis.transposed(),
- A->get_inv_inertia(),
- B->get_inv_inertia()));
+ memnew_placement(&m_jacAng[1], JacobianEntrySW(jointAxis1,
+ A->get_transform().basis.transposed(),
+ B->get_transform().basis.transposed(),
+ A->get_inv_inertia(),
+ B->get_inv_inertia()));
+ memnew_placement(&m_jacAng[2], JacobianEntrySW(hingeAxisWorld,
+ A->get_transform().basis.transposed(),
+ B->get_transform().basis.transposed(),
+ A->get_inv_inertia(),
+ B->get_inv_inertia()));
// Compute limit information
real_t hingeAngle = get_hinge_angle();
-// print_line("angle: "+rtos(hingeAngle));
+ // print_line("angle: "+rtos(hingeAngle));
//set bias, sign, clear accumulator
m_correction = real_t(0.);
m_limitSign = real_t(0.);
m_solveLimit = false;
m_accLimitImpulse = real_t(0.);
-
-
/*if (m_useLimit) {
print_line("low: "+rtos(m_lowerLimit));
print_line("hi: "+rtos(m_upperLimit));
}*/
-// if (m_lowerLimit < m_upperLimit)
- if (m_useLimit && m_lowerLimit <= m_upperLimit)
- {
-// if (hingeAngle <= m_lowerLimit*m_limitSoftness)
- if (hingeAngle <= m_lowerLimit)
- {
+ // if (m_lowerLimit < m_upperLimit)
+ if (m_useLimit && m_lowerLimit <= m_upperLimit) {
+ // if (hingeAngle <= m_lowerLimit*m_limitSoftness)
+ if (hingeAngle <= m_lowerLimit) {
m_correction = (m_lowerLimit - hingeAngle);
m_limitSign = 1.0f;
m_solveLimit = true;
}
-// else if (hingeAngle >= m_upperLimit*m_limitSoftness)
- else if (hingeAngle >= m_upperLimit)
- {
+ // else if (hingeAngle >= m_upperLimit*m_limitSoftness)
+ else if (hingeAngle >= m_upperLimit) {
m_correction = m_upperLimit - hingeAngle;
m_limitSign = -1.0f;
m_solveLimit = true;
@@ -255,9 +238,9 @@ bool HingeJointSW::setup(float p_step) {
}
//Compute K = J*W*J' for hinge axis
- Vector3 axisA = A->get_transform().basis.xform( m_rbAFrame.basis.get_axis(2) );
- m_kHinge = 1.0f / (A->compute_angular_impulse_denominator(axisA) +
- B->compute_angular_impulse_denominator(axisA));
+ Vector3 axisA = A->get_transform().basis.xform(m_rbAFrame.basis.get_axis(2));
+ m_kHinge = 1.0f / (A->compute_angular_impulse_denominator(axisA) +
+ B->compute_angular_impulse_denominator(axisA));
return true;
}
@@ -270,8 +253,7 @@ void HingeJointSW::solve(float p_step) {
//real_t tau = real_t(0.3);
//linear part
- if (!m_angularOnly)
- {
+ if (!m_angularOnly) {
Vector3 rel_pos1 = pivotAInW - A->get_transform().origin;
Vector3 rel_pos2 = pivotBInW - B->get_transform().origin;
@@ -279,80 +261,74 @@ void HingeJointSW::solve(float p_step) {
Vector3 vel2 = B->get_velocity_in_local_point(rel_pos2);
Vector3 vel = vel1 - vel2;
- for (int i=0;i<3;i++)
- {
- const Vector3& normal = m_jac[i].m_linearJointAxis;
+ for (int i = 0; i < 3; i++) {
+ const Vector3 &normal = m_jac[i].m_linearJointAxis;
real_t jacDiagABInv = real_t(1.) / m_jac[i].getDiagonal();
real_t rel_vel;
rel_vel = normal.dot(vel);
//positional error (zeroth order error)
real_t depth = -(pivotAInW - pivotBInW).dot(normal); //this is the error projected on the normal
- real_t impulse = depth*tau/p_step * jacDiagABInv - rel_vel * jacDiagABInv;
+ real_t impulse = depth * tau / p_step * jacDiagABInv - rel_vel * jacDiagABInv;
m_appliedImpulse += impulse;
Vector3 impulse_vector = normal * impulse;
- A->apply_impulse(pivotAInW - A->get_transform().origin,impulse_vector);
- B->apply_impulse(pivotBInW - B->get_transform().origin,-impulse_vector);
+ A->apply_impulse(pivotAInW - A->get_transform().origin, impulse_vector);
+ B->apply_impulse(pivotBInW - B->get_transform().origin, -impulse_vector);
}
}
-
{
///solve angular part
// get axes in world space
- Vector3 axisA = A->get_transform().basis.xform( m_rbAFrame.basis.get_axis(2) );
- Vector3 axisB = B->get_transform().basis.xform( m_rbBFrame.basis.get_axis(2) );
+ Vector3 axisA = A->get_transform().basis.xform(m_rbAFrame.basis.get_axis(2));
+ Vector3 axisB = B->get_transform().basis.xform(m_rbBFrame.basis.get_axis(2));
- const Vector3& angVelA = A->get_angular_velocity();
- const Vector3& angVelB = B->get_angular_velocity();
+ const Vector3 &angVelA = A->get_angular_velocity();
+ const Vector3 &angVelB = B->get_angular_velocity();
Vector3 angVelAroundHingeAxisA = axisA * axisA.dot(angVelA);
Vector3 angVelAroundHingeAxisB = axisB * axisB.dot(angVelB);
Vector3 angAorthog = angVelA - angVelAroundHingeAxisA;
Vector3 angBorthog = angVelB - angVelAroundHingeAxisB;
- Vector3 velrelOrthog = angAorthog-angBorthog;
+ Vector3 velrelOrthog = angAorthog - angBorthog;
{
//solve orthogonal angular velocity correction
real_t relaxation = real_t(1.);
real_t len = velrelOrthog.length();
- if (len > real_t(0.00001))
- {
+ if (len > real_t(0.00001)) {
Vector3 normal = velrelOrthog.normalized();
real_t denom = A->compute_angular_impulse_denominator(normal) +
- B->compute_angular_impulse_denominator(normal);
+ B->compute_angular_impulse_denominator(normal);
// scale for mass and relaxation
- velrelOrthog *= (real_t(1.)/denom) * m_relaxationFactor;
+ velrelOrthog *= (real_t(1.) / denom) * m_relaxationFactor;
}
//solve angular positional correction
- Vector3 angularError = -axisA.cross(axisB) *(real_t(1.)/p_step);
+ Vector3 angularError = -axisA.cross(axisB) * (real_t(1.) / p_step);
real_t len2 = angularError.length();
- if (len2>real_t(0.00001))
- {
+ if (len2 > real_t(0.00001)) {
Vector3 normal2 = angularError.normalized();
real_t denom2 = A->compute_angular_impulse_denominator(normal2) +
- B->compute_angular_impulse_denominator(normal2);
- angularError *= (real_t(1.)/denom2) * relaxation;
+ B->compute_angular_impulse_denominator(normal2);
+ angularError *= (real_t(1.) / denom2) * relaxation;
}
- A->apply_torque_impulse(-velrelOrthog+angularError);
- B->apply_torque_impulse(velrelOrthog-angularError);
+ A->apply_torque_impulse(-velrelOrthog + angularError);
+ B->apply_torque_impulse(velrelOrthog - angularError);
// solve limit
- if (m_solveLimit)
- {
- real_t amplitude = ( (angVelB - angVelA).dot( axisA )*m_relaxationFactor + m_correction* (real_t(1.)/p_step)*m_biasFactor ) * m_limitSign;
+ if (m_solveLimit) {
+ real_t amplitude = ((angVelB - angVelA).dot(axisA) * m_relaxationFactor + m_correction * (real_t(1.) / p_step) * m_biasFactor) * m_limitSign;
real_t impulseMag = amplitude * m_kHinge;
// Clamp the accumulated impulse
real_t temp = m_accLimitImpulse;
- m_accLimitImpulse = MAX(m_accLimitImpulse + impulseMag, real_t(0) );
+ m_accLimitImpulse = MAX(m_accLimitImpulse + impulseMag, real_t(0));
impulseMag = m_accLimitImpulse - temp;
-
Vector3 impulse = axisA * impulseMag * m_limitSign;
A->apply_torque_impulse(impulse);
B->apply_torque_impulse(-impulse);
@@ -360,10 +336,9 @@ void HingeJointSW::solve(float p_step) {
}
//apply motor
- if (m_enableAngularMotor)
- {
+ if (m_enableAngularMotor) {
//todo: add limits too
- Vector3 angularLimit(0,0,0);
+ Vector3 angularLimit(0, 0, 0);
Vector3 velrel = angVelAroundHingeAxisA - angVelAroundHingeAxisB;
real_t projRelVel = velrel.dot(axisA);
@@ -377,12 +352,10 @@ void HingeJointSW::solve(float p_step) {
clippedMotorImpulse = clippedMotorImpulse < -m_maxMotorImpulse ? -m_maxMotorImpulse : clippedMotorImpulse;
Vector3 motorImp = clippedMotorImpulse * axisA;
- A->apply_torque_impulse(motorImp+angularLimit);
- B->apply_torque_impulse(-motorImp-angularLimit);
-
+ A->apply_torque_impulse(motorImp + angularLimit);
+ B->apply_torque_impulse(-motorImp - angularLimit);
}
}
-
}
/*
void HingeJointSW::updateRHS(real_t timeStep)
@@ -392,8 +365,7 @@ void HingeJointSW::updateRHS(real_t timeStep)
}
*/
-static _FORCE_INLINE_ real_t atan2fast(real_t y, real_t x)
-{
+static _FORCE_INLINE_ real_t atan2fast(real_t y, real_t x) {
real_t coeff_1 = Math_PI / 4.0f;
real_t coeff_2 = 3.0f * coeff_1;
real_t abs_y = Math::abs(y);
@@ -408,33 +380,30 @@ static _FORCE_INLINE_ real_t atan2fast(real_t y, real_t x)
return (y < 0.0f) ? -angle : angle;
}
-
real_t HingeJointSW::get_hinge_angle() {
- const Vector3 refAxis0 = A->get_transform().basis.xform( m_rbAFrame.basis.get_axis(0) );
- const Vector3 refAxis1 = A->get_transform().basis.xform( m_rbAFrame.basis.get_axis(1) );
- const Vector3 swingAxis = B->get_transform().basis.xform( m_rbBFrame.basis.get_axis(1) );
+ const Vector3 refAxis0 = A->get_transform().basis.xform(m_rbAFrame.basis.get_axis(0));
+ const Vector3 refAxis1 = A->get_transform().basis.xform(m_rbAFrame.basis.get_axis(1));
+ const Vector3 swingAxis = B->get_transform().basis.xform(m_rbBFrame.basis.get_axis(1));
- return atan2fast( swingAxis.dot(refAxis0), swingAxis.dot(refAxis1) );
+ return atan2fast(swingAxis.dot(refAxis0), swingAxis.dot(refAxis1));
}
-
void HingeJointSW::set_param(PhysicsServer::HingeJointParam p_param, float p_value) {
switch (p_param) {
- case PhysicsServer::HINGE_JOINT_BIAS: tau=p_value; break;
- case PhysicsServer::HINGE_JOINT_LIMIT_UPPER: m_upperLimit=p_value; break;
- case PhysicsServer::HINGE_JOINT_LIMIT_LOWER: m_lowerLimit=p_value; break;
- case PhysicsServer::HINGE_JOINT_LIMIT_BIAS: m_biasFactor=p_value; break;
- case PhysicsServer::HINGE_JOINT_LIMIT_SOFTNESS: m_limitSoftness=p_value; break;
- case PhysicsServer::HINGE_JOINT_LIMIT_RELAXATION: m_relaxationFactor=p_value; break;
- case PhysicsServer::HINGE_JOINT_MOTOR_TARGET_VELOCITY: m_motorTargetVelocity=p_value; break;
- case PhysicsServer::HINGE_JOINT_MOTOR_MAX_IMPULSE: m_maxMotorImpulse=p_value; break;
-
+ case PhysicsServer::HINGE_JOINT_BIAS: tau = p_value; break;
+ case PhysicsServer::HINGE_JOINT_LIMIT_UPPER: m_upperLimit = p_value; break;
+ case PhysicsServer::HINGE_JOINT_LIMIT_LOWER: m_lowerLimit = p_value; break;
+ case PhysicsServer::HINGE_JOINT_LIMIT_BIAS: m_biasFactor = p_value; break;
+ case PhysicsServer::HINGE_JOINT_LIMIT_SOFTNESS: m_limitSoftness = p_value; break;
+ case PhysicsServer::HINGE_JOINT_LIMIT_RELAXATION: m_relaxationFactor = p_value; break;
+ case PhysicsServer::HINGE_JOINT_MOTOR_TARGET_VELOCITY: m_motorTargetVelocity = p_value; break;
+ case PhysicsServer::HINGE_JOINT_MOTOR_MAX_IMPULSE: m_maxMotorImpulse = p_value; break;
}
}
-float HingeJointSW::get_param(PhysicsServer::HingeJointParam p_param) const{
+float HingeJointSW::get_param(PhysicsServer::HingeJointParam p_param) const {
switch (p_param) {
@@ -446,25 +415,23 @@ float HingeJointSW::get_param(PhysicsServer::HingeJointParam p_param) const{
case PhysicsServer::HINGE_JOINT_LIMIT_RELAXATION: return m_relaxationFactor;
case PhysicsServer::HINGE_JOINT_MOTOR_TARGET_VELOCITY: return m_motorTargetVelocity;
case PhysicsServer::HINGE_JOINT_MOTOR_MAX_IMPULSE: return m_maxMotorImpulse;
-
}
return 0;
}
-void HingeJointSW::set_flag(PhysicsServer::HingeJointFlag p_flag, bool p_value){
+void HingeJointSW::set_flag(PhysicsServer::HingeJointFlag p_flag, bool p_value) {
switch (p_flag) {
- case PhysicsServer::HINGE_JOINT_FLAG_USE_LIMIT: m_useLimit=p_value; break;
- case PhysicsServer::HINGE_JOINT_FLAG_ENABLE_MOTOR: m_enableAngularMotor=p_value; break;
+ case PhysicsServer::HINGE_JOINT_FLAG_USE_LIMIT: m_useLimit = p_value; break;
+ case PhysicsServer::HINGE_JOINT_FLAG_ENABLE_MOTOR: m_enableAngularMotor = p_value; break;
}
-
}
-bool HingeJointSW::get_flag(PhysicsServer::HingeJointFlag p_flag) const{
+bool HingeJointSW::get_flag(PhysicsServer::HingeJointFlag p_flag) const {
switch (p_flag) {
case PhysicsServer::HINGE_JOINT_FLAG_USE_LIMIT: return m_useLimit;
- case PhysicsServer::HINGE_JOINT_FLAG_ENABLE_MOTOR:return m_enableAngularMotor;
+ case PhysicsServer::HINGE_JOINT_FLAG_ENABLE_MOTOR: return m_enableAngularMotor;
}
return false;
diff --git a/servers/physics/joints/hinge_joint_sw.h b/servers/physics/joints/hinge_joint_sw.h
index 60203e3cc..90852baac 100644
--- a/servers/physics/joints/hinge_joint_sw.h
+++ b/servers/physics/joints/hinge_joint_sw.h
@@ -34,9 +34,8 @@ Adapted to Godot from the Bullet library.
#ifndef HINGE_JOINT_SW_H
#define HINGE_JOINT_SW_H
-#include "servers/physics/joints_sw.h"
#include "servers/physics/joints/jacobian_entry_sw.h"
-
+#include "servers/physics/joints_sw.h"
/*
Bullet Continuous Collision Detection and Physics Library
@@ -53,8 +52,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-
class HingeJointSW : public JointSW {
union {
@@ -66,41 +63,39 @@ class HingeJointSW : public JointSW {
BodySW *_arr[2];
};
- JacobianEntrySW m_jac[3]; //3 orthogonal linear constraints
- JacobianEntrySW m_jacAng[3]; //2 orthogonal angular constraints+ 1 for limit/motor
+ JacobianEntrySW m_jac[3]; //3 orthogonal linear constraints
+ JacobianEntrySW m_jacAng[3]; //2 orthogonal angular constraints+ 1 for limit/motor
Transform m_rbAFrame; // constraint axii. Assumes z is hinge axis.
Transform m_rbBFrame;
- real_t m_motorTargetVelocity;
- real_t m_maxMotorImpulse;
+ real_t m_motorTargetVelocity;
+ real_t m_maxMotorImpulse;
- real_t m_limitSoftness;
- real_t m_biasFactor;
- real_t m_relaxationFactor;
+ real_t m_limitSoftness;
+ real_t m_biasFactor;
+ real_t m_relaxationFactor;
- real_t m_lowerLimit;
- real_t m_upperLimit;
+ real_t m_lowerLimit;
+ real_t m_upperLimit;
- real_t m_kHinge;
+ real_t m_kHinge;
- real_t m_limitSign;
- real_t m_correction;
+ real_t m_limitSign;
+ real_t m_correction;
- real_t m_accLimitImpulse;
+ real_t m_accLimitImpulse;
real_t tau;
- bool m_useLimit;
- bool m_angularOnly;
- bool m_enableAngularMotor;
- bool m_solveLimit;
+ bool m_useLimit;
+ bool m_angularOnly;
+ bool m_enableAngularMotor;
+ bool m_solveLimit;
real_t m_appliedImpulse;
-
public:
-
virtual PhysicsServer::JointType get_type() const { return PhysicsServer::JOINT_HINGE; }
virtual bool setup(float p_step);
@@ -114,9 +109,8 @@ public:
void set_flag(PhysicsServer::HingeJointFlag p_flag, bool p_value);
bool get_flag(PhysicsServer::HingeJointFlag p_flag) const;
- HingeJointSW(BodySW* rbA,BodySW* rbB, const Transform& frameA, const Transform& frameB);
- HingeJointSW(BodySW* rbA,BodySW* rbB, const Vector3& pivotInA,const Vector3& pivotInB, const Vector3& axisInA,const Vector3& axisInB);
-
+ HingeJointSW(BodySW *rbA, BodySW *rbB, const Transform &frameA, const Transform &frameB);
+ HingeJointSW(BodySW *rbA, BodySW *rbB, const Vector3 &pivotInA, const Vector3 &pivotInB, const Vector3 &axisInA, const Vector3 &axisInB);
};
#endif // HINGE_JOINT_SW_H
diff --git a/servers/physics/joints/jacobian_entry_sw.h b/servers/physics/joints/jacobian_entry_sw.h
index 1a5485995..26d04ba88 100644
--- a/servers/physics/joints/jacobian_entry_sw.h
+++ b/servers/physics/joints/jacobian_entry_sw.h
@@ -53,22 +53,21 @@ subject to the following restrictions:
class JacobianEntrySW {
public:
- JacobianEntrySW() {};
+ JacobianEntrySW(){};
//constraint between two different rigidbodies
JacobianEntrySW(
- const Matrix3& world2A,
- const Matrix3& world2B,
- const Vector3& rel_pos1,const Vector3& rel_pos2,
- const Vector3& jointAxis,
- const Vector3& inertiaInvA,
- const real_t massInvA,
- const Vector3& inertiaInvB,
- const real_t massInvB)
- :m_linearJointAxis(jointAxis)
- {
+ const Matrix3 &world2A,
+ const Matrix3 &world2B,
+ const Vector3 &rel_pos1, const Vector3 &rel_pos2,
+ const Vector3 &jointAxis,
+ const Vector3 &inertiaInvA,
+ const real_t massInvA,
+ const Vector3 &inertiaInvB,
+ const real_t massInvB)
+ : m_linearJointAxis(jointAxis) {
m_aJ = world2A.xform(rel_pos1.cross(m_linearJointAxis));
m_bJ = world2B.xform(rel_pos2.cross(-m_linearJointAxis));
- m_0MinvJt = inertiaInvA * m_aJ;
+ m_0MinvJt = inertiaInvA * m_aJ;
m_1MinvJt = inertiaInvB * m_bJ;
m_Adiag = massInvA + m_0MinvJt.dot(m_aJ) + massInvB + m_1MinvJt.dot(m_bJ);
@@ -76,104 +75,92 @@ public:
}
//angular constraint between two different rigidbodies
- JacobianEntrySW(const Vector3& jointAxis,
- const Matrix3& world2A,
- const Matrix3& world2B,
- const Vector3& inertiaInvA,
- const Vector3& inertiaInvB)
- :m_linearJointAxis(Vector3(real_t(0.),real_t(0.),real_t(0.)))
- {
- m_aJ= world2A.xform(jointAxis);
+ JacobianEntrySW(const Vector3 &jointAxis,
+ const Matrix3 &world2A,
+ const Matrix3 &world2B,
+ const Vector3 &inertiaInvA,
+ const Vector3 &inertiaInvB)
+ : m_linearJointAxis(Vector3(real_t(0.), real_t(0.), real_t(0.))) {
+ m_aJ = world2A.xform(jointAxis);
m_bJ = world2B.xform(-jointAxis);
- m_0MinvJt = inertiaInvA * m_aJ;
+ m_0MinvJt = inertiaInvA * m_aJ;
m_1MinvJt = inertiaInvB * m_bJ;
- m_Adiag = m_0MinvJt.dot(m_aJ) + m_1MinvJt.dot(m_bJ);
+ m_Adiag = m_0MinvJt.dot(m_aJ) + m_1MinvJt.dot(m_bJ);
ERR_FAIL_COND(m_Adiag <= real_t(0.0));
}
//angular constraint between two different rigidbodies
- JacobianEntrySW(const Vector3& axisInA,
- const Vector3& axisInB,
- const Vector3& inertiaInvA,
- const Vector3& inertiaInvB)
- : m_linearJointAxis(Vector3(real_t(0.),real_t(0.),real_t(0.)))
- , m_aJ(axisInA)
- , m_bJ(-axisInB)
- {
- m_0MinvJt = inertiaInvA * m_aJ;
+ JacobianEntrySW(const Vector3 &axisInA,
+ const Vector3 &axisInB,
+ const Vector3 &inertiaInvA,
+ const Vector3 &inertiaInvB)
+ : m_linearJointAxis(Vector3(real_t(0.), real_t(0.), real_t(0.))), m_aJ(axisInA), m_bJ(-axisInB) {
+ m_0MinvJt = inertiaInvA * m_aJ;
m_1MinvJt = inertiaInvB * m_bJ;
- m_Adiag = m_0MinvJt.dot(m_aJ) + m_1MinvJt.dot(m_bJ);
+ m_Adiag = m_0MinvJt.dot(m_aJ) + m_1MinvJt.dot(m_bJ);
ERR_FAIL_COND(m_Adiag <= real_t(0.0));
}
//constraint on one rigidbody
JacobianEntrySW(
- const Matrix3& world2A,
- const Vector3& rel_pos1,const Vector3& rel_pos2,
- const Vector3& jointAxis,
- const Vector3& inertiaInvA,
- const real_t massInvA)
- :m_linearJointAxis(jointAxis)
- {
- m_aJ= world2A.xform(rel_pos1.cross(jointAxis));
+ const Matrix3 &world2A,
+ const Vector3 &rel_pos1, const Vector3 &rel_pos2,
+ const Vector3 &jointAxis,
+ const Vector3 &inertiaInvA,
+ const real_t massInvA)
+ : m_linearJointAxis(jointAxis) {
+ m_aJ = world2A.xform(rel_pos1.cross(jointAxis));
m_bJ = world2A.xform(rel_pos2.cross(-jointAxis));
- m_0MinvJt = inertiaInvA * m_aJ;
- m_1MinvJt = Vector3(real_t(0.),real_t(0.),real_t(0.));
+ m_0MinvJt = inertiaInvA * m_aJ;
+ m_1MinvJt = Vector3(real_t(0.), real_t(0.), real_t(0.));
m_Adiag = massInvA + m_0MinvJt.dot(m_aJ);
ERR_FAIL_COND(m_Adiag <= real_t(0.0));
}
- real_t getDiagonal() const { return m_Adiag; }
+ real_t getDiagonal() const { return m_Adiag; }
// for two constraints on the same rigidbody (for example vehicle friction)
- real_t getNonDiagonal(const JacobianEntrySW& jacB, const real_t massInvA) const
- {
- const JacobianEntrySW& jacA = *this;
+ real_t getNonDiagonal(const JacobianEntrySW &jacB, const real_t massInvA) const {
+ const JacobianEntrySW &jacA = *this;
real_t lin = massInvA * jacA.m_linearJointAxis.dot(jacB.m_linearJointAxis);
real_t ang = jacA.m_0MinvJt.dot(jacB.m_aJ);
return lin + ang;
}
-
-
// for two constraints on sharing two same rigidbodies (for example two contact points between two rigidbodies)
- real_t getNonDiagonal(const JacobianEntrySW& jacB,const real_t massInvA,const real_t massInvB) const
- {
- const JacobianEntrySW& jacA = *this;
+ real_t getNonDiagonal(const JacobianEntrySW &jacB, const real_t massInvA, const real_t massInvB) const {
+ const JacobianEntrySW &jacA = *this;
Vector3 lin = jacA.m_linearJointAxis * jacB.m_linearJointAxis;
Vector3 ang0 = jacA.m_0MinvJt * jacB.m_aJ;
Vector3 ang1 = jacA.m_1MinvJt * jacB.m_bJ;
- Vector3 lin0 = massInvA * lin ;
+ Vector3 lin0 = massInvA * lin;
Vector3 lin1 = massInvB * lin;
- Vector3 sum = ang0+ang1+lin0+lin1;
- return sum[0]+sum[1]+sum[2];
+ Vector3 sum = ang0 + ang1 + lin0 + lin1;
+ return sum[0] + sum[1] + sum[2];
}
- real_t getRelativeVelocity(const Vector3& linvelA,const Vector3& angvelA,const Vector3& linvelB,const Vector3& angvelB)
- {
+ real_t getRelativeVelocity(const Vector3 &linvelA, const Vector3 &angvelA, const Vector3 &linvelB, const Vector3 &angvelB) {
Vector3 linrel = linvelA - linvelB;
- Vector3 angvela = angvelA * m_aJ;
- Vector3 angvelb = angvelB * m_bJ;
+ Vector3 angvela = angvelA * m_aJ;
+ Vector3 angvelb = angvelB * m_bJ;
linrel *= m_linearJointAxis;
angvela += angvelb;
angvela += linrel;
- real_t rel_vel2 = angvela[0]+angvela[1]+angvela[2];
+ real_t rel_vel2 = angvela[0] + angvela[1] + angvela[2];
return rel_vel2 + CMP_EPSILON;
}
-//private:
+ //private:
- Vector3 m_linearJointAxis;
- Vector3 m_aJ;
- Vector3 m_bJ;
- Vector3 m_0MinvJt;
- Vector3 m_1MinvJt;
+ Vector3 m_linearJointAxis;
+ Vector3 m_aJ;
+ Vector3 m_bJ;
+ Vector3 m_0MinvJt;
+ Vector3 m_1MinvJt;
//Optimization: can be stored in the w/last component of one of the vectors
- real_t m_Adiag;
-
+ real_t m_Adiag;
};
-
#endif // JACOBIAN_ENTRY_SW_H
diff --git a/servers/physics/joints/pin_joint_sw.cpp b/servers/physics/joints/pin_joint_sw.cpp
index 74d62e35f..0f66c48db 100644
--- a/servers/physics/joints/pin_joint_sw.cpp
+++ b/servers/physics/joints/pin_joint_sw.cpp
@@ -38,41 +38,37 @@ bool PinJointSW::setup(float p_step) {
m_appliedImpulse = real_t(0.);
- Vector3 normal(0,0,0);
+ Vector3 normal(0, 0, 0);
- for (int i=0;i<3;i++)
- {
+ for (int i = 0; i < 3; i++) {
normal[i] = 1;
- memnew_placement(&m_jac[i],JacobianEntrySW(
- A->get_transform().basis.transposed(),
- B->get_transform().basis.transposed(),
- A->get_transform().xform(m_pivotInA) - A->get_transform().origin,
- B->get_transform().xform(m_pivotInB) - B->get_transform().origin,
- normal,
- A->get_inv_inertia(),
- A->get_inv_mass(),
- B->get_inv_inertia(),
- B->get_inv_mass()));
+ memnew_placement(&m_jac[i], JacobianEntrySW(
+ A->get_transform().basis.transposed(),
+ B->get_transform().basis.transposed(),
+ A->get_transform().xform(m_pivotInA) - A->get_transform().origin,
+ B->get_transform().xform(m_pivotInB) - B->get_transform().origin,
+ normal,
+ A->get_inv_inertia(),
+ A->get_inv_mass(),
+ B->get_inv_inertia(),
+ B->get_inv_mass()));
normal[i] = 0;
}
return true;
}
-void PinJointSW::solve(float p_step){
+void PinJointSW::solve(float p_step) {
Vector3 pivotAInW = A->get_transform().xform(m_pivotInA);
Vector3 pivotBInW = B->get_transform().xform(m_pivotInB);
+ Vector3 normal(0, 0, 0);
- Vector3 normal(0,0,0);
+ // Vector3 angvelA = A->get_transform().origin.getBasis().transpose() * A->getAngularVelocity();
+ // Vector3 angvelB = B->get_transform().origin.getBasis().transpose() * B->getAngularVelocity();
-
-// Vector3 angvelA = A->get_transform().origin.getBasis().transpose() * A->getAngularVelocity();
-// Vector3 angvelB = B->get_transform().origin.getBasis().transpose() * B->getAngularVelocity();
-
- for (int i=0;i<3;i++)
- {
+ for (int i = 0; i < 3; i++) {
normal[i] = 1;
real_t jacDiagABInv = real_t(1.) / m_jac[i].getDiagonal();
@@ -87,7 +83,7 @@ void PinJointSW::solve(float p_step){
real_t rel_vel;
rel_vel = normal.dot(vel);
- /*
+ /*
//velocity error (first order error)
real_t rel_vel = m_jac[i].getRelativeVelocity(A->getLinearVelocity(),angvelA,
B->getLinearVelocity(),angvelB);
@@ -96,38 +92,37 @@ void PinJointSW::solve(float p_step){
//positional error (zeroth order error)
real_t depth = -(pivotAInW - pivotBInW).dot(normal); //this is the error projected on the normal
- real_t impulse = depth*m_tau/p_step * jacDiagABInv - m_damping * rel_vel * jacDiagABInv;
+ real_t impulse = depth * m_tau / p_step * jacDiagABInv - m_damping * rel_vel * jacDiagABInv;
real_t impulseClamp = m_impulseClamp;
- if (impulseClamp > 0)
- {
+ if (impulseClamp > 0) {
if (impulse < -impulseClamp)
impulse = -impulseClamp;
if (impulse > impulseClamp)
impulse = impulseClamp;
}
- m_appliedImpulse+=impulse;
+ m_appliedImpulse += impulse;
Vector3 impulse_vector = normal * impulse;
- A->apply_impulse(pivotAInW - A->get_transform().origin,impulse_vector);
- B->apply_impulse(pivotBInW - B->get_transform().origin,-impulse_vector);
+ A->apply_impulse(pivotAInW - A->get_transform().origin, impulse_vector);
+ B->apply_impulse(pivotBInW - B->get_transform().origin, -impulse_vector);
normal[i] = 0;
}
}
-void PinJointSW::set_param(PhysicsServer::PinJointParam p_param,float p_value) {
+void PinJointSW::set_param(PhysicsServer::PinJointParam p_param, float p_value) {
- switch(p_param) {
- case PhysicsServer::PIN_JOINT_BIAS: m_tau=p_value; break;
- case PhysicsServer::PIN_JOINT_DAMPING: m_damping=p_value; break;
- case PhysicsServer::PIN_JOINT_IMPULSE_CLAMP: m_impulseClamp=p_value; break;
+ switch (p_param) {
+ case PhysicsServer::PIN_JOINT_BIAS: m_tau = p_value; break;
+ case PhysicsServer::PIN_JOINT_DAMPING: m_damping = p_value; break;
+ case PhysicsServer::PIN_JOINT_IMPULSE_CLAMP: m_impulseClamp = p_value; break;
}
}
-float PinJointSW::get_param(PhysicsServer::PinJointParam p_param) const{
+float PinJointSW::get_param(PhysicsServer::PinJointParam p_param) const {
- switch(p_param) {
+ switch (p_param) {
case PhysicsServer::PIN_JOINT_BIAS: return m_tau;
case PhysicsServer::PIN_JOINT_DAMPING: return m_damping;
case PhysicsServer::PIN_JOINT_IMPULSE_CLAMP: return m_impulseClamp;
@@ -136,26 +131,22 @@ float PinJointSW::get_param(PhysicsServer::PinJointParam p_param) const{
return 0;
}
-PinJointSW::PinJointSW(BodySW* p_body_a,const Vector3& p_pos_a,BodySW* p_body_b,const Vector3& p_pos_b) : JointSW(_arr,2) {
-
- A=p_body_a;
- B=p_body_b;
- m_pivotInA=p_pos_a;
- m_pivotInB=p_pos_b;
-
- m_tau=0.3;
- m_damping=1;
- m_impulseClamp=0;
- m_appliedImpulse=0;
+PinJointSW::PinJointSW(BodySW *p_body_a, const Vector3 &p_pos_a, BodySW *p_body_b, const Vector3 &p_pos_b)
+ : JointSW(_arr, 2) {
- A->add_constraint(this,0);
- B->add_constraint(this,1);
+ A = p_body_a;
+ B = p_body_b;
+ m_pivotInA = p_pos_a;
+ m_pivotInB = p_pos_b;
+ m_tau = 0.3;
+ m_damping = 1;
+ m_impulseClamp = 0;
+ m_appliedImpulse = 0;
+ A->add_constraint(this, 0);
+ B->add_constraint(this, 1);
}
PinJointSW::~PinJointSW() {
-
-
-
}
diff --git a/servers/physics/joints/pin_joint_sw.h b/servers/physics/joints/pin_joint_sw.h
index 679797249..5bc16dfc4 100644
--- a/servers/physics/joints/pin_joint_sw.h
+++ b/servers/physics/joints/pin_joint_sw.h
@@ -34,8 +34,8 @@ Adapted to Godot from the Bullet library.
#ifndef PIN_JOINT_SW_H
#define PIN_JOINT_SW_H
-#include "servers/physics/joints_sw.h"
#include "servers/physics/joints/jacobian_entry_sw.h"
+#include "servers/physics/joints_sw.h"
/*
Bullet Continuous Collision Detection and Physics Library
@@ -52,7 +52,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
class PinJointSW : public JointSW {
union {
@@ -64,37 +63,33 @@ class PinJointSW : public JointSW {
BodySW *_arr[2];
};
+ real_t m_tau; //bias
+ real_t m_damping;
+ real_t m_impulseClamp;
+ real_t m_appliedImpulse;
- real_t m_tau; //bias
- real_t m_damping;
- real_t m_impulseClamp;
- real_t m_appliedImpulse;
-
- JacobianEntrySW m_jac[3]; //3 orthogonal linear constraints
+ JacobianEntrySW m_jac[3]; //3 orthogonal linear constraints
- Vector3 m_pivotInA;
- Vector3 m_pivotInB;
+ Vector3 m_pivotInA;
+ Vector3 m_pivotInB;
public:
-
virtual PhysicsServer::JointType get_type() const { return PhysicsServer::JOINT_PIN; }
virtual bool setup(float p_step);
virtual void solve(float p_step);
- void set_param(PhysicsServer::PinJointParam p_param,float p_value);
+ void set_param(PhysicsServer::PinJointParam p_param, float p_value);
float get_param(PhysicsServer::PinJointParam p_param) const;
- void set_pos_A(const Vector3& p_pos) { m_pivotInA=p_pos; }
- void set_pos_B(const Vector3& p_pos) { m_pivotInB=p_pos; }
+ void set_pos_A(const Vector3 &p_pos) { m_pivotInA = p_pos; }
+ void set_pos_B(const Vector3 &p_pos) { m_pivotInB = p_pos; }
Vector3 get_pos_A() { return m_pivotInB; }
Vector3 get_pos_B() { return m_pivotInA; }
- PinJointSW(BodySW* p_body_a,const Vector3& p_pos_a,BodySW* p_body_b,const Vector3& p_pos_b);
+ PinJointSW(BodySW *p_body_a, const Vector3 &p_pos_a, BodySW *p_body_b, const Vector3 &p_pos_b);
~PinJointSW();
};
-
-
#endif // PIN_JOINT_SW_H
diff --git a/servers/physics/joints/slider_joint_sw.cpp b/servers/physics/joints/slider_joint_sw.cpp
index 7d1933e0d..d1a5e50ec 100644
--- a/servers/physics/joints/slider_joint_sw.cpp
+++ b/servers/physics/joints/slider_joint_sw.cpp
@@ -36,8 +36,7 @@ See corresponding header file for licensing info.
//-----------------------------------------------------------------------------
-static _FORCE_INLINE_ real_t atan2fast(real_t y, real_t x)
-{
+static _FORCE_INLINE_ real_t atan2fast(real_t y, real_t x) {
real_t coeff_1 = Math_PI / 4.0f;
real_t coeff_2 = 3.0f * coeff_1;
real_t abs_y = Math::abs(y);
@@ -52,13 +51,11 @@ static _FORCE_INLINE_ real_t atan2fast(real_t y, real_t x)
return (y < 0.0f) ? -angle : angle;
}
-
-void SliderJointSW::initParams()
-{
- m_lowerLinLimit = real_t(1.0);
- m_upperLinLimit = real_t(-1.0);
- m_lowerAngLimit = real_t(0.);
- m_upperAngLimit = real_t(0.);
+void SliderJointSW::initParams() {
+ m_lowerLinLimit = real_t(1.0);
+ m_upperLinLimit = real_t(-1.0);
+ m_lowerAngLimit = real_t(0.);
+ m_upperAngLimit = real_t(0.);
m_softnessDirLin = SLIDER_CONSTRAINT_DEF_SOFTNESS;
m_restitutionDirLin = SLIDER_CONSTRAINT_DEF_RESTITUTION;
m_dampingDirLin = real_t(0.);
@@ -84,40 +81,35 @@ void SliderJointSW::initParams()
m_accumulatedLinMotorImpulse = real_t(0.0);
m_poweredAngMotor = false;
- m_targetAngMotorVelocity = real_t(0.);
- m_maxAngMotorForce = real_t(0.);
+ m_targetAngMotorVelocity = real_t(0.);
+ m_maxAngMotorForce = real_t(0.);
m_accumulatedAngMotorImpulse = real_t(0.0);
} // SliderJointSW::initParams()
//-----------------------------------------------------------------------------
-
//-----------------------------------------------------------------------------
-SliderJointSW::SliderJointSW(BodySW* rbA, BodySW* rbB, const Transform& frameInA, const Transform& frameInB)
- : JointSW(_arr,2)
- , m_frameInA(frameInA)
- , m_frameInB(frameInB)
-{
+SliderJointSW::SliderJointSW(BodySW *rbA, BodySW *rbB, const Transform &frameInA, const Transform &frameInB)
+ : JointSW(_arr, 2), m_frameInA(frameInA), m_frameInB(frameInB) {
- A=rbA;
- B=rbB;
+ A = rbA;
+ B = rbB;
- A->add_constraint(this,0);
- B->add_constraint(this,1);
+ A->add_constraint(this, 0);
+ B->add_constraint(this, 1);
initParams();
} // SliderJointSW::SliderJointSW()
//-----------------------------------------------------------------------------
-bool SliderJointSW::setup(float p_step)
-{
+bool SliderJointSW::setup(float p_step) {
//calculate transforms
- m_calculatedTransformA = A->get_transform() * m_frameInA;
- m_calculatedTransformB = B->get_transform() * m_frameInB;
+ m_calculatedTransformA = A->get_transform() * m_frameInA;
+ m_calculatedTransformB = B->get_transform() * m_frameInB;
m_realPivotAInW = m_calculatedTransformA.origin;
m_realPivotBInW = m_calculatedTransformB.origin;
m_sliderAxis = m_calculatedTransformA.basis.get_axis(0); // along X
@@ -125,42 +117,38 @@ bool SliderJointSW::setup(float p_step)
m_projPivotInW = m_realPivotAInW + m_sliderAxis.dot(m_delta) * m_sliderAxis;
m_relPosA = m_projPivotInW - A->get_transform().origin;
m_relPosB = m_realPivotBInW - B->get_transform().origin;
- Vector3 normalWorld;
- int i;
- //linear part
- for(i = 0; i < 3; i++)
- {
+ Vector3 normalWorld;
+ int i;
+ //linear part
+ for (i = 0; i < 3; i++) {
normalWorld = m_calculatedTransformA.basis.get_axis(i);
memnew_placement(&m_jacLin[i], JacobianEntrySW(
- A->get_transform().basis.transposed(),
- B->get_transform().basis.transposed(),
- m_relPosA,
- m_relPosB,
- normalWorld,
- A->get_inv_inertia(),
- A->get_inv_mass(),
- B->get_inv_inertia(),
- B->get_inv_mass()
- ));
+ A->get_transform().basis.transposed(),
+ B->get_transform().basis.transposed(),
+ m_relPosA,
+ m_relPosB,
+ normalWorld,
+ A->get_inv_inertia(),
+ A->get_inv_mass(),
+ B->get_inv_inertia(),
+ B->get_inv_mass()));
m_jacLinDiagABInv[i] = real_t(1.) / m_jacLin[i].getDiagonal();
m_depth[i] = m_delta.dot(normalWorld);
- }
+ }
testLinLimits();
- // angular part
- for(i = 0; i < 3; i++)
- {
+ // angular part
+ for (i = 0; i < 3; i++) {
normalWorld = m_calculatedTransformA.basis.get_axis(i);
- memnew_placement(&m_jacAng[i], JacobianEntrySW(
- normalWorld,
- A->get_transform().basis.transposed(),
- B->get_transform().basis.transposed(),
- A->get_inv_inertia(),
- B->get_inv_inertia()
- ));
+ memnew_placement(&m_jacAng[i], JacobianEntrySW(
+ normalWorld,
+ A->get_transform().basis.transposed(),
+ B->get_transform().basis.transposed(),
+ A->get_inv_inertia(),
+ B->get_inv_inertia()));
}
testAngLimits();
Vector3 axisA = m_calculatedTransformA.basis.get_axis(0);
- m_kAngle = real_t(1.0 )/ (A->compute_angular_impulse_denominator(axisA) + B->compute_angular_impulse_denominator(axisA));
+ m_kAngle = real_t(1.0) / (A->compute_angular_impulse_denominator(axisA) + B->compute_angular_impulse_denominator(axisA));
// clear accumulator for motors
m_accumulatedLinMotorImpulse = real_t(0.0);
m_accumulatedAngMotorImpulse = real_t(0.0);
@@ -172,14 +160,13 @@ bool SliderJointSW::setup(float p_step)
void SliderJointSW::solve(real_t p_step) {
- int i;
- // linear
- Vector3 velA = A->get_velocity_in_local_point(m_relPosA);
- Vector3 velB = B->get_velocity_in_local_point(m_relPosB);
- Vector3 vel = velA - velB;
- for(i = 0; i < 3; i++)
- {
- const Vector3& normal = m_jacLin[i].m_linearJointAxis;
+ int i;
+ // linear
+ Vector3 velA = A->get_velocity_in_local_point(m_relPosA);
+ Vector3 velB = B->get_velocity_in_local_point(m_relPosB);
+ Vector3 vel = velA - velB;
+ for (i = 0; i < 3; i++) {
+ const Vector3 &normal = m_jacLin[i].m_linearJointAxis;
real_t rel_vel = normal.dot(vel);
// calculate positional error
real_t depth = m_depth[i];
@@ -190,81 +177,70 @@ void SliderJointSW::solve(real_t p_step) {
// calcutate and apply impulse
real_t normalImpulse = softness * (restitution * depth / p_step - damping * rel_vel) * m_jacLinDiagABInv[i];
Vector3 impulse_vector = normal * normalImpulse;
- A->apply_impulse( m_relPosA, impulse_vector);
- B->apply_impulse(m_relPosB,-impulse_vector);
- if(m_poweredLinMotor && (!i))
- { // apply linear motor
- if(m_accumulatedLinMotorImpulse < m_maxLinMotorForce)
- {
+ A->apply_impulse(m_relPosA, impulse_vector);
+ B->apply_impulse(m_relPosB, -impulse_vector);
+ if (m_poweredLinMotor && (!i)) { // apply linear motor
+ if (m_accumulatedLinMotorImpulse < m_maxLinMotorForce) {
real_t desiredMotorVel = m_targetLinMotorVelocity;
real_t motor_relvel = desiredMotorVel + rel_vel;
normalImpulse = -motor_relvel * m_jacLinDiagABInv[i];
// clamp accumulated impulse
real_t new_acc = m_accumulatedLinMotorImpulse + Math::abs(normalImpulse);
- if(new_acc > m_maxLinMotorForce)
- {
+ if (new_acc > m_maxLinMotorForce) {
new_acc = m_maxLinMotorForce;
}
- real_t del = new_acc - m_accumulatedLinMotorImpulse;
- if(normalImpulse < real_t(0.0))
- {
+ real_t del = new_acc - m_accumulatedLinMotorImpulse;
+ if (normalImpulse < real_t(0.0)) {
normalImpulse = -del;
- }
- else
- {
+ } else {
normalImpulse = del;
}
m_accumulatedLinMotorImpulse = new_acc;
// apply clamped impulse
impulse_vector = normal * normalImpulse;
- A->apply_impulse( m_relPosA, impulse_vector);
- B->apply_impulse( m_relPosB,-impulse_vector);
+ A->apply_impulse(m_relPosA, impulse_vector);
+ B->apply_impulse(m_relPosB, -impulse_vector);
}
}
- }
+ }
// angular
// get axes in world space
- Vector3 axisA = m_calculatedTransformA.basis.get_axis(0);
- Vector3 axisB = m_calculatedTransformB.basis.get_axis(0);
+ Vector3 axisA = m_calculatedTransformA.basis.get_axis(0);
+ Vector3 axisB = m_calculatedTransformB.basis.get_axis(0);
- const Vector3& angVelA = A->get_angular_velocity();
- const Vector3& angVelB = B->get_angular_velocity();
+ const Vector3 &angVelA = A->get_angular_velocity();
+ const Vector3 &angVelB = B->get_angular_velocity();
Vector3 angVelAroundAxisA = axisA * axisA.dot(angVelA);
Vector3 angVelAroundAxisB = axisB * axisB.dot(angVelB);
Vector3 angAorthog = angVelA - angVelAroundAxisA;
Vector3 angBorthog = angVelB - angVelAroundAxisB;
- Vector3 velrelOrthog = angAorthog-angBorthog;
+ Vector3 velrelOrthog = angAorthog - angBorthog;
//solve orthogonal angular velocity correction
real_t len = velrelOrthog.length();
- if (len > real_t(0.00001))
- {
+ if (len > real_t(0.00001)) {
Vector3 normal = velrelOrthog.normalized();
real_t denom = A->compute_angular_impulse_denominator(normal) + B->compute_angular_impulse_denominator(normal);
- velrelOrthog *= (real_t(1.)/denom) * m_dampingOrthoAng * m_softnessOrthoAng;
+ velrelOrthog *= (real_t(1.) / denom) * m_dampingOrthoAng * m_softnessOrthoAng;
}
//solve angular positional correction
- Vector3 angularError = axisA.cross(axisB) *(real_t(1.)/p_step);
+ Vector3 angularError = axisA.cross(axisB) * (real_t(1.) / p_step);
real_t len2 = angularError.length();
- if (len2>real_t(0.00001))
- {
+ if (len2 > real_t(0.00001)) {
Vector3 normal2 = angularError.normalized();
real_t denom2 = A->compute_angular_impulse_denominator(normal2) + B->compute_angular_impulse_denominator(normal2);
- angularError *= (real_t(1.)/denom2) * m_restitutionOrthoAng * m_softnessOrthoAng;
+ angularError *= (real_t(1.) / denom2) * m_restitutionOrthoAng * m_softnessOrthoAng;
}
// apply impulse
- A->apply_torque_impulse(-velrelOrthog+angularError);
- B->apply_torque_impulse(velrelOrthog-angularError);
+ A->apply_torque_impulse(-velrelOrthog + angularError);
+ B->apply_torque_impulse(velrelOrthog - angularError);
real_t impulseMag;
//solve angular limits
- if(m_solveAngLim)
- {
+ if (m_solveAngLim) {
impulseMag = (angVelB - angVelA).dot(axisA) * m_dampingLimAng + m_angDepth * m_restitutionLimAng / p_step;
impulseMag *= m_kAngle * m_softnessLimAng;
- }
- else
- {
+ } else {
impulseMag = (angVelB - angVelA).dot(axisA) * m_dampingDirAng + m_angDepth * m_restitutionDirAng / p_step;
impulseMag *= m_kAngle * m_softnessDirAng;
}
@@ -272,10 +248,8 @@ void SliderJointSW::solve(real_t p_step) {
A->apply_torque_impulse(impulse);
B->apply_torque_impulse(-impulse);
//apply angular motor
- if(m_poweredAngMotor)
- {
- if(m_accumulatedAngMotorImpulse < m_maxAngMotorForce)
- {
+ if (m_poweredAngMotor) {
+ if (m_accumulatedAngMotorImpulse < m_maxAngMotorForce) {
Vector3 velrel = angVelAroundAxisA - angVelAroundAxisB;
real_t projRelVel = velrel.dot(axisA);
@@ -285,17 +259,13 @@ void SliderJointSW::solve(real_t p_step) {
real_t angImpulse = m_kAngle * motor_relvel;
// clamp accumulated impulse
real_t new_acc = m_accumulatedAngMotorImpulse + Math::abs(angImpulse);
- if(new_acc > m_maxAngMotorForce)
- {
+ if (new_acc > m_maxAngMotorForce) {
new_acc = m_maxAngMotorForce;
}
- real_t del = new_acc - m_accumulatedAngMotorImpulse;
- if(angImpulse < real_t(0.0))
- {
+ real_t del = new_acc - m_accumulatedAngMotorImpulse;
+ if (angImpulse < real_t(0.0)) {
angImpulse = -del;
- }
- else
- {
+ } else {
angImpulse = del;
}
m_accumulatedAngMotorImpulse = new_acc;
@@ -311,96 +281,75 @@ void SliderJointSW::solve(real_t p_step) {
//-----------------------------------------------------------------------------
-void SliderJointSW::calculateTransforms(void){
- m_calculatedTransformA = A->get_transform() * m_frameInA ;
+void SliderJointSW::calculateTransforms(void) {
+ m_calculatedTransformA = A->get_transform() * m_frameInA;
m_calculatedTransformB = B->get_transform() * m_frameInB;
m_realPivotAInW = m_calculatedTransformA.origin;
m_realPivotBInW = m_calculatedTransformB.origin;
m_sliderAxis = m_calculatedTransformA.basis.get_axis(0); // along X
m_delta = m_realPivotBInW - m_realPivotAInW;
m_projPivotInW = m_realPivotAInW + m_sliderAxis.dot(m_delta) * m_sliderAxis;
- Vector3 normalWorld;
- int i;
- //linear part
- for(i = 0; i < 3; i++)
- {
+ Vector3 normalWorld;
+ int i;
+ //linear part
+ for (i = 0; i < 3; i++) {
normalWorld = m_calculatedTransformA.basis.get_axis(i);
m_depth[i] = m_delta.dot(normalWorld);
- }
+ }
} // SliderJointSW::calculateTransforms()
//-----------------------------------------------------------------------------
-void SliderJointSW::testLinLimits(void)
-{
+void SliderJointSW::testLinLimits(void) {
m_solveLinLim = false;
m_linPos = m_depth[0];
- if(m_lowerLinLimit <= m_upperLinLimit)
- {
- if(m_depth[0] > m_upperLinLimit)
- {
+ if (m_lowerLinLimit <= m_upperLinLimit) {
+ if (m_depth[0] > m_upperLinLimit) {
m_depth[0] -= m_upperLinLimit;
m_solveLinLim = true;
- }
- else if(m_depth[0] < m_lowerLinLimit)
- {
+ } else if (m_depth[0] < m_lowerLinLimit) {
m_depth[0] -= m_lowerLinLimit;
m_solveLinLim = true;
- }
- else
- {
+ } else {
m_depth[0] = real_t(0.);
}
- }
- else
- {
+ } else {
m_depth[0] = real_t(0.);
}
} // SliderJointSW::testLinLimits()
//-----------------------------------------------------------------------------
-
-void SliderJointSW::testAngLimits(void)
-{
+void SliderJointSW::testAngLimits(void) {
m_angDepth = real_t(0.);
m_solveAngLim = false;
- if(m_lowerAngLimit <= m_upperAngLimit)
- {
+ if (m_lowerAngLimit <= m_upperAngLimit) {
const Vector3 axisA0 = m_calculatedTransformA.basis.get_axis(1);
const Vector3 axisA1 = m_calculatedTransformA.basis.get_axis(2);
const Vector3 axisB0 = m_calculatedTransformB.basis.get_axis(1);
real_t rot = atan2fast(axisB0.dot(axisA1), axisB0.dot(axisA0));
- if(rot < m_lowerAngLimit)
- {
+ if (rot < m_lowerAngLimit) {
m_angDepth = rot - m_lowerAngLimit;
m_solveAngLim = true;
- }
- else if(rot > m_upperAngLimit)
- {
+ } else if (rot > m_upperAngLimit) {
m_angDepth = rot - m_upperAngLimit;
m_solveAngLim = true;
}
}
} // SliderJointSW::testAngLimits()
-
//-----------------------------------------------------------------------------
-
-
-Vector3 SliderJointSW::getAncorInA(void)
-{
+Vector3 SliderJointSW::getAncorInA(void) {
Vector3 ancorInA;
ancorInA = m_realPivotAInW + (m_lowerLinLimit + m_upperLinLimit) * real_t(0.5) * m_sliderAxis;
- ancorInA = A->get_transform().inverse().xform( ancorInA );
+ ancorInA = A->get_transform().inverse().xform(ancorInA);
return ancorInA;
} // SliderJointSW::getAncorInA()
//-----------------------------------------------------------------------------
-Vector3 SliderJointSW::getAncorInB(void)
-{
+Vector3 SliderJointSW::getAncorInB(void) {
Vector3 ancorInB;
ancorInB = m_frameInB.origin;
return ancorInB;
@@ -408,38 +357,36 @@ Vector3 SliderJointSW::getAncorInB(void)
void SliderJointSW::set_param(PhysicsServer::SliderJointParam p_param, float p_value) {
- switch(p_param) {
- case PhysicsServer::SLIDER_JOINT_LINEAR_LIMIT_UPPER: m_upperLinLimit=p_value; break;
- case PhysicsServer::SLIDER_JOINT_LINEAR_LIMIT_LOWER: m_lowerLinLimit=p_value; break;
- case PhysicsServer::SLIDER_JOINT_LINEAR_LIMIT_SOFTNESS: m_softnessLimLin=p_value; break;
- case PhysicsServer::SLIDER_JOINT_LINEAR_LIMIT_RESTITUTION: m_restitutionLimLin=p_value; break;
- case PhysicsServer::SLIDER_JOINT_LINEAR_LIMIT_DAMPING: m_dampingLimLin=p_value; break;
- case PhysicsServer::SLIDER_JOINT_LINEAR_MOTION_SOFTNESS: m_softnessDirLin=p_value; break;
- case PhysicsServer::SLIDER_JOINT_LINEAR_MOTION_RESTITUTION: m_restitutionDirLin=p_value; break;
- case PhysicsServer::SLIDER_JOINT_LINEAR_MOTION_DAMPING: m_dampingDirLin=p_value; break;
- case PhysicsServer::SLIDER_JOINT_LINEAR_ORTHOGONAL_SOFTNESS: m_softnessOrthoLin=p_value; break;
- case PhysicsServer::SLIDER_JOINT_LINEAR_ORTHOGONAL_RESTITUTION: m_restitutionOrthoLin=p_value; break;
- case PhysicsServer::SLIDER_JOINT_LINEAR_ORTHOGONAL_DAMPING: m_dampingOrthoLin=p_value; break;
-
- case PhysicsServer::SLIDER_JOINT_ANGULAR_LIMIT_UPPER: m_upperAngLimit=p_value; break;
- case PhysicsServer::SLIDER_JOINT_ANGULAR_LIMIT_LOWER: m_lowerAngLimit=p_value; break;
- case PhysicsServer::SLIDER_JOINT_ANGULAR_LIMIT_SOFTNESS: m_softnessLimAng=p_value; break;
- case PhysicsServer::SLIDER_JOINT_ANGULAR_LIMIT_RESTITUTION: m_restitutionLimAng=p_value; break;
- case PhysicsServer::SLIDER_JOINT_ANGULAR_LIMIT_DAMPING: m_dampingLimAng=p_value; break;
- case PhysicsServer::SLIDER_JOINT_ANGULAR_MOTION_SOFTNESS: m_softnessDirAng=p_value; break;
- case PhysicsServer::SLIDER_JOINT_ANGULAR_MOTION_RESTITUTION: m_restitutionDirAng=p_value; break;
- case PhysicsServer::SLIDER_JOINT_ANGULAR_MOTION_DAMPING: m_dampingDirAng=p_value; break;
- case PhysicsServer::SLIDER_JOINT_ANGULAR_ORTHOGONAL_SOFTNESS: m_softnessOrthoAng=p_value; break;
- case PhysicsServer::SLIDER_JOINT_ANGULAR_ORTHOGONAL_RESTITUTION: m_restitutionOrthoAng=p_value; break;
- case PhysicsServer::SLIDER_JOINT_ANGULAR_ORTHOGONAL_DAMPING: m_dampingOrthoAng=p_value; break;
+ switch (p_param) {
+ case PhysicsServer::SLIDER_JOINT_LINEAR_LIMIT_UPPER: m_upperLinLimit = p_value; break;
+ case PhysicsServer::SLIDER_JOINT_LINEAR_LIMIT_LOWER: m_lowerLinLimit = p_value; break;
+ case PhysicsServer::SLIDER_JOINT_LINEAR_LIMIT_SOFTNESS: m_softnessLimLin = p_value; break;
+ case PhysicsServer::SLIDER_JOINT_LINEAR_LIMIT_RESTITUTION: m_restitutionLimLin = p_value; break;
+ case PhysicsServer::SLIDER_JOINT_LINEAR_LIMIT_DAMPING: m_dampingLimLin = p_value; break;
+ case PhysicsServer::SLIDER_JOINT_LINEAR_MOTION_SOFTNESS: m_softnessDirLin = p_value; break;
+ case PhysicsServer::SLIDER_JOINT_LINEAR_MOTION_RESTITUTION: m_restitutionDirLin = p_value; break;
+ case PhysicsServer::SLIDER_JOINT_LINEAR_MOTION_DAMPING: m_dampingDirLin = p_value; break;
+ case PhysicsServer::SLIDER_JOINT_LINEAR_ORTHOGONAL_SOFTNESS: m_softnessOrthoLin = p_value; break;
+ case PhysicsServer::SLIDER_JOINT_LINEAR_ORTHOGONAL_RESTITUTION: m_restitutionOrthoLin = p_value; break;
+ case PhysicsServer::SLIDER_JOINT_LINEAR_ORTHOGONAL_DAMPING: m_dampingOrthoLin = p_value; break;
+ case PhysicsServer::SLIDER_JOINT_ANGULAR_LIMIT_UPPER: m_upperAngLimit = p_value; break;
+ case PhysicsServer::SLIDER_JOINT_ANGULAR_LIMIT_LOWER: m_lowerAngLimit = p_value; break;
+ case PhysicsServer::SLIDER_JOINT_ANGULAR_LIMIT_SOFTNESS: m_softnessLimAng = p_value; break;
+ case PhysicsServer::SLIDER_JOINT_ANGULAR_LIMIT_RESTITUTION: m_restitutionLimAng = p_value; break;
+ case PhysicsServer::SLIDER_JOINT_ANGULAR_LIMIT_DAMPING: m_dampingLimAng = p_value; break;
+ case PhysicsServer::SLIDER_JOINT_ANGULAR_MOTION_SOFTNESS: m_softnessDirAng = p_value; break;
+ case PhysicsServer::SLIDER_JOINT_ANGULAR_MOTION_RESTITUTION: m_restitutionDirAng = p_value; break;
+ case PhysicsServer::SLIDER_JOINT_ANGULAR_MOTION_DAMPING: m_dampingDirAng = p_value; break;
+ case PhysicsServer::SLIDER_JOINT_ANGULAR_ORTHOGONAL_SOFTNESS: m_softnessOrthoAng = p_value; break;
+ case PhysicsServer::SLIDER_JOINT_ANGULAR_ORTHOGONAL_RESTITUTION: m_restitutionOrthoAng = p_value; break;
+ case PhysicsServer::SLIDER_JOINT_ANGULAR_ORTHOGONAL_DAMPING: m_dampingOrthoAng = p_value; break;
}
-
}
float SliderJointSW::get_param(PhysicsServer::SliderJointParam p_param) const {
- switch(p_param) {
+ switch (p_param) {
case PhysicsServer::SLIDER_JOINT_LINEAR_LIMIT_UPPER: return m_upperLinLimit;
case PhysicsServer::SLIDER_JOINT_LINEAR_LIMIT_LOWER: return m_lowerLinLimit;
case PhysicsServer::SLIDER_JOINT_LINEAR_LIMIT_SOFTNESS: return m_softnessLimLin;
@@ -463,11 +410,7 @@ float SliderJointSW::get_param(PhysicsServer::SliderJointParam p_param) const {
case PhysicsServer::SLIDER_JOINT_ANGULAR_ORTHOGONAL_SOFTNESS: return m_softnessOrthoAng;
case PhysicsServer::SLIDER_JOINT_ANGULAR_ORTHOGONAL_RESTITUTION: return m_restitutionOrthoAng;
case PhysicsServer::SLIDER_JOINT_ANGULAR_ORTHOGONAL_DAMPING: return m_dampingOrthoAng;
-
}
return 0;
-
}
-
-
diff --git a/servers/physics/joints/slider_joint_sw.h b/servers/physics/joints/slider_joint_sw.h
index 4e697e6f6..8ca650b22 100644
--- a/servers/physics/joints/slider_joint_sw.h
+++ b/servers/physics/joints/slider_joint_sw.h
@@ -34,9 +34,8 @@ Adapted to Godot from the Bullet library.
#ifndef SLIDER_JOINT_SW_H
#define SLIDER_JOINT_SW_H
-#include "servers/physics/joints_sw.h"
#include "servers/physics/joints/jacobian_entry_sw.h"
-
+#include "servers/physics/joints_sw.h"
/*
Bullet Continuous Collision Detection and Physics Library
@@ -59,15 +58,14 @@ April 04, 2008
*/
-#define SLIDER_CONSTRAINT_DEF_SOFTNESS (real_t(1.0))
-#define SLIDER_CONSTRAINT_DEF_DAMPING (real_t(1.0))
-#define SLIDER_CONSTRAINT_DEF_RESTITUTION (real_t(0.7))
+#define SLIDER_CONSTRAINT_DEF_SOFTNESS (real_t(1.0))
+#define SLIDER_CONSTRAINT_DEF_DAMPING (real_t(1.0))
+#define SLIDER_CONSTRAINT_DEF_RESTITUTION (real_t(0.7))
//-----------------------------------------------------------------------------
class SliderJointSW : public JointSW {
protected:
-
union {
struct {
BodySW *A;
@@ -77,8 +75,8 @@ protected:
BodySW *_arr[2];
};
- Transform m_frameInA;
- Transform m_frameInB;
+ Transform m_frameInA;
+ Transform m_frameInB;
// linear limits
real_t m_lowerLinLimit;
@@ -115,14 +113,14 @@ protected:
bool m_solveLinLim;
bool m_solveAngLim;
- JacobianEntrySW m_jacLin[3];
- real_t m_jacLinDiagABInv[3];
+ JacobianEntrySW m_jacLin[3];
+ real_t m_jacLinDiagABInv[3];
- JacobianEntrySW m_jacAng[3];
+ JacobianEntrySW m_jacAng[3];
real_t m_timeStep;
- Transform m_calculatedTransformA;
- Transform m_calculatedTransformB;
+ Transform m_calculatedTransformA;
+ Transform m_calculatedTransformB;
Vector3 m_sliderAxis;
Vector3 m_realPivotAInW;
@@ -138,45 +136,46 @@ protected:
real_t m_angDepth;
real_t m_kAngle;
- bool m_poweredLinMotor;
- real_t m_targetLinMotorVelocity;
- real_t m_maxLinMotorForce;
- real_t m_accumulatedLinMotorImpulse;
+ bool m_poweredLinMotor;
+ real_t m_targetLinMotorVelocity;
+ real_t m_maxLinMotorForce;
+ real_t m_accumulatedLinMotorImpulse;
- bool m_poweredAngMotor;
- real_t m_targetAngMotorVelocity;
- real_t m_maxAngMotorForce;
- real_t m_accumulatedAngMotorImpulse;
+ bool m_poweredAngMotor;
+ real_t m_targetAngMotorVelocity;
+ real_t m_maxAngMotorForce;
+ real_t m_accumulatedAngMotorImpulse;
//------------------------
void initParams();
+
public:
// constructors
- SliderJointSW(BodySW* rbA, BodySW* rbB, const Transform& frameInA, const Transform& frameInB);
- //SliderJointSW();
+ SliderJointSW(BodySW *rbA, BodySW *rbB, const Transform &frameInA, const Transform &frameInB);
+ //SliderJointSW();
// overrides
// access
- const BodySW* getRigidBodyA() const { return A; }
- const BodySW* getRigidBodyB() const { return B; }
- const Transform & getCalculatedTransformA() const { return m_calculatedTransformA; }
- const Transform & getCalculatedTransformB() const { return m_calculatedTransformB; }
- const Transform & getFrameOffsetA() const { return m_frameInA; }
- const Transform & getFrameOffsetB() const { return m_frameInB; }
- Transform & getFrameOffsetA() { return m_frameInA; }
- Transform & getFrameOffsetB() { return m_frameInB; }
- real_t getLowerLinLimit() { return m_lowerLinLimit; }
- void setLowerLinLimit(real_t lowerLimit) { m_lowerLinLimit = lowerLimit; }
- real_t getUpperLinLimit() { return m_upperLinLimit; }
- void setUpperLinLimit(real_t upperLimit) { m_upperLinLimit = upperLimit; }
- real_t getLowerAngLimit() { return m_lowerAngLimit; }
- void setLowerAngLimit(real_t lowerLimit) { m_lowerAngLimit = lowerLimit; }
- real_t getUpperAngLimit() { return m_upperAngLimit; }
- void setUpperAngLimit(real_t upperLimit) { m_upperAngLimit = upperLimit; }
+ const BodySW *getRigidBodyA() const { return A; }
+ const BodySW *getRigidBodyB() const { return B; }
+ const Transform &getCalculatedTransformA() const { return m_calculatedTransformA; }
+ const Transform &getCalculatedTransformB() const { return m_calculatedTransformB; }
+ const Transform &getFrameOffsetA() const { return m_frameInA; }
+ const Transform &getFrameOffsetB() const { return m_frameInB; }
+ Transform &getFrameOffsetA() { return m_frameInA; }
+ Transform &getFrameOffsetB() { return m_frameInB; }
+ real_t getLowerLinLimit() { return m_lowerLinLimit; }
+ void setLowerLinLimit(real_t lowerLimit) { m_lowerLinLimit = lowerLimit; }
+ real_t getUpperLinLimit() { return m_upperLinLimit; }
+ void setUpperLinLimit(real_t upperLimit) { m_upperLinLimit = upperLimit; }
+ real_t getLowerAngLimit() { return m_lowerAngLimit; }
+ void setLowerAngLimit(real_t lowerLimit) { m_lowerAngLimit = lowerLimit; }
+ real_t getUpperAngLimit() { return m_upperAngLimit; }
+ void setUpperAngLimit(real_t upperLimit) { m_upperAngLimit = upperLimit; }
real_t getSoftnessDirLin() { return m_softnessDirLin; }
real_t getRestitutionDirLin() { return m_restitutionDirLin; }
- real_t getDampingDirLin() { return m_dampingDirLin ; }
+ real_t getDampingDirLin() { return m_dampingDirLin; }
real_t getSoftnessDirAng() { return m_softnessDirAng; }
real_t getRestitutionDirAng() { return m_restitutionDirAng; }
real_t getDampingDirAng() { return m_dampingDirAng; }
@@ -230,9 +229,9 @@ public:
bool getSolveAngLimit() { return m_solveAngLim; }
real_t getAngDepth() { return m_angDepth; }
// shared code used by ODE solver
- void calculateTransforms(void);
- void testLinLimits(void);
- void testAngLimits(void);
+ void calculateTransforms(void);
+ void testLinLimits(void);
+ void testAngLimits(void);
// access for PE Solver
Vector3 getAncorInA(void);
Vector3 getAncorInB(void);
@@ -244,8 +243,6 @@ public:
void solve(float p_step);
virtual PhysicsServer::JointType get_type() const { return PhysicsServer::JOINT_SLIDER; }
-
};
-
#endif // SLIDER_JOINT_SW_H
diff --git a/servers/physics/joints_sw.h b/servers/physics/joints_sw.h
index c87c86b59..0f637faf7 100644
--- a/servers/physics/joints_sw.h
+++ b/servers/physics/joints_sw.h
@@ -29,19 +29,16 @@
#ifndef JOINTS_SW_H
#define JOINTS_SW_H
-#include "constraint_sw.h"
#include "body_sw.h"
-
+#include "constraint_sw.h"
class JointSW : public ConstraintSW {
-
public:
-
- virtual PhysicsServer::JointType get_type() const=0;
- _FORCE_INLINE_ JointSW(BodySW **p_body_ptr=NULL,int p_body_count=0) : ConstraintSW(p_body_ptr,p_body_count) {
+ virtual PhysicsServer::JointType get_type() const = 0;
+ _FORCE_INLINE_ JointSW(BodySW **p_body_ptr = NULL, int p_body_count = 0)
+ : ConstraintSW(p_body_ptr, p_body_count) {
}
-
};
#endif // JOINTS_SW_H
diff --git a/servers/physics/physics_server_sw.cpp b/servers/physics/physics_server_sw.cpp
index ab54497ea..4cf6d7f09 100644
--- a/servers/physics/physics_server_sw.cpp
+++ b/servers/physics/physics_server_sw.cpp
@@ -29,57 +29,56 @@
#include "physics_server_sw.h"
#include "broad_phase_basic.h"
#include "broad_phase_octree.h"
-#include "joints/pin_joint_sw.h"
-#include "joints/hinge_joint_sw.h"
-#include "joints/slider_joint_sw.h"
#include "joints/cone_twist_joint_sw.h"
#include "joints/generic_6dof_joint_sw.h"
-#include "script_language.h"
+#include "joints/hinge_joint_sw.h"
+#include "joints/pin_joint_sw.h"
+#include "joints/slider_joint_sw.h"
#include "os/os.h"
+#include "script_language.h"
RID PhysicsServerSW::shape_create(ShapeType p_shape) {
- ShapeSW *shape=NULL;
- switch(p_shape) {
+ ShapeSW *shape = NULL;
+ switch (p_shape) {
case SHAPE_PLANE: {
- shape=memnew( PlaneShapeSW );
+ shape = memnew(PlaneShapeSW);
} break;
case SHAPE_RAY: {
- shape=memnew( RayShapeSW );
+ shape = memnew(RayShapeSW);
} break;
case SHAPE_SPHERE: {
- shape=memnew( SphereShapeSW);
+ shape = memnew(SphereShapeSW);
} break;
case SHAPE_BOX: {
- shape=memnew( BoxShapeSW);
+ shape = memnew(BoxShapeSW);
} break;
case SHAPE_CAPSULE: {
- shape=memnew( CapsuleShapeSW );
+ shape = memnew(CapsuleShapeSW);
} break;
case SHAPE_CONVEX_POLYGON: {
- shape=memnew( ConvexPolygonShapeSW );
+ shape = memnew(ConvexPolygonShapeSW);
} break;
case SHAPE_CONCAVE_POLYGON: {
- shape=memnew( ConcavePolygonShapeSW );
+ shape = memnew(ConcavePolygonShapeSW);
} break;
case SHAPE_HEIGHTMAP: {
- shape=memnew( HeightMapShapeSW );
+ shape = memnew(HeightMapShapeSW);
} break;
case SHAPE_CUSTOM: {
ERR_FAIL_V(RID());
} break;
-
}
RID id = shape_owner.make_rid(shape);
@@ -88,71 +87,62 @@ RID PhysicsServerSW::shape_create(ShapeType p_shape) {
return id;
};
-void PhysicsServerSW::shape_set_data(RID p_shape, const Variant& p_data) {
+void PhysicsServerSW::shape_set_data(RID p_shape, const Variant &p_data) {
ShapeSW *shape = shape_owner.get(p_shape);
ERR_FAIL_COND(!shape);
shape->set_data(p_data);
-
-
};
-
void PhysicsServerSW::shape_set_custom_solver_bias(RID p_shape, real_t p_bias) {
ShapeSW *shape = shape_owner.get(p_shape);
ERR_FAIL_COND(!shape);
shape->set_custom_bias(p_bias);
-
}
-
PhysicsServer::ShapeType PhysicsServerSW::shape_get_type(RID p_shape) const {
const ShapeSW *shape = shape_owner.get(p_shape);
- ERR_FAIL_COND_V(!shape,SHAPE_CUSTOM);
+ ERR_FAIL_COND_V(!shape, SHAPE_CUSTOM);
return shape->get_type();
-
};
Variant PhysicsServerSW::shape_get_data(RID p_shape) const {
const ShapeSW *shape = shape_owner.get(p_shape);
- ERR_FAIL_COND_V(!shape,Variant());
- ERR_FAIL_COND_V(!shape->is_configured(),Variant());
+ ERR_FAIL_COND_V(!shape, Variant());
+ ERR_FAIL_COND_V(!shape->is_configured(), Variant());
return shape->get_data();
-
};
real_t PhysicsServerSW::shape_get_custom_solver_bias(RID p_shape) const {
const ShapeSW *shape = shape_owner.get(p_shape);
- ERR_FAIL_COND_V(!shape,0);
+ ERR_FAIL_COND_V(!shape, 0);
return shape->get_custom_bias();
-
}
-
RID PhysicsServerSW::space_create() {
- SpaceSW *space = memnew( SpaceSW );
+ SpaceSW *space = memnew(SpaceSW);
RID id = space_owner.make_rid(space);
space->set_self(id);
RID area_id = area_create();
AreaSW *area = area_owner.get(area_id);
- ERR_FAIL_COND_V(!area,RID());
+ ERR_FAIL_COND_V(!area, RID());
space->set_default_area(area);
area->set_space(space);
area->set_priority(-1);
RID sgb = body_create();
- body_set_space(sgb,id);
- body_set_mode(sgb,BODY_MODE_STATIC);
+ body_set_space(sgb, id);
+ body_set_mode(sgb, BODY_MODE_STATIC);
space->set_static_global_body(sgb);
return id;
};
-void PhysicsServerSW::space_set_active(RID p_space,bool p_active) {
+void PhysicsServerSW::space_set_active(RID p_space, bool p_active) {
SpaceSW *space = space_owner.get(p_space);
ERR_FAIL_COND(!space);
@@ -165,70 +155,63 @@ void PhysicsServerSW::space_set_active(RID p_space,bool p_active) {
bool PhysicsServerSW::space_is_active(RID p_space) const {
const SpaceSW *space = space_owner.get(p_space);
- ERR_FAIL_COND_V(!space,false);
+ ERR_FAIL_COND_V(!space, false);
return active_spaces.has(space);
-
}
-void PhysicsServerSW::space_set_param(RID p_space,SpaceParameter p_param, real_t p_value) {
+void PhysicsServerSW::space_set_param(RID p_space, SpaceParameter p_param, real_t p_value) {
SpaceSW *space = space_owner.get(p_space);
ERR_FAIL_COND(!space);
- space->set_param(p_param,p_value);
-
+ space->set_param(p_param, p_value);
}
-real_t PhysicsServerSW::space_get_param(RID p_space,SpaceParameter p_param) const {
+real_t PhysicsServerSW::space_get_param(RID p_space, SpaceParameter p_param) const {
const SpaceSW *space = space_owner.get(p_space);
- ERR_FAIL_COND_V(!space,0);
+ ERR_FAIL_COND_V(!space, 0);
return space->get_param(p_param);
}
-PhysicsDirectSpaceState* PhysicsServerSW::space_get_direct_state(RID p_space) {
+PhysicsDirectSpaceState *PhysicsServerSW::space_get_direct_state(RID p_space) {
SpaceSW *space = space_owner.get(p_space);
- ERR_FAIL_COND_V(!space,NULL);
+ ERR_FAIL_COND_V(!space, NULL);
if (!doing_sync || space->is_locked()) {
ERR_EXPLAIN("Space state is inaccesible right now, wait for iteration or fixed process notification.");
ERR_FAIL_V(NULL);
-
-
}
return space->get_direct_state();
}
-void PhysicsServerSW::space_set_debug_contacts(RID p_space,int p_max_contacts) {
+void PhysicsServerSW::space_set_debug_contacts(RID p_space, int p_max_contacts) {
SpaceSW *space = space_owner.get(p_space);
ERR_FAIL_COND(!space);
space->set_debug_contacts(p_max_contacts);
-
}
Vector<Vector3> PhysicsServerSW::space_get_contacts(RID p_space) const {
SpaceSW *space = space_owner.get(p_space);
- ERR_FAIL_COND_V(!space,Vector<Vector3>());
+ ERR_FAIL_COND_V(!space, Vector<Vector3>());
return space->get_debug_contacts();
-
}
int PhysicsServerSW::space_get_contact_count(RID p_space) const {
SpaceSW *space = space_owner.get(p_space);
- ERR_FAIL_COND_V(!space,0);
+ ERR_FAIL_COND_V(!space, 0);
return space->get_debug_contact_count();
-
}
RID PhysicsServerSW::area_create() {
- AreaSW *area = memnew( AreaSW );
+ AreaSW *area = memnew(AreaSW);
RID rid = area_owner.make_rid(area);
area->set_self(rid);
return rid;
@@ -238,20 +221,19 @@ void PhysicsServerSW::area_set_space(RID p_area, RID p_space) {
AreaSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
- SpaceSW *space=NULL;
+ SpaceSW *space = NULL;
if (p_space.is_valid()) {
space = space_owner.get(p_space);
ERR_FAIL_COND(!space);
}
area->set_space(space);
-
};
RID PhysicsServerSW::area_get_space(RID p_area) const {
AreaSW *area = area_owner.get(p_area);
- ERR_FAIL_COND_V(!area,RID());
+ ERR_FAIL_COND_V(!area, RID());
SpaceSW *space = area->get_space();
if (!space)
@@ -261,7 +243,6 @@ RID PhysicsServerSW::area_get_space(RID p_area) const {
void PhysicsServerSW::area_set_space_override_mode(RID p_area, AreaSpaceOverrideMode p_mode) {
-
AreaSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
@@ -271,13 +252,12 @@ void PhysicsServerSW::area_set_space_override_mode(RID p_area, AreaSpaceOverride
PhysicsServer::AreaSpaceOverrideMode PhysicsServerSW::area_get_space_override_mode(RID p_area) const {
const AreaSW *area = area_owner.get(p_area);
- ERR_FAIL_COND_V(!area,AREA_SPACE_OVERRIDE_DISABLED);
+ ERR_FAIL_COND_V(!area, AREA_SPACE_OVERRIDE_DISABLED);
return area->get_space_override_mode();
}
-
-void PhysicsServerSW::area_add_shape(RID p_area, RID p_shape, const Transform& p_transform) {
+void PhysicsServerSW::area_add_shape(RID p_area, RID p_shape, const Transform &p_transform) {
AreaSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
@@ -285,11 +265,10 @@ void PhysicsServerSW::area_add_shape(RID p_area, RID p_shape, const Transform& p
ShapeSW *shape = shape_owner.get(p_shape);
ERR_FAIL_COND(!shape);
- area->add_shape(shape,p_transform);
-
+ area->add_shape(shape, p_transform);
}
-void PhysicsServerSW::area_set_shape(RID p_area, int p_shape_idx,RID p_shape) {
+void PhysicsServerSW::area_set_shape(RID p_area, int p_shape_idx, RID p_shape) {
AreaSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
@@ -298,39 +277,37 @@ void PhysicsServerSW::area_set_shape(RID p_area, int p_shape_idx,RID p_shape) {
ERR_FAIL_COND(!shape);
ERR_FAIL_COND(!shape->is_configured());
- area->set_shape(p_shape_idx,shape);
-
+ area->set_shape(p_shape_idx, shape);
}
-void PhysicsServerSW::area_set_shape_transform(RID p_area, int p_shape_idx, const Transform& p_transform) {
+void PhysicsServerSW::area_set_shape_transform(RID p_area, int p_shape_idx, const Transform &p_transform) {
AreaSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
- area->set_shape_transform(p_shape_idx,p_transform);
+ area->set_shape_transform(p_shape_idx, p_transform);
}
int PhysicsServerSW::area_get_shape_count(RID p_area) const {
AreaSW *area = area_owner.get(p_area);
- ERR_FAIL_COND_V(!area,-1);
+ ERR_FAIL_COND_V(!area, -1);
return area->get_shape_count();
-
}
RID PhysicsServerSW::area_get_shape(RID p_area, int p_shape_idx) const {
AreaSW *area = area_owner.get(p_area);
- ERR_FAIL_COND_V(!area,RID());
+ ERR_FAIL_COND_V(!area, RID());
ShapeSW *shape = area->get_shape(p_shape_idx);
- ERR_FAIL_COND_V(!shape,RID());
+ ERR_FAIL_COND_V(!shape, RID());
return shape->get_self();
}
Transform PhysicsServerSW::area_get_shape_transform(RID p_area, int p_shape_idx) const {
AreaSW *area = area_owner.get(p_area);
- ERR_FAIL_COND_V(!area,Transform());
+ ERR_FAIL_COND_V(!area, Transform());
return area->get_shape_transform(p_shape_idx);
}
@@ -348,65 +325,57 @@ void PhysicsServerSW::area_clear_shapes(RID p_area) {
AreaSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
- while(area->get_shape_count())
+ while (area->get_shape_count())
area->remove_shape(0);
-
}
-void PhysicsServerSW::area_attach_object_instance_ID(RID p_area,ObjectID p_ID) {
+void PhysicsServerSW::area_attach_object_instance_ID(RID p_area, ObjectID p_ID) {
if (space_owner.owns(p_area)) {
- SpaceSW *space=space_owner.get(p_area);
- p_area=space->get_default_area()->get_self();
+ SpaceSW *space = space_owner.get(p_area);
+ p_area = space->get_default_area()->get_self();
}
AreaSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
area->set_instance_id(p_ID);
-
}
ObjectID PhysicsServerSW::area_get_object_instance_ID(RID p_area) const {
if (space_owner.owns(p_area)) {
- SpaceSW *space=space_owner.get(p_area);
- p_area=space->get_default_area()->get_self();
+ SpaceSW *space = space_owner.get(p_area);
+ p_area = space->get_default_area()->get_self();
}
AreaSW *area = area_owner.get(p_area);
- ERR_FAIL_COND_V(!area,0);
+ ERR_FAIL_COND_V(!area, 0);
return area->get_instance_id();
-
-
}
-
-void PhysicsServerSW::area_set_param(RID p_area,AreaParameter p_param,const Variant& p_value) {
+void PhysicsServerSW::area_set_param(RID p_area, AreaParameter p_param, const Variant &p_value) {
if (space_owner.owns(p_area)) {
- SpaceSW *space=space_owner.get(p_area);
- p_area=space->get_default_area()->get_self();
+ SpaceSW *space = space_owner.get(p_area);
+ p_area = space->get_default_area()->get_self();
}
AreaSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
- area->set_param(p_param,p_value);
-
+ area->set_param(p_param, p_value);
};
-
-void PhysicsServerSW::area_set_transform(RID p_area, const Transform& p_transform) {
+void PhysicsServerSW::area_set_transform(RID p_area, const Transform &p_transform) {
AreaSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
area->set_transform(p_transform);
-
};
-Variant PhysicsServerSW::area_get_param(RID p_area,AreaParameter p_param) const {
+Variant PhysicsServerSW::area_get_param(RID p_area, AreaParameter p_param) const {
if (space_owner.owns(p_area)) {
- SpaceSW *space=space_owner.get(p_area);
- p_area=space->get_default_area()->get_self();
+ SpaceSW *space = space_owner.get(p_area);
+ p_area = space->get_default_area()->get_self();
}
AreaSW *area = area_owner.get(p_area);
- ERR_FAIL_COND_V(!area,Variant());
+ ERR_FAIL_COND_V(!area, Variant());
return area->get_param(p_param);
};
@@ -414,12 +383,12 @@ Variant PhysicsServerSW::area_get_param(RID p_area,AreaParameter p_param) const
Transform PhysicsServerSW::area_get_transform(RID p_area) const {
AreaSW *area = area_owner.get(p_area);
- ERR_FAIL_COND_V(!area,Transform());
+ ERR_FAIL_COND_V(!area, Transform());
return area->get_transform();
};
-void PhysicsServerSW::area_set_layer_mask(RID p_area,uint32_t p_mask) {
+void PhysicsServerSW::area_set_layer_mask(RID p_area, uint32_t p_mask) {
AreaSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
@@ -427,7 +396,7 @@ void PhysicsServerSW::area_set_layer_mask(RID p_area,uint32_t p_mask) {
area->set_layer_mask(p_mask);
}
-void PhysicsServerSW::area_set_collision_mask(RID p_area,uint32_t p_mask) {
+void PhysicsServerSW::area_set_collision_mask(RID p_area, uint32_t p_mask) {
AreaSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
@@ -435,7 +404,7 @@ void PhysicsServerSW::area_set_collision_mask(RID p_area,uint32_t p_mask) {
area->set_collision_mask(p_mask);
}
-void PhysicsServerSW::area_set_monitorable(RID p_area,bool p_monitorable) {
+void PhysicsServerSW::area_set_monitorable(RID p_area, bool p_monitorable) {
AreaSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
@@ -443,81 +412,73 @@ void PhysicsServerSW::area_set_monitorable(RID p_area,bool p_monitorable) {
area->set_monitorable(p_monitorable);
}
-void PhysicsServerSW::area_set_monitor_callback(RID p_area,Object *p_receiver,const StringName& p_method) {
+void PhysicsServerSW::area_set_monitor_callback(RID p_area, Object *p_receiver, const StringName &p_method) {
AreaSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
- area->set_monitor_callback(p_receiver?p_receiver->get_instance_ID():0,p_method);
-
-
+ area->set_monitor_callback(p_receiver ? p_receiver->get_instance_ID() : 0, p_method);
}
-void PhysicsServerSW::area_set_ray_pickable(RID p_area,bool p_enable) {
+void PhysicsServerSW::area_set_ray_pickable(RID p_area, bool p_enable) {
AreaSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
area->set_ray_pickable(p_enable);
-
}
-bool PhysicsServerSW::area_is_ray_pickable(RID p_area) const{
+bool PhysicsServerSW::area_is_ray_pickable(RID p_area) const {
AreaSW *area = area_owner.get(p_area);
- ERR_FAIL_COND_V(!area,false);
+ ERR_FAIL_COND_V(!area, false);
return area->is_ray_pickable();
-
}
-
-void PhysicsServerSW::area_set_area_monitor_callback(RID p_area,Object *p_receiver,const StringName& p_method) {
-
+void PhysicsServerSW::area_set_area_monitor_callback(RID p_area, Object *p_receiver, const StringName &p_method) {
AreaSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
- area->set_area_monitor_callback(p_receiver?p_receiver->get_instance_ID():0,p_method);
+ area->set_area_monitor_callback(p_receiver ? p_receiver->get_instance_ID() : 0, p_method);
}
/* BODY API */
-RID PhysicsServerSW::body_create(BodyMode p_mode,bool p_init_sleeping) {
+RID PhysicsServerSW::body_create(BodyMode p_mode, bool p_init_sleeping) {
- BodySW *body = memnew( BodySW );
- if (p_mode!=BODY_MODE_RIGID)
+ BodySW *body = memnew(BodySW);
+ if (p_mode != BODY_MODE_RIGID)
body->set_mode(p_mode);
if (p_init_sleeping)
- body->set_state(BODY_STATE_SLEEPING,p_init_sleeping);
+ body->set_state(BODY_STATE_SLEEPING, p_init_sleeping);
RID rid = body_owner.make_rid(body);
body->set_self(rid);
return rid;
};
-
void PhysicsServerSW::body_set_space(RID p_body, RID p_space) {
BodySW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
- SpaceSW *space=NULL;
+ SpaceSW *space = NULL;
if (p_space.is_valid()) {
space = space_owner.get(p_space);
ERR_FAIL_COND(!space);
}
- if (body->get_space()==space)
+ if (body->get_space() == space)
return; //pointles
body->set_space(space);
-
};
RID PhysicsServerSW::body_get_space(RID p_body) const {
BodySW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,RID());
+ ERR_FAIL_COND_V(!body, RID());
SpaceSW *space = body->get_space();
if (!space)
@@ -525,7 +486,6 @@ RID PhysicsServerSW::body_get_space(RID p_body) const {
return space->get_self();
};
-
void PhysicsServerSW::body_set_mode(RID p_body, BodyMode p_mode) {
BodySW *body = body_owner.get(p_body);
@@ -537,12 +497,12 @@ void PhysicsServerSW::body_set_mode(RID p_body, BodyMode p_mode) {
PhysicsServer::BodyMode PhysicsServerSW::body_get_mode(RID p_body) const {
BodySW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,BODY_MODE_STATIC);
+ ERR_FAIL_COND_V(!body, BODY_MODE_STATIC);
return body->get_mode();
};
-void PhysicsServerSW::body_add_shape(RID p_body, RID p_shape, const Transform& p_transform) {
+void PhysicsServerSW::body_add_shape(RID p_body, RID p_shape, const Transform &p_transform) {
BodySW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
@@ -550,11 +510,10 @@ void PhysicsServerSW::body_add_shape(RID p_body, RID p_shape, const Transform& p
ShapeSW *shape = shape_owner.get(p_shape);
ERR_FAIL_COND(!shape);
- body->add_shape(shape,p_transform);
-
+ body->add_shape(shape, p_transform);
}
-void PhysicsServerSW::body_set_shape(RID p_body, int p_shape_idx,RID p_shape) {
+void PhysicsServerSW::body_set_shape(RID p_body, int p_shape_idx, RID p_shape) {
BodySW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
@@ -563,59 +522,55 @@ void PhysicsServerSW::body_set_shape(RID p_body, int p_shape_idx,RID p_shape) {
ERR_FAIL_COND(!shape);
ERR_FAIL_COND(!shape->is_configured());
- body->set_shape(p_shape_idx,shape);
-
+ body->set_shape(p_shape_idx, shape);
}
-void PhysicsServerSW::body_set_shape_transform(RID p_body, int p_shape_idx, const Transform& p_transform) {
+void PhysicsServerSW::body_set_shape_transform(RID p_body, int p_shape_idx, const Transform &p_transform) {
BodySW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
- body->set_shape_transform(p_shape_idx,p_transform);
+ body->set_shape_transform(p_shape_idx, p_transform);
}
int PhysicsServerSW::body_get_shape_count(RID p_body) const {
BodySW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,-1);
+ ERR_FAIL_COND_V(!body, -1);
return body->get_shape_count();
-
}
RID PhysicsServerSW::body_get_shape(RID p_body, int p_shape_idx) const {
BodySW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,RID());
+ ERR_FAIL_COND_V(!body, RID());
ShapeSW *shape = body->get_shape(p_shape_idx);
- ERR_FAIL_COND_V(!shape,RID());
+ ERR_FAIL_COND_V(!shape, RID());
return shape->get_self();
}
-void PhysicsServerSW::body_set_shape_as_trigger(RID p_body, int p_shape_idx,bool p_enable) {
+void PhysicsServerSW::body_set_shape_as_trigger(RID p_body, int p_shape_idx, bool p_enable) {
BodySW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
- ERR_FAIL_INDEX(p_shape_idx,body->get_shape_count());
- body->set_shape_as_trigger(p_shape_idx,p_enable);
-
+ ERR_FAIL_INDEX(p_shape_idx, body->get_shape_count());
+ body->set_shape_as_trigger(p_shape_idx, p_enable);
}
-bool PhysicsServerSW::body_is_shape_set_as_trigger(RID p_body, int p_shape_idx) const{
+bool PhysicsServerSW::body_is_shape_set_as_trigger(RID p_body, int p_shape_idx) const {
BodySW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,false);
- ERR_FAIL_INDEX_V(p_shape_idx,body->get_shape_count(),false);
+ ERR_FAIL_COND_V(!body, false);
+ ERR_FAIL_INDEX_V(p_shape_idx, body->get_shape_count(), false);
return body->is_shape_set_as_trigger(p_shape_idx);
}
-
Transform PhysicsServerSW::body_get_shape_transform(RID p_body, int p_shape_idx) const {
BodySW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,Transform());
+ ERR_FAIL_COND_V(!body, Transform());
return body->get_shape_transform(p_shape_idx);
}
@@ -633,24 +588,22 @@ void PhysicsServerSW::body_clear_shapes(RID p_body) {
BodySW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
- while(body->get_shape_count())
+ while (body->get_shape_count())
body->remove_shape(0);
-
}
-void PhysicsServerSW::body_set_enable_continuous_collision_detection(RID p_body,bool p_enable) {
+void PhysicsServerSW::body_set_enable_continuous_collision_detection(RID p_body, bool p_enable) {
BodySW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
body->set_continuous_collision_detection(p_enable);
-
}
bool PhysicsServerSW::body_is_continuous_collision_detection_enabled(RID p_body) const {
BodySW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,false);
+ ERR_FAIL_COND_V(!body, false);
return body->is_continuous_collision_detection_enabled();
}
@@ -662,16 +615,14 @@ void PhysicsServerSW::body_set_layer_mask(RID p_body, uint32_t p_mask) {
body->set_layer_mask(p_mask);
body->wakeup();
-
}
-uint32_t PhysicsServerSW::body_get_layer_mask(RID p_body, uint32_t p_mask) const{
+uint32_t PhysicsServerSW::body_get_layer_mask(RID p_body, uint32_t p_mask) const {
const BodySW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,0);
+ ERR_FAIL_COND_V(!body, 0);
return body->get_layer_mask();
-
}
void PhysicsServerSW::body_set_collision_mask(RID p_body, uint32_t p_mask) {
@@ -681,48 +632,42 @@ void PhysicsServerSW::body_set_collision_mask(RID p_body, uint32_t p_mask) {
body->set_collision_mask(p_mask);
body->wakeup();
-
}
-uint32_t PhysicsServerSW::body_get_collision_mask(RID p_body, uint32_t p_mask) const{
+uint32_t PhysicsServerSW::body_get_collision_mask(RID p_body, uint32_t p_mask) const {
const BodySW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,0);
+ ERR_FAIL_COND_V(!body, 0);
return body->get_collision_mask();
-
}
-
-void PhysicsServerSW::body_attach_object_instance_ID(RID p_body,uint32_t p_ID) {
+void PhysicsServerSW::body_attach_object_instance_ID(RID p_body, uint32_t p_ID) {
BodySW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
body->set_instance_id(p_ID);
-
};
uint32_t PhysicsServerSW::body_get_object_instance_ID(RID p_body) const {
BodySW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,0);
+ ERR_FAIL_COND_V(!body, 0);
return body->get_instance_id();
};
-
void PhysicsServerSW::body_set_user_flags(RID p_body, uint32_t p_flags) {
BodySW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
-
};
uint32_t PhysicsServerSW::body_get_user_flags(RID p_body, uint32_t p_flags) const {
BodySW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,0);
+ ERR_FAIL_COND_V(!body, 0);
return 0;
};
@@ -732,38 +677,34 @@ void PhysicsServerSW::body_set_param(RID p_body, BodyParameter p_param, float p_
BodySW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
- body->set_param(p_param,p_value);
+ body->set_param(p_param, p_value);
};
float PhysicsServerSW::body_get_param(RID p_body, BodyParameter p_param) const {
BodySW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,0);
+ ERR_FAIL_COND_V(!body, 0);
return body->get_param(p_param);
};
-
-
-void PhysicsServerSW::body_set_state(RID p_body, BodyState p_state, const Variant& p_variant) {
+void PhysicsServerSW::body_set_state(RID p_body, BodyState p_state, const Variant &p_variant) {
BodySW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
- body->set_state(p_state,p_variant);
-
+ body->set_state(p_state, p_variant);
};
Variant PhysicsServerSW::body_get_state(RID p_body, BodyState p_state) const {
BodySW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,Variant());
+ ERR_FAIL_COND_V(!body, Variant());
return body->get_state(p_state);
};
-
-void PhysicsServerSW::body_set_applied_force(RID p_body, const Vector3& p_force) {
+void PhysicsServerSW::body_set_applied_force(RID p_body, const Vector3 &p_force) {
BodySW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
@@ -775,11 +716,11 @@ void PhysicsServerSW::body_set_applied_force(RID p_body, const Vector3& p_force)
Vector3 PhysicsServerSW::body_get_applied_force(RID p_body) const {
BodySW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,Vector3());
+ ERR_FAIL_COND_V(!body, Vector3());
return body->get_applied_force();
};
-void PhysicsServerSW::body_set_applied_torque(RID p_body, const Vector3& p_torque) {
+void PhysicsServerSW::body_set_applied_torque(RID p_body, const Vector3 &p_torque) {
BodySW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
@@ -791,54 +732,48 @@ void PhysicsServerSW::body_set_applied_torque(RID p_body, const Vector3& p_torqu
Vector3 PhysicsServerSW::body_get_applied_torque(RID p_body) const {
BodySW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,Vector3());
+ ERR_FAIL_COND_V(!body, Vector3());
return body->get_applied_torque();
};
-void PhysicsServerSW::body_apply_impulse(RID p_body, const Vector3& p_pos, const Vector3& p_impulse) {
+void PhysicsServerSW::body_apply_impulse(RID p_body, const Vector3 &p_pos, const Vector3 &p_impulse) {
BodySW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
- body->apply_impulse(p_pos,p_impulse);
+ body->apply_impulse(p_pos, p_impulse);
body->wakeup();
};
-void PhysicsServerSW::body_set_axis_velocity(RID p_body, const Vector3& p_axis_velocity) {
+void PhysicsServerSW::body_set_axis_velocity(RID p_body, const Vector3 &p_axis_velocity) {
BodySW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
Vector3 v = body->get_linear_velocity();
Vector3 axis = p_axis_velocity.normalized();
- v-=axis*axis.dot(v);
- v+=p_axis_velocity;
+ v -= axis * axis.dot(v);
+ v += p_axis_velocity;
body->set_linear_velocity(v);
body->wakeup();
-
};
-
-void PhysicsServerSW::body_set_axis_lock(RID p_body,BodyAxisLock p_lock) {
+void PhysicsServerSW::body_set_axis_lock(RID p_body, BodyAxisLock p_lock) {
BodySW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
body->set_axis_lock(p_lock);
body->wakeup();
-
}
-PhysicsServerSW::BodyAxisLock PhysicsServerSW::body_get_axis_lock(RID p_body) const{
+PhysicsServerSW::BodyAxisLock PhysicsServerSW::body_get_axis_lock(RID p_body) const {
const BodySW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,BODY_AXIS_LOCK_DISABLED);
+ ERR_FAIL_COND_V(!body, BODY_AXIS_LOCK_DISABLED);
return body->get_axis_lock();
-
}
-
-
void PhysicsServerSW::body_add_collision_exception(RID p_body, RID p_body_b) {
BodySW *body = body_owner.get(p_body);
@@ -846,7 +781,6 @@ void PhysicsServerSW::body_add_collision_exception(RID p_body, RID p_body_b) {
body->add_exception(p_body_b);
body->wakeup();
-
};
void PhysicsServerSW::body_remove_collision_exception(RID p_body, RID p_body_b) {
@@ -856,7 +790,6 @@ void PhysicsServerSW::body_remove_collision_exception(RID p_body, RID p_body_b)
body->remove_exception(p_body_b);
body->wakeup();
-
};
void PhysicsServerSW::body_get_collision_exceptions(RID p_body, List<RID> *p_exceptions) {
@@ -864,27 +797,25 @@ void PhysicsServerSW::body_get_collision_exceptions(RID p_body, List<RID> *p_exc
BodySW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
- for(int i=0;i<body->get_exceptions().size();i++) {
+ for (int i = 0; i < body->get_exceptions().size(); i++) {
p_exceptions->push_back(body->get_exceptions()[i]);
}
-
};
void PhysicsServerSW::body_set_contacts_reported_depth_treshold(RID p_body, float p_treshold) {
BodySW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
-
};
float PhysicsServerSW::body_get_contacts_reported_depth_treshold(RID p_body) const {
BodySW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,0);
+ ERR_FAIL_COND_V(!body, 0);
return 0;
};
-void PhysicsServerSW::body_set_omit_force_integration(RID p_body,bool p_omit) {
+void PhysicsServerSW::body_set_omit_force_integration(RID p_body, bool p_omit) {
BodySW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
@@ -895,7 +826,7 @@ void PhysicsServerSW::body_set_omit_force_integration(RID p_body,bool p_omit) {
bool PhysicsServerSW::body_is_omitting_force_integration(RID p_body) const {
BodySW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,false);
+ ERR_FAIL_COND_V(!body, false);
return body->get_omit_force_integration();
};
@@ -909,355 +840,333 @@ void PhysicsServerSW::body_set_max_contacts_reported(RID p_body, int p_contacts)
int PhysicsServerSW::body_get_max_contacts_reported(RID p_body) const {
BodySW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,-1);
+ ERR_FAIL_COND_V(!body, -1);
return body->get_max_contacts_reported();
}
-void PhysicsServerSW::body_set_force_integration_callback(RID p_body,Object *p_receiver,const StringName& p_method,const Variant& p_udata) {
-
+void PhysicsServerSW::body_set_force_integration_callback(RID p_body, Object *p_receiver, const StringName &p_method, const Variant &p_udata) {
BodySW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
- body->set_force_integration_callback(p_receiver?p_receiver->get_instance_ID():ObjectID(0),p_method,p_udata);
-
+ body->set_force_integration_callback(p_receiver ? p_receiver->get_instance_ID() : ObjectID(0), p_method, p_udata);
}
-void PhysicsServerSW::body_set_ray_pickable(RID p_body,bool p_enable) {
+void PhysicsServerSW::body_set_ray_pickable(RID p_body, bool p_enable) {
BodySW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
body->set_ray_pickable(p_enable);
-
}
-bool PhysicsServerSW::body_is_ray_pickable(RID p_body) const{
+bool PhysicsServerSW::body_is_ray_pickable(RID p_body) const {
BodySW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,false);
+ ERR_FAIL_COND_V(!body, false);
return body->is_ray_pickable();
-
}
-
/* JOINT API */
-RID PhysicsServerSW::joint_create_pin(RID p_body_A,const Vector3& p_local_A,RID p_body_B,const Vector3& p_local_B) {
+RID PhysicsServerSW::joint_create_pin(RID p_body_A, const Vector3 &p_local_A, RID p_body_B, const Vector3 &p_local_B) {
BodySW *body_A = body_owner.get(p_body_A);
- ERR_FAIL_COND_V(!body_A,RID());
+ ERR_FAIL_COND_V(!body_A, RID());
if (!p_body_B.is_valid()) {
- ERR_FAIL_COND_V(!body_A->get_space(),RID());
- p_body_B=body_A->get_space()->get_static_global_body();
+ ERR_FAIL_COND_V(!body_A->get_space(), RID());
+ p_body_B = body_A->get_space()->get_static_global_body();
}
BodySW *body_B = body_owner.get(p_body_B);
- ERR_FAIL_COND_V(!body_B,RID());
+ ERR_FAIL_COND_V(!body_B, RID());
- ERR_FAIL_COND_V(body_A==body_B,RID());
+ ERR_FAIL_COND_V(body_A == body_B, RID());
- JointSW *joint = memnew( PinJointSW(body_A,p_local_A,body_B,p_local_B) );
+ JointSW *joint = memnew(PinJointSW(body_A, p_local_A, body_B, p_local_B));
RID rid = joint_owner.make_rid(joint);
joint->set_self(rid);
return rid;
}
-void PhysicsServerSW::pin_joint_set_param(RID p_joint,PinJointParam p_param, float p_value){
+void PhysicsServerSW::pin_joint_set_param(RID p_joint, PinJointParam p_param, float p_value) {
JointSW *joint = joint_owner.get(p_joint);
ERR_FAIL_COND(!joint);
- ERR_FAIL_COND(joint->get_type()!=JOINT_PIN);
- PinJointSW *pin_joint = static_cast<PinJointSW*>(joint);
- pin_joint->set_param(p_param,p_value);
-
+ ERR_FAIL_COND(joint->get_type() != JOINT_PIN);
+ PinJointSW *pin_joint = static_cast<PinJointSW *>(joint);
+ pin_joint->set_param(p_param, p_value);
}
-float PhysicsServerSW::pin_joint_get_param(RID p_joint,PinJointParam p_param) const{
+float PhysicsServerSW::pin_joint_get_param(RID p_joint, PinJointParam p_param) const {
JointSW *joint = joint_owner.get(p_joint);
- ERR_FAIL_COND_V(!joint,0);
- ERR_FAIL_COND_V(joint->get_type()!=JOINT_PIN,0);
- PinJointSW *pin_joint = static_cast<PinJointSW*>(joint);
+ ERR_FAIL_COND_V(!joint, 0);
+ ERR_FAIL_COND_V(joint->get_type() != JOINT_PIN, 0);
+ PinJointSW *pin_joint = static_cast<PinJointSW *>(joint);
return pin_joint->get_param(p_param);
-
}
-void PhysicsServerSW::pin_joint_set_local_A(RID p_joint, const Vector3& p_A){
+void PhysicsServerSW::pin_joint_set_local_A(RID p_joint, const Vector3 &p_A) {
JointSW *joint = joint_owner.get(p_joint);
ERR_FAIL_COND(!joint);
- ERR_FAIL_COND(joint->get_type()!=JOINT_PIN);
- PinJointSW *pin_joint = static_cast<PinJointSW*>(joint);
+ ERR_FAIL_COND(joint->get_type() != JOINT_PIN);
+ PinJointSW *pin_joint = static_cast<PinJointSW *>(joint);
pin_joint->set_pos_A(p_A);
-
}
-Vector3 PhysicsServerSW::pin_joint_get_local_A(RID p_joint) const{
+Vector3 PhysicsServerSW::pin_joint_get_local_A(RID p_joint) const {
JointSW *joint = joint_owner.get(p_joint);
- ERR_FAIL_COND_V(!joint,Vector3());
- ERR_FAIL_COND_V(joint->get_type()!=JOINT_PIN,Vector3());
- PinJointSW *pin_joint = static_cast<PinJointSW*>(joint);
+ ERR_FAIL_COND_V(!joint, Vector3());
+ ERR_FAIL_COND_V(joint->get_type() != JOINT_PIN, Vector3());
+ PinJointSW *pin_joint = static_cast<PinJointSW *>(joint);
return pin_joint->get_pos_A();
-
}
-void PhysicsServerSW::pin_joint_set_local_B(RID p_joint, const Vector3& p_B){
+void PhysicsServerSW::pin_joint_set_local_B(RID p_joint, const Vector3 &p_B) {
JointSW *joint = joint_owner.get(p_joint);
ERR_FAIL_COND(!joint);
- ERR_FAIL_COND(joint->get_type()!=JOINT_PIN);
- PinJointSW *pin_joint = static_cast<PinJointSW*>(joint);
+ ERR_FAIL_COND(joint->get_type() != JOINT_PIN);
+ PinJointSW *pin_joint = static_cast<PinJointSW *>(joint);
pin_joint->set_pos_B(p_B);
-
}
-Vector3 PhysicsServerSW::pin_joint_get_local_B(RID p_joint) const{
+Vector3 PhysicsServerSW::pin_joint_get_local_B(RID p_joint) const {
JointSW *joint = joint_owner.get(p_joint);
- ERR_FAIL_COND_V(!joint,Vector3());
- ERR_FAIL_COND_V(joint->get_type()!=JOINT_PIN,Vector3());
- PinJointSW *pin_joint = static_cast<PinJointSW*>(joint);
+ ERR_FAIL_COND_V(!joint, Vector3());
+ ERR_FAIL_COND_V(joint->get_type() != JOINT_PIN, Vector3());
+ PinJointSW *pin_joint = static_cast<PinJointSW *>(joint);
return pin_joint->get_pos_B();
-
}
-
-RID PhysicsServerSW::joint_create_hinge(RID p_body_A,const Transform& p_frame_A,RID p_body_B,const Transform& p_frame_B) {
+RID PhysicsServerSW::joint_create_hinge(RID p_body_A, const Transform &p_frame_A, RID p_body_B, const Transform &p_frame_B) {
BodySW *body_A = body_owner.get(p_body_A);
- ERR_FAIL_COND_V(!body_A,RID());
+ ERR_FAIL_COND_V(!body_A, RID());
if (!p_body_B.is_valid()) {
- ERR_FAIL_COND_V(!body_A->get_space(),RID());
- p_body_B=body_A->get_space()->get_static_global_body();
+ ERR_FAIL_COND_V(!body_A->get_space(), RID());
+ p_body_B = body_A->get_space()->get_static_global_body();
}
BodySW *body_B = body_owner.get(p_body_B);
- ERR_FAIL_COND_V(!body_B,RID());
+ ERR_FAIL_COND_V(!body_B, RID());
- ERR_FAIL_COND_V(body_A==body_B,RID());
+ ERR_FAIL_COND_V(body_A == body_B, RID());
- JointSW *joint = memnew( HingeJointSW(body_A,body_B,p_frame_A,p_frame_B) );
+ JointSW *joint = memnew(HingeJointSW(body_A, body_B, p_frame_A, p_frame_B));
RID rid = joint_owner.make_rid(joint);
joint->set_self(rid);
return rid;
-
}
-
-RID PhysicsServerSW::joint_create_hinge_simple(RID p_body_A,const Vector3& p_pivot_A,const Vector3& p_axis_A,RID p_body_B,const Vector3& p_pivot_B,const Vector3& p_axis_B) {
+RID PhysicsServerSW::joint_create_hinge_simple(RID p_body_A, const Vector3 &p_pivot_A, const Vector3 &p_axis_A, RID p_body_B, const Vector3 &p_pivot_B, const Vector3 &p_axis_B) {
BodySW *body_A = body_owner.get(p_body_A);
- ERR_FAIL_COND_V(!body_A,RID());
+ ERR_FAIL_COND_V(!body_A, RID());
if (!p_body_B.is_valid()) {
- ERR_FAIL_COND_V(!body_A->get_space(),RID());
- p_body_B=body_A->get_space()->get_static_global_body();
+ ERR_FAIL_COND_V(!body_A->get_space(), RID());
+ p_body_B = body_A->get_space()->get_static_global_body();
}
BodySW *body_B = body_owner.get(p_body_B);
- ERR_FAIL_COND_V(!body_B,RID());
+ ERR_FAIL_COND_V(!body_B, RID());
- ERR_FAIL_COND_V(body_A==body_B,RID());
+ ERR_FAIL_COND_V(body_A == body_B, RID());
- JointSW *joint = memnew( HingeJointSW(body_A,body_B,p_pivot_A,p_pivot_B,p_axis_A,p_axis_B) );
+ JointSW *joint = memnew(HingeJointSW(body_A, body_B, p_pivot_A, p_pivot_B, p_axis_A, p_axis_B));
RID rid = joint_owner.make_rid(joint);
joint->set_self(rid);
return rid;
-
}
-void PhysicsServerSW::hinge_joint_set_param(RID p_joint,HingeJointParam p_param, float p_value){
+void PhysicsServerSW::hinge_joint_set_param(RID p_joint, HingeJointParam p_param, float p_value) {
JointSW *joint = joint_owner.get(p_joint);
ERR_FAIL_COND(!joint);
- ERR_FAIL_COND(joint->get_type()!=JOINT_HINGE);
- HingeJointSW *hinge_joint = static_cast<HingeJointSW*>(joint);
- hinge_joint->set_param(p_param,p_value);
-
+ ERR_FAIL_COND(joint->get_type() != JOINT_HINGE);
+ HingeJointSW *hinge_joint = static_cast<HingeJointSW *>(joint);
+ hinge_joint->set_param(p_param, p_value);
}
-float PhysicsServerSW::hinge_joint_get_param(RID p_joint,HingeJointParam p_param) const{
+float PhysicsServerSW::hinge_joint_get_param(RID p_joint, HingeJointParam p_param) const {
JointSW *joint = joint_owner.get(p_joint);
- ERR_FAIL_COND_V(!joint,0);
- ERR_FAIL_COND_V(joint->get_type()!=JOINT_HINGE,0);
- HingeJointSW *hinge_joint = static_cast<HingeJointSW*>(joint);
+ ERR_FAIL_COND_V(!joint, 0);
+ ERR_FAIL_COND_V(joint->get_type() != JOINT_HINGE, 0);
+ HingeJointSW *hinge_joint = static_cast<HingeJointSW *>(joint);
return hinge_joint->get_param(p_param);
-
}
-void PhysicsServerSW::hinge_joint_set_flag(RID p_joint,HingeJointFlag p_flag, bool p_value){
+void PhysicsServerSW::hinge_joint_set_flag(RID p_joint, HingeJointFlag p_flag, bool p_value) {
JointSW *joint = joint_owner.get(p_joint);
ERR_FAIL_COND(!joint);
- ERR_FAIL_COND(joint->get_type()!=JOINT_HINGE);
- HingeJointSW *hinge_joint = static_cast<HingeJointSW*>(joint);
- hinge_joint->set_flag(p_flag,p_value);
-
+ ERR_FAIL_COND(joint->get_type() != JOINT_HINGE);
+ HingeJointSW *hinge_joint = static_cast<HingeJointSW *>(joint);
+ hinge_joint->set_flag(p_flag, p_value);
}
-bool PhysicsServerSW::hinge_joint_get_flag(RID p_joint,HingeJointFlag p_flag) const{
+bool PhysicsServerSW::hinge_joint_get_flag(RID p_joint, HingeJointFlag p_flag) const {
JointSW *joint = joint_owner.get(p_joint);
- ERR_FAIL_COND_V(!joint,false);
- ERR_FAIL_COND_V(joint->get_type()!=JOINT_HINGE,false);
- HingeJointSW *hinge_joint = static_cast<HingeJointSW*>(joint);
+ ERR_FAIL_COND_V(!joint, false);
+ ERR_FAIL_COND_V(joint->get_type() != JOINT_HINGE, false);
+ HingeJointSW *hinge_joint = static_cast<HingeJointSW *>(joint);
return hinge_joint->get_flag(p_flag);
}
-void PhysicsServerSW::joint_set_solver_priority(RID p_joint,int p_priority) {
+void PhysicsServerSW::joint_set_solver_priority(RID p_joint, int p_priority) {
JointSW *joint = joint_owner.get(p_joint);
ERR_FAIL_COND(!joint);
joint->set_priority(p_priority);
}
-int PhysicsServerSW::joint_get_solver_priority(RID p_joint) const{
+int PhysicsServerSW::joint_get_solver_priority(RID p_joint) const {
JointSW *joint = joint_owner.get(p_joint);
- ERR_FAIL_COND_V(!joint,0);
+ ERR_FAIL_COND_V(!joint, 0);
return joint->get_priority();
-
}
PhysicsServerSW::JointType PhysicsServerSW::joint_get_type(RID p_joint) const {
JointSW *joint = joint_owner.get(p_joint);
- ERR_FAIL_COND_V(!joint,JOINT_PIN);
+ ERR_FAIL_COND_V(!joint, JOINT_PIN);
return joint->get_type();
}
-RID PhysicsServerSW::joint_create_slider(RID p_body_A,const Transform& p_local_frame_A,RID p_body_B,const Transform& p_local_frame_B) {
+RID PhysicsServerSW::joint_create_slider(RID p_body_A, const Transform &p_local_frame_A, RID p_body_B, const Transform &p_local_frame_B) {
BodySW *body_A = body_owner.get(p_body_A);
- ERR_FAIL_COND_V(!body_A,RID());
+ ERR_FAIL_COND_V(!body_A, RID());
if (!p_body_B.is_valid()) {
- ERR_FAIL_COND_V(!body_A->get_space(),RID());
- p_body_B=body_A->get_space()->get_static_global_body();
+ ERR_FAIL_COND_V(!body_A->get_space(), RID());
+ p_body_B = body_A->get_space()->get_static_global_body();
}
BodySW *body_B = body_owner.get(p_body_B);
- ERR_FAIL_COND_V(!body_B,RID());
+ ERR_FAIL_COND_V(!body_B, RID());
- ERR_FAIL_COND_V(body_A==body_B,RID());
+ ERR_FAIL_COND_V(body_A == body_B, RID());
- JointSW *joint = memnew( SliderJointSW(body_A,body_B,p_local_frame_A,p_local_frame_B) );
+ JointSW *joint = memnew(SliderJointSW(body_A, body_B, p_local_frame_A, p_local_frame_B));
RID rid = joint_owner.make_rid(joint);
joint->set_self(rid);
return rid;
}
-void PhysicsServerSW::slider_joint_set_param(RID p_joint,SliderJointParam p_param, float p_value){
+void PhysicsServerSW::slider_joint_set_param(RID p_joint, SliderJointParam p_param, float p_value) {
JointSW *joint = joint_owner.get(p_joint);
ERR_FAIL_COND(!joint);
- ERR_FAIL_COND(joint->get_type()!=JOINT_SLIDER);
- SliderJointSW *slider_joint = static_cast<SliderJointSW*>(joint);
- slider_joint->set_param(p_param,p_value);
+ ERR_FAIL_COND(joint->get_type() != JOINT_SLIDER);
+ SliderJointSW *slider_joint = static_cast<SliderJointSW *>(joint);
+ slider_joint->set_param(p_param, p_value);
}
-float PhysicsServerSW::slider_joint_get_param(RID p_joint,SliderJointParam p_param) const{
+float PhysicsServerSW::slider_joint_get_param(RID p_joint, SliderJointParam p_param) const {
JointSW *joint = joint_owner.get(p_joint);
- ERR_FAIL_COND_V(!joint,0);
- ERR_FAIL_COND_V(joint->get_type()!=JOINT_CONE_TWIST,0);
- SliderJointSW *slider_joint = static_cast<SliderJointSW*>(joint);
+ ERR_FAIL_COND_V(!joint, 0);
+ ERR_FAIL_COND_V(joint->get_type() != JOINT_CONE_TWIST, 0);
+ SliderJointSW *slider_joint = static_cast<SliderJointSW *>(joint);
return slider_joint->get_param(p_param);
}
-
-RID PhysicsServerSW::joint_create_cone_twist(RID p_body_A,const Transform& p_local_frame_A,RID p_body_B,const Transform& p_local_frame_B) {
+RID PhysicsServerSW::joint_create_cone_twist(RID p_body_A, const Transform &p_local_frame_A, RID p_body_B, const Transform &p_local_frame_B) {
BodySW *body_A = body_owner.get(p_body_A);
- ERR_FAIL_COND_V(!body_A,RID());
+ ERR_FAIL_COND_V(!body_A, RID());
if (!p_body_B.is_valid()) {
- ERR_FAIL_COND_V(!body_A->get_space(),RID());
- p_body_B=body_A->get_space()->get_static_global_body();
+ ERR_FAIL_COND_V(!body_A->get_space(), RID());
+ p_body_B = body_A->get_space()->get_static_global_body();
}
BodySW *body_B = body_owner.get(p_body_B);
- ERR_FAIL_COND_V(!body_B,RID());
+ ERR_FAIL_COND_V(!body_B, RID());
- ERR_FAIL_COND_V(body_A==body_B,RID());
+ ERR_FAIL_COND_V(body_A == body_B, RID());
- JointSW *joint = memnew( ConeTwistJointSW(body_A,body_B,p_local_frame_A,p_local_frame_B) );
+ JointSW *joint = memnew(ConeTwistJointSW(body_A, body_B, p_local_frame_A, p_local_frame_B));
RID rid = joint_owner.make_rid(joint);
joint->set_self(rid);
return rid;
}
-void PhysicsServerSW::cone_twist_joint_set_param(RID p_joint,ConeTwistJointParam p_param, float p_value) {
+void PhysicsServerSW::cone_twist_joint_set_param(RID p_joint, ConeTwistJointParam p_param, float p_value) {
JointSW *joint = joint_owner.get(p_joint);
ERR_FAIL_COND(!joint);
- ERR_FAIL_COND(joint->get_type()!=JOINT_CONE_TWIST);
- ConeTwistJointSW *cone_twist_joint = static_cast<ConeTwistJointSW*>(joint);
- cone_twist_joint->set_param(p_param,p_value);
+ ERR_FAIL_COND(joint->get_type() != JOINT_CONE_TWIST);
+ ConeTwistJointSW *cone_twist_joint = static_cast<ConeTwistJointSW *>(joint);
+ cone_twist_joint->set_param(p_param, p_value);
}
-float PhysicsServerSW::cone_twist_joint_get_param(RID p_joint,ConeTwistJointParam p_param) const {
+float PhysicsServerSW::cone_twist_joint_get_param(RID p_joint, ConeTwistJointParam p_param) const {
JointSW *joint = joint_owner.get(p_joint);
- ERR_FAIL_COND_V(!joint,0);
- ERR_FAIL_COND_V(joint->get_type()!=JOINT_CONE_TWIST,0);
- ConeTwistJointSW *cone_twist_joint = static_cast<ConeTwistJointSW*>(joint);
+ ERR_FAIL_COND_V(!joint, 0);
+ ERR_FAIL_COND_V(joint->get_type() != JOINT_CONE_TWIST, 0);
+ ConeTwistJointSW *cone_twist_joint = static_cast<ConeTwistJointSW *>(joint);
return cone_twist_joint->get_param(p_param);
}
-
-RID PhysicsServerSW::joint_create_generic_6dof(RID p_body_A,const Transform& p_local_frame_A,RID p_body_B,const Transform& p_local_frame_B) {
+RID PhysicsServerSW::joint_create_generic_6dof(RID p_body_A, const Transform &p_local_frame_A, RID p_body_B, const Transform &p_local_frame_B) {
BodySW *body_A = body_owner.get(p_body_A);
- ERR_FAIL_COND_V(!body_A,RID());
+ ERR_FAIL_COND_V(!body_A, RID());
if (!p_body_B.is_valid()) {
- ERR_FAIL_COND_V(!body_A->get_space(),RID());
- p_body_B=body_A->get_space()->get_static_global_body();
+ ERR_FAIL_COND_V(!body_A->get_space(), RID());
+ p_body_B = body_A->get_space()->get_static_global_body();
}
BodySW *body_B = body_owner.get(p_body_B);
- ERR_FAIL_COND_V(!body_B,RID());
+ ERR_FAIL_COND_V(!body_B, RID());
- ERR_FAIL_COND_V(body_A==body_B,RID());
+ ERR_FAIL_COND_V(body_A == body_B, RID());
- JointSW *joint = memnew( Generic6DOFJointSW(body_A,body_B,p_local_frame_A,p_local_frame_B,true) );
+ JointSW *joint = memnew(Generic6DOFJointSW(body_A, body_B, p_local_frame_A, p_local_frame_B, true));
RID rid = joint_owner.make_rid(joint);
joint->set_self(rid);
return rid;
}
-void PhysicsServerSW::generic_6dof_joint_set_param(RID p_joint,Vector3::Axis p_axis,G6DOFJointAxisParam p_param, float p_value){
+void PhysicsServerSW::generic_6dof_joint_set_param(RID p_joint, Vector3::Axis p_axis, G6DOFJointAxisParam p_param, float p_value) {
JointSW *joint = joint_owner.get(p_joint);
ERR_FAIL_COND(!joint);
- ERR_FAIL_COND(joint->get_type()!=JOINT_6DOF);
- Generic6DOFJointSW *generic_6dof_joint = static_cast<Generic6DOFJointSW*>(joint);
- generic_6dof_joint->set_param(p_axis,p_param,p_value);
+ ERR_FAIL_COND(joint->get_type() != JOINT_6DOF);
+ Generic6DOFJointSW *generic_6dof_joint = static_cast<Generic6DOFJointSW *>(joint);
+ generic_6dof_joint->set_param(p_axis, p_param, p_value);
}
-float PhysicsServerSW::generic_6dof_joint_get_param(RID p_joint,Vector3::Axis p_axis,G6DOFJointAxisParam p_param){
+float PhysicsServerSW::generic_6dof_joint_get_param(RID p_joint, Vector3::Axis p_axis, G6DOFJointAxisParam p_param) {
JointSW *joint = joint_owner.get(p_joint);
- ERR_FAIL_COND_V(!joint,0);
- ERR_FAIL_COND_V(joint->get_type()!=JOINT_6DOF,0);
- Generic6DOFJointSW *generic_6dof_joint = static_cast<Generic6DOFJointSW*>(joint);
- return generic_6dof_joint->get_param(p_axis,p_param);
+ ERR_FAIL_COND_V(!joint, 0);
+ ERR_FAIL_COND_V(joint->get_type() != JOINT_6DOF, 0);
+ Generic6DOFJointSW *generic_6dof_joint = static_cast<Generic6DOFJointSW *>(joint);
+ return generic_6dof_joint->get_param(p_axis, p_param);
}
-void PhysicsServerSW::generic_6dof_joint_set_flag(RID p_joint,Vector3::Axis p_axis,G6DOFJointAxisFlag p_flag, bool p_enable){
+void PhysicsServerSW::generic_6dof_joint_set_flag(RID p_joint, Vector3::Axis p_axis, G6DOFJointAxisFlag p_flag, bool p_enable) {
JointSW *joint = joint_owner.get(p_joint);
ERR_FAIL_COND(!joint);
- ERR_FAIL_COND(joint->get_type()!=JOINT_6DOF);
- Generic6DOFJointSW *generic_6dof_joint = static_cast<Generic6DOFJointSW*>(joint);
- generic_6dof_joint->set_flag(p_axis,p_flag,p_enable);
+ ERR_FAIL_COND(joint->get_type() != JOINT_6DOF);
+ Generic6DOFJointSW *generic_6dof_joint = static_cast<Generic6DOFJointSW *>(joint);
+ generic_6dof_joint->set_flag(p_axis, p_flag, p_enable);
}
-bool PhysicsServerSW::generic_6dof_joint_get_flag(RID p_joint,Vector3::Axis p_axis,G6DOFJointAxisFlag p_flag){
+bool PhysicsServerSW::generic_6dof_joint_get_flag(RID p_joint, Vector3::Axis p_axis, G6DOFJointAxisFlag p_flag) {
JointSW *joint = joint_owner.get(p_joint);
- ERR_FAIL_COND_V(!joint,false);
- ERR_FAIL_COND_V(joint->get_type()!=JOINT_6DOF,false);
- Generic6DOFJointSW *generic_6dof_joint = static_cast<Generic6DOFJointSW*>(joint);
- return generic_6dof_joint->get_flag(p_axis,p_flag);
+ ERR_FAIL_COND_V(!joint, false);
+ ERR_FAIL_COND_V(joint->get_type() != JOINT_6DOF, false);
+ Generic6DOFJointSW *generic_6dof_joint = static_cast<Generic6DOFJointSW *>(joint);
+ return generic_6dof_joint->get_flag(p_axis, p_flag);
}
-
#if 0
void PhysicsServerSW::joint_set_param(RID p_joint, JointParam p_param, real_t p_value) {
@@ -1375,8 +1284,8 @@ void PhysicsServerSW::free(RID p_rid) {
ShapeSW *shape = shape_owner.get(p_rid);
- while(shape->get_owners().size()) {
- ShapeOwnerSW *so=shape->get_owners().front()->key();
+ while (shape->get_owners().size()) {
+ ShapeOwnerSW *so = shape->get_owners().front()->key();
so->remove_shape(shape);
}
@@ -1386,16 +1295,15 @@ void PhysicsServerSW::free(RID p_rid) {
BodySW *body = body_owner.get(p_rid);
-// if (body->get_state_query())
-// _clear_query(body->get_state_query());
+ // if (body->get_state_query())
+ // _clear_query(body->get_state_query());
-// if (body->get_direct_state_query())
-// _clear_query(body->get_direct_state_query());
+ // if (body->get_direct_state_query())
+ // _clear_query(body->get_direct_state_query());
body->set_space(NULL);
-
- while( body->get_shape_count() ) {
+ while (body->get_shape_count()) {
body->remove_shape(0);
}
@@ -1413,12 +1321,12 @@ void PhysicsServerSW::free(RID p_rid) {
AreaSW *area = area_owner.get(p_rid);
-// if (area->get_monitor_query())
-// _clear_query(area->get_monitor_query());
+ // if (area->get_monitor_query())
+ // _clear_query(area->get_monitor_query());
area->set_space(NULL);
- while( area->get_shape_count() ) {
+ while (area->get_shape_count()) {
area->remove_shape(0);
}
@@ -1429,7 +1337,7 @@ void PhysicsServerSW::free(RID p_rid) {
SpaceSW *space = space_owner.get(p_rid);
- while(space->get_objects().size()) {
+ while (space->get_objects().size()) {
CollisionObjectSW *co = (CollisionObjectSW *)space->get_objects().front()->get();
co->set_space(NULL);
}
@@ -1444,7 +1352,7 @@ void PhysicsServerSW::free(RID p_rid) {
JointSW *joint = joint_owner.get(p_rid);
- for(int i=0;i<joint->get_body_count();i++) {
+ for (int i = 0; i < joint->get_body_count(); i++) {
joint->get_body_ptr()[i]->remove_constraint(joint);
}
@@ -1456,51 +1364,45 @@ void PhysicsServerSW::free(RID p_rid) {
ERR_EXPLAIN("Invalid ID");
ERR_FAIL();
}
-
-
};
void PhysicsServerSW::set_active(bool p_active) {
- active=p_active;
+ active = p_active;
};
void PhysicsServerSW::init() {
- doing_sync=true;
- last_step=0.001;
- iterations=8;// 8?
- stepper = memnew( StepSW );
- direct_state = memnew( PhysicsDirectBodyStateSW );
+ doing_sync = true;
+ last_step = 0.001;
+ iterations = 8; // 8?
+ stepper = memnew(StepSW);
+ direct_state = memnew(PhysicsDirectBodyStateSW);
};
-
void PhysicsServerSW::step(float p_step) {
-
if (!active)
return;
+ doing_sync = false;
- doing_sync=false;
-
- last_step=p_step;
- PhysicsDirectBodyStateSW::singleton->step=p_step;
+ last_step = p_step;
+ PhysicsDirectBodyStateSW::singleton->step = p_step;
- island_count=0;
- active_objects=0;
- collision_pairs=0;
- for( Set<const SpaceSW*>::Element *E=active_spaces.front();E;E=E->next()) {
+ island_count = 0;
+ active_objects = 0;
+ collision_pairs = 0;
+ for (Set<const SpaceSW *>::Element *E = active_spaces.front(); E; E = E->next()) {
- stepper->step((SpaceSW*)E->get(),p_step,iterations);
- island_count+=E->get()->get_island_count();
- active_objects+=E->get()->get_active_objects();
- collision_pairs+=E->get()->get_collision_pairs();
+ stepper->step((SpaceSW *)E->get(), p_step, iterations);
+ island_count += E->get()->get_island_count();
+ active_objects += E->get()->get_active_objects();
+ collision_pairs += E->get()->get_collision_pairs();
}
-
}
-void PhysicsServerSW::sync() {
+void PhysicsServerSW::sync(){
};
@@ -1509,21 +1411,20 @@ void PhysicsServerSW::flush_queries() {
if (!active)
return;
- doing_sync=true;
+ doing_sync = true;
uint64_t time_beg = OS::get_singleton()->get_ticks_usec();
- for( Set<const SpaceSW*>::Element *E=active_spaces.front();E;E=E->next()) {
+ for (Set<const SpaceSW *>::Element *E = active_spaces.front(); E; E = E->next()) {
- SpaceSW *space=(SpaceSW *)E->get();
+ SpaceSW *space = (SpaceSW *)E->get();
space->call_queries();
}
-
if (ScriptDebugger::get_singleton() && ScriptDebugger::get_singleton()->is_profiling()) {
uint64_t total_time[SpaceSW::ELAPSED_TIME_MAX];
- static const char* time_name[SpaceSW::ELAPSED_TIME_MAX]={
+ static const char *time_name[SpaceSW::ELAPSED_TIME_MAX] = {
"integrate_forces",
"generate_islands",
"setup_constraints",
@@ -1531,44 +1432,39 @@ void PhysicsServerSW::flush_queries() {
"integrate_velocities"
};
- for(int i=0;i<SpaceSW::ELAPSED_TIME_MAX;i++) {
- total_time[i]=0;
+ for (int i = 0; i < SpaceSW::ELAPSED_TIME_MAX; i++) {
+ total_time[i] = 0;
}
- for( Set<const SpaceSW*>::Element *E=active_spaces.front();E;E=E->next()) {
+ for (Set<const SpaceSW *>::Element *E = active_spaces.front(); E; E = E->next()) {
- for(int i=0;i<SpaceSW::ELAPSED_TIME_MAX;i++) {
- total_time[i]+=E->get()->get_elapsed_time(SpaceSW::ElapsedTime(i));
+ for (int i = 0; i < SpaceSW::ELAPSED_TIME_MAX; i++) {
+ total_time[i] += E->get()->get_elapsed_time(SpaceSW::ElapsedTime(i));
}
-
}
Array values;
- values.resize(SpaceSW::ELAPSED_TIME_MAX*2);
- for(int i=0;i<SpaceSW::ELAPSED_TIME_MAX;i++) {
- values[i*2+0]=time_name[i];
- values[i*2+1]=USEC_TO_SEC(total_time[i]);
+ values.resize(SpaceSW::ELAPSED_TIME_MAX * 2);
+ for (int i = 0; i < SpaceSW::ELAPSED_TIME_MAX; i++) {
+ values[i * 2 + 0] = time_name[i];
+ values[i * 2 + 1] = USEC_TO_SEC(total_time[i]);
}
values.push_back("flush_queries");
- values.push_back(USEC_TO_SEC(OS::get_singleton()->get_ticks_usec()-time_beg));
-
- ScriptDebugger::get_singleton()->add_profiling_frame_data("physics",values);
+ values.push_back(USEC_TO_SEC(OS::get_singleton()->get_ticks_usec() - time_beg));
+ ScriptDebugger::get_singleton()->add_profiling_frame_data("physics", values);
}
};
-
-
void PhysicsServerSW::finish() {
memdelete(stepper);
memdelete(direct_state);
};
-
int PhysicsServerSW::get_process_info(ProcessInfo p_info) {
- switch(p_info) {
+ switch (p_info) {
case INFO_ACTIVE_OBJECTS: {
@@ -1581,64 +1477,55 @@ int PhysicsServerSW::get_process_info(ProcessInfo p_info) {
return island_count;
} break;
-
}
return 0;
}
+void PhysicsServerSW::_shape_col_cbk(const Vector3 &p_point_A, const Vector3 &p_point_B, void *p_userdata) {
-void PhysicsServerSW::_shape_col_cbk(const Vector3& p_point_A,const Vector3& p_point_B,void *p_userdata) {
-
+ CollCbkData *cbk = (CollCbkData *)p_userdata;
- CollCbkData *cbk=(CollCbkData *)p_userdata;
-
- if (cbk->max==0)
+ if (cbk->max == 0)
return;
if (cbk->amount == cbk->max) {
//find least deep
- float min_depth=1e20;
- int min_depth_idx=0;
- for(int i=0;i<cbk->amount;i++) {
+ float min_depth = 1e20;
+ int min_depth_idx = 0;
+ for (int i = 0; i < cbk->amount; i++) {
- float d = cbk->ptr[i*2+0].distance_squared_to(cbk->ptr[i*2+1]);
- if (d<min_depth) {
- min_depth=d;
- min_depth_idx=i;
+ float d = cbk->ptr[i * 2 + 0].distance_squared_to(cbk->ptr[i * 2 + 1]);
+ if (d < min_depth) {
+ min_depth = d;
+ min_depth_idx = i;
}
-
}
float d = p_point_A.distance_squared_to(p_point_B);
- if (d<min_depth)
+ if (d < min_depth)
return;
- cbk->ptr[min_depth_idx*2+0]=p_point_A;
- cbk->ptr[min_depth_idx*2+1]=p_point_B;
-
+ cbk->ptr[min_depth_idx * 2 + 0] = p_point_A;
+ cbk->ptr[min_depth_idx * 2 + 1] = p_point_B;
} else {
- cbk->ptr[cbk->amount*2+0]=p_point_A;
- cbk->ptr[cbk->amount*2+1]=p_point_B;
+ cbk->ptr[cbk->amount * 2 + 0] = p_point_A;
+ cbk->ptr[cbk->amount * 2 + 1] = p_point_B;
cbk->amount++;
}
}
-
PhysicsServerSW::PhysicsServerSW() {
- BroadPhaseSW::create_func=BroadPhaseOctree::_create;
- island_count=0;
- active_objects=0;
- collision_pairs=0;
-
- active=true;
+ BroadPhaseSW::create_func = BroadPhaseOctree::_create;
+ island_count = 0;
+ active_objects = 0;
+ collision_pairs = 0;
+ active = true;
};
-PhysicsServerSW::~PhysicsServerSW() {
+PhysicsServerSW::~PhysicsServerSW(){
};
-
-
diff --git a/servers/physics/physics_server_sw.h b/servers/physics/physics_server_sw.h
index 46c77dc72..dfc533b78 100644
--- a/servers/physics/physics_server_sw.h
+++ b/servers/physics/physics_server_sw.h
@@ -29,19 +29,17 @@
#ifndef PHYSICS_SERVER_SW
#define PHYSICS_SERVER_SW
-
+#include "joints_sw.h"
#include "servers/physics_server.h"
#include "shape_sw.h"
#include "space_sw.h"
#include "step_sw.h"
-#include "joints_sw.h"
-
class PhysicsServerSW : public PhysicsServer {
- OBJ_TYPE( PhysicsServerSW, PhysicsServer );
+ OBJ_TYPE(PhysicsServerSW, PhysicsServer);
-friend class PhysicsDirectSpaceStateSW;
+ friend class PhysicsDirectSpaceStateSW;
bool active;
int iterations;
bool doing_sync;
@@ -52,7 +50,7 @@ friend class PhysicsDirectSpaceStateSW;
int collision_pairs;
StepSW *stepper;
- Set<const SpaceSW*> active_spaces;
+ Set<const SpaceSW *> active_spaces;
PhysicsDirectBodyStateSW *direct_state;
@@ -62,9 +60,8 @@ friend class PhysicsDirectSpaceStateSW;
mutable RID_Owner<BodySW> body_owner;
mutable RID_Owner<JointSW> joint_owner;
-// void _clear_query(QuerySW *p_query);
+ // void _clear_query(QuerySW *p_query);
public:
-
struct CollCbkData {
int max;
@@ -72,10 +69,10 @@ public:
Vector3 *ptr;
};
- static void _shape_col_cbk(const Vector3& p_point_A,const Vector3& p_point_B,void *p_userdata);
+ static void _shape_col_cbk(const Vector3 &p_point_A, const Vector3 &p_point_B, void *p_userdata);
virtual RID shape_create(ShapeType p_shape);
- virtual void shape_set_data(RID p_shape, const Variant& p_data);
+ virtual void shape_set_data(RID p_shape, const Variant &p_data);
virtual void shape_set_custom_solver_bias(RID p_shape, real_t p_bias);
virtual ShapeType shape_get_type(RID p_shape) const;
@@ -85,16 +82,16 @@ public:
/* SPACE API */
virtual RID space_create();
- virtual void space_set_active(RID p_space,bool p_active);
+ virtual void space_set_active(RID p_space, bool p_active);
virtual bool space_is_active(RID p_space) const;
- virtual void space_set_param(RID p_space,SpaceParameter p_param, real_t p_value);
- virtual real_t space_get_param(RID p_space,SpaceParameter p_param) const;
+ virtual void space_set_param(RID p_space, SpaceParameter p_param, real_t p_value);
+ virtual real_t space_get_param(RID p_space, SpaceParameter p_param) const;
// this function only works on fixed process, errors and returns null otherwise
- virtual PhysicsDirectSpaceState* space_get_direct_state(RID p_space);
+ virtual PhysicsDirectSpaceState *space_get_direct_state(RID p_space);
- virtual void space_set_debug_contacts(RID p_space,int p_max_contacts);
+ virtual void space_set_debug_contacts(RID p_space, int p_max_contacts);
virtual Vector<Vector3> space_get_contacts(RID p_space) const;
virtual int space_get_contact_count(RID p_space) const;
@@ -108,9 +105,9 @@ public:
virtual void area_set_space(RID p_area, RID p_space);
virtual RID area_get_space(RID p_area) const;
- virtual void area_add_shape(RID p_area, RID p_shape, const Transform& p_transform=Transform());
- virtual void area_set_shape(RID p_area, int p_shape_idx,RID p_shape);
- virtual void area_set_shape_transform(RID p_area, int p_shape_idx, const Transform& p_transform);
+ virtual void area_add_shape(RID p_area, RID p_shape, const Transform &p_transform = Transform());
+ virtual void area_set_shape(RID p_area, int p_shape_idx, RID p_shape);
+ virtual void area_set_shape_transform(RID p_area, int p_shape_idx, const Transform &p_transform);
virtual int area_get_shape_count(RID p_area) const;
virtual RID area_get_shape(RID p_area, int p_shape_idx) const;
@@ -119,31 +116,30 @@ public:
virtual void area_remove_shape(RID p_area, int p_shape_idx);
virtual void area_clear_shapes(RID p_area);
- virtual void area_attach_object_instance_ID(RID p_area,ObjectID p_ID);
+ virtual void area_attach_object_instance_ID(RID p_area, ObjectID p_ID);
virtual ObjectID area_get_object_instance_ID(RID p_area) const;
- virtual void area_set_param(RID p_area,AreaParameter p_param,const Variant& p_value);
- virtual void area_set_transform(RID p_area, const Transform& p_transform);
+ virtual void area_set_param(RID p_area, AreaParameter p_param, const Variant &p_value);
+ virtual void area_set_transform(RID p_area, const Transform &p_transform);
- virtual Variant area_get_param(RID p_parea,AreaParameter p_param) const;
+ virtual Variant area_get_param(RID p_parea, AreaParameter p_param) const;
virtual Transform area_get_transform(RID p_area) const;
- virtual void area_set_ray_pickable(RID p_area,bool p_enable);
+ virtual void area_set_ray_pickable(RID p_area, bool p_enable);
virtual bool area_is_ray_pickable(RID p_area) const;
- virtual void area_set_collision_mask(RID p_area,uint32_t p_mask);
- virtual void area_set_layer_mask(RID p_area,uint32_t p_mask);
+ virtual void area_set_collision_mask(RID p_area, uint32_t p_mask);
+ virtual void area_set_layer_mask(RID p_area, uint32_t p_mask);
- virtual void area_set_monitorable(RID p_area,bool p_monitorable);
-
- virtual void area_set_monitor_callback(RID p_area,Object *p_receiver,const StringName& p_method);
- virtual void area_set_area_monitor_callback(RID p_area,Object *p_receiver,const StringName& p_method);
+ virtual void area_set_monitorable(RID p_area, bool p_monitorable);
+ virtual void area_set_monitor_callback(RID p_area, Object *p_receiver, const StringName &p_method);
+ virtual void area_set_area_monitor_callback(RID p_area, Object *p_receiver, const StringName &p_method);
/* BODY API */
// create a body of a given type
- virtual RID body_create(BodyMode p_mode=BODY_MODE_RIGID,bool p_init_sleeping=false);
+ virtual RID body_create(BodyMode p_mode = BODY_MODE_RIGID, bool p_init_sleeping = false);
virtual void body_set_space(RID p_body, RID p_space);
virtual RID body_get_space(RID p_body) const;
@@ -151,24 +147,24 @@ public:
virtual void body_set_mode(RID p_body, BodyMode p_mode);
virtual BodyMode body_get_mode(RID p_body) const;
- virtual void body_add_shape(RID p_body, RID p_shape, const Transform& p_transform=Transform());
- virtual void body_set_shape(RID p_body, int p_shape_idx,RID p_shape);
- virtual void body_set_shape_transform(RID p_body, int p_shape_idx, const Transform& p_transform);
+ virtual void body_add_shape(RID p_body, RID p_shape, const Transform &p_transform = Transform());
+ virtual void body_set_shape(RID p_body, int p_shape_idx, RID p_shape);
+ virtual void body_set_shape_transform(RID p_body, int p_shape_idx, const Transform &p_transform);
virtual int body_get_shape_count(RID p_body) const;
virtual RID body_get_shape(RID p_body, int p_shape_idx) const;
virtual Transform body_get_shape_transform(RID p_body, int p_shape_idx) const;
- virtual void body_set_shape_as_trigger(RID p_body, int p_shape_idx,bool p_enable);
+ virtual void body_set_shape_as_trigger(RID p_body, int p_shape_idx, bool p_enable);
virtual bool body_is_shape_set_as_trigger(RID p_body, int p_shape_idx) const;
virtual void body_remove_shape(RID p_body, int p_shape_idx);
virtual void body_clear_shapes(RID p_body);
- virtual void body_attach_object_instance_ID(RID p_body,uint32_t p_ID);
+ virtual void body_attach_object_instance_ID(RID p_body, uint32_t p_ID);
virtual uint32_t body_get_object_instance_ID(RID p_body) const;
- virtual void body_set_enable_continuous_collision_detection(RID p_body,bool p_enable);
+ virtual void body_set_enable_continuous_collision_detection(RID p_body, bool p_enable);
virtual bool body_is_continuous_collision_detection_enabled(RID p_body) const;
virtual void body_set_layer_mask(RID p_body, uint32_t p_mask);
@@ -183,19 +179,19 @@ public:
virtual void body_set_param(RID p_body, BodyParameter p_param, float p_value);
virtual float body_get_param(RID p_body, BodyParameter p_param) const;
- virtual void body_set_state(RID p_body, BodyState p_state, const Variant& p_variant);
+ virtual void body_set_state(RID p_body, BodyState p_state, const Variant &p_variant);
virtual Variant body_get_state(RID p_body, BodyState p_state) const;
- virtual void body_set_applied_force(RID p_body, const Vector3& p_force);
+ virtual void body_set_applied_force(RID p_body, const Vector3 &p_force);
virtual Vector3 body_get_applied_force(RID p_body) const;
- virtual void body_set_applied_torque(RID p_body, const Vector3& p_torque);
+ virtual void body_set_applied_torque(RID p_body, const Vector3 &p_torque);
virtual Vector3 body_get_applied_torque(RID p_body) const;
- virtual void body_apply_impulse(RID p_body, const Vector3& p_pos, const Vector3& p_impulse);
- virtual void body_set_axis_velocity(RID p_body, const Vector3& p_axis_velocity);
+ virtual void body_apply_impulse(RID p_body, const Vector3 &p_pos, const Vector3 &p_impulse);
+ virtual void body_set_axis_velocity(RID p_body, const Vector3 &p_axis_velocity);
- virtual void body_set_axis_lock(RID p_body,BodyAxisLock p_lock);
+ virtual void body_set_axis_lock(RID p_body, BodyAxisLock p_lock);
virtual BodyAxisLock body_get_axis_lock(RID p_body) const;
virtual void body_add_collision_exception(RID p_body, RID p_body_b);
@@ -205,61 +201,60 @@ public:
virtual void body_set_contacts_reported_depth_treshold(RID p_body, float p_treshold);
virtual float body_get_contacts_reported_depth_treshold(RID p_body) const;
- virtual void body_set_omit_force_integration(RID p_body,bool p_omit);
+ virtual void body_set_omit_force_integration(RID p_body, bool p_omit);
virtual bool body_is_omitting_force_integration(RID p_body) const;
virtual void body_set_max_contacts_reported(RID p_body, int p_contacts);
virtual int body_get_max_contacts_reported(RID p_body) const;
- virtual void body_set_force_integration_callback(RID p_body,Object *p_receiver,const StringName& p_method,const Variant& p_udata=Variant());
+ virtual void body_set_force_integration_callback(RID p_body, Object *p_receiver, const StringName &p_method, const Variant &p_udata = Variant());
- virtual void body_set_ray_pickable(RID p_body,bool p_enable);
+ virtual void body_set_ray_pickable(RID p_body, bool p_enable);
virtual bool body_is_ray_pickable(RID p_body) const;
/* 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);
+ virtual RID joint_create_pin(RID p_body_A, const Vector3 &p_local_A, RID p_body_B, const Vector3 &p_local_B);
- virtual void pin_joint_set_param(RID p_joint,PinJointParam p_param, float p_value);
- virtual float pin_joint_get_param(RID p_joint,PinJointParam p_param) const;
+ virtual void pin_joint_set_param(RID p_joint, PinJointParam p_param, float p_value);
+ virtual float pin_joint_get_param(RID p_joint, PinJointParam p_param) const;
- virtual void pin_joint_set_local_A(RID p_joint, const Vector3& p_A);
+ virtual void pin_joint_set_local_A(RID p_joint, const Vector3 &p_A);
virtual Vector3 pin_joint_get_local_A(RID p_joint) const;
- virtual void pin_joint_set_local_B(RID p_joint, const Vector3& p_B);
+ virtual void pin_joint_set_local_B(RID p_joint, const Vector3 &p_B);
virtual Vector3 pin_joint_get_local_B(RID p_joint) const;
- virtual RID joint_create_hinge(RID p_body_A,const Transform& p_frame_A,RID p_body_B,const Transform& p_frame_B);
- virtual RID joint_create_hinge_simple(RID p_body_A,const Vector3& p_pivot_A,const Vector3& p_axis_A,RID p_body_B,const Vector3& p_pivot_B,const Vector3& p_axis_B);
-
- virtual void hinge_joint_set_param(RID p_joint,HingeJointParam p_param, float p_value);
- virtual float hinge_joint_get_param(RID p_joint,HingeJointParam p_param) const;
+ virtual RID joint_create_hinge(RID p_body_A, const Transform &p_frame_A, RID p_body_B, const Transform &p_frame_B);
+ virtual RID joint_create_hinge_simple(RID p_body_A, const Vector3 &p_pivot_A, const Vector3 &p_axis_A, RID p_body_B, const Vector3 &p_pivot_B, const Vector3 &p_axis_B);
- virtual void hinge_joint_set_flag(RID p_joint,HingeJointFlag p_flag, bool p_value);
- virtual bool hinge_joint_get_flag(RID p_joint,HingeJointFlag p_flag) const;
+ virtual void hinge_joint_set_param(RID p_joint, HingeJointParam p_param, float p_value);
+ virtual float hinge_joint_get_param(RID p_joint, HingeJointParam p_param) const;
+ virtual void hinge_joint_set_flag(RID p_joint, HingeJointFlag p_flag, bool p_value);
+ virtual bool hinge_joint_get_flag(RID p_joint, HingeJointFlag p_flag) const;
- virtual RID joint_create_slider(RID p_body_A,const Transform& p_local_frame_A,RID p_body_B,const Transform& p_local_frame_B); //reference frame is A
+ virtual RID joint_create_slider(RID p_body_A, const Transform &p_local_frame_A, RID p_body_B, const Transform &p_local_frame_B); //reference frame is A
- virtual void slider_joint_set_param(RID p_joint,SliderJointParam p_param, float p_value);
- virtual float slider_joint_get_param(RID p_joint,SliderJointParam p_param) const;
+ virtual void slider_joint_set_param(RID p_joint, SliderJointParam p_param, float p_value);
+ virtual float slider_joint_get_param(RID p_joint, SliderJointParam p_param) const;
- virtual RID joint_create_cone_twist(RID p_body_A,const Transform& p_local_frame_A,RID p_body_B,const Transform& p_local_frame_B); //reference frame is A
+ virtual RID joint_create_cone_twist(RID p_body_A, const Transform &p_local_frame_A, RID p_body_B, const Transform &p_local_frame_B); //reference frame is A
- virtual void cone_twist_joint_set_param(RID p_joint,ConeTwistJointParam p_param, float p_value);
- virtual float cone_twist_joint_get_param(RID p_joint,ConeTwistJointParam p_param) const;
+ virtual void cone_twist_joint_set_param(RID p_joint, ConeTwistJointParam p_param, float p_value);
+ virtual float cone_twist_joint_get_param(RID p_joint, ConeTwistJointParam p_param) const;
- virtual RID joint_create_generic_6dof(RID p_body_A,const Transform& p_local_frame_A,RID p_body_B,const Transform& p_local_frame_B); //reference frame is A
+ virtual RID joint_create_generic_6dof(RID p_body_A, const Transform &p_local_frame_A, RID p_body_B, const Transform &p_local_frame_B); //reference frame is A
- virtual void generic_6dof_joint_set_param(RID p_joint,Vector3::Axis,G6DOFJointAxisParam p_param, float p_value);
- virtual float generic_6dof_joint_get_param(RID p_joint,Vector3::Axis,G6DOFJointAxisParam p_param);
+ virtual void generic_6dof_joint_set_param(RID p_joint, Vector3::Axis, G6DOFJointAxisParam p_param, float p_value);
+ virtual float generic_6dof_joint_get_param(RID p_joint, Vector3::Axis, G6DOFJointAxisParam p_param);
- virtual void generic_6dof_joint_set_flag(RID p_joint,Vector3::Axis,G6DOFJointAxisFlag p_flag, bool p_enable);
- virtual bool generic_6dof_joint_get_flag(RID p_joint,Vector3::Axis,G6DOFJointAxisFlag p_flag);
+ virtual void generic_6dof_joint_set_flag(RID p_joint, Vector3::Axis, G6DOFJointAxisFlag p_flag, bool p_enable);
+ virtual bool generic_6dof_joint_get_flag(RID p_joint, Vector3::Axis, G6DOFJointAxisFlag p_flag);
virtual JointType joint_get_type(RID p_joint) const;
- virtual void joint_set_solver_priority(RID p_joint,int p_priority);
+ virtual void joint_set_solver_priority(RID p_joint, int p_priority);
virtual int joint_get_solver_priority(RID p_joint) const;
#if 0
@@ -289,8 +284,6 @@ public:
PhysicsServerSW();
~PhysicsServerSW();
-
};
#endif
-
diff --git a/servers/physics/shape_sw.cpp b/servers/physics/shape_sw.cpp
index f7454a199..8f38af4f8 100644
--- a/servers/physics/shape_sw.cpp
+++ b/servers/physics/shape_sw.cpp
@@ -28,100 +28,91 @@
/*************************************************************************/
#include "shape_sw.h"
#include "geometry.h"
-#include "sort.h"
#include "quick_hull.h"
+#include "sort.h"
#define _POINT_SNAP 0.001953125
#define _EDGE_IS_VALID_SUPPORT_TRESHOLD 0.0002
#define _FACE_IS_VALID_SUPPORT_TRESHOLD 0.9998
-
-void ShapeSW::configure(const AABB& p_aabb) {
- aabb=p_aabb;
- configured=true;
- for (Map<ShapeOwnerSW*,int>::Element *E=owners.front();E;E=E->next()) {
- ShapeOwnerSW* co=(ShapeOwnerSW*)E->key();
+void ShapeSW::configure(const AABB &p_aabb) {
+ aabb = p_aabb;
+ configured = true;
+ for (Map<ShapeOwnerSW *, int>::Element *E = owners.front(); E; E = E->next()) {
+ ShapeOwnerSW *co = (ShapeOwnerSW *)E->key();
co->_shape_changed();
}
}
-
-Vector3 ShapeSW::get_support(const Vector3& p_normal) const {
+Vector3 ShapeSW::get_support(const Vector3 &p_normal) const {
Vector3 res;
int amnt;
- get_supports(p_normal,1,&res,amnt);
+ get_supports(p_normal, 1, &res, amnt);
return res;
}
void ShapeSW::add_owner(ShapeOwnerSW *p_owner) {
- Map<ShapeOwnerSW*,int>::Element *E=owners.find(p_owner);
+ Map<ShapeOwnerSW *, int>::Element *E = owners.find(p_owner);
if (E) {
E->get()++;
} else {
- owners[p_owner]=1;
+ owners[p_owner] = 1;
}
}
-void ShapeSW::remove_owner(ShapeOwnerSW *p_owner){
+void ShapeSW::remove_owner(ShapeOwnerSW *p_owner) {
- Map<ShapeOwnerSW*,int>::Element *E=owners.find(p_owner);
+ Map<ShapeOwnerSW *, int>::Element *E = owners.find(p_owner);
ERR_FAIL_COND(!E);
E->get()--;
- if (E->get()==0) {
+ if (E->get() == 0) {
owners.erase(E);
}
-
}
-bool ShapeSW::is_owner(ShapeOwnerSW *p_owner) const{
+bool ShapeSW::is_owner(ShapeOwnerSW *p_owner) const {
return owners.has(p_owner);
-
}
-const Map<ShapeOwnerSW*,int>& ShapeSW::get_owners() const{
+const Map<ShapeOwnerSW *, int> &ShapeSW::get_owners() const {
return owners;
}
-
ShapeSW::ShapeSW() {
- custom_bias=0;
- configured=false;
+ custom_bias = 0;
+ configured = false;
}
-
ShapeSW::~ShapeSW() {
ERR_FAIL_COND(owners.size());
}
-
-
Plane PlaneShapeSW::get_plane() const {
return plane;
}
-void PlaneShapeSW::project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const {
+void PlaneShapeSW::project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const {
// gibberish, a plane is infinity
- r_min=-1e7;
- r_max=1e7;
+ r_min = -1e7;
+ r_max = 1e7;
}
-Vector3 PlaneShapeSW::get_support(const Vector3& p_normal) const {
+Vector3 PlaneShapeSW::get_support(const Vector3 &p_normal) const {
- return p_normal*1e15;
+ return p_normal * 1e15;
}
+bool PlaneShapeSW::intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const {
-bool PlaneShapeSW::intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const {
-
- bool inters=plane.intersects_segment(p_begin,p_end,&r_result);
- if(inters)
- r_normal=plane.normal;
+ bool inters = plane.intersects_segment(p_begin, p_end, &r_result);
+ if (inters)
+ r_normal = plane.normal;
return inters;
}
@@ -130,16 +121,15 @@ Vector3 PlaneShapeSW::get_moment_of_inertia(float p_mass) const {
return Vector3(); //wtf
}
-void PlaneShapeSW::_setup(const Plane& p_plane) {
+void PlaneShapeSW::_setup(const Plane &p_plane) {
- plane=p_plane;
- configure(AABB(Vector3(-1e4,-1e4,-1e4),Vector3(1e4*2,1e4*2,1e4*2)));
+ plane = p_plane;
+ configure(AABB(Vector3(-1e4, -1e4, -1e4), Vector3(1e4 * 2, 1e4 * 2, 1e4 * 2)));
}
-void PlaneShapeSW::set_data(const Variant& p_data) {
+void PlaneShapeSW::set_data(const Variant &p_data) {
_setup(p_data);
-
}
Variant PlaneShapeSW::get_data() const {
@@ -147,9 +137,7 @@ Variant PlaneShapeSW::get_data() const {
return plane;
}
-PlaneShapeSW::PlaneShapeSW() {
-
-
+PlaneShapeSW::PlaneShapeSW() {
}
//
@@ -159,39 +147,39 @@ float RayShapeSW::get_length() const {
return length;
}
-void RayShapeSW::project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const {
+void RayShapeSW::project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const {
// don't think this will be even used
- r_min=0;
- r_max=1;
+ r_min = 0;
+ r_max = 1;
}
-Vector3 RayShapeSW::get_support(const Vector3& p_normal) const {
+Vector3 RayShapeSW::get_support(const Vector3 &p_normal) const {
- if (p_normal.z>0)
- return Vector3(0,0,length);
+ if (p_normal.z > 0)
+ return Vector3(0, 0, length);
else
- return Vector3(0,0,0);
+ return Vector3(0, 0, 0);
}
-void RayShapeSW::get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const {
+void RayShapeSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const {
if (Math::abs(p_normal.z) < _EDGE_IS_VALID_SUPPORT_TRESHOLD) {
- r_amount=2;
- r_supports[0]=Vector3(0,0,0);
- r_supports[1]=Vector3(0,0,length);
- } if (p_normal.z>0) {
- r_amount=1;
- *r_supports=Vector3(0,0,length);
+ r_amount = 2;
+ r_supports[0] = Vector3(0, 0, 0);
+ r_supports[1] = Vector3(0, 0, length);
+ }
+ if (p_normal.z > 0) {
+ r_amount = 1;
+ *r_supports = Vector3(0, 0, length);
} else {
- r_amount=1;
- *r_supports=Vector3(0,0,0);
+ r_amount = 1;
+ *r_supports = Vector3(0, 0, 0);
}
}
-
-bool RayShapeSW::intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const {
+bool RayShapeSW::intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const {
return false; //simply not possible
}
@@ -201,16 +189,15 @@ Vector3 RayShapeSW::get_moment_of_inertia(float p_mass) const {
return Vector3();
}
-void RayShapeSW::_setup(float p_length) {
+void RayShapeSW::_setup(float p_length) {
- length=p_length;
- configure(AABB(Vector3(0,0,0),Vector3(0.1,0.1,length)));
+ length = p_length;
+ configure(AABB(Vector3(0, 0, 0), Vector3(0.1, 0.1, length)));
}
-void RayShapeSW::set_data(const Variant& p_data) {
+void RayShapeSW::set_data(const Variant &p_data) {
_setup(p_data);
-
}
Variant RayShapeSW::get_data() const {
@@ -218,13 +205,11 @@ Variant RayShapeSW::get_data() const {
return length;
}
-RayShapeSW::RayShapeSW() {
+RayShapeSW::RayShapeSW() {
- length=1;
+ length = 1;
}
-
-
/********** SPHERE *************/
real_t SphereShapeSW::get_radius() const {
@@ -232,50 +217,47 @@ real_t SphereShapeSW::get_radius() const {
return radius;
}
-void SphereShapeSW::project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const {
+void SphereShapeSW::project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const {
- float d = p_normal.dot( p_transform.origin );
+ float d = p_normal.dot(p_transform.origin);
// figure out scale at point
Vector3 local_normal = p_transform.basis.xform_inv(p_normal);
float scale = local_normal.length();
- r_min = d - (radius) * scale;
- r_max = d + (radius) * scale;
-
+ r_min = d - (radius)*scale;
+ r_max = d + (radius)*scale;
}
-Vector3 SphereShapeSW::get_support(const Vector3& p_normal) const {
+Vector3 SphereShapeSW::get_support(const Vector3 &p_normal) const {
- return p_normal*radius;
+ return p_normal * radius;
}
-void SphereShapeSW::get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const {
+void SphereShapeSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const {
- *r_supports=p_normal*radius;
- r_amount=1;
+ *r_supports = p_normal * radius;
+ r_amount = 1;
}
-bool SphereShapeSW::intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const {
+bool SphereShapeSW::intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const {
- return Geometry::segment_intersects_sphere(p_begin,p_end,Vector3(),radius,&r_result,&r_normal);
+ return Geometry::segment_intersects_sphere(p_begin, p_end, Vector3(), radius, &r_result, &r_normal);
}
Vector3 SphereShapeSW::get_moment_of_inertia(float p_mass) const {
float s = 0.4 * p_mass * radius * radius;
- return Vector3(s,s,s);
+ return Vector3(s, s, s);
}
void SphereShapeSW::_setup(real_t p_radius) {
-
- radius=p_radius;
- configure(AABB( Vector3(-radius,-radius,-radius), Vector3(radius*2.0,radius*2.0,radius*2.0)));
-
+ radius = p_radius;
+ configure(AABB(Vector3(-radius, -radius, -radius), Vector3(radius * 2.0, radius * 2.0, radius * 2.0)));
}
-void SphereShapeSW::set_data(const Variant& p_data) {
+void SphereShapeSW::set_data(const Variant &p_data) {
_setup(p_data);
}
@@ -287,113 +269,105 @@ Variant SphereShapeSW::get_data() const {
SphereShapeSW::SphereShapeSW() {
- radius=0;
+ radius = 0;
}
-
/********** BOX *************/
-
-void BoxShapeSW::project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const {
+void BoxShapeSW::project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const {
// no matter the angle, the box is mirrored anyway
- Vector3 local_normal=p_transform.basis.xform_inv(p_normal);
+ Vector3 local_normal = p_transform.basis.xform_inv(p_normal);
float length = local_normal.abs().dot(half_extents);
- float distance = p_normal.dot( p_transform.origin );
+ float distance = p_normal.dot(p_transform.origin);
r_min = distance - length;
r_max = distance + length;
-
-
}
-Vector3 BoxShapeSW::get_support(const Vector3& p_normal) const {
-
+Vector3 BoxShapeSW::get_support(const Vector3 &p_normal) const {
Vector3 point(
- (p_normal.x<0) ? -half_extents.x : half_extents.x,
- (p_normal.y<0) ? -half_extents.y : half_extents.y,
- (p_normal.z<0) ? -half_extents.z : half_extents.z
- );
+ (p_normal.x < 0) ? -half_extents.x : half_extents.x,
+ (p_normal.y < 0) ? -half_extents.y : half_extents.y,
+ (p_normal.z < 0) ? -half_extents.z : half_extents.z);
return point;
}
-void BoxShapeSW::get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const {
+void BoxShapeSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const {
- static const int next[3]={1,2,0};
- static const int next2[3]={2,0,1};
+ static const int next[3] = { 1, 2, 0 };
+ static const int next2[3] = { 2, 0, 1 };
- for (int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
Vector3 axis;
- axis[i]=1.0;
- float dot = p_normal.dot( axis );
- if ( Math::abs( dot ) > _FACE_IS_VALID_SUPPORT_TRESHOLD ) {
+ axis[i] = 1.0;
+ float dot = p_normal.dot(axis);
+ if (Math::abs(dot) > _FACE_IS_VALID_SUPPORT_TRESHOLD) {
//Vector3 axis_b;
- bool neg = dot<0;
+ bool neg = dot < 0;
r_amount = 4;
Vector3 point;
- point[i]=half_extents[i];
+ point[i] = half_extents[i];
- int i_n=next[i];
- int i_n2=next2[i];
+ int i_n = next[i];
+ int i_n2 = next2[i];
- static const float sign[4][2]={
+ static const float sign[4][2] = {
- {-1.0, 1.0},
- { 1.0, 1.0},
- { 1.0,-1.0},
- {-1.0,-1.0},
+ { -1.0, 1.0 },
+ { 1.0, 1.0 },
+ { 1.0, -1.0 },
+ { -1.0, -1.0 },
};
- for (int j=0;j<4;j++) {
-
- point[i_n]=sign[j][0]*half_extents[i_n];
- point[i_n2]=sign[j][1]*half_extents[i_n2];
- r_supports[j]=neg?-point:point;
+ for (int j = 0; j < 4; j++) {
+ point[i_n] = sign[j][0] * half_extents[i_n];
+ point[i_n2] = sign[j][1] * half_extents[i_n2];
+ r_supports[j] = neg ? -point : point;
}
if (neg) {
- SWAP( r_supports[1], r_supports[2] );
- SWAP( r_supports[0], r_supports[3] );
+ SWAP(r_supports[1], r_supports[2]);
+ SWAP(r_supports[0], r_supports[3]);
}
return;
}
- r_amount=0;
-
+ r_amount = 0;
}
- for (int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
Vector3 axis;
- axis[i]=1.0;
+ axis[i] = 1.0;
- if (Math::abs(p_normal.dot(axis))<_EDGE_IS_VALID_SUPPORT_TRESHOLD) {
+ if (Math::abs(p_normal.dot(axis)) < _EDGE_IS_VALID_SUPPORT_TRESHOLD) {
- r_amount= 2;
+ r_amount = 2;
- int i_n=next[i];
- int i_n2=next2[i];
+ int i_n = next[i];
+ int i_n2 = next2[i];
- Vector3 point=half_extents;
+ Vector3 point = half_extents;
- if (p_normal[i_n]<0) {
- point[i_n]=-point[i_n];
+ if (p_normal[i_n] < 0) {
+ point[i_n] = -point[i_n];
}
- if (p_normal[i_n2]<0) {
- point[i_n2]=-point[i_n2];
+ if (p_normal[i_n2] < 0) {
+ point[i_n2] = -point[i_n2];
}
r_supports[0] = point;
- point[i]=-point[i];
+ point[i] = -point[i];
r_supports[1] = point;
return;
}
@@ -401,44 +375,38 @@ void BoxShapeSW::get_supports(const Vector3& p_normal,int p_max,Vector3 *r_suppo
/* USE POINT */
Vector3 point(
- (p_normal.x<0) ? -half_extents.x : half_extents.x,
- (p_normal.y<0) ? -half_extents.y : half_extents.y,
- (p_normal.z<0) ? -half_extents.z : half_extents.z
- );
+ (p_normal.x < 0) ? -half_extents.x : half_extents.x,
+ (p_normal.y < 0) ? -half_extents.y : half_extents.y,
+ (p_normal.z < 0) ? -half_extents.z : half_extents.z);
- r_amount=1;
- r_supports[0]=point;
+ r_amount = 1;
+ r_supports[0] = point;
}
-bool BoxShapeSW::intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const {
+bool BoxShapeSW::intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const {
- AABB aabb(-half_extents,half_extents*2.0);
-
- return aabb.intersects_segment(p_begin,p_end,&r_result,&r_normal);
+ AABB aabb(-half_extents, half_extents * 2.0);
+ return aabb.intersects_segment(p_begin, p_end, &r_result, &r_normal);
}
Vector3 BoxShapeSW::get_moment_of_inertia(float p_mass) const {
- float lx=half_extents.x;
- float ly=half_extents.y;
- float lz=half_extents.z;
-
- return Vector3( (p_mass/3.0) * (ly*ly + lz*lz), (p_mass/3.0) * (lx*lx + lz*lz), (p_mass/3.0) * (lx*lx + ly*ly) );
+ float lx = half_extents.x;
+ float ly = half_extents.y;
+ float lz = half_extents.z;
+ return Vector3((p_mass / 3.0) * (ly * ly + lz * lz), (p_mass / 3.0) * (lx * lx + lz * lz), (p_mass / 3.0) * (lx * lx + ly * ly));
}
-void BoxShapeSW::_setup(const Vector3& p_half_extents) {
-
- half_extents=p_half_extents.abs();
-
- configure(AABB(-half_extents,half_extents*2));
+void BoxShapeSW::_setup(const Vector3 &p_half_extents) {
+ half_extents = p_half_extents.abs();
+ configure(AABB(-half_extents, half_extents * 2));
}
-void BoxShapeSW::set_data(const Variant& p_data) {
-
+void BoxShapeSW::set_data(const Variant &p_data) {
_setup(p_data);
}
@@ -448,138 +416,128 @@ Variant BoxShapeSW::get_data() const {
return half_extents;
}
-BoxShapeSW::BoxShapeSW() {
-
-
+BoxShapeSW::BoxShapeSW() {
}
-
/********** CAPSULE *************/
+void CapsuleShapeSW::project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const {
-void CapsuleShapeSW::project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const {
-
- Vector3 n=p_transform.basis.xform_inv(p_normal).normalized();
+ Vector3 n = p_transform.basis.xform_inv(p_normal).normalized();
float h = (n.z > 0) ? height : -height;
n *= radius;
n.z += h * 0.5;
- r_max=p_normal.dot(p_transform.xform(n));
- r_min=p_normal.dot(p_transform.xform(-n));
+ r_max = p_normal.dot(p_transform.xform(n));
+ r_min = p_normal.dot(p_transform.xform(-n));
return;
n = p_transform.basis.xform(n);
- float distance = p_normal.dot( p_transform.origin );
+ float distance = p_normal.dot(p_transform.origin);
float length = Math::abs(p_normal.dot(n));
r_min = distance - length;
r_max = distance + length;
- ERR_FAIL_COND( r_max < r_min );
-
+ ERR_FAIL_COND(r_max < r_min);
}
-Vector3 CapsuleShapeSW::get_support(const Vector3& p_normal) const {
+Vector3 CapsuleShapeSW::get_support(const Vector3 &p_normal) const {
- Vector3 n=p_normal;
+ Vector3 n = p_normal;
float h = (n.z > 0) ? height : -height;
- n*=radius;
- n.z += h*0.5;
+ n *= radius;
+ n.z += h * 0.5;
return n;
}
-void CapsuleShapeSW::get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const {
+void CapsuleShapeSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const {
-
- Vector3 n=p_normal;
+ Vector3 n = p_normal;
float d = n.z;
- if (Math::abs( d )<_EDGE_IS_VALID_SUPPORT_TRESHOLD ) {
+ if (Math::abs(d) < _EDGE_IS_VALID_SUPPORT_TRESHOLD) {
// make it flat
- n.z=0.0;
+ n.z = 0.0;
n.normalize();
- n*=radius;
+ n *= radius;
- r_amount=2;
- r_supports[0]=n;
- r_supports[0].z+=height*0.5;
- r_supports[1]=n;
- r_supports[1].z-=height*0.5;
+ r_amount = 2;
+ r_supports[0] = n;
+ r_supports[0].z += height * 0.5;
+ r_supports[1] = n;
+ r_supports[1].z -= height * 0.5;
} else {
float h = (d > 0) ? height : -height;
- n*=radius;
- n.z += h*0.5;
- r_amount=1;
- *r_supports=n;
-
+ n *= radius;
+ n.z += h * 0.5;
+ r_amount = 1;
+ *r_supports = n;
}
-
}
+bool CapsuleShapeSW::intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const {
-bool CapsuleShapeSW::intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const {
-
- Vector3 norm=(p_end-p_begin).normalized();
- float min_d=1e20;
-
+ Vector3 norm = (p_end - p_begin).normalized();
+ float min_d = 1e20;
- Vector3 res,n;
- bool collision=false;
+ Vector3 res, n;
+ bool collision = false;
- Vector3 auxres,auxn;
+ Vector3 auxres, auxn;
bool collided;
// test against cylinder and spheres :-|
- collided = Geometry::segment_intersects_cylinder(p_begin,p_end,height,radius,&auxres,&auxn);
+ collided = Geometry::segment_intersects_cylinder(p_begin, p_end, height, radius, &auxres, &auxn);
if (collided) {
- float d=norm.dot(auxres);
- if (d<min_d) {
- min_d=d;
- res=auxres;
- n=auxn;
- collision=true;
+ float d = norm.dot(auxres);
+ if (d < min_d) {
+ min_d = d;
+ res = auxres;
+ n = auxn;
+ collision = true;
}
}
- collided = Geometry::segment_intersects_sphere(p_begin,p_end,Vector3(0,0,height*0.5),radius,&auxres,&auxn);
+ collided = Geometry::segment_intersects_sphere(p_begin, p_end, Vector3(0, 0, height * 0.5), radius, &auxres, &auxn);
if (collided) {
- float d=norm.dot(auxres);
- if (d<min_d) {
- min_d=d;
- res=auxres;
- n=auxn;
- collision=true;
+ float d = norm.dot(auxres);
+ if (d < min_d) {
+ min_d = d;
+ res = auxres;
+ n = auxn;
+ collision = true;
}
}
- collided = Geometry::segment_intersects_sphere(p_begin,p_end,Vector3(0,0,height*-0.5),radius,&auxres,&auxn);
+ collided = Geometry::segment_intersects_sphere(p_begin, p_end, Vector3(0, 0, height * -0.5), radius, &auxres, &auxn);
if (collided) {
- float d=norm.dot(auxres);
+ float d = norm.dot(auxres);
- if (d<min_d) {
- min_d=d;
- res=auxres;
- n=auxn;
- collision=true;
+ if (d < min_d) {
+ min_d = d;
+ res = auxres;
+ n = auxn;
+ collision = true;
}
}
if (collision) {
- r_result=res;
- r_normal=n;
+ r_result = res;
+ r_normal = n;
}
return collision;
}
@@ -587,105 +545,90 @@ bool CapsuleShapeSW::intersect_segment(const Vector3& p_begin,const Vector3& p_e
Vector3 CapsuleShapeSW::get_moment_of_inertia(float p_mass) const {
// use crappy AABB approximation
- Vector3 extents=get_aabb().size*0.5;
+ Vector3 extents = get_aabb().size * 0.5;
return Vector3(
- (p_mass/3.0) * (extents.y*extents.y + extents.z*extents.z),
- (p_mass/3.0) * (extents.x*extents.x + extents.z*extents.z),
- (p_mass/3.0) * (extents.y*extents.y + extents.y*extents.y)
- );
-
+ (p_mass / 3.0) * (extents.y * extents.y + extents.z * extents.z),
+ (p_mass / 3.0) * (extents.x * extents.x + extents.z * extents.z),
+ (p_mass / 3.0) * (extents.y * extents.y + extents.y * extents.y));
}
+void CapsuleShapeSW::_setup(real_t p_height, real_t p_radius) {
-
-
-void CapsuleShapeSW::_setup(real_t p_height,real_t p_radius) {
-
- height=p_height;
- radius=p_radius;
- configure(AABB(Vector3(-radius,-radius,-height*0.5-radius),Vector3(radius*2,radius*2,height+radius*2.0)));
-
+ height = p_height;
+ radius = p_radius;
+ configure(AABB(Vector3(-radius, -radius, -height * 0.5 - radius), Vector3(radius * 2, radius * 2, height + radius * 2.0)));
}
-void CapsuleShapeSW::set_data(const Variant& p_data) {
+void CapsuleShapeSW::set_data(const Variant &p_data) {
Dictionary d = p_data;
ERR_FAIL_COND(!d.has("radius"));
ERR_FAIL_COND(!d.has("height"));
- _setup(d["height"],d["radius"]);
-
+ _setup(d["height"], d["radius"]);
}
Variant CapsuleShapeSW::get_data() const {
Dictionary d;
- d["radius"]=radius;
- d["height"]=height;
+ d["radius"] = radius;
+ d["height"] = height;
return d;
-
}
+CapsuleShapeSW::CapsuleShapeSW() {
-CapsuleShapeSW::CapsuleShapeSW() {
-
- height=radius=0;
-
+ height = radius = 0;
}
/********** CONVEX POLYGON *************/
+void ConvexPolygonShapeSW::project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const {
-void ConvexPolygonShapeSW::project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const {
-
-
- int vertex_count=mesh.vertices.size();
- if (vertex_count==0)
+ int vertex_count = mesh.vertices.size();
+ if (vertex_count == 0)
return;
- const Vector3 *vrts=&mesh.vertices[0];
+ const Vector3 *vrts = &mesh.vertices[0];
- for (int i=0;i<vertex_count;i++) {
+ for (int i = 0; i < vertex_count; i++) {
- float d=p_normal.dot( p_transform.xform( vrts[i] ) );
+ float d = p_normal.dot(p_transform.xform(vrts[i]));
- if (i==0 || d > r_max)
- r_max=d;
- if (i==0 || d < r_min)
- r_min=d;
+ if (i == 0 || d > r_max)
+ r_max = d;
+ if (i == 0 || d < r_min)
+ r_min = d;
}
}
-Vector3 ConvexPolygonShapeSW::get_support(const Vector3& p_normal) const {
+Vector3 ConvexPolygonShapeSW::get_support(const Vector3 &p_normal) const {
- Vector3 n=p_normal;
+ Vector3 n = p_normal;
- int vert_support_idx=-1;
+ int vert_support_idx = -1;
float support_max;
- int vertex_count=mesh.vertices.size();
- if (vertex_count==0)
+ int vertex_count = mesh.vertices.size();
+ if (vertex_count == 0)
return Vector3();
- const Vector3 *vrts=&mesh.vertices[0];
+ const Vector3 *vrts = &mesh.vertices[0];
- for (int i=0;i<vertex_count;i++) {
+ for (int i = 0; i < vertex_count; i++) {
- float d=n.dot(vrts[i]);
+ float d = n.dot(vrts[i]);
- if (i==0 || d > support_max) {
- support_max=d;
- vert_support_idx=i;
+ if (i == 0 || d > support_max) {
+ support_max = d;
+ vert_support_idx = i;
}
}
- return vrts[vert_support_idx];
-
+ return vrts[vert_support_idx];
}
-
-
-void ConvexPolygonShapeSW::get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const {
+void ConvexPolygonShapeSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const {
const Geometry::MeshData::Face *faces = mesh.faces.ptr();
int fc = mesh.faces.size();
@@ -700,28 +643,27 @@ void ConvexPolygonShapeSW::get_supports(const Vector3& p_normal,int p_max,Vector
real_t max;
int vtx;
- for (int i=0;i<vc;i++) {
+ for (int i = 0; i < vc; i++) {
- float d=p_normal.dot(vertices[i]);
+ float d = p_normal.dot(vertices[i]);
- if (i==0 || d > max) {
- max=d;
- vtx=i;
+ if (i == 0 || d > max) {
+ max = d;
+ vtx = i;
}
}
+ for (int i = 0; i < fc; i++) {
- for(int i=0;i<fc;i++) {
-
- if (faces[i].plane.normal.dot(p_normal)>_FACE_IS_VALID_SUPPORT_TRESHOLD) {
+ if (faces[i].plane.normal.dot(p_normal) > _FACE_IS_VALID_SUPPORT_TRESHOLD) {
int ic = faces[i].indices.size();
- const int *ind=faces[i].indices.ptr();
+ const int *ind = faces[i].indices.ptr();
- bool valid=false;
- for(int j=0;j<ic;j++) {
- if (ind[j]==vtx) {
- valid=true;
+ bool valid = false;
+ for (int j = 0; j < ic; j++) {
+ if (ind[j] == vtx) {
+ valid = true;
break;
}
}
@@ -729,114 +671,103 @@ void ConvexPolygonShapeSW::get_supports(const Vector3& p_normal,int p_max,Vector
if (!valid)
continue;
- int m = MIN(p_max,ic);
- for(int j=0;j<m;j++) {
+ int m = MIN(p_max, ic);
+ for (int j = 0; j < m; j++) {
- r_supports[j]=vertices[ind[j]];
+ r_supports[j] = vertices[ind[j]];
}
- r_amount=m;
+ r_amount = m;
return;
}
}
- for(int i=0;i<ec;i++) {
-
+ for (int i = 0; i < ec; i++) {
- float dot=(vertices[edges[i].a]-vertices[edges[i].b]).normalized().dot(p_normal);
- dot=ABS(dot);
- if (dot < _EDGE_IS_VALID_SUPPORT_TRESHOLD && (edges[i].a==vtx || edges[i].b==vtx)) {
+ float dot = (vertices[edges[i].a] - vertices[edges[i].b]).normalized().dot(p_normal);
+ dot = ABS(dot);
+ if (dot < _EDGE_IS_VALID_SUPPORT_TRESHOLD && (edges[i].a == vtx || edges[i].b == vtx)) {
- r_amount=2;
- r_supports[0]=vertices[edges[i].a];
- r_supports[1]=vertices[edges[i].b];
+ r_amount = 2;
+ r_supports[0] = vertices[edges[i].a];
+ r_supports[1] = vertices[edges[i].b];
return;
}
}
-
- r_supports[0]=vertices[vtx];
- r_amount=1;
+ r_supports[0] = vertices[vtx];
+ r_amount = 1;
}
-bool ConvexPolygonShapeSW::intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const {
-
-
+bool ConvexPolygonShapeSW::intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const {
const Geometry::MeshData::Face *faces = mesh.faces.ptr();
int fc = mesh.faces.size();
const Vector3 *vertices = mesh.vertices.ptr();
- Vector3 n = p_end-p_begin;
+ Vector3 n = p_end - p_begin;
float min = 1e20;
- bool col=false;
+ bool col = false;
- for(int i=0;i<fc;i++) {
+ for (int i = 0; i < fc; i++) {
if (faces[i].plane.normal.dot(n) > 0)
continue; //opposing face
int ic = faces[i].indices.size();
- const int *ind=faces[i].indices.ptr();
+ const int *ind = faces[i].indices.ptr();
- for(int j=1;j<ic-1;j++) {
+ for (int j = 1; j < ic - 1; j++) {
- Face3 f(vertices[ind[0]],vertices[ind[j]],vertices[ind[j+1]]);
+ Face3 f(vertices[ind[0]], vertices[ind[j]], vertices[ind[j + 1]]);
Vector3 result;
- if (f.intersects_segment(p_begin,p_end,&result)) {
+ if (f.intersects_segment(p_begin, p_end, &result)) {
float d = n.dot(result);
- if (d<min) {
- min=d;
- r_result=result;
- r_normal=faces[i].plane.normal;
- col=true;
+ if (d < min) {
+ min = d;
+ r_result = result;
+ r_normal = faces[i].plane.normal;
+ col = true;
}
break;
}
-
}
}
return col;
-
}
Vector3 ConvexPolygonShapeSW::get_moment_of_inertia(float p_mass) const {
// use crappy AABB approximation
- Vector3 extents=get_aabb().size*0.5;
-
- return Vector3(
- (p_mass/3.0) * (extents.y*extents.y + extents.z*extents.z),
- (p_mass/3.0) * (extents.x*extents.x + extents.z*extents.z),
- (p_mass/3.0) * (extents.y*extents.y + extents.y*extents.y)
- );
+ Vector3 extents = get_aabb().size * 0.5;
+ return Vector3(
+ (p_mass / 3.0) * (extents.y * extents.y + extents.z * extents.z),
+ (p_mass / 3.0) * (extents.x * extents.x + extents.z * extents.z),
+ (p_mass / 3.0) * (extents.y * extents.y + extents.y * extents.y));
}
-void ConvexPolygonShapeSW::_setup(const Vector<Vector3>& p_vertices) {
+void ConvexPolygonShapeSW::_setup(const Vector<Vector3> &p_vertices) {
- Error err = QuickHull::build(p_vertices,mesh);
+ Error err = QuickHull::build(p_vertices, mesh);
AABB _aabb;
- for(int i=0;i<mesh.vertices.size();i++) {
+ for (int i = 0; i < mesh.vertices.size(); i++) {
- if (i==0)
- _aabb.pos=mesh.vertices[i];
+ if (i == 0)
+ _aabb.pos = mesh.vertices[i];
else
_aabb.expand_to(mesh.vertices[i]);
}
configure(_aabb);
-
-
}
-void ConvexPolygonShapeSW::set_data(const Variant& p_data) {
+void ConvexPolygonShapeSW::set_data(const Variant &p_data) {
_setup(p_data);
-
}
Variant ConvexPolygonShapeSW::get_data() const {
@@ -844,113 +775,105 @@ Variant ConvexPolygonShapeSW::get_data() const {
return mesh.vertices;
}
-
-ConvexPolygonShapeSW::ConvexPolygonShapeSW() {
-
-
+ConvexPolygonShapeSW::ConvexPolygonShapeSW() {
}
-
/********** FACE POLYGON *************/
+void FaceShapeSW::project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const {
-void FaceShapeSW::project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const {
-
- for (int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
- Vector3 v=p_transform.xform(vertex[i]);
- float d=p_normal.dot(v);
+ Vector3 v = p_transform.xform(vertex[i]);
+ float d = p_normal.dot(v);
- if (i==0 || d > r_max)
- r_max=d;
+ if (i == 0 || d > r_max)
+ r_max = d;
- if (i==0 || d < r_min)
- r_min=d;
+ if (i == 0 || d < r_min)
+ r_min = d;
}
}
-Vector3 FaceShapeSW::get_support(const Vector3& p_normal) const {
-
+Vector3 FaceShapeSW::get_support(const Vector3 &p_normal) const {
- int vert_support_idx=-1;
+ int vert_support_idx = -1;
float support_max;
- for (int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
- float d=p_normal.dot(vertex[i]);
+ float d = p_normal.dot(vertex[i]);
- if (i==0 || d > support_max) {
- support_max=d;
- vert_support_idx=i;
+ if (i == 0 || d > support_max) {
+ support_max = d;
+ vert_support_idx = i;
}
}
return vertex[vert_support_idx];
}
-void FaceShapeSW::get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const {
+void FaceShapeSW::get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const {
- Vector3 n=p_normal;
+ Vector3 n = p_normal;
/** TEST FACE AS SUPPORT **/
if (normal.dot(n) > _FACE_IS_VALID_SUPPORT_TRESHOLD) {
- r_amount=3;
- for (int i=0;i<3;i++) {
+ r_amount = 3;
+ for (int i = 0; i < 3; i++) {
- r_supports[i]=vertex[i];
+ r_supports[i] = vertex[i];
}
return;
-
}
/** FIND SUPPORT VERTEX **/
- int vert_support_idx=-1;
+ int vert_support_idx = -1;
float support_max;
- for (int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
- float d=n.dot(vertex[i]);
+ float d = n.dot(vertex[i]);
- if (i==0 || d > support_max) {
- support_max=d;
- vert_support_idx=i;
+ if (i == 0 || d > support_max) {
+ support_max = d;
+ vert_support_idx = i;
}
}
/** TEST EDGES AS SUPPORT **/
- for (int i=0;i<3;i++) {
+ for (int i = 0; i < 3; i++) {
- int nx=(i+1)%3;
- if (i!=vert_support_idx && nx!=vert_support_idx)
+ int nx = (i + 1) % 3;
+ if (i != vert_support_idx && nx != vert_support_idx)
continue;
- // check if edge is valid as a support
- float dot=(vertex[i]-vertex[nx]).normalized().dot(n);
- dot=ABS(dot);
+ // check if edge is valid as a support
+ float dot = (vertex[i] - vertex[nx]).normalized().dot(n);
+ dot = ABS(dot);
if (dot < _EDGE_IS_VALID_SUPPORT_TRESHOLD) {
- r_amount=2;
- r_supports[0]=vertex[i];
- r_supports[1]=vertex[nx];
+ r_amount = 2;
+ r_supports[0] = vertex[i];
+ r_supports[1] = vertex[nx];
return;
}
}
- r_amount=1;
- r_supports[0]=vertex[vert_support_idx];
+ r_amount = 1;
+ r_supports[0] = vertex[vert_support_idx];
}
-bool FaceShapeSW::intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const {
-
+bool FaceShapeSW::intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const {
- bool c=Geometry::segment_intersects_triangle(p_begin,p_end,vertex[0],vertex[1],vertex[2],&r_result);
+ bool c = Geometry::segment_intersects_triangle(p_begin, p_end, vertex[0], vertex[1], vertex[2], &r_result);
if (c) {
- r_normal=Plane(vertex[0],vertex[1],vertex[2]).normal;
- if (r_normal.dot(p_end-p_begin)>0) {
- r_normal=-r_normal;
+ r_normal = Plane(vertex[0], vertex[1], vertex[2]).normal;
+ if (r_normal.dot(p_end - p_begin) > 0) {
+ r_normal = -r_normal;
}
}
@@ -960,181 +883,160 @@ bool FaceShapeSW::intersect_segment(const Vector3& p_begin,const Vector3& p_end,
Vector3 FaceShapeSW::get_moment_of_inertia(float p_mass) const {
return Vector3(); // Sorry, but i don't think anyone cares, FaceShape!
-
}
-FaceShapeSW::FaceShapeSW() {
+FaceShapeSW::FaceShapeSW() {
configure(AABB());
-
}
-
-
DVector<Vector3> ConcavePolygonShapeSW::get_faces() const {
-
DVector<Vector3> rfaces;
- rfaces.resize(faces.size()*3);
+ rfaces.resize(faces.size() * 3);
- for(int i=0;i<faces.size();i++) {
+ for (int i = 0; i < faces.size(); i++) {
- Face f=faces.get(i);
+ Face f = faces.get(i);
- for(int j=0;j<3;j++) {
+ for (int j = 0; j < 3; j++) {
- rfaces.set(i*3+j, vertices.get( f.indices[j] ) );
+ rfaces.set(i * 3 + j, vertices.get(f.indices[j]));
}
}
return rfaces;
}
-void ConcavePolygonShapeSW::project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const {
+void ConcavePolygonShapeSW::project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const {
- int count=vertices.size();
- if (count==0) {
- r_min=0;
- r_max=0;
+ int count = vertices.size();
+ if (count == 0) {
+ r_min = 0;
+ r_max = 0;
return;
}
- DVector<Vector3>::Read r=vertices.read();
- const Vector3 *vptr=r.ptr();
-
- for (int i=0;i<count;i++) {
+ DVector<Vector3>::Read r = vertices.read();
+ const Vector3 *vptr = r.ptr();
- float d=p_normal.dot( p_transform.xform( vptr[i] ) );
+ for (int i = 0; i < count; i++) {
- if (i==0 || d > r_max)
- r_max=d;
- if (i==0 || d < r_min)
- r_min=d;
+ float d = p_normal.dot(p_transform.xform(vptr[i]));
+ if (i == 0 || d > r_max)
+ r_max = d;
+ if (i == 0 || d < r_min)
+ r_min = d;
}
}
-Vector3 ConcavePolygonShapeSW::get_support(const Vector3& p_normal) const {
-
+Vector3 ConcavePolygonShapeSW::get_support(const Vector3 &p_normal) const {
- int count=vertices.size();
- if (count==0)
+ int count = vertices.size();
+ if (count == 0)
return Vector3();
- DVector<Vector3>::Read r=vertices.read();
- const Vector3 *vptr=r.ptr();
+ DVector<Vector3>::Read r = vertices.read();
+ const Vector3 *vptr = r.ptr();
- Vector3 n=p_normal;
+ Vector3 n = p_normal;
- int vert_support_idx=-1;
+ int vert_support_idx = -1;
float support_max;
- for (int i=0;i<count;i++) {
+ for (int i = 0; i < count; i++) {
- float d=n.dot(vptr[i]);
+ float d = n.dot(vptr[i]);
- if (i==0 || d > support_max) {
- support_max=d;
- vert_support_idx=i;
+ if (i == 0 || d > support_max) {
+ support_max = d;
+ vert_support_idx = i;
}
}
-
return vptr[vert_support_idx];
-
}
-void ConcavePolygonShapeSW::_cull_segment(int p_idx,_SegmentCullParams *p_params) const {
-
- const BVH *bvh=&p_params->bvh[p_idx];
+void ConcavePolygonShapeSW::_cull_segment(int p_idx, _SegmentCullParams *p_params) const {
+ const BVH *bvh = &p_params->bvh[p_idx];
//if (p_params->dir.dot(bvh->aabb.get_support(-p_params->dir))>p_params->min_d)
// return; //test against whole AABB, which isn't very costly
-
//printf("addr: %p\n",bvh);
- if (!bvh->aabb.intersects_segment(p_params->from,p_params->to)) {
+ if (!bvh->aabb.intersects_segment(p_params->from, p_params->to)) {
return;
}
-
- if (bvh->face_index>=0) {
-
+ if (bvh->face_index >= 0) {
Vector3 res;
- Vector3 vertices[3]={
- p_params->vertices[ p_params->faces[ bvh->face_index ].indices[0] ],
- p_params->vertices[ p_params->faces[ bvh->face_index ].indices[1] ],
- p_params->vertices[ p_params->faces[ bvh->face_index ].indices[2] ]
+ Vector3 vertices[3] = {
+ p_params->vertices[p_params->faces[bvh->face_index].indices[0]],
+ p_params->vertices[p_params->faces[bvh->face_index].indices[1]],
+ p_params->vertices[p_params->faces[bvh->face_index].indices[2]]
};
if (Geometry::segment_intersects_triangle(
- p_params->from,
- p_params->to,
- vertices[0],
- vertices[1],
- vertices[2],
- &res)) {
-
+ p_params->from,
+ p_params->to,
+ vertices[0],
+ vertices[1],
+ vertices[2],
+ &res)) {
- float d=p_params->dir.dot(res) - p_params->dir.dot(p_params->from);
+ float d = p_params->dir.dot(res) - p_params->dir.dot(p_params->from);
//TODO, seems segmen/triangle intersection is broken :(
- if (d>0 && d<p_params->min_d) {
+ if (d > 0 && d < p_params->min_d) {
- p_params->min_d=d;
- p_params->result=res;
- p_params->normal=Plane(vertices[0],vertices[1],vertices[2]).normal;
- if (p_params->normal.dot(p_params->dir)>0)
- p_params->normal=-p_params->normal;
+ p_params->min_d = d;
+ p_params->result = res;
+ p_params->normal = Plane(vertices[0], vertices[1], vertices[2]).normal;
+ if (p_params->normal.dot(p_params->dir) > 0)
+ p_params->normal = -p_params->normal;
p_params->collisions++;
}
-
}
-
-
} else {
- if (bvh->left>=0)
- _cull_segment(bvh->left,p_params);
- if (bvh->right>=0)
- _cull_segment(bvh->right,p_params);
-
-
+ if (bvh->left >= 0)
+ _cull_segment(bvh->left, p_params);
+ if (bvh->right >= 0)
+ _cull_segment(bvh->right, p_params);
}
}
-bool ConcavePolygonShapeSW::intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const {
+bool ConcavePolygonShapeSW::intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const {
- if (faces.size()==0)
+ if (faces.size() == 0)
return false;
// unlock data
- DVector<Face>::Read fr=faces.read();
- DVector<Vector3>::Read vr=vertices.read();
- DVector<BVH>::Read br=bvh.read();
-
+ DVector<Face>::Read fr = faces.read();
+ DVector<Vector3>::Read vr = vertices.read();
+ DVector<BVH>::Read br = bvh.read();
_SegmentCullParams params;
- params.from=p_begin;
- params.to=p_end;
- params.collisions=0;
- params.dir=(p_end-p_begin).normalized();
+ params.from = p_begin;
+ params.to = p_end;
+ params.collisions = 0;
+ params.dir = (p_end - p_begin).normalized();
- params.faces=fr.ptr();
- params.vertices=vr.ptr();
- params.bvh=br.ptr();
+ params.faces = fr.ptr();
+ params.vertices = vr.ptr();
+ params.bvh = br.ptr();
- params.min_d=1e20;
+ params.min_d = 1e20;
// cull
- _cull_segment(0,&params);
-
- if (params.collisions>0) {
+ _cull_segment(0, &params);
+ if (params.collisions > 0) {
- r_result=params.result;
- r_normal=params.normal;
+ r_result = params.result;
+ r_normal = params.normal;
return true;
} else {
@@ -1142,81 +1044,76 @@ bool ConcavePolygonShapeSW::intersect_segment(const Vector3& p_begin,const Vecto
}
}
-void ConcavePolygonShapeSW::_cull(int p_idx,_CullParams *p_params) const {
+void ConcavePolygonShapeSW::_cull(int p_idx, _CullParams *p_params) const {
- const BVH* bvh=&p_params->bvh[p_idx];
+ const BVH *bvh = &p_params->bvh[p_idx];
- if (!p_params->aabb.intersects( bvh->aabb ))
+ if (!p_params->aabb.intersects(bvh->aabb))
return;
- if (bvh->face_index>=0) {
+ if (bvh->face_index >= 0) {
- const Face *f=&p_params->faces[ bvh->face_index ];
- FaceShapeSW *face=p_params->face;
- face->normal=f->normal;
- face->vertex[0]=p_params->vertices[f->indices[0]];
- face->vertex[1]=p_params->vertices[f->indices[1]];
- face->vertex[2]=p_params->vertices[f->indices[2]];
- p_params->callback(p_params->userdata,face);
+ const Face *f = &p_params->faces[bvh->face_index];
+ FaceShapeSW *face = p_params->face;
+ face->normal = f->normal;
+ face->vertex[0] = p_params->vertices[f->indices[0]];
+ face->vertex[1] = p_params->vertices[f->indices[1]];
+ face->vertex[2] = p_params->vertices[f->indices[2]];
+ p_params->callback(p_params->userdata, face);
} else {
- if (bvh->left>=0) {
-
- _cull(bvh->left,p_params);
+ if (bvh->left >= 0) {
+ _cull(bvh->left, p_params);
}
- if (bvh->right>=0) {
+ if (bvh->right >= 0) {
- _cull(bvh->right,p_params);
+ _cull(bvh->right, p_params);
}
-
}
}
-void ConcavePolygonShapeSW::cull(const AABB& p_local_aabb,Callback p_callback,void* p_userdata) const {
+void ConcavePolygonShapeSW::cull(const AABB &p_local_aabb, Callback p_callback, void *p_userdata) const {
// make matrix local to concave
- if (faces.size()==0)
+ if (faces.size() == 0)
return;
- AABB local_aabb=p_local_aabb;
+ AABB local_aabb = p_local_aabb;
// unlock data
- DVector<Face>::Read fr=faces.read();
- DVector<Vector3>::Read vr=vertices.read();
- DVector<BVH>::Read br=bvh.read();
+ DVector<Face>::Read fr = faces.read();
+ DVector<Vector3>::Read vr = vertices.read();
+ DVector<BVH>::Read br = bvh.read();
FaceShapeSW face; // use this to send in the callback
_CullParams params;
- params.aabb=local_aabb;
- params.face=&face;
- params.faces=fr.ptr();
- params.vertices=vr.ptr();
- params.bvh=br.ptr();
- params.callback=p_callback;
- params.userdata=p_userdata;
+ params.aabb = local_aabb;
+ params.face = &face;
+ params.faces = fr.ptr();
+ params.vertices = vr.ptr();
+ params.bvh = br.ptr();
+ params.callback = p_callback;
+ params.userdata = p_userdata;
// cull
- _cull(0,&params);
-
+ _cull(0, &params);
}
Vector3 ConcavePolygonShapeSW::get_moment_of_inertia(float p_mass) const {
// use crappy AABB approximation
- Vector3 extents=get_aabb().size*0.5;
+ Vector3 extents = get_aabb().size * 0.5;
return Vector3(
- (p_mass/3.0) * (extents.y*extents.y + extents.z*extents.z),
- (p_mass/3.0) * (extents.x*extents.x + extents.z*extents.z),
- (p_mass/3.0) * (extents.y*extents.y + extents.y*extents.y)
- );
+ (p_mass / 3.0) * (extents.y * extents.y + extents.z * extents.z),
+ (p_mass / 3.0) * (extents.x * extents.x + extents.z * extents.z),
+ (p_mass / 3.0) * (extents.y * extents.y + extents.y * extents.y));
}
-
struct _VolumeSW_BVH_Element {
AABB aabb;
@@ -1226,26 +1123,25 @@ struct _VolumeSW_BVH_Element {
struct _VolumeSW_BVH_CompareX {
- _FORCE_INLINE_ bool operator ()(const _VolumeSW_BVH_Element& a, const _VolumeSW_BVH_Element& b) const {
+ _FORCE_INLINE_ bool operator()(const _VolumeSW_BVH_Element &a, const _VolumeSW_BVH_Element &b) const {
- return a.center.x<b.center.x;
+ return a.center.x < b.center.x;
}
};
-
struct _VolumeSW_BVH_CompareY {
- _FORCE_INLINE_ bool operator ()(const _VolumeSW_BVH_Element& a, const _VolumeSW_BVH_Element& b) const {
+ _FORCE_INLINE_ bool operator()(const _VolumeSW_BVH_Element &a, const _VolumeSW_BVH_Element &b) const {
- return a.center.y<b.center.y;
+ return a.center.y < b.center.y;
}
};
struct _VolumeSW_BVH_CompareZ {
- _FORCE_INLINE_ bool operator ()(const _VolumeSW_BVH_Element& a, const _VolumeSW_BVH_Element& b) const {
+ _FORCE_INLINE_ bool operator()(const _VolumeSW_BVH_Element &a, const _VolumeSW_BVH_Element &b) const {
- return a.center.z<b.center.z;
+ return a.center.z < b.center.z;
}
};
@@ -1258,107 +1154,102 @@ struct _VolumeSW_BVH {
int face_index;
};
+_VolumeSW_BVH *_volume_sw_build_bvh(_VolumeSW_BVH_Element *p_elements, int p_size, int &count) {
-_VolumeSW_BVH* _volume_sw_build_bvh(_VolumeSW_BVH_Element *p_elements,int p_size,int &count) {
-
- _VolumeSW_BVH* bvh = memnew( _VolumeSW_BVH );
+ _VolumeSW_BVH *bvh = memnew(_VolumeSW_BVH);
- if (p_size==1) {
+ if (p_size == 1) {
//leaf
- bvh->aabb=p_elements[0].aabb;
- bvh->left=NULL;
- bvh->right=NULL;
- bvh->face_index=p_elements->face_index;
+ bvh->aabb = p_elements[0].aabb;
+ bvh->left = NULL;
+ bvh->right = NULL;
+ bvh->face_index = p_elements->face_index;
count++;
return bvh;
} else {
- bvh->face_index=-1;
+ bvh->face_index = -1;
}
AABB aabb;
- for(int i=0;i<p_size;i++) {
+ for (int i = 0; i < p_size; i++) {
- if (i==0)
- aabb=p_elements[i].aabb;
+ if (i == 0)
+ aabb = p_elements[i].aabb;
else
aabb.merge_with(p_elements[i].aabb);
}
- bvh->aabb=aabb;
- switch(aabb.get_longest_axis_index()) {
+ bvh->aabb = aabb;
+ switch (aabb.get_longest_axis_index()) {
case 0: {
- SortArray<_VolumeSW_BVH_Element,_VolumeSW_BVH_CompareX> sort_x;
- sort_x.sort(p_elements,p_size);
+ SortArray<_VolumeSW_BVH_Element, _VolumeSW_BVH_CompareX> sort_x;
+ sort_x.sort(p_elements, p_size);
} break;
case 1: {
- SortArray<_VolumeSW_BVH_Element,_VolumeSW_BVH_CompareY> sort_y;
- sort_y.sort(p_elements,p_size);
+ SortArray<_VolumeSW_BVH_Element, _VolumeSW_BVH_CompareY> sort_y;
+ sort_y.sort(p_elements, p_size);
} break;
case 2: {
- SortArray<_VolumeSW_BVH_Element,_VolumeSW_BVH_CompareZ> sort_z;
- sort_z.sort(p_elements,p_size);
+ SortArray<_VolumeSW_BVH_Element, _VolumeSW_BVH_CompareZ> sort_z;
+ sort_z.sort(p_elements, p_size);
} break;
}
- int split=p_size/2;
- bvh->left=_volume_sw_build_bvh(p_elements,split,count);
- bvh->right=_volume_sw_build_bvh(&p_elements[split],p_size-split,count);
+ int split = p_size / 2;
+ bvh->left = _volume_sw_build_bvh(p_elements, split, count);
+ bvh->right = _volume_sw_build_bvh(&p_elements[split], p_size - split, count);
-// printf("branch at %p - %i: %i\n",bvh,count,bvh->face_index);
+ // printf("branch at %p - %i: %i\n",bvh,count,bvh->face_index);
count++;
return bvh;
}
+void ConcavePolygonShapeSW::_fill_bvh(_VolumeSW_BVH *p_bvh_tree, BVH *p_bvh_array, int &p_idx) {
-void ConcavePolygonShapeSW::_fill_bvh(_VolumeSW_BVH* p_bvh_tree,BVH* p_bvh_array,int& p_idx) {
-
- int idx=p_idx;
-
-
- p_bvh_array[idx].aabb=p_bvh_tree->aabb;
- p_bvh_array[idx].face_index=p_bvh_tree->face_index;
-// printf("%p - %i: %i(%p) -- %p:%p\n",%p_bvh_array[idx],p_idx,p_bvh_array[i]->face_index,&p_bvh_tree->face_index,p_bvh_tree->left,p_bvh_tree->right);
+ int idx = p_idx;
+ p_bvh_array[idx].aabb = p_bvh_tree->aabb;
+ p_bvh_array[idx].face_index = p_bvh_tree->face_index;
+ // printf("%p - %i: %i(%p) -- %p:%p\n",%p_bvh_array[idx],p_idx,p_bvh_array[i]->face_index,&p_bvh_tree->face_index,p_bvh_tree->left,p_bvh_tree->right);
if (p_bvh_tree->left) {
- p_bvh_array[idx].left=++p_idx;
- _fill_bvh(p_bvh_tree->left,p_bvh_array,p_idx);
+ p_bvh_array[idx].left = ++p_idx;
+ _fill_bvh(p_bvh_tree->left, p_bvh_array, p_idx);
} else {
- p_bvh_array[p_idx].left=-1;
+ p_bvh_array[p_idx].left = -1;
}
if (p_bvh_tree->right) {
- p_bvh_array[idx].right=++p_idx;
- _fill_bvh(p_bvh_tree->right,p_bvh_array,p_idx);
+ p_bvh_array[idx].right = ++p_idx;
+ _fill_bvh(p_bvh_tree->right, p_bvh_array, p_idx);
} else {
- p_bvh_array[p_idx].right=-1;
+ p_bvh_array[p_idx].right = -1;
}
memdelete(p_bvh_tree);
-
}
void ConcavePolygonShapeSW::_setup(DVector<Vector3> p_faces) {
- int src_face_count=p_faces.size();
- if (src_face_count==0) {
+ int src_face_count = p_faces.size();
+ if (src_face_count == 0) {
configure(AABB());
return;
}
- ERR_FAIL_COND(src_face_count%3);
- src_face_count/=3;
+ ERR_FAIL_COND(src_face_count % 3);
+ src_face_count /= 3;
DVector<Vector3>::Read r = p_faces.read();
- const Vector3 * facesr= r.ptr();
+ const Vector3 *facesr = r.ptr();
#if 0
Map<Vector3,int> point_map;
@@ -1474,67 +1365,62 @@ void ConcavePolygonShapeSW::_setup(DVector<Vector3> p_faces) {
#else
DVector<_VolumeSW_BVH_Element> bvh_array;
- bvh_array.resize( src_face_count );
+ bvh_array.resize(src_face_count);
DVector<_VolumeSW_BVH_Element>::Write bvhw = bvh_array.write();
- _VolumeSW_BVH_Element *bvh_arrayw=bvhw.ptr();
+ _VolumeSW_BVH_Element *bvh_arrayw = bvhw.ptr();
faces.resize(src_face_count);
DVector<Face>::Write w = faces.write();
- Face *facesw=w.ptr();
+ Face *facesw = w.ptr();
- vertices.resize( src_face_count*3 );
+ vertices.resize(src_face_count * 3);
DVector<Vector3>::Write vw = vertices.write();
- Vector3 *verticesw=vw.ptr();
+ Vector3 *verticesw = vw.ptr();
AABB _aabb;
+ for (int i = 0; i < src_face_count; i++) {
- for(int i=0;i<src_face_count;i++) {
-
- Face3 face( facesr[i*3+0], facesr[i*3+1], facesr[i*3+2] );
+ Face3 face(facesr[i * 3 + 0], facesr[i * 3 + 1], facesr[i * 3 + 2]);
- bvh_arrayw[i].aabb=face.get_aabb();
+ bvh_arrayw[i].aabb = face.get_aabb();
bvh_arrayw[i].center = bvh_arrayw[i].aabb.pos + bvh_arrayw[i].aabb.size * 0.5;
- bvh_arrayw[i].face_index=i;
- facesw[i].indices[0]=i*3+0;
- facesw[i].indices[1]=i*3+1;
- facesw[i].indices[2]=i*3+2;
- facesw[i].normal=face.get_plane().normal;
- verticesw[i*3+0]=face.vertex[0];
- verticesw[i*3+1]=face.vertex[1];
- verticesw[i*3+2]=face.vertex[2];
- if (i==0)
- _aabb=bvh_arrayw[i].aabb;
+ bvh_arrayw[i].face_index = i;
+ facesw[i].indices[0] = i * 3 + 0;
+ facesw[i].indices[1] = i * 3 + 1;
+ facesw[i].indices[2] = i * 3 + 2;
+ facesw[i].normal = face.get_plane().normal;
+ verticesw[i * 3 + 0] = face.vertex[0];
+ verticesw[i * 3 + 1] = face.vertex[1];
+ verticesw[i * 3 + 2] = face.vertex[2];
+ if (i == 0)
+ _aabb = bvh_arrayw[i].aabb;
else
_aabb.merge_with(bvh_arrayw[i].aabb);
-
}
- w=DVector<Face>::Write();
- vw=DVector<Vector3>::Write();
+ w = DVector<Face>::Write();
+ vw = DVector<Vector3>::Write();
- int count=0;
- _VolumeSW_BVH *bvh_tree=_volume_sw_build_bvh(bvh_arrayw,src_face_count,count);
+ int count = 0;
+ _VolumeSW_BVH *bvh_tree = _volume_sw_build_bvh(bvh_arrayw, src_face_count, count);
- bvh.resize( count+1 );
+ bvh.resize(count + 1);
DVector<BVH>::Write bvhw2 = bvh.write();
- BVH*bvh_arrayw2=bvhw2.ptr();
+ BVH *bvh_arrayw2 = bvhw2.ptr();
- int idx=0;
- _fill_bvh(bvh_tree,bvh_arrayw2,idx);
+ int idx = 0;
+ _fill_bvh(bvh_tree, bvh_arrayw2, idx);
configure(_aabb); // this type of shape has no margin
-
#endif
}
-
-void ConcavePolygonShapeSW::set_data(const Variant& p_data) {
-
+void ConcavePolygonShapeSW::set_data(const Variant &p_data) {
_setup(p_data);
}
@@ -1545,12 +1431,8 @@ Variant ConcavePolygonShapeSW::get_data() const {
}
ConcavePolygonShapeSW::ConcavePolygonShapeSW() {
-
-
}
-
-
/* HEIGHT MAP SHAPE */
DVector<float> HeightMapShapeSW::get_heights() const {
@@ -1570,114 +1452,94 @@ float HeightMapShapeSW::get_cell_size() const {
return cell_size;
}
-
-void HeightMapShapeSW::project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const {
+void HeightMapShapeSW::project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const {
//not very useful, but not very used either
- p_transform.xform(get_aabb()).project_range_in_plane( Plane(p_normal,0),r_min,r_max );
-
+ p_transform.xform(get_aabb()).project_range_in_plane(Plane(p_normal, 0), r_min, r_max);
}
-Vector3 HeightMapShapeSW::get_support(const Vector3& p_normal) const {
-
+Vector3 HeightMapShapeSW::get_support(const Vector3 &p_normal) const {
//not very useful, but not very used either
return get_aabb().get_support(p_normal);
-
}
-bool HeightMapShapeSW::intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_point, Vector3 &r_normal) const {
-
+bool HeightMapShapeSW::intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_point, Vector3 &r_normal) const {
return false;
}
-
-void HeightMapShapeSW::cull(const AABB& p_local_aabb,Callback p_callback,void* p_userdata) const {
-
-
-
+void HeightMapShapeSW::cull(const AABB &p_local_aabb, Callback p_callback, void *p_userdata) const {
}
-
Vector3 HeightMapShapeSW::get_moment_of_inertia(float p_mass) const {
-
// use crappy AABB approximation
- Vector3 extents=get_aabb().size*0.5;
+ Vector3 extents = get_aabb().size * 0.5;
return Vector3(
- (p_mass/3.0) * (extents.y*extents.y + extents.z*extents.z),
- (p_mass/3.0) * (extents.x*extents.x + extents.z*extents.z),
- (p_mass/3.0) * (extents.y*extents.y + extents.y*extents.y)
- );
+ (p_mass / 3.0) * (extents.y * extents.y + extents.z * extents.z),
+ (p_mass / 3.0) * (extents.x * extents.x + extents.z * extents.z),
+ (p_mass / 3.0) * (extents.y * extents.y + extents.y * extents.y));
}
+void HeightMapShapeSW::_setup(DVector<real_t> p_heights, int p_width, int p_depth, real_t p_cell_size) {
-void HeightMapShapeSW::_setup(DVector<real_t> p_heights,int p_width,int p_depth,real_t p_cell_size) {
+ heights = p_heights;
+ width = p_width;
+ depth = p_depth;
+ cell_size = p_cell_size;
- heights=p_heights;
- width=p_width;
- depth=p_depth;
- cell_size=p_cell_size;
-
- DVector<real_t>::Read r = heights. read();
+ DVector<real_t>::Read r = heights.read();
AABB aabb;
- for(int i=0;i<depth;i++) {
+ for (int i = 0; i < depth; i++) {
- for(int j=0;j<width;j++) {
+ for (int j = 0; j < width; j++) {
- float h = r[i*width+j];
+ float h = r[i * width + j];
- Vector3 pos( j*cell_size, h, i*cell_size );
- if (i==0 || j==0)
- aabb.pos=pos;
+ Vector3 pos(j * cell_size, h, i * cell_size);
+ if (i == 0 || j == 0)
+ aabb.pos = pos;
else
aabb.expand_to(pos);
-
}
}
-
configure(aabb);
}
-void HeightMapShapeSW::set_data(const Variant& p_data) {
+void HeightMapShapeSW::set_data(const Variant &p_data) {
- ERR_FAIL_COND( p_data.get_type()!=Variant::DICTIONARY );
- Dictionary d=p_data;
- ERR_FAIL_COND( !d.has("width") );
- ERR_FAIL_COND( !d.has("depth") );
- ERR_FAIL_COND( !d.has("cell_size") );
- ERR_FAIL_COND( !d.has("heights") );
-
- int width=d["width"];
- int depth=d["depth"];
- float cell_size=d["cell_size"];
- DVector<float> heights=d["heights"];
+ ERR_FAIL_COND(p_data.get_type() != Variant::DICTIONARY);
+ Dictionary d = p_data;
+ ERR_FAIL_COND(!d.has("width"));
+ ERR_FAIL_COND(!d.has("depth"));
+ ERR_FAIL_COND(!d.has("cell_size"));
+ ERR_FAIL_COND(!d.has("heights"));
- ERR_FAIL_COND( width<= 0);
- ERR_FAIL_COND( depth<= 0);
- ERR_FAIL_COND( cell_size<= CMP_EPSILON);
- ERR_FAIL_COND( heights.size() != (width*depth) );
- _setup(heights, width, depth, cell_size );
+ int width = d["width"];
+ int depth = d["depth"];
+ float cell_size = d["cell_size"];
+ DVector<float> heights = d["heights"];
+ ERR_FAIL_COND(width <= 0);
+ ERR_FAIL_COND(depth <= 0);
+ ERR_FAIL_COND(cell_size <= CMP_EPSILON);
+ ERR_FAIL_COND(heights.size() != (width * depth));
+ _setup(heights, width, depth, cell_size);
}
Variant HeightMapShapeSW::get_data() const {
ERR_FAIL_V(Variant());
-
}
HeightMapShapeSW::HeightMapShapeSW() {
- width=0;
- depth=0;
- cell_size=0;
+ width = 0;
+ depth = 0;
+ cell_size = 0;
}
-
-
-
diff --git a/servers/physics/shape_sw.h b/servers/physics/shape_sw.h
index 5328a0b97..17a33bc04 100644
--- a/servers/physics/shape_sw.h
+++ b/servers/physics/shape_sw.h
@@ -29,9 +29,9 @@
#ifndef SHAPE_SW_H
#define SHAPE_SW_H
-#include "servers/physics_server.h"
#include "bsp_tree.h"
#include "geometry.h"
+#include "servers/physics_server.h"
/*
SHAPE_LINE, ///< plane:"plane"
@@ -48,14 +48,12 @@ class ShapeSW;
class ShapeOwnerSW {
public:
-
- virtual void _shape_changed()=0;
- virtual void remove_shape(ShapeSW *p_shape)=0;
+ virtual void _shape_changed() = 0;
+ virtual void remove_shape(ShapeSW *p_shape) = 0;
virtual ~ShapeOwnerSW() {}
};
-
class ShapeSW {
RID self;
@@ -63,58 +61,56 @@ class ShapeSW {
bool configured;
real_t custom_bias;
- Map<ShapeOwnerSW*,int> owners;
+ Map<ShapeOwnerSW *, int> owners;
+
protected:
+ void configure(const AABB &p_aabb);
- void configure(const AABB& p_aabb);
public:
-
enum {
- MAX_SUPPORTS=8
+ MAX_SUPPORTS = 8
};
- _FORCE_INLINE_ void set_self(const RID& p_self) { self=p_self; }
- _FORCE_INLINE_ RID get_self() const {return self; }
+ _FORCE_INLINE_ void set_self(const RID &p_self) { self = p_self; }
+ _FORCE_INLINE_ RID get_self() const { return self; }
- virtual PhysicsServer::ShapeType get_type() const=0;
+ virtual PhysicsServer::ShapeType get_type() const = 0;
_FORCE_INLINE_ AABB get_aabb() const { return aabb; }
_FORCE_INLINE_ bool is_configured() const { return configured; }
virtual bool is_concave() const { return false; }
- virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const=0;
- virtual Vector3 get_support(const Vector3& p_normal) const;
- virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const=0;
+ virtual void project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const = 0;
+ virtual Vector3 get_support(const Vector3 &p_normal) const;
+ virtual void get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const = 0;
- virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_point, Vector3 &r_normal) const=0;
- virtual Vector3 get_moment_of_inertia(float p_mass) const=0;
+ virtual bool intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_point, Vector3 &r_normal) const = 0;
+ virtual Vector3 get_moment_of_inertia(float p_mass) const = 0;
- virtual void set_data(const Variant& p_data)=0;
- virtual Variant get_data() const=0;
+ virtual void set_data(const Variant &p_data) = 0;
+ virtual Variant get_data() const = 0;
- _FORCE_INLINE_ void set_custom_bias(real_t p_bias) { custom_bias=p_bias; }
+ _FORCE_INLINE_ void set_custom_bias(real_t p_bias) { custom_bias = p_bias; }
_FORCE_INLINE_ real_t get_custom_bias() const { return custom_bias; }
void add_owner(ShapeOwnerSW *p_owner);
void remove_owner(ShapeOwnerSW *p_owner);
bool is_owner(ShapeOwnerSW *p_owner) const;
- const Map<ShapeOwnerSW*,int>& get_owners() const;
+ const Map<ShapeOwnerSW *, int> &get_owners() const;
ShapeSW();
virtual ~ShapeSW();
};
-
class ConcaveShapeSW : public ShapeSW {
public:
-
virtual bool is_concave() const { return true; }
- typedef void (*Callback)(void* p_userdata,ShapeSW *p_convex);
- virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const { r_amount=0; }
+ typedef void (*Callback)(void *p_userdata, ShapeSW *p_convex);
+ virtual void get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const { r_amount = 0; }
- virtual void cull(const AABB& p_local_aabb,Callback p_callback,void* p_userdata) const=0;
+ virtual void cull(const AABB &p_local_aabb, Callback p_callback, void *p_userdata) const = 0;
ConcaveShapeSW() {}
};
@@ -123,21 +119,21 @@ class PlaneShapeSW : public ShapeSW {
Plane plane;
- void _setup(const Plane& p_plane);
-public:
+ void _setup(const Plane &p_plane);
+public:
Plane get_plane() const;
virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_PLANE; }
- virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const;
- virtual Vector3 get_support(const Vector3& p_normal) const;
- virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const { r_amount=0; }
+ virtual void project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const;
+ virtual Vector3 get_support(const Vector3 &p_normal) const;
+ virtual void get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const { r_amount = 0; }
- virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const;
+ virtual bool intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const;
virtual Vector3 get_moment_of_inertia(float p_mass) const;
- virtual void set_data(const Variant& p_data);
+ virtual void set_data(const Variant &p_data);
virtual Variant get_data() const;
PlaneShapeSW();
@@ -148,20 +144,20 @@ class RayShapeSW : public ShapeSW {
float length;
void _setup(float p_length);
-public:
+public:
float get_length() const;
virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_RAY; }
- virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const;
- virtual Vector3 get_support(const Vector3& p_normal) const;
- virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const;
+ virtual void project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const;
+ virtual Vector3 get_support(const Vector3 &p_normal) const;
+ virtual void get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const;
- virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const;
+ virtual bool intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const;
virtual Vector3 get_moment_of_inertia(float p_mass) const;
- virtual void set_data(const Variant& p_data);
+ virtual void set_data(const Variant &p_data);
virtual Variant get_data() const;
RayShapeSW();
@@ -172,20 +168,20 @@ class SphereShapeSW : public ShapeSW {
real_t radius;
void _setup(real_t p_radius);
-public:
+public:
real_t get_radius() const;
virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_SPHERE; }
- virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const;
- virtual Vector3 get_support(const Vector3& p_normal) const;
- virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const;
- virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const;
+ virtual void project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const;
+ virtual Vector3 get_support(const Vector3 &p_normal) const;
+ virtual void get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const;
+ virtual bool intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const;
virtual Vector3 get_moment_of_inertia(float p_mass) const;
- virtual void set_data(const Variant& p_data);
+ virtual void set_data(const Variant &p_data);
virtual Variant get_data() const;
SphereShapeSW();
@@ -194,21 +190,21 @@ public:
class BoxShapeSW : public ShapeSW {
Vector3 half_extents;
- void _setup(const Vector3& p_half_extents);
-public:
+ void _setup(const Vector3 &p_half_extents);
+public:
_FORCE_INLINE_ Vector3 get_half_extents() const { return half_extents; }
virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_BOX; }
- virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const;
- virtual Vector3 get_support(const Vector3& p_normal) const;
- virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const;
- virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const;
+ virtual void project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const;
+ virtual Vector3 get_support(const Vector3 &p_normal) const;
+ virtual void get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const;
+ virtual bool intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const;
virtual Vector3 get_moment_of_inertia(float p_mass) const;
- virtual void set_data(const Variant& p_data);
+ virtual void set_data(const Variant &p_data);
virtual Variant get_data() const;
BoxShapeSW();
@@ -219,23 +215,22 @@ class CapsuleShapeSW : public ShapeSW {
real_t height;
real_t radius;
+ void _setup(real_t p_height, real_t p_radius);
- void _setup(real_t p_height,real_t p_radius);
public:
-
_FORCE_INLINE_ real_t get_height() const { return height; }
_FORCE_INLINE_ real_t get_radius() const { return radius; }
virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_CAPSULE; }
- virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const;
- virtual Vector3 get_support(const Vector3& p_normal) const;
- virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const;
- virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const;
+ virtual void project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const;
+ virtual Vector3 get_support(const Vector3 &p_normal) const;
+ virtual void get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const;
+ virtual bool intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const;
virtual Vector3 get_moment_of_inertia(float p_mass) const;
- virtual void set_data(const Variant& p_data);
+ virtual void set_data(const Variant &p_data);
virtual Variant get_data() const;
CapsuleShapeSW();
@@ -245,28 +240,26 @@ struct ConvexPolygonShapeSW : public ShapeSW {
Geometry::MeshData mesh;
- void _setup(const Vector<Vector3>& p_vertices);
-public:
+ void _setup(const Vector<Vector3> &p_vertices);
- const Geometry::MeshData& get_mesh() const { return mesh; }
+public:
+ const Geometry::MeshData &get_mesh() const { return mesh; }
virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_CONVEX_POLYGON; }
- virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const;
- virtual Vector3 get_support(const Vector3& p_normal) const;
- virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const;
- virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const;
+ virtual void project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const;
+ virtual Vector3 get_support(const Vector3 &p_normal) const;
+ virtual void get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const;
+ virtual bool intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const;
virtual Vector3 get_moment_of_inertia(float p_mass) const;
- virtual void set_data(const Variant& p_data);
+ virtual void set_data(const Variant &p_data);
virtual Variant get_data() const;
ConvexPolygonShapeSW();
-
};
-
struct _VolumeSW_BVH;
struct FaceShapeSW;
@@ -317,39 +310,35 @@ struct ConcavePolygonShapeSW : public ConcaveShapeSW {
Vector3 normal;
real_t min_d;
int collisions;
-
};
- void _cull_segment(int p_idx,_SegmentCullParams *p_params) const;
- void _cull(int p_idx,_CullParams *p_params) const;
-
- void _fill_bvh(_VolumeSW_BVH* p_bvh_tree,BVH* p_bvh_array,int& p_idx);
+ void _cull_segment(int p_idx, _SegmentCullParams *p_params) const;
+ void _cull(int p_idx, _CullParams *p_params) const;
+ void _fill_bvh(_VolumeSW_BVH *p_bvh_tree, BVH *p_bvh_array, int &p_idx);
void _setup(DVector<Vector3> p_faces);
-public:
+public:
DVector<Vector3> get_faces() const;
virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_CONCAVE_POLYGON; }
- virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const;
- virtual Vector3 get_support(const Vector3& p_normal) const;
+ virtual void project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const;
+ virtual Vector3 get_support(const Vector3 &p_normal) const;
- virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const;
+ virtual bool intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const;
- virtual void cull(const AABB& p_local_aabb,Callback p_callback,void* p_userdata) const;
+ virtual void cull(const AABB &p_local_aabb, Callback p_callback, void *p_userdata) const;
virtual Vector3 get_moment_of_inertia(float p_mass) const;
- virtual void set_data(const Variant& p_data);
+ virtual void set_data(const Variant &p_data);
virtual Variant get_data() const;
ConcavePolygonShapeSW();
-
};
-
struct HeightMapShapeSW : public ConcaveShapeSW {
DVector<real_t> heights;
@@ -357,12 +346,12 @@ struct HeightMapShapeSW : public ConcaveShapeSW {
int depth;
float cell_size;
-// void _cull_segment(int p_idx,_SegmentCullParams *p_params) const;
-// void _cull(int p_idx,_CullParams *p_params) const;
+ // void _cull_segment(int p_idx,_SegmentCullParams *p_params) const;
+ // void _cull(int p_idx,_CullParams *p_params) const;
- void _setup(DVector<float> p_heights,int p_width,int p_depth,float p_cell_size);
-public:
+ void _setup(DVector<float> p_heights, int p_width, int p_depth, float p_cell_size);
+public:
DVector<real_t> get_heights() const;
int get_width() const;
int get_depth() const;
@@ -370,19 +359,18 @@ public:
virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_HEIGHTMAP; }
- virtual void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const;
- virtual Vector3 get_support(const Vector3& p_normal) const;
- virtual bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const;
+ virtual void project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const;
+ virtual Vector3 get_support(const Vector3 &p_normal) const;
+ virtual bool intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const;
- virtual void cull(const AABB& p_local_aabb,Callback p_callback,void* p_userdata) const;
+ virtual void cull(const AABB &p_local_aabb, Callback p_callback, void *p_userdata) const;
virtual Vector3 get_moment_of_inertia(float p_mass) const;
- virtual void set_data(const Variant& p_data);
+ virtual void set_data(const Variant &p_data);
virtual Variant get_data() const;
HeightMapShapeSW();
-
};
//used internally
@@ -393,22 +381,21 @@ struct FaceShapeSW : public ShapeSW {
virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_CONCAVE_POLYGON; }
- const Vector3& get_vertex(int p_idx) const { return vertex[p_idx]; }
+ const Vector3 &get_vertex(int p_idx) const { return vertex[p_idx]; }
- void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const;
- Vector3 get_support(const Vector3& p_normal) const;
- virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const;
- bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const;
+ void project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const;
+ Vector3 get_support(const Vector3 &p_normal) const;
+ virtual void get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const;
+ bool intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const;
Vector3 get_moment_of_inertia(float p_mass) const;
- virtual void set_data(const Variant& p_data) {}
+ virtual void set_data(const Variant &p_data) {}
virtual Variant get_data() const { return Variant(); }
FaceShapeSW();
};
-
struct MotionShapeSW : public ShapeSW {
ShapeSW *shape;
@@ -416,56 +403,48 @@ struct MotionShapeSW : public ShapeSW {
virtual PhysicsServer::ShapeType get_type() const { return PhysicsServer::SHAPE_CONVEX_POLYGON; }
-
- void project_range(const Vector3& p_normal, const Transform& p_transform, real_t &r_min, real_t &r_max) const {
+ void project_range(const Vector3 &p_normal, const Transform &p_transform, real_t &r_min, real_t &r_max) const {
Vector3 cast = p_transform.basis.xform(motion);
- real_t mina,maxa;
- real_t minb,maxb;
+ real_t mina, maxa;
+ real_t minb, maxb;
Transform ofsb = p_transform;
- ofsb.origin+=cast;
- shape->project_range(p_normal,p_transform,mina,maxa);
- shape->project_range(p_normal,ofsb,minb,maxb);
- r_min=MIN(mina,minb);
- r_max=MAX(maxa,maxb);
+ ofsb.origin += cast;
+ shape->project_range(p_normal, p_transform, mina, maxa);
+ shape->project_range(p_normal, ofsb, minb, maxb);
+ r_min = MIN(mina, minb);
+ r_max = MAX(maxa, maxb);
}
- Vector3 get_support(const Vector3& p_normal) const {
+ Vector3 get_support(const Vector3 &p_normal) const {
Vector3 support = shape->get_support(p_normal);
- if (p_normal.dot(motion)>0) {
- support+=motion;
+ if (p_normal.dot(motion) > 0) {
+ support += motion;
}
return support;
}
- virtual void get_supports(const Vector3& p_normal,int p_max,Vector3 *r_supports,int & r_amount) const { r_amount=0; }
- bool intersect_segment(const Vector3& p_begin,const Vector3& p_end,Vector3 &r_result, Vector3 &r_normal) const { return false; }
+ virtual void get_supports(const Vector3 &p_normal, int p_max, Vector3 *r_supports, int &r_amount) const { r_amount = 0; }
+ bool intersect_segment(const Vector3 &p_begin, const Vector3 &p_end, Vector3 &r_result, Vector3 &r_normal) const { return false; }
Vector3 get_moment_of_inertia(float p_mass) const { return Vector3(); }
- virtual void set_data(const Variant& p_data) {}
+ virtual void set_data(const Variant &p_data) {}
virtual Variant get_data() const { return Variant(); }
- MotionShapeSW() { configure(AABB()); }
+ MotionShapeSW() { configure(AABB()); }
};
-
-
-
struct _ShapeTestConvexBSPSW {
const BSP_Tree *bsp;
const ShapeSW *shape;
Transform transform;
- _FORCE_INLINE_ void project_range(const Vector3& p_normal, real_t& r_min, real_t& r_max) const {
+ _FORCE_INLINE_ void project_range(const Vector3 &p_normal, real_t &r_min, real_t &r_max) const {
- shape->project_range(p_normal,transform,r_min,r_max);
+ shape->project_range(p_normal, transform, r_min, r_max);
}
-
};
-
-
-
#endif // SHAPESW_H
diff --git a/servers/physics/space_sw.cpp b/servers/physics/space_sw.cpp
index 237b6a7ce..06234ead5 100644
--- a/servers/physics/space_sw.cpp
+++ b/servers/physics/space_sw.cpp
@@ -26,66 +26,58 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
-#include "globals.h"
#include "space_sw.h"
#include "collision_solver_sw.h"
+#include "globals.h"
#include "physics_server_sw.h"
-
_FORCE_INLINE_ static bool _match_object_type_query(CollisionObjectSW *p_object, uint32_t p_layer_mask, uint32_t p_type_mask) {
- if (p_object->get_type()==CollisionObjectSW::TYPE_AREA)
- return p_type_mask&PhysicsDirectSpaceState::TYPE_MASK_AREA;
+ if (p_object->get_type() == CollisionObjectSW::TYPE_AREA)
+ return p_type_mask & PhysicsDirectSpaceState::TYPE_MASK_AREA;
- if ((p_object->get_layer_mask()&p_layer_mask)==0)
+ if ((p_object->get_layer_mask() & p_layer_mask) == 0)
return false;
- BodySW *body = static_cast<BodySW*>(p_object);
-
- return (1<<body->get_mode())&p_type_mask;
+ BodySW *body = static_cast<BodySW *>(p_object);
+ return (1 << body->get_mode()) & p_type_mask;
}
+bool PhysicsDirectSpaceStateSW::intersect_ray(const Vector3 &p_from, const Vector3 &p_to, RayResult &r_result, const Set<RID> &p_exclude, uint32_t p_layer_mask, uint32_t p_object_type_mask, bool p_pick_ray) {
-bool PhysicsDirectSpaceStateSW::intersect_ray(const Vector3& p_from, const Vector3& p_to, RayResult &r_result, const Set<RID>& p_exclude, uint32_t p_layer_mask, uint32_t p_object_type_mask, bool p_pick_ray) {
-
+ ERR_FAIL_COND_V(space->locked, false);
- ERR_FAIL_COND_V(space->locked,false);
-
- Vector3 begin,end;
+ Vector3 begin, end;
Vector3 normal;
- begin=p_from;
- end=p_to;
- normal=(end-begin).normalized();
-
-
- int amount = space->broadphase->cull_segment(begin,end,space->intersection_query_results,SpaceSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results);
+ begin = p_from;
+ end = p_to;
+ normal = (end - begin).normalized();
+ int amount = space->broadphase->cull_segment(begin, end, space->intersection_query_results, SpaceSW::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
//todo, create another array tha references results, compute AABBs and check closest point to ray origin, sort, and stop evaluating results when beyond first collision
- bool collided=false;
- Vector3 res_point,res_normal;
+ bool collided = false;
+ Vector3 res_point, res_normal;
int res_shape;
const CollisionObjectSW *res_obj;
- real_t min_d=1e10;
-
-
+ real_t min_d = 1e10;
- for(int i=0;i<amount;i++) {
+ for (int i = 0; i < amount; i++) {
- if (!_match_object_type_query(space->intersection_query_results[i],p_layer_mask,p_object_type_mask))
+ if (!_match_object_type_query(space->intersection_query_results[i], p_layer_mask, p_object_type_mask))
continue;
- if (p_pick_ray && !(static_cast<CollisionObjectSW*>(space->intersection_query_results[i])->is_ray_pickable()))
+ if (p_pick_ray && !(static_cast<CollisionObjectSW *>(space->intersection_query_results[i])->is_ray_pickable()))
continue;
- if (p_exclude.has( space->intersection_query_results[i]->get_self()))
+ if (p_exclude.has(space->intersection_query_results[i]->get_self()))
continue;
- const CollisionObjectSW *col_obj=space->intersection_query_results[i];
+ const CollisionObjectSW *col_obj = space->intersection_query_results[i];
- int shape_idx=space->intersection_query_subindex_results[i];
+ int shape_idx = space->intersection_query_subindex_results[i];
Transform inv_xform = col_obj->get_shape_inv_transform(shape_idx) * col_obj->get_inv_transform();
Vector3 local_from = inv_xform.xform(begin);
@@ -93,291 +85,266 @@ bool PhysicsDirectSpaceStateSW::intersect_ray(const Vector3& p_from, const Vecto
const ShapeSW *shape = col_obj->get_shape(shape_idx);
- Vector3 shape_point,shape_normal;
-
-
- if (shape->intersect_segment(local_from,local_to,shape_point,shape_normal)) {
-
+ Vector3 shape_point, shape_normal;
+ if (shape->intersect_segment(local_from, local_to, shape_point, shape_normal)) {
Transform xform = col_obj->get_transform() * col_obj->get_shape_transform(shape_idx);
- shape_point=xform.xform(shape_point);
+ shape_point = xform.xform(shape_point);
real_t ld = normal.dot(shape_point);
+ if (ld < min_d) {
- if (ld<min_d) {
-
- min_d=ld;
- res_point=shape_point;
- res_normal=inv_xform.basis.xform_inv(shape_normal).normalized();
- res_shape=shape_idx;
- res_obj=col_obj;
- collided=true;
+ min_d = ld;
+ res_point = shape_point;
+ res_normal = inv_xform.basis.xform_inv(shape_normal).normalized();
+ res_shape = shape_idx;
+ res_obj = col_obj;
+ collided = true;
}
}
-
}
if (!collided)
return false;
-
- r_result.collider_id=res_obj->get_instance_id();
- if (r_result.collider_id!=0)
- r_result.collider=ObjectDB::get_instance(r_result.collider_id);
+ r_result.collider_id = res_obj->get_instance_id();
+ if (r_result.collider_id != 0)
+ r_result.collider = ObjectDB::get_instance(r_result.collider_id);
else
- r_result.collider=NULL;
- r_result.normal=res_normal;
- r_result.position=res_point;
- r_result.rid=res_obj->get_self();
- r_result.shape=res_shape;
+ r_result.collider = NULL;
+ r_result.normal = res_normal;
+ r_result.position = res_point;
+ r_result.rid = res_obj->get_self();
+ r_result.shape = res_shape;
return true;
-
}
+int PhysicsDirectSpaceStateSW::intersect_shape(const RID &p_shape, const Transform &p_xform, float p_margin, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude, uint32_t p_layer_mask, uint32_t p_object_type_mask) {
-int PhysicsDirectSpaceStateSW::intersect_shape(const RID& p_shape, const Transform& p_xform,float p_margin,ShapeResult *r_results,int p_result_max,const Set<RID>& p_exclude,uint32_t p_layer_mask,uint32_t p_object_type_mask) {
-
- if (p_result_max<=0)
+ if (p_result_max <= 0)
return 0;
- ShapeSW *shape = static_cast<PhysicsServerSW*>(PhysicsServer::get_singleton())->shape_owner.get(p_shape);
- ERR_FAIL_COND_V(!shape,0);
+ ShapeSW *shape = static_cast<PhysicsServerSW *>(PhysicsServer::get_singleton())->shape_owner.get(p_shape);
+ ERR_FAIL_COND_V(!shape, 0);
AABB aabb = p_xform.xform(shape->get_aabb());
- int amount = space->broadphase->cull_aabb(aabb,space->intersection_query_results,SpaceSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results);
+ int amount = space->broadphase->cull_aabb(aabb, space->intersection_query_results, SpaceSW::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
- int cc=0;
+ int cc = 0;
//Transform ai = p_xform.affine_inverse();
- for(int i=0;i<amount;i++) {
+ for (int i = 0; i < amount; i++) {
- if (cc>=p_result_max)
+ if (cc >= p_result_max)
break;
- if (!_match_object_type_query(space->intersection_query_results[i],p_layer_mask,p_object_type_mask))
+ if (!_match_object_type_query(space->intersection_query_results[i], p_layer_mask, p_object_type_mask))
continue;
//area cant be picked by ray (default)
- if (p_exclude.has( space->intersection_query_results[i]->get_self()))
+ if (p_exclude.has(space->intersection_query_results[i]->get_self()))
continue;
+ const CollisionObjectSW *col_obj = space->intersection_query_results[i];
+ int shape_idx = space->intersection_query_subindex_results[i];
- const CollisionObjectSW *col_obj=space->intersection_query_results[i];
- int shape_idx=space->intersection_query_subindex_results[i];
-
- if (!CollisionSolverSW::solve_static(shape,p_xform,col_obj->get_shape(shape_idx),col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), NULL,NULL,NULL,p_margin,0))
+ if (!CollisionSolverSW::solve_static(shape, p_xform, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), NULL, NULL, NULL, p_margin, 0))
continue;
if (r_results) {
- r_results[cc].collider_id=col_obj->get_instance_id();
- if (r_results[cc].collider_id!=0)
- r_results[cc].collider=ObjectDB::get_instance(r_results[cc].collider_id);
+ r_results[cc].collider_id = col_obj->get_instance_id();
+ if (r_results[cc].collider_id != 0)
+ r_results[cc].collider = ObjectDB::get_instance(r_results[cc].collider_id);
else
- r_results[cc].collider=NULL;
- r_results[cc].rid=col_obj->get_self();
- r_results[cc].shape=shape_idx;
+ r_results[cc].collider = NULL;
+ r_results[cc].rid = col_obj->get_self();
+ r_results[cc].shape = shape_idx;
}
cc++;
-
}
return cc;
-
}
+bool PhysicsDirectSpaceStateSW::cast_motion(const RID &p_shape, const Transform &p_xform, const Vector3 &p_motion, float p_margin, float &p_closest_safe, float &p_closest_unsafe, const Set<RID> &p_exclude, uint32_t p_layer_mask, uint32_t p_object_type_mask, ShapeRestInfo *r_info) {
-bool PhysicsDirectSpaceStateSW::cast_motion(const RID& p_shape, const Transform& p_xform,const Vector3& p_motion,float p_margin,float &p_closest_safe,float &p_closest_unsafe, const Set<RID>& p_exclude,uint32_t p_layer_mask,uint32_t p_object_type_mask,ShapeRestInfo *r_info) {
-
-
-
- ShapeSW *shape = static_cast<PhysicsServerSW*>(PhysicsServer::get_singleton())->shape_owner.get(p_shape);
- ERR_FAIL_COND_V(!shape,false);
+ ShapeSW *shape = static_cast<PhysicsServerSW *>(PhysicsServer::get_singleton())->shape_owner.get(p_shape);
+ ERR_FAIL_COND_V(!shape, false);
AABB aabb = p_xform.xform(shape->get_aabb());
- aabb=aabb.merge(AABB(aabb.pos+p_motion,aabb.size)); //motion
- aabb=aabb.grow(p_margin);
+ aabb = aabb.merge(AABB(aabb.pos + p_motion, aabb.size)); //motion
+ aabb = aabb.grow(p_margin);
//if (p_motion!=Vector3())
// print_line(p_motion);
- int amount = space->broadphase->cull_aabb(aabb,space->intersection_query_results,SpaceSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results);
+ int amount = space->broadphase->cull_aabb(aabb, space->intersection_query_results, SpaceSW::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
- float best_safe=1;
- float best_unsafe=1;
+ float best_safe = 1;
+ float best_unsafe = 1;
Transform xform_inv = p_xform.affine_inverse();
MotionShapeSW mshape;
- mshape.shape=shape;
- mshape.motion=xform_inv.basis.xform(p_motion);
+ mshape.shape = shape;
+ mshape.motion = xform_inv.basis.xform(p_motion);
- bool best_first=true;
+ bool best_first = true;
- Vector3 closest_A,closest_B;
+ Vector3 closest_A, closest_B;
- for(int i=0;i<amount;i++) {
+ for (int i = 0; i < amount; i++) {
-
- if (!_match_object_type_query(space->intersection_query_results[i],p_layer_mask,p_object_type_mask))
+ if (!_match_object_type_query(space->intersection_query_results[i], p_layer_mask, p_object_type_mask))
continue;
- if (p_exclude.has( space->intersection_query_results[i]->get_self()))
+ if (p_exclude.has(space->intersection_query_results[i]->get_self()))
continue; //ignore excluded
+ const CollisionObjectSW *col_obj = space->intersection_query_results[i];
+ int shape_idx = space->intersection_query_subindex_results[i];
- const CollisionObjectSW *col_obj=space->intersection_query_results[i];
- int shape_idx=space->intersection_query_subindex_results[i];
-
- Vector3 point_A,point_B;
- Vector3 sep_axis=p_motion.normalized();
+ Vector3 point_A, point_B;
+ Vector3 sep_axis = p_motion.normalized();
Transform col_obj_xform = col_obj->get_transform() * col_obj->get_shape_transform(shape_idx);
//test initial overlap, does it collide if going all the way?
- if (CollisionSolverSW::solve_distance(&mshape,p_xform,col_obj->get_shape(shape_idx),col_obj_xform,point_A,point_B,aabb,&sep_axis)) {
+ if (CollisionSolverSW::solve_distance(&mshape, p_xform, col_obj->get_shape(shape_idx), col_obj_xform, point_A, point_B, aabb, &sep_axis)) {
//print_line("failed motion cast (no collision)");
continue;
}
-
- //test initial overlap
+//test initial overlap
#if 0
if (CollisionSolverSW::solve_static(shape,p_xform,col_obj->get_shape(shape_idx),col_obj_xform,NULL,NULL,&sep_axis)) {
print_line("failed initial cast (collision at begining)");
return false;
}
#else
- sep_axis=p_motion.normalized();
+ sep_axis = p_motion.normalized();
- if (!CollisionSolverSW::solve_distance(shape,p_xform,col_obj->get_shape(shape_idx),col_obj_xform,point_A,point_B,aabb,&sep_axis)) {
+ if (!CollisionSolverSW::solve_distance(shape, p_xform, col_obj->get_shape(shape_idx), col_obj_xform, point_A, point_B, aabb, &sep_axis)) {
//print_line("failed motion cast (no collision)");
return false;
}
#endif
-
//just do kinematic solving
- float low=0;
- float hi=1;
- Vector3 mnormal=p_motion.normalized();
+ float low = 0;
+ float hi = 1;
+ Vector3 mnormal = p_motion.normalized();
- for(int i=0;i<8;i++) { //steps should be customizable..
+ for (int i = 0; i < 8; i++) { //steps should be customizable..
- float ofs = (low+hi)*0.5;
+ float ofs = (low + hi) * 0.5;
- Vector3 sep=mnormal; //important optimization for this to work fast enough
+ Vector3 sep = mnormal; //important optimization for this to work fast enough
- mshape.motion=xform_inv.basis.xform(p_motion*ofs);
+ mshape.motion = xform_inv.basis.xform(p_motion * ofs);
- Vector3 lA,lB;
+ Vector3 lA, lB;
- bool collided = !CollisionSolverSW::solve_distance(&mshape,p_xform,col_obj->get_shape(shape_idx),col_obj_xform,lA,lB,aabb,&sep);
+ bool collided = !CollisionSolverSW::solve_distance(&mshape, p_xform, col_obj->get_shape(shape_idx), col_obj_xform, lA, lB, aabb, &sep);
if (collided) {
//print_line(itos(i)+": "+rtos(ofs));
- hi=ofs;
+ hi = ofs;
} else {
- point_A=lA;
- point_B=lB;
- low=ofs;
+ point_A = lA;
+ point_B = lB;
+ low = ofs;
}
}
- if (low<best_safe) {
- best_first=true; //force reset
- best_safe=low;
- best_unsafe=hi;
+ if (low < best_safe) {
+ best_first = true; //force reset
+ best_safe = low;
+ best_unsafe = hi;
}
- if (r_info && (best_first || (point_A.distance_squared_to(point_B) < closest_A.distance_squared_to(closest_B) && low<=best_safe))) {
- closest_A=point_A;
- closest_B=point_B;
- r_info->collider_id=col_obj->get_instance_id();
- r_info->rid=col_obj->get_self();
- r_info->shape=shape_idx;
- r_info->point=closest_B;
- r_info->normal=(closest_A-closest_B).normalized();
- best_first=false;
- if (col_obj->get_type()==CollisionObjectSW::TYPE_BODY) {
- const BodySW *body=static_cast<const BodySW*>(col_obj);
- r_info->linear_velocity= body->get_linear_velocity() + (body->get_angular_velocity()).cross(body->get_transform().origin - closest_B);
+ if (r_info && (best_first || (point_A.distance_squared_to(point_B) < closest_A.distance_squared_to(closest_B) && low <= best_safe))) {
+ closest_A = point_A;
+ closest_B = point_B;
+ r_info->collider_id = col_obj->get_instance_id();
+ r_info->rid = col_obj->get_self();
+ r_info->shape = shape_idx;
+ r_info->point = closest_B;
+ r_info->normal = (closest_A - closest_B).normalized();
+ best_first = false;
+ if (col_obj->get_type() == CollisionObjectSW::TYPE_BODY) {
+ const BodySW *body = static_cast<const BodySW *>(col_obj);
+ r_info->linear_velocity = body->get_linear_velocity() + (body->get_angular_velocity()).cross(body->get_transform().origin - closest_B);
}
-
}
-
-
}
- p_closest_safe=best_safe;
- p_closest_unsafe=best_unsafe;
+ p_closest_safe = best_safe;
+ p_closest_unsafe = best_unsafe;
return true;
}
-bool PhysicsDirectSpaceStateSW::collide_shape(RID p_shape, const Transform& p_shape_xform,float p_margin,Vector3 *r_results,int p_result_max,int &r_result_count, const Set<RID>& p_exclude,uint32_t p_layer_mask,uint32_t p_object_type_mask){
+bool PhysicsDirectSpaceStateSW::collide_shape(RID p_shape, const Transform &p_shape_xform, float p_margin, Vector3 *r_results, int p_result_max, int &r_result_count, const Set<RID> &p_exclude, uint32_t p_layer_mask, uint32_t p_object_type_mask) {
- if (p_result_max<=0)
+ if (p_result_max <= 0)
return 0;
- ShapeSW *shape = static_cast<PhysicsServerSW*>(PhysicsServer::get_singleton())->shape_owner.get(p_shape);
- ERR_FAIL_COND_V(!shape,0);
+ ShapeSW *shape = static_cast<PhysicsServerSW *>(PhysicsServer::get_singleton())->shape_owner.get(p_shape);
+ ERR_FAIL_COND_V(!shape, 0);
AABB aabb = p_shape_xform.xform(shape->get_aabb());
- aabb=aabb.grow(p_margin);
+ aabb = aabb.grow(p_margin);
- int amount = space->broadphase->cull_aabb(aabb,space->intersection_query_results,SpaceSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results);
+ int amount = space->broadphase->cull_aabb(aabb, space->intersection_query_results, SpaceSW::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
- bool collided=false;
- r_result_count=0;
+ bool collided = false;
+ r_result_count = 0;
PhysicsServerSW::CollCbkData cbk;
- cbk.max=p_result_max;
- cbk.amount=0;
- cbk.ptr=r_results;
- CollisionSolverSW::CallbackResult cbkres=NULL;
+ cbk.max = p_result_max;
+ cbk.amount = 0;
+ cbk.ptr = r_results;
+ CollisionSolverSW::CallbackResult cbkres = NULL;
- PhysicsServerSW::CollCbkData *cbkptr=NULL;
- if (p_result_max>0) {
- cbkptr=&cbk;
- cbkres=PhysicsServerSW::_shape_col_cbk;
+ PhysicsServerSW::CollCbkData *cbkptr = NULL;
+ if (p_result_max > 0) {
+ cbkptr = &cbk;
+ cbkres = PhysicsServerSW::_shape_col_cbk;
}
+ for (int i = 0; i < amount; i++) {
- for(int i=0;i<amount;i++) {
-
- if (!_match_object_type_query(space->intersection_query_results[i],p_layer_mask,p_object_type_mask))
+ if (!_match_object_type_query(space->intersection_query_results[i], p_layer_mask, p_object_type_mask))
continue;
- const CollisionObjectSW *col_obj=space->intersection_query_results[i];
- int shape_idx=space->intersection_query_subindex_results[i];
+ const CollisionObjectSW *col_obj = space->intersection_query_results[i];
+ int shape_idx = space->intersection_query_subindex_results[i];
- if (p_exclude.has( col_obj->get_self() )) {
+ if (p_exclude.has(col_obj->get_self())) {
continue;
}
//print_line("AGAINST: "+itos(col_obj->get_self().get_id())+":"+itos(shape_idx));
//print_line("THE ABBB: "+(col_obj->get_transform() * col_obj->get_shape_transform(shape_idx)).xform(col_obj->get_shape(shape_idx)->get_aabb()));
- if (CollisionSolverSW::solve_static(shape,p_shape_xform,col_obj->get_shape(shape_idx),col_obj->get_transform() * col_obj->get_shape_transform(shape_idx),cbkres,cbkptr,NULL,p_margin)) {
- collided=true;
+ if (CollisionSolverSW::solve_static(shape, p_shape_xform, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), cbkres, cbkptr, NULL, p_margin)) {
+ collided = true;
}
-
}
- r_result_count=cbk.amount;
+ r_result_count = cbk.amount;
return collided;
-
}
-
struct _RestCallbackData {
const CollisionObjectSW *object;
@@ -389,173 +356,147 @@ struct _RestCallbackData {
float best_len;
};
-static void _rest_cbk_result(const Vector3& p_point_A,const Vector3& p_point_B,void *p_userdata) {
-
+static void _rest_cbk_result(const Vector3 &p_point_A, const Vector3 &p_point_B, void *p_userdata) {
- _RestCallbackData *rd=(_RestCallbackData*)p_userdata;
+ _RestCallbackData *rd = (_RestCallbackData *)p_userdata;
Vector3 contact_rel = p_point_B - p_point_A;
float len = contact_rel.length();
if (len <= rd->best_len)
return;
- rd->best_len=len;
- rd->best_contact=p_point_B;
- rd->best_normal=contact_rel/len;
- rd->best_object=rd->object;
- rd->best_shape=rd->shape;
-
+ rd->best_len = len;
+ rd->best_contact = p_point_B;
+ rd->best_normal = contact_rel / len;
+ rd->best_object = rd->object;
+ rd->best_shape = rd->shape;
}
-bool PhysicsDirectSpaceStateSW::rest_info(RID p_shape, const Transform& p_shape_xform,float p_margin,ShapeRestInfo *r_info, const Set<RID>& p_exclude,uint32_t p_layer_mask,uint32_t p_object_type_mask) {
-
+bool PhysicsDirectSpaceStateSW::rest_info(RID p_shape, const Transform &p_shape_xform, float p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude, uint32_t p_layer_mask, uint32_t p_object_type_mask) {
- ShapeSW *shape = static_cast<PhysicsServerSW*>(PhysicsServer::get_singleton())->shape_owner.get(p_shape);
- ERR_FAIL_COND_V(!shape,0);
+ ShapeSW *shape = static_cast<PhysicsServerSW *>(PhysicsServer::get_singleton())->shape_owner.get(p_shape);
+ ERR_FAIL_COND_V(!shape, 0);
AABB aabb = p_shape_xform.xform(shape->get_aabb());
- aabb=aabb.grow(p_margin);
+ aabb = aabb.grow(p_margin);
- int amount = space->broadphase->cull_aabb(aabb,space->intersection_query_results,SpaceSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results);
+ int amount = space->broadphase->cull_aabb(aabb, space->intersection_query_results, SpaceSW::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
_RestCallbackData rcd;
- rcd.best_len=0;
- rcd.best_object=NULL;
- rcd.best_shape=0;
+ rcd.best_len = 0;
+ rcd.best_object = NULL;
+ rcd.best_shape = 0;
- for(int i=0;i<amount;i++) {
+ for (int i = 0; i < amount; i++) {
-
- if (!_match_object_type_query(space->intersection_query_results[i],p_layer_mask,p_object_type_mask))
+ if (!_match_object_type_query(space->intersection_query_results[i], p_layer_mask, p_object_type_mask))
continue;
- const CollisionObjectSW *col_obj=space->intersection_query_results[i];
- int shape_idx=space->intersection_query_subindex_results[i];
+ const CollisionObjectSW *col_obj = space->intersection_query_results[i];
+ int shape_idx = space->intersection_query_subindex_results[i];
- if (p_exclude.has( col_obj->get_self() ))
+ if (p_exclude.has(col_obj->get_self()))
continue;
- rcd.object=col_obj;
- rcd.shape=shape_idx;
- bool sc = CollisionSolverSW::solve_static(shape,p_shape_xform,col_obj->get_shape(shape_idx),col_obj->get_transform() * col_obj->get_shape_transform(shape_idx),_rest_cbk_result,&rcd,NULL,p_margin);
+ rcd.object = col_obj;
+ rcd.shape = shape_idx;
+ bool sc = CollisionSolverSW::solve_static(shape, p_shape_xform, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), _rest_cbk_result, &rcd, NULL, p_margin);
if (!sc)
continue;
-
-
}
- if (rcd.best_len==0)
+ if (rcd.best_len == 0)
return false;
- r_info->collider_id=rcd.best_object->get_instance_id();
- r_info->shape=rcd.best_shape;
- r_info->normal=rcd.best_normal;
- r_info->point=rcd.best_contact;
- r_info->rid=rcd.best_object->get_self();
- if (rcd.best_object->get_type()==CollisionObjectSW::TYPE_BODY) {
+ r_info->collider_id = rcd.best_object->get_instance_id();
+ r_info->shape = rcd.best_shape;
+ r_info->normal = rcd.best_normal;
+ r_info->point = rcd.best_contact;
+ r_info->rid = rcd.best_object->get_self();
+ if (rcd.best_object->get_type() == CollisionObjectSW::TYPE_BODY) {
- const BodySW *body = static_cast<const BodySW*>(rcd.best_object);
+ const BodySW *body = static_cast<const BodySW *>(rcd.best_object);
r_info->linear_velocity = body->get_linear_velocity() +
- (body->get_angular_velocity()).cross(body->get_transform().origin-rcd.best_contact);// * mPos);
-
+ (body->get_angular_velocity()).cross(body->get_transform().origin - rcd.best_contact); // * mPos);
} else {
- r_info->linear_velocity=Vector3();
+ r_info->linear_velocity = Vector3();
}
return true;
}
-
PhysicsDirectSpaceStateSW::PhysicsDirectSpaceStateSW() {
-
- space=NULL;
+ space = NULL;
}
-
////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void *SpaceSW::_broadphase_pair(CollisionObjectSW *A, int p_subindex_A, CollisionObjectSW *B, int p_subindex_B, void *p_self) {
+ CollisionObjectSW::Type type_A = A->get_type();
+ CollisionObjectSW::Type type_B = B->get_type();
+ if (type_A > type_B) {
-
-
-
-
-
-
-
-void* SpaceSW::_broadphase_pair(CollisionObjectSW *A,int p_subindex_A,CollisionObjectSW *B,int p_subindex_B,void *p_self) {
-
- CollisionObjectSW::Type type_A=A->get_type();
- CollisionObjectSW::Type type_B=B->get_type();
- if (type_A>type_B) {
-
- SWAP(A,B);
- SWAP(p_subindex_A,p_subindex_B);
- SWAP(type_A,type_B);
+ SWAP(A, B);
+ SWAP(p_subindex_A, p_subindex_B);
+ SWAP(type_A, type_B);
}
- SpaceSW *self = (SpaceSW*)p_self;
+ SpaceSW *self = (SpaceSW *)p_self;
self->collision_pairs++;
- if (type_A==CollisionObjectSW::TYPE_AREA) {
+ if (type_A == CollisionObjectSW::TYPE_AREA) {
- AreaSW *area=static_cast<AreaSW*>(A);
- if (type_B==CollisionObjectSW::TYPE_AREA) {
+ AreaSW *area = static_cast<AreaSW *>(A);
+ if (type_B == CollisionObjectSW::TYPE_AREA) {
- AreaSW *area_b=static_cast<AreaSW*>(B);
- Area2PairSW *area2_pair = memnew(Area2PairSW(area_b,p_subindex_B,area,p_subindex_A) );
+ AreaSW *area_b = static_cast<AreaSW *>(B);
+ Area2PairSW *area2_pair = memnew(Area2PairSW(area_b, p_subindex_B, area, p_subindex_A));
return area2_pair;
} else {
- BodySW *body=static_cast<BodySW*>(B);
- AreaPairSW *area_pair = memnew(AreaPairSW(body,p_subindex_B,area,p_subindex_A) );
+ BodySW *body = static_cast<BodySW *>(B);
+ AreaPairSW *area_pair = memnew(AreaPairSW(body, p_subindex_B, area, p_subindex_A));
return area_pair;
}
} else {
-
- BodyPairSW *b = memnew( BodyPairSW((BodySW*)A,p_subindex_A,(BodySW*)B,p_subindex_B) );
+ BodyPairSW *b = memnew(BodyPairSW((BodySW *)A, p_subindex_A, (BodySW *)B, p_subindex_B));
return b;
-
}
return NULL;
}
-void SpaceSW::_broadphase_unpair(CollisionObjectSW *A,int p_subindex_A,CollisionObjectSW *B,int p_subindex_B,void *p_data,void *p_self) {
-
+void SpaceSW::_broadphase_unpair(CollisionObjectSW *A, int p_subindex_A, CollisionObjectSW *B, int p_subindex_B, void *p_data, void *p_self) {
-
- SpaceSW *self = (SpaceSW*)p_self;
+ SpaceSW *self = (SpaceSW *)p_self;
self->collision_pairs--;
- ConstraintSW *c = (ConstraintSW*)p_data;
+ ConstraintSW *c = (ConstraintSW *)p_data;
memdelete(c);
}
-
-const SelfList<BodySW>::List& SpaceSW::get_active_body_list() const {
+const SelfList<BodySW>::List &SpaceSW::get_active_body_list() const {
return active_list;
}
-void SpaceSW::body_add_to_active_list(SelfList<BodySW>* p_body) {
+void SpaceSW::body_add_to_active_list(SelfList<BodySW> *p_body) {
active_list.add(p_body);
}
-void SpaceSW::body_remove_from_active_list(SelfList<BodySW>* p_body) {
+void SpaceSW::body_remove_from_active_list(SelfList<BodySW> *p_body) {
active_list.remove(p_body);
-
}
-void SpaceSW::body_add_to_inertia_update_list(SelfList<BodySW>* p_body) {
-
+void SpaceSW::body_add_to_inertia_update_list(SelfList<BodySW> *p_body) {
inertia_update_list.add(p_body);
}
-void SpaceSW::body_remove_from_inertia_update_list(SelfList<BodySW>* p_body) {
+void SpaceSW::body_remove_from_inertia_update_list(SelfList<BodySW> *p_body) {
inertia_update_list.remove(p_body);
}
@@ -567,112 +508,103 @@ BroadPhaseSW *SpaceSW::get_broadphase() {
void SpaceSW::add_object(CollisionObjectSW *p_object) {
- ERR_FAIL_COND( objects.has(p_object) );
+ ERR_FAIL_COND(objects.has(p_object));
objects.insert(p_object);
}
void SpaceSW::remove_object(CollisionObjectSW *p_object) {
- ERR_FAIL_COND( !objects.has(p_object) );
+ ERR_FAIL_COND(!objects.has(p_object));
objects.erase(p_object);
}
-const Set<CollisionObjectSW*> &SpaceSW::get_objects() const {
+const Set<CollisionObjectSW *> &SpaceSW::get_objects() const {
return objects;
}
-void SpaceSW::body_add_to_state_query_list(SelfList<BodySW>* p_body) {
+void SpaceSW::body_add_to_state_query_list(SelfList<BodySW> *p_body) {
state_query_list.add(p_body);
}
-void SpaceSW::body_remove_from_state_query_list(SelfList<BodySW>* p_body) {
+void SpaceSW::body_remove_from_state_query_list(SelfList<BodySW> *p_body) {
state_query_list.remove(p_body);
}
-void SpaceSW::area_add_to_monitor_query_list(SelfList<AreaSW>* p_area) {
+void SpaceSW::area_add_to_monitor_query_list(SelfList<AreaSW> *p_area) {
monitor_query_list.add(p_area);
}
-void SpaceSW::area_remove_from_monitor_query_list(SelfList<AreaSW>* p_area) {
+void SpaceSW::area_remove_from_monitor_query_list(SelfList<AreaSW> *p_area) {
monitor_query_list.remove(p_area);
}
-void SpaceSW::area_add_to_moved_list(SelfList<AreaSW>* p_area) {
+void SpaceSW::area_add_to_moved_list(SelfList<AreaSW> *p_area) {
area_moved_list.add(p_area);
}
-void SpaceSW::area_remove_from_moved_list(SelfList<AreaSW>* p_area) {
+void SpaceSW::area_remove_from_moved_list(SelfList<AreaSW> *p_area) {
area_moved_list.remove(p_area);
}
-const SelfList<AreaSW>::List& SpaceSW::get_moved_area_list() const {
+const SelfList<AreaSW>::List &SpaceSW::get_moved_area_list() const {
return area_moved_list;
}
-
-
-
void SpaceSW::call_queries() {
- while(state_query_list.first()) {
+ while (state_query_list.first()) {
- BodySW * b = state_query_list.first()->self();
+ BodySW *b = state_query_list.first()->self();
b->call_queries();
state_query_list.remove(state_query_list.first());
}
- while(monitor_query_list.first()) {
+ while (monitor_query_list.first()) {
- AreaSW * a = monitor_query_list.first()->self();
+ AreaSW *a = monitor_query_list.first()->self();
a->call_queries();
monitor_query_list.remove(monitor_query_list.first());
}
-
}
void SpaceSW::setup() {
- contact_debug_count=0;
- while(inertia_update_list.first()) {
+ contact_debug_count = 0;
+ while (inertia_update_list.first()) {
inertia_update_list.first()->self()->update_inertias();
inertia_update_list.remove(inertia_update_list.first());
}
-
-
}
void SpaceSW::update() {
-
broadphase->update();
-
}
-
void SpaceSW::set_param(PhysicsServer::SpaceParameter p_param, real_t p_value) {
- switch(p_param) {
+ switch (p_param) {
- case PhysicsServer::SPACE_PARAM_CONTACT_RECYCLE_RADIUS: contact_recycle_radius=p_value; break;
- case PhysicsServer::SPACE_PARAM_CONTACT_MAX_SEPARATION: contact_max_separation=p_value; break;
- case PhysicsServer::SPACE_PARAM_BODY_MAX_ALLOWED_PENETRATION: contact_max_allowed_penetration=p_value; break;
- case PhysicsServer::SPACE_PARAM_BODY_LINEAR_VELOCITY_SLEEP_TRESHOLD: body_linear_velocity_sleep_threshold=p_value; break;
- case PhysicsServer::SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_TRESHOLD: body_angular_velocity_sleep_threshold=p_value; break;
- case PhysicsServer::SPACE_PARAM_BODY_TIME_TO_SLEEP: body_time_to_sleep=p_value; break;
- case PhysicsServer::SPACE_PARAM_BODY_ANGULAR_VELOCITY_DAMP_RATIO: body_angular_velocity_damp_ratio=p_value; break;
- case PhysicsServer::SPACE_PARAM_CONSTRAINT_DEFAULT_BIAS: constraint_bias=p_value; break;
+ case PhysicsServer::SPACE_PARAM_CONTACT_RECYCLE_RADIUS: contact_recycle_radius = p_value; break;
+ case PhysicsServer::SPACE_PARAM_CONTACT_MAX_SEPARATION: contact_max_separation = p_value; break;
+ case PhysicsServer::SPACE_PARAM_BODY_MAX_ALLOWED_PENETRATION: contact_max_allowed_penetration = p_value; break;
+ case PhysicsServer::SPACE_PARAM_BODY_LINEAR_VELOCITY_SLEEP_TRESHOLD: body_linear_velocity_sleep_threshold = p_value; break;
+ case PhysicsServer::SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_TRESHOLD: body_angular_velocity_sleep_threshold = p_value; break;
+ case PhysicsServer::SPACE_PARAM_BODY_TIME_TO_SLEEP: body_time_to_sleep = p_value; break;
+ case PhysicsServer::SPACE_PARAM_BODY_ANGULAR_VELOCITY_DAMP_RATIO: body_angular_velocity_damp_ratio = p_value; break;
+ case PhysicsServer::SPACE_PARAM_CONSTRAINT_DEFAULT_BIAS: constraint_bias = p_value; break;
}
}
real_t SpaceSW::get_param(PhysicsServer::SpaceParameter p_param) const {
- switch(p_param) {
+ switch (p_param) {
case PhysicsServer::SPACE_PARAM_CONTACT_RECYCLE_RADIUS: return contact_recycle_radius;
case PhysicsServer::SPACE_PARAM_CONTACT_MAX_SEPARATION: return contact_max_separation;
@@ -688,12 +620,12 @@ real_t SpaceSW::get_param(PhysicsServer::SpaceParameter p_param) const {
void SpaceSW::lock() {
- locked=true;
+ locked = true;
}
void SpaceSW::unlock() {
- locked=false;
+ locked = false;
}
bool SpaceSW::is_locked() const {
@@ -708,41 +640,36 @@ PhysicsDirectSpaceStateSW *SpaceSW::get_direct_state() {
SpaceSW::SpaceSW() {
- collision_pairs=0;
- active_objects=0;
- island_count=0;
- contact_debug_count=0;
+ collision_pairs = 0;
+ active_objects = 0;
+ island_count = 0;
+ contact_debug_count = 0;
- locked=false;
- contact_recycle_radius=0.01;
- contact_max_separation=0.05;
- contact_max_allowed_penetration= 0.01;
+ locked = false;
+ contact_recycle_radius = 0.01;
+ contact_max_separation = 0.05;
+ contact_max_allowed_penetration = 0.01;
constraint_bias = 0.01;
- body_linear_velocity_sleep_threshold=GLOBAL_DEF("physics/sleep_threshold_linear",0.1);
- body_angular_velocity_sleep_threshold=GLOBAL_DEF("physics/sleep_threshold_angular", (8.0 / 180.0 * Math_PI) );
- body_time_to_sleep=GLOBAL_DEF("physics/time_before_sleep",0.5);
- body_angular_velocity_damp_ratio=10;
-
+ body_linear_velocity_sleep_threshold = GLOBAL_DEF("physics/sleep_threshold_linear", 0.1);
+ body_angular_velocity_sleep_threshold = GLOBAL_DEF("physics/sleep_threshold_angular", (8.0 / 180.0 * Math_PI));
+ body_time_to_sleep = GLOBAL_DEF("physics/time_before_sleep", 0.5);
+ body_angular_velocity_damp_ratio = 10;
broadphase = BroadPhaseSW::create_func();
- broadphase->set_pair_callback(_broadphase_pair,this);
- broadphase->set_unpair_callback(_broadphase_unpair,this);
- area=NULL;
+ broadphase->set_pair_callback(_broadphase_pair, this);
+ broadphase->set_unpair_callback(_broadphase_unpair, this);
+ area = NULL;
- direct_access = memnew( PhysicsDirectSpaceStateSW );
- direct_access->space=this;
-
- for(int i=0;i<ELAPSED_TIME_MAX;i++)
- elapsed_time[i]=0;
+ direct_access = memnew(PhysicsDirectSpaceStateSW);
+ direct_access->space = this;
+ for (int i = 0; i < ELAPSED_TIME_MAX; i++)
+ elapsed_time[i] = 0;
}
SpaceSW::~SpaceSW() {
memdelete(broadphase);
- memdelete( direct_access );
+ memdelete(direct_access);
}
-
-
-
diff --git a/servers/physics/space_sw.h b/servers/physics/space_sw.h
index 1180d787e..b5bc1ab5a 100644
--- a/servers/physics/space_sw.h
+++ b/servers/physics/space_sw.h
@@ -29,39 +29,35 @@
#ifndef SPACE_SW_H
#define SPACE_SW_H
-#include "typedefs.h"
-#include "hash_map.h"
-#include "body_sw.h"
+#include "area_pair_sw.h"
#include "area_sw.h"
#include "body_pair_sw.h"
-#include "area_pair_sw.h"
+#include "body_sw.h"
#include "broad_phase_sw.h"
#include "collision_object_sw.h"
#include "globals.h"
-
+#include "hash_map.h"
+#include "typedefs.h"
class PhysicsDirectSpaceStateSW : public PhysicsDirectSpaceState {
- OBJ_TYPE( PhysicsDirectSpaceStateSW, PhysicsDirectSpaceState );
-public:
+ OBJ_TYPE(PhysicsDirectSpaceStateSW, PhysicsDirectSpaceState);
+public:
SpaceSW *space;
- virtual bool intersect_ray(const Vector3& p_from, const Vector3& p_to,RayResult &r_result,const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION,bool p_pick_ray=false);
- virtual int intersect_shape(const RID& p_shape, const Transform& p_xform,float p_margin,ShapeResult *r_results,int p_result_max,const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION);
- virtual bool cast_motion(const RID& p_shape, const Transform& p_xform,const Vector3& p_motion,float p_margin,float &p_closest_safe,float &p_closest_unsafe, const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION,ShapeRestInfo *r_info=NULL);
- virtual bool collide_shape(RID p_shape, const Transform& p_shape_xform,float p_margin,Vector3 *r_results,int p_result_max,int &r_result_count, const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION);
- virtual bool rest_info(RID p_shape, const Transform& p_shape_xform,float p_margin,ShapeRestInfo *r_info, const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION);
+ virtual bool intersect_ray(const Vector3 &p_from, const Vector3 &p_to, RayResult &r_result, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION, bool p_pick_ray = false);
+ virtual int intersect_shape(const RID &p_shape, const Transform &p_xform, float p_margin, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
+ virtual bool cast_motion(const RID &p_shape, const Transform &p_xform, const Vector3 &p_motion, float p_margin, float &p_closest_safe, float &p_closest_unsafe, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION, ShapeRestInfo *r_info = NULL);
+ virtual bool collide_shape(RID p_shape, const Transform &p_shape_xform, float p_margin, Vector3 *r_results, int p_result_max, int &r_result_count, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
+ virtual bool rest_info(RID p_shape, const Transform &p_shape_xform, float p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
PhysicsDirectSpaceStateSW();
};
-
-
class SpaceSW {
public:
-
enum ElapsedTime {
ELAPSED_TIME_INTEGRATE_FORCES,
ELAPSED_TIME_GENERATE_ISLANDS,
@@ -71,8 +67,8 @@ public:
ELAPSED_TIME_MAX
};
-private:
+private:
uint64_t elapsed_time[ELAPSED_TIME_MAX];
PhysicsDirectSpaceStateSW *direct_access;
@@ -85,10 +81,10 @@ private:
SelfList<AreaSW>::List monitor_query_list;
SelfList<AreaSW>::List area_moved_list;
- static void* _broadphase_pair(CollisionObjectSW *A,int p_subindex_A,CollisionObjectSW *B,int p_subindex_B,void *p_self);
- static void _broadphase_unpair(CollisionObjectSW *A,int p_subindex_A,CollisionObjectSW *B,int p_subindex_B,void *p_data,void *p_self);
+ static void *_broadphase_pair(CollisionObjectSW *A, int p_subindex_A, CollisionObjectSW *B, int p_subindex_B, void *p_self);
+ static void _broadphase_unpair(CollisionObjectSW *A, int p_subindex_A, CollisionObjectSW *B, int p_subindex_B, void *p_data, void *p_self);
- Set<CollisionObjectSW*> objects;
+ Set<CollisionObjectSW *> objects;
AreaSW *area;
@@ -99,7 +95,7 @@ private:
enum {
- INTERSECTION_QUERY_MAX=2048
+ INTERSECTION_QUERY_MAX = 2048
};
CollisionObjectSW *intersection_query_results[INTERSECTION_QUERY_MAX];
@@ -121,36 +117,35 @@ private:
Vector<Vector3> contact_debug;
int contact_debug_count;
-friend class PhysicsDirectSpaceStateSW;
+ friend class PhysicsDirectSpaceStateSW;
public:
-
- _FORCE_INLINE_ void set_self(const RID& p_self) { self=p_self; }
+ _FORCE_INLINE_ void set_self(const RID &p_self) { self = p_self; }
_FORCE_INLINE_ RID get_self() const { return self; }
- void set_default_area(AreaSW *p_area) { area=p_area; }
+ void set_default_area(AreaSW *p_area) { area = p_area; }
AreaSW *get_default_area() const { return area; }
- const SelfList<BodySW>::List& get_active_body_list() const;
- void body_add_to_active_list(SelfList<BodySW>* p_body);
- void body_remove_from_active_list(SelfList<BodySW>* p_body);
- void body_add_to_inertia_update_list(SelfList<BodySW>* p_body);
- void body_remove_from_inertia_update_list(SelfList<BodySW>* p_body);
+ const SelfList<BodySW>::List &get_active_body_list() const;
+ void body_add_to_active_list(SelfList<BodySW> *p_body);
+ void body_remove_from_active_list(SelfList<BodySW> *p_body);
+ void body_add_to_inertia_update_list(SelfList<BodySW> *p_body);
+ void body_remove_from_inertia_update_list(SelfList<BodySW> *p_body);
- void body_add_to_state_query_list(SelfList<BodySW>* p_body);
- void body_remove_from_state_query_list(SelfList<BodySW>* p_body);
+ void body_add_to_state_query_list(SelfList<BodySW> *p_body);
+ void body_remove_from_state_query_list(SelfList<BodySW> *p_body);
- void area_add_to_monitor_query_list(SelfList<AreaSW>* p_area);
- void area_remove_from_monitor_query_list(SelfList<AreaSW>* p_area);
- void area_add_to_moved_list(SelfList<AreaSW>* p_area);
- void area_remove_from_moved_list(SelfList<AreaSW>* p_area);
- const SelfList<AreaSW>::List& get_moved_area_list() const;
+ void area_add_to_monitor_query_list(SelfList<AreaSW> *p_area);
+ void area_remove_from_monitor_query_list(SelfList<AreaSW> *p_area);
+ void area_add_to_moved_list(SelfList<AreaSW> *p_area);
+ void area_remove_from_moved_list(SelfList<AreaSW> *p_area);
+ const SelfList<AreaSW>::List &get_moved_area_list() const;
BroadPhaseSW *get_broadphase();
void add_object(CollisionObjectSW *p_object);
void remove_object(CollisionObjectSW *p_object);
- const Set<CollisionObjectSW*> &get_objects() const;
+ const Set<CollisionObjectSW *> &get_objects() const;
_FORCE_INLINE_ real_t get_contact_recycle_radius() const { return contact_recycle_radius; }
_FORCE_INLINE_ real_t get_contact_max_separation() const { return contact_max_separation; }
@@ -161,12 +156,10 @@ public:
_FORCE_INLINE_ real_t get_body_time_to_sleep() const { return body_time_to_sleep; }
_FORCE_INLINE_ real_t get_body_angular_velocity_damp_ratio() const { return body_angular_velocity_damp_ratio; }
-
void update();
void setup();
void call_queries();
-
bool is_locked() const;
void lock();
void unlock();
@@ -174,10 +167,10 @@ public:
void set_param(PhysicsServer::SpaceParameter p_param, real_t p_value);
real_t get_param(PhysicsServer::SpaceParameter p_param) const;
- void set_island_count(int p_island_count) { island_count=p_island_count; }
+ void set_island_count(int p_island_count) { island_count = p_island_count; }
int get_island_count() const { return island_count; }
- void set_active_objects(int p_active_objects) { active_objects=p_active_objects; }
+ void set_active_objects(int p_active_objects) { active_objects = p_active_objects; }
int get_active_objects() const { return active_objects; }
int get_collision_pairs() const { return collision_pairs; }
@@ -186,19 +179,20 @@ public:
void set_debug_contacts(int p_amount) { contact_debug.resize(p_amount); }
_FORCE_INLINE_ bool is_debugging_contacts() const { return !contact_debug.empty(); }
- _FORCE_INLINE_ void add_debug_contact(const Vector3& p_contact) { if (contact_debug_count<contact_debug.size()) contact_debug[contact_debug_count++]=p_contact; }
+ _FORCE_INLINE_ void add_debug_contact(const Vector3 &p_contact) {
+ if (contact_debug_count < contact_debug.size()) contact_debug[contact_debug_count++] = p_contact;
+ }
_FORCE_INLINE_ Vector<Vector3> get_debug_contacts() { return contact_debug; }
_FORCE_INLINE_ int get_debug_contact_count() { return contact_debug_count; }
- void set_static_global_body(RID p_body) { static_global_body=p_body; }
+ void set_static_global_body(RID p_body) { static_global_body = p_body; }
RID get_static_global_body() { return static_global_body; }
- void set_elapsed_time(ElapsedTime p_time,uint64_t p_msec) { elapsed_time[p_time]=p_msec; }
+ void set_elapsed_time(ElapsedTime p_time, uint64_t p_msec) { elapsed_time[p_time] = p_msec; }
uint64_t get_elapsed_time(ElapsedTime p_time) const { return elapsed_time[p_time]; }
SpaceSW();
~SpaceSW();
};
-
#endif // SPACE__SW_H
diff --git a/servers/physics/step_sw.cpp b/servers/physics/step_sw.cpp
index e24081761..74afb272d 100644
--- a/servers/physics/step_sw.cpp
+++ b/servers/physics/step_sw.cpp
@@ -31,279 +31,268 @@
#include "os/os.h"
-void StepSW::_populate_island(BodySW* p_body,BodySW** p_island,ConstraintSW **p_constraint_island) {
+void StepSW::_populate_island(BodySW *p_body, BodySW **p_island, ConstraintSW **p_constraint_island) {
p_body->set_island_step(_step);
p_body->set_island_next(*p_island);
- *p_island=p_body;
+ *p_island = p_body;
- for(Map<ConstraintSW*,int>::Element *E=p_body->get_constraint_map().front();E;E=E->next()) {
+ for (Map<ConstraintSW *, int>::Element *E = p_body->get_constraint_map().front(); E; E = E->next()) {
- ConstraintSW *c=(ConstraintSW*)E->key();
- if (c->get_island_step()==_step)
+ ConstraintSW *c = (ConstraintSW *)E->key();
+ if (c->get_island_step() == _step)
continue; //already processed
c->set_island_step(_step);
c->set_island_next(*p_constraint_island);
- *p_constraint_island=c;
+ *p_constraint_island = c;
-
- for(int i=0;i<c->get_body_count();i++) {
- if (i==E->get())
+ for (int i = 0; i < c->get_body_count(); i++) {
+ if (i == E->get())
continue;
BodySW *b = c->get_body_ptr()[i];
- if (b->get_island_step()==_step || b->get_mode()==PhysicsServer::BODY_MODE_STATIC || b->get_mode()==PhysicsServer::BODY_MODE_KINEMATIC)
+ if (b->get_island_step() == _step || b->get_mode() == PhysicsServer::BODY_MODE_STATIC || b->get_mode() == PhysicsServer::BODY_MODE_KINEMATIC)
continue; //no go
- _populate_island(c->get_body_ptr()[i],p_island,p_constraint_island);
+ _populate_island(c->get_body_ptr()[i], p_island, p_constraint_island);
}
}
}
-void StepSW::_setup_island(ConstraintSW *p_island,float p_delta) {
+void StepSW::_setup_island(ConstraintSW *p_island, float p_delta) {
- ConstraintSW *ci=p_island;
- while(ci) {
+ ConstraintSW *ci = p_island;
+ while (ci) {
bool process = ci->setup(p_delta);
//todo remove from island if process fails
- ci=ci->get_island_next();
+ ci = ci->get_island_next();
}
}
-void StepSW::_solve_island(ConstraintSW *p_island,int p_iterations,float p_delta){
+void StepSW::_solve_island(ConstraintSW *p_island, int p_iterations, float p_delta) {
- int at_priority=1;
+ int at_priority = 1;
- while(p_island) {
+ while (p_island) {
- for(int i=0;i<p_iterations;i++) {
+ for (int i = 0; i < p_iterations; i++) {
- ConstraintSW *ci=p_island;
- while(ci) {
+ ConstraintSW *ci = p_island;
+ while (ci) {
ci->solve(p_delta);
- ci=ci->get_island_next();
+ ci = ci->get_island_next();
}
}
at_priority++;
{
- ConstraintSW *ci=p_island;
- ConstraintSW *prev=NULL;
- while(ci) {
- if (ci->get_priority()<at_priority) {
+ ConstraintSW *ci = p_island;
+ ConstraintSW *prev = NULL;
+ while (ci) {
+ if (ci->get_priority() < at_priority) {
if (prev) {
prev->set_island_next(ci->get_island_next()); //remove
} else {
- p_island=ci->get_island_next();
+ p_island = ci->get_island_next();
}
} else {
- prev=ci;
+ prev = ci;
}
- ci=ci->get_island_next();
+ ci = ci->get_island_next();
}
}
}
-
}
-void StepSW::_check_suspend(BodySW *p_island,float p_delta) {
-
+void StepSW::_check_suspend(BodySW *p_island, float p_delta) {
- bool can_sleep=true;
+ bool can_sleep = true;
BodySW *b = p_island;
- while(b) {
+ while (b) {
- if (b->get_mode()==PhysicsServer::BODY_MODE_STATIC || b->get_mode()==PhysicsServer::BODY_MODE_KINEMATIC) {
- b=b->get_island_next();
+ if (b->get_mode() == PhysicsServer::BODY_MODE_STATIC || b->get_mode() == PhysicsServer::BODY_MODE_KINEMATIC) {
+ b = b->get_island_next();
continue; //ignore for static
}
if (!b->sleep_test(p_delta))
- can_sleep=false;
+ can_sleep = false;
- b=b->get_island_next();
+ b = b->get_island_next();
}
//put all to sleep or wake up everyoen
b = p_island;
- while(b) {
+ while (b) {
- if (b->get_mode()==PhysicsServer::BODY_MODE_STATIC || b->get_mode()==PhysicsServer::BODY_MODE_KINEMATIC) {
- b=b->get_island_next();
+ if (b->get_mode() == PhysicsServer::BODY_MODE_STATIC || b->get_mode() == PhysicsServer::BODY_MODE_KINEMATIC) {
+ b = b->get_island_next();
continue; //ignore for static
}
bool active = b->is_active();
- if (active==can_sleep)
+ if (active == can_sleep)
b->set_active(!can_sleep);
- b=b->get_island_next();
+ b = b->get_island_next();
}
}
-void StepSW::step(SpaceSW* p_space,float p_delta,int p_iterations) {
+void StepSW::step(SpaceSW *p_space, float p_delta, int p_iterations) {
p_space->lock(); // can't access space during this
p_space->setup(); //update inertias, etc
- const SelfList<BodySW>::List * body_list = &p_space->get_active_body_list();
+ const SelfList<BodySW>::List *body_list = &p_space->get_active_body_list();
/* INTEGRATE FORCES */
uint64_t profile_begtime = OS::get_singleton()->get_ticks_usec();
- uint64_t profile_endtime=0;
+ uint64_t profile_endtime = 0;
- int active_count=0;
+ int active_count = 0;
- const SelfList<BodySW>*b = body_list->first();
- while(b) {
+ const SelfList<BodySW> *b = body_list->first();
+ while (b) {
b->self()->integrate_forces(p_delta);
- b=b->next();
+ b = b->next();
active_count++;
}
p_space->set_active_objects(active_count);
-
{ //profile
- profile_endtime=OS::get_singleton()->get_ticks_usec();
- p_space->set_elapsed_time(SpaceSW::ELAPSED_TIME_INTEGRATE_FORCES,profile_endtime-profile_begtime);
- profile_begtime=profile_endtime;
+ profile_endtime = OS::get_singleton()->get_ticks_usec();
+ p_space->set_elapsed_time(SpaceSW::ELAPSED_TIME_INTEGRATE_FORCES, profile_endtime - profile_begtime);
+ profile_begtime = profile_endtime;
}
/* GENERATE CONSTRAINT ISLANDS */
- BodySW *island_list=NULL;
- ConstraintSW *constraint_island_list=NULL;
+ BodySW *island_list = NULL;
+ ConstraintSW *constraint_island_list = NULL;
b = body_list->first();
- int island_count=0;
+ int island_count = 0;
- while(b) {
+ while (b) {
BodySW *body = b->self();
+ if (body->get_island_step() != _step) {
- if (body->get_island_step()!=_step) {
-
- BodySW *island=NULL;
- ConstraintSW *constraint_island=NULL;
- _populate_island(body,&island,&constraint_island);
+ BodySW *island = NULL;
+ ConstraintSW *constraint_island = NULL;
+ _populate_island(body, &island, &constraint_island);
island->set_island_list_next(island_list);
- island_list=island;
+ island_list = island;
if (constraint_island) {
constraint_island->set_island_list_next(constraint_island_list);
- constraint_island_list=constraint_island;
+ constraint_island_list = constraint_island;
island_count++;
}
-
}
- b=b->next();
+ b = b->next();
}
p_space->set_island_count(island_count);
const SelfList<AreaSW>::List &aml = p_space->get_moved_area_list();
- while(aml.first()) {
- for(const Set<ConstraintSW*>::Element *E=aml.first()->self()->get_constraints().front();E;E=E->next()) {
+ while (aml.first()) {
+ for (const Set<ConstraintSW *>::Element *E = aml.first()->self()->get_constraints().front(); E; E = E->next()) {
- ConstraintSW*c=E->get();
- if (c->get_island_step()==_step)
+ ConstraintSW *c = E->get();
+ if (c->get_island_step() == _step)
continue;
c->set_island_step(_step);
c->set_island_next(NULL);
c->set_island_list_next(constraint_island_list);
- constraint_island_list=c;
+ constraint_island_list = c;
}
- p_space->area_remove_from_moved_list((SelfList<AreaSW>*)aml.first()); //faster to remove here
+ p_space->area_remove_from_moved_list((SelfList<AreaSW> *)aml.first()); //faster to remove here
}
{ //profile
- profile_endtime=OS::get_singleton()->get_ticks_usec();
- p_space->set_elapsed_time(SpaceSW::ELAPSED_TIME_GENERATE_ISLANDS,profile_endtime-profile_begtime);
- profile_begtime=profile_endtime;
+ profile_endtime = OS::get_singleton()->get_ticks_usec();
+ p_space->set_elapsed_time(SpaceSW::ELAPSED_TIME_GENERATE_ISLANDS, profile_endtime - profile_begtime);
+ profile_begtime = profile_endtime;
}
-
-// print_line("island count: "+itos(island_count)+" active count: "+itos(active_count));
+ // print_line("island count: "+itos(island_count)+" active count: "+itos(active_count));
/* SETUP CONSTRAINT ISLANDS */
{
- ConstraintSW *ci=constraint_island_list;
- while(ci) {
+ ConstraintSW *ci = constraint_island_list;
+ while (ci) {
- _setup_island(ci,p_delta);
- ci=ci->get_island_list_next();
+ _setup_island(ci, p_delta);
+ ci = ci->get_island_list_next();
}
}
{ //profile
- profile_endtime=OS::get_singleton()->get_ticks_usec();
- p_space->set_elapsed_time(SpaceSW::ELAPSED_TIME_SETUP_CONSTRAINTS,profile_endtime-profile_begtime);
- profile_begtime=profile_endtime;
+ profile_endtime = OS::get_singleton()->get_ticks_usec();
+ p_space->set_elapsed_time(SpaceSW::ELAPSED_TIME_SETUP_CONSTRAINTS, profile_endtime - profile_begtime);
+ profile_begtime = profile_endtime;
}
/* SOLVE CONSTRAINT ISLANDS */
{
- ConstraintSW *ci=constraint_island_list;
- while(ci) {
+ ConstraintSW *ci = constraint_island_list;
+ while (ci) {
//iterating each island separatedly improves cache efficiency
- _solve_island(ci,p_iterations,p_delta);
- ci=ci->get_island_list_next();
+ _solve_island(ci, p_iterations, p_delta);
+ ci = ci->get_island_list_next();
}
}
-
{ //profile
- profile_endtime=OS::get_singleton()->get_ticks_usec();
- p_space->set_elapsed_time(SpaceSW::ELAPSED_TIME_SOLVE_CONSTRAINTS,profile_endtime-profile_begtime);
- profile_begtime=profile_endtime;
+ profile_endtime = OS::get_singleton()->get_ticks_usec();
+ p_space->set_elapsed_time(SpaceSW::ELAPSED_TIME_SOLVE_CONSTRAINTS, profile_endtime - profile_begtime);
+ profile_begtime = profile_endtime;
}
/* INTEGRATE VELOCITIES */
b = body_list->first();
- while(b) {
- const SelfList<BodySW>*n=b->next();
+ while (b) {
+ const SelfList<BodySW> *n = b->next();
b->self()->integrate_velocities(p_delta);
- b=n;
+ b = n;
}
/* SLEEP / WAKE UP ISLANDS */
{
- BodySW *bi=island_list;
- while(bi) {
+ BodySW *bi = island_list;
+ while (bi) {
- _check_suspend(bi,p_delta);
- bi=bi->get_island_list_next();
+ _check_suspend(bi, p_delta);
+ bi = bi->get_island_list_next();
}
}
{ //profile
- profile_endtime=OS::get_singleton()->get_ticks_usec();
- p_space->set_elapsed_time(SpaceSW::ELAPSED_TIME_INTEGRATE_VELOCITIES,profile_endtime-profile_begtime);
- profile_begtime=profile_endtime;
+ profile_endtime = OS::get_singleton()->get_ticks_usec();
+ p_space->set_elapsed_time(SpaceSW::ELAPSED_TIME_INTEGRATE_VELOCITIES, profile_endtime - profile_begtime);
+ profile_begtime = profile_endtime;
}
p_space->update();
p_space->unlock();
_step++;
-
-
-
}
StepSW::StepSW() {
- _step=1;
+ _step = 1;
}
diff --git a/servers/physics/step_sw.h b/servers/physics/step_sw.h
index 2f67b3c8d..0f4b9ff50 100644
--- a/servers/physics/step_sw.h
+++ b/servers/physics/step_sw.h
@@ -35,13 +35,13 @@ class StepSW {
uint64_t _step;
- void _populate_island(BodySW* p_body,BodySW** p_island,ConstraintSW **p_constraint_island);
- void _setup_island(ConstraintSW *p_island,float p_delta);
- void _solve_island(ConstraintSW *p_island,int p_iterations,float p_delta);
- void _check_suspend(BodySW *p_island,float p_delta);
-public:
+ void _populate_island(BodySW *p_body, BodySW **p_island, ConstraintSW **p_constraint_island);
+ void _setup_island(ConstraintSW *p_island, float p_delta);
+ void _solve_island(ConstraintSW *p_island, int p_iterations, float p_delta);
+ void _check_suspend(BodySW *p_island, float p_delta);
- void step(SpaceSW* p_space,float p_delta,int p_iterations);
+public:
+ void step(SpaceSW *p_space, float p_delta, int p_iterations);
StepSW();
};
diff --git a/servers/physics_2d/area_2d_sw.cpp b/servers/physics_2d/area_2d_sw.cpp
index 5ee983d70..a09a37961 100644
--- a/servers/physics_2d/area_2d_sw.cpp
+++ b/servers/physics_2d/area_2d_sw.cpp
@@ -27,18 +27,26 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include "area_2d_sw.h"
-#include "space_2d_sw.h"
#include "body_2d_sw.h"
+#include "space_2d_sw.h"
-Area2DSW::BodyKey::BodyKey(Body2DSW *p_body, uint32_t p_body_shape,uint32_t p_area_shape) { rid=p_body->get_self(); instance_id=p_body->get_instance_id(); body_shape=p_body_shape; area_shape=p_area_shape; }
-Area2DSW::BodyKey::BodyKey(Area2DSW *p_body, uint32_t p_body_shape,uint32_t p_area_shape) { rid=p_body->get_self(); instance_id=p_body->get_instance_id(); body_shape=p_body_shape; area_shape=p_area_shape; }
+Area2DSW::BodyKey::BodyKey(Body2DSW *p_body, uint32_t p_body_shape, uint32_t p_area_shape) {
+ rid = p_body->get_self();
+ instance_id = p_body->get_instance_id();
+ body_shape = p_body_shape;
+ area_shape = p_area_shape;
+}
+Area2DSW::BodyKey::BodyKey(Area2DSW *p_body, uint32_t p_body_shape, uint32_t p_area_shape) {
+ rid = p_body->get_self();
+ instance_id = p_body->get_instance_id();
+ body_shape = p_body_shape;
+ area_shape = p_area_shape;
+}
void Area2DSW::_shapes_changed() {
-
-
}
-void Area2DSW::set_transform(const Matrix32& p_transform) {
+void Area2DSW::set_transform(const Matrix32 &p_transform) {
if (!moved_list.in_list() && get_space())
get_space()->area_add_to_moved_list(&moved_list);
@@ -54,7 +62,6 @@ void Area2DSW::set_space(Space2DSW *p_space) {
get_space()->area_remove_from_monitor_query_list(&monitor_query_list);
if (moved_list.in_list())
get_space()->area_remove_from_moved_list(&moved_list);
-
}
monitored_bodies.clear();
@@ -63,19 +70,17 @@ void Area2DSW::set_space(Space2DSW *p_space) {
_set_space(p_space);
}
+void Area2DSW::set_monitor_callback(ObjectID p_id, const StringName &p_method) {
-void Area2DSW::set_monitor_callback(ObjectID p_id, const StringName& p_method) {
-
-
- if (p_id==monitor_callback_id) {
- monitor_callback_method=p_method;
+ if (p_id == monitor_callback_id) {
+ monitor_callback_method = p_method;
return;
}
_unregister_shapes();
- monitor_callback_id=p_id;
- monitor_callback_method=p_method;
+ monitor_callback_id = p_id;
+ monitor_callback_method = p_method;
monitored_bodies.clear();
monitored_areas.clear();
@@ -84,22 +89,19 @@ void Area2DSW::set_monitor_callback(ObjectID p_id, const StringName& p_method) {
if (!moved_list.in_list() && get_space())
get_space()->area_add_to_moved_list(&moved_list);
-
-
}
-void Area2DSW::set_area_monitor_callback(ObjectID p_id, const StringName& p_method) {
+void Area2DSW::set_area_monitor_callback(ObjectID p_id, const StringName &p_method) {
-
- if (p_id==area_monitor_callback_id) {
- area_monitor_callback_method=p_method;
+ if (p_id == area_monitor_callback_id) {
+ area_monitor_callback_method = p_method;
return;
}
_unregister_shapes();
- area_monitor_callback_id=p_id;
- area_monitor_callback_method=p_method;
+ area_monitor_callback_id = p_id;
+ area_monitor_callback_method = p_method;
monitored_bodies.clear();
monitored_areas.clear();
@@ -108,45 +110,63 @@ void Area2DSW::set_area_monitor_callback(ObjectID p_id, const StringName& p_meth
if (!moved_list.in_list() && get_space())
get_space()->area_add_to_moved_list(&moved_list);
-
-
}
-
void Area2DSW::set_space_override_mode(Physics2DServer::AreaSpaceOverrideMode p_mode) {
- bool do_override=p_mode!=Physics2DServer::AREA_SPACE_OVERRIDE_DISABLED;
- if (do_override==(space_override_mode!=Physics2DServer::AREA_SPACE_OVERRIDE_DISABLED))
+ bool do_override = p_mode != Physics2DServer::AREA_SPACE_OVERRIDE_DISABLED;
+ if (do_override == (space_override_mode != Physics2DServer::AREA_SPACE_OVERRIDE_DISABLED))
return;
_unregister_shapes();
- space_override_mode=p_mode;
+ space_override_mode = p_mode;
_shape_changed();
}
-void Area2DSW::set_param(Physics2DServer::AreaParameter p_param, const Variant& p_value) {
+void Area2DSW::set_param(Physics2DServer::AreaParameter p_param, const Variant &p_value) {
- switch(p_param) {
- case Physics2DServer::AREA_PARAM_GRAVITY: gravity=p_value; ; break;
- case Physics2DServer::AREA_PARAM_GRAVITY_VECTOR: gravity_vector=p_value; ; break;
- case Physics2DServer::AREA_PARAM_GRAVITY_IS_POINT: gravity_is_point=p_value; ; break;
- case Physics2DServer::AREA_PARAM_GRAVITY_DISTANCE_SCALE: gravity_distance_scale=p_value; ; break;
- case Physics2DServer::AREA_PARAM_GRAVITY_POINT_ATTENUATION: point_attenuation=p_value; ; break;
- case Physics2DServer::AREA_PARAM_LINEAR_DAMP: linear_damp=p_value; ; break;
- case Physics2DServer::AREA_PARAM_ANGULAR_DAMP: angular_damp=p_value; ; break;
- case Physics2DServer::AREA_PARAM_PRIORITY: priority=p_value; ; break;
+ switch (p_param) {
+ case Physics2DServer::AREA_PARAM_GRAVITY:
+ gravity = p_value;
+ ;
+ break;
+ case Physics2DServer::AREA_PARAM_GRAVITY_VECTOR:
+ gravity_vector = p_value;
+ ;
+ break;
+ case Physics2DServer::AREA_PARAM_GRAVITY_IS_POINT:
+ gravity_is_point = p_value;
+ ;
+ break;
+ case Physics2DServer::AREA_PARAM_GRAVITY_DISTANCE_SCALE:
+ gravity_distance_scale = p_value;
+ ;
+ break;
+ case Physics2DServer::AREA_PARAM_GRAVITY_POINT_ATTENUATION:
+ point_attenuation = p_value;
+ ;
+ break;
+ case Physics2DServer::AREA_PARAM_LINEAR_DAMP:
+ linear_damp = p_value;
+ ;
+ break;
+ case Physics2DServer::AREA_PARAM_ANGULAR_DAMP:
+ angular_damp = p_value;
+ ;
+ break;
+ case Physics2DServer::AREA_PARAM_PRIORITY:
+ priority = p_value;
+ ;
+ break;
}
-
-
}
Variant Area2DSW::get_param(Physics2DServer::AreaParameter p_param) const {
-
- switch(p_param) {
+ switch (p_param) {
case Physics2DServer::AREA_PARAM_GRAVITY: return gravity;
case Physics2DServer::AREA_PARAM_GRAVITY_VECTOR: return gravity_vector;
case Physics2DServer::AREA_PARAM_GRAVITY_IS_POINT: return gravity_is_point;
case Physics2DServer::AREA_PARAM_GRAVITY_DISTANCE_SCALE: return gravity_distance_scale;
- case Physics2DServer::AREA_PARAM_GRAVITY_POINT_ATTENUATION: return point_attenuation;
+ case Physics2DServer::AREA_PARAM_GRAVITY_POINT_ATTENUATION: return point_attenuation;
case Physics2DServer::AREA_PARAM_LINEAR_DAMP: return linear_damp;
case Physics2DServer::AREA_PARAM_ANGULAR_DAMP: return angular_damp;
case Physics2DServer::AREA_PARAM_PRIORITY: return priority;
@@ -155,23 +175,20 @@ Variant Area2DSW::get_param(Physics2DServer::AreaParameter p_param) const {
return Variant();
}
-
void Area2DSW::_queue_monitor_update() {
ERR_FAIL_COND(!get_space());
if (!monitor_query_list.in_list())
get_space()->area_add_to_monitor_query_list(&monitor_query_list);
-
-
}
void Area2DSW::set_monitorable(bool p_monitorable) {
- if (monitorable==p_monitorable)
+ if (monitorable == p_monitorable)
return;
- monitorable=p_monitorable;
+ monitorable = p_monitorable;
_set_static(!monitorable);
}
@@ -181,31 +198,29 @@ void Area2DSW::call_queries() {
Variant res[5];
Variant *resptr[5];
- for(int i=0;i<5;i++)
- resptr[i]=&res[i];
+ for (int i = 0; i < 5; i++)
+ resptr[i] = &res[i];
Object *obj = ObjectDB::get_instance(monitor_callback_id);
if (!obj) {
monitored_bodies.clear();
- monitor_callback_id=0;
+ monitor_callback_id = 0;
return;
}
+ for (Map<BodyKey, BodyState>::Element *E = monitored_bodies.front(); E; E = E->next()) {
-
- for (Map<BodyKey,BodyState>::Element *E=monitored_bodies.front();E;E=E->next()) {
-
- if (E->get().state==0)
+ if (E->get().state == 0)
continue; //nothing happened
- res[0]=E->get().state>0 ? Physics2DServer::AREA_BODY_ADDED : Physics2DServer::AREA_BODY_REMOVED;
- res[1]=E->key().rid;
- res[2]=E->key().instance_id;
- res[3]=E->key().body_shape;
- res[4]=E->key().area_shape;
+ res[0] = E->get().state > 0 ? Physics2DServer::AREA_BODY_ADDED : Physics2DServer::AREA_BODY_REMOVED;
+ res[1] = E->key().rid;
+ res[2] = E->key().instance_id;
+ res[3] = E->key().body_shape;
+ res[4] = E->key().area_shape;
Variant::CallError ce;
- obj->call(monitor_callback_method,(const Variant**)resptr,5,ce);
+ obj->call(monitor_callback_method, (const Variant **)resptr, 5, ce);
}
}
@@ -213,66 +228,57 @@ void Area2DSW::call_queries() {
if (area_monitor_callback_id && !monitored_areas.empty()) {
-
Variant res[5];
Variant *resptr[5];
- for(int i=0;i<5;i++)
- resptr[i]=&res[i];
+ for (int i = 0; i < 5; i++)
+ resptr[i] = &res[i];
Object *obj = ObjectDB::get_instance(area_monitor_callback_id);
if (!obj) {
monitored_areas.clear();
- area_monitor_callback_id=0;
+ area_monitor_callback_id = 0;
return;
}
+ for (Map<BodyKey, BodyState>::Element *E = monitored_areas.front(); E; E = E->next()) {
-
- for (Map<BodyKey,BodyState>::Element *E=monitored_areas.front();E;E=E->next()) {
-
- if (E->get().state==0)
+ if (E->get().state == 0)
continue; //nothing happened
- res[0]=E->get().state>0 ? Physics2DServer::AREA_BODY_ADDED : Physics2DServer::AREA_BODY_REMOVED;
- res[1]=E->key().rid;
- res[2]=E->key().instance_id;
- res[3]=E->key().body_shape;
- res[4]=E->key().area_shape;
-
+ res[0] = E->get().state > 0 ? Physics2DServer::AREA_BODY_ADDED : Physics2DServer::AREA_BODY_REMOVED;
+ res[1] = E->key().rid;
+ res[2] = E->key().instance_id;
+ res[3] = E->key().body_shape;
+ res[4] = E->key().area_shape;
Variant::CallError ce;
- obj->call(area_monitor_callback_method,(const Variant**)resptr,5,ce);
+ obj->call(area_monitor_callback_method, (const Variant **)resptr, 5, ce);
}
}
monitored_areas.clear();
//get_space()->area_remove_from_monitor_query_list(&monitor_query_list);
-
}
-Area2DSW::Area2DSW() : CollisionObject2DSW(TYPE_AREA), monitor_query_list(this), moved_list(this) {
+Area2DSW::Area2DSW()
+ : CollisionObject2DSW(TYPE_AREA), monitor_query_list(this), moved_list(this) {
_set_static(true); //areas are not active by default
- space_override_mode=Physics2DServer::AREA_SPACE_OVERRIDE_DISABLED;
- gravity=9.80665;
- gravity_vector=Vector2(0,-1);
- gravity_is_point=false;
- gravity_distance_scale=0;
- point_attenuation=1;
-
- angular_damp=1.0;
- linear_damp=0.1;
- priority=0;
- monitor_callback_id=0;
- area_monitor_callback_id=0;
- monitorable=false;
-
+ space_override_mode = Physics2DServer::AREA_SPACE_OVERRIDE_DISABLED;
+ gravity = 9.80665;
+ gravity_vector = Vector2(0, -1);
+ gravity_is_point = false;
+ gravity_distance_scale = 0;
+ point_attenuation = 1;
+ angular_damp = 1.0;
+ linear_damp = 0.1;
+ priority = 0;
+ monitor_callback_id = 0;
+ area_monitor_callback_id = 0;
+ monitorable = false;
}
Area2DSW::~Area2DSW() {
-
-
}
-
diff --git a/servers/physics_2d/area_2d_sw.h b/servers/physics_2d/area_2d_sw.h
index ea991e8f6..da69485a4 100644
--- a/servers/physics_2d/area_2d_sw.h
+++ b/servers/physics_2d/area_2d_sw.h
@@ -29,18 +29,16 @@
#ifndef AREA_2D_SW_H
#define AREA_2D_SW_H
-#include "servers/physics_2d_server.h"
#include "collision_object_2d_sw.h"
#include "self_list.h"
+#include "servers/physics_2d_server.h"
//#include "servers/physics/query_sw.h"
class Space2DSW;
class Body2DSW;
class Constraint2DSW;
-
-class Area2DSW : public CollisionObject2DSW{
-
+class Area2DSW : public CollisionObject2DSW {
Physics2DServer::AreaSpaceOverrideMode space_override_mode;
float gravity;
@@ -69,23 +67,22 @@ class Area2DSW : public CollisionObject2DSW{
uint32_t body_shape;
uint32_t area_shape;
- _FORCE_INLINE_ bool operator<( const BodyKey& p_key) const {
+ _FORCE_INLINE_ bool operator<(const BodyKey &p_key) const {
- if (rid==p_key.rid) {
+ if (rid == p_key.rid) {
- if (body_shape==p_key.body_shape) {
+ if (body_shape == p_key.body_shape) {
return area_shape < p_key.area_shape;
} else
return body_shape < p_key.body_shape;
} else
return rid < p_key.rid;
-
}
_FORCE_INLINE_ BodyKey() {}
- BodyKey(Body2DSW *p_body, uint32_t p_body_shape,uint32_t p_area_shape);
- BodyKey(Area2DSW *p_body, uint32_t p_body_shape,uint32_t p_area_shape);
+ BodyKey(Body2DSW *p_body, uint32_t p_body_shape, uint32_t p_area_shape);
+ BodyKey(Area2DSW *p_body, uint32_t p_body_shape, uint32_t p_area_shape);
};
struct BodyState {
@@ -93,122 +90,110 @@ class Area2DSW : public CollisionObject2DSW{
int state;
_FORCE_INLINE_ void inc() { state++; }
_FORCE_INLINE_ void dec() { state--; }
- _FORCE_INLINE_ BodyState() { state=0; }
+ _FORCE_INLINE_ BodyState() { state = 0; }
};
- Map<BodyKey,BodyState> monitored_bodies;
- Map<BodyKey,BodyState> monitored_areas;
+ Map<BodyKey, BodyState> monitored_bodies;
+ Map<BodyKey, BodyState> monitored_areas;
//virtual void shape_changed_notify(Shape2DSW *p_shape);
//virtual void shape_deleted_notify(Shape2DSW *p_shape);
- Set<Constraint2DSW*> constraints;
-
+ Set<Constraint2DSW *> constraints;
virtual void _shapes_changed();
void _queue_monitor_update();
public:
-
//_FORCE_INLINE_ const Matrix32& get_inverse_transform() const { return inverse_transform; }
//_FORCE_INLINE_ SpaceSW* get_owner() { return owner; }
- void set_monitor_callback(ObjectID p_id, const StringName& p_method);
+ void set_monitor_callback(ObjectID p_id, const StringName &p_method);
_FORCE_INLINE_ bool has_monitor_callback() const { return monitor_callback_id; }
- void set_area_monitor_callback(ObjectID p_id, const StringName& p_method);
+ void set_area_monitor_callback(ObjectID p_id, const StringName &p_method);
_FORCE_INLINE_ bool has_area_monitor_callback() const { return area_monitor_callback_id; }
+ _FORCE_INLINE_ void add_body_to_query(Body2DSW *p_body, uint32_t p_body_shape, uint32_t p_area_shape);
+ _FORCE_INLINE_ void remove_body_from_query(Body2DSW *p_body, uint32_t p_body_shape, uint32_t p_area_shape);
- _FORCE_INLINE_ void add_body_to_query(Body2DSW *p_body, uint32_t p_body_shape,uint32_t p_area_shape);
- _FORCE_INLINE_ void remove_body_from_query(Body2DSW *p_body, uint32_t p_body_shape,uint32_t p_area_shape);
+ _FORCE_INLINE_ void add_area_to_query(Area2DSW *p_area, uint32_t p_area_shape, uint32_t p_self_shape);
+ _FORCE_INLINE_ void remove_area_from_query(Area2DSW *p_area, uint32_t p_area_shape, uint32_t p_self_shape);
- _FORCE_INLINE_ void add_area_to_query(Area2DSW *p_area, uint32_t p_area_shape,uint32_t p_self_shape);
- _FORCE_INLINE_ void remove_area_from_query(Area2DSW *p_area, uint32_t p_area_shape,uint32_t p_self_shape);
-
- void set_param(Physics2DServer::AreaParameter p_param, const Variant& p_value);
+ void set_param(Physics2DServer::AreaParameter p_param, const Variant &p_value);
Variant get_param(Physics2DServer::AreaParameter p_param) const;
void set_space_override_mode(Physics2DServer::AreaSpaceOverrideMode p_mode);
Physics2DServer::AreaSpaceOverrideMode get_space_override_mode() const { return space_override_mode; }
- _FORCE_INLINE_ void set_gravity(float p_gravity) { gravity=p_gravity; }
+ _FORCE_INLINE_ void set_gravity(float p_gravity) { gravity = p_gravity; }
_FORCE_INLINE_ float get_gravity() const { return gravity; }
- _FORCE_INLINE_ void set_gravity_vector(const Vector2& p_gravity) { gravity_vector=p_gravity; }
+ _FORCE_INLINE_ void set_gravity_vector(const Vector2 &p_gravity) { gravity_vector = p_gravity; }
_FORCE_INLINE_ Vector2 get_gravity_vector() const { return gravity_vector; }
- _FORCE_INLINE_ void set_gravity_as_point(bool p_enable) { gravity_is_point=p_enable; }
+ _FORCE_INLINE_ void set_gravity_as_point(bool p_enable) { gravity_is_point = p_enable; }
_FORCE_INLINE_ bool is_gravity_point() const { return gravity_is_point; }
- _FORCE_INLINE_ void set_gravity_distance_scale(float scale) { gravity_distance_scale=scale; }
+ _FORCE_INLINE_ void set_gravity_distance_scale(float scale) { gravity_distance_scale = scale; }
_FORCE_INLINE_ float get_gravity_distance_scale() const { return gravity_distance_scale; }
- _FORCE_INLINE_ void set_point_attenuation(float p_point_attenuation) { point_attenuation=p_point_attenuation; }
+ _FORCE_INLINE_ void set_point_attenuation(float p_point_attenuation) { point_attenuation = p_point_attenuation; }
_FORCE_INLINE_ float get_point_attenuation() const { return point_attenuation; }
- _FORCE_INLINE_ void set_linear_damp(float p_linear_damp) { linear_damp=p_linear_damp; }
+ _FORCE_INLINE_ void set_linear_damp(float p_linear_damp) { linear_damp = p_linear_damp; }
_FORCE_INLINE_ float get_linear_damp() const { return linear_damp; }
- _FORCE_INLINE_ void set_angular_damp(float p_angular_damp) { angular_damp=p_angular_damp; }
+ _FORCE_INLINE_ void set_angular_damp(float p_angular_damp) { angular_damp = p_angular_damp; }
_FORCE_INLINE_ float get_angular_damp() const { return angular_damp; }
- _FORCE_INLINE_ void set_priority(int p_priority) { priority=p_priority; }
+ _FORCE_INLINE_ void set_priority(int p_priority) { priority = p_priority; }
_FORCE_INLINE_ int get_priority() const { return priority; }
- _FORCE_INLINE_ void add_constraint( Constraint2DSW* p_constraint) { constraints.insert(p_constraint); }
- _FORCE_INLINE_ void remove_constraint( Constraint2DSW* p_constraint) { constraints.erase(p_constraint); }
- _FORCE_INLINE_ const Set<Constraint2DSW*>& get_constraints() const { return constraints; }
+ _FORCE_INLINE_ void add_constraint(Constraint2DSW *p_constraint) { constraints.insert(p_constraint); }
+ _FORCE_INLINE_ void remove_constraint(Constraint2DSW *p_constraint) { constraints.erase(p_constraint); }
+ _FORCE_INLINE_ const Set<Constraint2DSW *> &get_constraints() const { return constraints; }
void set_monitorable(bool p_monitorable);
_FORCE_INLINE_ bool is_monitorable() const { return monitorable; }
- void set_transform(const Matrix32& p_transform);
+ void set_transform(const Matrix32 &p_transform);
void set_space(Space2DSW *p_space);
-
void call_queries();
Area2DSW();
~Area2DSW();
};
-void Area2DSW::add_body_to_query(Body2DSW *p_body, uint32_t p_body_shape,uint32_t p_area_shape) {
+void Area2DSW::add_body_to_query(Body2DSW *p_body, uint32_t p_body_shape, uint32_t p_area_shape) {
- BodyKey bk(p_body,p_body_shape,p_area_shape);
+ BodyKey bk(p_body, p_body_shape, p_area_shape);
monitored_bodies[bk].inc();
if (!monitor_query_list.in_list())
_queue_monitor_update();
}
-void Area2DSW::remove_body_from_query(Body2DSW *p_body, uint32_t p_body_shape,uint32_t p_area_shape) {
+void Area2DSW::remove_body_from_query(Body2DSW *p_body, uint32_t p_body_shape, uint32_t p_area_shape) {
- BodyKey bk(p_body,p_body_shape,p_area_shape);
+ BodyKey bk(p_body, p_body_shape, p_area_shape);
monitored_bodies[bk].dec();
if (!monitor_query_list.in_list())
_queue_monitor_update();
}
-void Area2DSW::add_area_to_query(Area2DSW *p_area, uint32_t p_area_shape,uint32_t p_self_shape) {
+void Area2DSW::add_area_to_query(Area2DSW *p_area, uint32_t p_area_shape, uint32_t p_self_shape) {
-
- BodyKey bk(p_area,p_area_shape,p_self_shape);
+ BodyKey bk(p_area, p_area_shape, p_self_shape);
monitored_areas[bk].inc();
if (!monitor_query_list.in_list())
_queue_monitor_update();
-
-
}
-void Area2DSW::remove_area_from_query(Area2DSW *p_area, uint32_t p_area_shape,uint32_t p_self_shape) {
-
+void Area2DSW::remove_area_from_query(Area2DSW *p_area, uint32_t p_area_shape, uint32_t p_self_shape) {
- BodyKey bk(p_area,p_area_shape,p_self_shape);
+ BodyKey bk(p_area, p_area_shape, p_self_shape);
monitored_areas[bk].dec();
if (!monitor_query_list.in_list())
_queue_monitor_update();
}
-
-
-
-
#endif // AREA_2D_SW_H
diff --git a/servers/physics_2d/area_pair_2d_sw.cpp b/servers/physics_2d/area_pair_2d_sw.cpp
index c26f6c45f..db845a6d7 100644
--- a/servers/physics_2d/area_pair_2d_sw.cpp
+++ b/servers/physics_2d/area_pair_2d_sw.cpp
@@ -29,124 +29,105 @@
#include "area_pair_2d_sw.h"
#include "collision_solver_2d_sw.h"
-
bool AreaPair2DSW::setup(float p_step) {
- bool result = area->test_collision_mask(body) && CollisionSolver2DSW::solve(body->get_shape(body_shape),body->get_transform() * body->get_shape_transform(body_shape),Vector2(),area->get_shape(area_shape),area->get_transform() * area->get_shape_transform(area_shape),Vector2(),NULL,this);
+ bool result = area->test_collision_mask(body) && CollisionSolver2DSW::solve(body->get_shape(body_shape), body->get_transform() * body->get_shape_transform(body_shape), Vector2(), area->get_shape(area_shape), area->get_transform() * area->get_shape_transform(area_shape), Vector2(), NULL, this);
- if (result!=colliding) {
+ if (result != colliding) {
if (result) {
- if (area->get_space_override_mode()!=Physics2DServer::AREA_SPACE_OVERRIDE_DISABLED)
+ if (area->get_space_override_mode() != Physics2DServer::AREA_SPACE_OVERRIDE_DISABLED)
body->add_area(area);
if (area->has_monitor_callback())
- area->add_body_to_query(body,body_shape,area_shape);
+ area->add_body_to_query(body, body_shape, area_shape);
} else {
- if (area->get_space_override_mode()!=Physics2DServer::AREA_SPACE_OVERRIDE_DISABLED)
+ if (area->get_space_override_mode() != Physics2DServer::AREA_SPACE_OVERRIDE_DISABLED)
body->remove_area(area);
if (area->has_monitor_callback())
- area->remove_body_from_query(body,body_shape,area_shape);
-
+ area->remove_body_from_query(body, body_shape, area_shape);
}
- colliding=result;
-
+ colliding = result;
}
return false; //never do any post solving
}
void AreaPair2DSW::solve(float p_step) {
-
-
}
+AreaPair2DSW::AreaPair2DSW(Body2DSW *p_body, int p_body_shape, Area2DSW *p_area, int p_area_shape) {
-AreaPair2DSW::AreaPair2DSW(Body2DSW *p_body,int p_body_shape, Area2DSW *p_area,int p_area_shape) {
-
-
- body=p_body;
- area=p_area;
- body_shape=p_body_shape;
- area_shape=p_area_shape;
- colliding=false;
- body->add_constraint(this,0);
+ body = p_body;
+ area = p_area;
+ body_shape = p_body_shape;
+ area_shape = p_area_shape;
+ colliding = false;
+ body->add_constraint(this, 0);
area->add_constraint(this);
- if (p_body->get_mode()==Physics2DServer::BODY_MODE_KINEMATIC) //need to be active to process pair
+ if (p_body->get_mode() == Physics2DServer::BODY_MODE_KINEMATIC) //need to be active to process pair
p_body->set_active(true);
-
}
AreaPair2DSW::~AreaPair2DSW() {
if (colliding) {
- if (area->get_space_override_mode()!=Physics2DServer::AREA_SPACE_OVERRIDE_DISABLED)
+ if (area->get_space_override_mode() != Physics2DServer::AREA_SPACE_OVERRIDE_DISABLED)
body->remove_area(area);
if (area->has_monitor_callback())
- area->remove_body_from_query(body,body_shape,area_shape);
-
-
+ area->remove_body_from_query(body, body_shape, area_shape);
}
body->remove_constraint(this);
area->remove_constraint(this);
}
-
//////////////////////////////////
-
-
bool Area2Pair2DSW::setup(float p_step) {
- bool result = area_a->test_collision_mask(area_b) && CollisionSolver2DSW::solve(area_a->get_shape(shape_a),area_a->get_transform() * area_a->get_shape_transform(shape_a),Vector2(),area_b->get_shape(shape_b),area_b->get_transform() * area_b->get_shape_transform(shape_b),Vector2(),NULL,this);
+ bool result = area_a->test_collision_mask(area_b) && CollisionSolver2DSW::solve(area_a->get_shape(shape_a), area_a->get_transform() * area_a->get_shape_transform(shape_a), Vector2(), area_b->get_shape(shape_b), area_b->get_transform() * area_b->get_shape_transform(shape_b), Vector2(), NULL, this);
- if (result!=colliding) {
+ if (result != colliding) {
if (result) {
if (area_b->has_area_monitor_callback() && area_a->is_monitorable())
- area_b->add_area_to_query(area_a,shape_a,shape_b);
+ area_b->add_area_to_query(area_a, shape_a, shape_b);
if (area_a->has_area_monitor_callback() && area_b->is_monitorable())
- area_a->add_area_to_query(area_b,shape_b,shape_a);
+ area_a->add_area_to_query(area_b, shape_b, shape_a);
} else {
if (area_b->has_area_monitor_callback() && area_a->is_monitorable())
- area_b->remove_area_from_query(area_a,shape_a,shape_b);
+ area_b->remove_area_from_query(area_a, shape_a, shape_b);
if (area_a->has_area_monitor_callback() && area_b->is_monitorable())
- area_a->remove_area_from_query(area_b,shape_b,shape_a);
+ area_a->remove_area_from_query(area_b, shape_b, shape_a);
}
- colliding=result;
-
+ colliding = result;
}
return false; //never do any post solving
}
void Area2Pair2DSW::solve(float p_step) {
-
-
}
+Area2Pair2DSW::Area2Pair2DSW(Area2DSW *p_area_a, int p_shape_a, Area2DSW *p_area_b, int p_shape_b) {
-Area2Pair2DSW::Area2Pair2DSW(Area2DSW *p_area_a,int p_shape_a, Area2DSW *p_area_b,int p_shape_b) {
-
-
- area_a=p_area_a;
- area_b=p_area_b;
- shape_a=p_shape_a;
- shape_b=p_shape_b;
- colliding=false;
+ area_a = p_area_a;
+ area_b = p_area_b;
+ shape_a = p_shape_a;
+ shape_b = p_shape_b;
+ colliding = false;
area_a->add_constraint(this);
area_b->add_constraint(this);
-
}
Area2Pair2DSW::~Area2Pair2DSW() {
@@ -154,10 +135,10 @@ Area2Pair2DSW::~Area2Pair2DSW() {
if (colliding) {
if (area_b->has_area_monitor_callback() && area_a->is_monitorable())
- area_b->remove_area_from_query(area_a,shape_a,shape_b);
+ area_b->remove_area_from_query(area_a, shape_a, shape_b);
if (area_a->has_area_monitor_callback() && area_b->is_monitorable())
- area_a->remove_area_from_query(area_b,shape_b,shape_a);
+ area_a->remove_area_from_query(area_b, shape_b, shape_a);
}
area_a->remove_constraint(this);
diff --git a/servers/physics_2d/area_pair_2d_sw.h b/servers/physics_2d/area_pair_2d_sw.h
index db77bff5d..1478fcb82 100644
--- a/servers/physics_2d/area_pair_2d_sw.h
+++ b/servers/physics_2d/area_pair_2d_sw.h
@@ -29,9 +29,9 @@
#ifndef AREA_PAIR_2D_SW_H
#define AREA_PAIR_2D_SW_H
-#include "constraint_2d_sw.h"
-#include "body_2d_sw.h"
#include "area_2d_sw.h"
+#include "body_2d_sw.h"
+#include "constraint_2d_sw.h"
class AreaPair2DSW : public Constraint2DSW {
@@ -40,16 +40,15 @@ class AreaPair2DSW : public Constraint2DSW {
int body_shape;
int area_shape;
bool colliding;
-public:
+public:
bool setup(float p_step);
void solve(float p_step);
- AreaPair2DSW(Body2DSW *p_body,int p_body_shape, Area2DSW *p_area,int p_area_shape);
+ AreaPair2DSW(Body2DSW *p_body, int p_body_shape, Area2DSW *p_area, int p_area_shape);
~AreaPair2DSW();
};
-
class Area2Pair2DSW : public Constraint2DSW {
Area2DSW *area_a;
@@ -57,15 +56,13 @@ class Area2Pair2DSW : public Constraint2DSW {
int shape_a;
int shape_b;
bool colliding;
-public:
+public:
bool setup(float p_step);
void solve(float p_step);
- Area2Pair2DSW(Area2DSW *p_area_a,int p_shape_a, Area2DSW *p_area_b,int p_shape_b);
+ Area2Pair2DSW(Area2DSW *p_area_a, int p_shape_a, Area2DSW *p_area_b, int p_shape_b);
~Area2Pair2DSW();
};
-
#endif // AREA_PAIR_2D_SW_H
-
diff --git a/servers/physics_2d/body_2d_sw.cpp b/servers/physics_2d/body_2d_sw.cpp
index 0e3a0b7a7..f127d6881 100644
--- a/servers/physics_2d/body_2d_sw.cpp
+++ b/servers/physics_2d/body_2d_sw.cpp
@@ -27,107 +27,98 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include "body_2d_sw.h"
-#include "space_2d_sw.h"
#include "area_2d_sw.h"
#include "physics_2d_server_sw.h"
+#include "space_2d_sw.h"
void Body2DSW::_update_inertia() {
if (!user_inertia && get_space() && !inertia_update_list.in_list())
get_space()->body_add_to_inertia_update_list(&inertia_update_list);
-
}
-
-
void Body2DSW::update_inertias() {
//update shapes and motions
- switch(mode) {
+ switch (mode) {
case Physics2DServer::BODY_MODE_RIGID: {
- if(user_inertia) break;
+ if (user_inertia) break;
//update tensor for allshapes, not the best way but should be somehow OK. (inspired from bullet)
- float total_area=0;
+ float total_area = 0;
- for (int i=0;i<get_shape_count();i++) {
+ for (int i = 0; i < get_shape_count(); i++) {
- total_area+=get_shape_aabb(i).get_area();
+ total_area += get_shape_aabb(i).get_area();
}
- real_t _inertia=0;
+ real_t _inertia = 0;
- for (int i=0;i<get_shape_count();i++) {
+ for (int i = 0; i < get_shape_count(); i++) {
- const Shape2DSW* shape=get_shape(i);
+ const Shape2DSW *shape = get_shape(i);
- float area=get_shape_aabb(i).get_area();
+ float area = get_shape_aabb(i).get_area();
float mass = area * this->mass / total_area;
Matrix32 mtx = get_shape_transform(i);
Vector2 scale = mtx.get_scale();
- _inertia += shape->get_moment_of_inertia(mass,scale) + mass * mtx.get_origin().length_squared();
+ _inertia += shape->get_moment_of_inertia(mass, scale) + mass * mtx.get_origin().length_squared();
//Rect2 ab = get_shape_aabb(i);
//_inertia+=mass*ab.size.dot(ab.size)/12.0f;
-
-
-
}
- if (_inertia!=0)
- _inv_inertia=1.0/_inertia;
+ if (_inertia != 0)
+ _inv_inertia = 1.0 / _inertia;
else
- _inv_inertia=0.0; //wathever
+ _inv_inertia = 0.0; //wathever
if (mass)
- _inv_mass=1.0/mass;
+ _inv_mass = 1.0 / mass;
else
- _inv_mass=0;
+ _inv_mass = 0;
} break;
case Physics2DServer::BODY_MODE_KINEMATIC:
case Physics2DServer::BODY_MODE_STATIC: {
- _inv_inertia=0;
- _inv_mass=0;
+ _inv_inertia = 0;
+ _inv_mass = 0;
} break;
case Physics2DServer::BODY_MODE_CHARACTER: {
- _inv_inertia=0;
- _inv_mass=1.0/mass;
+ _inv_inertia = 0;
+ _inv_mass = 1.0 / mass;
} break;
}
//_update_inertia_tensor();
//_update_shapes();
-
}
-
-
void Body2DSW::set_active(bool p_active) {
- if (active==p_active)
+ if (active == p_active)
return;
- active=p_active;
+ active = p_active;
if (!p_active) {
if (get_space())
get_space()->body_remove_from_active_list(&active_list);
} else {
- if (mode==Physics2DServer::BODY_MODE_STATIC)
+ if (mode == Physics2DServer::BODY_MODE_STATIC)
return; //static bodies can't become active
if (get_space())
get_space()->body_add_to_active_list(&active_list);
//still_time=0;
}
-/*
+ /*
if (!space)
return;
@@ -140,27 +131,25 @@ void Body2DSW::set_active(bool p_active) {
*/
}
-
-
void Body2DSW::set_param(Physics2DServer::BodyParameter p_param, float p_value) {
- switch(p_param) {
+ switch (p_param) {
case Physics2DServer::BODY_PARAM_BOUNCE: {
- bounce=p_value;
+ bounce = p_value;
} break;
case Physics2DServer::BODY_PARAM_FRICTION: {
- friction=p_value;
+ friction = p_value;
} break;
case Physics2DServer::BODY_PARAM_MASS: {
- ERR_FAIL_COND(p_value<=0);
- mass=p_value;
+ ERR_FAIL_COND(p_value <= 0);
+ mass = p_value;
_update_inertia();
} break;
case Physics2DServer::BODY_PARAM_INERTIA: {
- if(p_value<=0) {
+ if (p_value <= 0) {
user_inertia = false;
_update_inertia();
} else {
@@ -169,23 +158,23 @@ void Body2DSW::set_param(Physics2DServer::BodyParameter p_param, float p_value)
}
} break;
case Physics2DServer::BODY_PARAM_GRAVITY_SCALE: {
- gravity_scale=p_value;
+ gravity_scale = p_value;
} break;
case Physics2DServer::BODY_PARAM_LINEAR_DAMP: {
- linear_damp=p_value;
+ linear_damp = p_value;
} break;
case Physics2DServer::BODY_PARAM_ANGULAR_DAMP: {
- angular_damp=p_value;
+ angular_damp = p_value;
} break;
- default:{}
+ default: {}
}
}
float Body2DSW::get_param(Physics2DServer::BodyParameter p_param) const {
- switch(p_param) {
+ switch (p_param) {
case Physics2DServer::BODY_PARAM_BOUNCE: {
return bounce;
@@ -198,7 +187,7 @@ float Body2DSW::get_param(Physics2DServer::BodyParameter p_param) const {
return mass;
} break;
case Physics2DServer::BODY_PARAM_INERTIA: {
- return _inv_inertia==0 ? 0 : 1.0 / _inv_inertia;
+ return _inv_inertia == 0 ? 0 : 1.0 / _inv_inertia;
} break;
case Physics2DServer::BODY_PARAM_GRAVITY_SCALE: {
return gravity_scale;
@@ -211,7 +200,7 @@ float Body2DSW::get_param(Physics2DServer::BodyParameter p_param) const {
return angular_damp;
} break;
- default:{}
+ default: {}
}
return 0;
@@ -219,41 +208,40 @@ float Body2DSW::get_param(Physics2DServer::BodyParameter p_param) const {
void Body2DSW::set_mode(Physics2DServer::BodyMode p_mode) {
- Physics2DServer::BodyMode prev=mode;
- mode=p_mode;
+ Physics2DServer::BodyMode prev = mode;
+ mode = p_mode;
- switch(p_mode) {
- //CLEAR UP EVERYTHING IN CASE IT NOT WORKS!
+ switch (p_mode) {
+ //CLEAR UP EVERYTHING IN CASE IT NOT WORKS!
case Physics2DServer::BODY_MODE_STATIC:
case Physics2DServer::BODY_MODE_KINEMATIC: {
_set_inv_transform(get_transform().affine_inverse());
- _inv_mass=0;
- _set_static(p_mode==Physics2DServer::BODY_MODE_STATIC);
- set_active(p_mode==Physics2DServer::BODY_MODE_KINEMATIC && contacts.size());
- linear_velocity=Vector2();
- angular_velocity=0;
- if (mode==Physics2DServer::BODY_MODE_KINEMATIC && prev!=mode) {
- first_time_kinematic=true;
+ _inv_mass = 0;
+ _set_static(p_mode == Physics2DServer::BODY_MODE_STATIC);
+ set_active(p_mode == Physics2DServer::BODY_MODE_KINEMATIC && contacts.size());
+ linear_velocity = Vector2();
+ angular_velocity = 0;
+ if (mode == Physics2DServer::BODY_MODE_KINEMATIC && prev != mode) {
+ first_time_kinematic = true;
}
} break;
case Physics2DServer::BODY_MODE_RIGID: {
- _inv_mass=mass>0?(1.0/mass):0;
+ _inv_mass = mass > 0 ? (1.0 / mass) : 0;
_set_static(false);
} break;
case Physics2DServer::BODY_MODE_CHARACTER: {
- _inv_mass=mass>0?(1.0/mass):0;
+ _inv_mass = mass > 0 ? (1.0 / mass) : 0;
_set_static(false);
} break;
}
_update_inertia();
//if (get_space())
-// _update_queries();
-
+ // _update_queries();
}
Physics2DServer::BodyMode Body2DSW::get_mode() const {
@@ -266,35 +254,33 @@ void Body2DSW::_shapes_changed() {
wakeup_neighbours();
}
-void Body2DSW::set_state(Physics2DServer::BodyState p_state, const Variant& p_variant) {
+void Body2DSW::set_state(Physics2DServer::BodyState p_state, const Variant &p_variant) {
- switch(p_state) {
+ switch (p_state) {
case Physics2DServer::BODY_STATE_TRANSFORM: {
+ if (mode == Physics2DServer::BODY_MODE_KINEMATIC) {
- if (mode==Physics2DServer::BODY_MODE_KINEMATIC) {
-
- new_transform=p_variant;
+ new_transform = p_variant;
//wakeup_neighbours();
set_active(true);
if (first_time_kinematic) {
_set_transform(p_variant);
_set_inv_transform(get_transform().affine_inverse());
- first_time_kinematic=false;
+ first_time_kinematic = false;
}
- } else if (mode==Physics2DServer::BODY_MODE_STATIC) {
+ } else if (mode == Physics2DServer::BODY_MODE_STATIC) {
_set_transform(p_variant);
_set_inv_transform(get_transform().affine_inverse());
wakeup_neighbours();
} else {
Matrix32 t = p_variant;
t.orthonormalize();
- new_transform=get_transform(); //used as old to compute motion
- if (t==new_transform)
+ new_transform = get_transform(); //used as old to compute motion
+ if (t == new_transform)
break;
_set_transform(t);
_set_inv_transform(get_transform().inverse());
-
}
wakeup();
@@ -303,45 +289,44 @@ void Body2DSW::set_state(Physics2DServer::BodyState p_state, const Variant& p_va
//if (mode==Physics2DServer::BODY_MODE_STATIC)
// break;
- linear_velocity=p_variant;
+ linear_velocity = p_variant;
wakeup();
} break;
case Physics2DServer::BODY_STATE_ANGULAR_VELOCITY: {
//if (mode!=Physics2DServer::BODY_MODE_RIGID)
// break;
- angular_velocity=p_variant;
+ angular_velocity = p_variant;
wakeup();
} break;
case Physics2DServer::BODY_STATE_SLEEPING: {
//?
- if (mode==Physics2DServer::BODY_MODE_STATIC || mode==Physics2DServer::BODY_MODE_KINEMATIC)
+ if (mode == Physics2DServer::BODY_MODE_STATIC || mode == Physics2DServer::BODY_MODE_KINEMATIC)
break;
- bool do_sleep=p_variant;
+ bool do_sleep = p_variant;
if (do_sleep) {
- linear_velocity=Vector2();
+ linear_velocity = Vector2();
//biased_linear_velocity=Vector3();
- angular_velocity=0;
+ angular_velocity = 0;
//biased_angular_velocity=Vector3();
set_active(false);
} else {
- if (mode!=Physics2DServer::BODY_MODE_STATIC)
+ if (mode != Physics2DServer::BODY_MODE_STATIC)
set_active(true);
}
} break;
case Physics2DServer::BODY_STATE_CAN_SLEEP: {
- can_sleep=p_variant;
- if (mode==Physics2DServer::BODY_MODE_RIGID && !active && !can_sleep)
+ can_sleep = p_variant;
+ if (mode == Physics2DServer::BODY_MODE_RIGID && !active && !can_sleep)
set_active(true);
} break;
}
-
}
Variant Body2DSW::get_state(Physics2DServer::BodyState p_state) const {
- switch(p_state) {
+ switch (p_state) {
case Physics2DServer::BODY_STATE_TRANSFORM: {
return get_transform();
} break;
@@ -362,8 +347,7 @@ Variant Body2DSW::get_state(Physics2DServer::BodyState p_state) const {
return Variant();
}
-
-void Body2DSW::set_space(Space2DSW *p_space){
+void Body2DSW::set_space(Space2DSW *p_space) {
if (get_space()) {
@@ -375,7 +359,6 @@ void Body2DSW::set_space(Space2DSW *p_space){
get_space()->body_remove_from_active_list(&active_list);
if (direct_state_query_list.in_list())
get_space()->body_remove_from_state_query_list(&direct_state_query_list);
-
}
_set_space(p_space);
@@ -385,23 +368,22 @@ void Body2DSW::set_space(Space2DSW *p_space){
_update_inertia();
if (active)
get_space()->body_add_to_active_list(&active_list);
-// _update_queries();
+ // _update_queries();
//if (is_active()) {
// active=false;
// set_active(true);
//}
-
}
- first_integration=false;
+ first_integration = false;
}
void Body2DSW::_compute_area_gravity_and_dampenings(const Area2DSW *p_area) {
if (p_area->is_gravity_point()) {
- if(p_area->get_gravity_distance_scale() > 0) {
+ if (p_area->get_gravity_distance_scale() > 0) {
Vector2 v = p_area->get_transform().xform(p_area->get_gravity_vector()) - get_transform().get_origin();
- gravity += v.normalized() * (p_area->get_gravity() / Math::pow(v.length() * p_area->get_gravity_distance_scale()+1, 2) );
+ gravity += v.normalized() * (p_area->get_gravity() / Math::pow(v.length() * p_area->get_gravity_distance_scale() + 1, 2));
} else {
gravity += (p_area->get_transform().xform(p_area->get_gravity_vector()) - get_transform().get_origin()).normalized() * p_area->get_gravity();
}
@@ -415,7 +397,7 @@ void Body2DSW::_compute_area_gravity_and_dampenings(const Area2DSW *p_area) {
void Body2DSW::integrate_forces(real_t p_step) {
- if (mode==Physics2DServer::BODY_MODE_STATIC)
+ if (mode == Physics2DServer::BODY_MODE_STATIC)
return;
Area2DSW *def_area = get_space()->get_default_area();
@@ -424,62 +406,62 @@ void Body2DSW::integrate_forces(real_t p_step) {
int ac = areas.size();
bool stopped = false;
- gravity = Vector2(0,0);
+ gravity = Vector2(0, 0);
area_angular_damp = 0;
area_linear_damp = 0;
if (ac) {
areas.sort();
const AreaCMP *aa = &areas[0];
// damp_area = aa[ac-1].area;
- for(int i=ac-1;i>=0 && !stopped;i--) {
- Physics2DServer::AreaSpaceOverrideMode mode=aa[i].area->get_space_override_mode();
+ for (int i = ac - 1; i >= 0 && !stopped; i--) {
+ Physics2DServer::AreaSpaceOverrideMode mode = aa[i].area->get_space_override_mode();
switch (mode) {
case Physics2DServer::AREA_SPACE_OVERRIDE_COMBINE:
case Physics2DServer::AREA_SPACE_OVERRIDE_COMBINE_REPLACE: {
_compute_area_gravity_and_dampenings(aa[i].area);
- stopped = mode==Physics2DServer::AREA_SPACE_OVERRIDE_COMBINE_REPLACE;
+ stopped = mode == Physics2DServer::AREA_SPACE_OVERRIDE_COMBINE_REPLACE;
} break;
case Physics2DServer::AREA_SPACE_OVERRIDE_REPLACE:
case Physics2DServer::AREA_SPACE_OVERRIDE_REPLACE_COMBINE: {
- gravity = Vector2(0,0);
+ gravity = Vector2(0, 0);
area_angular_damp = 0;
area_linear_damp = 0;
_compute_area_gravity_and_dampenings(aa[i].area);
- stopped = mode==Physics2DServer::AREA_SPACE_OVERRIDE_REPLACE;
+ stopped = mode == Physics2DServer::AREA_SPACE_OVERRIDE_REPLACE;
} break;
default: {}
}
}
}
- if( !stopped ) {
+ if (!stopped) {
_compute_area_gravity_and_dampenings(def_area);
}
- gravity*=gravity_scale;
+ gravity *= gravity_scale;
// If less than 0, override dampenings with that of the Body2D
- if (angular_damp>=0)
+ if (angular_damp >= 0)
area_angular_damp = angular_damp;
//else
// area_angular_damp=damp_area->get_angular_damp();
- if (linear_damp>=0)
+ if (linear_damp >= 0)
area_linear_damp = linear_damp;
//else
// area_linear_damp=damp_area->get_linear_damp();
Vector2 motion;
- bool do_motion=false;
+ bool do_motion = false;
- if (mode==Physics2DServer::BODY_MODE_KINEMATIC) {
+ if (mode == Physics2DServer::BODY_MODE_KINEMATIC) {
//compute motion, angular and etc. velocities from prev transform
- linear_velocity = (new_transform.elements[2] - get_transform().elements[2])/p_step;
+ linear_velocity = (new_transform.elements[2] - get_transform().elements[2]) / p_step;
real_t rot = new_transform.affine_inverse().basis_xform(get_transform().elements[1]).angle();
angular_velocity = rot / p_step;
motion = new_transform.elements[2] - get_transform().elements[2];
- do_motion=true;
+ do_motion = true;
//for(int i=0;i<get_shape_count();i++) {
// set_shape_kinematic_advance(i,Vector2());
@@ -490,102 +472,96 @@ void Body2DSW::integrate_forces(real_t p_step) {
if (!omit_force_integration && !first_integration) {
//overriden by direct state query
- Vector2 force=gravity*mass;
- force+=applied_force;
- real_t torque=applied_torque;
+ Vector2 force = gravity * mass;
+ force += applied_force;
+ real_t torque = applied_torque;
real_t damp = 1.0 - p_step * area_linear_damp;
- if (damp<0) // reached zero in the given time
- damp=0;
+ if (damp < 0) // reached zero in the given time
+ damp = 0;
real_t angular_damp = 1.0 - p_step * area_angular_damp;
- if (angular_damp<0) // reached zero in the given time
- angular_damp=0;
+ if (angular_damp < 0) // reached zero in the given time
+ angular_damp = 0;
- linear_velocity*=damp;
- angular_velocity*=angular_damp;
+ linear_velocity *= damp;
+ angular_velocity *= angular_damp;
- linear_velocity+=_inv_mass * force * p_step;
- angular_velocity+=_inv_inertia * torque * p_step;
+ linear_velocity += _inv_mass * force * p_step;
+ angular_velocity += _inv_inertia * torque * p_step;
}
- if (continuous_cd_mode!=Physics2DServer::CCD_MODE_DISABLED) {
+ if (continuous_cd_mode != Physics2DServer::CCD_MODE_DISABLED) {
motion = new_transform.get_origin() - get_transform().get_origin();
//linear_velocity*p_step;
- do_motion=true;
+ do_motion = true;
}
}
-
//motion=linear_velocity*p_step;
- first_integration=false;
- biased_angular_velocity=0;
- biased_linear_velocity=Vector2();
+ first_integration = false;
+ biased_angular_velocity = 0;
+ biased_linear_velocity = Vector2();
- if (do_motion) {//shapes temporarily extend for raycast
+ if (do_motion) { //shapes temporarily extend for raycast
_update_shapes_with_motion(motion);
}
// damp_area=NULL; // clear the area, so it is set in the next frame
- def_area=NULL; // clear the area, so it is set in the next frame
- contact_count=0;
-
+ def_area = NULL; // clear the area, so it is set in the next frame
+ contact_count = 0;
}
void Body2DSW::integrate_velocities(real_t p_step) {
- if (mode==Physics2DServer::BODY_MODE_STATIC)
+ if (mode == Physics2DServer::BODY_MODE_STATIC)
return;
if (fi_callback)
get_space()->body_add_to_state_query_list(&direct_state_query_list);
- if (mode==Physics2DServer::BODY_MODE_KINEMATIC) {
+ if (mode == Physics2DServer::BODY_MODE_KINEMATIC) {
- _set_transform(new_transform,false);
+ _set_transform(new_transform, false);
_set_inv_transform(new_transform.affine_inverse());
- if (contacts.size()==0 && linear_velocity==Vector2() && angular_velocity==0)
+ if (contacts.size() == 0 && linear_velocity == Vector2() && angular_velocity == 0)
set_active(false); //stopped moving, deactivate
return;
}
- real_t total_angular_velocity = angular_velocity+biased_angular_velocity;
- Vector2 total_linear_velocity=linear_velocity+biased_linear_velocity;
+ real_t total_angular_velocity = angular_velocity + biased_angular_velocity;
+ Vector2 total_linear_velocity = linear_velocity + biased_linear_velocity;
real_t angle = get_transform().get_rotation() - total_angular_velocity * p_step;
Vector2 pos = get_transform().get_origin() + total_linear_velocity * p_step;
- _set_transform(Matrix32(angle,pos),continuous_cd_mode==Physics2DServer::CCD_MODE_DISABLED);
+ _set_transform(Matrix32(angle, pos), continuous_cd_mode == Physics2DServer::CCD_MODE_DISABLED);
_set_inv_transform(get_transform().inverse());
- if (continuous_cd_mode!=Physics2DServer::CCD_MODE_DISABLED)
- new_transform=get_transform();
+ if (continuous_cd_mode != Physics2DServer::CCD_MODE_DISABLED)
+ new_transform = get_transform();
//_update_inertia_tensor();
}
-
-
void Body2DSW::wakeup_neighbours() {
+ for (Map<Constraint2DSW *, int>::Element *E = constraint_map.front(); E; E = E->next()) {
-
- for(Map<Constraint2DSW*,int>::Element *E=constraint_map.front();E;E=E->next()) {
-
- const Constraint2DSW *c=E->key();
+ const Constraint2DSW *c = E->key();
Body2DSW **n = c->get_body_ptr();
- int bc=c->get_body_count();
+ int bc = c->get_body_count();
- for(int i=0;i<bc;i++) {
+ for (int i = 0; i < bc; i++) {
- if (i==E->get())
+ if (i == E->get())
continue;
Body2DSW *b = n[i];
- if (b->mode!=Physics2DServer::BODY_MODE_RIGID)
+ if (b->mode != Physics2DServer::BODY_MODE_RIGID)
continue;
if (!b->is_active())
@@ -596,116 +572,103 @@ void Body2DSW::wakeup_neighbours() {
void Body2DSW::call_queries() {
-
if (fi_callback) {
Physics2DDirectBodyStateSW *dbs = Physics2DDirectBodyStateSW::singleton;
- dbs->body=this;
-
- Variant v=dbs;
- const Variant *vp[2]={&v,&fi_callback->callback_udata};
+ dbs->body = this;
+ Variant v = dbs;
+ const Variant *vp[2] = { &v, &fi_callback->callback_udata };
Object *obj = ObjectDB::get_instance(fi_callback->id);
if (!obj) {
- set_force_integration_callback(0,StringName());
+ set_force_integration_callback(0, StringName());
} else {
Variant::CallError ce;
if (fi_callback->callback_udata.get_type()) {
- obj->call(fi_callback->method,vp,2,ce);
+ obj->call(fi_callback->method, vp, 2, ce);
} else {
- obj->call(fi_callback->method,vp,1,ce);
+ obj->call(fi_callback->method, vp, 1, ce);
}
}
-
-
}
-
}
+bool Body2DSW::sleep_test(real_t p_step) {
-bool Body2DSW::sleep_test(real_t p_step) {
-
- if (mode==Physics2DServer::BODY_MODE_STATIC || mode==Physics2DServer::BODY_MODE_KINEMATIC)
+ if (mode == Physics2DServer::BODY_MODE_STATIC || mode == Physics2DServer::BODY_MODE_KINEMATIC)
return true; //
- else if (mode==Physics2DServer::BODY_MODE_CHARACTER)
+ else if (mode == Physics2DServer::BODY_MODE_CHARACTER)
return !active; // characters and kinematic bodies don't sleep unless asked to sleep
else if (!can_sleep)
return false;
+ if (Math::abs(angular_velocity) < get_space()->get_body_angular_velocity_sleep_treshold() && Math::abs(linear_velocity.length_squared()) < get_space()->get_body_linear_velocity_sleep_treshold() * get_space()->get_body_linear_velocity_sleep_treshold()) {
-
-
- if (Math::abs(angular_velocity)<get_space()->get_body_angular_velocity_sleep_treshold() && Math::abs(linear_velocity.length_squared()) < get_space()->get_body_linear_velocity_sleep_treshold()*get_space()->get_body_linear_velocity_sleep_treshold()) {
-
- still_time+=p_step;
+ still_time += p_step;
return still_time > get_space()->get_body_time_to_sleep();
} else {
- still_time=0; //maybe this should be set to 0 on set_active?
+ still_time = 0; //maybe this should be set to 0 on set_active?
return false;
}
}
-
-void Body2DSW::set_force_integration_callback(ObjectID p_id,const StringName& p_method,const Variant& p_udata) {
+void Body2DSW::set_force_integration_callback(ObjectID p_id, const StringName &p_method, const Variant &p_udata) {
if (fi_callback) {
memdelete(fi_callback);
- fi_callback=NULL;
+ fi_callback = NULL;
}
+ if (p_id != 0) {
- if (p_id!=0) {
-
- fi_callback=memnew(ForceIntegrationCallback);
- fi_callback->id=p_id;
- fi_callback->method=p_method;
- fi_callback->callback_udata=p_udata;
+ fi_callback = memnew(ForceIntegrationCallback);
+ fi_callback->id = p_id;
+ fi_callback->method = p_method;
+ fi_callback->callback_udata = p_udata;
}
-
}
-Body2DSW::Body2DSW() : CollisionObject2DSW(TYPE_BODY), active_list(this), inertia_update_list(this), direct_state_query_list(this) {
-
+Body2DSW::Body2DSW()
+ : CollisionObject2DSW(TYPE_BODY), active_list(this), inertia_update_list(this), direct_state_query_list(this) {
- mode=Physics2DServer::BODY_MODE_RIGID;
- active=true;
- angular_velocity=0;
- biased_angular_velocity=0;
- mass=1;
- user_inertia=false;
- _inv_inertia=0;
- _inv_mass=1;
- bounce=0;
- friction=1;
- omit_force_integration=false;
- applied_torque=0;
- island_step=0;
- island_next=NULL;
- island_list_next=NULL;
+ mode = Physics2DServer::BODY_MODE_RIGID;
+ active = true;
+ angular_velocity = 0;
+ biased_angular_velocity = 0;
+ mass = 1;
+ user_inertia = false;
+ _inv_inertia = 0;
+ _inv_mass = 1;
+ bounce = 0;
+ friction = 1;
+ omit_force_integration = false;
+ applied_torque = 0;
+ island_step = 0;
+ island_next = NULL;
+ island_list_next = NULL;
_set_static(false);
- first_time_kinematic=false;
- linear_damp=-1;
- angular_damp=-1;
- area_angular_damp=0;
- area_linear_damp=0;
- contact_count=0;
- gravity_scale=1.0;
- using_one_way_cache=false;
- one_way_collision_max_depth=0.1;
- first_integration=false;
-
- still_time=0;
- continuous_cd_mode=Physics2DServer::CCD_MODE_DISABLED;
- can_sleep=false;
- fi_callback=NULL;
+ first_time_kinematic = false;
+ linear_damp = -1;
+ angular_damp = -1;
+ area_angular_damp = 0;
+ area_linear_damp = 0;
+ contact_count = 0;
+ gravity_scale = 1.0;
+ using_one_way_cache = false;
+ one_way_collision_max_depth = 0.1;
+ first_integration = false;
+ still_time = 0;
+ continuous_cd_mode = Physics2DServer::CCD_MODE_DISABLED;
+ can_sleep = false;
+ fi_callback = NULL;
}
Body2DSW::~Body2DSW() {
@@ -714,17 +677,16 @@ Body2DSW::~Body2DSW() {
memdelete(fi_callback);
}
-Physics2DDirectBodyStateSW *Physics2DDirectBodyStateSW::singleton=NULL;
+Physics2DDirectBodyStateSW *Physics2DDirectBodyStateSW::singleton = NULL;
-Physics2DDirectSpaceState* Physics2DDirectBodyStateSW::get_space_state() {
+Physics2DDirectSpaceState *Physics2DDirectBodyStateSW::get_space_state() {
return body->get_space()->get_direct_state();
}
-
Variant Physics2DDirectBodyStateSW::get_contact_collider_shape_metadata(int p_contact_idx) const {
- ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,Variant());
+ ERR_FAIL_INDEX_V(p_contact_idx, body->contact_count, Variant());
if (!Physics2DServerSW::singletonsw->body_owner.owns(body->contacts[p_contact_idx].collider)) {
@@ -733,11 +695,10 @@ Variant Physics2DDirectBodyStateSW::get_contact_collider_shape_metadata(int p_co
Body2DSW *other = Physics2DServerSW::singletonsw->body_owner.get(body->contacts[p_contact_idx].collider);
int sidx = body->contacts[p_contact_idx].collider_shape;
- if (sidx<0 || sidx>=other->get_shape_count()) {
+ if (sidx < 0 || sidx >= other->get_shape_count()) {
return Variant();
}
-
return other->get_shape_metadata(sidx);
}
diff --git a/servers/physics_2d/body_2d_sw.h b/servers/physics_2d/body_2d_sw.h
index ea42e604a..a8d8cc407 100644
--- a/servers/physics_2d/body_2d_sw.h
+++ b/servers/physics_2d/body_2d_sw.h
@@ -29,16 +29,14 @@
#ifndef BODY_2D_SW_H
#define BODY_2D_SW_H
+#include "area_2d_sw.h"
#include "collision_object_2d_sw.h"
#include "vset.h"
-#include "area_2d_sw.h"
class Constraint2DSW;
-
class Body2DSW : public CollisionObject2DSW {
-
Physics2DServer::BodyMode mode;
Vector2 biased_linear_velocity;
@@ -71,7 +69,6 @@ class Body2DSW : public CollisionObject2DSW {
Vector2 one_way_collision_direction;
float one_way_collision_max_depth;
-
SelfList<Body2DSW> active_list;
SelfList<Body2DSW> inertia_update_list;
SelfList<Body2DSW> direct_state_query_list;
@@ -88,25 +85,25 @@ class Body2DSW : public CollisionObject2DSW {
virtual void _shapes_changed();
Matrix32 new_transform;
-
- Map<Constraint2DSW*,int> constraint_map;
+ Map<Constraint2DSW *, int> constraint_map;
struct AreaCMP {
Area2DSW *area;
int refCount;
- _FORCE_INLINE_ bool operator==(const AreaCMP& p_cmp) const { return area->get_self() == p_cmp.area->get_self();}
- _FORCE_INLINE_ bool operator<(const AreaCMP& p_cmp) const { return area->get_priority() < p_cmp.area->get_priority();}
+ _FORCE_INLINE_ bool operator==(const AreaCMP &p_cmp) const { return area->get_self() == p_cmp.area->get_self(); }
+ _FORCE_INLINE_ bool operator<(const AreaCMP &p_cmp) const { return area->get_priority() < p_cmp.area->get_priority(); }
_FORCE_INLINE_ AreaCMP() {}
- _FORCE_INLINE_ AreaCMP(Area2DSW *p_area) { area=p_area; refCount=1;}
+ _FORCE_INLINE_ AreaCMP(Area2DSW *p_area) {
+ area = p_area;
+ refCount = 1;
+ }
};
-
Vector<AreaCMP> areas;
struct Contact {
-
Vector2 local_pos;
Vector2 local_normal;
float depth;
@@ -130,24 +127,20 @@ class Body2DSW : public CollisionObject2DSW {
ForceIntegrationCallback *fi_callback;
-
uint64_t island_step;
Body2DSW *island_next;
Body2DSW *island_list_next;
_FORCE_INLINE_ void _compute_area_gravity_and_dampenings(const Area2DSW *p_area);
-friend class Physics2DDirectBodyStateSW; // i give up, too many functions to expose
+ friend class Physics2DDirectBodyStateSW; // i give up, too many functions to expose
public:
-
-
- void set_force_integration_callback(ObjectID p_id, const StringName& p_method, const Variant &p_udata=Variant());
-
+ void set_force_integration_callback(ObjectID p_id, const StringName &p_method, const Variant &p_udata = Variant());
_FORCE_INLINE_ void add_area(Area2DSW *p_area) {
int index = areas.find(AreaCMP(p_area));
- if( index > -1 ) {
+ if (index > -1) {
areas[index].refCount += 1;
} else {
areas.ordered_insert(AreaCMP(p_area));
@@ -156,62 +149,64 @@ public:
_FORCE_INLINE_ void remove_area(Area2DSW *p_area) {
int index = areas.find(AreaCMP(p_area));
- if( index > -1 ) {
+ if (index > -1) {
areas[index].refCount -= 1;
- if( areas[index].refCount < 1 )
+ if (areas[index].refCount < 1)
areas.remove(index);
}
}
- _FORCE_INLINE_ void set_max_contacts_reported(int p_size) { contacts.resize(p_size); contact_count=0; if (mode==Physics2DServer::BODY_MODE_KINEMATIC && p_size) set_active(true);}
+ _FORCE_INLINE_ void set_max_contacts_reported(int p_size) {
+ contacts.resize(p_size);
+ contact_count = 0;
+ if (mode == Physics2DServer::BODY_MODE_KINEMATIC && p_size) set_active(true);
+ }
_FORCE_INLINE_ int get_max_contacts_reported() const { return contacts.size(); }
_FORCE_INLINE_ bool can_report_contacts() const { return !contacts.empty(); }
- _FORCE_INLINE_ void add_contact(const Vector2& p_local_pos,const Vector2& p_local_normal, float p_depth, int p_local_shape, const Vector2& p_collider_pos, int p_collider_shape, ObjectID p_collider_instance_id, const RID& p_collider,const Vector2& p_collider_velocity_at_pos);
+ _FORCE_INLINE_ void add_contact(const Vector2 &p_local_pos, const Vector2 &p_local_normal, float p_depth, int p_local_shape, const Vector2 &p_collider_pos, int p_collider_shape, ObjectID p_collider_instance_id, const RID &p_collider, const Vector2 &p_collider_velocity_at_pos);
-
- _FORCE_INLINE_ void add_exception(const RID& p_exception) { exceptions.insert(p_exception);}
- _FORCE_INLINE_ void remove_exception(const RID& p_exception) { exceptions.erase(p_exception);}
- _FORCE_INLINE_ bool has_exception(const RID& p_exception) const { return exceptions.has(p_exception);}
- _FORCE_INLINE_ const VSet<RID>& get_exceptions() const { return exceptions;}
+ _FORCE_INLINE_ void add_exception(const RID &p_exception) { exceptions.insert(p_exception); }
+ _FORCE_INLINE_ void remove_exception(const RID &p_exception) { exceptions.erase(p_exception); }
+ _FORCE_INLINE_ bool has_exception(const RID &p_exception) const { return exceptions.has(p_exception); }
+ _FORCE_INLINE_ const VSet<RID> &get_exceptions() const { return exceptions; }
_FORCE_INLINE_ uint64_t get_island_step() const { return island_step; }
- _FORCE_INLINE_ void set_island_step(uint64_t p_step) { island_step=p_step; }
+ _FORCE_INLINE_ void set_island_step(uint64_t p_step) { island_step = p_step; }
- _FORCE_INLINE_ Body2DSW* get_island_next() const { return island_next; }
- _FORCE_INLINE_ void set_island_next(Body2DSW* p_next) { island_next=p_next; }
+ _FORCE_INLINE_ Body2DSW *get_island_next() const { return island_next; }
+ _FORCE_INLINE_ void set_island_next(Body2DSW *p_next) { island_next = p_next; }
- _FORCE_INLINE_ Body2DSW* get_island_list_next() const { return island_list_next; }
- _FORCE_INLINE_ void set_island_list_next(Body2DSW* p_next) { island_list_next=p_next; }
+ _FORCE_INLINE_ Body2DSW *get_island_list_next() const { return island_list_next; }
+ _FORCE_INLINE_ void set_island_list_next(Body2DSW *p_next) { island_list_next = p_next; }
- _FORCE_INLINE_ void add_constraint(Constraint2DSW* p_constraint, int p_pos) { constraint_map[p_constraint]=p_pos; }
- _FORCE_INLINE_ void remove_constraint(Constraint2DSW* p_constraint) { constraint_map.erase(p_constraint); }
- const Map<Constraint2DSW*,int>& get_constraint_map() const { return constraint_map; }
+ _FORCE_INLINE_ void add_constraint(Constraint2DSW *p_constraint, int p_pos) { constraint_map[p_constraint] = p_pos; }
+ _FORCE_INLINE_ void remove_constraint(Constraint2DSW *p_constraint) { constraint_map.erase(p_constraint); }
+ const Map<Constraint2DSW *, int> &get_constraint_map() const { return constraint_map; }
- _FORCE_INLINE_ void set_omit_force_integration(bool p_omit_force_integration) { omit_force_integration=p_omit_force_integration; }
+ _FORCE_INLINE_ void set_omit_force_integration(bool p_omit_force_integration) { omit_force_integration = p_omit_force_integration; }
_FORCE_INLINE_ bool get_omit_force_integration() const { return omit_force_integration; }
- _FORCE_INLINE_ void set_linear_velocity(const Vector2& p_velocity) {linear_velocity=p_velocity; }
+ _FORCE_INLINE_ void set_linear_velocity(const Vector2 &p_velocity) { linear_velocity = p_velocity; }
_FORCE_INLINE_ Vector2 get_linear_velocity() const { return linear_velocity; }
- _FORCE_INLINE_ void set_angular_velocity(real_t p_velocity) { angular_velocity=p_velocity; }
+ _FORCE_INLINE_ void set_angular_velocity(real_t p_velocity) { angular_velocity = p_velocity; }
_FORCE_INLINE_ real_t get_angular_velocity() const { return angular_velocity; }
- _FORCE_INLINE_ void set_biased_linear_velocity(const Vector2& p_velocity) {biased_linear_velocity=p_velocity; }
+ _FORCE_INLINE_ void set_biased_linear_velocity(const Vector2 &p_velocity) { biased_linear_velocity = p_velocity; }
_FORCE_INLINE_ Vector2 get_biased_linear_velocity() const { return biased_linear_velocity; }
- _FORCE_INLINE_ void set_biased_angular_velocity(real_t p_velocity) { biased_angular_velocity=p_velocity; }
+ _FORCE_INLINE_ void set_biased_angular_velocity(real_t p_velocity) { biased_angular_velocity = p_velocity; }
_FORCE_INLINE_ real_t get_biased_angular_velocity() const { return biased_angular_velocity; }
-
- _FORCE_INLINE_ void apply_impulse(const Vector2& p_offset, const Vector2& p_impulse) {
+ _FORCE_INLINE_ void apply_impulse(const Vector2 &p_offset, const Vector2 &p_impulse) {
linear_velocity += p_impulse * _inv_mass;
angular_velocity += _inv_inertia * p_offset.cross(p_impulse);
}
- _FORCE_INLINE_ void apply_bias_impulse(const Vector2& p_pos, const Vector2& p_j) {
+ _FORCE_INLINE_ void apply_bias_impulse(const Vector2 &p_pos, const Vector2 &p_j) {
biased_linear_velocity += p_j * _inv_mass;
biased_angular_velocity += _inv_inertia * p_pos.cross(p_j);
@@ -221,45 +216,42 @@ public:
_FORCE_INLINE_ bool is_active() const { return active; }
_FORCE_INLINE_ void wakeup() {
- if ((!get_space()) || mode==Physics2DServer::BODY_MODE_STATIC || mode==Physics2DServer::BODY_MODE_KINEMATIC)
+ if ((!get_space()) || mode == Physics2DServer::BODY_MODE_STATIC || mode == Physics2DServer::BODY_MODE_KINEMATIC)
return;
set_active(true);
}
-
-
-
void set_param(Physics2DServer::BodyParameter p_param, float);
float get_param(Physics2DServer::BodyParameter p_param) const;
void set_mode(Physics2DServer::BodyMode p_mode);
Physics2DServer::BodyMode get_mode() const;
- void set_state(Physics2DServer::BodyState p_state, const Variant& p_variant);
+ void set_state(Physics2DServer::BodyState p_state, const Variant &p_variant);
Variant get_state(Physics2DServer::BodyState p_state) const;
- void set_applied_force(const Vector2& p_force) { applied_force=p_force; }
+ void set_applied_force(const Vector2 &p_force) { applied_force = p_force; }
Vector2 get_applied_force() const { return applied_force; }
- void set_applied_torque(real_t p_torque) { applied_torque=p_torque; }
+ void set_applied_torque(real_t p_torque) { applied_torque = p_torque; }
real_t get_applied_torque() const { return applied_torque; }
- _FORCE_INLINE_ void add_force(const Vector2& p_force, const Vector2& p_offset) {
+ _FORCE_INLINE_ void add_force(const Vector2 &p_force, const Vector2 &p_offset) {
applied_force += p_force;
applied_torque += p_offset.cross(p_force);
}
- _FORCE_INLINE_ void set_continuous_collision_detection_mode(Physics2DServer::CCDMode p_mode) { continuous_cd_mode=p_mode; }
+ _FORCE_INLINE_ void set_continuous_collision_detection_mode(Physics2DServer::CCDMode p_mode) { continuous_cd_mode = p_mode; }
_FORCE_INLINE_ Physics2DServer::CCDMode get_continuous_collision_detection_mode() const { return continuous_cd_mode; }
- void set_one_way_collision_direction(const Vector2& p_dir) {
- one_way_collision_direction=p_dir;
- using_one_way_cache=one_way_collision_direction!=Vector2();
+ void set_one_way_collision_direction(const Vector2 &p_dir) {
+ one_way_collision_direction = p_dir;
+ using_one_way_cache = one_way_collision_direction != Vector2();
}
Vector2 get_one_way_collision_direction() const { return one_way_collision_direction; }
- void set_one_way_collision_max_depth(float p_depth) { one_way_collision_max_depth=p_depth; }
+ void set_one_way_collision_max_depth(float p_depth) { one_way_collision_max_depth = p_depth; }
float get_one_way_collision_max_depth() const { return one_way_collision_max_depth; }
_FORCE_INLINE_ bool is_using_one_way_collision() const { return using_one_way_cache; }
@@ -276,16 +268,15 @@ public:
_FORCE_INLINE_ real_t get_linear_damp() const { return linear_damp; }
_FORCE_INLINE_ real_t get_angular_damp() const { return angular_damp; }
-
void integrate_forces(real_t p_step);
void integrate_velocities(real_t p_step);
_FORCE_INLINE_ Vector2 get_motion() const {
- if (mode>Physics2DServer::BODY_MODE_KINEMATIC) {
+ if (mode > Physics2DServer::BODY_MODE_KINEMATIC) {
return new_transform.get_origin() - get_transform().get_origin();
- } else if (mode==Physics2DServer::BODY_MODE_KINEMATIC) {
- return get_transform().get_origin() -new_transform.get_origin(); //kinematic simulates forward
+ } else if (mode == Physics2DServer::BODY_MODE_KINEMATIC) {
+ return get_transform().get_origin() - new_transform.get_origin(); //kinematic simulates forward
}
return Vector2();
}
@@ -297,111 +288,127 @@ public:
Body2DSW();
~Body2DSW();
-
};
-
//add contact inline
-void Body2DSW::add_contact(const Vector2& p_local_pos,const Vector2& p_local_normal, float p_depth, int p_local_shape, const Vector2& p_collider_pos, int p_collider_shape, ObjectID p_collider_instance_id, const RID& p_collider,const Vector2& p_collider_velocity_at_pos) {
+void Body2DSW::add_contact(const Vector2 &p_local_pos, const Vector2 &p_local_normal, float p_depth, int p_local_shape, const Vector2 &p_collider_pos, int p_collider_shape, ObjectID p_collider_instance_id, const RID &p_collider, const Vector2 &p_collider_velocity_at_pos) {
- int c_max=contacts.size();
+ int c_max = contacts.size();
- if (c_max==0)
+ if (c_max == 0)
return;
Contact *c = &contacts[0];
+ int idx = -1;
- int idx=-1;
-
- if (contact_count<c_max) {
- idx=contact_count++;
+ if (contact_count < c_max) {
+ idx = contact_count++;
} else {
- float least_depth=1e20;
- int least_deep=-1;
- for(int i=0;i<c_max;i++) {
+ float least_depth = 1e20;
+ int least_deep = -1;
+ for (int i = 0; i < c_max; i++) {
- if (i==0 || c[i].depth<least_depth) {
- least_deep=i;
- least_depth=c[i].depth;
+ if (i == 0 || c[i].depth < least_depth) {
+ least_deep = i;
+ least_depth = c[i].depth;
}
}
- if (least_deep>=0 && least_depth<p_depth) {
+ if (least_deep >= 0 && least_depth < p_depth) {
- idx=least_deep;
+ idx = least_deep;
}
- if (idx==-1)
+ if (idx == -1)
return; //none least deepe than this
}
- c[idx].local_pos=p_local_pos;
- c[idx].local_normal=p_local_normal;
- c[idx].depth=p_depth;
- c[idx].local_shape=p_local_shape;
- c[idx].collider_pos=p_collider_pos;
- c[idx].collider_shape=p_collider_shape;
- c[idx].collider_instance_id=p_collider_instance_id;
- c[idx].collider=p_collider;
- c[idx].collider_velocity_at_pos=p_collider_velocity_at_pos;
-
+ c[idx].local_pos = p_local_pos;
+ c[idx].local_normal = p_local_normal;
+ c[idx].depth = p_depth;
+ c[idx].local_shape = p_local_shape;
+ c[idx].collider_pos = p_collider_pos;
+ c[idx].collider_shape = p_collider_shape;
+ c[idx].collider_instance_id = p_collider_instance_id;
+ c[idx].collider = p_collider;
+ c[idx].collider_velocity_at_pos = p_collider_velocity_at_pos;
}
-
class Physics2DDirectBodyStateSW : public Physics2DDirectBodyState {
- OBJ_TYPE( Physics2DDirectBodyStateSW, Physics2DDirectBodyState );
+ OBJ_TYPE(Physics2DDirectBodyStateSW, Physics2DDirectBodyState);
public:
-
static Physics2DDirectBodyStateSW *singleton;
Body2DSW *body;
real_t step;
- virtual Vector2 get_total_gravity() const { return body->gravity; } // get gravity vector working on this body space/area
- virtual float get_total_angular_damp() const { return body->area_angular_damp; } // get density of this body space/area
- virtual float get_total_linear_damp() const { return body->area_linear_damp; } // get density of this body space/area
+ virtual Vector2 get_total_gravity() const { return body->gravity; } // get gravity vector working on this body space/area
+ virtual float get_total_angular_damp() const { return body->area_angular_damp; } // get density of this body space/area
+ virtual float get_total_linear_damp() const { return body->area_linear_damp; } // get density of this body space/area
- virtual float get_inverse_mass() const { return body->get_inv_mass(); } // get the mass
- virtual real_t get_inverse_inertia() const { return body->get_inv_inertia(); } // get density of this body space
+ virtual float get_inverse_mass() const { return body->get_inv_mass(); } // get the mass
+ virtual real_t get_inverse_inertia() const { return body->get_inv_inertia(); } // get density of this body space
- virtual void set_linear_velocity(const Vector2& p_velocity) { body->set_linear_velocity(p_velocity); }
- virtual Vector2 get_linear_velocity() const { return body->get_linear_velocity(); }
+ virtual void set_linear_velocity(const Vector2 &p_velocity) { body->set_linear_velocity(p_velocity); }
+ virtual Vector2 get_linear_velocity() const { return body->get_linear_velocity(); }
- virtual void set_angular_velocity(real_t p_velocity) { body->set_angular_velocity(p_velocity); }
- virtual real_t get_angular_velocity() const { return body->get_angular_velocity(); }
+ virtual void set_angular_velocity(real_t p_velocity) { body->set_angular_velocity(p_velocity); }
+ virtual real_t get_angular_velocity() const { return body->get_angular_velocity(); }
- virtual void set_transform(const Matrix32& p_transform) { body->set_state(Physics2DServer::BODY_STATE_TRANSFORM,p_transform); }
- virtual Matrix32 get_transform() const { return body->get_transform(); }
+ virtual void set_transform(const Matrix32 &p_transform) { body->set_state(Physics2DServer::BODY_STATE_TRANSFORM, p_transform); }
+ virtual Matrix32 get_transform() const { return body->get_transform(); }
- virtual void set_sleep_state(bool p_enable) { body->set_active(!p_enable); }
- virtual bool is_sleeping() const { return !body->is_active(); }
+ virtual void set_sleep_state(bool p_enable) { body->set_active(!p_enable); }
+ virtual bool is_sleeping() const { return !body->is_active(); }
- virtual int get_contact_count() const { return body->contact_count; }
+ virtual int get_contact_count() const { return body->contact_count; }
virtual Vector2 get_contact_local_pos(int p_contact_idx) const {
- ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,Vector2());
+ ERR_FAIL_INDEX_V(p_contact_idx, body->contact_count, Vector2());
return body->contacts[p_contact_idx].local_pos;
}
- virtual Vector2 get_contact_local_normal(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,Vector2()); return body->contacts[p_contact_idx].local_normal; }
- virtual int get_contact_local_shape(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,-1); return body->contacts[p_contact_idx].local_shape; }
+ virtual Vector2 get_contact_local_normal(int p_contact_idx) const {
+ ERR_FAIL_INDEX_V(p_contact_idx, body->contact_count, Vector2());
+ return body->contacts[p_contact_idx].local_normal;
+ }
+ virtual int get_contact_local_shape(int p_contact_idx) const {
+ ERR_FAIL_INDEX_V(p_contact_idx, body->contact_count, -1);
+ return body->contacts[p_contact_idx].local_shape;
+ }
- virtual RID get_contact_collider(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,RID()); return body->contacts[p_contact_idx].collider; }
- virtual Vector2 get_contact_collider_pos(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,Vector2()); return body->contacts[p_contact_idx].collider_pos; }
- virtual ObjectID get_contact_collider_id(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,0); return body->contacts[p_contact_idx].collider_instance_id; }
- virtual int get_contact_collider_shape(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,0); return body->contacts[p_contact_idx].collider_shape; }
+ virtual RID get_contact_collider(int p_contact_idx) const {
+ ERR_FAIL_INDEX_V(p_contact_idx, body->contact_count, RID());
+ return body->contacts[p_contact_idx].collider;
+ }
+ virtual Vector2 get_contact_collider_pos(int p_contact_idx) const {
+ ERR_FAIL_INDEX_V(p_contact_idx, body->contact_count, Vector2());
+ return body->contacts[p_contact_idx].collider_pos;
+ }
+ virtual ObjectID get_contact_collider_id(int p_contact_idx) const {
+ ERR_FAIL_INDEX_V(p_contact_idx, body->contact_count, 0);
+ return body->contacts[p_contact_idx].collider_instance_id;
+ }
+ virtual int get_contact_collider_shape(int p_contact_idx) const {
+ ERR_FAIL_INDEX_V(p_contact_idx, body->contact_count, 0);
+ return body->contacts[p_contact_idx].collider_shape;
+ }
virtual Variant get_contact_collider_shape_metadata(int p_contact_idx) const;
- virtual Vector2 get_contact_collider_velocity_at_pos(int p_contact_idx) const { ERR_FAIL_INDEX_V(p_contact_idx,body->contact_count,Vector2()); return body->contacts[p_contact_idx].collider_velocity_at_pos; }
-
- virtual Physics2DDirectSpaceState* get_space_state();
+ virtual Vector2 get_contact_collider_velocity_at_pos(int p_contact_idx) const {
+ ERR_FAIL_INDEX_V(p_contact_idx, body->contact_count, Vector2());
+ return body->contacts[p_contact_idx].collider_velocity_at_pos;
+ }
+ virtual Physics2DDirectSpaceState *get_space_state();
virtual real_t get_step() const { return step; }
- Physics2DDirectBodyStateSW() { singleton=this; body=NULL; }
+ Physics2DDirectBodyStateSW() {
+ singleton = this;
+ body = NULL;
+ }
};
-
#endif // BODY_2D_SW_H
diff --git a/servers/physics_2d/body_pair_2d_sw.cpp b/servers/physics_2d/body_pair_2d_sw.cpp
index 6fa4f154d..1f2cacd2b 100644
--- a/servers/physics_2d/body_pair_2d_sw.cpp
+++ b/servers/physics_2d/body_pair_2d_sw.cpp
@@ -30,54 +30,52 @@
#include "collision_solver_2d_sw.h"
#include "space_2d_sw.h"
-
#define POSITION_CORRECTION
#define ACCUMULATE_IMPULSES
-void BodyPair2DSW::_add_contact(const Vector2& p_point_A,const Vector2& p_point_B,void *p_self) {
+void BodyPair2DSW::_add_contact(const Vector2 &p_point_A, const Vector2 &p_point_B, void *p_self) {
BodyPair2DSW *self = (BodyPair2DSW *)p_self;
- self->_contact_added_callback(p_point_A,p_point_B);
-
+ self->_contact_added_callback(p_point_A, p_point_B);
}
-void BodyPair2DSW::_contact_added_callback(const Vector2& p_point_A,const Vector2& p_point_B) {
+void BodyPair2DSW::_contact_added_callback(const Vector2 &p_point_A, const Vector2 &p_point_B) {
// check if we already have the contact
Vector2 local_A = A->get_inv_transform().basis_xform(p_point_A);
- Vector2 local_B = B->get_inv_transform().basis_xform(p_point_B-offset_B);
+ Vector2 local_B = B->get_inv_transform().basis_xform(p_point_B - offset_B);
int new_index = contact_count;
- ERR_FAIL_COND( new_index >= (MAX_CONTACTS+1) );
+ ERR_FAIL_COND(new_index >= (MAX_CONTACTS + 1));
Contact contact;
- contact.acc_normal_impulse=0;
- contact.acc_bias_impulse=0;
- contact.acc_tangent_impulse=0;
- contact.local_A=local_A;
- contact.local_B=local_B;
- contact.reused=true;
- contact.normal=(p_point_A-p_point_B).normalized();
+ contact.acc_normal_impulse = 0;
+ contact.acc_bias_impulse = 0;
+ contact.acc_tangent_impulse = 0;
+ contact.local_A = local_A;
+ contact.local_B = local_B;
+ contact.reused = true;
+ contact.normal = (p_point_A - p_point_B).normalized();
// attempt to determine if the contact will be reused
real_t recycle_radius_2 = space->get_contact_recycle_radius() * space->get_contact_recycle_radius();
- for (int i=0;i<contact_count;i++) {
+ for (int i = 0; i < contact_count; i++) {
- Contact& c = contacts[i];
+ Contact &c = contacts[i];
if (
- c.local_A.distance_squared_to( local_A ) < (recycle_radius_2) &&
- c.local_B.distance_squared_to( local_B ) < (recycle_radius_2) ) {
+ c.local_A.distance_squared_to(local_A) < (recycle_radius_2) &&
+ c.local_B.distance_squared_to(local_B) < (recycle_radius_2)) {
- contact.acc_normal_impulse=c.acc_normal_impulse;
- contact.acc_tangent_impulse=c.acc_tangent_impulse;
- contact.acc_bias_impulse=c.acc_bias_impulse;
- new_index=i;
+ contact.acc_normal_impulse = c.acc_normal_impulse;
+ contact.acc_tangent_impulse = c.acc_tangent_impulse;
+ contact.acc_bias_impulse = c.acc_bias_impulse;
+ new_index = i;
break;
}
}
@@ -88,44 +86,41 @@ void BodyPair2DSW::_contact_added_callback(const Vector2& p_point_A,const Vector
// remove the contact with the minimum depth
- int least_deep=-1;
- real_t min_depth=1e10;
+ int least_deep = -1;
+ real_t min_depth = 1e10;
+ for (int i = 0; i <= contact_count; i++) {
- for (int i=0;i<=contact_count;i++) {
-
- Contact& c = (i==contact_count)?contact:contacts[i];
+ Contact &c = (i == contact_count) ? contact : contacts[i];
Vector2 global_A = A->get_transform().basis_xform(c.local_A);
- Vector2 global_B = B->get_transform().basis_xform(c.local_B)+offset_B;
+ Vector2 global_B = B->get_transform().basis_xform(c.local_B) + offset_B;
Vector2 axis = global_A - global_B;
- float depth = axis.dot( c.normal );
-
+ float depth = axis.dot(c.normal);
- if (depth<min_depth) {
+ if (depth < min_depth) {
- min_depth=depth;
- least_deep=i;
+ min_depth = depth;
+ least_deep = i;
}
}
- ERR_FAIL_COND(least_deep==-1);
+ ERR_FAIL_COND(least_deep == -1);
if (least_deep < contact_count) { //replace the last deep contact by the new one
- contacts[least_deep]=contact;
+ contacts[least_deep] = contact;
}
return;
}
- contacts[new_index]=contact;
+ contacts[new_index] = contact;
- if (new_index==contact_count) {
+ if (new_index == contact_count) {
contact_count++;
}
-
}
void BodyPair2DSW::_validate_contacts() {
@@ -133,39 +128,35 @@ void BodyPair2DSW::_validate_contacts() {
//make sure to erase contacts that are no longer valid
real_t max_separation = space->get_contact_max_separation();
- real_t max_separation2 = max_separation*max_separation;
+ real_t max_separation2 = max_separation * max_separation;
- for (int i=0;i<contact_count;i++) {
+ for (int i = 0; i < contact_count; i++) {
- Contact& c = contacts[i];
+ Contact &c = contacts[i];
- bool erase=false;
- if (c.reused==false) {
+ bool erase = false;
+ if (c.reused == false) {
//was left behind in previous frame
- erase=true;
+ erase = true;
} else {
- c.reused=false;
+ c.reused = false;
Vector2 global_A = A->get_transform().basis_xform(c.local_A);
- Vector2 global_B = B->get_transform().basis_xform(c.local_B)+offset_B;
+ Vector2 global_B = B->get_transform().basis_xform(c.local_B) + offset_B;
Vector2 axis = global_A - global_B;
- float depth = axis.dot( c.normal );
-
-
+ float depth = axis.dot(c.normal);
if (depth < -max_separation || (global_B + c.normal * depth - global_A).length_squared() > max_separation2) {
- erase=true;
+ erase = true;
}
}
if (erase) {
// contact no longer needed, remove
-
- if ((i+1) < contact_count) {
+ if ((i + 1) < contact_count) {
// swap with the last one
- SWAP( contacts[i], contacts[ contact_count-1 ] );
-
+ SWAP(contacts[i], contacts[contact_count - 1]);
}
i--;
@@ -174,21 +165,18 @@ void BodyPair2DSW::_validate_contacts() {
}
}
+bool BodyPair2DSW::_test_ccd(float p_step, Body2DSW *p_A, int p_shape_A, const Matrix32 &p_xform_A, Body2DSW *p_B, int p_shape_B, const Matrix32 &p_xform_B, bool p_swap_result) {
-bool BodyPair2DSW::_test_ccd(float p_step,Body2DSW *p_A, int p_shape_A,const Matrix32& p_xform_A,Body2DSW *p_B, int p_shape_B,const Matrix32& p_xform_B,bool p_swap_result) {
-
-
-
- Vector2 motion = p_A->get_linear_velocity()*p_step;
+ Vector2 motion = p_A->get_linear_velocity() * p_step;
real_t mlen = motion.length();
- if (mlen<CMP_EPSILON)
+ if (mlen < CMP_EPSILON)
return false;
Vector2 mnormal = motion / mlen;
- real_t min,max;
- p_A->get_shape(p_shape_A)->project_rangev(mnormal,p_xform_A,min,max);
- bool fast_object = mlen > (max-min)*0.3; //going too fast in that direction
+ real_t min, max;
+ p_A->get_shape(p_shape_A)->project_rangev(mnormal, p_xform_A, min, max);
+ bool fast_object = mlen > (max - min) * 0.3; //going too fast in that direction
if (!fast_object) { //did it move enough in this direction to even attempt raycast? let's say it should move more than 1/3 the size of the object in that axis
return false;
@@ -198,22 +186,21 @@ bool BodyPair2DSW::_test_ccd(float p_step,Body2DSW *p_A, int p_shape_A,const Mat
//support is the worst case collision point, so real collision happened before
int a;
Vector2 s[2];
- p_A->get_shape(p_shape_A)->get_supports(p_xform_A.basis_xform(mnormal).normalized(),s,a);
+ p_A->get_shape(p_shape_A)->get_supports(p_xform_A.basis_xform(mnormal).normalized(), s, a);
Vector2 from = p_xform_A.xform(s[0]);
Vector2 to = from + motion;
Matrix32 from_inv = p_xform_B.affine_inverse();
- Vector2 local_from = from_inv.xform(from-mnormal*mlen*0.1); //start from a little inside the bounding box
+ Vector2 local_from = from_inv.xform(from - mnormal * mlen * 0.1); //start from a little inside the bounding box
Vector2 local_to = from_inv.xform(to);
- Vector2 rpos,rnorm;
- if (!p_B->get_shape(p_shape_B)->intersect_segment(local_from,local_to,rpos,rnorm))
+ Vector2 rpos, rnorm;
+ if (!p_B->get_shape(p_shape_B)->intersect_segment(local_from, local_to, rpos, rnorm))
return false;
//ray hit something
-
Vector2 hitpos = p_xform_B.xform(rpos);
Vector2 contact_A = to;
@@ -222,20 +209,18 @@ bool BodyPair2DSW::_test_ccd(float p_step,Body2DSW *p_A, int p_shape_A,const Mat
//create a contact
if (p_swap_result)
- _contact_added_callback(contact_B,contact_A);
+ _contact_added_callback(contact_B, contact_A);
else
- _contact_added_callback(contact_A,contact_B);
-
+ _contact_added_callback(contact_A, contact_B);
return true;
}
bool BodyPair2DSW::setup(float p_step) {
-
//cannot collide
- if (!A->test_collision_mask(B) || A->has_exception(B->get_self()) || B->has_exception(A->get_self()) || (A->get_mode()<=Physics2DServer::BODY_MODE_KINEMATIC && B->get_mode()<=Physics2DServer::BODY_MODE_KINEMATIC && A->get_max_contacts_reported()==0 && B->get_max_contacts_reported()==0)) {
- collided=false;
+ if (!A->test_collision_mask(B) || A->has_exception(B->get_self()) || B->has_exception(A->get_self()) || (A->get_mode() <= Physics2DServer::BODY_MODE_KINEMATIC && B->get_mode() <= Physics2DServer::BODY_MODE_KINEMATIC && A->get_max_contacts_reported() == 0 && B->get_max_contacts_reported() == 0)) {
+ collided = false;
return false;
}
@@ -249,44 +234,43 @@ bool BodyPair2DSW::setup(float p_step) {
Matrix32 xform_A = xform_Au * A->get_shape_transform(shape_A);
Matrix32 xform_Bu = B->get_transform();
- xform_Bu.elements[2]-=A->get_transform().get_origin();
+ xform_Bu.elements[2] -= A->get_transform().get_origin();
Matrix32 xform_B = xform_Bu * B->get_shape_transform(shape_B);
- Shape2DSW *shape_A_ptr=A->get_shape(shape_A);
- Shape2DSW *shape_B_ptr=B->get_shape(shape_B);
+ Shape2DSW *shape_A_ptr = A->get_shape(shape_A);
+ Shape2DSW *shape_B_ptr = B->get_shape(shape_B);
- Vector2 motion_A,motion_B;
+ Vector2 motion_A, motion_B;
- if (A->get_continuous_collision_detection_mode()==Physics2DServer::CCD_MODE_CAST_SHAPE) {
- motion_A=A->get_motion();
+ if (A->get_continuous_collision_detection_mode() == Physics2DServer::CCD_MODE_CAST_SHAPE) {
+ motion_A = A->get_motion();
}
- if (B->get_continuous_collision_detection_mode()==Physics2DServer::CCD_MODE_CAST_SHAPE) {
- motion_B=B->get_motion();
+ if (B->get_continuous_collision_detection_mode() == Physics2DServer::CCD_MODE_CAST_SHAPE) {
+ motion_B = B->get_motion();
}
//faster to set than to check..
//bool prev_collided=collided;
- collided = CollisionSolver2DSW::solve(shape_A_ptr,xform_A,motion_A,shape_B_ptr,xform_B,motion_B,_add_contact,this,&sep_axis);
+ collided = CollisionSolver2DSW::solve(shape_A_ptr, xform_A, motion_A, shape_B_ptr, xform_B, motion_B, _add_contact, this, &sep_axis);
if (!collided) {
//test ccd (currently just a raycast)
- if (A->get_continuous_collision_detection_mode()==Physics2DServer::CCD_MODE_CAST_RAY && A->get_mode()>Physics2DServer::BODY_MODE_KINEMATIC) {
- if (_test_ccd(p_step,A,shape_A,xform_A,B,shape_B,xform_B))
- collided=true;
+ if (A->get_continuous_collision_detection_mode() == Physics2DServer::CCD_MODE_CAST_RAY && A->get_mode() > Physics2DServer::BODY_MODE_KINEMATIC) {
+ if (_test_ccd(p_step, A, shape_A, xform_A, B, shape_B, xform_B))
+ collided = true;
}
- if (B->get_continuous_collision_detection_mode()==Physics2DServer::CCD_MODE_CAST_RAY && B->get_mode()>Physics2DServer::BODY_MODE_KINEMATIC) {
- if (_test_ccd(p_step,B,shape_B,xform_B,A,shape_A,xform_A,true))
- collided=true;
+ if (B->get_continuous_collision_detection_mode() == Physics2DServer::CCD_MODE_CAST_RAY && B->get_mode() > Physics2DServer::BODY_MODE_KINEMATIC) {
+ if (_test_ccd(p_step, B, shape_B, xform_B, A, shape_A, xform_A, true))
+ collided = true;
}
if (!collided) {
- oneway_disabled=false;
+ oneway_disabled = false;
return false;
}
-
}
if (oneway_disabled)
@@ -297,45 +281,45 @@ bool BodyPair2DSW::setup(float p_step) {
if (A->is_using_one_way_collision()) {
Vector2 direction = A->get_one_way_collision_direction();
- bool valid=false;
- if (B->get_linear_velocity().dot(direction)>=0){
- for(int i=0;i<contact_count;i++) {
- Contact& c = contacts[i];
+ bool valid = false;
+ if (B->get_linear_velocity().dot(direction) >= 0) {
+ for (int i = 0; i < contact_count; i++) {
+ Contact &c = contacts[i];
if (!c.reused)
continue;
- if (c.normal.dot(direction)<0)
+ if (c.normal.dot(direction) < 0)
continue;
- valid=true;
+ valid = true;
break;
}
}
if (!valid) {
- collided=false;
- oneway_disabled=true;
+ collided = false;
+ oneway_disabled = true;
return false;
}
}
if (B->is_using_one_way_collision()) {
Vector2 direction = B->get_one_way_collision_direction();
- bool valid=false;
- if (A->get_linear_velocity().dot(direction)>=0){
- for(int i=0;i<contact_count;i++) {
- Contact& c = contacts[i];
+ bool valid = false;
+ if (A->get_linear_velocity().dot(direction) >= 0) {
+ for (int i = 0; i < contact_count; i++) {
+ Contact &c = contacts[i];
if (!c.reused)
continue;
- if (c.normal.dot(direction)<0)
+ if (c.normal.dot(direction) < 0)
continue;
- valid=true;
+ valid = true;
break;
}
}
if (!valid) {
- collided=false;
- oneway_disabled=true;
+ collided = false;
+ oneway_disabled = true;
return false;
}
}
@@ -346,72 +330,69 @@ bool BodyPair2DSW::setup(float p_step) {
float bias = 0.3f;
if (shape_A_ptr->get_custom_bias() || shape_B_ptr->get_custom_bias()) {
- if (shape_A_ptr->get_custom_bias()==0)
- bias=shape_B_ptr->get_custom_bias();
- else if (shape_B_ptr->get_custom_bias()==0)
- bias=shape_A_ptr->get_custom_bias();
+ if (shape_A_ptr->get_custom_bias() == 0)
+ bias = shape_B_ptr->get_custom_bias();
+ else if (shape_B_ptr->get_custom_bias() == 0)
+ bias = shape_A_ptr->get_custom_bias();
else
- bias=(shape_B_ptr->get_custom_bias()+shape_A_ptr->get_custom_bias())*0.5;
+ bias = (shape_B_ptr->get_custom_bias() + shape_A_ptr->get_custom_bias()) * 0.5;
}
+ cc = 0;
- cc=0;
-
+ real_t inv_dt = 1.0 / p_step;
- real_t inv_dt = 1.0/p_step;
-
- bool do_process=false;
+ bool do_process = false;
for (int i = 0; i < contact_count; i++) {
- Contact& c = contacts[i];
+ Contact &c = contacts[i];
Vector2 global_A = xform_Au.xform(c.local_A);
Vector2 global_B = xform_Bu.xform(c.local_B);
real_t depth = c.normal.dot(global_A - global_B);
- if (depth<=0 || !c.reused) {
- c.active=false;
+ if (depth <= 0 || !c.reused) {
+ c.active = false;
continue;
}
- c.active=true;
+ c.active = true;
#ifdef DEBUG_ENABLED
if (space->is_debugging_contacts()) {
- space->add_debug_contact(global_A+offset_A);
- space->add_debug_contact(global_B+offset_A);
+ space->add_debug_contact(global_A + offset_A);
+ space->add_debug_contact(global_B + offset_A);
}
#endif
int gather_A = A->can_report_contacts();
int gather_B = B->can_report_contacts();
c.rA = global_A;
- c.rB = global_B-offset_B;
+ c.rB = global_B - offset_B;
if (gather_A | gather_B) {
//Vector2 crB( -B->get_angular_velocity() * c.rB.y, B->get_angular_velocity() * c.rB.x );
- global_A+=offset_A;
- global_B+=offset_A;
+ global_A += offset_A;
+ global_B += offset_A;
if (gather_A) {
- Vector2 crB( -B->get_angular_velocity() * c.rB.y, B->get_angular_velocity() * c.rB.x );
- A->add_contact(global_A,-c.normal,depth,shape_A,global_B,shape_B,B->get_instance_id(),B->get_self(),crB+B->get_linear_velocity());
+ Vector2 crB(-B->get_angular_velocity() * c.rB.y, B->get_angular_velocity() * c.rB.x);
+ A->add_contact(global_A, -c.normal, depth, shape_A, global_B, shape_B, B->get_instance_id(), B->get_self(), crB + B->get_linear_velocity());
}
if (gather_B) {
- Vector2 crA( -A->get_angular_velocity() * c.rA.y, A->get_angular_velocity() * c.rA.x );
- B->add_contact(global_B,c.normal,depth,shape_B,global_A,shape_A,A->get_instance_id(),A->get_self(),crA+A->get_linear_velocity());
+ Vector2 crA(-A->get_angular_velocity() * c.rA.y, A->get_angular_velocity() * c.rA.x);
+ B->add_contact(global_B, c.normal, depth, shape_B, global_A, shape_A, A->get_instance_id(), A->get_self(), crA + A->get_linear_velocity());
}
}
- if (A->is_shape_set_as_trigger(shape_A) || B->is_shape_set_as_trigger(shape_B) || (A->get_mode()<=Physics2DServer::BODY_MODE_KINEMATIC && B->get_mode()<=Physics2DServer::BODY_MODE_KINEMATIC)) {
- c.active=false;
- collided=false;
+ if (A->is_shape_set_as_trigger(shape_A) || B->is_shape_set_as_trigger(shape_B) || (A->get_mode() <= Physics2DServer::BODY_MODE_KINEMATIC && B->get_mode() <= Physics2DServer::BODY_MODE_KINEMATIC)) {
+ c.active = false;
+ collided = false;
continue;
-
}
// Precompute normal mass, tangent mass, and bias.
@@ -426,39 +407,33 @@ bool BodyPair2DSW::setup(float p_step) {
real_t rtB = c.rB.dot(tangent);
real_t kTangent = A->get_inv_mass() + B->get_inv_mass();
kTangent += A->get_inv_inertia() * (c.rA.dot(c.rA) - rtA * rtA) + B->get_inv_inertia() * (c.rB.dot(c.rB) - rtB * rtB);
- c.mass_tangent = 1.0f / kTangent;
-
-
+ c.mass_tangent = 1.0f / kTangent;
c.bias = -bias * inv_dt * MIN(0.0f, -depth + max_penetration);
- c.depth=depth;
- //c.acc_bias_impulse=0;
-
+ c.depth = depth;
+//c.acc_bias_impulse=0;
#ifdef ACCUMULATE_IMPULSES
{
// Apply normal + friction impulse
Vector2 P = c.acc_normal_impulse * c.normal + c.acc_tangent_impulse * tangent;
-
- A->apply_impulse(c.rA,-P);
+ A->apply_impulse(c.rA, -P);
B->apply_impulse(c.rB, P);
}
#endif
-
- c.bounce=MAX(A->get_bounce(),B->get_bounce());
+ c.bounce = MAX(A->get_bounce(), B->get_bounce());
if (c.bounce) {
- Vector2 crA( -A->get_angular_velocity() * c.rA.y, A->get_angular_velocity() * c.rA.x );
- Vector2 crB( -B->get_angular_velocity() * c.rB.y, B->get_angular_velocity() * c.rB.x );
+ Vector2 crA(-A->get_angular_velocity() * c.rA.y, A->get_angular_velocity() * c.rA.x);
+ Vector2 crB(-B->get_angular_velocity() * c.rB.y, B->get_angular_velocity() * c.rB.x);
Vector2 dv = B->get_linear_velocity() + crB - A->get_linear_velocity() - crA;
c.bounce = c.bounce * dv.dot(c.normal);
}
- do_process=true;
-
+ do_process = true;
}
return do_process;
@@ -471,81 +446,71 @@ void BodyPair2DSW::solve(float p_step) {
for (int i = 0; i < contact_count; ++i) {
- Contact& c = contacts[i];
+ Contact &c = contacts[i];
cc++;
if (!c.active)
continue;
-
// Relative velocity at contact
- Vector2 crA( -A->get_angular_velocity() * c.rA.y, A->get_angular_velocity() * c.rA.x );
- Vector2 crB( -B->get_angular_velocity() * c.rB.y, B->get_angular_velocity() * c.rB.x );
+ Vector2 crA(-A->get_angular_velocity() * c.rA.y, A->get_angular_velocity() * c.rA.x);
+ Vector2 crB(-B->get_angular_velocity() * c.rB.y, B->get_angular_velocity() * c.rB.x);
Vector2 dv = B->get_linear_velocity() + crB - A->get_linear_velocity() - crA;
- Vector2 crbA( -A->get_biased_angular_velocity() * c.rA.y, A->get_biased_angular_velocity() * c.rA.x );
- Vector2 crbB( -B->get_biased_angular_velocity() * c.rB.y, B->get_biased_angular_velocity() * c.rB.x );
+ Vector2 crbA(-A->get_biased_angular_velocity() * c.rA.y, A->get_biased_angular_velocity() * c.rA.x);
+ Vector2 crbB(-B->get_biased_angular_velocity() * c.rB.y, B->get_biased_angular_velocity() * c.rB.x);
Vector2 dbv = B->get_biased_linear_velocity() + crbB - A->get_biased_linear_velocity() - crbA;
-
real_t vn = dv.dot(c.normal);
real_t vbn = dbv.dot(c.normal);
Vector2 tangent = c.normal.tangent();
real_t vt = dv.dot(tangent);
-
- real_t jbn = (c.bias - vbn)*c.mass_normal;
+ real_t jbn = (c.bias - vbn) * c.mass_normal;
real_t jbnOld = c.acc_bias_impulse;
c.acc_bias_impulse = MAX(jbnOld + jbn, 0.0f);
Vector2 jb = c.normal * (c.acc_bias_impulse - jbnOld);
- A->apply_bias_impulse(c.rA,-jb);
+ A->apply_bias_impulse(c.rA, -jb);
B->apply_bias_impulse(c.rB, jb);
- real_t jn = -(c.bounce + vn)*c.mass_normal;
+ real_t jn = -(c.bounce + vn) * c.mass_normal;
real_t jnOld = c.acc_normal_impulse;
c.acc_normal_impulse = MAX(jnOld + jn, 0.0f);
-
real_t friction = A->get_friction() * B->get_friction();
- real_t jtMax = friction*c.acc_normal_impulse;
- real_t jt = -vt*c.mass_tangent;
+ real_t jtMax = friction * c.acc_normal_impulse;
+ real_t jt = -vt * c.mass_tangent;
real_t jtOld = c.acc_tangent_impulse;
c.acc_tangent_impulse = CLAMP(jtOld + jt, -jtMax, jtMax);
- Vector2 j =c.normal * (c.acc_normal_impulse - jnOld) + tangent * ( c.acc_tangent_impulse - jtOld );
+ Vector2 j = c.normal * (c.acc_normal_impulse - jnOld) + tangent * (c.acc_tangent_impulse - jtOld);
- A->apply_impulse(c.rA,-j);
+ A->apply_impulse(c.rA, -j);
B->apply_impulse(c.rB, j);
-
-
}
}
+BodyPair2DSW::BodyPair2DSW(Body2DSW *p_A, int p_shape_A, Body2DSW *p_B, int p_shape_B)
+ : Constraint2DSW(_arr, 2) {
-BodyPair2DSW::BodyPair2DSW(Body2DSW *p_A, int p_shape_A,Body2DSW *p_B, int p_shape_B) : Constraint2DSW(_arr,2) {
-
- A=p_A;
- B=p_B;
- shape_A=p_shape_A;
- shape_B=p_shape_B;
- space=A->get_space();
- A->add_constraint(this,0);
- B->add_constraint(this,1);
- contact_count=0;
- collided=false;
- oneway_disabled=false;
-
+ A = p_A;
+ B = p_B;
+ shape_A = p_shape_A;
+ shape_B = p_shape_B;
+ space = A->get_space();
+ A->add_constraint(this, 0);
+ B->add_constraint(this, 1);
+ contact_count = 0;
+ collided = false;
+ oneway_disabled = false;
}
-
BodyPair2DSW::~BodyPair2DSW() {
-
A->remove_constraint(this);
B->remove_constraint(this);
-
}
diff --git a/servers/physics_2d/body_pair_2d_sw.h b/servers/physics_2d/body_pair_2d_sw.h
index a219b99fd..e9e2bb477 100644
--- a/servers/physics_2d/body_pair_2d_sw.h
+++ b/servers/physics_2d/body_pair_2d_sw.h
@@ -35,7 +35,7 @@
class BodyPair2DSW : public Constraint2DSW {
enum {
- MAX_CONTACTS=2
+ MAX_CONTACTS = 2
};
union {
struct {
@@ -56,18 +56,17 @@ class BodyPair2DSW : public Constraint2DSW {
Vector2 position;
Vector2 normal;
Vector2 local_A, local_B;
- real_t acc_normal_impulse; // accumulated normal impulse (Pn)
- real_t acc_tangent_impulse; // accumulated tangent impulse (Pt)
- real_t acc_bias_impulse; // accumulated normal impulse for position bias (Pnb)
+ real_t acc_normal_impulse; // accumulated normal impulse (Pn)
+ real_t acc_tangent_impulse; // accumulated tangent impulse (Pt)
+ real_t acc_bias_impulse; // accumulated normal impulse for position bias (Pnb)
real_t mass_normal, mass_tangent;
real_t bias;
real_t depth;
bool active;
- Vector2 rA,rB;
+ Vector2 rA, rB;
bool reused;
float bounce;
-
};
Vector2 offset_B; //use local A coordinates to avoid numerical issues on collision detection
@@ -79,20 +78,17 @@ class BodyPair2DSW : public Constraint2DSW {
bool oneway_disabled;
int cc;
-
- bool _test_ccd(float p_step,Body2DSW *p_A, int p_shape_A,const Matrix32& p_xform_A,Body2DSW *p_B, int p_shape_B,const Matrix32& p_xform_B,bool p_swap_result=false);
+ bool _test_ccd(float p_step, Body2DSW *p_A, int p_shape_A, const Matrix32 &p_xform_A, Body2DSW *p_B, int p_shape_B, const Matrix32 &p_xform_B, bool p_swap_result = false);
void _validate_contacts();
- static void _add_contact(const Vector2& p_point_A,const Vector2& p_point_B,void *p_self);
- _FORCE_INLINE_ void _contact_added_callback(const Vector2& p_point_A,const Vector2& p_point_B);
+ static void _add_contact(const Vector2 &p_point_A, const Vector2 &p_point_B, void *p_self);
+ _FORCE_INLINE_ void _contact_added_callback(const Vector2 &p_point_A, const Vector2 &p_point_B);
public:
-
bool setup(float p_step);
void solve(float p_step);
- BodyPair2DSW(Body2DSW *p_A, int p_shape_A,Body2DSW *p_B, int p_shape_B);
+ BodyPair2DSW(Body2DSW *p_A, int p_shape_A, Body2DSW *p_B, int p_shape_B);
~BodyPair2DSW();
-
};
#endif // BODY_PAIR_2D_SW_H
diff --git a/servers/physics_2d/broad_phase_2d_basic.cpp b/servers/physics_2d/broad_phase_2d_basic.cpp
index de2e89ce8..4fc7bcc19 100644
--- a/servers/physics_2d/broad_phase_2d_basic.cpp
+++ b/servers/physics_2d/broad_phase_2d_basic.cpp
@@ -30,94 +30,87 @@
ID BroadPhase2DBasic::create(CollisionObject2DSW *p_object_, int p_subindex) {
-
current++;
Element e;
- e.owner=p_object_;
- e._static=false;
- e.subindex=p_subindex;
+ e.owner = p_object_;
+ e._static = false;
+ e.subindex = p_subindex;
- element_map[current]=e;
+ element_map[current] = e;
return current;
}
-void BroadPhase2DBasic::move(ID p_id, const Rect2& p_aabb) {
+void BroadPhase2DBasic::move(ID p_id, const Rect2 &p_aabb) {
- Map<ID,Element>::Element *E=element_map.find(p_id);
+ Map<ID, Element>::Element *E = element_map.find(p_id);
ERR_FAIL_COND(!E);
- E->get().aabb=p_aabb;
-
+ E->get().aabb = p_aabb;
}
void BroadPhase2DBasic::set_static(ID p_id, bool p_static) {
- Map<ID,Element>::Element *E=element_map.find(p_id);
+ Map<ID, Element>::Element *E = element_map.find(p_id);
ERR_FAIL_COND(!E);
- E->get()._static=p_static;
-
+ E->get()._static = p_static;
}
void BroadPhase2DBasic::remove(ID p_id) {
- Map<ID,Element>::Element *E=element_map.find(p_id);
+ Map<ID, Element>::Element *E = element_map.find(p_id);
ERR_FAIL_COND(!E);
element_map.erase(E);
-
}
CollisionObject2DSW *BroadPhase2DBasic::get_object(ID p_id) const {
- const Map<ID,Element>::Element *E=element_map.find(p_id);
- ERR_FAIL_COND_V(!E,NULL);
+ const Map<ID, Element>::Element *E = element_map.find(p_id);
+ ERR_FAIL_COND_V(!E, NULL);
return E->get().owner;
-
}
bool BroadPhase2DBasic::is_static(ID p_id) const {
- const Map<ID,Element>::Element *E=element_map.find(p_id);
- ERR_FAIL_COND_V(!E,false);
+ const Map<ID, Element>::Element *E = element_map.find(p_id);
+ ERR_FAIL_COND_V(!E, false);
return E->get()._static;
-
}
int BroadPhase2DBasic::get_subindex(ID p_id) const {
- const Map<ID,Element>::Element *E=element_map.find(p_id);
- ERR_FAIL_COND_V(!E,-1);
+ const Map<ID, Element>::Element *E = element_map.find(p_id);
+ ERR_FAIL_COND_V(!E, -1);
return E->get().subindex;
}
-int BroadPhase2DBasic::cull_segment(const Vector2& p_from, const Vector2& p_to,CollisionObject2DSW** p_results,int p_max_results,int *p_result_indices) {
+int BroadPhase2DBasic::cull_segment(const Vector2 &p_from, const Vector2 &p_to, CollisionObject2DSW **p_results, int p_max_results, int *p_result_indices) {
- int rc=0;
+ int rc = 0;
- for (Map<ID,Element>::Element *E=element_map.front();E;E=E->next()) {
+ for (Map<ID, Element>::Element *E = element_map.front(); E; E = E->next()) {
- const Rect2 aabb=E->get().aabb;
- if (aabb.intersects_segment(p_from,p_to)) {
+ const Rect2 aabb = E->get().aabb;
+ if (aabb.intersects_segment(p_from, p_to)) {
- p_results[rc]=E->get().owner;
- p_result_indices[rc]=E->get().subindex;
+ p_results[rc] = E->get().owner;
+ p_result_indices[rc] = E->get().subindex;
rc++;
- if (rc>=p_max_results)
+ if (rc >= p_max_results)
break;
}
}
return rc;
-
}
-int BroadPhase2DBasic::cull_aabb(const Rect2& p_aabb,CollisionObject2DSW** p_results,int p_max_results,int *p_result_indices) {
+int BroadPhase2DBasic::cull_aabb(const Rect2 &p_aabb, CollisionObject2DSW **p_results, int p_max_results, int *p_result_indices) {
- int rc=0;
+ int rc = 0;
- for (Map<ID,Element>::Element *E=element_map.front();E;E=E->next()) {
+ for (Map<ID, Element>::Element *E = element_map.front(); E; E = E->next()) {
- const Rect2 aabb=E->get().aabb;
+ const Rect2 aabb = E->get().aabb;
if (aabb.intersects(p_aabb)) {
- p_results[rc]=E->get().owner;
- p_result_indices[rc]=E->get().subindex;
+ p_results[rc] = E->get().owner;
+ p_result_indices[rc] = E->get().subindex;
rc++;
- if (rc>=p_max_results)
+ if (rc >= p_max_results)
break;
}
}
@@ -125,68 +118,63 @@ int BroadPhase2DBasic::cull_aabb(const Rect2& p_aabb,CollisionObject2DSW** p_res
return rc;
}
-void BroadPhase2DBasic::set_pair_callback(PairCallback p_pair_callback,void *p_userdata) {
-
- pair_userdata=p_userdata;
- pair_callback=p_pair_callback;
+void BroadPhase2DBasic::set_pair_callback(PairCallback p_pair_callback, void *p_userdata) {
+ pair_userdata = p_userdata;
+ pair_callback = p_pair_callback;
}
-void BroadPhase2DBasic::set_unpair_callback(UnpairCallback p_pair_callback,void *p_userdata) {
-
- unpair_userdata=p_userdata;
- unpair_callback=p_pair_callback;
+void BroadPhase2DBasic::set_unpair_callback(UnpairCallback p_pair_callback, void *p_userdata) {
+ unpair_userdata = p_userdata;
+ unpair_callback = p_pair_callback;
}
void BroadPhase2DBasic::update() {
// recompute pairs
- for(Map<ID,Element>::Element *I=element_map.front();I;I=I->next()) {
+ for (Map<ID, Element>::Element *I = element_map.front(); I; I = I->next()) {
- for(Map<ID,Element>::Element *J=I->next();J;J=J->next()) {
+ for (Map<ID, Element>::Element *J = I->next(); J; J = J->next()) {
- Element *elem_A=&I->get();
- Element *elem_B=&J->get();
+ Element *elem_A = &I->get();
+ Element *elem_B = &J->get();
if (elem_A->owner == elem_B->owner)
continue;
+ bool pair_ok = elem_A->aabb.intersects(elem_B->aabb) && (!elem_A->_static || !elem_B->_static);
- bool pair_ok=elem_A->aabb.intersects( elem_B->aabb ) && (!elem_A->_static || !elem_B->_static );
+ PairKey key(I->key(), J->key());
- PairKey key(I->key(),J->key());
-
- Map<PairKey,void*>::Element *E=pair_map.find(key);
+ Map<PairKey, void *>::Element *E = pair_map.find(key);
if (!pair_ok && E) {
if (unpair_callback)
- unpair_callback(elem_A->owner,elem_A->subindex,elem_B->owner,elem_B->subindex,E->get(),unpair_userdata);
+ unpair_callback(elem_A->owner, elem_A->subindex, elem_B->owner, elem_B->subindex, E->get(), unpair_userdata);
pair_map.erase(key);
}
if (pair_ok && !E) {
- void *data=NULL;
+ void *data = NULL;
if (pair_callback)
- data=pair_callback(elem_A->owner,elem_A->subindex,elem_B->owner,elem_B->subindex,unpair_userdata);
- pair_map.insert(key,data);
+ data = pair_callback(elem_A->owner, elem_A->subindex, elem_B->owner, elem_B->subindex, unpair_userdata);
+ pair_map.insert(key, data);
}
}
}
-
}
BroadPhase2DSW *BroadPhase2DBasic::_create() {
- return memnew( BroadPhase2DBasic );
+ return memnew(BroadPhase2DBasic);
}
BroadPhase2DBasic::BroadPhase2DBasic() {
- current=1;
- unpair_callback=NULL;
- unpair_userdata=NULL;
- pair_callback=NULL;
- pair_userdata=NULL;
-
+ current = 1;
+ unpair_callback = NULL;
+ unpair_userdata = NULL;
+ pair_callback = NULL;
+ pair_userdata = NULL;
}
diff --git a/servers/physics_2d/broad_phase_2d_basic.h b/servers/physics_2d/broad_phase_2d_basic.h
index 82e91118c..7c5d799f9 100644
--- a/servers/physics_2d/broad_phase_2d_basic.h
+++ b/servers/physics_2d/broad_phase_2d_basic.h
@@ -29,8 +29,8 @@
#ifndef BROAD_PHASE_2D_BASIC_H
#define BROAD_PHASE_2D_BASIC_H
-#include "space_2d_sw.h"
#include "map.h"
+#include "space_2d_sw.h"
class BroadPhase2DBasic : public BroadPhase2DSW {
struct Element {
@@ -41,8 +41,7 @@ class BroadPhase2DBasic : public BroadPhase2DSW {
int subindex;
};
-
- Map<ID,Element> element_map;
+ Map<ID, Element> element_map;
ID current;
@@ -56,17 +55,23 @@ class BroadPhase2DBasic : public BroadPhase2DSW {
uint64_t key;
};
- _FORCE_INLINE_ bool operator<(const PairKey& p_key) const {
+ _FORCE_INLINE_ bool operator<(const PairKey &p_key) const {
return key < p_key.key;
}
- PairKey() { key=0; }
- PairKey(ID p_a, ID p_b) { if (p_a>p_b) { a=p_b; b=p_a; } else { a=p_a; b=p_b; }}
-
+ PairKey() { key = 0; }
+ PairKey(ID p_a, ID p_b) {
+ if (p_a > p_b) {
+ a = p_b;
+ b = p_a;
+ } else {
+ a = p_a;
+ b = p_b;
+ }
+ }
};
- Map<PairKey,void*> pair_map;
-
+ Map<PairKey, void *> pair_map;
PairCallback pair_callback;
void *pair_userdata;
@@ -74,10 +79,9 @@ class BroadPhase2DBasic : public BroadPhase2DSW {
void *unpair_userdata;
public:
-
// 0 is an invalid ID
- virtual ID create(CollisionObject2DSW *p_object_, int p_subindex=0);
- virtual void move(ID p_id, const Rect2& p_aabb);
+ virtual ID create(CollisionObject2DSW *p_object_, int p_subindex = 0);
+ virtual void move(ID p_id, const Rect2 &p_aabb);
virtual void set_static(ID p_id, bool p_static);
virtual void remove(ID p_id);
@@ -85,11 +89,11 @@ public:
virtual bool is_static(ID p_id) const;
virtual int get_subindex(ID p_id) const;
- virtual int cull_segment(const Vector2& p_from, const Vector2& p_to,CollisionObject2DSW** p_results,int p_max_results,int *p_result_indices=NULL);
- virtual int cull_aabb(const Rect2& p_aabb,CollisionObject2DSW** p_results,int p_max_results,int *p_result_indices=NULL);
+ virtual int cull_segment(const Vector2 &p_from, const Vector2 &p_to, CollisionObject2DSW **p_results, int p_max_results, int *p_result_indices = NULL);
+ virtual int cull_aabb(const Rect2 &p_aabb, CollisionObject2DSW **p_results, int p_max_results, int *p_result_indices = NULL);
- virtual void set_pair_callback(PairCallback p_pair_callback,void *p_userdata);
- virtual void set_unpair_callback(UnpairCallback p_unpair_callback,void *p_userdata);
+ virtual void set_pair_callback(PairCallback p_pair_callback, void *p_userdata);
+ virtual void set_unpair_callback(UnpairCallback p_unpair_callback, void *p_userdata);
virtual void update();
diff --git a/servers/physics_2d/broad_phase_2d_hash_grid.cpp b/servers/physics_2d/broad_phase_2d_hash_grid.cpp
index 82d777357..a1996a5d9 100644
--- a/servers/physics_2d/broad_phase_2d_hash_grid.cpp
+++ b/servers/physics_2d/broad_phase_2d_hash_grid.cpp
@@ -31,110 +31,100 @@
#define LARGE_ELEMENT_FI 1.01239812
-void BroadPhase2DHashGrid::_pair_attempt(Element *p_elem, Element* p_with) {
+void BroadPhase2DHashGrid::_pair_attempt(Element *p_elem, Element *p_with) {
- Map<Element*,PairData*>::Element *E=p_elem->paired.find(p_with);
+ Map<Element *, PairData *>::Element *E = p_elem->paired.find(p_with);
ERR_FAIL_COND(p_elem->_static && p_with->_static);
if (!E) {
- PairData *pd = memnew( PairData );
- p_elem->paired[p_with]=pd;
- p_with->paired[p_elem]=pd;
+ PairData *pd = memnew(PairData);
+ p_elem->paired[p_with] = pd;
+ p_with->paired[p_elem] = pd;
} else {
E->get()->rc++;
}
-
}
-void BroadPhase2DHashGrid::_unpair_attempt(Element *p_elem, Element* p_with) {
+void BroadPhase2DHashGrid::_unpair_attempt(Element *p_elem, Element *p_with) {
- Map<Element*,PairData*>::Element *E=p_elem->paired.find(p_with);
+ Map<Element *, PairData *>::Element *E = p_elem->paired.find(p_with);
ERR_FAIL_COND(!E); //this should really be paired..
E->get()->rc--;
- if (E->get()->rc==0) {
+ if (E->get()->rc == 0) {
if (E->get()->colliding) {
//uncollide
if (unpair_callback) {
- unpair_callback(p_elem->owner,p_elem->subindex,p_with->owner,p_with->subindex,E->get()->ud,unpair_userdata);
+ unpair_callback(p_elem->owner, p_elem->subindex, p_with->owner, p_with->subindex, E->get()->ud, unpair_userdata);
}
-
-
}
memdelete(E->get());
p_elem->paired.erase(E);
p_with->paired.erase(p_elem);
}
-
-
}
void BroadPhase2DHashGrid::_check_motion(Element *p_elem) {
- for (Map<Element*,PairData*>::Element *E=p_elem->paired.front();E;E=E->next()) {
+ for (Map<Element *, PairData *>::Element *E = p_elem->paired.front(); E; E = E->next()) {
- bool pairing = p_elem->aabb.intersects( E->key()->aabb );
+ bool pairing = p_elem->aabb.intersects(E->key()->aabb);
- if (pairing!=E->get()->colliding) {
+ if (pairing != E->get()->colliding) {
if (pairing) {
if (pair_callback) {
- E->get()->ud=pair_callback(p_elem->owner,p_elem->subindex,E->key()->owner,E->key()->subindex,pair_userdata);
+ E->get()->ud = pair_callback(p_elem->owner, p_elem->subindex, E->key()->owner, E->key()->subindex, pair_userdata);
}
} else {
if (unpair_callback) {
- unpair_callback(p_elem->owner,p_elem->subindex,E->key()->owner,E->key()->subindex,E->get()->ud,unpair_userdata);
+ unpair_callback(p_elem->owner, p_elem->subindex, E->key()->owner, E->key()->subindex, E->get()->ud, unpair_userdata);
}
-
}
- E->get()->colliding=pairing;
+ E->get()->colliding = pairing;
}
}
}
-void BroadPhase2DHashGrid::_enter_grid( Element* p_elem, const Rect2& p_rect,bool p_static) {
-
-
+void BroadPhase2DHashGrid::_enter_grid(Element *p_elem, const Rect2 &p_rect, bool p_static) {
- Vector2 sz = (p_rect.size/cell_size*LARGE_ELEMENT_FI); //use magic number to avoid floating point issues
- if (sz.width*sz.height > large_object_min_surface) {
+ Vector2 sz = (p_rect.size / cell_size * LARGE_ELEMENT_FI); //use magic number to avoid floating point issues
+ if (sz.width * sz.height > large_object_min_surface) {
//large object, do not use grid, must check against all elements
- for (Map<ID,Element>::Element *E=element_map.front();E;E=E->next()) {
- if (E->key()==p_elem->self)
+ for (Map<ID, Element>::Element *E = element_map.front(); E; E = E->next()) {
+ if (E->key() == p_elem->self)
continue; // do not pair against itself
if (E->get().owner == p_elem->owner)
continue;
if (E->get()._static && p_static)
continue;
- _pair_attempt(p_elem,&E->get());
+ _pair_attempt(p_elem, &E->get());
}
-
large_elements[p_elem].inc();
return;
}
- Point2i from = (p_rect.pos/cell_size).floor();
- Point2i to = ((p_rect.pos+p_rect.size)/cell_size).floor();
-
- for(int i=from.x;i<=to.x;i++) {
+ Point2i from = (p_rect.pos / cell_size).floor();
+ Point2i to = ((p_rect.pos + p_rect.size) / cell_size).floor();
+ for (int i = from.x; i <= to.x; i++) {
- for(int j=from.y;j<=to.y;j++) {
+ for (int j = from.y; j <= to.y; j++) {
PosKey pk;
- pk.x=i;
- pk.y=j;
+ pk.x = i;
+ pk.y = j;
uint32_t idx = pk.hash() % hash_table_size;
PosBin *pb = hash_table[idx];
@@ -145,102 +135,94 @@ void BroadPhase2DHashGrid::_enter_grid( Element* p_elem, const Rect2& p_rect,boo
break;
}
- pb=pb->next;
+ pb = pb->next;
}
-
- bool entered=false;
+ bool entered = false;
if (!pb) {
//does not exist, create!
- pb = memnew( PosBin );
- pb->key=pk;
- pb->next=hash_table[idx];
- hash_table[idx]=pb;
+ pb = memnew(PosBin);
+ pb->key = pk;
+ pb->next = hash_table[idx];
+ hash_table[idx] = pb;
}
-
-
if (p_static) {
- if (pb->static_object_set[p_elem].inc()==1) {
- entered=true;
+ if (pb->static_object_set[p_elem].inc() == 1) {
+ entered = true;
}
} else {
- if (pb->object_set[p_elem].inc()==1) {
+ if (pb->object_set[p_elem].inc() == 1) {
- entered=true;
+ entered = true;
}
}
if (entered) {
- for(Map<Element*,RC>::Element *E=pb->object_set.front();E;E=E->next()) {
+ for (Map<Element *, RC>::Element *E = pb->object_set.front(); E; E = E->next()) {
- if (E->key()->owner==p_elem->owner)
+ if (E->key()->owner == p_elem->owner)
continue;
- _pair_attempt(p_elem,E->key());
+ _pair_attempt(p_elem, E->key());
}
if (!p_static) {
- for(Map<Element*,RC>::Element *E=pb->static_object_set.front();E;E=E->next()) {
+ for (Map<Element *, RC>::Element *E = pb->static_object_set.front(); E; E = E->next()) {
- if (E->key()->owner==p_elem->owner)
+ if (E->key()->owner == p_elem->owner)
continue;
- _pair_attempt(p_elem,E->key());
+ _pair_attempt(p_elem, E->key());
}
}
}
-
}
-
}
//pair separatedly with large elements
- for (Map<Element*,RC>::Element *E=large_elements.front();E;E=E->next()) {
+ for (Map<Element *, RC>::Element *E = large_elements.front(); E; E = E->next()) {
- if (E->key()==p_elem)
+ if (E->key() == p_elem)
continue; // do not pair against itself
if (E->key()->owner == p_elem->owner)
continue;
if (E->key()->_static && p_static)
continue;
- _pair_attempt(E->key(),p_elem);
+ _pair_attempt(E->key(), p_elem);
}
-
}
+void BroadPhase2DHashGrid::_exit_grid(Element *p_elem, const Rect2 &p_rect, bool p_static) {
-void BroadPhase2DHashGrid::_exit_grid( Element* p_elem, const Rect2& p_rect,bool p_static) {
-
- Vector2 sz = (p_rect.size/cell_size*LARGE_ELEMENT_FI);
- if (sz.width*sz.height > large_object_min_surface) {
+ Vector2 sz = (p_rect.size / cell_size * LARGE_ELEMENT_FI);
+ if (sz.width * sz.height > large_object_min_surface) {
//unpair all elements, instead of checking all, just check what is already paired, so we at least save from checking static vs static
- for (Map<Element*,PairData*>::Element *E=p_elem->paired.front();E;E=E->next()) {
+ for (Map<Element *, PairData *>::Element *E = p_elem->paired.front(); E; E = E->next()) {
- _unpair_attempt(p_elem,E->key());
+ _unpair_attempt(p_elem, E->key());
}
- if (large_elements[p_elem].dec()==0) {
+ if (large_elements[p_elem].dec() == 0) {
large_elements.erase(p_elem);
}
return;
}
+ Point2i from = (p_rect.pos / cell_size).floor();
+ Point2i to = ((p_rect.pos + p_rect.size) / cell_size).floor();
- Point2i from = (p_rect.pos/cell_size).floor();
- Point2i to = ((p_rect.pos+p_rect.size)/cell_size).floor();
-
- for(int i=from.x;i<=to.x;i++) {
+ for (int i = from.x; i <= to.x; i++) {
- for(int j=from.y;j<=to.y;j++) {
+ for (int j = from.y; j <= to.y; j++) {
PosKey pk;
- pk.x=i;
- pk.y=j;
+ pk.x = i;
+ pk.y = j;
uint32_t idx = pk.hash() % hash_table_size;
PosBin *pb = hash_table[idx];
@@ -251,82 +233,75 @@ void BroadPhase2DHashGrid::_exit_grid( Element* p_elem, const Rect2& p_rect,bool
break;
}
- pb=pb->next;
+ pb = pb->next;
}
ERR_CONTINUE(!pb); //should exist!!
- bool exited=false;
-
+ bool exited = false;
if (p_static) {
- if (pb->static_object_set[p_elem].dec()==0) {
+ if (pb->static_object_set[p_elem].dec() == 0) {
pb->static_object_set.erase(p_elem);
- exited=true;
-
+ exited = true;
}
} else {
- if (pb->object_set[p_elem].dec()==0) {
+ if (pb->object_set[p_elem].dec() == 0) {
pb->object_set.erase(p_elem);
- exited=true;
-
+ exited = true;
}
}
if (exited) {
- for(Map<Element*,RC>::Element *E=pb->object_set.front();E;E=E->next()) {
+ for (Map<Element *, RC>::Element *E = pb->object_set.front(); E; E = E->next()) {
- if (E->key()->owner==p_elem->owner)
+ if (E->key()->owner == p_elem->owner)
continue;
- _unpair_attempt(p_elem,E->key());
-
+ _unpair_attempt(p_elem, E->key());
}
if (!p_static) {
- for(Map<Element*,RC>::Element *E=pb->static_object_set.front();E;E=E->next()) {
+ for (Map<Element *, RC>::Element *E = pb->static_object_set.front(); E; E = E->next()) {
- if (E->key()->owner==p_elem->owner)
+ if (E->key()->owner == p_elem->owner)
continue;
- _unpair_attempt(p_elem,E->key());
+ _unpair_attempt(p_elem, E->key());
}
}
}
if (pb->object_set.empty() && pb->static_object_set.empty()) {
- if (hash_table[idx]==pb) {
- hash_table[idx]=pb->next;
+ if (hash_table[idx] == pb) {
+ hash_table[idx] = pb->next;
} else {
PosBin *px = hash_table[idx];
while (px) {
- if (px->next==pb) {
- px->next=pb->next;
+ if (px->next == pb) {
+ px->next = pb->next;
break;
}
- px=px->next;
+ px = px->next;
}
ERR_CONTINUE(!px);
}
memdelete(pb);
-
}
}
-
}
-
- for (Map<Element*,RC>::Element *E=large_elements.front();E;E=E->next()) {
- if (E->key()==p_elem)
+ for (Map<Element *, RC>::Element *E = large_elements.front(); E; E = E->next()) {
+ if (E->key() == p_elem)
continue; // do not pair against itself
if (E->key()->owner == p_elem->owner)
continue;
@@ -334,121 +309,109 @@ void BroadPhase2DHashGrid::_exit_grid( Element* p_elem, const Rect2& p_rect,bool
continue;
//unpair from large elements
- _unpair_attempt(p_elem,E->key());
+ _unpair_attempt(p_elem, E->key());
}
-
-
}
-
BroadPhase2DHashGrid::ID BroadPhase2DHashGrid::create(CollisionObject2DSW *p_object, int p_subindex) {
current++;
Element e;
- e.owner=p_object;
- e._static=false;
- e.subindex=p_subindex;
- e.self=current;
- e.pass=0;
+ e.owner = p_object;
+ e._static = false;
+ e.subindex = p_subindex;
+ e.self = current;
+ e.pass = 0;
- element_map[current]=e;
+ element_map[current] = e;
return current;
-
}
-void BroadPhase2DHashGrid::move(ID p_id, const Rect2& p_aabb) {
-
+void BroadPhase2DHashGrid::move(ID p_id, const Rect2 &p_aabb) {
- Map<ID,Element>::Element *E=element_map.find(p_id);
+ Map<ID, Element>::Element *E = element_map.find(p_id);
ERR_FAIL_COND(!E);
- Element &e=E->get();
+ Element &e = E->get();
- if (p_aabb==e.aabb)
+ if (p_aabb == e.aabb)
return;
+ if (p_aabb != Rect2()) {
- if (p_aabb!=Rect2()) {
-
- _enter_grid(&e,p_aabb,e._static);
+ _enter_grid(&e, p_aabb, e._static);
}
- if (e.aabb!=Rect2()) {
+ if (e.aabb != Rect2()) {
- _exit_grid(&e,e.aabb,e._static);
+ _exit_grid(&e, e.aabb, e._static);
}
- e.aabb=p_aabb;
+ e.aabb = p_aabb;
_check_motion(&e);
- e.aabb=p_aabb;
-
+ e.aabb = p_aabb;
}
void BroadPhase2DHashGrid::set_static(ID p_id, bool p_static) {
- Map<ID,Element>::Element *E=element_map.find(p_id);
+ Map<ID, Element>::Element *E = element_map.find(p_id);
ERR_FAIL_COND(!E);
- Element &e=E->get();
+ Element &e = E->get();
- if (e._static==p_static)
+ if (e._static == p_static)
return;
- if (e.aabb!=Rect2())
- _exit_grid(&e,e.aabb,e._static);
+ if (e.aabb != Rect2())
+ _exit_grid(&e, e.aabb, e._static);
- e._static=p_static;
+ e._static = p_static;
- if (e.aabb!=Rect2()) {
- _enter_grid(&e,e.aabb,e._static);
+ if (e.aabb != Rect2()) {
+ _enter_grid(&e, e.aabb, e._static);
_check_motion(&e);
}
-
}
void BroadPhase2DHashGrid::remove(ID p_id) {
- Map<ID,Element>::Element *E=element_map.find(p_id);
+ Map<ID, Element>::Element *E = element_map.find(p_id);
ERR_FAIL_COND(!E);
- Element &e=E->get();
+ Element &e = E->get();
- if (e.aabb!=Rect2())
- _exit_grid(&e,e.aabb,e._static);
+ if (e.aabb != Rect2())
+ _exit_grid(&e, e.aabb, e._static);
element_map.erase(p_id);
-
}
CollisionObject2DSW *BroadPhase2DHashGrid::get_object(ID p_id) const {
- const Map<ID,Element>::Element *E=element_map.find(p_id);
- ERR_FAIL_COND_V(!E,NULL);
+ const Map<ID, Element>::Element *E = element_map.find(p_id);
+ ERR_FAIL_COND_V(!E, NULL);
return E->get().owner;
-
}
bool BroadPhase2DHashGrid::is_static(ID p_id) const {
- const Map<ID,Element>::Element *E=element_map.find(p_id);
- ERR_FAIL_COND_V(!E,false);
+ const Map<ID, Element>::Element *E = element_map.find(p_id);
+ ERR_FAIL_COND_V(!E, false);
return E->get()._static;
-
}
int BroadPhase2DHashGrid::get_subindex(ID p_id) const {
- const Map<ID,Element>::Element *E=element_map.find(p_id);
- ERR_FAIL_COND_V(!E,-1);
+ const Map<ID, Element>::Element *E = element_map.find(p_id);
+ ERR_FAIL_COND_V(!E, -1);
return E->get().subindex;
}
-template<bool use_aabb,bool use_segment>
-void BroadPhase2DHashGrid::_cull(const Point2i p_cell,const Rect2& p_aabb,const Point2& p_from, const Point2& p_to,CollisionObject2DSW** p_results,int p_max_results,int *p_result_indices,int &index) {
-
+template <bool use_aabb, bool use_segment>
+void BroadPhase2DHashGrid::_cull(const Point2i p_cell, const Rect2 &p_aabb, const Point2 &p_from, const Point2 &p_to, CollisionObject2DSW **p_results, int p_max_results, int *p_result_indices, int &index) {
PosKey pk;
- pk.x=p_cell.x;
- pk.y=p_cell.y;
+ pk.x = p_cell.x;
+ pk.y = p_cell.y;
uint32_t idx = pk.hash() % hash_table_size;
PosBin *pb = hash_table[idx];
@@ -459,261 +422,237 @@ void BroadPhase2DHashGrid::_cull(const Point2i p_cell,const Rect2& p_aabb,const
break;
}
- pb=pb->next;
+ pb = pb->next;
}
if (!pb)
return;
+ for (Map<Element *, RC>::Element *E = pb->object_set.front(); E; E = E->next()) {
-
- for(Map<Element*,RC>::Element *E=pb->object_set.front();E;E=E->next()) {
-
-
- if (index>=p_max_results)
+ if (index >= p_max_results)
break;
- if (E->key()->pass==pass)
+ if (E->key()->pass == pass)
continue;
- E->key()->pass=pass;
+ E->key()->pass = pass;
if (use_aabb && !p_aabb.intersects(E->key()->aabb))
continue;
- if (use_segment && !E->key()->aabb.intersects_segment(p_from,p_to))
+ if (use_segment && !E->key()->aabb.intersects_segment(p_from, p_to))
continue;
- p_results[index]=E->key()->owner;
- p_result_indices[index]=E->key()->subindex;
+ p_results[index] = E->key()->owner;
+ p_result_indices[index] = E->key()->subindex;
index++;
-
-
}
- for(Map<Element*,RC>::Element *E=pb->static_object_set.front();E;E=E->next()) {
-
+ for (Map<Element *, RC>::Element *E = pb->static_object_set.front(); E; E = E->next()) {
- if (index>=p_max_results)
+ if (index >= p_max_results)
break;
- if (E->key()->pass==pass)
+ if (E->key()->pass == pass)
continue;
if (use_aabb && !p_aabb.intersects(E->key()->aabb)) {
continue;
}
- if (use_segment && !E->key()->aabb.intersects_segment(p_from,p_to))
+ if (use_segment && !E->key()->aabb.intersects_segment(p_from, p_to))
continue;
- E->key()->pass=pass;
- p_results[index]=E->key()->owner;
- p_result_indices[index]=E->key()->subindex;
+ E->key()->pass = pass;
+ p_results[index] = E->key()->owner;
+ p_result_indices[index] = E->key()->subindex;
index++;
-
}
}
-int BroadPhase2DHashGrid::cull_segment(const Vector2& p_from, const Vector2& p_to,CollisionObject2DSW** p_results,int p_max_results,int *p_result_indices) {
+int BroadPhase2DHashGrid::cull_segment(const Vector2 &p_from, const Vector2 &p_to, CollisionObject2DSW **p_results, int p_max_results, int *p_result_indices) {
pass++;
- Vector2 dir = (p_to-p_from);
- if (dir==Vector2())
+ Vector2 dir = (p_to - p_from);
+ if (dir == Vector2())
return 0;
//avoid divisions by zero
dir.normalize();
- if (dir.x==0.0)
- dir.x=0.000001;
- if (dir.y==0.0)
- dir.y=0.000001;
+ if (dir.x == 0.0)
+ dir.x = 0.000001;
+ if (dir.y == 0.0)
+ dir.y = 0.000001;
Vector2 delta = dir.abs();
- delta.x=cell_size/delta.x;
- delta.y=cell_size/delta.y;
+ delta.x = cell_size / delta.x;
+ delta.y = cell_size / delta.y;
- Point2i pos = (p_from/cell_size).floor();
- Point2i end = (p_to/cell_size).floor();
+ Point2i pos = (p_from / cell_size).floor();
+ Point2i end = (p_to / cell_size).floor();
- Point2i step = Vector2( SGN(dir.x), SGN(dir.y) );
+ Point2i step = Vector2(SGN(dir.x), SGN(dir.y));
Vector2 max;
- if (dir.x<0)
- max.x= (Math::floor(pos.x)*cell_size - p_from.x) / dir.x;
+ if (dir.x < 0)
+ max.x = (Math::floor(pos.x) * cell_size - p_from.x) / dir.x;
else
- max.x= (Math::floor(pos.x + 1)*cell_size - p_from.x) / dir.x;
+ max.x = (Math::floor(pos.x + 1) * cell_size - p_from.x) / dir.x;
- if (dir.y<0)
- max.y= (Math::floor(pos.y)*cell_size - p_from.y) / dir.y;
+ if (dir.y < 0)
+ max.y = (Math::floor(pos.y) * cell_size - p_from.y) / dir.y;
else
- max.y= (Math::floor(pos.y + 1)*cell_size - p_from.y) / dir.y;
+ max.y = (Math::floor(pos.y + 1) * cell_size - p_from.y) / dir.y;
- int cullcount=0;
- _cull<false,true>(pos,Rect2(),p_from,p_to,p_results,p_max_results,p_result_indices,cullcount);
+ int cullcount = 0;
+ _cull<false, true>(pos, Rect2(), p_from, p_to, p_results, p_max_results, p_result_indices, cullcount);
- bool reached_x=false;
- bool reached_y=false;
+ bool reached_x = false;
+ bool reached_y = false;
- while(true) {
+ while (true) {
if (max.x < max.y) {
- max.x+=delta.x;
- pos.x+=step.x;
+ max.x += delta.x;
+ pos.x += step.x;
} else {
- max.y+=delta.y;
- pos.y+=step.y;
-
+ max.y += delta.y;
+ pos.y += step.y;
}
- if (step.x>0) {
- if (pos.x>=end.x)
- reached_x=true;
- } else if (pos.x<=end.x) {
+ if (step.x > 0) {
+ if (pos.x >= end.x)
+ reached_x = true;
+ } else if (pos.x <= end.x) {
- reached_x=true;
+ reached_x = true;
}
- if (step.y>0) {
- if (pos.y>=end.y)
- reached_y=true;
- } else if (pos.y<=end.y) {
+ if (step.y > 0) {
+ if (pos.y >= end.y)
+ reached_y = true;
+ } else if (pos.y <= end.y) {
- reached_y=true;
+ reached_y = true;
}
- _cull<false,true>(pos,Rect2(),p_from,p_to,p_results,p_max_results,p_result_indices,cullcount);
+ _cull<false, true>(pos, Rect2(), p_from, p_to, p_results, p_max_results, p_result_indices, cullcount);
if (reached_x && reached_y)
break;
-
}
- for (Map<Element*,RC>::Element *E=large_elements.front();E;E=E->next()) {
+ for (Map<Element *, RC>::Element *E = large_elements.front(); E; E = E->next()) {
- if (cullcount>=p_max_results)
+ if (cullcount >= p_max_results)
break;
- if (E->key()->pass==pass)
+ if (E->key()->pass == pass)
continue;
- E->key()->pass=pass;
+ E->key()->pass = pass;
-// if (use_aabb && !p_aabb.intersects(E->key()->aabb))
-// continue;
+ // if (use_aabb && !p_aabb.intersects(E->key()->aabb))
+ // continue;
- if (!E->key()->aabb.intersects_segment(p_from,p_to))
+ if (!E->key()->aabb.intersects_segment(p_from, p_to))
continue;
- p_results[cullcount]=E->key()->owner;
- p_result_indices[cullcount]=E->key()->subindex;
+ p_results[cullcount] = E->key()->owner;
+ p_result_indices[cullcount] = E->key()->subindex;
cullcount++;
-
-
}
return cullcount;
}
-
-int BroadPhase2DHashGrid::cull_aabb(const Rect2& p_aabb,CollisionObject2DSW** p_results,int p_max_results,int *p_result_indices) {
+int BroadPhase2DHashGrid::cull_aabb(const Rect2 &p_aabb, CollisionObject2DSW **p_results, int p_max_results, int *p_result_indices) {
pass++;
- Point2i from = (p_aabb.pos/cell_size).floor();
- Point2i to = ((p_aabb.pos+p_aabb.size)/cell_size).floor();
- int cullcount=0;
+ Point2i from = (p_aabb.pos / cell_size).floor();
+ Point2i to = ((p_aabb.pos + p_aabb.size) / cell_size).floor();
+ int cullcount = 0;
- for(int i=from.x;i<=to.x;i++) {
+ for (int i = from.x; i <= to.x; i++) {
- for(int j=from.y;j<=to.y;j++) {
+ for (int j = from.y; j <= to.y; j++) {
- _cull<true,false>(Point2i(i,j),p_aabb,Point2(),Point2(),p_results,p_max_results,p_result_indices,cullcount);
+ _cull<true, false>(Point2i(i, j), p_aabb, Point2(), Point2(), p_results, p_max_results, p_result_indices, cullcount);
}
-
}
- for (Map<Element*,RC>::Element *E=large_elements.front();E;E=E->next()) {
+ for (Map<Element *, RC>::Element *E = large_elements.front(); E; E = E->next()) {
- if (cullcount>=p_max_results)
+ if (cullcount >= p_max_results)
break;
- if (E->key()->pass==pass)
+ if (E->key()->pass == pass)
continue;
- E->key()->pass=pass;
+ E->key()->pass = pass;
if (!p_aabb.intersects(E->key()->aabb))
continue;
-// if (!E->key()->aabb.intersects_segment(p_from,p_to))
-// continue;
+ // if (!E->key()->aabb.intersects_segment(p_from,p_to))
+ // continue;
- p_results[cullcount]=E->key()->owner;
- p_result_indices[cullcount]=E->key()->subindex;
+ p_results[cullcount] = E->key()->owner;
+ p_result_indices[cullcount] = E->key()->subindex;
cullcount++;
-
-
}
return cullcount;
}
-void BroadPhase2DHashGrid::set_pair_callback(PairCallback p_pair_callback,void *p_userdata) {
-
- pair_callback=p_pair_callback;
- pair_userdata=p_userdata;
+void BroadPhase2DHashGrid::set_pair_callback(PairCallback p_pair_callback, void *p_userdata) {
+ pair_callback = p_pair_callback;
+ pair_userdata = p_userdata;
}
-void BroadPhase2DHashGrid::set_unpair_callback(UnpairCallback p_unpair_callback,void *p_userdata) {
-
- unpair_callback=p_unpair_callback;
- unpair_userdata=p_userdata;
+void BroadPhase2DHashGrid::set_unpair_callback(UnpairCallback p_unpair_callback, void *p_userdata) {
+ unpair_callback = p_unpair_callback;
+ unpair_userdata = p_userdata;
}
void BroadPhase2DHashGrid::update() {
-
-
}
BroadPhase2DSW *BroadPhase2DHashGrid::_create() {
- return memnew( BroadPhase2DHashGrid );
+ return memnew(BroadPhase2DHashGrid);
}
-
BroadPhase2DHashGrid::BroadPhase2DHashGrid() {
- hash_table_size = GLOBAL_DEF("physics_2d/bp_hash_table_size",4096);
+ hash_table_size = GLOBAL_DEF("physics_2d/bp_hash_table_size", 4096);
hash_table_size = Math::larger_prime(hash_table_size);
- hash_table = memnew_arr( PosBin*, hash_table_size);
+ hash_table = memnew_arr(PosBin *, hash_table_size);
- cell_size = GLOBAL_DEF("physics_2d/cell_size",128);
- large_object_min_surface = GLOBAL_DEF("physics_2d/large_object_surface_treshold_in_cells",512);
+ cell_size = GLOBAL_DEF("physics_2d/cell_size", 128);
+ large_object_min_surface = GLOBAL_DEF("physics_2d/large_object_surface_treshold_in_cells", 512);
- for(int i=0;i<hash_table_size;i++)
- hash_table[i]=NULL;
- pass=1;
+ for (int i = 0; i < hash_table_size; i++)
+ hash_table[i] = NULL;
+ pass = 1;
- current=0;
+ current = 0;
}
BroadPhase2DHashGrid::~BroadPhase2DHashGrid() {
- for(int i=0;i<hash_table_size;i++) {
- while(hash_table[i]) {
- PosBin *pb=hash_table[i];
- hash_table[i]=pb->next;
+ for (int i = 0; i < hash_table_size; i++) {
+ while (hash_table[i]) {
+ PosBin *pb = hash_table[i];
+ hash_table[i] = pb->next;
memdelete(pb);
}
}
- memdelete_arr( hash_table );
-
-
+ memdelete_arr(hash_table);
}
-
-
/* 3D version of voxel traversal:
public IEnumerable<Point3D> GetCellsOnRay(Ray ray, int maxDepth)
diff --git a/servers/physics_2d/broad_phase_2d_hash_grid.h b/servers/physics_2d/broad_phase_2d_hash_grid.h
index 857053ccf..f30f72d6d 100644
--- a/servers/physics_2d/broad_phase_2d_hash_grid.h
+++ b/servers/physics_2d/broad_phase_2d_hash_grid.h
@@ -34,13 +34,16 @@
class BroadPhase2DHashGrid : public BroadPhase2DSW {
-
struct PairData {
bool colliding;
int rc;
void *ud;
- PairData() { colliding=false; rc=1; ud=NULL; }
+ PairData() {
+ colliding = false;
+ rc = 1;
+ ud = NULL;
+ }
};
struct Element {
@@ -51,8 +54,7 @@ class BroadPhase2DHashGrid : public BroadPhase2DSW {
Rect2 aabb;
int subindex;
uint64_t pass;
- Map<Element*,PairData*> paired;
-
+ Map<Element *, PairData *> paired;
};
struct RC {
@@ -69,18 +71,17 @@ class BroadPhase2DHashGrid : public BroadPhase2DSW {
}
_FORCE_INLINE_ RC() {
- ref=0;
+ ref = 0;
}
};
- Map<ID,Element> element_map;
- Map<Element*,RC> large_elements;
+ Map<ID, Element> element_map;
+ Map<Element *, RC> large_elements;
ID current;
uint64_t pass;
-
struct PairKey {
union {
@@ -91,17 +92,23 @@ class BroadPhase2DHashGrid : public BroadPhase2DSW {
uint64_t key;
};
- _FORCE_INLINE_ bool operator<(const PairKey& p_key) const {
+ _FORCE_INLINE_ bool operator<(const PairKey &p_key) const {
return key < p_key.key;
}
- PairKey() { key=0; }
- PairKey(ID p_a, ID p_b) { if (p_a>p_b) { a=p_b; b=p_a; } else { a=p_a; b=p_b; }}
-
+ PairKey() { key = 0; }
+ PairKey(ID p_a, ID p_b) {
+ if (p_a > p_b) {
+ a = p_b;
+ b = p_a;
+ } else {
+ a = p_a;
+ b = p_b;
+ }
+ }
};
-
- Map<PairKey,PairData> pair_map;
+ Map<PairKey, PairData> pair_map;
int cell_size;
int large_object_min_surface;
@@ -111,11 +118,10 @@ class BroadPhase2DHashGrid : public BroadPhase2DSW {
UnpairCallback unpair_callback;
void *unpair_userdata;
- void _enter_grid(Element* p_elem, const Rect2& p_rect,bool p_static);
- void _exit_grid(Element* p_elem, const Rect2& p_rect,bool p_static);
- template<bool use_aabb,bool use_segment>
- _FORCE_INLINE_ void _cull(const Point2i p_cell,const Rect2& p_aabb,const Point2& p_from, const Point2& p_to,CollisionObject2DSW** p_results,int p_max_results,int *p_result_indices,int &index);
-
+ void _enter_grid(Element *p_elem, const Rect2 &p_rect, bool p_static);
+ void _exit_grid(Element *p_elem, const Rect2 &p_rect, bool p_static);
+ template <bool use_aabb, bool use_segment>
+ _FORCE_INLINE_ void _cull(const Point2i p_cell, const Rect2 &p_aabb, const Point2 &p_from, const Point2 &p_to, CollisionObject2DSW **p_results, int p_max_results, int *p_result_indices, int &index);
struct PosKey {
@@ -127,9 +133,8 @@ class BroadPhase2DHashGrid : public BroadPhase2DSW {
uint64_t key;
};
-
_FORCE_INLINE_ uint32_t hash() const {
- uint64_t k=key;
+ uint64_t k = key;
k = (~k) + (k << 18); // k = (k << 18) - k - 1;
k = k ^ (k >> 31);
k = k * 21; // k = (k + (k << 2)) + (k << 4);
@@ -139,36 +144,30 @@ class BroadPhase2DHashGrid : public BroadPhase2DSW {
return k;
}
- bool operator==(const PosKey& p_key) const { return key==p_key.key; }
- _FORCE_INLINE_ bool operator<(const PosKey& p_key) const {
+ bool operator==(const PosKey &p_key) const { return key == p_key.key; }
+ _FORCE_INLINE_ bool operator<(const PosKey &p_key) const {
return key < p_key.key;
}
-
};
-
-
struct PosBin {
PosKey key;
- Map<Element*,RC> object_set;
- Map<Element*,RC> static_object_set;
+ Map<Element *, RC> object_set;
+ Map<Element *, RC> static_object_set;
PosBin *next;
};
-
uint32_t hash_table_size;
PosBin **hash_table;
- void _pair_attempt(Element *p_elem, Element* p_with);
- void _unpair_attempt(Element *p_elem, Element* p_with);
+ void _pair_attempt(Element *p_elem, Element *p_with);
+ void _unpair_attempt(Element *p_elem, Element *p_with);
void _check_motion(Element *p_elem);
-
public:
-
- virtual ID create(CollisionObject2DSW *p_object_, int p_subindex=0);
- virtual void move(ID p_id, const Rect2& p_aabb);
+ virtual ID create(CollisionObject2DSW *p_object_, int p_subindex = 0);
+ virtual void move(ID p_id, const Rect2 &p_aabb);
virtual void set_static(ID p_id, bool p_static);
virtual void remove(ID p_id);
@@ -176,21 +175,18 @@ public:
virtual bool is_static(ID p_id) const;
virtual int get_subindex(ID p_id) const;
- virtual int cull_segment(const Vector2& p_from, const Vector2& p_to,CollisionObject2DSW** p_results,int p_max_results,int *p_result_indices=NULL);
- virtual int cull_aabb(const Rect2& p_aabb,CollisionObject2DSW** p_results,int p_max_results,int *p_result_indices=NULL);
+ virtual int cull_segment(const Vector2 &p_from, const Vector2 &p_to, CollisionObject2DSW **p_results, int p_max_results, int *p_result_indices = NULL);
+ virtual int cull_aabb(const Rect2 &p_aabb, CollisionObject2DSW **p_results, int p_max_results, int *p_result_indices = NULL);
- virtual void set_pair_callback(PairCallback p_pair_callback,void *p_userdata);
- virtual void set_unpair_callback(UnpairCallback p_unpair_callback,void *p_userdata);
+ virtual void set_pair_callback(PairCallback p_pair_callback, void *p_userdata);
+ virtual void set_unpair_callback(UnpairCallback p_unpair_callback, void *p_userdata);
virtual void update();
-
static BroadPhase2DSW *_create();
BroadPhase2DHashGrid();
~BroadPhase2DHashGrid();
-
-
};
#endif // BROAD_PHASE_2D_HASH_GRID_H
diff --git a/servers/physics_2d/broad_phase_2d_sw.cpp b/servers/physics_2d/broad_phase_2d_sw.cpp
index 4347155c2..8cde46217 100644
--- a/servers/physics_2d/broad_phase_2d_sw.cpp
+++ b/servers/physics_2d/broad_phase_2d_sw.cpp
@@ -28,8 +28,7 @@
/*************************************************************************/
#include "broad_phase_2d_sw.h"
-BroadPhase2DSW::CreateFunction BroadPhase2DSW::create_func=NULL;
+BroadPhase2DSW::CreateFunction BroadPhase2DSW::create_func = NULL;
-BroadPhase2DSW::~BroadPhase2DSW()
-{
+BroadPhase2DSW::~BroadPhase2DSW() {
}
diff --git a/servers/physics_2d/broad_phase_2d_sw.h b/servers/physics_2d/broad_phase_2d_sw.h
index b9ec434ae..a255cc6ba 100644
--- a/servers/physics_2d/broad_phase_2d_sw.h
+++ b/servers/physics_2d/broad_phase_2d_sw.h
@@ -29,45 +29,42 @@
#ifndef BROAD_PHASE_2D_SW_H
#define BROAD_PHASE_2D_SW_H
-#include "math_funcs.h"
#include "math_2d.h"
+#include "math_funcs.h"
class CollisionObject2DSW;
-
class BroadPhase2DSW {
public:
- typedef BroadPhase2DSW* (*CreateFunction)();
+ typedef BroadPhase2DSW *(*CreateFunction)();
static CreateFunction create_func;
typedef uint32_t ID;
-
- typedef void* (*PairCallback)(CollisionObject2DSW *A,int p_subindex_A,CollisionObject2DSW *B,int p_subindex_B,void *p_userdata);
- typedef void (*UnpairCallback)(CollisionObject2DSW *A,int p_subindex_A,CollisionObject2DSW *B,int p_subindex_B,void *p_data,void *p_userdata);
+ typedef void *(*PairCallback)(CollisionObject2DSW *A, int p_subindex_A, CollisionObject2DSW *B, int p_subindex_B, void *p_userdata);
+ typedef void (*UnpairCallback)(CollisionObject2DSW *A, int p_subindex_A, CollisionObject2DSW *B, int p_subindex_B, void *p_data, void *p_userdata);
// 0 is an invalid ID
- virtual ID create(CollisionObject2DSW *p_object_, int p_subindex=0)=0;
- virtual void move(ID p_id, const Rect2& p_aabb)=0;
- virtual void set_static(ID p_id, bool p_static)=0;
- virtual void remove(ID p_id)=0;
+ virtual ID create(CollisionObject2DSW *p_object_, int p_subindex = 0) = 0;
+ virtual void move(ID p_id, const Rect2 &p_aabb) = 0;
+ virtual void set_static(ID p_id, bool p_static) = 0;
+ virtual void remove(ID p_id) = 0;
- virtual CollisionObject2DSW *get_object(ID p_id) const=0;
- virtual bool is_static(ID p_id) const=0;
- virtual int get_subindex(ID p_id) const=0;
+ virtual CollisionObject2DSW *get_object(ID p_id) const = 0;
+ virtual bool is_static(ID p_id) const = 0;
+ virtual int get_subindex(ID p_id) const = 0;
- virtual int cull_segment(const Vector2& p_from, const Vector2& p_to,CollisionObject2DSW** p_results,int p_max_results,int *p_result_indices=NULL)=0;
- virtual int cull_aabb(const Rect2& p_aabb,CollisionObject2DSW** p_results,int p_max_results,int *p_result_indices=NULL)=0;
+ virtual int cull_segment(const Vector2 &p_from, const Vector2 &p_to, CollisionObject2DSW **p_results, int p_max_results, int *p_result_indices = NULL) = 0;
+ virtual int cull_aabb(const Rect2 &p_aabb, CollisionObject2DSW **p_results, int p_max_results, int *p_result_indices = NULL) = 0;
- virtual void set_pair_callback(PairCallback p_pair_callback,void *p_userdata)=0;
- virtual void set_unpair_callback(UnpairCallback p_unpair_callback,void *p_userdata)=0;
+ virtual void set_pair_callback(PairCallback p_pair_callback, void *p_userdata) = 0;
+ virtual void set_unpair_callback(UnpairCallback p_unpair_callback, void *p_userdata) = 0;
- virtual void update()=0;
+ virtual void update() = 0;
virtual ~BroadPhase2DSW();
-
};
#endif // BROAD_PHASE_2D_SW_H
diff --git a/servers/physics_2d/collision_object_2d_sw.cpp b/servers/physics_2d/collision_object_2d_sw.cpp
index 94e5d668b..8adb7ada1 100644
--- a/servers/physics_2d/collision_object_2d_sw.cpp
+++ b/servers/physics_2d/collision_object_2d_sw.cpp
@@ -29,46 +29,43 @@
#include "collision_object_2d_sw.h"
#include "space_2d_sw.h"
-void CollisionObject2DSW::add_shape(Shape2DSW *p_shape,const Matrix32& p_transform) {
+void CollisionObject2DSW::add_shape(Shape2DSW *p_shape, const Matrix32 &p_transform) {
Shape s;
- s.shape=p_shape;
- s.xform=p_transform;
- s.xform_inv=s.xform.affine_inverse();
- s.bpid=0; //needs update
- s.trigger=false;
+ s.shape = p_shape;
+ s.xform = p_transform;
+ s.xform_inv = s.xform.affine_inverse();
+ s.bpid = 0; //needs update
+ s.trigger = false;
shapes.push_back(s);
p_shape->add_owner(this);
_update_shapes();
_shapes_changed();
-
}
-void CollisionObject2DSW::set_shape(int p_index,Shape2DSW *p_shape){
+void CollisionObject2DSW::set_shape(int p_index, Shape2DSW *p_shape) {
- ERR_FAIL_INDEX(p_index,shapes.size());
+ ERR_FAIL_INDEX(p_index, shapes.size());
shapes[p_index].shape->remove_owner(this);
- shapes[p_index].shape=p_shape;
+ shapes[p_index].shape = p_shape;
p_shape->add_owner(this);
_update_shapes();
_shapes_changed();
-
}
-void CollisionObject2DSW::set_shape_metadata(int p_index,const Variant& p_metadata) {
-
- ERR_FAIL_INDEX(p_index,shapes.size());
- shapes[p_index].metadata=p_metadata;
+void CollisionObject2DSW::set_shape_metadata(int p_index, const Variant &p_metadata) {
+ ERR_FAIL_INDEX(p_index, shapes.size());
+ shapes[p_index].metadata = p_metadata;
}
-void CollisionObject2DSW::set_shape_transform(int p_index,const Matrix32& p_transform){
+void CollisionObject2DSW::set_shape_transform(int p_index, const Matrix32 &p_transform) {
- ERR_FAIL_INDEX(p_index,shapes.size());
+ ERR_FAIL_INDEX(p_index, shapes.size());
- shapes[p_index].xform=p_transform;
- shapes[p_index].xform_inv=p_transform.affine_inverse();
+ shapes[p_index].xform = p_transform;
+ shapes[p_index].xform_inv = p_transform.affine_inverse();
_update_shapes();
_shapes_changed();
}
@@ -76,61 +73,58 @@ void CollisionObject2DSW::set_shape_transform(int p_index,const Matrix32& p_tran
void CollisionObject2DSW::remove_shape(Shape2DSW *p_shape) {
//remove a shape, all the times it appears
- for(int i=0;i<shapes.size();i++) {
+ for (int i = 0; i < shapes.size(); i++) {
- if (shapes[i].shape==p_shape) {
+ if (shapes[i].shape == p_shape) {
remove_shape(i);
i--;
}
}
}
-void CollisionObject2DSW::remove_shape(int p_index){
+void CollisionObject2DSW::remove_shape(int p_index) {
//remove anything from shape to be erased to end, so subindices don't change
- ERR_FAIL_INDEX(p_index,shapes.size());
- for(int i=p_index;i<shapes.size();i++) {
+ ERR_FAIL_INDEX(p_index, shapes.size());
+ for (int i = p_index; i < shapes.size(); i++) {
- if (shapes[i].bpid==0)
+ if (shapes[i].bpid == 0)
continue;
//should never get here with a null owner
space->get_broadphase()->remove(shapes[i].bpid);
- shapes[i].bpid=0;
+ shapes[i].bpid = 0;
}
shapes[p_index].shape->remove_owner(this);
shapes.remove(p_index);
_shapes_changed();
-
}
void CollisionObject2DSW::_set_static(bool p_static) {
- if (_static==p_static)
+ if (_static == p_static)
return;
- _static=p_static;
+ _static = p_static;
if (!space)
return;
- for(int i=0;i<get_shape_count();i++) {
- Shape &s=shapes[i];
- if (s.bpid>0) {
- space->get_broadphase()->set_static(s.bpid,_static);
+ for (int i = 0; i < get_shape_count(); i++) {
+ Shape &s = shapes[i];
+ if (s.bpid > 0) {
+ space->get_broadphase()->set_static(s.bpid, _static);
}
}
-
}
void CollisionObject2DSW::_unregister_shapes() {
- for(int i=0;i<shapes.size();i++) {
+ for (int i = 0; i < shapes.size(); i++) {
- Shape &s=shapes[i];
- if (s.bpid>0) {
+ Shape &s = shapes[i];
+ if (s.bpid > 0) {
space->get_broadphase()->remove(s.bpid);
- s.bpid=0;
+ s.bpid = 0;
}
}
-
}
void CollisionObject2DSW::_update_shapes() {
@@ -138,53 +132,47 @@ void CollisionObject2DSW::_update_shapes() {
if (!space)
return;
+ for (int i = 0; i < shapes.size(); i++) {
- for(int i=0;i<shapes.size();i++) {
-
- Shape &s=shapes[i];
- if (s.bpid==0) {
- s.bpid=space->get_broadphase()->create(this,i);
- space->get_broadphase()->set_static(s.bpid,_static);
+ Shape &s = shapes[i];
+ if (s.bpid == 0) {
+ s.bpid = space->get_broadphase()->create(this, i);
+ space->get_broadphase()->set_static(s.bpid, _static);
}
//not quite correct, should compute the next matrix..
- Rect2 shape_aabb=s.shape->get_aabb();
+ Rect2 shape_aabb = s.shape->get_aabb();
Matrix32 xform = transform * s.xform;
- shape_aabb=xform.xform(shape_aabb);
- s.aabb_cache=shape_aabb;
- s.aabb_cache=s.aabb_cache.grow( (s.aabb_cache.size.x + s.aabb_cache.size.y)*0.5*0.05 );
+ shape_aabb = xform.xform(shape_aabb);
+ s.aabb_cache = shape_aabb;
+ s.aabb_cache = s.aabb_cache.grow((s.aabb_cache.size.x + s.aabb_cache.size.y) * 0.5 * 0.05);
-
- space->get_broadphase()->move(s.bpid,s.aabb_cache);
+ space->get_broadphase()->move(s.bpid, s.aabb_cache);
}
-
}
-void CollisionObject2DSW::_update_shapes_with_motion(const Vector2& p_motion) {
-
+void CollisionObject2DSW::_update_shapes_with_motion(const Vector2 &p_motion) {
if (!space)
return;
- for(int i=0;i<shapes.size();i++) {
+ for (int i = 0; i < shapes.size(); i++) {
- Shape &s=shapes[i];
- if (s.bpid==0) {
- s.bpid=space->get_broadphase()->create(this,i);
- space->get_broadphase()->set_static(s.bpid,_static);
+ Shape &s = shapes[i];
+ if (s.bpid == 0) {
+ s.bpid = space->get_broadphase()->create(this, i);
+ space->get_broadphase()->set_static(s.bpid, _static);
}
//not quite correct, should compute the next matrix..
- Rect2 shape_aabb=s.shape->get_aabb();
+ Rect2 shape_aabb = s.shape->get_aabb();
Matrix32 xform = transform * s.xform;
- shape_aabb=xform.xform(shape_aabb);
- shape_aabb=shape_aabb.merge(Rect2( shape_aabb.pos+p_motion,shape_aabb.size)); //use motion
- s.aabb_cache=shape_aabb;
+ shape_aabb = xform.xform(shape_aabb);
+ shape_aabb = shape_aabb.merge(Rect2(shape_aabb.pos + p_motion, shape_aabb.size)); //use motion
+ s.aabb_cache = shape_aabb;
- space->get_broadphase()->move(s.bpid,shape_aabb);
+ space->get_broadphase()->move(s.bpid, shape_aabb);
}
-
-
}
void CollisionObject2DSW::_set_space(Space2DSW *p_space) {
@@ -193,25 +181,23 @@ void CollisionObject2DSW::_set_space(Space2DSW *p_space) {
space->remove_object(this);
- for(int i=0;i<shapes.size();i++) {
+ for (int i = 0; i < shapes.size(); i++) {
- Shape &s=shapes[i];
+ Shape &s = shapes[i];
if (s.bpid) {
space->get_broadphase()->remove(s.bpid);
- s.bpid=0;
+ s.bpid = 0;
}
}
-
}
- space=p_space;
+ space = p_space;
if (space) {
space->add_object(this);
_update_shapes();
}
-
}
void CollisionObject2DSW::_shape_changed() {
@@ -222,11 +208,11 @@ void CollisionObject2DSW::_shape_changed() {
CollisionObject2DSW::CollisionObject2DSW(Type p_type) {
- _static=true;
- type=p_type;
- space=NULL;
- instance_id=0;
- collision_mask=1;
- layer_mask=1;
- pickable=true;
+ _static = true;
+ type = p_type;
+ space = NULL;
+ instance_id = 0;
+ collision_mask = 1;
+ layer_mask = 1;
+ pickable = true;
}
diff --git a/servers/physics_2d/collision_object_2d_sw.h b/servers/physics_2d/collision_object_2d_sw.h
index cf26a28ec..2c3acbee7 100644
--- a/servers/physics_2d/collision_object_2d_sw.h
+++ b/servers/physics_2d/collision_object_2d_sw.h
@@ -29,10 +29,10 @@
#ifndef COLLISION_OBJECT_2D_SW_H
#define COLLISION_OBJECT_2D_SW_H
-#include "shape_2d_sw.h"
-#include "servers/physics_2d_server.h"
-#include "self_list.h"
#include "broad_phase_2d_sw.h"
+#include "self_list.h"
+#include "servers/physics_2d_server.h"
+#include "shape_2d_sw.h"
class Space2DSW;
@@ -42,8 +42,8 @@ public:
TYPE_AREA,
TYPE_BODY
};
-private:
+private:
Type type;
RID self;
ObjectID instance_id;
@@ -58,7 +58,7 @@ private:
Shape2DSW *shape;
Variant metadata;
bool trigger;
- Shape() { trigger=false; }
+ Shape() { trigger = false; }
};
Vector<Shape> shapes;
@@ -72,74 +72,74 @@ private:
void _update_shapes();
protected:
-
-
- void _update_shapes_with_motion(const Vector2& p_motion);
+ void _update_shapes_with_motion(const Vector2 &p_motion);
void _unregister_shapes();
- _FORCE_INLINE_ void _set_transform(const Matrix32& p_transform, bool p_update_shapes=true) { transform=p_transform; if (p_update_shapes) {_update_shapes();} }
- _FORCE_INLINE_ void _set_inv_transform(const Matrix32& p_transform) { inv_transform=p_transform; }
+ _FORCE_INLINE_ void _set_transform(const Matrix32 &p_transform, bool p_update_shapes = true) {
+ transform = p_transform;
+ if (p_update_shapes) {
+ _update_shapes();
+ }
+ }
+ _FORCE_INLINE_ void _set_inv_transform(const Matrix32 &p_transform) { inv_transform = p_transform; }
void _set_static(bool p_static);
- virtual void _shapes_changed()=0;
+ virtual void _shapes_changed() = 0;
void _set_space(Space2DSW *space);
CollisionObject2DSW(Type p_type);
-public:
- _FORCE_INLINE_ void set_self(const RID& p_self) { self=p_self; }
+public:
+ _FORCE_INLINE_ void set_self(const RID &p_self) { self = p_self; }
_FORCE_INLINE_ RID get_self() const { return self; }
- _FORCE_INLINE_ void set_instance_id(const ObjectID& p_instance_id) { instance_id=p_instance_id; }
+ _FORCE_INLINE_ void set_instance_id(const ObjectID &p_instance_id) { instance_id = p_instance_id; }
_FORCE_INLINE_ ObjectID get_instance_id() const { return instance_id; }
void _shape_changed();
_FORCE_INLINE_ Type get_type() const { return type; }
- void add_shape(Shape2DSW *p_shape,const Matrix32& p_transform=Matrix32());
- void set_shape(int p_index,Shape2DSW *p_shape);
- void set_shape_transform(int p_index,const Matrix32& p_transform);
- void set_shape_metadata(int p_index,const Variant& p_metadata);
-
+ void add_shape(Shape2DSW *p_shape, const Matrix32 &p_transform = Matrix32());
+ void set_shape(int p_index, Shape2DSW *p_shape);
+ void set_shape_transform(int p_index, const Matrix32 &p_transform);
+ void set_shape_metadata(int p_index, const Variant &p_metadata);
_FORCE_INLINE_ int get_shape_count() const { return shapes.size(); }
_FORCE_INLINE_ Shape2DSW *get_shape(int p_index) const { return shapes[p_index].shape; }
- _FORCE_INLINE_ const Matrix32& get_shape_transform(int p_index) const { return shapes[p_index].xform; }
- _FORCE_INLINE_ const Matrix32& get_shape_inv_transform(int p_index) const { return shapes[p_index].xform_inv; }
- _FORCE_INLINE_ const Rect2& get_shape_aabb(int p_index) const { return shapes[p_index].aabb_cache; }
- _FORCE_INLINE_ const Variant& get_shape_metadata(int p_index) const { return shapes[p_index].metadata; }
+ _FORCE_INLINE_ const Matrix32 &get_shape_transform(int p_index) const { return shapes[p_index].xform; }
+ _FORCE_INLINE_ const Matrix32 &get_shape_inv_transform(int p_index) const { return shapes[p_index].xform_inv; }
+ _FORCE_INLINE_ const Rect2 &get_shape_aabb(int p_index) const { return shapes[p_index].aabb_cache; }
+ _FORCE_INLINE_ const Variant &get_shape_metadata(int p_index) const { return shapes[p_index].metadata; }
_FORCE_INLINE_ Matrix32 get_transform() const { return transform; }
_FORCE_INLINE_ Matrix32 get_inv_transform() const { return inv_transform; }
- _FORCE_INLINE_ Space2DSW* get_space() const { return space; }
+ _FORCE_INLINE_ Space2DSW *get_space() const { return space; }
- _FORCE_INLINE_ void set_shape_as_trigger(int p_idx,bool p_enable) { shapes[p_idx].trigger=p_enable; }
+ _FORCE_INLINE_ void set_shape_as_trigger(int p_idx, bool p_enable) { shapes[p_idx].trigger = p_enable; }
_FORCE_INLINE_ bool is_shape_set_as_trigger(int p_idx) const { return shapes[p_idx].trigger; }
-
- void set_collision_mask(uint32_t p_mask) {collision_mask=p_mask;}
+ void set_collision_mask(uint32_t p_mask) { collision_mask = p_mask; }
_FORCE_INLINE_ uint32_t get_collision_mask() const { return collision_mask; }
- void set_layer_mask(uint32_t p_mask) {layer_mask=p_mask;}
+ void set_layer_mask(uint32_t p_mask) { layer_mask = p_mask; }
_FORCE_INLINE_ uint32_t get_layer_mask() const { return layer_mask; }
void remove_shape(Shape2DSW *p_shape);
void remove_shape(int p_index);
- virtual void set_space(Space2DSW *p_space)=0;
+ virtual void set_space(Space2DSW *p_space) = 0;
- _FORCE_INLINE_ bool is_static() const { return _static; }
+ _FORCE_INLINE_ bool is_static() const { return _static; }
- void set_pickable(bool p_pickable) { pickable=p_pickable; }
+ void set_pickable(bool p_pickable) { pickable = p_pickable; }
_FORCE_INLINE_ bool is_pickable() const { return pickable; }
- _FORCE_INLINE_ bool test_collision_mask(CollisionObject2DSW* p_other) const {
+ _FORCE_INLINE_ bool test_collision_mask(CollisionObject2DSW *p_other) const {
- return layer_mask&p_other->collision_mask || p_other->layer_mask&collision_mask;
+ return layer_mask & p_other->collision_mask || p_other->layer_mask & collision_mask;
}
virtual ~CollisionObject2DSW() {}
-
};
#endif // COLLISION_OBJECT_2D_SW_H
diff --git a/servers/physics_2d/collision_solver_2d_sat.cpp b/servers/physics_2d/collision_solver_2d_sat.cpp
index d4ab2c3bc..3260b58e8 100644
--- a/servers/physics_2d/collision_solver_2d_sat.cpp
+++ b/servers/physics_2d/collision_solver_2d_sat.cpp
@@ -38,59 +38,55 @@ struct _CollectorCallback2D {
Vector2 normal;
Vector2 *sep_axis;
- _FORCE_INLINE_ void call(const Vector2& p_point_A, const Vector2& p_point_B) {
+ _FORCE_INLINE_ void call(const Vector2 &p_point_A, const Vector2 &p_point_B) {
//if (normal.dot(p_point_A) >= normal.dot(p_point_B))
// return;
if (swap)
- callback(p_point_B,p_point_A,userdata);
+ callback(p_point_B, p_point_A, userdata);
else
- callback(p_point_A,p_point_B,userdata);
+ callback(p_point_A, p_point_B, userdata);
}
-
};
-typedef void (*GenerateContactsFunc)(const Vector2 *,int, const Vector2 *,int ,_CollectorCallback2D *);
-
+typedef void (*GenerateContactsFunc)(const Vector2 *, int, const Vector2 *, int, _CollectorCallback2D *);
-_FORCE_INLINE_ static void _generate_contacts_point_point(const Vector2 * p_points_A,int p_point_count_A, const Vector2 * p_points_B,int p_point_count_B,_CollectorCallback2D *p_collector) {
+_FORCE_INLINE_ static void _generate_contacts_point_point(const Vector2 *p_points_A, int p_point_count_A, const Vector2 *p_points_B, int p_point_count_B, _CollectorCallback2D *p_collector) {
#ifdef DEBUG_ENABLED
- ERR_FAIL_COND( p_point_count_A != 1 );
- ERR_FAIL_COND( p_point_count_B != 1 );
+ ERR_FAIL_COND(p_point_count_A != 1);
+ ERR_FAIL_COND(p_point_count_B != 1);
#endif
- p_collector->call(*p_points_A,*p_points_B);
+ p_collector->call(*p_points_A, *p_points_B);
}
-_FORCE_INLINE_ static void _generate_contacts_point_edge(const Vector2 * p_points_A,int p_point_count_A, const Vector2 * p_points_B,int p_point_count_B,_CollectorCallback2D *p_collector) {
+_FORCE_INLINE_ static void _generate_contacts_point_edge(const Vector2 *p_points_A, int p_point_count_A, const Vector2 *p_points_B, int p_point_count_B, _CollectorCallback2D *p_collector) {
#ifdef DEBUG_ENABLED
- ERR_FAIL_COND( p_point_count_A != 1 );
- ERR_FAIL_COND( p_point_count_B != 2 );
+ ERR_FAIL_COND(p_point_count_A != 1);
+ ERR_FAIL_COND(p_point_count_B != 2);
#endif
- Vector2 closest_B = Geometry::get_closest_point_to_segment_uncapped_2d(*p_points_A, p_points_B );
- p_collector->call(*p_points_A,closest_B);
-
+ Vector2 closest_B = Geometry::get_closest_point_to_segment_uncapped_2d(*p_points_A, p_points_B);
+ p_collector->call(*p_points_A, closest_B);
}
-
struct _generate_contacts_Pair {
bool a;
int idx;
float d;
- _FORCE_INLINE_ bool operator <(const _generate_contacts_Pair& l) const { return d< l.d; }
+ _FORCE_INLINE_ bool operator<(const _generate_contacts_Pair &l) const { return d < l.d; }
};
-_FORCE_INLINE_ static void _generate_contacts_edge_edge(const Vector2 * p_points_A,int p_point_count_A, const Vector2 * p_points_B,int p_point_count_B,_CollectorCallback2D *p_collector) {
+_FORCE_INLINE_ static void _generate_contacts_edge_edge(const Vector2 *p_points_A, int p_point_count_A, const Vector2 *p_points_B, int p_point_count_B, _CollectorCallback2D *p_collector) {
#ifdef DEBUG_ENABLED
- ERR_FAIL_COND( p_point_count_A != 2 );
- ERR_FAIL_COND( p_point_count_B != 2 ); // circle is actually a 4x3 matrix
+ ERR_FAIL_COND(p_point_count_A != 2);
+ ERR_FAIL_COND(p_point_count_B != 2); // circle is actually a 4x3 matrix
#endif
-# if 0
+#if 0
Vector2 rel_A=p_points_A[1]-p_points_A[0];
Vector2 rel_B=p_points_B[1]-p_points_B[0];
@@ -208,9 +204,6 @@ _FORCE_INLINE_ static void _generate_contacts_edge_edge(const Vector2 * p_points
#if 1
-
-
-
Vector2 n = p_collector->normal;
Vector2 t = n.tangent();
real_t dA = n.dot(p_points_A[0]);
@@ -218,90 +211,87 @@ _FORCE_INLINE_ static void _generate_contacts_edge_edge(const Vector2 * p_points
_generate_contacts_Pair dvec[4];
- dvec[0].d=t.dot(p_points_A[0]);
- dvec[0].a=true;
- dvec[0].idx=0;
- dvec[1].d=t.dot(p_points_A[1]);
- dvec[1].a=true;
- dvec[1].idx=1;
- dvec[2].d=t.dot(p_points_B[0]);
- dvec[2].a=false;
- dvec[2].idx=0;
- dvec[3].d=t.dot(p_points_B[1]);
- dvec[3].a=false;
- dvec[3].idx=1;
+ dvec[0].d = t.dot(p_points_A[0]);
+ dvec[0].a = true;
+ dvec[0].idx = 0;
+ dvec[1].d = t.dot(p_points_A[1]);
+ dvec[1].a = true;
+ dvec[1].idx = 1;
+ dvec[2].d = t.dot(p_points_B[0]);
+ dvec[2].a = false;
+ dvec[2].idx = 0;
+ dvec[3].d = t.dot(p_points_B[1]);
+ dvec[3].a = false;
+ dvec[3].idx = 1;
SortArray<_generate_contacts_Pair> sa;
- sa.sort(dvec,4);
+ sa.sort(dvec, 4);
- for(int i=1;i<=2;i++) {
+ for (int i = 1; i <= 2; i++) {
if (dvec[i].a) {
Vector2 a = p_points_A[dvec[i].idx];
- Vector2 b = n.plane_project(dB,a);
- if (n.dot(a) > n.dot(b)-CMP_EPSILON)
+ Vector2 b = n.plane_project(dB, a);
+ if (n.dot(a) > n.dot(b) - CMP_EPSILON)
continue;
- p_collector->call(a,b);
+ p_collector->call(a, b);
} else {
Vector2 b = p_points_B[dvec[i].idx];
- Vector2 a = n.plane_project(dA,b);
- if (n.dot(a) > n.dot(b)-CMP_EPSILON)
+ Vector2 a = n.plane_project(dA, b);
+ if (n.dot(a) > n.dot(b) - CMP_EPSILON)
continue;
- p_collector->call(a,b);
+ p_collector->call(a, b);
}
}
-
-
#elif 0
Vector2 axis = rel_A.normalized(); //make an axis
Vector2 axis_B = rel_B.normalized();
- if (axis.dot(axis_B)<0)
- axis_B=-axis_B;
- axis=(axis+axis_B)*0.5;
+ if (axis.dot(axis_B) < 0)
+ axis_B = -axis_B;
+ axis = (axis + axis_B) * 0.5;
Vector2 base_A = p_points_A[0] - axis * axis.dot(p_points_A[0]);
Vector2 base_B = p_points_B[0] - axis * axis.dot(p_points_B[0]);
//sort all 4 points in axis
- float dvec[4]={ axis.dot(p_points_A[0]), axis.dot(p_points_A[1]), axis.dot(p_points_B[0]), axis.dot(p_points_B[1]) };
+ float dvec[4] = { axis.dot(p_points_A[0]), axis.dot(p_points_A[1]), axis.dot(p_points_B[0]), axis.dot(p_points_B[1]) };
//todo , find max/min and then use 2 central points
SortArray<float> sa;
- sa.sort(dvec,4);
+ sa.sort(dvec, 4);
//use the middle ones as contacts
- for (int i=1;i<=2;i++) {
+ for (int i = 1; i <= 2; i++) {
- Vector2 a = base_A+axis*dvec[i];
- Vector2 b = base_B+axis*dvec[i];
- if (p_collector->normal.dot(a) > p_collector->normal.dot(b)-0.01) {
- print_line("fail a: "+a);
- print_line("fail b: "+b);
+ Vector2 a = base_A + axis * dvec[i];
+ Vector2 b = base_B + axis * dvec[i];
+ if (p_collector->normal.dot(a) > p_collector->normal.dot(b) - 0.01) {
+ print_line("fail a: " + a);
+ print_line("fail b: " + b);
continue;
}
- print_line("res a: "+a);
- print_line("res b: "+b);
- p_collector->call(a,b);
+ print_line("res a: " + a);
+ print_line("res b: " + b);
+ p_collector->call(a, b);
}
#endif
}
-static void _generate_contacts_from_supports(const Vector2 * p_points_A,int p_point_count_A, const Vector2 * p_points_B,int p_point_count_B,_CollectorCallback2D *p_collector) {
-
+static void _generate_contacts_from_supports(const Vector2 *p_points_A, int p_point_count_A, const Vector2 *p_points_B, int p_point_count_B, _CollectorCallback2D *p_collector) {
#ifdef DEBUG_ENABLED
- ERR_FAIL_COND( p_point_count_A <1 );
- ERR_FAIL_COND( p_point_count_B <1 );
+ ERR_FAIL_COND(p_point_count_A < 1);
+ ERR_FAIL_COND(p_point_count_B < 1);
#endif
-
- static const GenerateContactsFunc generate_contacts_func_table[2][2]={
+ static const GenerateContactsFunc generate_contacts_func_table[2][2] = {
{
- _generate_contacts_point_point,
- _generate_contacts_point_edge,
- },{
- 0,
- _generate_contacts_edge_edge,
+ _generate_contacts_point_point,
+ _generate_contacts_point_edge,
+ },
+ {
+ 0,
+ _generate_contacts_edge_edge,
}
};
@@ -317,28 +307,25 @@ static void _generate_contacts_from_supports(const Vector2 * p_points_A,int p_po
pointcount_B = p_point_count_A;
pointcount_A = p_point_count_B;
- points_A=p_points_B;
- points_B=p_points_A;
+ points_A = p_points_B;
+ points_B = p_points_A;
} else {
pointcount_B = p_point_count_B;
pointcount_A = p_point_count_A;
- points_A=p_points_A;
- points_B=p_points_B;
+ points_A = p_points_A;
+ points_B = p_points_B;
}
- int version_A = (pointcount_A > 3 ? 3 : pointcount_A) -1;
- int version_B = (pointcount_B > 3 ? 3 : pointcount_B) -1;
+ int version_A = (pointcount_A > 3 ? 3 : pointcount_A) - 1;
+ int version_B = (pointcount_B > 3 ? 3 : pointcount_B) - 1;
GenerateContactsFunc contacts_func = generate_contacts_func_table[version_A][version_B];
ERR_FAIL_COND(!contacts_func);
- contacts_func(points_A,pointcount_A,points_B,pointcount_B,p_collector);
-
+ contacts_func(points_A, pointcount_A, points_B, pointcount_B, p_collector);
}
-
-
-template<class ShapeA, class ShapeB,bool castA=false,bool castB=false, bool withMargin=false>
+template <class ShapeA, class ShapeB, bool castA = false, bool castB = false, bool withMargin = false>
class SeparatorAxisTest2D {
const ShapeA *shape_A;
@@ -356,16 +343,14 @@ class SeparatorAxisTest2D {
_CollectorCallback2D *callback;
public:
-
_FORCE_INLINE_ bool test_previous_axis() {
- if (callback && callback->sep_axis && *callback->sep_axis!=Vector2()) {
+ if (callback && callback->sep_axis && *callback->sep_axis != Vector2()) {
return test_axis(*callback->sep_axis);
} else {
#ifdef DEBUG_ENABLED
best_axis_count++;
#endif
-
}
return true;
}
@@ -393,45 +378,44 @@ public:
return true;
}
- _FORCE_INLINE_ bool test_axis(const Vector2& p_axis) {
+ _FORCE_INLINE_ bool test_axis(const Vector2 &p_axis) {
- Vector2 axis=p_axis;
+ Vector2 axis = p_axis;
-
- if ( Math::abs(axis.x)<CMP_EPSILON &&
- Math::abs(axis.y)<CMP_EPSILON) {
+ if (Math::abs(axis.x) < CMP_EPSILON &&
+ Math::abs(axis.y) < CMP_EPSILON) {
// strange case, try an upwards separator
- axis=Vector2(0.0,1.0);
+ axis = Vector2(0.0, 1.0);
}
- real_t min_A,max_A,min_B,max_B;
+ real_t min_A, max_A, min_B, max_B;
if (castA)
- shape_A->project_range_cast(motion_A,axis,*transform_A,min_A,max_A);
+ shape_A->project_range_cast(motion_A, axis, *transform_A, min_A, max_A);
else
- shape_A->project_range(axis,*transform_A,min_A,max_A);
+ shape_A->project_range(axis, *transform_A, min_A, max_A);
if (castB)
- shape_B->project_range_cast(motion_B,axis,*transform_B,min_B,max_B);
+ shape_B->project_range_cast(motion_B, axis, *transform_B, min_B, max_B);
else
- shape_B->project_range(axis,*transform_B,min_B,max_B);
+ shape_B->project_range(axis, *transform_B, min_B, max_B);
if (withMargin) {
- min_A-=margin_A;
- max_A+=margin_A;
- min_B-=margin_B;
- max_B+=margin_B;
+ min_A -= margin_A;
+ max_A += margin_A;
+ min_B -= margin_B;
+ max_B += margin_B;
}
- min_B -= ( max_A - min_A ) * 0.5;
- max_B += ( max_A - min_A ) * 0.5;
+ min_B -= (max_A - min_A) * 0.5;
+ max_B += (max_A - min_A) * 0.5;
- real_t dmin = min_B - ( min_A + max_A ) * 0.5;
- real_t dmax = max_B - ( min_A + max_A ) * 0.5;
+ real_t dmin = min_B - (min_A + max_A) * 0.5;
+ real_t dmax = max_B - (min_A + max_A) * 0.5;
if (dmin > 0.0 || dmax < 0.0) {
if (callback && callback->sep_axis)
- *callback->sep_axis=axis;
+ *callback->sep_axis = axis;
#ifdef DEBUG_ENABLED
best_axis_count++;
#endif
@@ -443,26 +427,25 @@ public:
dmin = Math::abs(dmin);
- if ( dmax < dmin ) {
- if ( dmax < best_depth ) {
- best_depth=dmax;
- best_axis=axis;
+ if (dmax < dmin) {
+ if (dmax < best_depth) {
+ best_depth = dmax;
+ best_axis = axis;
#ifdef DEBUG_ENABLED
- best_axis_index=best_axis_count;
+ best_axis_index = best_axis_count;
#endif
-
}
} else {
- if ( dmin < best_depth ) {
- best_depth=dmin;
- best_axis=-axis; // keep it as A axis
+ if (dmin < best_depth) {
+ best_depth = dmin;
+ best_axis = -axis; // keep it as A axis
#ifdef DEBUG_ENABLED
- best_axis_index=best_axis_count;
+ best_axis_index = best_axis_count;
#endif
}
}
- // print_line("test axis: "+p_axis+" depth: "+rtos(best_depth));
+// print_line("test axis: "+p_axis+" depth: "+rtos(best_depth));
#ifdef DEBUG_ENABLED
best_axis_count++;
#endif
@@ -470,60 +453,55 @@ public:
return true;
}
-
_FORCE_INLINE_ void generate_contacts() {
// nothing to do, don't generate
- if (best_axis==Vector2(0.0,0.0))
+ if (best_axis == Vector2(0.0, 0.0))
return;
- callback->collided=true;
+ callback->collided = true;
if (!callback->callback)
return; //only collide, no callback
- static const int max_supports=2;
+ static const int max_supports = 2;
Vector2 supports_A[max_supports];
int support_count_A;
if (castA) {
- shape_A->get_supports_transformed_cast(motion_A,-best_axis,*transform_A,supports_A,support_count_A);
+ shape_A->get_supports_transformed_cast(motion_A, -best_axis, *transform_A, supports_A, support_count_A);
} else {
- shape_A->get_supports(transform_A->basis_xform_inv(-best_axis).normalized(),supports_A,support_count_A);
- for(int i=0;i<support_count_A;i++) {
+ shape_A->get_supports(transform_A->basis_xform_inv(-best_axis).normalized(), supports_A, support_count_A);
+ for (int i = 0; i < support_count_A; i++) {
supports_A[i] = transform_A->xform(supports_A[i]);
}
}
if (withMargin) {
- for(int i=0;i<support_count_A;i++) {
- supports_A[i]+=-best_axis*margin_A;
+ for (int i = 0; i < support_count_A; i++) {
+ supports_A[i] += -best_axis * margin_A;
}
-
}
-
-
Vector2 supports_B[max_supports];
int support_count_B;
if (castB) {
- shape_B->get_supports_transformed_cast(motion_B,best_axis,*transform_B,supports_B,support_count_B);
+ shape_B->get_supports_transformed_cast(motion_B, best_axis, *transform_B, supports_B, support_count_B);
} else {
- shape_B->get_supports(transform_B->basis_xform_inv(best_axis).normalized(),supports_B,support_count_B);
- for(int i=0;i<support_count_B;i++) {
+ shape_B->get_supports(transform_B->basis_xform_inv(best_axis).normalized(), supports_B, support_count_B);
+ for (int i = 0; i < support_count_B; i++) {
supports_B[i] = transform_B->xform(supports_B[i]);
}
}
if (withMargin) {
- for(int i=0;i<support_count_B;i++) {
- supports_B[i]+=best_axis*margin_B;
+ for (int i = 0; i < support_count_B; i++) {
+ supports_B[i] += best_axis * margin_B;
}
-
}
-/*
+ /*
print_line("**************************");
@@ -547,38 +525,33 @@ public:
}
//*/
+ callback->normal = best_axis;
+ _generate_contacts_from_supports(supports_A, support_count_A, supports_B, support_count_B, callback);
-
-
- callback->normal=best_axis;
- _generate_contacts_from_supports(supports_A,support_count_A,supports_B,support_count_B,callback);
-
- if (callback && callback->sep_axis && *callback->sep_axis!=Vector2())
- *callback->sep_axis=Vector2(); //invalidate previous axis (no test)
+ if (callback && callback->sep_axis && *callback->sep_axis != Vector2())
+ *callback->sep_axis = Vector2(); //invalidate previous axis (no test)
//CollisionSolver2DSW::CallbackResult cbk=NULL;
//cbk(Vector2(),Vector2(),NULL);
-
}
- _FORCE_INLINE_ SeparatorAxisTest2D(const ShapeA *p_shape_A,const Matrix32& p_transform_a, const ShapeB *p_shape_B,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_A=Vector2(), const Vector2& p_motion_B=Vector2(),real_t p_margin_A=0,real_t p_margin_B=0) {
+ _FORCE_INLINE_ SeparatorAxisTest2D(const ShapeA *p_shape_A, const Matrix32 &p_transform_a, const ShapeB *p_shape_B, const Matrix32 &p_transform_b, _CollectorCallback2D *p_collector, const Vector2 &p_motion_A = Vector2(), const Vector2 &p_motion_B = Vector2(), real_t p_margin_A = 0, real_t p_margin_B = 0) {
- margin_A=p_margin_A;
- margin_B=p_margin_B;
- best_depth=1e15;
- shape_A=p_shape_A;
- shape_B=p_shape_B;
- transform_A=&p_transform_a;
- transform_B=&p_transform_b;
- motion_A=p_motion_A;
- motion_B=p_motion_B;
+ margin_A = p_margin_A;
+ margin_B = p_margin_B;
+ best_depth = 1e15;
+ shape_A = p_shape_A;
+ shape_B = p_shape_B;
+ transform_A = &p_transform_a;
+ transform_B = &p_transform_b;
+ motion_A = p_motion_A;
+ motion_B = p_motion_B;
- callback=p_collector;
+ callback = p_collector;
#ifdef DEBUG_ENABLED
- best_axis_count=0;
- best_axis_index=-1;
+ best_axis_count = 0;
+ best_axis_index = -1;
#endif
}
-
};
/****** SAT TESTS *******/
@@ -586,37 +559,32 @@ public:
/****** SAT TESTS *******/
/****** SAT TESTS *******/
+#define TEST_POINT(m_a, m_b) \
+ ((!separator.test_axis(((m_a) - (m_b)).normalized())) || \
+ (castA && !separator.test_axis(((m_a) + p_motion_a - (m_b)).normalized())) || \
+ (castB && !separator.test_axis(((m_a) - ((m_b) + p_motion_b)).normalized())) || \
+ (castA && castB && !separator.test_axis(((m_a) + p_motion_a - ((m_b) + p_motion_b)).normalized())))
-#define TEST_POINT(m_a,m_b) \
- ( (!separator.test_axis(((m_a)-(m_b)).normalized())) ||\
- (castA && !separator.test_axis(((m_a)+p_motion_a-(m_b)).normalized())) ||\
- (castB && !separator.test_axis(((m_a)-((m_b)+p_motion_b)).normalized())) ||\
- (castA && castB && !separator.test_axis(((m_a)+p_motion_a-((m_b)+p_motion_b)).normalized())) )
-
-
-typedef void (*CollisionFunc)(const Shape2DSW*,const Matrix32&,const Shape2DSW*,const Matrix32&,_CollectorCallback2D *p_collector,const Vector2&,const Vector2&,float,float);
+typedef void (*CollisionFunc)(const Shape2DSW *, const Matrix32 &, const Shape2DSW *, const Matrix32 &, _CollectorCallback2D *p_collector, const Vector2 &, const Vector2 &, float, float);
+template <bool castA, bool castB, bool withMargin>
+static void _collision_segment_segment(const Shape2DSW *p_a, const Matrix32 &p_transform_a, const Shape2DSW *p_b, const Matrix32 &p_transform_b, _CollectorCallback2D *p_collector, const Vector2 &p_motion_a, const Vector2 &p_motion_b, float p_margin_A, float p_margin_B) {
-template<bool castA, bool castB,bool withMargin>
-static void _collision_segment_segment(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b,float p_margin_A,float p_margin_B) {
+ const SegmentShape2DSW *segment_A = static_cast<const SegmentShape2DSW *>(p_a);
+ const SegmentShape2DSW *segment_B = static_cast<const SegmentShape2DSW *>(p_b);
- const SegmentShape2DSW *segment_A = static_cast<const SegmentShape2DSW*>(p_a);
- const SegmentShape2DSW *segment_B = static_cast<const SegmentShape2DSW*>(p_b);
-
- SeparatorAxisTest2D<SegmentShape2DSW,SegmentShape2DSW,castA,castB,withMargin> separator(segment_A,p_transform_a,segment_B,p_transform_b,p_collector,p_motion_a,p_motion_b,p_margin_A,p_margin_B);
+ SeparatorAxisTest2D<SegmentShape2DSW, SegmentShape2DSW, castA, castB, withMargin> separator(segment_A, p_transform_a, segment_B, p_transform_b, p_collector, p_motion_a, p_motion_b, p_margin_A, p_margin_B);
if (!separator.test_previous_axis())
return;
//this collision is kind of pointless
-
//if (!separator.test_previous_axis())
// return;
if (!separator.test_cast())
return;
-
if (!separator.test_axis(segment_A->get_xformed_normal(p_transform_a)))
return;
if (!separator.test_axis(segment_B->get_xformed_normal(p_transform_b)))
@@ -625,30 +593,26 @@ static void _collision_segment_segment(const Shape2DSW* p_a,const Matrix32& p_tr
if (withMargin) {
//points grow to circles
-
- if (TEST_POINT( p_transform_a.xform(segment_A->get_a()),p_transform_b.xform(segment_B->get_a())) )
+ if (TEST_POINT(p_transform_a.xform(segment_A->get_a()), p_transform_b.xform(segment_B->get_a())))
return;
- if (TEST_POINT( p_transform_a.xform(segment_A->get_a()),p_transform_b.xform(segment_B->get_b())) )
+ if (TEST_POINT(p_transform_a.xform(segment_A->get_a()), p_transform_b.xform(segment_B->get_b())))
return;
- if (TEST_POINT( p_transform_a.xform(segment_A->get_b()),p_transform_b.xform(segment_B->get_a())) )
+ if (TEST_POINT(p_transform_a.xform(segment_A->get_b()), p_transform_b.xform(segment_B->get_a())))
return;
- if (TEST_POINT( p_transform_a.xform(segment_A->get_b()),p_transform_b.xform(segment_B->get_b())) )
+ if (TEST_POINT(p_transform_a.xform(segment_A->get_b()), p_transform_b.xform(segment_B->get_b())))
return;
}
separator.generate_contacts();
-
}
-template<bool castA, bool castB,bool withMargin>
-static void _collision_segment_circle(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b,float p_margin_A,float p_margin_B) {
+template <bool castA, bool castB, bool withMargin>
+static void _collision_segment_circle(const Shape2DSW *p_a, const Matrix32 &p_transform_a, const Shape2DSW *p_b, const Matrix32 &p_transform_b, _CollectorCallback2D *p_collector, const Vector2 &p_motion_a, const Vector2 &p_motion_b, float p_margin_A, float p_margin_B) {
+ const SegmentShape2DSW *segment_A = static_cast<const SegmentShape2DSW *>(p_a);
+ const CircleShape2DSW *circle_B = static_cast<const CircleShape2DSW *>(p_b);
- const SegmentShape2DSW *segment_A = static_cast<const SegmentShape2DSW*>(p_a);
- const CircleShape2DSW *circle_B = static_cast<const CircleShape2DSW*>(p_b);
-
-
- SeparatorAxisTest2D<SegmentShape2DSW,CircleShape2DSW,castA,castB,withMargin> separator(segment_A,p_transform_a,circle_B,p_transform_b,p_collector,p_motion_a,p_motion_b,p_margin_A,p_margin_B);
+ SeparatorAxisTest2D<SegmentShape2DSW, CircleShape2DSW, castA, castB, withMargin> separator(segment_A, p_transform_a, circle_B, p_transform_b, p_collector, p_motion_a, p_motion_b, p_margin_A, p_margin_B);
if (!separator.test_previous_axis())
return;
@@ -658,28 +622,26 @@ static void _collision_segment_circle(const Shape2DSW* p_a,const Matrix32& p_tra
//segment normal
if (!separator.test_axis(
- (p_transform_a.xform(segment_A->get_b())-p_transform_a.xform(segment_A->get_a())).normalized().tangent()
- ))
+ (p_transform_a.xform(segment_A->get_b()) - p_transform_a.xform(segment_A->get_a())).normalized().tangent()))
return;
//endpoint a vs circle
- if (TEST_POINT(p_transform_a.xform(segment_A->get_a()),p_transform_b.get_origin()))
+ if (TEST_POINT(p_transform_a.xform(segment_A->get_a()), p_transform_b.get_origin()))
return;
//endpoint b vs circle
- if (TEST_POINT(p_transform_a.xform(segment_A->get_b()),p_transform_b.get_origin()))
+ if (TEST_POINT(p_transform_a.xform(segment_A->get_b()), p_transform_b.get_origin()))
return;
-
separator.generate_contacts();
}
-template<bool castA, bool castB,bool withMargin>
-static void _collision_segment_rectangle(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b,float p_margin_A,float p_margin_B) {
+template <bool castA, bool castB, bool withMargin>
+static void _collision_segment_rectangle(const Shape2DSW *p_a, const Matrix32 &p_transform_a, const Shape2DSW *p_b, const Matrix32 &p_transform_b, _CollectorCallback2D *p_collector, const Vector2 &p_motion_a, const Vector2 &p_motion_b, float p_margin_A, float p_margin_B) {
- const SegmentShape2DSW *segment_A = static_cast<const SegmentShape2DSW*>(p_a);
- const RectangleShape2DSW *rectangle_B = static_cast<const RectangleShape2DSW*>(p_b);
+ const SegmentShape2DSW *segment_A = static_cast<const SegmentShape2DSW *>(p_a);
+ const RectangleShape2DSW *rectangle_B = static_cast<const RectangleShape2DSW *>(p_b);
- SeparatorAxisTest2D<SegmentShape2DSW,RectangleShape2DSW,castA,castB,withMargin> separator(segment_A,p_transform_a,rectangle_B,p_transform_b,p_collector,p_motion_a,p_motion_b,p_margin_A,p_margin_B);
+ SeparatorAxisTest2D<SegmentShape2DSW, RectangleShape2DSW, castA, castB, withMargin> separator(segment_A, p_transform_a, rectangle_B, p_transform_b, p_collector, p_motion_a, p_motion_b, p_margin_A, p_margin_B);
if (!separator.test_previous_axis())
return;
@@ -703,48 +665,46 @@ static void _collision_segment_rectangle(const Shape2DSW* p_a,const Matrix32& p_
Vector2 a = p_transform_a.xform(segment_A->get_a());
Vector2 b = p_transform_a.xform(segment_A->get_b());
- if (!separator.test_axis( rectangle_B->get_circle_axis(p_transform_b,inv,a)))
+ if (!separator.test_axis(rectangle_B->get_circle_axis(p_transform_b, inv, a)))
return;
- if (!separator.test_axis( rectangle_B->get_circle_axis(p_transform_b,inv,b)))
+ if (!separator.test_axis(rectangle_B->get_circle_axis(p_transform_b, inv, b)))
return;
if (castA) {
- if (!separator.test_axis( rectangle_B->get_circle_axis(p_transform_b,inv,a+p_motion_a)))
+ if (!separator.test_axis(rectangle_B->get_circle_axis(p_transform_b, inv, a + p_motion_a)))
return;
- if (!separator.test_axis( rectangle_B->get_circle_axis(p_transform_b,inv,b+p_motion_a)))
+ if (!separator.test_axis(rectangle_B->get_circle_axis(p_transform_b, inv, b + p_motion_a)))
return;
}
if (castB) {
- if (!separator.test_axis( rectangle_B->get_circle_axis(p_transform_b,inv,a-p_motion_b)))
+ if (!separator.test_axis(rectangle_B->get_circle_axis(p_transform_b, inv, a - p_motion_b)))
return;
- if (!separator.test_axis( rectangle_B->get_circle_axis(p_transform_b,inv,b-p_motion_b)))
+ if (!separator.test_axis(rectangle_B->get_circle_axis(p_transform_b, inv, b - p_motion_b)))
return;
}
if (castA && castB) {
- if (!separator.test_axis( rectangle_B->get_circle_axis(p_transform_b,inv,a-p_motion_b+p_motion_a)))
+ if (!separator.test_axis(rectangle_B->get_circle_axis(p_transform_b, inv, a - p_motion_b + p_motion_a)))
return;
- if (!separator.test_axis( rectangle_B->get_circle_axis(p_transform_b,inv,b-p_motion_b+p_motion_a)))
+ if (!separator.test_axis(rectangle_B->get_circle_axis(p_transform_b, inv, b - p_motion_b + p_motion_a)))
return;
}
-
}
separator.generate_contacts();
-
}
-template<bool castA, bool castB,bool withMargin>
-static void _collision_segment_capsule(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b,float p_margin_A,float p_margin_B) {
+template <bool castA, bool castB, bool withMargin>
+static void _collision_segment_capsule(const Shape2DSW *p_a, const Matrix32 &p_transform_a, const Shape2DSW *p_b, const Matrix32 &p_transform_b, _CollectorCallback2D *p_collector, const Vector2 &p_motion_a, const Vector2 &p_motion_b, float p_margin_A, float p_margin_B) {
- const SegmentShape2DSW *segment_A = static_cast<const SegmentShape2DSW*>(p_a);
- const CapsuleShape2DSW *capsule_B = static_cast<const CapsuleShape2DSW*>(p_b);
+ const SegmentShape2DSW *segment_A = static_cast<const SegmentShape2DSW *>(p_a);
+ const CapsuleShape2DSW *capsule_B = static_cast<const CapsuleShape2DSW *>(p_b);
- SeparatorAxisTest2D<SegmentShape2DSW,CapsuleShape2DSW,castA,castB,withMargin> separator(segment_A,p_transform_a,capsule_B,p_transform_b,p_collector,p_motion_a,p_motion_b,p_margin_A,p_margin_B);
+ SeparatorAxisTest2D<SegmentShape2DSW, CapsuleShape2DSW, castA, castB, withMargin> separator(segment_A, p_transform_a, capsule_B, p_transform_b, p_collector, p_motion_a, p_motion_b, p_margin_A, p_margin_B);
if (!separator.test_previous_axis())
return;
@@ -758,25 +718,25 @@ static void _collision_segment_capsule(const Shape2DSW* p_a,const Matrix32& p_tr
if (!separator.test_axis(p_transform_b.elements[0].normalized()))
return;
- if (TEST_POINT(p_transform_a.xform(segment_A->get_a()),(p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*0.5)))
+ if (TEST_POINT(p_transform_a.xform(segment_A->get_a()), (p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * 0.5)))
return;
- if (TEST_POINT(p_transform_a.xform(segment_A->get_a()),(p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*-0.5)))
+ if (TEST_POINT(p_transform_a.xform(segment_A->get_a()), (p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * -0.5)))
return;
- if (TEST_POINT(p_transform_a.xform(segment_A->get_b()),(p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*0.5)))
+ if (TEST_POINT(p_transform_a.xform(segment_A->get_b()), (p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * 0.5)))
return;
- if (TEST_POINT(p_transform_a.xform(segment_A->get_b()),(p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*-0.5)))
+ if (TEST_POINT(p_transform_a.xform(segment_A->get_b()), (p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * -0.5)))
return;
separator.generate_contacts();
}
-template<bool castA, bool castB,bool withMargin>
-static void _collision_segment_convex_polygon(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b,float p_margin_A,float p_margin_B) {
+template <bool castA, bool castB, bool withMargin>
+static void _collision_segment_convex_polygon(const Shape2DSW *p_a, const Matrix32 &p_transform_a, const Shape2DSW *p_b, const Matrix32 &p_transform_b, _CollectorCallback2D *p_collector, const Vector2 &p_motion_a, const Vector2 &p_motion_b, float p_margin_A, float p_margin_B) {
- const SegmentShape2DSW *segment_A = static_cast<const SegmentShape2DSW*>(p_a);
- const ConvexPolygonShape2DSW *convex_B = static_cast<const ConvexPolygonShape2DSW*>(p_b);
+ const SegmentShape2DSW *segment_A = static_cast<const SegmentShape2DSW *>(p_a);
+ const ConvexPolygonShape2DSW *convex_B = static_cast<const ConvexPolygonShape2DSW *>(p_b);
- SeparatorAxisTest2D<SegmentShape2DSW,ConvexPolygonShape2DSW,castA,castB,withMargin> separator(segment_A,p_transform_a,convex_B,p_transform_b,p_collector,p_motion_a,p_motion_b,p_margin_A,p_margin_B);
+ SeparatorAxisTest2D<SegmentShape2DSW, ConvexPolygonShape2DSW, castA, castB, withMargin> separator(segment_A, p_transform_a, convex_B, p_transform_b, p_collector, p_motion_a, p_motion_b, p_margin_A, p_margin_B);
if (!separator.test_previous_axis())
return;
@@ -787,37 +747,32 @@ static void _collision_segment_convex_polygon(const Shape2DSW* p_a,const Matrix3
if (!separator.test_axis(segment_A->get_xformed_normal(p_transform_a)))
return;
- for(int i=0;i<convex_B->get_point_count();i++) {
+ for (int i = 0; i < convex_B->get_point_count(); i++) {
- if (!separator.test_axis( convex_B->get_xformed_segment_normal(p_transform_b,i)))
+ if (!separator.test_axis(convex_B->get_xformed_segment_normal(p_transform_b, i)))
return;
if (withMargin) {
- if (TEST_POINT(p_transform_a.xform(segment_A->get_a()),p_transform_b.xform(convex_B->get_point(i) )))
+ if (TEST_POINT(p_transform_a.xform(segment_A->get_a()), p_transform_b.xform(convex_B->get_point(i))))
return;
- if (TEST_POINT(p_transform_a.xform(segment_A->get_b()),p_transform_b.xform(convex_B->get_point(i) )))
+ if (TEST_POINT(p_transform_a.xform(segment_A->get_b()), p_transform_b.xform(convex_B->get_point(i))))
return;
-
}
-
}
separator.generate_contacts();
-
}
-
/////////
-template<bool castA, bool castB,bool withMargin>
-static void _collision_circle_circle(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b,float p_margin_A,float p_margin_B) {
-
- const CircleShape2DSW *circle_A = static_cast<const CircleShape2DSW*>(p_a);
- const CircleShape2DSW *circle_B = static_cast<const CircleShape2DSW*>(p_b);
+template <bool castA, bool castB, bool withMargin>
+static void _collision_circle_circle(const Shape2DSW *p_a, const Matrix32 &p_transform_a, const Shape2DSW *p_b, const Matrix32 &p_transform_b, _CollectorCallback2D *p_collector, const Vector2 &p_motion_a, const Vector2 &p_motion_b, float p_margin_A, float p_margin_B) {
+ const CircleShape2DSW *circle_A = static_cast<const CircleShape2DSW *>(p_a);
+ const CircleShape2DSW *circle_B = static_cast<const CircleShape2DSW *>(p_b);
- SeparatorAxisTest2D<CircleShape2DSW,CircleShape2DSW,castA,castB,withMargin> separator(circle_A,p_transform_a,circle_B,p_transform_b,p_collector,p_motion_a,p_motion_b,p_margin_A,p_margin_B);
+ SeparatorAxisTest2D<CircleShape2DSW, CircleShape2DSW, castA, castB, withMargin> separator(circle_A, p_transform_a, circle_B, p_transform_b, p_collector, p_motion_a, p_motion_b, p_margin_A, p_margin_B);
if (!separator.test_previous_axis())
return;
@@ -825,22 +780,19 @@ static void _collision_circle_circle(const Shape2DSW* p_a,const Matrix32& p_tran
if (!separator.test_cast())
return;
- if (TEST_POINT(p_transform_a.get_origin(),p_transform_b.get_origin()))
+ if (TEST_POINT(p_transform_a.get_origin(), p_transform_b.get_origin()))
return;
-
separator.generate_contacts();
-
}
-template<bool castA, bool castB,bool withMargin>
-static void _collision_circle_rectangle(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b,float p_margin_A,float p_margin_B) {
-
- const CircleShape2DSW *circle_A = static_cast<const CircleShape2DSW*>(p_a);
- const RectangleShape2DSW *rectangle_B = static_cast<const RectangleShape2DSW*>(p_b);
+template <bool castA, bool castB, bool withMargin>
+static void _collision_circle_rectangle(const Shape2DSW *p_a, const Matrix32 &p_transform_a, const Shape2DSW *p_b, const Matrix32 &p_transform_b, _CollectorCallback2D *p_collector, const Vector2 &p_motion_a, const Vector2 &p_motion_b, float p_margin_A, float p_margin_B) {
+ const CircleShape2DSW *circle_A = static_cast<const CircleShape2DSW *>(p_a);
+ const RectangleShape2DSW *rectangle_B = static_cast<const RectangleShape2DSW *>(p_b);
- SeparatorAxisTest2D<CircleShape2DSW,RectangleShape2DSW,castA,castB,withMargin> separator(circle_A,p_transform_a,rectangle_B,p_transform_b,p_collector,p_motion_a,p_motion_b,p_margin_A,p_margin_B);
+ SeparatorAxisTest2D<CircleShape2DSW, RectangleShape2DSW, castA, castB, withMargin> separator(circle_A, p_transform_a, rectangle_B, p_transform_b, p_collector, p_motion_a, p_motion_b, p_margin_A, p_margin_B);
if (!separator.test_previous_axis())
return;
@@ -848,9 +800,9 @@ static void _collision_circle_rectangle(const Shape2DSW* p_a,const Matrix32& p_t
if (!separator.test_cast())
return;
- const Vector2 &sphere=p_transform_a.elements[2];
- const Vector2 *axis=&p_transform_b.elements[0];
-// const Vector2& half_extents = rectangle_B->get_half_extents();
+ const Vector2 &sphere = p_transform_a.elements[2];
+ const Vector2 *axis = &p_transform_b.elements[0];
+ // const Vector2& half_extents = rectangle_B->get_half_extents();
if (!separator.test_axis(axis[0].normalized()))
return;
@@ -861,42 +813,41 @@ static void _collision_circle_rectangle(const Shape2DSW* p_a,const Matrix32& p_t
Matrix32 binv = p_transform_b.affine_inverse();
{
- if (!separator.test_axis( rectangle_B->get_circle_axis(p_transform_b,binv,sphere ) ) )
+ if (!separator.test_axis(rectangle_B->get_circle_axis(p_transform_b, binv, sphere)))
return;
}
if (castA) {
Vector2 sphereofs = sphere + p_motion_a;
- if (!separator.test_axis( rectangle_B->get_circle_axis(p_transform_b,binv, sphereofs) ) )
+ if (!separator.test_axis(rectangle_B->get_circle_axis(p_transform_b, binv, sphereofs)))
return;
}
if (castB) {
Vector2 sphereofs = sphere - p_motion_b;
- if (!separator.test_axis( rectangle_B->get_circle_axis(p_transform_b,binv, sphereofs) ) )
+ if (!separator.test_axis(rectangle_B->get_circle_axis(p_transform_b, binv, sphereofs)))
return;
}
if (castA && castB) {
Vector2 sphereofs = sphere - p_motion_b + p_motion_a;
- if (!separator.test_axis( rectangle_B->get_circle_axis(p_transform_b,binv, sphereofs) ) )
+ if (!separator.test_axis(rectangle_B->get_circle_axis(p_transform_b, binv, sphereofs)))
return;
}
separator.generate_contacts();
}
-template<bool castA, bool castB,bool withMargin>
-static void _collision_circle_capsule(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b,float p_margin_A,float p_margin_B) {
-
- const CircleShape2DSW *circle_A = static_cast<const CircleShape2DSW*>(p_a);
- const CapsuleShape2DSW *capsule_B = static_cast<const CapsuleShape2DSW*>(p_b);
+template <bool castA, bool castB, bool withMargin>
+static void _collision_circle_capsule(const Shape2DSW *p_a, const Matrix32 &p_transform_a, const Shape2DSW *p_b, const Matrix32 &p_transform_b, _CollectorCallback2D *p_collector, const Vector2 &p_motion_a, const Vector2 &p_motion_b, float p_margin_A, float p_margin_B) {
+ const CircleShape2DSW *circle_A = static_cast<const CircleShape2DSW *>(p_a);
+ const CapsuleShape2DSW *capsule_B = static_cast<const CapsuleShape2DSW *>(p_b);
- SeparatorAxisTest2D<CircleShape2DSW,CapsuleShape2DSW,castA,castB,withMargin> separator(circle_A,p_transform_a,capsule_B,p_transform_b,p_collector,p_motion_a,p_motion_b,p_margin_A,p_margin_B);
+ SeparatorAxisTest2D<CircleShape2DSW, CapsuleShape2DSW, castA, castB, withMargin> separator(circle_A, p_transform_a, capsule_B, p_transform_b, p_collector, p_motion_a, p_motion_b, p_margin_A, p_margin_B);
if (!separator.test_previous_axis())
return;
@@ -909,24 +860,21 @@ static void _collision_circle_capsule(const Shape2DSW* p_a,const Matrix32& p_tra
return;
//capsule endpoints
- if (TEST_POINT(p_transform_a.get_origin(),(p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*0.5)))
+ if (TEST_POINT(p_transform_a.get_origin(), (p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * 0.5)))
return;
- if (TEST_POINT(p_transform_a.get_origin(),(p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*-0.5)))
+ if (TEST_POINT(p_transform_a.get_origin(), (p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * -0.5)))
return;
separator.generate_contacts();
-
-
}
-template<bool castA, bool castB,bool withMargin>
-static void _collision_circle_convex_polygon(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b,float p_margin_A,float p_margin_B) {
-
- const CircleShape2DSW *circle_A = static_cast<const CircleShape2DSW*>(p_a);
- const ConvexPolygonShape2DSW *convex_B = static_cast<const ConvexPolygonShape2DSW*>(p_b);
+template <bool castA, bool castB, bool withMargin>
+static void _collision_circle_convex_polygon(const Shape2DSW *p_a, const Matrix32 &p_transform_a, const Shape2DSW *p_b, const Matrix32 &p_transform_b, _CollectorCallback2D *p_collector, const Vector2 &p_motion_a, const Vector2 &p_motion_b, float p_margin_A, float p_margin_B) {
+ const CircleShape2DSW *circle_A = static_cast<const CircleShape2DSW *>(p_a);
+ const ConvexPolygonShape2DSW *convex_B = static_cast<const ConvexPolygonShape2DSW *>(p_b);
- SeparatorAxisTest2D<CircleShape2DSW,ConvexPolygonShape2DSW,castA,castB,withMargin> separator(circle_A,p_transform_a,convex_B,p_transform_b,p_collector,p_motion_a,p_motion_b,p_margin_A,p_margin_B);
+ SeparatorAxisTest2D<CircleShape2DSW, ConvexPolygonShape2DSW, castA, castB, withMargin> separator(circle_A, p_transform_a, convex_B, p_transform_b, p_collector, p_motion_a, p_motion_b, p_margin_A, p_margin_B);
if (!separator.test_previous_axis())
return;
@@ -934,31 +882,28 @@ static void _collision_circle_convex_polygon(const Shape2DSW* p_a,const Matrix32
if (!separator.test_cast())
return;
-
//poly faces and poly points vs circle
- for(int i=0;i<convex_B->get_point_count();i++) {
+ for (int i = 0; i < convex_B->get_point_count(); i++) {
- if (TEST_POINT( p_transform_a.get_origin(),p_transform_b.xform(convex_B->get_point(i)) ))
+ if (TEST_POINT(p_transform_a.get_origin(), p_transform_b.xform(convex_B->get_point(i))))
return;
- if (!separator.test_axis( convex_B->get_xformed_segment_normal(p_transform_b,i)))
+ if (!separator.test_axis(convex_B->get_xformed_segment_normal(p_transform_b, i)))
return;
}
separator.generate_contacts();
}
-
/////////
-template<bool castA, bool castB,bool withMargin>
-static void _collision_rectangle_rectangle(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b,float p_margin_A,float p_margin_B) {
+template <bool castA, bool castB, bool withMargin>
+static void _collision_rectangle_rectangle(const Shape2DSW *p_a, const Matrix32 &p_transform_a, const Shape2DSW *p_b, const Matrix32 &p_transform_b, _CollectorCallback2D *p_collector, const Vector2 &p_motion_a, const Vector2 &p_motion_b, float p_margin_A, float p_margin_B) {
- const RectangleShape2DSW *rectangle_A = static_cast<const RectangleShape2DSW*>(p_a);
- const RectangleShape2DSW *rectangle_B = static_cast<const RectangleShape2DSW*>(p_b);
+ const RectangleShape2DSW *rectangle_A = static_cast<const RectangleShape2DSW *>(p_a);
+ const RectangleShape2DSW *rectangle_B = static_cast<const RectangleShape2DSW *>(p_b);
-
- SeparatorAxisTest2D<RectangleShape2DSW,RectangleShape2DSW,castA,castB,withMargin> separator(rectangle_A,p_transform_a,rectangle_B,p_transform_b,p_collector,p_motion_a,p_motion_b,p_margin_A,p_margin_B);
+ SeparatorAxisTest2D<RectangleShape2DSW, RectangleShape2DSW, castA, castB, withMargin> separator(rectangle_A, p_transform_a, rectangle_B, p_transform_b, p_collector, p_motion_a, p_motion_b, p_margin_A, p_margin_B);
if (!separator.test_previous_axis())
return;
@@ -982,38 +927,38 @@ static void _collision_rectangle_rectangle(const Shape2DSW* p_a,const Matrix32&
if (withMargin) {
- Matrix32 invA=p_transform_a.affine_inverse();
- Matrix32 invB=p_transform_b.affine_inverse();
+ Matrix32 invA = p_transform_a.affine_inverse();
+ Matrix32 invB = p_transform_b.affine_inverse();
- if (!separator.test_axis( rectangle_A->get_box_axis(p_transform_a,invA,rectangle_B,p_transform_b,invB) ) )
+ if (!separator.test_axis(rectangle_A->get_box_axis(p_transform_a, invA, rectangle_B, p_transform_b, invB)))
return;
if (castA || castB) {
Matrix32 aofs = p_transform_a;
- aofs.elements[2]+=p_motion_a;
+ aofs.elements[2] += p_motion_a;
Matrix32 bofs = p_transform_b;
- bofs.elements[2]+=p_motion_b;
+ bofs.elements[2] += p_motion_b;
Matrix32 aofsinv = aofs.affine_inverse();
Matrix32 bofsinv = bofs.affine_inverse();
if (castA) {
- if (!separator.test_axis( rectangle_A->get_box_axis(aofs,aofsinv,rectangle_B,p_transform_b,invB) ) )
+ if (!separator.test_axis(rectangle_A->get_box_axis(aofs, aofsinv, rectangle_B, p_transform_b, invB)))
return;
}
if (castB) {
- if (!separator.test_axis( rectangle_A->get_box_axis(p_transform_a,invA,rectangle_B,bofs,bofsinv) ) )
+ if (!separator.test_axis(rectangle_A->get_box_axis(p_transform_a, invA, rectangle_B, bofs, bofsinv)))
return;
}
if (castA && castB) {
- if (!separator.test_axis( rectangle_A->get_box_axis(aofs,aofsinv,rectangle_B,bofs,bofsinv) ) )
+ if (!separator.test_axis(rectangle_A->get_box_axis(aofs, aofsinv, rectangle_B, bofs, bofsinv)))
return;
}
}
@@ -1022,14 +967,13 @@ static void _collision_rectangle_rectangle(const Shape2DSW* p_a,const Matrix32&
separator.generate_contacts();
}
-template<bool castA, bool castB,bool withMargin>
-static void _collision_rectangle_capsule(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b,float p_margin_A,float p_margin_B) {
-
- const RectangleShape2DSW *rectangle_A = static_cast<const RectangleShape2DSW*>(p_a);
- const CapsuleShape2DSW *capsule_B = static_cast<const CapsuleShape2DSW*>(p_b);
+template <bool castA, bool castB, bool withMargin>
+static void _collision_rectangle_capsule(const Shape2DSW *p_a, const Matrix32 &p_transform_a, const Shape2DSW *p_b, const Matrix32 &p_transform_b, _CollectorCallback2D *p_collector, const Vector2 &p_motion_a, const Vector2 &p_motion_b, float p_margin_A, float p_margin_B) {
+ const RectangleShape2DSW *rectangle_A = static_cast<const RectangleShape2DSW *>(p_a);
+ const CapsuleShape2DSW *capsule_B = static_cast<const CapsuleShape2DSW *>(p_b);
- SeparatorAxisTest2D<RectangleShape2DSW,CapsuleShape2DSW,castA,castB,withMargin> separator(rectangle_A,p_transform_a,capsule_B,p_transform_b,p_collector,p_motion_a,p_motion_b,p_margin_A,p_margin_B);
+ SeparatorAxisTest2D<RectangleShape2DSW, CapsuleShape2DSW, castA, castB, withMargin> separator(rectangle_A, p_transform_a, capsule_B, p_transform_b, p_collector, p_motion_a, p_motion_b, p_margin_A, p_margin_B);
if (!separator.test_previous_axis())
return;
@@ -1048,61 +992,55 @@ static void _collision_rectangle_capsule(const Shape2DSW* p_a,const Matrix32& p_
if (!separator.test_axis(p_transform_b.elements[0].normalized()))
return;
-
//box endpoints to capsule circles
Matrix32 boxinv = p_transform_a.affine_inverse();
- for(int i=0;i<2;i++) {
+ for (int i = 0; i < 2; i++) {
{
- Vector2 capsule_endpoint = p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*(i==0?0.5:-0.5);
+ Vector2 capsule_endpoint = p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * (i == 0 ? 0.5 : -0.5);
- if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a,boxinv,capsule_endpoint)))
+ if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a, boxinv, capsule_endpoint)))
return;
}
-
if (castA) {
- Vector2 capsule_endpoint = p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*(i==0?0.5:-0.5);
- capsule_endpoint-=p_motion_a;
+ Vector2 capsule_endpoint = p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * (i == 0 ? 0.5 : -0.5);
+ capsule_endpoint -= p_motion_a;
- if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a,boxinv,capsule_endpoint)))
+ if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a, boxinv, capsule_endpoint)))
return;
}
if (castB) {
- Vector2 capsule_endpoint = p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*(i==0?0.5:-0.5);
- capsule_endpoint+=p_motion_b;
+ Vector2 capsule_endpoint = p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * (i == 0 ? 0.5 : -0.5);
+ capsule_endpoint += p_motion_b;
- if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a,boxinv,capsule_endpoint)))
+ if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a, boxinv, capsule_endpoint)))
return;
}
if (castA && castB) {
- Vector2 capsule_endpoint = p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*(i==0?0.5:-0.5);
- capsule_endpoint-=p_motion_a;
- capsule_endpoint+=p_motion_b;
-
+ Vector2 capsule_endpoint = p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * (i == 0 ? 0.5 : -0.5);
+ capsule_endpoint -= p_motion_a;
+ capsule_endpoint += p_motion_b;
- if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a,boxinv,capsule_endpoint)))
+ if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a, boxinv, capsule_endpoint)))
return;
}
-
}
-
separator.generate_contacts();
}
-template<bool castA, bool castB,bool withMargin>
-static void _collision_rectangle_convex_polygon(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b,float p_margin_A,float p_margin_B) {
-
- const RectangleShape2DSW *rectangle_A = static_cast<const RectangleShape2DSW*>(p_a);
- const ConvexPolygonShape2DSW *convex_B = static_cast<const ConvexPolygonShape2DSW*>(p_b);
+template <bool castA, bool castB, bool withMargin>
+static void _collision_rectangle_convex_polygon(const Shape2DSW *p_a, const Matrix32 &p_transform_a, const Shape2DSW *p_b, const Matrix32 &p_transform_b, _CollectorCallback2D *p_collector, const Vector2 &p_motion_a, const Vector2 &p_motion_b, float p_margin_A, float p_margin_B) {
- SeparatorAxisTest2D<RectangleShape2DSW,ConvexPolygonShape2DSW,castA,castB,withMargin> separator(rectangle_A,p_transform_a,convex_B,p_transform_b,p_collector,p_motion_a,p_motion_b,p_margin_A,p_margin_B);
+ const RectangleShape2DSW *rectangle_A = static_cast<const RectangleShape2DSW *>(p_a);
+ const ConvexPolygonShape2DSW *convex_B = static_cast<const ConvexPolygonShape2DSW *>(p_b);
+ SeparatorAxisTest2D<RectangleShape2DSW, ConvexPolygonShape2DSW, castA, castB, withMargin> separator(rectangle_A, p_transform_a, convex_B, p_transform_b, p_collector, p_motion_a, p_motion_b, p_margin_A, p_margin_B);
if (!separator.test_previous_axis())
return;
@@ -1120,51 +1058,47 @@ static void _collision_rectangle_convex_polygon(const Shape2DSW* p_a,const Matri
//convex faces
Matrix32 boxinv;
if (withMargin) {
- boxinv=p_transform_a.affine_inverse();
+ boxinv = p_transform_a.affine_inverse();
}
- for(int i=0;i<convex_B->get_point_count();i++) {
+ for (int i = 0; i < convex_B->get_point_count(); i++) {
- if (!separator.test_axis( convex_B->get_xformed_segment_normal(p_transform_b,i)))
+ if (!separator.test_axis(convex_B->get_xformed_segment_normal(p_transform_b, i)))
return;
if (withMargin) {
//all points vs all points need to be tested if margin exist
- if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a,boxinv,p_transform_b.xform(convex_B->get_point(i)))))
+ if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a, boxinv, p_transform_b.xform(convex_B->get_point(i)))))
return;
if (castA) {
- if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a,boxinv,p_transform_b.xform(convex_B->get_point(i))-p_motion_a)))
+ if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a, boxinv, p_transform_b.xform(convex_B->get_point(i)) - p_motion_a)))
return;
}
if (castB) {
- if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a,boxinv,p_transform_b.xform(convex_B->get_point(i))+p_motion_b)))
+ if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a, boxinv, p_transform_b.xform(convex_B->get_point(i)) + p_motion_b)))
return;
}
if (castA && castB) {
- if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a,boxinv,p_transform_b.xform(convex_B->get_point(i))+p_motion_b-p_motion_a)))
+ if (!separator.test_axis(rectangle_A->get_circle_axis(p_transform_a, boxinv, p_transform_b.xform(convex_B->get_point(i)) + p_motion_b - p_motion_a)))
return;
}
-
}
}
separator.generate_contacts();
-
}
-
/////////
-template<bool castA, bool castB,bool withMargin>
-static void _collision_capsule_capsule(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b,float p_margin_A,float p_margin_B) {
+template <bool castA, bool castB, bool withMargin>
+static void _collision_capsule_capsule(const Shape2DSW *p_a, const Matrix32 &p_transform_a, const Shape2DSW *p_b, const Matrix32 &p_transform_b, _CollectorCallback2D *p_collector, const Vector2 &p_motion_a, const Vector2 &p_motion_b, float p_margin_A, float p_margin_B) {
- const CapsuleShape2DSW *capsule_A = static_cast<const CapsuleShape2DSW*>(p_a);
- const CapsuleShape2DSW *capsule_B = static_cast<const CapsuleShape2DSW*>(p_b);
+ const CapsuleShape2DSW *capsule_A = static_cast<const CapsuleShape2DSW *>(p_a);
+ const CapsuleShape2DSW *capsule_B = static_cast<const CapsuleShape2DSW *>(p_b);
-
- SeparatorAxisTest2D<CapsuleShape2DSW,CapsuleShape2DSW,castA,castB,withMargin> separator(capsule_A,p_transform_a,capsule_B,p_transform_b,p_collector,p_motion_a,p_motion_b,p_margin_A,p_margin_B);
+ SeparatorAxisTest2D<CapsuleShape2DSW, CapsuleShape2DSW, castA, castB, withMargin> separator(capsule_A, p_transform_a, capsule_B, p_transform_b, p_collector, p_motion_a, p_motion_b, p_margin_A, p_margin_B);
if (!separator.test_previous_axis())
return;
@@ -1182,32 +1116,29 @@ static void _collision_capsule_capsule(const Shape2DSW* p_a,const Matrix32& p_tr
//capsule endpoints
- for(int i=0;i<2;i++) {
+ for (int i = 0; i < 2; i++) {
- Vector2 capsule_endpoint_A = p_transform_a.get_origin()+p_transform_a.elements[1]*capsule_A->get_height()*(i==0?0.5:-0.5);
+ Vector2 capsule_endpoint_A = p_transform_a.get_origin() + p_transform_a.elements[1] * capsule_A->get_height() * (i == 0 ? 0.5 : -0.5);
- for(int j=0;j<2;j++) {
+ for (int j = 0; j < 2; j++) {
- Vector2 capsule_endpoint_B = p_transform_b.get_origin()+p_transform_b.elements[1]*capsule_B->get_height()*(j==0?0.5:-0.5);
+ Vector2 capsule_endpoint_B = p_transform_b.get_origin() + p_transform_b.elements[1] * capsule_B->get_height() * (j == 0 ? 0.5 : -0.5);
- if (TEST_POINT(capsule_endpoint_A,capsule_endpoint_B) )
+ if (TEST_POINT(capsule_endpoint_A, capsule_endpoint_B))
return;
-
}
}
separator.generate_contacts();
-
}
-template<bool castA, bool castB,bool withMargin>
-static void _collision_capsule_convex_polygon(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b,float p_margin_A,float p_margin_B) {
+template <bool castA, bool castB, bool withMargin>
+static void _collision_capsule_convex_polygon(const Shape2DSW *p_a, const Matrix32 &p_transform_a, const Shape2DSW *p_b, const Matrix32 &p_transform_b, _CollectorCallback2D *p_collector, const Vector2 &p_motion_a, const Vector2 &p_motion_b, float p_margin_A, float p_margin_B) {
- const CapsuleShape2DSW *capsule_A = static_cast<const CapsuleShape2DSW*>(p_a);
- const ConvexPolygonShape2DSW *convex_B = static_cast<const ConvexPolygonShape2DSW*>(p_b);
+ const CapsuleShape2DSW *capsule_A = static_cast<const CapsuleShape2DSW *>(p_a);
+ const ConvexPolygonShape2DSW *convex_B = static_cast<const ConvexPolygonShape2DSW *>(p_b);
-
- SeparatorAxisTest2D<CapsuleShape2DSW,ConvexPolygonShape2DSW,castA,castB,withMargin> separator(capsule_A,p_transform_a,convex_B,p_transform_b,p_collector,p_motion_a,p_motion_b,p_margin_A,p_margin_B);
+ SeparatorAxisTest2D<CapsuleShape2DSW, ConvexPolygonShape2DSW, castA, castB, withMargin> separator(capsule_A, p_transform_a, convex_B, p_transform_b, p_collector, p_motion_a, p_motion_b, p_margin_A, p_margin_B);
if (!separator.test_previous_axis())
return;
@@ -1220,40 +1151,35 @@ static void _collision_capsule_convex_polygon(const Shape2DSW* p_a,const Matrix3
if (!separator.test_axis(p_transform_a.elements[0].normalized()))
return;
-
//poly vs capsule
- for(int i=0;i<convex_B->get_point_count();i++) {
+ for (int i = 0; i < convex_B->get_point_count(); i++) {
Vector2 cpoint = p_transform_b.xform(convex_B->get_point(i));
- for(int j=0;j<2;j++) {
+ for (int j = 0; j < 2; j++) {
- Vector2 capsule_endpoint_A = p_transform_a.get_origin()+p_transform_a.elements[1]*capsule_A->get_height()*(j==0?0.5:-0.5);
+ Vector2 capsule_endpoint_A = p_transform_a.get_origin() + p_transform_a.elements[1] * capsule_A->get_height() * (j == 0 ? 0.5 : -0.5);
- if (TEST_POINT(capsule_endpoint_A,cpoint ))
+ if (TEST_POINT(capsule_endpoint_A, cpoint))
return;
-
}
- if (!separator.test_axis( convex_B->get_xformed_segment_normal(p_transform_b,i)))
+ if (!separator.test_axis(convex_B->get_xformed_segment_normal(p_transform_b, i)))
return;
}
separator.generate_contacts();
}
-
/////////
+template <bool castA, bool castB, bool withMargin>
+static void _collision_convex_polygon_convex_polygon(const Shape2DSW *p_a, const Matrix32 &p_transform_a, const Shape2DSW *p_b, const Matrix32 &p_transform_b, _CollectorCallback2D *p_collector, const Vector2 &p_motion_a, const Vector2 &p_motion_b, float p_margin_A, float p_margin_B) {
-template<bool castA, bool castB,bool withMargin>
-static void _collision_convex_polygon_convex_polygon(const Shape2DSW* p_a,const Matrix32& p_transform_a,const Shape2DSW* p_b,const Matrix32& p_transform_b,_CollectorCallback2D *p_collector,const Vector2& p_motion_a,const Vector2& p_motion_b,float p_margin_A,float p_margin_B) {
-
-
- const ConvexPolygonShape2DSW *convex_A = static_cast<const ConvexPolygonShape2DSW*>(p_a);
- const ConvexPolygonShape2DSW *convex_B = static_cast<const ConvexPolygonShape2DSW*>(p_b);
+ const ConvexPolygonShape2DSW *convex_A = static_cast<const ConvexPolygonShape2DSW *>(p_a);
+ const ConvexPolygonShape2DSW *convex_B = static_cast<const ConvexPolygonShape2DSW *>(p_b);
- SeparatorAxisTest2D<ConvexPolygonShape2DSW,ConvexPolygonShape2DSW,castA,castB,withMargin> separator(convex_A,p_transform_a,convex_B,p_transform_b,p_collector,p_motion_a,p_motion_b,p_margin_A,p_margin_B);
+ SeparatorAxisTest2D<ConvexPolygonShape2DSW, ConvexPolygonShape2DSW, castA, castB, withMargin> separator(convex_A, p_transform_a, convex_B, p_transform_b, p_collector, p_motion_a, p_motion_b, p_margin_A, p_margin_B);
if (!separator.test_previous_axis())
return;
@@ -1261,345 +1187,332 @@ static void _collision_convex_polygon_convex_polygon(const Shape2DSW* p_a,const
if (!separator.test_cast())
return;
+ for (int i = 0; i < convex_A->get_point_count(); i++) {
- for(int i=0;i<convex_A->get_point_count();i++) {
-
- if (!separator.test_axis( convex_A->get_xformed_segment_normal(p_transform_a,i)))
+ if (!separator.test_axis(convex_A->get_xformed_segment_normal(p_transform_a, i)))
return;
}
- for(int i=0;i<convex_B->get_point_count();i++) {
+ for (int i = 0; i < convex_B->get_point_count(); i++) {
- if (!separator.test_axis( convex_B->get_xformed_segment_normal(p_transform_b,i)))
+ if (!separator.test_axis(convex_B->get_xformed_segment_normal(p_transform_b, i)))
return;
-
}
if (withMargin) {
- for(int i=0;i<convex_A->get_point_count();i++) {
- for(int j=0;j<convex_B->get_point_count();j++) {
+ for (int i = 0; i < convex_A->get_point_count(); i++) {
+ for (int j = 0; j < convex_B->get_point_count(); j++) {
- if (TEST_POINT(p_transform_a.xform(convex_A->get_point(i)) , p_transform_b.xform(convex_B->get_point(j))))
+ if (TEST_POINT(p_transform_a.xform(convex_A->get_point(i)), p_transform_b.xform(convex_B->get_point(j))))
return;
}
}
-
}
separator.generate_contacts();
-
}
-
////////
-bool sat_2d_calculate_penetration(const Shape2DSW *p_shape_A, const Matrix32& p_transform_A, const Vector2& p_motion_A, const Shape2DSW *p_shape_B, const Matrix32& p_transform_B,const Vector2& p_motion_B, CollisionSolver2DSW::CallbackResult p_result_callback,void *p_userdata, bool p_swap,Vector2 *sep_axis,float p_margin_A,float p_margin_B) {
+bool sat_2d_calculate_penetration(const Shape2DSW *p_shape_A, const Matrix32 &p_transform_A, const Vector2 &p_motion_A, const Shape2DSW *p_shape_B, const Matrix32 &p_transform_B, const Vector2 &p_motion_B, CollisionSolver2DSW::CallbackResult p_result_callback, void *p_userdata, bool p_swap, Vector2 *sep_axis, float p_margin_A, float p_margin_B) {
- Physics2DServer::ShapeType type_A=p_shape_A->get_type();
+ Physics2DServer::ShapeType type_A = p_shape_A->get_type();
- ERR_FAIL_COND_V(type_A==Physics2DServer::SHAPE_LINE,false);
+ ERR_FAIL_COND_V(type_A == Physics2DServer::SHAPE_LINE, false);
//ERR_FAIL_COND_V(type_A==Physics2DServer::SHAPE_RAY,false);
- ERR_FAIL_COND_V(p_shape_A->is_concave(),false);
+ ERR_FAIL_COND_V(p_shape_A->is_concave(), false);
- Physics2DServer::ShapeType type_B=p_shape_B->get_type();
+ Physics2DServer::ShapeType type_B = p_shape_B->get_type();
- ERR_FAIL_COND_V(type_B==Physics2DServer::SHAPE_LINE,false);
+ ERR_FAIL_COND_V(type_B == Physics2DServer::SHAPE_LINE, false);
//ERR_FAIL_COND_V(type_B==Physics2DServer::SHAPE_RAY,false);
- ERR_FAIL_COND_V(p_shape_B->is_concave(),false);
+ ERR_FAIL_COND_V(p_shape_B->is_concave(), false);
-
- static const CollisionFunc collision_table[5][5]={
- {_collision_segment_segment<false,false,false>,
- _collision_segment_circle<false,false,false>,
- _collision_segment_rectangle<false,false,false>,
- _collision_segment_capsule<false,false,false>,
- _collision_segment_convex_polygon<false,false,false>},
- {0,
- _collision_circle_circle<false,false,false>,
- _collision_circle_rectangle<false,false,false>,
- _collision_circle_capsule<false,false,false>,
- _collision_circle_convex_polygon<false,false,false>},
- {0,
- 0,
- _collision_rectangle_rectangle<false,false,false>,
- _collision_rectangle_capsule<false,false,false>,
- _collision_rectangle_convex_polygon<false,false,false>},
- {0,
- 0,
- 0,
- _collision_capsule_capsule<false,false,false>,
- _collision_capsule_convex_polygon<false,false,false>},
- {0,
- 0,
- 0,
- 0,
- _collision_convex_polygon_convex_polygon<false,false,false>}
+ static const CollisionFunc collision_table[5][5] = {
+ { _collision_segment_segment<false, false, false>,
+ _collision_segment_circle<false, false, false>,
+ _collision_segment_rectangle<false, false, false>,
+ _collision_segment_capsule<false, false, false>,
+ _collision_segment_convex_polygon<false, false, false> },
+ { 0,
+ _collision_circle_circle<false, false, false>,
+ _collision_circle_rectangle<false, false, false>,
+ _collision_circle_capsule<false, false, false>,
+ _collision_circle_convex_polygon<false, false, false> },
+ { 0,
+ 0,
+ _collision_rectangle_rectangle<false, false, false>,
+ _collision_rectangle_capsule<false, false, false>,
+ _collision_rectangle_convex_polygon<false, false, false> },
+ { 0,
+ 0,
+ 0,
+ _collision_capsule_capsule<false, false, false>,
+ _collision_capsule_convex_polygon<false, false, false> },
+ { 0,
+ 0,
+ 0,
+ 0,
+ _collision_convex_polygon_convex_polygon<false, false, false> }
};
- static const CollisionFunc collision_table_castA[5][5]={
- {_collision_segment_segment<true,false,false>,
- _collision_segment_circle<true,false,false>,
- _collision_segment_rectangle<true,false,false>,
- _collision_segment_capsule<true,false,false>,
- _collision_segment_convex_polygon<true,false,false>},
- {0,
- _collision_circle_circle<true,false,false>,
- _collision_circle_rectangle<true,false,false>,
- _collision_circle_capsule<true,false,false>,
- _collision_circle_convex_polygon<true,false,false>},
- {0,
- 0,
- _collision_rectangle_rectangle<true,false,false>,
- _collision_rectangle_capsule<true,false,false>,
- _collision_rectangle_convex_polygon<true,false,false>},
- {0,
- 0,
- 0,
- _collision_capsule_capsule<true,false,false>,
- _collision_capsule_convex_polygon<true,false,false>},
- {0,
- 0,
- 0,
- 0,
- _collision_convex_polygon_convex_polygon<true,false,false>}
+ static const CollisionFunc collision_table_castA[5][5] = {
+ { _collision_segment_segment<true, false, false>,
+ _collision_segment_circle<true, false, false>,
+ _collision_segment_rectangle<true, false, false>,
+ _collision_segment_capsule<true, false, false>,
+ _collision_segment_convex_polygon<true, false, false> },
+ { 0,
+ _collision_circle_circle<true, false, false>,
+ _collision_circle_rectangle<true, false, false>,
+ _collision_circle_capsule<true, false, false>,
+ _collision_circle_convex_polygon<true, false, false> },
+ { 0,
+ 0,
+ _collision_rectangle_rectangle<true, false, false>,
+ _collision_rectangle_capsule<true, false, false>,
+ _collision_rectangle_convex_polygon<true, false, false> },
+ { 0,
+ 0,
+ 0,
+ _collision_capsule_capsule<true, false, false>,
+ _collision_capsule_convex_polygon<true, false, false> },
+ { 0,
+ 0,
+ 0,
+ 0,
+ _collision_convex_polygon_convex_polygon<true, false, false> }
};
- static const CollisionFunc collision_table_castB[5][5]={
- {_collision_segment_segment<false,true,false>,
- _collision_segment_circle<false,true,false>,
- _collision_segment_rectangle<false,true,false>,
- _collision_segment_capsule<false,true,false>,
- _collision_segment_convex_polygon<false,true,false>},
- {0,
- _collision_circle_circle<false,true,false>,
- _collision_circle_rectangle<false,true,false>,
- _collision_circle_capsule<false,true,false>,
- _collision_circle_convex_polygon<false,true,false>},
- {0,
- 0,
- _collision_rectangle_rectangle<false,true,false>,
- _collision_rectangle_capsule<false,true,false>,
- _collision_rectangle_convex_polygon<false,true,false>},
- {0,
- 0,
- 0,
- _collision_capsule_capsule<false,true,false>,
- _collision_capsule_convex_polygon<false,true,false>},
- {0,
- 0,
- 0,
- 0,
- _collision_convex_polygon_convex_polygon<false,true,false>}
+ static const CollisionFunc collision_table_castB[5][5] = {
+ { _collision_segment_segment<false, true, false>,
+ _collision_segment_circle<false, true, false>,
+ _collision_segment_rectangle<false, true, false>,
+ _collision_segment_capsule<false, true, false>,
+ _collision_segment_convex_polygon<false, true, false> },
+ { 0,
+ _collision_circle_circle<false, true, false>,
+ _collision_circle_rectangle<false, true, false>,
+ _collision_circle_capsule<false, true, false>,
+ _collision_circle_convex_polygon<false, true, false> },
+ { 0,
+ 0,
+ _collision_rectangle_rectangle<false, true, false>,
+ _collision_rectangle_capsule<false, true, false>,
+ _collision_rectangle_convex_polygon<false, true, false> },
+ { 0,
+ 0,
+ 0,
+ _collision_capsule_capsule<false, true, false>,
+ _collision_capsule_convex_polygon<false, true, false> },
+ { 0,
+ 0,
+ 0,
+ 0,
+ _collision_convex_polygon_convex_polygon<false, true, false> }
};
- static const CollisionFunc collision_table_castA_castB[5][5]={
- {_collision_segment_segment<true,true,false>,
- _collision_segment_circle<true,true,false>,
- _collision_segment_rectangle<true,true,false>,
- _collision_segment_capsule<true,true,false>,
- _collision_segment_convex_polygon<true,true,false>},
- {0,
- _collision_circle_circle<true,true,false>,
- _collision_circle_rectangle<true,true,false>,
- _collision_circle_capsule<true,true,false>,
- _collision_circle_convex_polygon<true,true,false>},
- {0,
- 0,
- _collision_rectangle_rectangle<true,true,false>,
- _collision_rectangle_capsule<true,true,false>,
- _collision_rectangle_convex_polygon<true,true,false>},
- {0,
- 0,
- 0,
- _collision_capsule_capsule<true,true,false>,
- _collision_capsule_convex_polygon<true,true,false>},
- {0,
- 0,
- 0,
- 0,
- _collision_convex_polygon_convex_polygon<true,true,false>}
+ static const CollisionFunc collision_table_castA_castB[5][5] = {
+ { _collision_segment_segment<true, true, false>,
+ _collision_segment_circle<true, true, false>,
+ _collision_segment_rectangle<true, true, false>,
+ _collision_segment_capsule<true, true, false>,
+ _collision_segment_convex_polygon<true, true, false> },
+ { 0,
+ _collision_circle_circle<true, true, false>,
+ _collision_circle_rectangle<true, true, false>,
+ _collision_circle_capsule<true, true, false>,
+ _collision_circle_convex_polygon<true, true, false> },
+ { 0,
+ 0,
+ _collision_rectangle_rectangle<true, true, false>,
+ _collision_rectangle_capsule<true, true, false>,
+ _collision_rectangle_convex_polygon<true, true, false> },
+ { 0,
+ 0,
+ 0,
+ _collision_capsule_capsule<true, true, false>,
+ _collision_capsule_convex_polygon<true, true, false> },
+ { 0,
+ 0,
+ 0,
+ 0,
+ _collision_convex_polygon_convex_polygon<true, true, false> }
};
- static const CollisionFunc collision_table_margin[5][5]={
- {_collision_segment_segment<false,false,true>,
- _collision_segment_circle<false,false,true>,
- _collision_segment_rectangle<false,false,true>,
- _collision_segment_capsule<false,false,true>,
- _collision_segment_convex_polygon<false,false,true>},
- {0,
- _collision_circle_circle<false,false,true>,
- _collision_circle_rectangle<false,false,true>,
- _collision_circle_capsule<false,false,true>,
- _collision_circle_convex_polygon<false,false,true>},
- {0,
- 0,
- _collision_rectangle_rectangle<false,false,true>,
- _collision_rectangle_capsule<false,false,true>,
- _collision_rectangle_convex_polygon<false,false,true>},
- {0,
- 0,
- 0,
- _collision_capsule_capsule<false,false,true>,
- _collision_capsule_convex_polygon<false,false,true>},
- {0,
- 0,
- 0,
- 0,
- _collision_convex_polygon_convex_polygon<false,false,true>}
+ static const CollisionFunc collision_table_margin[5][5] = {
+ { _collision_segment_segment<false, false, true>,
+ _collision_segment_circle<false, false, true>,
+ _collision_segment_rectangle<false, false, true>,
+ _collision_segment_capsule<false, false, true>,
+ _collision_segment_convex_polygon<false, false, true> },
+ { 0,
+ _collision_circle_circle<false, false, true>,
+ _collision_circle_rectangle<false, false, true>,
+ _collision_circle_capsule<false, false, true>,
+ _collision_circle_convex_polygon<false, false, true> },
+ { 0,
+ 0,
+ _collision_rectangle_rectangle<false, false, true>,
+ _collision_rectangle_capsule<false, false, true>,
+ _collision_rectangle_convex_polygon<false, false, true> },
+ { 0,
+ 0,
+ 0,
+ _collision_capsule_capsule<false, false, true>,
+ _collision_capsule_convex_polygon<false, false, true> },
+ { 0,
+ 0,
+ 0,
+ 0,
+ _collision_convex_polygon_convex_polygon<false, false, true> }
};
- static const CollisionFunc collision_table_castA_margin[5][5]={
- {_collision_segment_segment<true,false,true>,
- _collision_segment_circle<true,false,true>,
- _collision_segment_rectangle<true,false,true>,
- _collision_segment_capsule<true,false,true>,
- _collision_segment_convex_polygon<true,false,true>},
- {0,
- _collision_circle_circle<true,false,true>,
- _collision_circle_rectangle<true,false,true>,
- _collision_circle_capsule<true,false,true>,
- _collision_circle_convex_polygon<true,false,true>},
- {0,
- 0,
- _collision_rectangle_rectangle<true,false,true>,
- _collision_rectangle_capsule<true,false,true>,
- _collision_rectangle_convex_polygon<true,false,true>},
- {0,
- 0,
- 0,
- _collision_capsule_capsule<true,false,true>,
- _collision_capsule_convex_polygon<true,false,true>},
- {0,
- 0,
- 0,
- 0,
- _collision_convex_polygon_convex_polygon<true,false,true>}
+ static const CollisionFunc collision_table_castA_margin[5][5] = {
+ { _collision_segment_segment<true, false, true>,
+ _collision_segment_circle<true, false, true>,
+ _collision_segment_rectangle<true, false, true>,
+ _collision_segment_capsule<true, false, true>,
+ _collision_segment_convex_polygon<true, false, true> },
+ { 0,
+ _collision_circle_circle<true, false, true>,
+ _collision_circle_rectangle<true, false, true>,
+ _collision_circle_capsule<true, false, true>,
+ _collision_circle_convex_polygon<true, false, true> },
+ { 0,
+ 0,
+ _collision_rectangle_rectangle<true, false, true>,
+ _collision_rectangle_capsule<true, false, true>,
+ _collision_rectangle_convex_polygon<true, false, true> },
+ { 0,
+ 0,
+ 0,
+ _collision_capsule_capsule<true, false, true>,
+ _collision_capsule_convex_polygon<true, false, true> },
+ { 0,
+ 0,
+ 0,
+ 0,
+ _collision_convex_polygon_convex_polygon<true, false, true> }
};
- static const CollisionFunc collision_table_castB_margin[5][5]={
- {_collision_segment_segment<false,true,true>,
- _collision_segment_circle<false,true,true>,
- _collision_segment_rectangle<false,true,true>,
- _collision_segment_capsule<false,true,true>,
- _collision_segment_convex_polygon<false,true,true>},
- {0,
- _collision_circle_circle<false,true,true>,
- _collision_circle_rectangle<false,true,true>,
- _collision_circle_capsule<false,true,true>,
- _collision_circle_convex_polygon<false,true,true>},
- {0,
- 0,
- _collision_rectangle_rectangle<false,true,true>,
- _collision_rectangle_capsule<false,true,true>,
- _collision_rectangle_convex_polygon<false,true,true>},
- {0,
- 0,
- 0,
- _collision_capsule_capsule<false,true,true>,
- _collision_capsule_convex_polygon<false,true,true>},
- {0,
- 0,
- 0,
- 0,
- _collision_convex_polygon_convex_polygon<false,true,true>}
+ static const CollisionFunc collision_table_castB_margin[5][5] = {
+ { _collision_segment_segment<false, true, true>,
+ _collision_segment_circle<false, true, true>,
+ _collision_segment_rectangle<false, true, true>,
+ _collision_segment_capsule<false, true, true>,
+ _collision_segment_convex_polygon<false, true, true> },
+ { 0,
+ _collision_circle_circle<false, true, true>,
+ _collision_circle_rectangle<false, true, true>,
+ _collision_circle_capsule<false, true, true>,
+ _collision_circle_convex_polygon<false, true, true> },
+ { 0,
+ 0,
+ _collision_rectangle_rectangle<false, true, true>,
+ _collision_rectangle_capsule<false, true, true>,
+ _collision_rectangle_convex_polygon<false, true, true> },
+ { 0,
+ 0,
+ 0,
+ _collision_capsule_capsule<false, true, true>,
+ _collision_capsule_convex_polygon<false, true, true> },
+ { 0,
+ 0,
+ 0,
+ 0,
+ _collision_convex_polygon_convex_polygon<false, true, true> }
};
- static const CollisionFunc collision_table_castA_castB_margin[5][5]={
- {_collision_segment_segment<true,true,true>,
- _collision_segment_circle<true,true,true>,
- _collision_segment_rectangle<true,true,true>,
- _collision_segment_capsule<true,true,true>,
- _collision_segment_convex_polygon<true,true,true>},
- {0,
- _collision_circle_circle<true,true,true>,
- _collision_circle_rectangle<true,true,true>,
- _collision_circle_capsule<true,true,true>,
- _collision_circle_convex_polygon<true,true,true>},
- {0,
- 0,
- _collision_rectangle_rectangle<true,true,true>,
- _collision_rectangle_capsule<true,true,true>,
- _collision_rectangle_convex_polygon<true,true,true>},
- {0,
- 0,
- 0,
- _collision_capsule_capsule<true,true,true>,
- _collision_capsule_convex_polygon<true,true,true>},
- {0,
- 0,
- 0,
- 0,
- _collision_convex_polygon_convex_polygon<true,true,true>}
+ static const CollisionFunc collision_table_castA_castB_margin[5][5] = {
+ { _collision_segment_segment<true, true, true>,
+ _collision_segment_circle<true, true, true>,
+ _collision_segment_rectangle<true, true, true>,
+ _collision_segment_capsule<true, true, true>,
+ _collision_segment_convex_polygon<true, true, true> },
+ { 0,
+ _collision_circle_circle<true, true, true>,
+ _collision_circle_rectangle<true, true, true>,
+ _collision_circle_capsule<true, true, true>,
+ _collision_circle_convex_polygon<true, true, true> },
+ { 0,
+ 0,
+ _collision_rectangle_rectangle<true, true, true>,
+ _collision_rectangle_capsule<true, true, true>,
+ _collision_rectangle_convex_polygon<true, true, true> },
+ { 0,
+ 0,
+ 0,
+ _collision_capsule_capsule<true, true, true>,
+ _collision_capsule_convex_polygon<true, true, true> },
+ { 0,
+ 0,
+ 0,
+ 0,
+ _collision_convex_polygon_convex_polygon<true, true, true> }
};
-
_CollectorCallback2D callback;
- callback.callback=p_result_callback;
- callback.swap=p_swap;
- callback.userdata=p_userdata;
- callback.collided=false;
- callback.sep_axis=sep_axis;
+ callback.callback = p_result_callback;
+ callback.swap = p_swap;
+ callback.userdata = p_userdata;
+ callback.collided = false;
+ callback.sep_axis = sep_axis;
- const Shape2DSW *A=p_shape_A;
- const Shape2DSW *B=p_shape_B;
- const Matrix32 *transform_A=&p_transform_A;
- const Matrix32 *transform_B=&p_transform_B;
- const Vector2 *motion_A=&p_motion_A;
- const Vector2 *motion_B=&p_motion_B;
- real_t margin_A=p_margin_A,margin_B=p_margin_B;
+ const Shape2DSW *A = p_shape_A;
+ const Shape2DSW *B = p_shape_B;
+ const Matrix32 *transform_A = &p_transform_A;
+ const Matrix32 *transform_B = &p_transform_B;
+ const Vector2 *motion_A = &p_motion_A;
+ const Vector2 *motion_B = &p_motion_B;
+ real_t margin_A = p_margin_A, margin_B = p_margin_B;
if (type_A > type_B) {
- SWAP(A,B);
- SWAP(transform_A,transform_B);
- SWAP(type_A,type_B);
- SWAP(motion_A,motion_B);
- SWAP(margin_A,margin_B);
+ SWAP(A, B);
+ SWAP(transform_A, transform_B);
+ SWAP(type_A, type_B);
+ SWAP(motion_A, motion_B);
+ SWAP(margin_A, margin_B);
callback.swap = !callback.swap;
}
-
CollisionFunc collision_func;
if (p_margin_A || p_margin_B) {
- if (*motion_A==Vector2() && *motion_B==Vector2()) {
- collision_func = collision_table_margin[type_A-2][type_B-2];
- } else if (*motion_A!=Vector2() && *motion_B==Vector2()) {
- collision_func = collision_table_castA_margin[type_A-2][type_B-2];
- } else if (*motion_A==Vector2() && *motion_B!=Vector2()) {
- collision_func = collision_table_castB_margin[type_A-2][type_B-2];
+ if (*motion_A == Vector2() && *motion_B == Vector2()) {
+ collision_func = collision_table_margin[type_A - 2][type_B - 2];
+ } else if (*motion_A != Vector2() && *motion_B == Vector2()) {
+ collision_func = collision_table_castA_margin[type_A - 2][type_B - 2];
+ } else if (*motion_A == Vector2() && *motion_B != Vector2()) {
+ collision_func = collision_table_castB_margin[type_A - 2][type_B - 2];
} else {
- collision_func = collision_table_castA_castB_margin[type_A-2][type_B-2];
+ collision_func = collision_table_castA_castB_margin[type_A - 2][type_B - 2];
}
} else {
- if (*motion_A==Vector2() && *motion_B==Vector2()) {
- collision_func = collision_table[type_A-2][type_B-2];
- } else if (*motion_A!=Vector2() && *motion_B==Vector2()) {
- collision_func = collision_table_castA[type_A-2][type_B-2];
- } else if (*motion_A==Vector2() && *motion_B!=Vector2()) {
- collision_func = collision_table_castB[type_A-2][type_B-2];
+ if (*motion_A == Vector2() && *motion_B == Vector2()) {
+ collision_func = collision_table[type_A - 2][type_B - 2];
+ } else if (*motion_A != Vector2() && *motion_B == Vector2()) {
+ collision_func = collision_table_castA[type_A - 2][type_B - 2];
+ } else if (*motion_A == Vector2() && *motion_B != Vector2()) {
+ collision_func = collision_table_castB[type_A - 2][type_B - 2];
} else {
- collision_func = collision_table_castA_castB[type_A-2][type_B-2];
+ collision_func = collision_table_castA_castB[type_A - 2][type_B - 2];
}
-
}
+ ERR_FAIL_COND_V(!collision_func, false);
-
- ERR_FAIL_COND_V(!collision_func,false);
-
- collision_func(A,*transform_A,B,*transform_B,&callback,*motion_A,*motion_B,margin_A,margin_B);
+ collision_func(A, *transform_A, B, *transform_B, &callback, *motion_A, *motion_B, margin_A, margin_B);
return callback.collided;
-
-
}
diff --git a/servers/physics_2d/collision_solver_2d_sat.h b/servers/physics_2d/collision_solver_2d_sat.h
index b885dba91..489e59147 100644
--- a/servers/physics_2d/collision_solver_2d_sat.h
+++ b/servers/physics_2d/collision_solver_2d_sat.h
@@ -31,7 +31,6 @@
#include "collision_solver_2d_sw.h"
-
-bool sat_2d_calculate_penetration(const Shape2DSW *p_shape_A, const Matrix32& p_transform_A, const Vector2& p_motion_A,const Shape2DSW *p_shape_B, const Matrix32& p_transform_B,const Vector2& p_motion_B, CollisionSolver2DSW::CallbackResult p_result_callback,void *p_userdata, bool p_swap=false,Vector2 *sep_axis=NULL,float p_margin_A=0,float p_margin_B=0);
+bool sat_2d_calculate_penetration(const Shape2DSW *p_shape_A, const Matrix32 &p_transform_A, const Vector2 &p_motion_A, const Shape2DSW *p_shape_B, const Matrix32 &p_transform_B, const Vector2 &p_motion_B, CollisionSolver2DSW::CallbackResult p_result_callback, void *p_userdata, bool p_swap = false, Vector2 *sep_axis = NULL, float p_margin_A = 0, float p_margin_B = 0);
#endif // COLLISION_SOLVER_2D_SAT_H
diff --git a/servers/physics_2d/collision_solver_2d_sw.cpp b/servers/physics_2d/collision_solver_2d_sw.cpp
index 0ad519c9d..594e6a9ee 100644
--- a/servers/physics_2d/collision_solver_2d_sw.cpp
+++ b/servers/physics_2d/collision_solver_2d_sw.cpp
@@ -29,89 +29,78 @@
#include "collision_solver_2d_sw.h"
#include "collision_solver_2d_sat.h"
-
#define collision_solver sat_2d_calculate_penetration
//#define collision_solver gjk_epa_calculate_penetration
+bool CollisionSolver2DSW::solve_static_line(const Shape2DSW *p_shape_A, const Matrix32 &p_transform_A, const Shape2DSW *p_shape_B, const Matrix32 &p_transform_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result) {
-bool CollisionSolver2DSW::solve_static_line(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result) {
-
-
- const LineShape2DSW *line = static_cast<const LineShape2DSW*>(p_shape_A);
- if (p_shape_B->get_type()==Physics2DServer::SHAPE_LINE)
+ const LineShape2DSW *line = static_cast<const LineShape2DSW *>(p_shape_A);
+ if (p_shape_B->get_type() == Physics2DServer::SHAPE_LINE)
return false;
-
Vector2 n = p_transform_A.basis_xform(line->get_normal()).normalized();
- Vector2 p = p_transform_A.xform(line->get_normal()*line->get_d());
+ Vector2 p = p_transform_A.xform(line->get_normal() * line->get_d());
real_t d = n.dot(p);
Vector2 supports[2];
int support_count;
- p_shape_B->get_supports(p_transform_A.affine_inverse().basis_xform(-n).normalized(),supports,support_count);
-
- bool found=false;
+ p_shape_B->get_supports(p_transform_A.affine_inverse().basis_xform(-n).normalized(), supports, support_count);
+ bool found = false;
- for(int i=0;i<support_count;i++) {
+ for (int i = 0; i < support_count; i++) {
- supports[i] = p_transform_B.xform( supports[i] );
+ supports[i] = p_transform_B.xform(supports[i]);
real_t pd = n.dot(supports[i]);
- if (pd>=d)
+ if (pd >= d)
continue;
- found=true;
+ found = true;
- Vector2 support_A = supports[i] - n*(pd-d);
+ Vector2 support_A = supports[i] - n * (pd - d);
if (p_result_callback) {
if (p_swap_result)
- p_result_callback(supports[i],support_A,p_userdata);
+ p_result_callback(supports[i], support_A, p_userdata);
else
- p_result_callback(support_A,supports[i],p_userdata);
+ p_result_callback(support_A, supports[i], p_userdata);
}
-
}
-
return found;
}
-bool CollisionSolver2DSW::solve_raycast(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result,Vector2 *sep_axis) {
-
-
+bool CollisionSolver2DSW::solve_raycast(const Shape2DSW *p_shape_A, const Matrix32 &p_transform_A, const Shape2DSW *p_shape_B, const Matrix32 &p_transform_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result, Vector2 *sep_axis) {
- const RayShape2DSW *ray = static_cast<const RayShape2DSW*>(p_shape_A);
- if (p_shape_B->get_type()==Physics2DServer::SHAPE_RAY)
+ const RayShape2DSW *ray = static_cast<const RayShape2DSW *>(p_shape_A);
+ if (p_shape_B->get_type() == Physics2DServer::SHAPE_RAY)
return false;
Vector2 from = p_transform_A.get_origin();
- Vector2 to = from+p_transform_A[1]*ray->get_length();
- Vector2 support_A=to;
+ Vector2 to = from + p_transform_A[1] * ray->get_length();
+ Vector2 support_A = to;
Matrix32 invb = p_transform_B.affine_inverse();
from = invb.xform(from);
to = invb.xform(to);
- Vector2 p,n;
- if (!p_shape_B->intersect_segment(from,to,p,n)) {
+ Vector2 p, n;
+ if (!p_shape_B->intersect_segment(from, to, p, n)) {
if (sep_axis)
- *sep_axis=p_transform_A[1].normalized();
+ *sep_axis = p_transform_A[1].normalized();
return false;
}
-
- Vector2 support_B=p_transform_B.xform(p);
+ Vector2 support_B = p_transform_B.xform(p);
if (p_result_callback) {
if (p_swap_result)
- p_result_callback(support_B,support_A,p_userdata);
+ p_result_callback(support_B, support_A, p_userdata);
else
- p_result_callback(support_A,support_B,p_userdata);
+ p_result_callback(support_A, support_B, p_userdata);
}
return true;
-
}
/*
@@ -159,113 +148,102 @@ struct _ConcaveCollisionInfo2D {
int aabb_tests;
int collisions;
Vector2 *sep_axis;
-
};
void CollisionSolver2DSW::concave_callback(void *p_userdata, Shape2DSW *p_convex) {
-
-
- _ConcaveCollisionInfo2D &cinfo = *(_ConcaveCollisionInfo2D*)(p_userdata);
+ _ConcaveCollisionInfo2D &cinfo = *(_ConcaveCollisionInfo2D *)(p_userdata);
cinfo.aabb_tests++;
if (!cinfo.result_callback && cinfo.collided)
return; //already collided and no contacts requested, don't test anymore
- bool collided = collision_solver(cinfo.shape_A, *cinfo.transform_A, cinfo.motion_A, p_convex,*cinfo.transform_B, cinfo.motion_B, cinfo.result_callback, cinfo.userdata, cinfo.swap_result,cinfo.sep_axis,cinfo.margin_A,cinfo.margin_B );
+ bool collided = collision_solver(cinfo.shape_A, *cinfo.transform_A, cinfo.motion_A, p_convex, *cinfo.transform_B, cinfo.motion_B, cinfo.result_callback, cinfo.userdata, cinfo.swap_result, cinfo.sep_axis, cinfo.margin_A, cinfo.margin_B);
if (!collided)
return;
-
- cinfo.collided=true;
+ cinfo.collided = true;
cinfo.collisions++;
-
}
-bool CollisionSolver2DSW::solve_concave(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Vector2& p_motion_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,const Vector2& p_motion_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result,Vector2 *sep_axis,float p_margin_A,float p_margin_B) {
-
+bool CollisionSolver2DSW::solve_concave(const Shape2DSW *p_shape_A, const Matrix32 &p_transform_A, const Vector2 &p_motion_A, const Shape2DSW *p_shape_B, const Matrix32 &p_transform_B, const Vector2 &p_motion_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result, Vector2 *sep_axis, float p_margin_A, float p_margin_B) {
- const ConcaveShape2DSW *concave_B=static_cast<const ConcaveShape2DSW*>(p_shape_B);
+ const ConcaveShape2DSW *concave_B = static_cast<const ConcaveShape2DSW *>(p_shape_B);
_ConcaveCollisionInfo2D cinfo;
- cinfo.transform_A=&p_transform_A;
- cinfo.shape_A=p_shape_A;
- cinfo.transform_B=&p_transform_B;
- cinfo.motion_A=p_motion_A;
- cinfo.result_callback=p_result_callback;
- cinfo.userdata=p_userdata;
- cinfo.swap_result=p_swap_result;
- cinfo.collided=false;
- cinfo.collisions=0;
- cinfo.sep_axis=sep_axis;
- cinfo.margin_A=p_margin_A;
- cinfo.margin_B=p_margin_B;
+ cinfo.transform_A = &p_transform_A;
+ cinfo.shape_A = p_shape_A;
+ cinfo.transform_B = &p_transform_B;
+ cinfo.motion_A = p_motion_A;
+ cinfo.result_callback = p_result_callback;
+ cinfo.userdata = p_userdata;
+ cinfo.swap_result = p_swap_result;
+ cinfo.collided = false;
+ cinfo.collisions = 0;
+ cinfo.sep_axis = sep_axis;
+ cinfo.margin_A = p_margin_A;
+ cinfo.margin_B = p_margin_B;
- cinfo.aabb_tests=0;
+ cinfo.aabb_tests = 0;
Matrix32 rel_transform = p_transform_A;
- rel_transform.elements[2]-=p_transform_B.elements[2];
+ rel_transform.elements[2] -= p_transform_B.elements[2];
//quickly compute a local Rect2
Rect2 local_aabb;
- for(int i=0;i<2;i++) {
+ for (int i = 0; i < 2; i++) {
- Vector2 axis( p_transform_B.elements[i] );
- float axis_scale = 1.0/axis.length();
- axis*=axis_scale;
+ Vector2 axis(p_transform_B.elements[i]);
+ float axis_scale = 1.0 / axis.length();
+ axis *= axis_scale;
- float smin,smax;
- p_shape_A->project_rangev(axis,rel_transform,smin,smax);
- smin*=axis_scale;
- smax*=axis_scale;
+ float smin, smax;
+ p_shape_A->project_rangev(axis, rel_transform, smin, smax);
+ smin *= axis_scale;
+ smax *= axis_scale;
- local_aabb.pos[i]=smin;
- local_aabb.size[i]=smax-smin;
+ local_aabb.pos[i] = smin;
+ local_aabb.size[i] = smax - smin;
}
- concave_B->cull(local_aabb,concave_callback,&cinfo);
+ concave_B->cull(local_aabb, concave_callback, &cinfo);
-
-// print_line("Rect2 TESTS: "+itos(cinfo.aabb_tests));
+ // print_line("Rect2 TESTS: "+itos(cinfo.aabb_tests));
return cinfo.collided;
}
+bool CollisionSolver2DSW::solve(const Shape2DSW *p_shape_A, const Matrix32 &p_transform_A, const Vector2 &p_motion_A, const Shape2DSW *p_shape_B, const Matrix32 &p_transform_B, const Vector2 &p_motion_B, CallbackResult p_result_callback, void *p_userdata, Vector2 *sep_axis, float p_margin_A, float p_margin_B) {
-bool CollisionSolver2DSW::solve(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Vector2& p_motion_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,const Vector2& p_motion_B,CallbackResult p_result_callback,void *p_userdata,Vector2 *sep_axis,float p_margin_A,float p_margin_B) {
-
-
-
-
- Physics2DServer::ShapeType type_A=p_shape_A->get_type();
- Physics2DServer::ShapeType type_B=p_shape_B->get_type();
- bool concave_A=p_shape_A->is_concave();
- bool concave_B=p_shape_B->is_concave();
- real_t margin_A=p_margin_A,margin_B=p_margin_B;
+ Physics2DServer::ShapeType type_A = p_shape_A->get_type();
+ Physics2DServer::ShapeType type_B = p_shape_B->get_type();
+ bool concave_A = p_shape_A->is_concave();
+ bool concave_B = p_shape_B->is_concave();
+ real_t margin_A = p_margin_A, margin_B = p_margin_B;
bool swap = false;
- if (type_A>type_B) {
- SWAP(type_A,type_B);
- SWAP(concave_A,concave_B);
- SWAP(margin_A,margin_B);
- swap=true;
+ if (type_A > type_B) {
+ SWAP(type_A, type_B);
+ SWAP(concave_A, concave_B);
+ SWAP(margin_A, margin_B);
+ swap = true;
}
- if (type_A==Physics2DServer::SHAPE_LINE) {
+ if (type_A == Physics2DServer::SHAPE_LINE) {
- if (type_B==Physics2DServer::SHAPE_LINE || type_B==Physics2DServer::SHAPE_RAY) {
+ if (type_B == Physics2DServer::SHAPE_LINE || type_B == Physics2DServer::SHAPE_RAY) {
return false;
- //if (type_B==Physics2DServer::SHAPE_RAY) {
- // return false;
+ //if (type_B==Physics2DServer::SHAPE_RAY) {
+ // return false;
}
if (swap) {
- return solve_static_line(p_shape_B,p_transform_B,p_shape_A,p_transform_A,p_result_callback,p_userdata,true);
+ return solve_static_line(p_shape_B, p_transform_B, p_shape_A, p_transform_A, p_result_callback, p_userdata, true);
} else {
- return solve_static_line(p_shape_A,p_transform_A,p_shape_B,p_transform_B,p_result_callback,p_userdata,false);
+ return solve_static_line(p_shape_A, p_transform_A, p_shape_B, p_transform_B, p_result_callback, p_userdata, false);
}
- /*} else if (type_A==Physics2DServer::SHAPE_RAY) {
+ /*} else if (type_A==Physics2DServer::SHAPE_RAY) {
if (type_B==Physics2DServer::SHAPE_RAY)
return false;
@@ -276,41 +254,33 @@ bool CollisionSolver2DSW::solve(const Shape2DSW *p_shape_A,const Matrix32& p_tra
return solve_ray(p_shape_A,p_transform_A,p_shape_B,p_transform_B,p_inverse_B,p_result_callback,p_userdata,false);
}
*/
- } else if (type_A==Physics2DServer::SHAPE_RAY) {
+ } else if (type_A == Physics2DServer::SHAPE_RAY) {
- if (type_B==Physics2DServer::SHAPE_RAY) {
+ if (type_B == Physics2DServer::SHAPE_RAY) {
return false; //no ray-ray
}
-
if (swap) {
- return solve_raycast(p_shape_B,p_transform_B,p_shape_A,p_transform_A,p_result_callback,p_userdata,true,sep_axis);
+ return solve_raycast(p_shape_B, p_transform_B, p_shape_A, p_transform_A, p_result_callback, p_userdata, true, sep_axis);
} else {
- return solve_raycast(p_shape_A,p_transform_A,p_shape_B,p_transform_B,p_result_callback,p_userdata,false,sep_axis);
+ return solve_raycast(p_shape_A, p_transform_A, p_shape_B, p_transform_B, p_result_callback, p_userdata, false, sep_axis);
}
-
} else if (concave_B) {
-
if (concave_A)
return false;
if (!swap)
- return solve_concave(p_shape_A,p_transform_A,p_motion_A,p_shape_B,p_transform_B,p_motion_B,p_result_callback,p_userdata,false,sep_axis,margin_A,margin_B);
+ return solve_concave(p_shape_A, p_transform_A, p_motion_A, p_shape_B, p_transform_B, p_motion_B, p_result_callback, p_userdata, false, sep_axis, margin_A, margin_B);
else
- return solve_concave(p_shape_B,p_transform_B,p_motion_B,p_shape_A,p_transform_A,p_motion_A,p_result_callback,p_userdata,true,sep_axis,margin_A,margin_B);
-
-
+ return solve_concave(p_shape_B, p_transform_B, p_motion_B, p_shape_A, p_transform_A, p_motion_A, p_result_callback, p_userdata, true, sep_axis, margin_A, margin_B);
} else {
-
- return collision_solver(p_shape_A, p_transform_A,p_motion_A, p_shape_B, p_transform_B, p_motion_B,p_result_callback,p_userdata,false,sep_axis,margin_A,margin_B);
+ return collision_solver(p_shape_A, p_transform_A, p_motion_A, p_shape_B, p_transform_B, p_motion_B, p_result_callback, p_userdata, false, sep_axis, margin_A, margin_B);
}
-
return false;
}
-
diff --git a/servers/physics_2d/collision_solver_2d_sw.h b/servers/physics_2d/collision_solver_2d_sw.h
index 8e421dec7..ce30d9351 100644
--- a/servers/physics_2d/collision_solver_2d_sw.h
+++ b/servers/physics_2d/collision_solver_2d_sw.h
@@ -33,20 +33,16 @@
class CollisionSolver2DSW {
public:
- typedef void (*CallbackResult)(const Vector2& p_point_A,const Vector2& p_point_B,void *p_userdata);
+ typedef void (*CallbackResult)(const Vector2 &p_point_A, const Vector2 &p_point_B, void *p_userdata);
+
private:
- static bool solve_static_line(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result);
+ static bool solve_static_line(const Shape2DSW *p_shape_A, const Matrix32 &p_transform_A, const Shape2DSW *p_shape_B, const Matrix32 &p_transform_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result);
static void concave_callback(void *p_userdata, Shape2DSW *p_convex);
- static bool solve_concave(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Vector2& p_motion_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,const Vector2& p_motion_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result,Vector2 *sep_axis=NULL,float p_margin_A=0,float p_margin_B=0);
- static bool solve_raycast(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,CallbackResult p_result_callback,void *p_userdata,bool p_swap_result,Vector2 *sep_axis=NULL);
-
-
+ static bool solve_concave(const Shape2DSW *p_shape_A, const Matrix32 &p_transform_A, const Vector2 &p_motion_A, const Shape2DSW *p_shape_B, const Matrix32 &p_transform_B, const Vector2 &p_motion_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result, Vector2 *sep_axis = NULL, float p_margin_A = 0, float p_margin_B = 0);
+ static bool solve_raycast(const Shape2DSW *p_shape_A, const Matrix32 &p_transform_A, const Shape2DSW *p_shape_B, const Matrix32 &p_transform_B, CallbackResult p_result_callback, void *p_userdata, bool p_swap_result, Vector2 *sep_axis = NULL);
public:
-
- static bool solve(const Shape2DSW *p_shape_A,const Matrix32& p_transform_A,const Vector2& p_motion_A,const Shape2DSW *p_shape_B,const Matrix32& p_transform_B,const Vector2& p_motion_B,CallbackResult p_result_callback,void *p_userdata,Vector2 *sep_axis=NULL,float p_margin_A=0,float p_margin_B=0);
-
-
+ static bool solve(const Shape2DSW *p_shape_A, const Matrix32 &p_transform_A, const Vector2 &p_motion_A, const Shape2DSW *p_shape_B, const Matrix32 &p_transform_B, const Vector2 &p_motion_B, CallbackResult p_result_callback, void *p_userdata, Vector2 *sep_axis = NULL, float p_margin_A = 0, float p_margin_B = 0);
};
#endif // COLLISION_SOLVER_2D_SW_H
diff --git a/servers/physics_2d/constraint_2d_sw.h b/servers/physics_2d/constraint_2d_sw.h
index 9750b8724..f54170e81 100644
--- a/servers/physics_2d/constraint_2d_sw.h
+++ b/servers/physics_2d/constraint_2d_sw.h
@@ -39,32 +39,33 @@ class Constraint2DSW {
Constraint2DSW *island_next;
Constraint2DSW *island_list_next;
-
RID self;
protected:
- Constraint2DSW(Body2DSW **p_body_ptr=NULL,int p_body_count=0) { _body_ptr=p_body_ptr; _body_count=p_body_count; island_step=0; }
-public:
+ Constraint2DSW(Body2DSW **p_body_ptr = NULL, int p_body_count = 0) {
+ _body_ptr = p_body_ptr;
+ _body_count = p_body_count;
+ island_step = 0;
+ }
- _FORCE_INLINE_ void set_self(const RID& p_self) { self=p_self; }
+public:
+ _FORCE_INLINE_ void set_self(const RID &p_self) { self = p_self; }
_FORCE_INLINE_ RID get_self() const { return self; }
_FORCE_INLINE_ uint64_t get_island_step() const { return island_step; }
- _FORCE_INLINE_ void set_island_step(uint64_t p_step) { island_step=p_step; }
+ _FORCE_INLINE_ void set_island_step(uint64_t p_step) { island_step = p_step; }
+ _FORCE_INLINE_ Constraint2DSW *get_island_next() const { return island_next; }
+ _FORCE_INLINE_ void set_island_next(Constraint2DSW *p_next) { island_next = p_next; }
- _FORCE_INLINE_ Constraint2DSW* get_island_next() const { return island_next; }
- _FORCE_INLINE_ void set_island_next(Constraint2DSW* p_next) { island_next=p_next; }
-
- _FORCE_INLINE_ Constraint2DSW* get_island_list_next() const { return island_list_next; }
- _FORCE_INLINE_ void set_island_list_next(Constraint2DSW* p_next) { island_list_next=p_next; }
+ _FORCE_INLINE_ Constraint2DSW *get_island_list_next() const { return island_list_next; }
+ _FORCE_INLINE_ void set_island_list_next(Constraint2DSW *p_next) { island_list_next = p_next; }
_FORCE_INLINE_ Body2DSW **get_body_ptr() const { return _body_ptr; }
_FORCE_INLINE_ int get_body_count() const { return _body_count; }
-
- virtual bool setup(float p_step)=0;
- virtual void solve(float p_step)=0;
+ virtual bool setup(float p_step) = 0;
+ virtual void solve(float p_step) = 0;
virtual ~Constraint2DSW() {}
};
diff --git a/servers/physics_2d/joints_2d_sw.cpp b/servers/physics_2d/joints_2d_sw.cpp
index 531821212..e1b8413ab 100644
--- a/servers/physics_2d/joints_2d_sw.cpp
+++ b/servers/physics_2d/joints_2d_sw.cpp
@@ -52,40 +52,37 @@
* SOFTWARE.
*/
-static inline real_t k_scalar(Body2DSW *a,Body2DSW *b,const Vector2& rA, const Vector2& rB, const Vector2& n) {
-
-
- real_t value=0;
+static inline real_t k_scalar(Body2DSW *a, Body2DSW *b, const Vector2 &rA, const Vector2 &rB, const Vector2 &n) {
+ real_t value = 0;
{
- value+=a->get_inv_mass();
+ value += a->get_inv_mass();
real_t rcn = rA.cross(n);
- value+=a->get_inv_inertia() * rcn * rcn;
+ value += a->get_inv_inertia() * rcn * rcn;
}
if (b) {
- value+=b->get_inv_mass();
+ value += b->get_inv_mass();
real_t rcn = rB.cross(n);
- value+=b->get_inv_inertia() * rcn * rcn;
+ value += b->get_inv_inertia() * rcn * rcn;
}
return value;
-
}
static inline Vector2
-relative_velocity(Body2DSW *a, Body2DSW *b, Vector2 rA, Vector2 rB){
- Vector2 sum = a->get_linear_velocity() -rA.tangent() * a->get_angular_velocity();
+relative_velocity(Body2DSW *a, Body2DSW *b, Vector2 rA, Vector2 rB) {
+ Vector2 sum = a->get_linear_velocity() - rA.tangent() * a->get_angular_velocity();
if (b)
- return (b->get_linear_velocity() -rB.tangent() * b->get_angular_velocity()) - sum;
+ return (b->get_linear_velocity() - rB.tangent() * b->get_angular_velocity()) - sum;
else
return -sum;
}
static inline real_t
-normal_relative_velocity(Body2DSW *a, Body2DSW *b, Vector2 rA, Vector2 rB, Vector2 n){
+normal_relative_velocity(Body2DSW *a, Body2DSW *b, Vector2 rA, Vector2 rB, Vector2 n) {
return relative_velocity(a, b, rA, rB).dot(n);
}
@@ -188,13 +185,12 @@ PinJoint2DSW::~PinJoint2DSW() {
#else
-
bool PinJoint2DSW::setup(float p_step) {
Space2DSW *space = A->get_space();
- ERR_FAIL_COND_V(!space,false;)
+ ERR_FAIL_COND_V(!space, false;)
rA = A->get_transform().basis_xform(anchor_A);
- rB = B?B->get_transform().basis_xform(anchor_B):anchor_B;
+ rB = B ? B->get_transform().basis_xform(anchor_B) : anchor_B;
#if 0
Vector2 gA = rA+A->get_transform().get_origin();
Vector2 gB = B?rB+B->get_transform().get_origin():rB;
@@ -212,29 +208,34 @@ bool PinJoint2DSW::setup(float p_step) {
// = [1/m1+1/m2 0 ] + invI1 * [rA.y*rA.y -rA.x*rA.y] + invI2 * [rA.y*rA.y -rA.x*rA.y]
// [ 0 1/m1+1/m2] [-rA.x*rA.y rA.x*rA.x] [-rA.x*rA.y rA.x*rA.x]
- real_t B_inv_mass = B?B->get_inv_mass():0.0;
-
+ real_t B_inv_mass = B ? B->get_inv_mass() : 0.0;
Matrix32 K1;
- K1[0].x = A->get_inv_mass() + B_inv_mass; K1[1].x = 0.0f;
- K1[0].y = 0.0f; K1[1].y = A->get_inv_mass() + B_inv_mass;
+ K1[0].x = A->get_inv_mass() + B_inv_mass;
+ K1[1].x = 0.0f;
+ K1[0].y = 0.0f;
+ K1[1].y = A->get_inv_mass() + B_inv_mass;
Matrix32 K2;
- K2[0].x = A->get_inv_inertia() * rA.y * rA.y; K2[1].x = -A->get_inv_inertia() * rA.x * rA.y;
- K2[0].y = -A->get_inv_inertia() * rA.x * rA.y; K2[1].y = A->get_inv_inertia() * rA.x * rA.x;
+ K2[0].x = A->get_inv_inertia() * rA.y * rA.y;
+ K2[1].x = -A->get_inv_inertia() * rA.x * rA.y;
+ K2[0].y = -A->get_inv_inertia() * rA.x * rA.y;
+ K2[1].y = A->get_inv_inertia() * rA.x * rA.x;
Matrix32 K;
- K[0]= K1[0] + K2[0];
- K[1]= K1[1] + K2[1];
+ K[0] = K1[0] + K2[0];
+ K[1] = K1[1] + K2[1];
if (B) {
Matrix32 K3;
- K3[0].x = B->get_inv_inertia() * rB.y * rB.y; K3[1].x = -B->get_inv_inertia() * rB.x * rB.y;
- K3[0].y = -B->get_inv_inertia() * rB.x * rB.y; K3[1].y = B->get_inv_inertia() * rB.x * rB.x;
+ K3[0].x = B->get_inv_inertia() * rB.y * rB.y;
+ K3[1].x = -B->get_inv_inertia() * rB.x * rB.y;
+ K3[0].y = -B->get_inv_inertia() * rB.x * rB.y;
+ K3[1].y = B->get_inv_inertia() * rB.x * rB.x;
- K[0]+=K3[0];
- K[1]+=K3[1];
+ K[0] += K3[0];
+ K[1] += K3[1];
}
K[0].x += softness;
@@ -242,23 +243,22 @@ bool PinJoint2DSW::setup(float p_step) {
M = K.affine_inverse();
- Vector2 gA = rA+A->get_transform().get_origin();
- Vector2 gB = B?rB+B->get_transform().get_origin():rB;
+ Vector2 gA = rA + A->get_transform().get_origin();
+ Vector2 gB = B ? rB + B->get_transform().get_origin() : rB;
Vector2 delta = gB - gA;
- bias = delta*-(get_bias()==0?space->get_constraint_bias():get_bias())*(1.0/p_step);
+ bias = delta * -(get_bias() == 0 ? space->get_constraint_bias() : get_bias()) * (1.0 / p_step);
// apply accumulated impulse
- A->apply_impulse(rA,-P);
+ A->apply_impulse(rA, -P);
if (B)
- B->apply_impulse(rB,P);
+ B->apply_impulse(rB, P);
return true;
}
-void PinJoint2DSW::solve(float p_step){
-
+void PinJoint2DSW::solve(float p_step) {
// compute relative velocity
Vector2 vA = A->get_linear_velocity() - rA.cross(A->get_angular_velocity());
@@ -269,114 +269,110 @@ void PinJoint2DSW::solve(float p_step){
else
rel_vel = -vA;
- Vector2 impulse = M.basis_xform(bias - rel_vel - Vector2(softness,softness) * P);
+ Vector2 impulse = M.basis_xform(bias - rel_vel - Vector2(softness, softness) * P);
- A->apply_impulse(rA,-impulse);
+ A->apply_impulse(rA, -impulse);
if (B)
- B->apply_impulse(rB,impulse);
-
+ B->apply_impulse(rB, impulse);
P += impulse;
}
void PinJoint2DSW::set_param(Physics2DServer::PinJointParam p_param, real_t p_value) {
- if(p_param == Physics2DServer::PIN_JOINT_SOFTNESS)
+ if (p_param == Physics2DServer::PIN_JOINT_SOFTNESS)
softness = p_value;
}
real_t PinJoint2DSW::get_param(Physics2DServer::PinJointParam p_param) const {
- if(p_param == Physics2DServer::PIN_JOINT_SOFTNESS)
+ if (p_param == Physics2DServer::PIN_JOINT_SOFTNESS)
return softness;
ERR_FAIL_V(0);
}
-PinJoint2DSW::PinJoint2DSW(const Vector2& p_pos,Body2DSW* p_body_a,Body2DSW* p_body_b) : Joint2DSW(_arr,p_body_b?2:1) {
+PinJoint2DSW::PinJoint2DSW(const Vector2 &p_pos, Body2DSW *p_body_a, Body2DSW *p_body_b)
+ : Joint2DSW(_arr, p_body_b ? 2 : 1) {
- A=p_body_a;
- B=p_body_b;
+ A = p_body_a;
+ B = p_body_b;
anchor_A = p_body_a->get_inv_transform().xform(p_pos);
- anchor_B = p_body_b?p_body_b->get_inv_transform().xform(p_pos):p_pos;
+ anchor_B = p_body_b ? p_body_b->get_inv_transform().xform(p_pos) : p_pos;
- softness=0;
+ softness = 0;
- p_body_a->add_constraint(this,0);
+ p_body_a->add_constraint(this, 0);
if (p_body_b)
- p_body_b->add_constraint(this,1);
-
+ p_body_b->add_constraint(this, 1);
}
-
-
PinJoint2DSW::~PinJoint2DSW() {
if (A)
A->remove_constraint(this);
if (B)
B->remove_constraint(this);
-
}
-
-
#endif
//////////////////////////////////////////////
//////////////////////////////////////////////
//////////////////////////////////////////////
-
static inline void
-k_tensor(Body2DSW *a, Body2DSW *b, Vector2 r1, Vector2 r2, Vector2 *k1, Vector2 *k2)
-{
+k_tensor(Body2DSW *a, Body2DSW *b, Vector2 r1, Vector2 r2, Vector2 *k1, Vector2 *k2) {
// calculate mass matrix
// If I wasn't lazy and wrote a proper matrix class, this wouldn't be so gross...
real_t k11, k12, k21, k22;
real_t m_sum = a->get_inv_mass() + b->get_inv_mass();
// start with I*m_sum
- k11 = m_sum; k12 = 0.0f;
- k21 = 0.0f; k22 = m_sum;
+ k11 = m_sum;
+ k12 = 0.0f;
+ k21 = 0.0f;
+ k22 = m_sum;
// add the influence from r1
real_t a_i_inv = a->get_inv_inertia();
- real_t r1xsq = r1.x * r1.x * a_i_inv;
- real_t r1ysq = r1.y * r1.y * a_i_inv;
+ real_t r1xsq = r1.x * r1.x * a_i_inv;
+ real_t r1ysq = r1.y * r1.y * a_i_inv;
real_t r1nxy = -r1.x * r1.y * a_i_inv;
- k11 += r1ysq; k12 += r1nxy;
- k21 += r1nxy; k22 += r1xsq;
+ k11 += r1ysq;
+ k12 += r1nxy;
+ k21 += r1nxy;
+ k22 += r1xsq;
// add the influnce from r2
real_t b_i_inv = b->get_inv_inertia();
- real_t r2xsq = r2.x * r2.x * b_i_inv;
- real_t r2ysq = r2.y * r2.y * b_i_inv;
+ real_t r2xsq = r2.x * r2.x * b_i_inv;
+ real_t r2ysq = r2.y * r2.y * b_i_inv;
real_t r2nxy = -r2.x * r2.y * b_i_inv;
- k11 += r2ysq; k12 += r2nxy;
- k21 += r2nxy; k22 += r2xsq;
+ k11 += r2ysq;
+ k12 += r2nxy;
+ k21 += r2nxy;
+ k22 += r2xsq;
// invert
- real_t determinant = k11*k22 - k12*k21;
- ERR_FAIL_COND(determinant== 0.0);
+ real_t determinant = k11 * k22 - k12 * k21;
+ ERR_FAIL_COND(determinant == 0.0);
- real_t det_inv = 1.0f/determinant;
- *k1 = Vector2( k22*det_inv, -k12*det_inv);
- *k2 = Vector2(-k21*det_inv, k11*det_inv);
+ real_t det_inv = 1.0f / determinant;
+ *k1 = Vector2(k22 * det_inv, -k12 * det_inv);
+ *k2 = Vector2(-k21 * det_inv, k11 * det_inv);
}
static _FORCE_INLINE_ Vector2
-mult_k(const Vector2& vr, const Vector2 &k1, const Vector2 &k2)
-{
+mult_k(const Vector2 &vr, const Vector2 &k1, const Vector2 &k2) {
return Vector2(vr.dot(k1), vr.dot(k2));
}
bool GrooveJoint2DSW::setup(float p_step) {
-
// calculate endpoints in worldspace
Vector2 ta = A->get_transform().xform(A_groove_1);
Vector2 tb = A->get_transform().xform(A_groove_2);
- Space2DSW *space=A->get_space();
+ Space2DSW *space = A->get_space();
// calculate axis
Vector2 n = -(tb - ta).tangent().normalized();
@@ -388,16 +384,16 @@ bool GrooveJoint2DSW::setup(float p_step) {
// calculate tangential distance along the axis of rB
real_t td = (B->get_transform().get_origin() + rB).cross(n);
// calculate clamping factor and rB
- if(td <= ta.cross(n)){
+ if (td <= ta.cross(n)) {
clamp = 1.0f;
rA = ta - A->get_transform().get_origin();
- } else if(td >= tb.cross(n)){
+ } else if (td >= tb.cross(n)) {
clamp = -1.0f;
rA = tb - A->get_transform().get_origin();
} else {
clamp = 0.0f;
//joint->r1 = cpvsub(cpvadd(cpvmult(cpvperp(n), -td), cpvmult(n, d)), a->p);
- rA = ((-n.tangent() * -td) + n*d) - A->get_transform().get_origin();
+ rA = ((-n.tangent() * -td) + n * d) - A->get_transform().get_origin();
}
// Calculate mass tensor
@@ -407,55 +403,52 @@ bool GrooveJoint2DSW::setup(float p_step) {
jn_max = get_max_force() * p_step;
// calculate bias velocity
-// cpVect delta = cpvsub(cpvadd(b->p, joint->r2), cpvadd(a->p, joint->r1));
-// joint->bias = cpvclamp(cpvmult(delta, -joint->constraint.biasCoef*dt_inv), joint->constraint.maxBias);
-
+ // cpVect delta = cpvsub(cpvadd(b->p, joint->r2), cpvadd(a->p, joint->r1));
+ // joint->bias = cpvclamp(cpvmult(delta, -joint->constraint.biasCoef*dt_inv), joint->constraint.maxBias);
- Vector2 delta = (B->get_transform().get_origin() +rB) - (A->get_transform().get_origin() + rA);
+ Vector2 delta = (B->get_transform().get_origin() + rB) - (A->get_transform().get_origin() + rA);
float _b = get_bias();
- _b=0.001;
- gbias=(delta*-(_b==0?space->get_constraint_bias():_b)*(1.0/p_step)).clamped(get_max_bias());
+ _b = 0.001;
+ gbias = (delta * -(_b == 0 ? space->get_constraint_bias() : _b) * (1.0 / p_step)).clamped(get_max_bias());
// apply accumulated impulse
- A->apply_impulse(rA,-jn_acc);
- B->apply_impulse(rB,jn_acc);
+ A->apply_impulse(rA, -jn_acc);
+ B->apply_impulse(rB, jn_acc);
- correct=true;
+ correct = true;
return true;
}
-void GrooveJoint2DSW::solve(float p_step){
-
+void GrooveJoint2DSW::solve(float p_step) {
// compute impulse
- Vector2 vr = relative_velocity(A, B, rA,rB);
+ Vector2 vr = relative_velocity(A, B, rA, rB);
- Vector2 j = mult_k(gbias-vr, k1, k2);
+ Vector2 j = mult_k(gbias - vr, k1, k2);
Vector2 jOld = jn_acc;
- j+=jOld;
+ j += jOld;
jn_acc = (((clamp * j.cross(xf_normal)) > 0) ? j : xf_normal.project(j)).clamped(jn_max);
j = jn_acc - jOld;
- A->apply_impulse(rA,-j);
- B->apply_impulse(rB,j);
+ A->apply_impulse(rA, -j);
+ B->apply_impulse(rB, j);
}
+GrooveJoint2DSW::GrooveJoint2DSW(const Vector2 &p_a_groove1, const Vector2 &p_a_groove2, const Vector2 &p_b_anchor, Body2DSW *p_body_a, Body2DSW *p_body_b)
+ : Joint2DSW(_arr, 2) {
-GrooveJoint2DSW::GrooveJoint2DSW(const Vector2& p_a_groove1,const Vector2& p_a_groove2, const Vector2& p_b_anchor, Body2DSW* p_body_a,Body2DSW* p_body_b) : Joint2DSW(_arr,2) {
-
- A=p_body_a;
- B=p_body_b;
+ A = p_body_a;
+ B = p_body_b;
A_groove_1 = A->get_inv_transform().xform(p_a_groove1);
A_groove_2 = A->get_inv_transform().xform(p_a_groove2);
- B_anchor=B->get_inv_transform().xform(p_b_anchor);
+ B_anchor = B->get_inv_transform().xform(p_b_anchor);
A_groove_normal = -(A_groove_2 - A_groove_1).normalized().tangent();
- A->add_constraint(this,0);
- B->add_constraint(this,1);
-
+ A->add_constraint(this, 0);
+ B->add_constraint(this, 1);
}
GrooveJoint2DSW::~GrooveJoint2DSW() {
@@ -464,38 +457,35 @@ GrooveJoint2DSW::~GrooveJoint2DSW() {
B->remove_constraint(this);
}
-
//////////////////////////////////////////////
//////////////////////////////////////////////
//////////////////////////////////////////////
-
bool DampedSpringJoint2DSW::setup(float p_step) {
rA = A->get_transform().basis_xform(anchor_A);
rB = B->get_transform().basis_xform(anchor_B);
- Vector2 delta = (B->get_transform().get_origin() + rB) - (A->get_transform().get_origin() + rA) ;
+ Vector2 delta = (B->get_transform().get_origin() + rB) - (A->get_transform().get_origin() + rA);
real_t dist = delta.length();
if (dist)
- n=delta/dist;
+ n = delta / dist;
else
- n=Vector2();
+ n = Vector2();
real_t k = k_scalar(A, B, rA, rB, n);
- n_mass = 1.0f/k;
+ n_mass = 1.0f / k;
target_vrn = 0.0f;
- v_coef = 1.0f - Math::exp(-damping*(p_step)*k);
+ v_coef = 1.0f - Math::exp(-damping * (p_step)*k);
// apply spring force
real_t f_spring = (rest_length - dist) * stiffness;
- Vector2 j = n * f_spring*(p_step);
-
- A->apply_impulse(rA,-j);
- B->apply_impulse(rB,j);
+ Vector2 j = n * f_spring * (p_step);
+ A->apply_impulse(rA, -j);
+ B->apply_impulse(rB, j);
return true;
}
@@ -507,38 +497,36 @@ void DampedSpringJoint2DSW::solve(float p_step) {
// compute velocity loss from drag
// not 100% certain this is derived correctly, though it makes sense
- real_t v_damp = -vrn*v_coef;
+ real_t v_damp = -vrn * v_coef;
target_vrn = vrn + v_damp;
- Vector2 j=n*v_damp*n_mass;
-
- A->apply_impulse(rA,-j);
- B->apply_impulse(rB,j);
+ Vector2 j = n * v_damp * n_mass;
+ A->apply_impulse(rA, -j);
+ B->apply_impulse(rB, j);
}
void DampedSpringJoint2DSW::set_param(Physics2DServer::DampedStringParam p_param, real_t p_value) {
- switch(p_param) {
+ switch (p_param) {
case Physics2DServer::DAMPED_STRING_REST_LENGTH: {
- rest_length=p_value;
+ rest_length = p_value;
} break;
case Physics2DServer::DAMPED_STRING_DAMPING: {
- damping=p_value;
+ damping = p_value;
} break;
case Physics2DServer::DAMPED_STRING_STIFFNESS: {
- stiffness=p_value;
+ stiffness = p_value;
} break;
}
-
}
-real_t DampedSpringJoint2DSW::get_param(Physics2DServer::DampedStringParam p_param) const{
+real_t DampedSpringJoint2DSW::get_param(Physics2DServer::DampedStringParam p_param) const {
- switch(p_param) {
+ switch (p_param) {
case Physics2DServer::DAMPED_STRING_REST_LENGTH: {
@@ -557,30 +545,24 @@ real_t DampedSpringJoint2DSW::get_param(Physics2DServer::DampedStringParam p_par
ERR_FAIL_V(0);
}
+DampedSpringJoint2DSW::DampedSpringJoint2DSW(const Vector2 &p_anchor_a, const Vector2 &p_anchor_b, Body2DSW *p_body_a, Body2DSW *p_body_b)
+ : Joint2DSW(_arr, 2) {
-DampedSpringJoint2DSW::DampedSpringJoint2DSW(const Vector2& p_anchor_a,const Vector2& p_anchor_b, Body2DSW* p_body_a,Body2DSW* p_body_b) : Joint2DSW(_arr,2) {
-
-
- A=p_body_a;
- B=p_body_b;
+ A = p_body_a;
+ B = p_body_b;
anchor_A = A->get_inv_transform().xform(p_anchor_a);
anchor_B = B->get_inv_transform().xform(p_anchor_b);
- rest_length=p_anchor_a.distance_to(p_anchor_b);
- stiffness=20;
- damping=1.5;
-
-
- A->add_constraint(this,0);
- B->add_constraint(this,1);
+ rest_length = p_anchor_a.distance_to(p_anchor_b);
+ stiffness = 20;
+ damping = 1.5;
+ A->add_constraint(this, 0);
+ B->add_constraint(this, 1);
}
DampedSpringJoint2DSW::~DampedSpringJoint2DSW() {
A->remove_constraint(this);
B->remove_constraint(this);
-
}
-
-
diff --git a/servers/physics_2d/joints_2d_sw.h b/servers/physics_2d/joints_2d_sw.h
index cbbb6e6db..9feb496f4 100644
--- a/servers/physics_2d/joints_2d_sw.h
+++ b/servers/physics_2d/joints_2d_sw.h
@@ -29,30 +29,31 @@
#ifndef JOINTS_2D_SW_H
#define JOINTS_2D_SW_H
-#include "constraint_2d_sw.h"
#include "body_2d_sw.h"
-
-
+#include "constraint_2d_sw.h"
class Joint2DSW : public Constraint2DSW {
real_t max_force;
real_t bias;
real_t max_bias;
-public:
- _FORCE_INLINE_ void set_max_force(real_t p_force) { max_force=p_force; }
+public:
+ _FORCE_INLINE_ void set_max_force(real_t p_force) { max_force = p_force; }
_FORCE_INLINE_ real_t get_max_force() const { return max_force; }
- _FORCE_INLINE_ void set_bias(real_t p_bias) { bias=p_bias; }
+ _FORCE_INLINE_ void set_bias(real_t p_bias) { bias = p_bias; }
_FORCE_INLINE_ real_t get_bias() const { return bias; }
- _FORCE_INLINE_ void set_max_bias(real_t p_bias) { max_bias=p_bias; }
+ _FORCE_INLINE_ void set_max_bias(real_t p_bias) { max_bias = p_bias; }
_FORCE_INLINE_ real_t get_max_bias() const { return max_bias; }
- virtual Physics2DServer::JointType get_type() const=0;
- Joint2DSW(Body2DSW **p_body_ptr=NULL,int p_body_count=0) : Constraint2DSW(p_body_ptr,p_body_count) { bias=0; max_force=max_bias=3.40282e+38; };
-
+ virtual Physics2DServer::JointType get_type() const = 0;
+ Joint2DSW(Body2DSW **p_body_ptr = NULL, int p_body_count = 0)
+ : Constraint2DSW(p_body_ptr, p_body_count) {
+ bias = 0;
+ max_force = max_bias = 3.40282e+38;
+ };
};
#if 0
@@ -107,7 +108,7 @@ class PinJoint2DSW : public Joint2DSW {
};
Matrix32 M;
- Vector2 rA,rB;
+ Vector2 rA, rB;
Vector2 anchor_A;
Vector2 anchor_B;
Vector2 bias;
@@ -115,7 +116,6 @@ class PinJoint2DSW : public Joint2DSW {
real_t softness;
public:
-
virtual Physics2DServer::JointType get_type() const { return Physics2DServer::JOINT_PIN; }
virtual bool setup(float p_step);
@@ -124,11 +124,10 @@ public:
void set_param(Physics2DServer::PinJointParam p_param, real_t p_value);
real_t get_param(Physics2DServer::PinJointParam p_param) const;
- PinJoint2DSW(const Vector2& p_pos,Body2DSW* p_body_a,Body2DSW* p_body_b=NULL);
+ PinJoint2DSW(const Vector2 &p_pos, Body2DSW *p_body_a, Body2DSW *p_body_b = NULL);
~PinJoint2DSW();
};
-
#endif
class GrooveJoint2DSW : public Joint2DSW {
@@ -150,25 +149,21 @@ class GrooveJoint2DSW : public Joint2DSW {
real_t jn_max;
real_t clamp;
Vector2 xf_normal;
- Vector2 rA,rB;
- Vector2 k1,k2;
-
+ Vector2 rA, rB;
+ Vector2 k1, k2;
bool correct;
public:
-
virtual Physics2DServer::JointType get_type() const { return Physics2DServer::JOINT_GROOVE; }
virtual bool setup(float p_step);
virtual void solve(float p_step);
-
- GrooveJoint2DSW(const Vector2& p_a_groove1,const Vector2& p_a_groove2, const Vector2& p_b_anchor, Body2DSW* p_body_a,Body2DSW* p_body_b);
+ GrooveJoint2DSW(const Vector2 &p_a_groove1, const Vector2 &p_a_groove2, const Vector2 &p_b_anchor, Body2DSW *p_body_a, Body2DSW *p_body_b);
~GrooveJoint2DSW();
};
-
class DampedSpringJoint2DSW : public Joint2DSW {
union {
@@ -180,7 +175,6 @@ class DampedSpringJoint2DSW : public Joint2DSW {
Body2DSW *_arr[2];
};
-
Vector2 anchor_A;
Vector2 anchor_B;
@@ -188,14 +182,13 @@ class DampedSpringJoint2DSW : public Joint2DSW {
real_t damping;
real_t stiffness;
- Vector2 rA,rB;
+ Vector2 rA, rB;
Vector2 n;
real_t n_mass;
real_t target_vrn;
real_t v_coef;
public:
-
virtual Physics2DServer::JointType get_type() const { return Physics2DServer::JOINT_DAMPED_SPRING; }
virtual bool setup(float p_step);
@@ -204,9 +197,8 @@ public:
void set_param(Physics2DServer::DampedStringParam p_param, real_t p_value);
real_t get_param(Physics2DServer::DampedStringParam p_param) const;
- DampedSpringJoint2DSW(const Vector2& p_anchor_a,const Vector2& p_anchor_b, Body2DSW* p_body_a,Body2DSW* p_body_b);
+ DampedSpringJoint2DSW(const Vector2 &p_anchor_a, const Vector2 &p_anchor_b, Body2DSW *p_body_a, Body2DSW *p_body_b);
~DampedSpringJoint2DSW();
};
-
#endif // JOINTS_2D_SW_H
diff --git a/servers/physics_2d/physics_2d_server_sw.cpp b/servers/physics_2d/physics_2d_server_sw.cpp
index baa238156..c2fd1ec4c 100644
--- a/servers/physics_2d/physics_2d_server_sw.cpp
+++ b/servers/physics_2d/physics_2d_server_sw.cpp
@@ -31,52 +31,51 @@
#include "broad_phase_2d_hash_grid.h"
#include "collision_solver_2d_sw.h"
#include "globals.h"
-#include "script_language.h"
#include "os/os.h"
+#include "script_language.h"
RID Physics2DServerSW::shape_create(ShapeType p_shape) {
- Shape2DSW *shape=NULL;
- switch(p_shape) {
+ Shape2DSW *shape = NULL;
+ switch (p_shape) {
case SHAPE_LINE: {
- shape=memnew( LineShape2DSW );
+ shape = memnew(LineShape2DSW);
} break;
case SHAPE_RAY: {
- shape=memnew( RayShape2DSW );
+ shape = memnew(RayShape2DSW);
} break;
case SHAPE_SEGMENT: {
- shape=memnew( SegmentShape2DSW);
+ shape = memnew(SegmentShape2DSW);
} break;
case SHAPE_CIRCLE: {
- shape=memnew( CircleShape2DSW);
+ shape = memnew(CircleShape2DSW);
} break;
case SHAPE_RECTANGLE: {
- shape=memnew( RectangleShape2DSW);
+ shape = memnew(RectangleShape2DSW);
} break;
case SHAPE_CAPSULE: {
- shape=memnew( CapsuleShape2DSW );
+ shape = memnew(CapsuleShape2DSW);
} break;
case SHAPE_CONVEX_POLYGON: {
- shape=memnew( ConvexPolygonShape2DSW );
+ shape = memnew(ConvexPolygonShape2DSW);
} break;
case SHAPE_CONCAVE_POLYGON: {
- shape=memnew( ConcavePolygonShape2DSW );
+ shape = memnew(ConcavePolygonShape2DSW);
} break;
case SHAPE_CUSTOM: {
ERR_FAIL_V(RID());
} break;
-
}
RID id = shape_owner.make_rid(shape);
@@ -85,68 +84,55 @@ RID Physics2DServerSW::shape_create(ShapeType p_shape) {
return id;
};
-
-
-
-void Physics2DServerSW::shape_set_data(RID p_shape, const Variant& p_data) {
+void Physics2DServerSW::shape_set_data(RID p_shape, const Variant &p_data) {
Shape2DSW *shape = shape_owner.get(p_shape);
ERR_FAIL_COND(!shape);
shape->set_data(p_data);
-
-
};
-
void Physics2DServerSW::shape_set_custom_solver_bias(RID p_shape, real_t p_bias) {
Shape2DSW *shape = shape_owner.get(p_shape);
ERR_FAIL_COND(!shape);
shape->set_custom_bias(p_bias);
-
}
-
Physics2DServer::ShapeType Physics2DServerSW::shape_get_type(RID p_shape) const {
const Shape2DSW *shape = shape_owner.get(p_shape);
- ERR_FAIL_COND_V(!shape,SHAPE_CUSTOM);
+ ERR_FAIL_COND_V(!shape, SHAPE_CUSTOM);
return shape->get_type();
-
};
Variant Physics2DServerSW::shape_get_data(RID p_shape) const {
const Shape2DSW *shape = shape_owner.get(p_shape);
- ERR_FAIL_COND_V(!shape,Variant());
- ERR_FAIL_COND_V(!shape->is_configured(),Variant());
+ ERR_FAIL_COND_V(!shape, Variant());
+ ERR_FAIL_COND_V(!shape->is_configured(), Variant());
return shape->get_data();
-
};
real_t Physics2DServerSW::shape_get_custom_solver_bias(RID p_shape) const {
const Shape2DSW *shape = shape_owner.get(p_shape);
- ERR_FAIL_COND_V(!shape,0);
+ ERR_FAIL_COND_V(!shape, 0);
return shape->get_custom_bias();
-
}
+void Physics2DServerSW::_shape_col_cbk(const Vector2 &p_point_A, const Vector2 &p_point_B, void *p_userdata) {
-void Physics2DServerSW::_shape_col_cbk(const Vector2& p_point_A,const Vector2& p_point_B,void *p_userdata) {
-
+ CollCbkData *cbk = (CollCbkData *)p_userdata;
- CollCbkData *cbk=(CollCbkData *)p_userdata;
-
- if (cbk->max==0)
+ if (cbk->max == 0)
return;
- if (cbk->valid_dir!=Vector2()) {
- if (p_point_A.distance_squared_to(p_point_B)>cbk->valid_depth*cbk->valid_depth) {
+ if (cbk->valid_dir != Vector2()) {
+ if (p_point_A.distance_squared_to(p_point_B) > cbk->valid_depth * cbk->valid_depth) {
return;
}
- if (cbk->valid_dir.dot((p_point_A-p_point_B).normalized())<0.7071) {
-/* print_line("A: "+p_point_A);
+ if (cbk->valid_dir.dot((p_point_A - p_point_B).normalized()) < 0.7071) {
+ /* print_line("A: "+p_point_A);
print_line("B: "+p_point_B);
print_line("discard too angled "+rtos(cbk->valid_dir.dot((p_point_A-p_point_B))));
print_line("resnorm: "+(p_point_A-p_point_B).normalized());
@@ -158,66 +144,61 @@ void Physics2DServerSW::_shape_col_cbk(const Vector2& p_point_A,const Vector2& p
if (cbk->amount == cbk->max) {
//find least deep
- float min_depth=1e20;
- int min_depth_idx=0;
- for(int i=0;i<cbk->amount;i++) {
+ float min_depth = 1e20;
+ int min_depth_idx = 0;
+ for (int i = 0; i < cbk->amount; i++) {
- float d = cbk->ptr[i*2+0].distance_squared_to(cbk->ptr[i*2+1]);
- if (d<min_depth) {
- min_depth=d;
- min_depth_idx=i;
+ float d = cbk->ptr[i * 2 + 0].distance_squared_to(cbk->ptr[i * 2 + 1]);
+ if (d < min_depth) {
+ min_depth = d;
+ min_depth_idx = i;
}
-
}
float d = p_point_A.distance_squared_to(p_point_B);
- if (d<min_depth)
+ if (d < min_depth)
return;
- cbk->ptr[min_depth_idx*2+0]=p_point_A;
- cbk->ptr[min_depth_idx*2+1]=p_point_B;
-
+ cbk->ptr[min_depth_idx * 2 + 0] = p_point_A;
+ cbk->ptr[min_depth_idx * 2 + 1] = p_point_B;
} else {
- cbk->ptr[cbk->amount*2+0]=p_point_A;
- cbk->ptr[cbk->amount*2+1]=p_point_B;
+ cbk->ptr[cbk->amount * 2 + 0] = p_point_A;
+ cbk->ptr[cbk->amount * 2 + 1] = p_point_B;
cbk->amount++;
}
}
-bool Physics2DServerSW::shape_collide(RID p_shape_A, const Matrix32& p_xform_A,const Vector2& p_motion_A,RID p_shape_B, const Matrix32& p_xform_B, const Vector2& p_motion_B,Vector2 *r_results,int p_result_max,int &r_result_count) {
-
+bool Physics2DServerSW::shape_collide(RID p_shape_A, const Matrix32 &p_xform_A, const Vector2 &p_motion_A, RID p_shape_B, const Matrix32 &p_xform_B, const Vector2 &p_motion_B, Vector2 *r_results, int p_result_max, int &r_result_count) {
Shape2DSW *shape_A = shape_owner.get(p_shape_A);
- ERR_FAIL_COND_V(!shape_A,false);
+ ERR_FAIL_COND_V(!shape_A, false);
Shape2DSW *shape_B = shape_owner.get(p_shape_B);
- ERR_FAIL_COND_V(!shape_B,false);
+ ERR_FAIL_COND_V(!shape_B, false);
- if (p_result_max==0) {
+ if (p_result_max == 0) {
- return CollisionSolver2DSW::solve(shape_A,p_xform_A,p_motion_A,shape_B,p_xform_B,p_motion_B,NULL,NULL);
+ return CollisionSolver2DSW::solve(shape_A, p_xform_A, p_motion_A, shape_B, p_xform_B, p_motion_B, NULL, NULL);
}
CollCbkData cbk;
- cbk.max=p_result_max;
- cbk.amount=0;
- cbk.ptr=r_results;
+ cbk.max = p_result_max;
+ cbk.amount = 0;
+ cbk.ptr = r_results;
- bool res= CollisionSolver2DSW::solve(shape_A,p_xform_A,p_motion_A,shape_B,p_xform_B,p_motion_B,_shape_col_cbk,&cbk);
- r_result_count=cbk.amount;
+ bool res = CollisionSolver2DSW::solve(shape_A, p_xform_A, p_motion_A, shape_B, p_xform_B, p_motion_B, _shape_col_cbk, &cbk);
+ r_result_count = cbk.amount;
return res;
-
}
-
RID Physics2DServerSW::space_create() {
- Space2DSW *space = memnew( Space2DSW );
+ Space2DSW *space = memnew(Space2DSW);
RID id = space_owner.make_rid(space);
space->set_self(id);
RID area_id = area_create();
Area2DSW *area = area_owner.get(area_id);
- ERR_FAIL_COND_V(!area,RID());
+ ERR_FAIL_COND_V(!area, RID());
space->set_default_area(area);
area->set_space(space);
area->set_priority(-1);
@@ -225,7 +206,7 @@ RID Physics2DServerSW::space_create() {
return id;
};
-void Physics2DServerSW::space_set_active(RID p_space,bool p_active) {
+void Physics2DServerSW::space_set_active(RID p_space, bool p_active) {
Space2DSW *space = space_owner.get(p_space);
ERR_FAIL_COND(!space);
@@ -238,56 +219,51 @@ void Physics2DServerSW::space_set_active(RID p_space,bool p_active) {
bool Physics2DServerSW::space_is_active(RID p_space) const {
const Space2DSW *space = space_owner.get(p_space);
- ERR_FAIL_COND_V(!space,false);
+ ERR_FAIL_COND_V(!space, false);
return active_spaces.has(space);
-
}
-void Physics2DServerSW::space_set_param(RID p_space,SpaceParameter p_param, real_t p_value) {
+void Physics2DServerSW::space_set_param(RID p_space, SpaceParameter p_param, real_t p_value) {
Space2DSW *space = space_owner.get(p_space);
ERR_FAIL_COND(!space);
- space->set_param(p_param,p_value);
-
+ space->set_param(p_param, p_value);
}
-real_t Physics2DServerSW::space_get_param(RID p_space,SpaceParameter p_param) const {
+real_t Physics2DServerSW::space_get_param(RID p_space, SpaceParameter p_param) const {
const Space2DSW *space = space_owner.get(p_space);
- ERR_FAIL_COND_V(!space,0);
+ ERR_FAIL_COND_V(!space, 0);
return space->get_param(p_param);
}
-void Physics2DServerSW::space_set_debug_contacts(RID p_space,int p_max_contacts) {
+void Physics2DServerSW::space_set_debug_contacts(RID p_space, int p_max_contacts) {
Space2DSW *space = space_owner.get(p_space);
ERR_FAIL_COND(!space);
space->set_debug_contacts(p_max_contacts);
-
}
Vector<Vector2> Physics2DServerSW::space_get_contacts(RID p_space) const {
Space2DSW *space = space_owner.get(p_space);
- ERR_FAIL_COND_V(!space,Vector<Vector2>());
+ ERR_FAIL_COND_V(!space, Vector<Vector2>());
return space->get_debug_contacts();
-
}
int Physics2DServerSW::space_get_contact_count(RID p_space) const {
Space2DSW *space = space_owner.get(p_space);
- ERR_FAIL_COND_V(!space,0);
+ ERR_FAIL_COND_V(!space, 0);
return space->get_debug_contact_count();
-
}
-Physics2DDirectSpaceState* Physics2DServerSW::space_get_direct_state(RID p_space) {
+Physics2DDirectSpaceState *Physics2DServerSW::space_get_direct_state(RID p_space) {
Space2DSW *space = space_owner.get(p_space);
- ERR_FAIL_COND_V(!space,NULL);
+ ERR_FAIL_COND_V(!space, NULL);
if ((using_threads && !doing_sync) || space->is_locked()) {
ERR_EXPLAIN("Space state is inaccesible right now, wait for iteration or fixed process notification.");
@@ -299,7 +275,7 @@ Physics2DDirectSpaceState* Physics2DServerSW::space_get_direct_state(RID p_space
RID Physics2DServerSW::area_create() {
- Area2DSW *area = memnew( Area2DSW );
+ Area2DSW *area = memnew(Area2DSW);
RID rid = area_owner.make_rid(area);
area->set_self(rid);
return rid;
@@ -309,20 +285,19 @@ void Physics2DServerSW::area_set_space(RID p_area, RID p_space) {
Area2DSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
- Space2DSW *space=NULL;
+ Space2DSW *space = NULL;
if (p_space.is_valid()) {
space = space_owner.get(p_space);
ERR_FAIL_COND(!space);
}
area->set_space(space);
-
};
RID Physics2DServerSW::area_get_space(RID p_area) const {
Area2DSW *area = area_owner.get(p_area);
- ERR_FAIL_COND_V(!area,RID());
+ ERR_FAIL_COND_V(!area, RID());
Space2DSW *space = area->get_space();
if (!space)
@@ -332,7 +307,6 @@ RID Physics2DServerSW::area_get_space(RID p_area) const {
void Physics2DServerSW::area_set_space_override_mode(RID p_area, AreaSpaceOverrideMode p_mode) {
-
Area2DSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
@@ -342,13 +316,12 @@ void Physics2DServerSW::area_set_space_override_mode(RID p_area, AreaSpaceOverri
Physics2DServer::AreaSpaceOverrideMode Physics2DServerSW::area_get_space_override_mode(RID p_area) const {
const Area2DSW *area = area_owner.get(p_area);
- ERR_FAIL_COND_V(!area,AREA_SPACE_OVERRIDE_DISABLED);
+ ERR_FAIL_COND_V(!area, AREA_SPACE_OVERRIDE_DISABLED);
return area->get_space_override_mode();
}
-
-void Physics2DServerSW::area_add_shape(RID p_area, RID p_shape, const Matrix32& p_transform) {
+void Physics2DServerSW::area_add_shape(RID p_area, RID p_shape, const Matrix32 &p_transform) {
Area2DSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
@@ -356,11 +329,10 @@ void Physics2DServerSW::area_add_shape(RID p_area, RID p_shape, const Matrix32&
Shape2DSW *shape = shape_owner.get(p_shape);
ERR_FAIL_COND(!shape);
- area->add_shape(shape,p_transform);
-
+ area->add_shape(shape, p_transform);
}
-void Physics2DServerSW::area_set_shape(RID p_area, int p_shape_idx,RID p_shape) {
+void Physics2DServerSW::area_set_shape(RID p_area, int p_shape_idx, RID p_shape) {
Area2DSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
@@ -369,39 +341,37 @@ void Physics2DServerSW::area_set_shape(RID p_area, int p_shape_idx,RID p_shape)
ERR_FAIL_COND(!shape);
ERR_FAIL_COND(!shape->is_configured());
- area->set_shape(p_shape_idx,shape);
-
+ area->set_shape(p_shape_idx, shape);
}
-void Physics2DServerSW::area_set_shape_transform(RID p_area, int p_shape_idx, const Matrix32& p_transform) {
+void Physics2DServerSW::area_set_shape_transform(RID p_area, int p_shape_idx, const Matrix32 &p_transform) {
Area2DSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
- area->set_shape_transform(p_shape_idx,p_transform);
+ area->set_shape_transform(p_shape_idx, p_transform);
}
int Physics2DServerSW::area_get_shape_count(RID p_area) const {
Area2DSW *area = area_owner.get(p_area);
- ERR_FAIL_COND_V(!area,-1);
+ ERR_FAIL_COND_V(!area, -1);
return area->get_shape_count();
-
}
RID Physics2DServerSW::area_get_shape(RID p_area, int p_shape_idx) const {
Area2DSW *area = area_owner.get(p_area);
- ERR_FAIL_COND_V(!area,RID());
+ ERR_FAIL_COND_V(!area, RID());
Shape2DSW *shape = area->get_shape(p_shape_idx);
- ERR_FAIL_COND_V(!shape,RID());
+ ERR_FAIL_COND_V(!shape, RID());
return shape->get_self();
}
Matrix32 Physics2DServerSW::area_get_shape_transform(RID p_area, int p_shape_idx) const {
Area2DSW *area = area_owner.get(p_area);
- ERR_FAIL_COND_V(!area,Matrix32());
+ ERR_FAIL_COND_V(!area, Matrix32());
return area->get_shape_transform(p_shape_idx);
}
@@ -419,65 +389,57 @@ void Physics2DServerSW::area_clear_shapes(RID p_area) {
Area2DSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
- while(area->get_shape_count())
+ while (area->get_shape_count())
area->remove_shape(0);
-
}
-void Physics2DServerSW::area_attach_object_instance_ID(RID p_area,ObjectID p_ID) {
+void Physics2DServerSW::area_attach_object_instance_ID(RID p_area, ObjectID p_ID) {
if (space_owner.owns(p_area)) {
- Space2DSW *space=space_owner.get(p_area);
- p_area=space->get_default_area()->get_self();
+ Space2DSW *space = space_owner.get(p_area);
+ p_area = space->get_default_area()->get_self();
}
Area2DSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
area->set_instance_id(p_ID);
-
}
ObjectID Physics2DServerSW::area_get_object_instance_ID(RID p_area) const {
if (space_owner.owns(p_area)) {
- Space2DSW *space=space_owner.get(p_area);
- p_area=space->get_default_area()->get_self();
+ Space2DSW *space = space_owner.get(p_area);
+ p_area = space->get_default_area()->get_self();
}
Area2DSW *area = area_owner.get(p_area);
- ERR_FAIL_COND_V(!area,0);
+ ERR_FAIL_COND_V(!area, 0);
return area->get_instance_id();
-
-
}
-
-void Physics2DServerSW::area_set_param(RID p_area,AreaParameter p_param,const Variant& p_value) {
+void Physics2DServerSW::area_set_param(RID p_area, AreaParameter p_param, const Variant &p_value) {
if (space_owner.owns(p_area)) {
- Space2DSW *space=space_owner.get(p_area);
- p_area=space->get_default_area()->get_self();
+ Space2DSW *space = space_owner.get(p_area);
+ p_area = space->get_default_area()->get_self();
}
Area2DSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
- area->set_param(p_param,p_value);
-
+ area->set_param(p_param, p_value);
};
-
-void Physics2DServerSW::area_set_transform(RID p_area, const Matrix32& p_transform) {
+void Physics2DServerSW::area_set_transform(RID p_area, const Matrix32 &p_transform) {
Area2DSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
area->set_transform(p_transform);
-
};
-Variant Physics2DServerSW::area_get_param(RID p_area,AreaParameter p_param) const {
+Variant Physics2DServerSW::area_get_param(RID p_area, AreaParameter p_param) const {
if (space_owner.owns(p_area)) {
- Space2DSW *space=space_owner.get(p_area);
- p_area=space->get_default_area()->get_self();
+ Space2DSW *space = space_owner.get(p_area);
+ p_area = space->get_default_area()->get_self();
}
Area2DSW *area = area_owner.get(p_area);
- ERR_FAIL_COND_V(!area,Variant());
+ ERR_FAIL_COND_V(!area, Variant());
return area->get_param(p_param);
};
@@ -485,29 +447,27 @@ Variant Physics2DServerSW::area_get_param(RID p_area,AreaParameter p_param) cons
Matrix32 Physics2DServerSW::area_get_transform(RID p_area) const {
Area2DSW *area = area_owner.get(p_area);
- ERR_FAIL_COND_V(!area,Matrix32());
+ ERR_FAIL_COND_V(!area, Matrix32());
return area->get_transform();
};
-void Physics2DServerSW::area_set_pickable(RID p_area,bool p_pickable) {
+void Physics2DServerSW::area_set_pickable(RID p_area, bool p_pickable) {
Area2DSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
area->set_pickable(p_pickable);
-
}
-void Physics2DServerSW::area_set_monitorable(RID p_area,bool p_monitorable) {
+void Physics2DServerSW::area_set_monitorable(RID p_area, bool p_monitorable) {
Area2DSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
area->set_monitorable(p_monitorable);
-
}
-void Physics2DServerSW::area_set_collision_mask(RID p_area,uint32_t p_mask) {
+void Physics2DServerSW::area_set_collision_mask(RID p_area, uint32_t p_mask) {
Area2DSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
@@ -515,7 +475,7 @@ void Physics2DServerSW::area_set_collision_mask(RID p_area,uint32_t p_mask) {
area->set_collision_mask(p_mask);
}
-void Physics2DServerSW::area_set_layer_mask(RID p_area,uint32_t p_mask) {
+void Physics2DServerSW::area_set_layer_mask(RID p_area, uint32_t p_mask) {
Area2DSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
@@ -523,59 +483,53 @@ void Physics2DServerSW::area_set_layer_mask(RID p_area,uint32_t p_mask) {
area->set_layer_mask(p_mask);
}
-
-void Physics2DServerSW::area_set_monitor_callback(RID p_area,Object *p_receiver,const StringName& p_method) {
+void Physics2DServerSW::area_set_monitor_callback(RID p_area, Object *p_receiver, const StringName &p_method) {
Area2DSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
- area->set_monitor_callback(p_receiver?p_receiver->get_instance_ID():0,p_method);
-
-
+ area->set_monitor_callback(p_receiver ? p_receiver->get_instance_ID() : 0, p_method);
}
-void Physics2DServerSW::area_set_area_monitor_callback(RID p_area,Object *p_receiver,const StringName& p_method) {
-
+void Physics2DServerSW::area_set_area_monitor_callback(RID p_area, Object *p_receiver, const StringName &p_method) {
Area2DSW *area = area_owner.get(p_area);
ERR_FAIL_COND(!area);
- area->set_area_monitor_callback(p_receiver?p_receiver->get_instance_ID():0,p_method);
+ area->set_area_monitor_callback(p_receiver ? p_receiver->get_instance_ID() : 0, p_method);
}
/* BODY API */
-RID Physics2DServerSW::body_create(BodyMode p_mode,bool p_init_sleeping) {
+RID Physics2DServerSW::body_create(BodyMode p_mode, bool p_init_sleeping) {
- Body2DSW *body = memnew( Body2DSW );
- if (p_mode!=BODY_MODE_RIGID)
+ Body2DSW *body = memnew(Body2DSW);
+ if (p_mode != BODY_MODE_RIGID)
body->set_mode(p_mode);
if (p_init_sleeping)
- body->set_state(BODY_STATE_SLEEPING,p_init_sleeping);
+ body->set_state(BODY_STATE_SLEEPING, p_init_sleeping);
RID rid = body_owner.make_rid(body);
body->set_self(rid);
return rid;
};
-
void Physics2DServerSW::body_set_space(RID p_body, RID p_space) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
- Space2DSW *space=NULL;
+ Space2DSW *space = NULL;
if (p_space.is_valid()) {
space = space_owner.get(p_space);
ERR_FAIL_COND(!space);
}
body->set_space(space);
-
};
RID Physics2DServerSW::body_get_space(RID p_body) const {
Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,RID());
+ ERR_FAIL_COND_V(!body, RID());
Space2DSW *space = body->get_space();
if (!space)
@@ -583,7 +537,6 @@ RID Physics2DServerSW::body_get_space(RID p_body) const {
return space->get_self();
};
-
void Physics2DServerSW::body_set_mode(RID p_body, BodyMode p_mode) {
Body2DSW *body = body_owner.get(p_body);
@@ -595,12 +548,12 @@ void Physics2DServerSW::body_set_mode(RID p_body, BodyMode p_mode) {
Physics2DServer::BodyMode Physics2DServerSW::body_get_mode(RID p_body) const {
Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,BODY_MODE_STATIC);
+ ERR_FAIL_COND_V(!body, BODY_MODE_STATIC);
return body->get_mode();
};
-void Physics2DServerSW::body_add_shape(RID p_body, RID p_shape, const Matrix32& p_transform) {
+void Physics2DServerSW::body_add_shape(RID p_body, RID p_shape, const Matrix32 &p_transform) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
@@ -608,11 +561,10 @@ void Physics2DServerSW::body_add_shape(RID p_body, RID p_shape, const Matrix32&
Shape2DSW *shape = shape_owner.get(p_shape);
ERR_FAIL_COND(!shape);
- body->add_shape(shape,p_transform);
-
+ body->add_shape(shape, p_transform);
}
-void Physics2DServerSW::body_set_shape(RID p_body, int p_shape_idx,RID p_shape) {
+void Physics2DServerSW::body_set_shape(RID p_body, int p_shape_idx, RID p_shape) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
@@ -621,55 +573,51 @@ void Physics2DServerSW::body_set_shape(RID p_body, int p_shape_idx,RID p_shape)
ERR_FAIL_COND(!shape);
ERR_FAIL_COND(!shape->is_configured());
- body->set_shape(p_shape_idx,shape);
-
+ body->set_shape(p_shape_idx, shape);
}
-void Physics2DServerSW::body_set_shape_transform(RID p_body, int p_shape_idx, const Matrix32& p_transform) {
+void Physics2DServerSW::body_set_shape_transform(RID p_body, int p_shape_idx, const Matrix32 &p_transform) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
- body->set_shape_transform(p_shape_idx,p_transform);
+ body->set_shape_transform(p_shape_idx, p_transform);
}
-void Physics2DServerSW::body_set_shape_metadata(RID p_body, int p_shape_idx, const Variant& p_metadata) {
+void Physics2DServerSW::body_set_shape_metadata(RID p_body, int p_shape_idx, const Variant &p_metadata) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
- body->set_shape_metadata(p_shape_idx,p_metadata);
+ body->set_shape_metadata(p_shape_idx, p_metadata);
}
-
Variant Physics2DServerSW::body_get_shape_metadata(RID p_body, int p_shape_idx) const {
Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,Variant());
+ ERR_FAIL_COND_V(!body, Variant());
return body->get_shape_metadata(p_shape_idx);
}
-
int Physics2DServerSW::body_get_shape_count(RID p_body) const {
Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,-1);
+ ERR_FAIL_COND_V(!body, -1);
return body->get_shape_count();
-
}
RID Physics2DServerSW::body_get_shape(RID p_body, int p_shape_idx) const {
Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,RID());
+ ERR_FAIL_COND_V(!body, RID());
Shape2DSW *shape = body->get_shape(p_shape_idx);
- ERR_FAIL_COND_V(!shape,RID());
+ ERR_FAIL_COND_V(!shape, RID());
return shape->get_self();
}
Matrix32 Physics2DServerSW::body_get_shape_transform(RID p_body, int p_shape_idx) const {
Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,Matrix32());
+ ERR_FAIL_COND_V(!body, Matrix32());
return body->get_shape_transform(p_shape_idx);
}
@@ -687,67 +635,57 @@ void Physics2DServerSW::body_clear_shapes(RID p_body) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
- while(body->get_shape_count())
+ while (body->get_shape_count())
body->remove_shape(0);
-
}
-
-void Physics2DServerSW::body_set_shape_as_trigger(RID p_body, int p_shape_idx,bool p_enable) {
+void Physics2DServerSW::body_set_shape_as_trigger(RID p_body, int p_shape_idx, bool p_enable) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
- ERR_FAIL_INDEX(p_shape_idx,body->get_shape_count());
-
- body->set_shape_as_trigger(p_shape_idx,p_enable);
+ ERR_FAIL_INDEX(p_shape_idx, body->get_shape_count());
+ body->set_shape_as_trigger(p_shape_idx, p_enable);
}
bool Physics2DServerSW::body_is_shape_set_as_trigger(RID p_body, int p_shape_idx) const {
const Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,false);
+ ERR_FAIL_COND_V(!body, false);
- ERR_FAIL_INDEX_V(p_shape_idx,body->get_shape_count(),false);
+ ERR_FAIL_INDEX_V(p_shape_idx, body->get_shape_count(), false);
return body->is_shape_set_as_trigger(p_shape_idx);
-
}
-
-void Physics2DServerSW::body_set_continuous_collision_detection_mode(RID p_body,CCDMode p_mode) {
+void Physics2DServerSW::body_set_continuous_collision_detection_mode(RID p_body, CCDMode p_mode) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
body->set_continuous_collision_detection_mode(p_mode);
-
}
-Physics2DServerSW::CCDMode Physics2DServerSW::body_get_continuous_collision_detection_mode(RID p_body) const{
+Physics2DServerSW::CCDMode Physics2DServerSW::body_get_continuous_collision_detection_mode(RID p_body) const {
const Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,CCD_MODE_DISABLED);
+ ERR_FAIL_COND_V(!body, CCD_MODE_DISABLED);
return body->get_continuous_collision_detection_mode();
-
}
-
-
-void Physics2DServerSW::body_attach_object_instance_ID(RID p_body,uint32_t p_ID) {
+void Physics2DServerSW::body_attach_object_instance_ID(RID p_body, uint32_t p_ID) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
body->set_instance_id(p_ID);
-
};
uint32_t Physics2DServerSW::body_get_object_instance_ID(RID p_body) const {
Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,0);
+ ERR_FAIL_COND_V(!body, 0);
return body->get_instance_id();
};
@@ -757,30 +695,27 @@ void Physics2DServerSW::body_set_layer_mask(RID p_body, uint32_t p_flags) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
body->set_layer_mask(p_flags);
-
};
uint32_t Physics2DServerSW::body_get_layer_mask(RID p_body) const {
Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,0);
+ ERR_FAIL_COND_V(!body, 0);
return body->get_layer_mask();
};
-
void Physics2DServerSW::body_set_collision_mask(RID p_body, uint32_t p_flags) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
body->set_collision_mask(p_flags);
-
};
uint32_t Physics2DServerSW::body_get_collision_mask(RID p_body) const {
Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,0);
+ ERR_FAIL_COND_V(!body, 0);
return body->get_collision_mask();
};
@@ -790,50 +725,46 @@ void Physics2DServerSW::body_set_param(RID p_body, BodyParameter p_param, float
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
- body->set_param(p_param,p_value);
+ body->set_param(p_param, p_value);
};
float Physics2DServerSW::body_get_param(RID p_body, BodyParameter p_param) const {
Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,0);
+ ERR_FAIL_COND_V(!body, 0);
return body->get_param(p_param);
};
-
-
-void Physics2DServerSW::body_set_state(RID p_body, BodyState p_state, const Variant& p_variant) {
+void Physics2DServerSW::body_set_state(RID p_body, BodyState p_state, const Variant &p_variant) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
- body->set_state(p_state,p_variant);
+ body->set_state(p_state, p_variant);
};
Variant Physics2DServerSW::body_get_state(RID p_body, BodyState p_state) const {
Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,Variant());
+ ERR_FAIL_COND_V(!body, Variant());
return body->get_state(p_state);
};
-
-void Physics2DServerSW::body_set_applied_force(RID p_body, const Vector2& p_force) {
+void Physics2DServerSW::body_set_applied_force(RID p_body, const Vector2 &p_force) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
body->set_applied_force(p_force);
body->wakeup();
-
};
Vector2 Physics2DServerSW::body_get_applied_force(RID p_body) const {
Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,Vector2());
+ ERR_FAIL_COND_V(!body, Vector2());
return body->get_applied_force();
};
@@ -849,38 +780,38 @@ void Physics2DServerSW::body_set_applied_torque(RID p_body, float p_torque) {
float Physics2DServerSW::body_get_applied_torque(RID p_body) const {
Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,0);
+ ERR_FAIL_COND_V(!body, 0);
return body->get_applied_torque();
};
-void Physics2DServerSW::body_apply_impulse(RID p_body, const Vector2& p_pos, const Vector2& p_impulse) {
+void Physics2DServerSW::body_apply_impulse(RID p_body, const Vector2 &p_pos, const Vector2 &p_impulse) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
- body->apply_impulse(p_pos,p_impulse);
+ body->apply_impulse(p_pos, p_impulse);
body->wakeup();
};
-void Physics2DServerSW::body_add_force(RID p_body, const Vector2& p_offset, const Vector2& p_force) {
+void Physics2DServerSW::body_add_force(RID p_body, const Vector2 &p_offset, const Vector2 &p_force) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
- body->add_force(p_force,p_offset);
+ body->add_force(p_force, p_offset);
body->wakeup();
};
-void Physics2DServerSW::body_set_axis_velocity(RID p_body, const Vector2& p_axis_velocity) {
+void Physics2DServerSW::body_set_axis_velocity(RID p_body, const Vector2 &p_axis_velocity) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
Vector2 v = body->get_linear_velocity();
Vector2 axis = p_axis_velocity.normalized();
- v-=axis*axis.dot(v);
- v+=p_axis_velocity;
+ v -= axis * axis.dot(v);
+ v += p_axis_velocity;
body->set_linear_velocity(v);
body->wakeup();
};
@@ -901,7 +832,6 @@ void Physics2DServerSW::body_remove_collision_exception(RID p_body, RID p_body_b
body->remove_exception(p_body_b);
body->wakeup();
-
};
void Physics2DServerSW::body_get_collision_exceptions(RID p_body, List<RID> *p_exceptions) {
@@ -909,27 +839,25 @@ void Physics2DServerSW::body_get_collision_exceptions(RID p_body, List<RID> *p_e
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
- for(int i=0;i<body->get_exceptions().size();i++) {
+ for (int i = 0; i < body->get_exceptions().size(); i++) {
p_exceptions->push_back(body->get_exceptions()[i]);
}
-
};
void Physics2DServerSW::body_set_contacts_reported_depth_treshold(RID p_body, float p_treshold) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
-
};
float Physics2DServerSW::body_get_contacts_reported_depth_treshold(RID p_body) const {
Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,0);
+ ERR_FAIL_COND_V(!body, 0);
return 0;
};
-void Physics2DServerSW::body_set_omit_force_integration(RID p_body,bool p_omit) {
+void Physics2DServerSW::body_set_omit_force_integration(RID p_body, bool p_omit) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
@@ -940,7 +868,7 @@ void Physics2DServerSW::body_set_omit_force_integration(RID p_body,bool p_omit)
bool Physics2DServerSW::body_is_omitting_force_integration(RID p_body) const {
Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,false);
+ ERR_FAIL_COND_V(!body, false);
return body->get_omit_force_integration();
};
@@ -954,93 +882,83 @@ void Physics2DServerSW::body_set_max_contacts_reported(RID p_body, int p_contact
int Physics2DServerSW::body_get_max_contacts_reported(RID p_body) const {
Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,-1);
+ ERR_FAIL_COND_V(!body, -1);
return body->get_max_contacts_reported();
}
-void Physics2DServerSW::body_set_one_way_collision_direction(RID p_body,const Vector2& p_direction) {
+void Physics2DServerSW::body_set_one_way_collision_direction(RID p_body, const Vector2 &p_direction) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
body->set_one_way_collision_direction(p_direction);
}
-Vector2 Physics2DServerSW::body_get_one_way_collision_direction(RID p_body) const{
+Vector2 Physics2DServerSW::body_get_one_way_collision_direction(RID p_body) const {
Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,Vector2());
+ ERR_FAIL_COND_V(!body, Vector2());
return body->get_one_way_collision_direction();
-
}
-void Physics2DServerSW::body_set_one_way_collision_max_depth(RID p_body,float p_max_depth) {
+void Physics2DServerSW::body_set_one_way_collision_max_depth(RID p_body, float p_max_depth) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
body->set_one_way_collision_max_depth(p_max_depth);
-
}
float Physics2DServerSW::body_get_one_way_collision_max_depth(RID p_body) const {
Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,0);
+ ERR_FAIL_COND_V(!body, 0);
return body->get_one_way_collision_max_depth();
-
}
-void Physics2DServerSW::body_set_force_integration_callback(RID p_body,Object *p_receiver,const StringName& p_method,const Variant& p_udata) {
-
+void Physics2DServerSW::body_set_force_integration_callback(RID p_body, Object *p_receiver, const StringName &p_method, const Variant &p_udata) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
- body->set_force_integration_callback(p_receiver?p_receiver->get_instance_ID():ObjectID(0),p_method,p_udata);
-
+ body->set_force_integration_callback(p_receiver ? p_receiver->get_instance_ID() : ObjectID(0), p_method, p_udata);
}
-bool Physics2DServerSW::body_collide_shape(RID p_body, int p_body_shape, RID p_shape, const Matrix32& p_shape_xform,const Vector2& p_motion,Vector2 *r_results,int p_result_max,int &r_result_count) {
+bool Physics2DServerSW::body_collide_shape(RID p_body, int p_body_shape, RID p_shape, const Matrix32 &p_shape_xform, const Vector2 &p_motion, Vector2 *r_results, int p_result_max, int &r_result_count) {
Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,false);
- ERR_FAIL_INDEX_V(p_body_shape,body->get_shape_count(),false);
-
- return shape_collide(body->get_shape(p_body_shape)->get_self(),body->get_transform() * body->get_shape_transform(p_body_shape),Vector2(),p_shape,p_shape_xform,p_motion,r_results,p_result_max,r_result_count);
+ ERR_FAIL_COND_V(!body, false);
+ ERR_FAIL_INDEX_V(p_body_shape, body->get_shape_count(), false);
+ return shape_collide(body->get_shape(p_body_shape)->get_self(), body->get_transform() * body->get_shape_transform(p_body_shape), Vector2(), p_shape, p_shape_xform, p_motion, r_results, p_result_max, r_result_count);
}
-void Physics2DServerSW::body_set_pickable(RID p_body,bool p_pickable) {
+void Physics2DServerSW::body_set_pickable(RID p_body, bool p_pickable) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND(!body);
body->set_pickable(p_pickable);
-
}
-bool Physics2DServerSW::body_test_motion(RID p_body, const Vector2& p_motion, float p_margin, MotionResult *r_result) {
+bool Physics2DServerSW::body_test_motion(RID p_body, const Vector2 &p_motion, float p_margin, MotionResult *r_result) {
Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,false);
- ERR_FAIL_COND_V(!body->get_space(),false);
- ERR_FAIL_COND_V(body->get_space()->is_locked(),false);
+ ERR_FAIL_COND_V(!body, false);
+ ERR_FAIL_COND_V(!body->get_space(), false);
+ ERR_FAIL_COND_V(body->get_space()->is_locked(), false);
// Since this is the old-style, broken version, the transform to be used
// is that the physics server is aware of
- return body->get_space()->test_body_motion(body,body->get_transform(),p_motion,p_margin,r_result);
-
+ return body->get_space()->test_body_motion(body, body->get_transform(), p_motion, p_margin, r_result);
}
-bool Physics2DServerSW::body_test_motion_from(RID p_body, const Matrix32 &p_from, const Vector2& p_motion, float p_margin, MotionResult *r_result) {
+bool Physics2DServerSW::body_test_motion_from(RID p_body, const Matrix32 &p_from, const Vector2 &p_motion, float p_margin, MotionResult *r_result) {
Body2DSW *body = body_owner.get(p_body);
- ERR_FAIL_COND_V(!body,false);
- ERR_FAIL_COND_V(!body->get_space(),false);
- ERR_FAIL_COND_V(body->get_space()->is_locked(),false);
-
- return body->get_space()->test_body_motion(body,p_from,p_motion,p_margin,r_result);
+ ERR_FAIL_COND_V(!body, false);
+ ERR_FAIL_COND_V(!body->get_space(), false);
+ ERR_FAIL_COND_V(body->get_space()->is_locked(), false);
+ return body->get_space()->test_body_motion(body, p_from, p_motion, p_margin, r_result);
}
-
/* JOINT API */
void Physics2DServerSW::joint_set_param(RID p_joint, JointParam p_param, real_t p_value) {
@@ -1048,21 +966,19 @@ void Physics2DServerSW::joint_set_param(RID p_joint, JointParam p_param, real_t
Joint2DSW *joint = joint_owner.get(p_joint);
ERR_FAIL_COND(!joint);
- switch(p_param) {
+ switch (p_param) {
case JOINT_PARAM_BIAS: joint->set_bias(p_value); break;
case JOINT_PARAM_MAX_BIAS: joint->set_max_bias(p_value); break;
case JOINT_PARAM_MAX_FORCE: joint->set_max_force(p_value); break;
}
-
-
}
-real_t Physics2DServerSW::joint_get_param(RID p_joint,JointParam p_param) const {
+real_t Physics2DServerSW::joint_get_param(RID p_joint, JointParam p_param) const {
const Joint2DSW *joint = joint_owner.get(p_joint);
- ERR_FAIL_COND_V(!joint,-1);
+ ERR_FAIL_COND_V(!joint, -1);
- switch(p_param) {
+ switch (p_param) {
case JOINT_PARAM_BIAS: return joint->get_bias(); break;
case JOINT_PARAM_MAX_BIAS: return joint->get_max_bias(); break;
case JOINT_PARAM_MAX_FORCE: return joint->get_max_force(); break;
@@ -1071,115 +987,106 @@ real_t Physics2DServerSW::joint_get_param(RID p_joint,JointParam p_param) const
return 0;
}
+RID Physics2DServerSW::pin_joint_create(const Vector2 &p_pos, RID p_body_a, RID p_body_b) {
-RID Physics2DServerSW::pin_joint_create(const Vector2& p_pos,RID p_body_a,RID p_body_b) {
-
- Body2DSW *A=body_owner.get(p_body_a);
- ERR_FAIL_COND_V(!A,RID());
- Body2DSW *B=NULL;
+ Body2DSW *A = body_owner.get(p_body_a);
+ ERR_FAIL_COND_V(!A, RID());
+ Body2DSW *B = NULL;
if (body_owner.owns(p_body_b)) {
- B=body_owner.get(p_body_b);
- ERR_FAIL_COND_V(!B,RID());
+ B = body_owner.get(p_body_b);
+ ERR_FAIL_COND_V(!B, RID());
}
- Joint2DSW *joint = memnew( PinJoint2DSW(p_pos,A,B) );
+ Joint2DSW *joint = memnew(PinJoint2DSW(p_pos, A, B));
RID self = joint_owner.make_rid(joint);
joint->set_self(self);
return self;
}
-RID Physics2DServerSW::groove_joint_create(const Vector2& p_a_groove1,const Vector2& p_a_groove2, const Vector2& p_b_anchor, RID p_body_a,RID p_body_b) {
-
+RID Physics2DServerSW::groove_joint_create(const Vector2 &p_a_groove1, const Vector2 &p_a_groove2, const Vector2 &p_b_anchor, RID p_body_a, RID p_body_b) {
- Body2DSW *A=body_owner.get(p_body_a);
- ERR_FAIL_COND_V(!A,RID());
+ Body2DSW *A = body_owner.get(p_body_a);
+ ERR_FAIL_COND_V(!A, RID());
- Body2DSW *B=body_owner.get(p_body_b);
- ERR_FAIL_COND_V(!B,RID());
+ Body2DSW *B = body_owner.get(p_body_b);
+ ERR_FAIL_COND_V(!B, RID());
- Joint2DSW *joint = memnew( GrooveJoint2DSW(p_a_groove1,p_a_groove2,p_b_anchor,A,B) );
+ Joint2DSW *joint = memnew(GrooveJoint2DSW(p_a_groove1, p_a_groove2, p_b_anchor, A, B));
RID self = joint_owner.make_rid(joint);
joint->set_self(self);
return self;
-
-
}
-RID Physics2DServerSW::damped_spring_joint_create(const Vector2& p_anchor_a,const Vector2& p_anchor_b,RID p_body_a,RID p_body_b) {
+RID Physics2DServerSW::damped_spring_joint_create(const Vector2 &p_anchor_a, const Vector2 &p_anchor_b, RID p_body_a, RID p_body_b) {
- Body2DSW *A=body_owner.get(p_body_a);
- ERR_FAIL_COND_V(!A,RID());
+ Body2DSW *A = body_owner.get(p_body_a);
+ ERR_FAIL_COND_V(!A, RID());
- Body2DSW *B=body_owner.get(p_body_b);
- ERR_FAIL_COND_V(!B,RID());
+ Body2DSW *B = body_owner.get(p_body_b);
+ ERR_FAIL_COND_V(!B, RID());
- Joint2DSW *joint = memnew( DampedSpringJoint2DSW(p_anchor_a,p_anchor_b,A,B) );
+ Joint2DSW *joint = memnew(DampedSpringJoint2DSW(p_anchor_a, p_anchor_b, A, B));
RID self = joint_owner.make_rid(joint);
joint->set_self(self);
return self;
-
}
void Physics2DServerSW::pin_joint_set_param(RID p_joint, PinJointParam p_param, real_t p_value) {
Joint2DSW *j = joint_owner.get(p_joint);
ERR_FAIL_COND(!j);
- ERR_FAIL_COND(j->get_type()!=JOINT_PIN);
+ ERR_FAIL_COND(j->get_type() != JOINT_PIN);
- PinJoint2DSW *pin_joint = static_cast<PinJoint2DSW*>(j);
+ PinJoint2DSW *pin_joint = static_cast<PinJoint2DSW *>(j);
pin_joint->set_param(p_param, p_value);
}
real_t Physics2DServerSW::pin_joint_get_param(RID p_joint, PinJointParam p_param) const {
Joint2DSW *j = joint_owner.get(p_joint);
- ERR_FAIL_COND_V(!j,0);
- ERR_FAIL_COND_V(j->get_type()!=JOINT_PIN,0);
+ ERR_FAIL_COND_V(!j, 0);
+ ERR_FAIL_COND_V(j->get_type() != JOINT_PIN, 0);
- PinJoint2DSW *pin_joint = static_cast<PinJoint2DSW*>(j);
+ PinJoint2DSW *pin_joint = static_cast<PinJoint2DSW *>(j);
return pin_joint->get_param(p_param);
}
void Physics2DServerSW::damped_string_joint_set_param(RID p_joint, DampedStringParam p_param, real_t p_value) {
-
Joint2DSW *j = joint_owner.get(p_joint);
ERR_FAIL_COND(!j);
- ERR_FAIL_COND(j->get_type()!=JOINT_DAMPED_SPRING);
+ ERR_FAIL_COND(j->get_type() != JOINT_DAMPED_SPRING);
- DampedSpringJoint2DSW *dsj = static_cast<DampedSpringJoint2DSW*>(j);
- dsj->set_param(p_param,p_value);
+ DampedSpringJoint2DSW *dsj = static_cast<DampedSpringJoint2DSW *>(j);
+ dsj->set_param(p_param, p_value);
}
real_t Physics2DServerSW::damped_string_joint_get_param(RID p_joint, DampedStringParam p_param) const {
Joint2DSW *j = joint_owner.get(p_joint);
- ERR_FAIL_COND_V(!j,0);
- ERR_FAIL_COND_V(j->get_type()!=JOINT_DAMPED_SPRING,0);
+ ERR_FAIL_COND_V(!j, 0);
+ ERR_FAIL_COND_V(j->get_type() != JOINT_DAMPED_SPRING, 0);
- DampedSpringJoint2DSW *dsj = static_cast<DampedSpringJoint2DSW*>(j);
+ DampedSpringJoint2DSW *dsj = static_cast<DampedSpringJoint2DSW *>(j);
return dsj->get_param(p_param);
}
Physics2DServer::JointType Physics2DServerSW::joint_get_type(RID p_joint) const {
-
Joint2DSW *joint = joint_owner.get(p_joint);
- ERR_FAIL_COND_V(!joint,JOINT_PIN);
+ ERR_FAIL_COND_V(!joint, JOINT_PIN);
return joint->get_type();
}
-
-
void Physics2DServerSW::free(RID p_rid) {
if (shape_owner.owns(p_rid)) {
Shape2DSW *shape = shape_owner.get(p_rid);
- while(shape->get_owners().size()) {
- ShapeOwner2DSW *so=shape->get_owners().front()->key();
+ while (shape->get_owners().size()) {
+ ShapeOwner2DSW *so = shape->get_owners().front()->key();
so->remove_shape(shape);
}
@@ -1189,16 +1096,15 @@ void Physics2DServerSW::free(RID p_rid) {
Body2DSW *body = body_owner.get(p_rid);
-// if (body->get_state_query())
-// _clear_query(body->get_state_query());
+ // if (body->get_state_query())
+ // _clear_query(body->get_state_query());
-// if (body->get_direct_state_query())
-// _clear_query(body->get_direct_state_query());
+ // if (body->get_direct_state_query())
+ // _clear_query(body->get_direct_state_query());
body->set_space(NULL);
-
- while( body->get_shape_count() ) {
+ while (body->get_shape_count()) {
body->remove_shape(0);
}
@@ -1216,12 +1122,12 @@ void Physics2DServerSW::free(RID p_rid) {
Area2DSW *area = area_owner.get(p_rid);
-// if (area->get_monitor_query())
-// _clear_query(area->get_monitor_query());
+ // if (area->get_monitor_query())
+ // _clear_query(area->get_monitor_query());
area->set_space(NULL);
- while( area->get_shape_count() ) {
+ while (area->get_shape_count()) {
area->remove_shape(0);
}
@@ -1232,7 +1138,7 @@ void Physics2DServerSW::free(RID p_rid) {
Space2DSW *space = space_owner.get(p_rid);
- while(space->get_objects().size()) {
+ while (space->get_objects().size()) {
CollisionObject2DSW *co = (CollisionObject2DSW *)space->get_objects().front()->get();
co->set_space(NULL);
}
@@ -1253,52 +1159,46 @@ void Physics2DServerSW::free(RID p_rid) {
ERR_EXPLAIN("Invalid ID");
ERR_FAIL();
}
-
-
};
void Physics2DServerSW::set_active(bool p_active) {
- active=p_active;
+ active = p_active;
};
void Physics2DServerSW::init() {
- doing_sync=false;
- last_step=0.001;
- iterations=8;// 8?
- stepper = memnew( Step2DSW );
- direct_state = memnew( Physics2DDirectBodyStateSW );
+ doing_sync = false;
+ last_step = 0.001;
+ iterations = 8; // 8?
+ stepper = memnew(Step2DSW);
+ direct_state = memnew(Physics2DDirectBodyStateSW);
};
-
void Physics2DServerSW::step(float p_step) {
-
if (!active)
return;
- doing_sync=false;
+ doing_sync = false;
- last_step=p_step;
- Physics2DDirectBodyStateSW::singleton->step=p_step;
- island_count=0;
- active_objects=0;
- collision_pairs=0;
- for( Set<const Space2DSW*>::Element *E=active_spaces.front();E;E=E->next()) {
+ last_step = p_step;
+ Physics2DDirectBodyStateSW::singleton->step = p_step;
+ island_count = 0;
+ active_objects = 0;
+ collision_pairs = 0;
+ for (Set<const Space2DSW *>::Element *E = active_spaces.front(); E; E = E->next()) {
- stepper->step((Space2DSW*)E->get(),p_step,iterations);
- island_count+=E->get()->get_island_count();
- active_objects+=E->get()->get_active_objects();
- collision_pairs+=E->get()->get_collision_pairs();
+ stepper->step((Space2DSW *)E->get(), p_step, iterations);
+ island_count += E->get()->get_island_count();
+ active_objects += E->get()->get_active_objects();
+ collision_pairs += E->get()->get_collision_pairs();
}
-
-
};
void Physics2DServerSW::sync() {
- doing_sync=true;
+ doing_sync = true;
};
void Physics2DServerSW::flush_queries() {
@@ -1308,17 +1208,16 @@ void Physics2DServerSW::flush_queries() {
uint64_t time_beg = OS::get_singleton()->get_ticks_usec();
- for( Set<const Space2DSW*>::Element *E=active_spaces.front();E;E=E->next()) {
+ for (Set<const Space2DSW *>::Element *E = active_spaces.front(); E; E = E->next()) {
- Space2DSW *space=(Space2DSW *)E->get();
+ Space2DSW *space = (Space2DSW *)E->get();
space->call_queries();
}
-
if (ScriptDebugger::get_singleton() && ScriptDebugger::get_singleton()->is_profiling()) {
uint64_t total_time[Space2DSW::ELAPSED_TIME_MAX];
- static const char* time_name[Space2DSW::ELAPSED_TIME_MAX]={
+ static const char *time_name[Space2DSW::ELAPSED_TIME_MAX] = {
"integrate_forces",
"generate_islands",
"setup_constraints",
@@ -1326,39 +1225,34 @@ void Physics2DServerSW::flush_queries() {
"integrate_velocities"
};
- for(int i=0;i<Space2DSW::ELAPSED_TIME_MAX;i++) {
- total_time[i]=0;
+ for (int i = 0; i < Space2DSW::ELAPSED_TIME_MAX; i++) {
+ total_time[i] = 0;
}
- for( Set<const Space2DSW*>::Element *E=active_spaces.front();E;E=E->next()) {
+ for (Set<const Space2DSW *>::Element *E = active_spaces.front(); E; E = E->next()) {
- for(int i=0;i<Space2DSW::ELAPSED_TIME_MAX;i++) {
- total_time[i]+=E->get()->get_elapsed_time(Space2DSW::ElapsedTime(i));
+ for (int i = 0; i < Space2DSW::ELAPSED_TIME_MAX; i++) {
+ total_time[i] += E->get()->get_elapsed_time(Space2DSW::ElapsedTime(i));
}
-
}
Array values;
- values.resize(Space2DSW::ELAPSED_TIME_MAX*2);
- for(int i=0;i<Space2DSW::ELAPSED_TIME_MAX;i++) {
- values[i*2+0]=time_name[i];
- values[i*2+1]=USEC_TO_SEC(total_time[i]);
+ values.resize(Space2DSW::ELAPSED_TIME_MAX * 2);
+ for (int i = 0; i < Space2DSW::ELAPSED_TIME_MAX; i++) {
+ values[i * 2 + 0] = time_name[i];
+ values[i * 2 + 1] = USEC_TO_SEC(total_time[i]);
}
values.push_back("flush_queries");
- values.push_back(USEC_TO_SEC(OS::get_singleton()->get_ticks_usec()-time_beg));
-
- ScriptDebugger::get_singleton()->add_profiling_frame_data("physics_2d",values);
+ values.push_back(USEC_TO_SEC(OS::get_singleton()->get_ticks_usec() - time_beg));
+ ScriptDebugger::get_singleton()->add_profiling_frame_data("physics_2d", values);
}
-
}
void Physics2DServerSW::end_sync() {
- doing_sync=false;
+ doing_sync = false;
}
-
-
void Physics2DServerSW::finish() {
memdelete(stepper);
@@ -1367,7 +1261,7 @@ void Physics2DServerSW::finish() {
int Physics2DServerSW::get_process_info(ProcessInfo p_info) {
- switch(p_info) {
+ switch (p_info) {
case INFO_ACTIVE_OBJECTS: {
@@ -1380,32 +1274,26 @@ int Physics2DServerSW::get_process_info(ProcessInfo p_info) {
return island_count;
} break;
-
}
return 0;
}
-
-Physics2DServerSW *Physics2DServerSW::singletonsw=NULL;
+Physics2DServerSW *Physics2DServerSW::singletonsw = NULL;
Physics2DServerSW::Physics2DServerSW() {
- singletonsw=this;
- BroadPhase2DSW::create_func=BroadPhase2DHashGrid::_create;
-// BroadPhase2DSW::create_func=BroadPhase2DBasic::_create;
-
- active=true;
- island_count=0;
- active_objects=0;
- collision_pairs=0;
- using_threads=int(Globals::get_singleton()->get("physics_2d/thread_model"))==2;
+ singletonsw = this;
+ BroadPhase2DSW::create_func = BroadPhase2DHashGrid::_create;
+ // BroadPhase2DSW::create_func=BroadPhase2DBasic::_create;
+ active = true;
+ island_count = 0;
+ active_objects = 0;
+ collision_pairs = 0;
+ using_threads = int(Globals::get_singleton()->get("physics_2d/thread_model")) == 2;
};
-
-Physics2DServerSW::~Physics2DServerSW() {
+Physics2DServerSW::~Physics2DServerSW(){
};
-
-
diff --git a/servers/physics_2d/physics_2d_server_sw.h b/servers/physics_2d/physics_2d_server_sw.h
index 99ab99996..7a3fe5eaa 100644
--- a/servers/physics_2d/physics_2d_server_sw.h
+++ b/servers/physics_2d/physics_2d_server_sw.h
@@ -29,20 +29,18 @@
#ifndef PHYSICS_2D_SERVER_SW
#define PHYSICS_2D_SERVER_SW
-
+#include "joints_2d_sw.h"
#include "servers/physics_2d_server.h"
#include "shape_2d_sw.h"
#include "space_2d_sw.h"
#include "step_2d_sw.h"
-#include "joints_2d_sw.h"
-
class Physics2DServerSW : public Physics2DServer {
- OBJ_TYPE( Physics2DServerSW, Physics2DServer );
+ OBJ_TYPE(Physics2DServerSW, Physics2DServer);
-friend class Physics2DDirectSpaceStateSW;
-friend class Physics2DDirectBodyStateSW;
+ friend class Physics2DDirectSpaceStateSW;
+ friend class Physics2DDirectBodyStateSW;
bool active;
int iterations;
bool doing_sync;
@@ -54,10 +52,8 @@ friend class Physics2DDirectBodyStateSW;
bool using_threads;
-
-
Step2DSW *stepper;
- Set<const Space2DSW*> active_spaces;
+ Set<const Space2DSW *> active_spaces;
Physics2DDirectBodyStateSW *direct_state;
@@ -69,10 +65,8 @@ friend class Physics2DDirectBodyStateSW;
static Physics2DServerSW *singletonsw;
-
-// void _clear_query(Query2DSW *p_query);
+ // void _clear_query(Query2DSW *p_query);
public:
-
struct CollCbkData {
Vector2 valid_dir;
@@ -82,36 +76,33 @@ public:
Vector2 *ptr;
};
- static void _shape_col_cbk(const Vector2& p_point_A,const Vector2& p_point_B,void *p_userdata);
-
+ static void _shape_col_cbk(const Vector2 &p_point_A, const Vector2 &p_point_B, void *p_userdata);
virtual RID shape_create(ShapeType p_shape);
- virtual void shape_set_data(RID p_shape, const Variant& p_data);
+ virtual void shape_set_data(RID p_shape, const Variant &p_data);
virtual void shape_set_custom_solver_bias(RID p_shape, real_t p_bias);
virtual ShapeType shape_get_type(RID p_shape) const;
virtual Variant shape_get_data(RID p_shape) const;
virtual real_t shape_get_custom_solver_bias(RID p_shape) const;
- virtual bool shape_collide(RID p_shape_A, const Matrix32& p_xform_A,const Vector2& p_motion_A,RID p_shape_B, const Matrix32& p_xform_B, const Vector2& p_motion_B,Vector2 *r_results,int p_result_max,int &r_result_count);
+ virtual bool shape_collide(RID p_shape_A, const Matrix32 &p_xform_A, const Vector2 &p_motion_A, RID p_shape_B, const Matrix32 &p_xform_B, const Vector2 &p_motion_B, Vector2 *r_results, int p_result_max, int &r_result_count);
/* SPACE API */
virtual RID space_create();
- virtual void space_set_active(RID p_space,bool p_active);
+ virtual void space_set_active(RID p_space, bool p_active);
virtual bool space_is_active(RID p_space) const;
- virtual void space_set_param(RID p_space,SpaceParameter p_param, real_t p_value);
- virtual real_t space_get_param(RID p_space,SpaceParameter p_param) const;
+ virtual void space_set_param(RID p_space, SpaceParameter p_param, real_t p_value);
+ virtual real_t space_get_param(RID p_space, SpaceParameter p_param) const;
- virtual void space_set_debug_contacts(RID p_space,int p_max_contacts);
+ virtual void space_set_debug_contacts(RID p_space, int p_max_contacts);
virtual Vector<Vector2> space_get_contacts(RID p_space) const;
virtual int space_get_contact_count(RID p_space) const;
-
// this function only works on fixed process, errors and returns null otherwise
- virtual Physics2DDirectSpaceState* space_get_direct_state(RID p_space);
-
+ virtual Physics2DDirectSpaceState *space_get_direct_state(RID p_space);
/* AREA API */
@@ -123,9 +114,9 @@ public:
virtual void area_set_space(RID p_area, RID p_space);
virtual RID area_get_space(RID p_area) const;
- virtual void area_add_shape(RID p_area, RID p_shape, const Matrix32& p_transform=Matrix32());
- virtual void area_set_shape(RID p_area, int p_shape_idx,RID p_shape);
- virtual void area_set_shape_transform(RID p_area, int p_shape_idx, const Matrix32& p_transform);
+ virtual void area_add_shape(RID p_area, RID p_shape, const Matrix32 &p_transform = Matrix32());
+ virtual void area_set_shape(RID p_area, int p_shape_idx, RID p_shape);
+ virtual void area_set_shape_transform(RID p_area, int p_shape_idx, const Matrix32 &p_transform);
virtual int area_get_shape_count(RID p_area) const;
virtual RID area_get_shape(RID p_area, int p_shape_idx) const;
@@ -134,28 +125,27 @@ public:
virtual void area_remove_shape(RID p_area, int p_shape_idx);
virtual void area_clear_shapes(RID p_area);
- virtual void area_attach_object_instance_ID(RID p_area,ObjectID p_ID);
+ virtual void area_attach_object_instance_ID(RID p_area, ObjectID p_ID);
virtual ObjectID area_get_object_instance_ID(RID p_area) const;
- virtual void area_set_param(RID p_area,AreaParameter p_param,const Variant& p_value);
- virtual void area_set_transform(RID p_area, const Matrix32& p_transform);
+ virtual void area_set_param(RID p_area, AreaParameter p_param, const Variant &p_value);
+ virtual void area_set_transform(RID p_area, const Matrix32 &p_transform);
- virtual Variant area_get_param(RID p_parea,AreaParameter p_param) const;
+ virtual Variant area_get_param(RID p_parea, AreaParameter p_param) const;
virtual Matrix32 area_get_transform(RID p_area) const;
- virtual void area_set_monitorable(RID p_area,bool p_monitorable);
- virtual void area_set_collision_mask(RID p_area,uint32_t p_mask);
- virtual void area_set_layer_mask(RID p_area,uint32_t p_mask);
-
- virtual void area_set_monitor_callback(RID p_area,Object *p_receiver,const StringName& p_method);
- virtual void area_set_area_monitor_callback(RID p_area,Object *p_receiver,const StringName& p_method);
+ virtual void area_set_monitorable(RID p_area, bool p_monitorable);
+ virtual void area_set_collision_mask(RID p_area, uint32_t p_mask);
+ virtual void area_set_layer_mask(RID p_area, uint32_t p_mask);
- virtual void area_set_pickable(RID p_area,bool p_pickable);
+ virtual void area_set_monitor_callback(RID p_area, Object *p_receiver, const StringName &p_method);
+ virtual void area_set_area_monitor_callback(RID p_area, Object *p_receiver, const StringName &p_method);
+ virtual void area_set_pickable(RID p_area, bool p_pickable);
/* BODY API */
// create a body of a given type
- virtual RID body_create(BodyMode p_mode=BODY_MODE_RIGID,bool p_init_sleeping=false);
+ virtual RID body_create(BodyMode p_mode = BODY_MODE_RIGID, bool p_init_sleeping = false);
virtual void body_set_space(RID p_body, RID p_space);
virtual RID body_get_space(RID p_body) const;
@@ -163,28 +153,26 @@ public:
virtual void body_set_mode(RID p_body, BodyMode p_mode);
virtual BodyMode body_get_mode(RID p_body) const;
- virtual void body_add_shape(RID p_body, RID p_shape, const Matrix32& p_transform=Matrix32());
- virtual void body_set_shape(RID p_body, int p_shape_idx,RID p_shape);
- virtual void body_set_shape_transform(RID p_body, int p_shape_idx, const Matrix32& p_transform);
- virtual void body_set_shape_metadata(RID p_body, int p_shape_idx, const Variant& p_metadata);
-
+ virtual void body_add_shape(RID p_body, RID p_shape, const Matrix32 &p_transform = Matrix32());
+ virtual void body_set_shape(RID p_body, int p_shape_idx, RID p_shape);
+ virtual void body_set_shape_transform(RID p_body, int p_shape_idx, const Matrix32 &p_transform);
+ virtual void body_set_shape_metadata(RID p_body, int p_shape_idx, const Variant &p_metadata);
virtual int body_get_shape_count(RID p_body) const;
virtual RID body_get_shape(RID p_body, int p_shape_idx) const;
virtual Matrix32 body_get_shape_transform(RID p_body, int p_shape_idx) const;
virtual Variant body_get_shape_metadata(RID p_body, int p_shape_idx) const;
-
virtual void body_remove_shape(RID p_body, int p_shape_idx);
virtual void body_clear_shapes(RID p_body);
- virtual void body_set_shape_as_trigger(RID p_body, int p_shape_idx,bool p_enable);
+ virtual void body_set_shape_as_trigger(RID p_body, int p_shape_idx, bool p_enable);
virtual bool body_is_shape_set_as_trigger(RID p_body, int p_shape_idx) const;
- virtual void body_attach_object_instance_ID(RID p_body,uint32_t p_ID);
+ virtual void body_attach_object_instance_ID(RID p_body, uint32_t p_ID);
virtual uint32_t body_get_object_instance_ID(RID p_body) const;
- virtual void body_set_continuous_collision_detection_mode(RID p_body,CCDMode p_mode);
+ virtual void body_set_continuous_collision_detection_mode(RID p_body, CCDMode p_mode);
virtual CCDMode body_get_continuous_collision_detection_mode(RID p_body) const;
virtual void body_set_layer_mask(RID p_body, uint32_t p_mask);
@@ -196,20 +184,19 @@ public:
virtual void body_set_param(RID p_body, BodyParameter p_param, float p_value);
virtual float body_get_param(RID p_body, BodyParameter p_param) const;
-
- virtual void body_set_state(RID p_body, BodyState p_state, const Variant& p_variant);
+ virtual void body_set_state(RID p_body, BodyState p_state, const Variant &p_variant);
virtual Variant body_get_state(RID p_body, BodyState p_state) const;
- virtual void body_set_applied_force(RID p_body, const Vector2& p_force);
+ virtual void body_set_applied_force(RID p_body, const Vector2 &p_force);
virtual Vector2 body_get_applied_force(RID p_body) const;
virtual void body_set_applied_torque(RID p_body, float p_torque);
virtual float body_get_applied_torque(RID p_body) const;
- virtual void body_add_force(RID p_body, const Vector2& p_offset, const Vector2& p_force);
+ virtual void body_add_force(RID p_body, const Vector2 &p_offset, const Vector2 &p_force);
- virtual void body_apply_impulse(RID p_body, const Vector2& p_pos, const Vector2& p_impulse);
- virtual void body_set_axis_velocity(RID p_body, const Vector2& p_axis_velocity);
+ virtual void body_apply_impulse(RID p_body, const Vector2 &p_pos, const Vector2 &p_impulse);
+ virtual void body_set_axis_velocity(RID p_body, const Vector2 &p_axis_velocity);
virtual void body_add_collision_exception(RID p_body, RID p_body_b);
virtual void body_remove_collision_exception(RID p_body, RID p_body_b);
@@ -218,36 +205,34 @@ public:
virtual void body_set_contacts_reported_depth_treshold(RID p_body, float p_treshold);
virtual float body_get_contacts_reported_depth_treshold(RID p_body) const;
- virtual void body_set_omit_force_integration(RID p_body,bool p_omit);
+ virtual void body_set_omit_force_integration(RID p_body, bool p_omit);
virtual bool body_is_omitting_force_integration(RID p_body) const;
virtual void body_set_max_contacts_reported(RID p_body, int p_contacts);
virtual int body_get_max_contacts_reported(RID p_body) const;
- virtual void body_set_one_way_collision_direction(RID p_body,const Vector2& p_direction);
+ virtual void body_set_one_way_collision_direction(RID p_body, const Vector2 &p_direction);
virtual Vector2 body_get_one_way_collision_direction(RID p_body) const;
- virtual void body_set_one_way_collision_max_depth(RID p_body,float p_max_depth);
+ virtual void body_set_one_way_collision_max_depth(RID p_body, float p_max_depth);
virtual float body_get_one_way_collision_max_depth(RID p_body) const;
+ virtual void body_set_force_integration_callback(RID p_body, Object *p_receiver, const StringName &p_method, const Variant &p_udata = Variant());
+ virtual bool body_collide_shape(RID p_body, int p_body_shape, RID p_shape, const Matrix32 &p_shape_xform, const Vector2 &p_motion, Vector2 *r_results, int p_result_max, int &r_result_count);
- virtual void body_set_force_integration_callback(RID p_body,Object *p_receiver,const StringName& p_method,const Variant& p_udata=Variant());
- virtual bool body_collide_shape(RID p_body, int p_body_shape,RID p_shape, const Matrix32& p_shape_xform,const Vector2& p_motion,Vector2 *r_results,int p_result_max,int &r_result_count);
-
- virtual void body_set_pickable(RID p_body,bool p_pickable);
-
- virtual bool body_test_motion(RID p_body,const Vector2& p_motion,float p_margin=0.001,MotionResult *r_result=NULL);
- virtual bool body_test_motion_from(RID p_body,const Matrix32& p_from,const Vector2& p_motion,float p_margin=0.001,MotionResult *r_result=NULL);
+ virtual void body_set_pickable(RID p_body, bool p_pickable);
+ virtual bool body_test_motion(RID p_body, const Vector2 &p_motion, float p_margin = 0.001, MotionResult *r_result = NULL);
+ virtual bool body_test_motion_from(RID p_body, const Matrix32 &p_from, const Vector2 &p_motion, float p_margin = 0.001, MotionResult *r_result = NULL);
/* JOINT API */
virtual void joint_set_param(RID p_joint, JointParam p_param, real_t p_value);
- virtual real_t joint_get_param(RID p_joint,JointParam p_param) const;
+ virtual real_t joint_get_param(RID p_joint, JointParam p_param) const;
- virtual RID pin_joint_create(const Vector2& p_pos,RID p_body_a,RID p_body_b=RID());
- virtual RID groove_joint_create(const Vector2& p_a_groove1,const Vector2& p_a_groove2, const Vector2& p_b_anchor, RID p_body_a,RID p_body_b);
- virtual RID damped_spring_joint_create(const Vector2& p_anchor_a,const Vector2& p_anchor_b,RID p_body_a,RID p_body_b=RID());
+ virtual RID pin_joint_create(const Vector2 &p_pos, RID p_body_a, RID p_body_b = RID());
+ virtual RID groove_joint_create(const Vector2 &p_a_groove1, const Vector2 &p_a_groove2, const Vector2 &p_b_anchor, RID p_body_a, RID p_body_b);
+ virtual RID damped_spring_joint_create(const Vector2 &p_anchor_a, const Vector2 &p_anchor_b, RID p_body_a, RID p_body_b = RID());
virtual void pin_joint_set_param(RID p_joint, PinJointParam p_param, real_t p_value);
virtual real_t pin_joint_get_param(RID p_joint, PinJointParam p_param) const;
virtual void damped_string_joint_set_param(RID p_joint, DampedStringParam p_param, real_t p_value);
@@ -271,8 +256,6 @@ public:
Physics2DServerSW();
~Physics2DServerSW();
-
};
#endif
-
diff --git a/servers/physics_2d/physics_2d_server_wrap_mt.cpp b/servers/physics_2d/physics_2d_server_wrap_mt.cpp
index 0242d1266..0192da368 100644
--- a/servers/physics_2d/physics_2d_server_wrap_mt.cpp
+++ b/servers/physics_2d/physics_2d_server_wrap_mt.cpp
@@ -32,35 +32,33 @@
void Physics2DServerWrapMT::thread_exit() {
- exit=true;
+ exit = true;
}
void Physics2DServerWrapMT::thread_step(float p_delta) {
physics_2d_server->step(p_delta);
step_sem->post();
-
}
void Physics2DServerWrapMT::_thread_callback(void *_instance) {
- Physics2DServerWrapMT *vsmt = reinterpret_cast<Physics2DServerWrapMT*>(_instance);
-
+ Physics2DServerWrapMT *vsmt = reinterpret_cast<Physics2DServerWrapMT *>(_instance);
vsmt->thread_loop();
}
void Physics2DServerWrapMT::thread_loop() {
- server_thread=Thread::get_caller_ID();
+ server_thread = Thread::get_caller_ID();
OS::get_singleton()->make_rendering_thread();
physics_2d_server->init();
- exit=false;
- step_thread_up=true;
- while(!exit) {
+ exit = false;
+ step_thread_up = true;
+ while (!exit) {
// flush commands one by one, until exit is requested
command_queue.wait_and_flush_one();
}
@@ -68,18 +66,15 @@ void Physics2DServerWrapMT::thread_loop() {
command_queue.flush_all(); // flush all
physics_2d_server->finish();
-
}
-
/* EVENT QUEUING */
-
void Physics2DServerWrapMT::step(float p_step) {
if (create_thread) {
- command_queue.push( this, &Physics2DServerWrapMT::thread_step,p_step);
+ command_queue.push(this, &Physics2DServerWrapMT::thread_step, p_step);
} else {
command_queue.flush_all(); //flush all pending from other threads
@@ -91,14 +86,14 @@ void Physics2DServerWrapMT::sync() {
if (step_sem) {
if (first_frame)
- first_frame=false;
+ first_frame = false;
else
step_sem->wait(); //must not wait if a step was not issued
}
physics_2d_server->sync();
}
-void Physics2DServerWrapMT::flush_queries(){
+void Physics2DServerWrapMT::flush_queries() {
physics_2d_server->flush_queries();
}
@@ -116,10 +111,10 @@ void Physics2DServerWrapMT::init() {
print_line("CREATING PHYSICS 2D THREAD");
//OS::get_singleton()->release_rendering_thread();
if (create_thread) {
- thread = Thread::create( _thread_callback, this );
+ thread = Thread::create(_thread_callback, this);
print_line("STARTING PHYISICS 2D THREAD");
}
- while(!step_thread_up) {
+ while (!step_thread_up) {
OS::get_singleton()->delay_usec(1000);
}
print_line("DONE PHYSICS 2D THREAD");
@@ -127,19 +122,17 @@ void Physics2DServerWrapMT::init() {
physics_2d_server->init();
}
-
}
void Physics2DServerWrapMT::finish() {
-
if (thread) {
- command_queue.push( this, &Physics2DServerWrapMT::thread_exit);
- Thread::wait_to_finish( thread );
+ command_queue.push(this, &Physics2DServerWrapMT::thread_exit);
+ Thread::wait_to_finish(thread);
memdelete(thread);
-/*
+ /*
shape_free_cached_ids();
area_free_cached_ids();
body_free_cached_ids();
@@ -147,51 +140,46 @@ void Physics2DServerWrapMT::finish() {
groove_joint_free_cached_ids();
damped_string_free_cached_ids();
*/
- thread=NULL;
+ thread = NULL;
} else {
physics_2d_server->finish();
}
if (step_sem)
memdelete(step_sem);
-
}
+Physics2DServerWrapMT::Physics2DServerWrapMT(Physics2DServer *p_contained, bool p_create_thread)
+ : command_queue(p_create_thread) {
-Physics2DServerWrapMT::Physics2DServerWrapMT(Physics2DServer* p_contained,bool p_create_thread) : command_queue(p_create_thread) {
-
- physics_2d_server=p_contained;
- create_thread=p_create_thread;
- thread=NULL;
- step_sem=NULL;
- step_pending=0;
- step_thread_up=false;
- alloc_mutex=Mutex::create();
+ physics_2d_server = p_contained;
+ create_thread = p_create_thread;
+ thread = NULL;
+ step_sem = NULL;
+ step_pending = 0;
+ step_thread_up = false;
+ alloc_mutex = Mutex::create();
- shape_pool_max_size=GLOBAL_DEF("core/thread_rid_pool_prealloc",20);
- area_pool_max_size=GLOBAL_DEF("core/thread_rid_pool_prealloc",20);
- body_pool_max_size=GLOBAL_DEF("core/thread_rid_pool_prealloc",20);
- pin_joint_pool_max_size=GLOBAL_DEF("core/thread_rid_pool_prealloc",20);
- groove_joint_pool_max_size=GLOBAL_DEF("core/thread_rid_pool_prealloc",20);
- damped_spring_joint_pool_max_size=GLOBAL_DEF("core/thread_rid_pool_prealloc",20);
+ shape_pool_max_size = GLOBAL_DEF("core/thread_rid_pool_prealloc", 20);
+ area_pool_max_size = GLOBAL_DEF("core/thread_rid_pool_prealloc", 20);
+ body_pool_max_size = GLOBAL_DEF("core/thread_rid_pool_prealloc", 20);
+ pin_joint_pool_max_size = GLOBAL_DEF("core/thread_rid_pool_prealloc", 20);
+ groove_joint_pool_max_size = GLOBAL_DEF("core/thread_rid_pool_prealloc", 20);
+ damped_spring_joint_pool_max_size = GLOBAL_DEF("core/thread_rid_pool_prealloc", 20);
if (!p_create_thread) {
- server_thread=Thread::get_caller_ID();
+ server_thread = Thread::get_caller_ID();
} else {
- server_thread=0;
+ server_thread = 0;
}
main_thread = Thread::get_caller_ID();
- first_frame=true;
+ first_frame = true;
}
-
Physics2DServerWrapMT::~Physics2DServerWrapMT() {
memdelete(physics_2d_server);
memdelete(alloc_mutex);
//finish();
-
}
-
-
diff --git a/servers/physics_2d/physics_2d_server_wrap_mt.h b/servers/physics_2d/physics_2d_server_wrap_mt.h
index 160991967..63312be5c 100644
--- a/servers/physics_2d/physics_2d_server_wrap_mt.h
+++ b/servers/physics_2d/physics_2d_server_wrap_mt.h
@@ -29,19 +29,17 @@
#ifndef PHYSICS2DSERVERWRAPMT_H
#define PHYSICS2DSERVERWRAPMT_H
-
-#include "servers/physics_2d_server.h"
#include "command_queue_mt.h"
-#include "os/thread.h"
#include "globals.h"
+#include "os/thread.h"
+#include "servers/physics_2d_server.h"
#ifdef DEBUG_SYNC
-#define SYNC_DEBUG print_line("sync on: "+String(__FUNCTION__));
+#define SYNC_DEBUG print_line("sync on: " + String(__FUNCTION__));
#else
#define SYNC_DEBUG
#endif
-
class Physics2DServerWrapMT : public Physics2DServer {
mutable Physics2DServer *physics_2d_server;
@@ -65,7 +63,7 @@ class Physics2DServerWrapMT : public Physics2DServer {
void thread_exit();
- Mutex*alloc_mutex;
+ Mutex *alloc_mutex;
bool first_frame;
int shape_pool_max_size;
@@ -81,232 +79,215 @@ class Physics2DServerWrapMT : public Physics2DServer {
int damped_spring_joint_pool_max_size;
List<RID> damped_spring_joint_id_pool;
-
public:
-
#define ServerName Physics2DServer
#define ServerNameWrapMT Physics2DServerWrapMT
#define server_name physics_2d_server
#include "servers/server_wrap_mt_common.h"
//FUNC1RID(shape,ShapeType); todo fix
- FUNC1R(RID,shape_create,ShapeType);
- FUNC2(shape_set_data,RID,const Variant& );
- FUNC2(shape_set_custom_solver_bias,RID,real_t );
-
- FUNC1RC(ShapeType,shape_get_type,RID );
- FUNC1RC(Variant,shape_get_data,RID);
- FUNC1RC(real_t,shape_get_custom_solver_bias,RID);
+ FUNC1R(RID, shape_create, ShapeType);
+ FUNC2(shape_set_data, RID, const Variant &);
+ FUNC2(shape_set_custom_solver_bias, RID, real_t);
+ FUNC1RC(ShapeType, shape_get_type, RID);
+ FUNC1RC(Variant, shape_get_data, RID);
+ FUNC1RC(real_t, shape_get_custom_solver_bias, RID);
//these work well, but should be used from the main thread only
- bool shape_collide(RID p_shape_A, const Matrix32& p_xform_A,const Vector2& p_motion_A,RID p_shape_B, const Matrix32& p_xform_B, const Vector2& p_motion_B,Vector2 *r_results,int p_result_max,int &r_result_count) {
+ bool shape_collide(RID p_shape_A, const Matrix32 &p_xform_A, const Vector2 &p_motion_A, RID p_shape_B, const Matrix32 &p_xform_B, const Vector2 &p_motion_B, Vector2 *r_results, int p_result_max, int &r_result_count) {
- ERR_FAIL_COND_V(main_thread!=Thread::get_caller_ID(),false);
- return physics_2d_server->shape_collide(p_shape_A,p_xform_A,p_motion_A,p_shape_B,p_xform_B,p_motion_B,r_results,p_result_max,r_result_count);
+ ERR_FAIL_COND_V(main_thread != Thread::get_caller_ID(), false);
+ return physics_2d_server->shape_collide(p_shape_A, p_xform_A, p_motion_A, p_shape_B, p_xform_B, p_motion_B, r_results, p_result_max, r_result_count);
}
/* SPACE API */
- FUNC0R(RID,space_create);
- FUNC2(space_set_active,RID,bool);
- FUNC1RC(bool,space_is_active,RID);
+ FUNC0R(RID, space_create);
+ FUNC2(space_set_active, RID, bool);
+ FUNC1RC(bool, space_is_active, RID);
- FUNC3(space_set_param,RID,SpaceParameter,real_t);
- FUNC2RC(real_t,space_get_param,RID,SpaceParameter);
+ FUNC3(space_set_param, RID, SpaceParameter, real_t);
+ FUNC2RC(real_t, space_get_param, RID, SpaceParameter);
// this function only works on fixed process, errors and returns null otherwise
- Physics2DDirectSpaceState* space_get_direct_state(RID p_space) {
+ Physics2DDirectSpaceState *space_get_direct_state(RID p_space) {
- ERR_FAIL_COND_V(main_thread!=Thread::get_caller_ID(),NULL);
+ ERR_FAIL_COND_V(main_thread != Thread::get_caller_ID(), NULL);
return physics_2d_server->space_get_direct_state(p_space);
}
- FUNC2(space_set_debug_contacts,RID,int);
+ FUNC2(space_set_debug_contacts, RID, int);
virtual Vector<Vector2> space_get_contacts(RID p_space) const {
- ERR_FAIL_COND_V(main_thread!=Thread::get_caller_ID(),Vector<Vector2>());
+ ERR_FAIL_COND_V(main_thread != Thread::get_caller_ID(), Vector<Vector2>());
return physics_2d_server->space_get_contacts(p_space);
-
}
virtual int space_get_contact_count(RID p_space) const {
- ERR_FAIL_COND_V(main_thread!=Thread::get_caller_ID(),0);
+ ERR_FAIL_COND_V(main_thread != Thread::get_caller_ID(), 0);
return physics_2d_server->space_get_contact_count(p_space);
-
}
-
-
/* AREA API */
//FUNC0RID(area);
- FUNC0R(RID,area_create);
-
- FUNC2(area_set_space,RID,RID);
- FUNC1RC(RID,area_get_space,RID);
+ FUNC0R(RID, area_create);
- FUNC2(area_set_space_override_mode,RID,AreaSpaceOverrideMode);
- FUNC1RC(AreaSpaceOverrideMode,area_get_space_override_mode,RID);
+ FUNC2(area_set_space, RID, RID);
+ FUNC1RC(RID, area_get_space, RID);
- FUNC3(area_add_shape,RID,RID,const Matrix32&);
- FUNC3(area_set_shape,RID,int,RID);
- FUNC3(area_set_shape_transform,RID,int,const Matrix32&);
+ FUNC2(area_set_space_override_mode, RID, AreaSpaceOverrideMode);
+ FUNC1RC(AreaSpaceOverrideMode, area_get_space_override_mode, RID);
- FUNC1RC(int,area_get_shape_count,RID);
- FUNC2RC(RID,area_get_shape,RID,int);
- FUNC2RC(Matrix32,area_get_shape_transform,RID,int);
- FUNC2(area_remove_shape,RID,int);
- FUNC1(area_clear_shapes,RID);
+ FUNC3(area_add_shape, RID, RID, const Matrix32 &);
+ FUNC3(area_set_shape, RID, int, RID);
+ FUNC3(area_set_shape_transform, RID, int, const Matrix32 &);
- FUNC2(area_attach_object_instance_ID,RID,ObjectID);
- FUNC1RC(ObjectID,area_get_object_instance_ID,RID);
+ FUNC1RC(int, area_get_shape_count, RID);
+ FUNC2RC(RID, area_get_shape, RID, int);
+ FUNC2RC(Matrix32, area_get_shape_transform, RID, int);
+ FUNC2(area_remove_shape, RID, int);
+ FUNC1(area_clear_shapes, RID);
- FUNC3(area_set_param,RID,AreaParameter,const Variant&);
- FUNC2(area_set_transform,RID,const Matrix32&);
+ FUNC2(area_attach_object_instance_ID, RID, ObjectID);
+ FUNC1RC(ObjectID, area_get_object_instance_ID, RID);
- FUNC2RC(Variant,area_get_param,RID,AreaParameter);
- FUNC1RC(Matrix32,area_get_transform,RID);
+ FUNC3(area_set_param, RID, AreaParameter, const Variant &);
+ FUNC2(area_set_transform, RID, const Matrix32 &);
- FUNC2(area_set_collision_mask,RID,uint32_t);
- FUNC2(area_set_layer_mask,RID,uint32_t);
+ FUNC2RC(Variant, area_get_param, RID, AreaParameter);
+ FUNC1RC(Matrix32, area_get_transform, RID);
- FUNC2(area_set_monitorable,RID,bool);
- FUNC2(area_set_pickable,RID,bool);
+ FUNC2(area_set_collision_mask, RID, uint32_t);
+ FUNC2(area_set_layer_mask, RID, uint32_t);
- FUNC3(area_set_monitor_callback,RID,Object*,const StringName&);
- FUNC3(area_set_area_monitor_callback,RID,Object*,const StringName&);
+ FUNC2(area_set_monitorable, RID, bool);
+ FUNC2(area_set_pickable, RID, bool);
+ FUNC3(area_set_monitor_callback, RID, Object *, const StringName &);
+ FUNC3(area_set_area_monitor_callback, RID, Object *, const StringName &);
/* BODY API */
//FUNC2RID(body,BodyMode,bool);
- FUNC2R(RID,body_create,BodyMode,bool)
+ FUNC2R(RID, body_create, BodyMode, bool)
- FUNC2(body_set_space,RID,RID);
- FUNC1RC(RID,body_get_space,RID);
+ FUNC2(body_set_space, RID, RID);
+ FUNC1RC(RID, body_get_space, RID);
- FUNC2(body_set_mode,RID,BodyMode);
- FUNC1RC(BodyMode,body_get_mode,RID);
+ FUNC2(body_set_mode, RID, BodyMode);
+ FUNC1RC(BodyMode, body_get_mode, RID);
+ FUNC3(body_add_shape, RID, RID, const Matrix32 &);
+ FUNC3(body_set_shape, RID, int, RID);
+ FUNC3(body_set_shape_transform, RID, int, const Matrix32 &);
+ FUNC3(body_set_shape_metadata, RID, int, const Variant &);
- FUNC3(body_add_shape,RID,RID,const Matrix32&);
- FUNC3(body_set_shape,RID,int,RID);
- FUNC3(body_set_shape_transform,RID,int,const Matrix32&);
- FUNC3(body_set_shape_metadata,RID,int,const Variant&);
+ FUNC1RC(int, body_get_shape_count, RID);
+ FUNC2RC(Matrix32, body_get_shape_transform, RID, int);
+ FUNC2RC(Variant, body_get_shape_metadata, RID, int);
+ FUNC2RC(RID, body_get_shape, RID, int);
- FUNC1RC(int,body_get_shape_count,RID);
- FUNC2RC(Matrix32,body_get_shape_transform,RID,int);
- FUNC2RC(Variant,body_get_shape_metadata,RID,int);
- FUNC2RC(RID,body_get_shape,RID,int);
+ FUNC3(body_set_shape_as_trigger, RID, int, bool);
+ FUNC2RC(bool, body_is_shape_set_as_trigger, RID, int);
- FUNC3(body_set_shape_as_trigger,RID,int,bool);
- FUNC2RC(bool,body_is_shape_set_as_trigger,RID,int);
+ FUNC2(body_remove_shape, RID, int);
+ FUNC1(body_clear_shapes, RID);
- FUNC2(body_remove_shape,RID,int);
- FUNC1(body_clear_shapes,RID);
+ FUNC2(body_attach_object_instance_ID, RID, uint32_t);
+ FUNC1RC(uint32_t, body_get_object_instance_ID, RID);
- FUNC2(body_attach_object_instance_ID,RID,uint32_t);
- FUNC1RC(uint32_t,body_get_object_instance_ID,RID);
+ FUNC2(body_set_continuous_collision_detection_mode, RID, CCDMode);
+ FUNC1RC(CCDMode, body_get_continuous_collision_detection_mode, RID);
- FUNC2(body_set_continuous_collision_detection_mode,RID,CCDMode);
- FUNC1RC(CCDMode,body_get_continuous_collision_detection_mode,RID);
+ FUNC2(body_set_layer_mask, RID, uint32_t);
+ FUNC1RC(uint32_t, body_get_layer_mask, RID);
- FUNC2(body_set_layer_mask,RID,uint32_t);
- FUNC1RC(uint32_t,body_get_layer_mask,RID);
+ FUNC2(body_set_collision_mask, RID, uint32_t);
+ FUNC1RC(uint32_t, body_get_collision_mask, RID);
- FUNC2(body_set_collision_mask,RID,uint32_t);
- FUNC1RC(uint32_t,body_get_collision_mask,RID);
+ FUNC3(body_set_param, RID, BodyParameter, float);
+ FUNC2RC(float, body_get_param, RID, BodyParameter);
+ FUNC3(body_set_state, RID, BodyState, const Variant &);
+ FUNC2RC(Variant, body_get_state, RID, BodyState);
- FUNC3(body_set_param,RID,BodyParameter,float);
- FUNC2RC(float,body_get_param,RID,BodyParameter);
+ FUNC2(body_set_applied_force, RID, const Vector2 &);
+ FUNC1RC(Vector2, body_get_applied_force, RID);
+ FUNC2(body_set_applied_torque, RID, float);
+ FUNC1RC(float, body_get_applied_torque, RID);
- FUNC3(body_set_state,RID,BodyState,const Variant&);
- FUNC2RC(Variant,body_get_state,RID,BodyState);
+ FUNC3(body_add_force, RID, const Vector2 &, const Vector2 &);
+ FUNC3(body_apply_impulse, RID, const Vector2 &, const Vector2 &);
+ FUNC2(body_set_axis_velocity, RID, const Vector2 &);
- FUNC2(body_set_applied_force,RID,const Vector2&);
- FUNC1RC(Vector2,body_get_applied_force,RID);
+ FUNC2(body_add_collision_exception, RID, RID);
+ FUNC2(body_remove_collision_exception, RID, RID);
+ FUNC2S(body_get_collision_exceptions, RID, List<RID> *);
- FUNC2(body_set_applied_torque,RID,float);
- FUNC1RC(float,body_get_applied_torque,RID);
+ FUNC2(body_set_max_contacts_reported, RID, int);
+ FUNC1RC(int, body_get_max_contacts_reported, RID);
- FUNC3(body_add_force,RID,const Vector2&,const Vector2&);
- FUNC3(body_apply_impulse,RID,const Vector2&,const Vector2&);
- FUNC2(body_set_axis_velocity,RID,const Vector2&);
+ FUNC2(body_set_one_way_collision_direction, RID, const Vector2 &);
+ FUNC1RC(Vector2, body_get_one_way_collision_direction, RID);
- FUNC2(body_add_collision_exception,RID,RID);
- FUNC2(body_remove_collision_exception,RID,RID);
- FUNC2S(body_get_collision_exceptions,RID,List<RID>*);
+ FUNC2(body_set_one_way_collision_max_depth, RID, float);
+ FUNC1RC(float, body_get_one_way_collision_max_depth, RID);
- FUNC2(body_set_max_contacts_reported,RID,int);
- FUNC1RC(int,body_get_max_contacts_reported,RID);
+ FUNC2(body_set_contacts_reported_depth_treshold, RID, float);
+ FUNC1RC(float, body_get_contacts_reported_depth_treshold, RID);
- FUNC2(body_set_one_way_collision_direction,RID,const Vector2&);
- FUNC1RC(Vector2,body_get_one_way_collision_direction,RID);
+ FUNC2(body_set_omit_force_integration, RID, bool);
+ FUNC1RC(bool, body_is_omitting_force_integration, RID);
- FUNC2(body_set_one_way_collision_max_depth,RID,float);
- FUNC1RC(float,body_get_one_way_collision_max_depth,RID);
+ FUNC4(body_set_force_integration_callback, RID, Object *, const StringName &, const Variant &);
-
- FUNC2(body_set_contacts_reported_depth_treshold,RID,float);
- FUNC1RC(float,body_get_contacts_reported_depth_treshold,RID);
-
- FUNC2(body_set_omit_force_integration,RID,bool);
- FUNC1RC(bool,body_is_omitting_force_integration,RID);
-
- FUNC4(body_set_force_integration_callback,RID ,Object *,const StringName& ,const Variant& );
-
-
- bool body_collide_shape(RID p_body, int p_body_shape,RID p_shape, const Matrix32& p_shape_xform,const Vector2& p_motion,Vector2 *r_results,int p_result_max,int &r_result_count) {
- return physics_2d_server->body_collide_shape(p_body,p_body_shape,p_shape,p_shape_xform,p_motion,r_results,p_result_max,r_result_count);
+ bool body_collide_shape(RID p_body, int p_body_shape, RID p_shape, const Matrix32 &p_shape_xform, const Vector2 &p_motion, Vector2 *r_results, int p_result_max, int &r_result_count) {
+ return physics_2d_server->body_collide_shape(p_body, p_body_shape, p_shape, p_shape_xform, p_motion, r_results, p_result_max, r_result_count);
}
- FUNC2(body_set_pickable,RID,bool);
+ FUNC2(body_set_pickable, RID, bool);
- bool body_test_motion(RID p_body,const Vector2& p_motion,float p_margin=0.001,MotionResult *r_result=NULL) {
+ bool body_test_motion(RID p_body, const Vector2 &p_motion, float p_margin = 0.001, MotionResult *r_result = NULL) {
- ERR_FAIL_COND_V(main_thread!=Thread::get_caller_ID(),false);
- return physics_2d_server->body_test_motion(p_body,p_motion,p_margin,r_result);
+ ERR_FAIL_COND_V(main_thread != Thread::get_caller_ID(), false);
+ return physics_2d_server->body_test_motion(p_body, p_motion, p_margin, r_result);
}
- bool body_test_motion_from(RID p_body,const Matrix32& p_from,const Vector2& p_motion,float p_margin=0.001,MotionResult *r_result=NULL) {
+ bool body_test_motion_from(RID p_body, const Matrix32 &p_from, const Vector2 &p_motion, float p_margin = 0.001, MotionResult *r_result = NULL) {
- ERR_FAIL_COND_V(main_thread!=Thread::get_caller_ID(),false);
- return physics_2d_server->body_test_motion_from(p_body,p_from,p_motion,p_margin,r_result);
+ ERR_FAIL_COND_V(main_thread != Thread::get_caller_ID(), false);
+ return physics_2d_server->body_test_motion_from(p_body, p_from, p_motion, p_margin, r_result);
}
/* JOINT API */
-
- FUNC3(joint_set_param,RID,JointParam,real_t);
- FUNC2RC(real_t,joint_get_param,RID,JointParam);
-
+ FUNC3(joint_set_param, RID, JointParam, real_t);
+ FUNC2RC(real_t, joint_get_param, RID, JointParam);
///FUNC3RID(pin_joint,const Vector2&,RID,RID);
///FUNC5RID(groove_joint,const Vector2&,const Vector2&,const Vector2&,RID,RID);
///FUNC4RID(damped_spring_joint,const Vector2&,const Vector2&,RID,RID);
- FUNC3R(RID,pin_joint_create,const Vector2&,RID,RID);
- FUNC5R(RID,groove_joint_create,const Vector2&,const Vector2&,const Vector2&,RID,RID);
- FUNC4R(RID,damped_spring_joint_create,const Vector2&,const Vector2&,RID,RID);
+ FUNC3R(RID, pin_joint_create, const Vector2 &, RID, RID);
+ FUNC5R(RID, groove_joint_create, const Vector2 &, const Vector2 &, const Vector2 &, RID, RID);
+ FUNC4R(RID, damped_spring_joint_create, const Vector2 &, const Vector2 &, RID, RID);
- FUNC3(pin_joint_set_param,RID,PinJointParam,real_t);
- FUNC2RC(real_t,pin_joint_get_param,RID,PinJointParam);
+ FUNC3(pin_joint_set_param, RID, PinJointParam, real_t);
+ FUNC2RC(real_t, pin_joint_get_param, RID, PinJointParam);
- FUNC3(damped_string_joint_set_param,RID,DampedStringParam,real_t);
- FUNC2RC(real_t,damped_string_joint_get_param,RID,DampedStringParam);
-
- FUNC1RC(JointType,joint_get_type,RID);
+ FUNC3(damped_string_joint_set_param, RID, DampedStringParam, real_t);
+ FUNC2RC(real_t, damped_string_joint_get_param, RID, DampedStringParam);
+ FUNC1RC(JointType, joint_get_type, RID);
/* MISC */
-
- FUNC1(free,RID);
- FUNC1(set_active,bool);
+ FUNC1(free, RID);
+ FUNC1(set_active, bool);
virtual void init();
virtual void step(float p_step);
@@ -319,28 +300,24 @@ public:
return physics_2d_server->get_process_info(p_info);
}
- Physics2DServerWrapMT(Physics2DServer* p_contained,bool p_create_thread);
+ Physics2DServerWrapMT(Physics2DServer *p_contained, bool p_create_thread);
~Physics2DServerWrapMT();
+ template <class T>
+ static Physics2DServer *init_server() {
- template<class T>
- static Physics2DServer* init_server() {
-
- int tm = GLOBAL_DEF("physics_2d/thread_model",1);
- if (tm==0) //single unsafe
- return memnew( T );
- else if (tm==1) //single saef
- return memnew( Physics2DServerWrapMT( memnew( T ), false ));
+ int tm = GLOBAL_DEF("physics_2d/thread_model", 1);
+ if (tm == 0) //single unsafe
+ return memnew(T);
+ else if (tm == 1) //single saef
+ return memnew(Physics2DServerWrapMT(memnew(T), false));
else //single unsafe
- return memnew( Physics2DServerWrapMT( memnew( T ), true ));
-
-
+ return memnew(Physics2DServerWrapMT(memnew(T), true));
}
#undef ServerNameWrapMT
#undef ServerName
#undef server_name
-
};
#ifdef DEBUG_SYNC
diff --git a/servers/physics_2d/shape_2d_sw.cpp b/servers/physics_2d/shape_2d_sw.cpp
index 6506349ea..c438908ca 100644
--- a/servers/physics_2d/shape_2d_sw.cpp
+++ b/servers/physics_2d/shape_2d_sw.cpp
@@ -30,108 +30,98 @@
#include "geometry.h"
#include "sort.h"
-
-
-void Shape2DSW::configure(const Rect2& p_aabb) {
- aabb=p_aabb;
- configured=true;
- for (Map<ShapeOwner2DSW*,int>::Element *E=owners.front();E;E=E->next()) {
- ShapeOwner2DSW* co=(ShapeOwner2DSW*)E->key();
+void Shape2DSW::configure(const Rect2 &p_aabb) {
+ aabb = p_aabb;
+ configured = true;
+ for (Map<ShapeOwner2DSW *, int>::Element *E = owners.front(); E; E = E->next()) {
+ ShapeOwner2DSW *co = (ShapeOwner2DSW *)E->key();
co->_shape_changed();
}
}
-
-Vector2 Shape2DSW::get_support(const Vector2& p_normal) const {
+Vector2 Shape2DSW::get_support(const Vector2 &p_normal) const {
Vector2 res[2];
int amnt;
- get_supports(p_normal,res,amnt);
+ get_supports(p_normal, res, amnt);
return res[0];
}
void Shape2DSW::add_owner(ShapeOwner2DSW *p_owner) {
- Map<ShapeOwner2DSW*,int>::Element *E=owners.find(p_owner);
+ Map<ShapeOwner2DSW *, int>::Element *E = owners.find(p_owner);
if (E) {
E->get()++;
} else {
- owners[p_owner]=1;
+ owners[p_owner] = 1;
}
}
-void Shape2DSW::remove_owner(ShapeOwner2DSW *p_owner){
+void Shape2DSW::remove_owner(ShapeOwner2DSW *p_owner) {
- Map<ShapeOwner2DSW*,int>::Element *E=owners.find(p_owner);
+ Map<ShapeOwner2DSW *, int>::Element *E = owners.find(p_owner);
ERR_FAIL_COND(!E);
E->get()--;
- if (E->get()==0) {
+ if (E->get() == 0) {
owners.erase(E);
}
-
}
-bool Shape2DSW::is_owner(ShapeOwner2DSW *p_owner) const{
+bool Shape2DSW::is_owner(ShapeOwner2DSW *p_owner) const {
return owners.has(p_owner);
-
}
-const Map<ShapeOwner2DSW*,int>& Shape2DSW::get_owners() const{
+const Map<ShapeOwner2DSW *, int> &Shape2DSW::get_owners() const {
return owners;
}
-
Shape2DSW::Shape2DSW() {
- custom_bias=0;
- configured=false;
+ custom_bias = 0;
+ configured = false;
}
-
Shape2DSW::~Shape2DSW() {
ERR_FAIL_COND(owners.size());
}
-
/*********************************************************/
/*********************************************************/
/*********************************************************/
+void LineShape2DSW::get_supports(const Vector2 &p_normal, Vector2 *r_supports, int &r_amount) const {
-
-void LineShape2DSW::get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const {
-
- r_amount=0;
+ r_amount = 0;
}
-bool LineShape2DSW::contains_point(const Vector2& p_point) const {
+bool LineShape2DSW::contains_point(const Vector2 &p_point) const {
return normal.dot(p_point) < d;
}
-bool LineShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const {
+bool LineShape2DSW::intersect_segment(const Vector2 &p_begin, const Vector2 &p_end, Vector2 &r_point, Vector2 &r_normal) const {
- Vector2 segment= p_begin - p_end;
- real_t den=normal.dot( segment );
+ Vector2 segment = p_begin - p_end;
+ real_t den = normal.dot(segment);
//printf("den is %i\n",den);
- if (Math::abs(den)<=CMP_EPSILON) {
+ if (Math::abs(den) <= CMP_EPSILON) {
return false;
}
- real_t dist=(normal.dot( p_begin ) - d) / den;
+ real_t dist = (normal.dot(p_begin) - d) / den;
//printf("dist is %i\n",dist);
- if (dist<-CMP_EPSILON || dist > (1.0 +CMP_EPSILON)) {
+ if (dist < -CMP_EPSILON || dist > (1.0 + CMP_EPSILON)) {
return false;
}
r_point = p_begin + segment * -dist;
- r_normal=normal;
+ r_normal = normal;
return true;
}
@@ -141,24 +131,22 @@ real_t LineShape2DSW::get_moment_of_inertia(float p_mass, const Size2 &p_scale)
return 0;
}
+void LineShape2DSW::set_data(const Variant &p_data) {
-void LineShape2DSW::set_data(const Variant& p_data) {
-
- ERR_FAIL_COND(p_data.get_type()!=Variant::ARRAY);
+ ERR_FAIL_COND(p_data.get_type() != Variant::ARRAY);
Array arr = p_data;
- ERR_FAIL_COND(arr.size()!=2);
- normal=arr[0];
- d=arr[1];
- configure(Rect2(Vector2(-1e4,-1e4),Vector2(1e4*2,1e4*2)));
-
+ ERR_FAIL_COND(arr.size() != 2);
+ normal = arr[0];
+ d = arr[1];
+ configure(Rect2(Vector2(-1e4, -1e4), Vector2(1e4 * 2, 1e4 * 2)));
}
Variant LineShape2DSW::get_data() const {
Array arr;
arr.resize(2);
- arr[0]=normal;
- arr[1]=d;
+ arr[0] = normal;
+ arr[1] = d;
return arr;
}
@@ -166,29 +154,24 @@ Variant LineShape2DSW::get_data() const {
/*********************************************************/
/*********************************************************/
+void RayShape2DSW::get_supports(const Vector2 &p_normal, Vector2 *r_supports, int &r_amount) const {
+ r_amount = 1;
-void RayShape2DSW::get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const {
-
-
- r_amount=1;
-
- if (p_normal.y>0)
- *r_supports=Vector2(0,length);
+ if (p_normal.y > 0)
+ *r_supports = Vector2(0, length);
else
- *r_supports=Vector2();
-
+ *r_supports = Vector2();
}
-bool RayShape2DSW::contains_point(const Vector2& p_point) const {
+bool RayShape2DSW::contains_point(const Vector2 &p_point) const {
return false;
}
-bool RayShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const {
+bool RayShape2DSW::intersect_segment(const Vector2 &p_begin, const Vector2 &p_end, Vector2 &r_point, Vector2 &r_normal) const {
return false; //rays can't be intersected
-
}
real_t RayShape2DSW::get_moment_of_inertia(float p_mass, const Size2 &p_scale) const {
@@ -196,10 +179,10 @@ real_t RayShape2DSW::get_moment_of_inertia(float p_mass, const Size2 &p_scale) c
return 0; //rays are mass-less
}
-void RayShape2DSW::set_data(const Variant& p_data) {
+void RayShape2DSW::set_data(const Variant &p_data) {
- length=p_data;
- configure(Rect2(0,0,0.001,length));
+ length = p_data;
+ configure(Rect2(0, 0, 0.001, length));
}
Variant RayShape2DSW::get_data() const {
@@ -207,46 +190,41 @@ Variant RayShape2DSW::get_data() const {
return length;
}
-
/*********************************************************/
/*********************************************************/
/*********************************************************/
+void SegmentShape2DSW::get_supports(const Vector2 &p_normal, Vector2 *r_supports, int &r_amount) const {
-
-void SegmentShape2DSW::get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const {
-
- if (Math::abs(p_normal.dot(n))>_SEGMENT_IS_VALID_SUPPORT_TRESHOLD) {
- r_supports[0]=a;
- r_supports[1]=b;
- r_amount=2;
+ if (Math::abs(p_normal.dot(n)) > _SEGMENT_IS_VALID_SUPPORT_TRESHOLD) {
+ r_supports[0] = a;
+ r_supports[1] = b;
+ r_amount = 2;
return;
-
}
- float dp=p_normal.dot(b-a);
- if (dp>0)
- *r_supports=b;
+ float dp = p_normal.dot(b - a);
+ if (dp > 0)
+ *r_supports = b;
else
- *r_supports=a;
- r_amount=1;
-
+ *r_supports = a;
+ r_amount = 1;
}
-bool SegmentShape2DSW::contains_point(const Vector2& p_point) const {
+bool SegmentShape2DSW::contains_point(const Vector2 &p_point) const {
return false;
}
-bool SegmentShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const {
+bool SegmentShape2DSW::intersect_segment(const Vector2 &p_begin, const Vector2 &p_end, Vector2 &r_point, Vector2 &r_normal) const {
- if (!Geometry::segment_intersects_segment_2d(p_begin,p_end,a,b,&r_point))
+ if (!Geometry::segment_intersects_segment_2d(p_begin, p_end, a, b, &r_point))
return false;
if (n.dot(p_begin) > n.dot(a)) {
- r_normal=n;
+ r_normal = n;
} else {
- r_normal=-n;
+ r_normal = -n;
}
return true;
@@ -254,38 +232,38 @@ bool SegmentShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p
real_t SegmentShape2DSW::get_moment_of_inertia(float p_mass, const Size2 &p_scale) const {
- Vector2 s[2]={a*p_scale,b*p_scale};
+ Vector2 s[2] = { a * p_scale, b * p_scale };
real_t l = s[1].distance_to(s[0]);
- Vector2 ofs = (s[0]+s[1])*0.5;
+ Vector2 ofs = (s[0] + s[1]) * 0.5;
- return p_mass*(l*l/12.0f + ofs.length_squared());
+ return p_mass * (l * l / 12.0f + ofs.length_squared());
}
-void SegmentShape2DSW::set_data(const Variant& p_data) {
+void SegmentShape2DSW::set_data(const Variant &p_data) {
- ERR_FAIL_COND(p_data.get_type()!=Variant::RECT2);
+ ERR_FAIL_COND(p_data.get_type() != Variant::RECT2);
Rect2 r = p_data;
- a=r.pos;
- b=r.size;
- n=(b-a).tangent();
+ a = r.pos;
+ b = r.size;
+ n = (b - a).tangent();
Rect2 aabb;
- aabb.pos=a;
+ aabb.pos = a;
aabb.expand_to(b);
- if (aabb.size.x==0)
- aabb.size.x=0.001;
- if (aabb.size.y==0)
- aabb.size.y=0.001;
+ if (aabb.size.x == 0)
+ aabb.size.x = 0.001;
+ if (aabb.size.y == 0)
+ aabb.size.y = 0.001;
configure(aabb);
}
Variant SegmentShape2DSW::get_data() const {
Rect2 r;
- r.pos=a;
- r.size=b;
+ r.pos = a;
+ r.size = b;
return r;
}
@@ -293,24 +271,18 @@ Variant SegmentShape2DSW::get_data() const {
/*********************************************************/
/*********************************************************/
+void CircleShape2DSW::get_supports(const Vector2 &p_normal, Vector2 *r_supports, int &r_amount) const {
-
-void CircleShape2DSW::get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const {
-
- r_amount=1;
- *r_supports=p_normal*radius;
-
+ r_amount = 1;
+ *r_supports = p_normal * radius;
}
+bool CircleShape2DSW::contains_point(const Vector2 &p_point) const {
-bool CircleShape2DSW::contains_point(const Vector2& p_point) const {
-
- return p_point.length_squared() < radius*radius;
+ return p_point.length_squared() < radius * radius;
}
-
-bool CircleShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const {
-
+bool CircleShape2DSW::intersect_segment(const Vector2 &p_begin, const Vector2 &p_end, Vector2 &r_point, Vector2 &r_normal) const {
Vector2 line_vec = p_end - p_begin;
@@ -320,33 +292,32 @@ bool CircleShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_
b = 2 * p_begin.dot(line_vec);
c = p_begin.dot(p_begin) - radius * radius;
- real_t sqrtterm = b*b - 4*a*c;
+ real_t sqrtterm = b * b - 4 * a * c;
- if(sqrtterm < 0)
+ if (sqrtterm < 0)
return false;
sqrtterm = Math::sqrt(sqrtterm);
- real_t res = ( -b - sqrtterm ) / (2 * a);
+ real_t res = (-b - sqrtterm) / (2 * a);
- if (res <0 || res >1+CMP_EPSILON) {
+ if (res < 0 || res > 1 + CMP_EPSILON) {
return false;
}
- r_point=p_begin+line_vec*res;
- r_normal=r_point.normalized();
+ r_point = p_begin + line_vec * res;
+ r_normal = r_point.normalized();
return true;
}
real_t CircleShape2DSW::get_moment_of_inertia(float p_mass, const Size2 &p_scale) const {
- return (radius*radius)*(p_scale.x*0.5+p_scale.y*0.5);
-
+ return (radius * radius) * (p_scale.x * 0.5 + p_scale.y * 0.5);
}
-void CircleShape2DSW::set_data(const Variant& p_data) {
+void CircleShape2DSW::set_data(const Variant &p_data) {
ERR_FAIL_COND(!p_data.is_num());
- radius=p_data;
- configure(Rect2(-radius,-radius,radius*2,radius*2));
+ radius = p_data;
+ configure(Rect2(-radius, -radius, radius * 2, radius * 2));
}
Variant CircleShape2DSW::get_data() const {
@@ -354,71 +325,63 @@ Variant CircleShape2DSW::get_data() const {
return radius;
}
-
/*********************************************************/
/*********************************************************/
/*********************************************************/
+void RectangleShape2DSW::get_supports(const Vector2 &p_normal, Vector2 *r_supports, int &r_amount) const {
-
-void RectangleShape2DSW::get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const {
-
- for(int i=0;i<2;i++) {
+ for (int i = 0; i < 2; i++) {
Vector2 ag;
- ag[i]=1.0;
+ ag[i] = 1.0;
float dp = ag.dot(p_normal);
- if (Math::abs(dp)<_SEGMENT_IS_VALID_SUPPORT_TRESHOLD)
+ if (Math::abs(dp) < _SEGMENT_IS_VALID_SUPPORT_TRESHOLD)
continue;
- float sgn = dp>0 ? 1.0 : -1.0;
+ float sgn = dp > 0 ? 1.0 : -1.0;
- r_amount=2;
+ r_amount = 2;
- r_supports[0][i]=half_extents[i]*sgn;
- r_supports[0][i^1]=half_extents[i^1];
+ r_supports[0][i] = half_extents[i] * sgn;
+ r_supports[0][i ^ 1] = half_extents[i ^ 1];
- r_supports[1][i]=half_extents[i]*sgn;
- r_supports[1][i^1]=-half_extents[i^1];
+ r_supports[1][i] = half_extents[i] * sgn;
+ r_supports[1][i ^ 1] = -half_extents[i ^ 1];
return;
-
-
}
/* USE POINT */
- r_amount=1;
- r_supports[0]=Vector2(
- (p_normal.x<0) ? -half_extents.x : half_extents.x,
- (p_normal.y<0) ? -half_extents.y : half_extents.y
- );
-
+ r_amount = 1;
+ r_supports[0] = Vector2(
+ (p_normal.x < 0) ? -half_extents.x : half_extents.x,
+ (p_normal.y < 0) ? -half_extents.y : half_extents.y);
}
-bool RectangleShape2DSW::contains_point(const Vector2& p_point) const {
+bool RectangleShape2DSW::contains_point(const Vector2 &p_point) const {
- return Math::abs(p_point.x)<half_extents.x && Math::abs(p_point.y)<half_extents.y;
+ return Math::abs(p_point.x) < half_extents.x && Math::abs(p_point.y) < half_extents.y;
}
-bool RectangleShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const {
-
+bool RectangleShape2DSW::intersect_segment(const Vector2 &p_begin, const Vector2 &p_end, Vector2 &r_point, Vector2 &r_normal) const {
- return get_aabb().intersects_segment(p_begin,p_end,&r_point,&r_normal);
+ return get_aabb().intersects_segment(p_begin, p_end, &r_point, &r_normal);
}
-real_t RectangleShape2DSW::get_moment_of_inertia(float p_mass,const Size2& p_scale) const {
+real_t RectangleShape2DSW::get_moment_of_inertia(float p_mass, const Size2 &p_scale) const {
- Vector2 he2=half_extents*2*p_scale;
- return p_mass*he2.dot(he2)/12.0f;
+ Vector2 he2 = half_extents * 2 * p_scale;
+ return p_mass * he2.dot(he2) / 12.0f;
}
-void RectangleShape2DSW::set_data(const Variant& p_data) {
+void RectangleShape2DSW::set_data(const Variant &p_data) {
- ERR_FAIL_COND(p_data.get_type()!=Variant::VECTOR2);
+ ERR_FAIL_COND(p_data.get_type() != Variant::VECTOR2);
- half_extents=p_data;
- configure(Rect2(-half_extents,half_extents*2.0));
+ half_extents = p_data;
+ configure(Rect2(-half_extents, half_extents * 2.0));
}
Variant RectangleShape2DSW::get_data() const {
@@ -426,71 +389,65 @@ Variant RectangleShape2DSW::get_data() const {
return half_extents;
}
-
-
/*********************************************************/
/*********************************************************/
/*********************************************************/
+void CapsuleShape2DSW::get_supports(const Vector2 &p_normal, Vector2 *r_supports, int &r_amount) const {
-
-void CapsuleShape2DSW::get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const {
-
- Vector2 n=p_normal;
+ Vector2 n = p_normal;
float d = n.y;
- if (Math::abs( d )<(1.0-_SEGMENT_IS_VALID_SUPPORT_TRESHOLD) ) {
+ if (Math::abs(d) < (1.0 - _SEGMENT_IS_VALID_SUPPORT_TRESHOLD)) {
// make it flat
- n.y=0.0;
+ n.y = 0.0;
n.normalize();
- n*=radius;
+ n *= radius;
- r_amount=2;
- r_supports[0]=n;
- r_supports[0].y+=height*0.5;
- r_supports[1]=n;
- r_supports[1].y-=height*0.5;
+ r_amount = 2;
+ r_supports[0] = n;
+ r_supports[0].y += height * 0.5;
+ r_supports[1] = n;
+ r_supports[1].y -= height * 0.5;
} else {
float h = (d > 0) ? height : -height;
- n*=radius;
- n.y += h*0.5;
- r_amount=1;
- *r_supports=n;
-
+ n *= radius;
+ n.y += h * 0.5;
+ r_amount = 1;
+ *r_supports = n;
}
}
-bool CapsuleShape2DSW::contains_point(const Vector2& p_point) const {
+bool CapsuleShape2DSW::contains_point(const Vector2 &p_point) const {
Vector2 p = p_point;
- p.y=Math::abs(p.y);
- p.y-=height*0.5;
- if (p.y<0)
- p.y=0;
+ p.y = Math::abs(p.y);
+ p.y -= height * 0.5;
+ if (p.y < 0)
+ p.y = 0;
- return p.length_squared() < radius*radius;
+ return p.length_squared() < radius * radius;
}
-bool CapsuleShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const {
-
+bool CapsuleShape2DSW::intersect_segment(const Vector2 &p_begin, const Vector2 &p_end, Vector2 &r_point, Vector2 &r_normal) const {
float d = 1e10;
- Vector2 n = (p_end-p_begin).normalized();
- bool collided=false;
+ Vector2 n = (p_end - p_begin).normalized();
+ bool collided = false;
//try spheres
- for(int i=0;i<2;i++) {
+ for (int i = 0; i < 2; i++) {
Vector2 begin = p_begin;
Vector2 end = p_end;
- float ofs = (i==0)?-height*0.5:height*0.5;
- begin.y+=ofs;
- end.y+=ofs;
+ float ofs = (i == 0) ? -height * 0.5 : height * 0.5;
+ begin.y += ofs;
+ end.y += ofs;
Vector2 line_vec = end - begin;
@@ -500,39 +457,38 @@ bool CapsuleShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p
b = 2 * begin.dot(line_vec);
c = begin.dot(begin) - radius * radius;
- real_t sqrtterm = b*b - 4*a*c;
+ real_t sqrtterm = b * b - 4 * a * c;
- if(sqrtterm < 0)
+ if (sqrtterm < 0)
continue;
sqrtterm = Math::sqrt(sqrtterm);
- real_t res = ( -b - sqrtterm ) / (2 * a);
+ real_t res = (-b - sqrtterm) / (2 * a);
- if (res <0 || res >1+CMP_EPSILON) {
+ if (res < 0 || res > 1 + CMP_EPSILON) {
continue;
}
- Vector2 point = begin+line_vec*res;
- Vector2 pointf(point.x,point.y-ofs);
+ Vector2 point = begin + line_vec * res;
+ Vector2 pointf(point.x, point.y - ofs);
real_t pd = n.dot(pointf);
- if (pd<d) {
- r_point=pointf;
- r_normal=point.normalized();
- d=pd;
- collided=true;
+ if (pd < d) {
+ r_point = pointf;
+ r_normal = point.normalized();
+ d = pd;
+ collided = true;
}
}
-
- Vector2 rpos,rnorm;
- if (Rect2( Point2(-radius,-height*0.5), Size2(radius*2.0,height) ).intersects_segment(p_begin,p_end,&rpos,&rnorm)) {
+ Vector2 rpos, rnorm;
+ if (Rect2(Point2(-radius, -height * 0.5), Size2(radius * 2.0, height)).intersects_segment(p_begin, p_end, &rpos, &rnorm)) {
real_t pd = n.dot(rpos);
- if (pd<d) {
- r_point=rpos;
- r_normal=rnorm;
- d=pd;
- collided=true;
+ if (pd < d) {
+ r_point = rpos;
+ r_normal = rnorm;
+ d = pd;
+ collided = true;
}
}
@@ -542,198 +498,184 @@ bool CapsuleShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p
real_t CapsuleShape2DSW::get_moment_of_inertia(float p_mass, const Size2 &p_scale) const {
- Vector2 he2=Vector2(radius*2,height+radius*2)*p_scale;
- return p_mass*he2.dot(he2)/12.0f;
+ Vector2 he2 = Vector2(radius * 2, height + radius * 2) * p_scale;
+ return p_mass * he2.dot(he2) / 12.0f;
}
-void CapsuleShape2DSW::set_data(const Variant& p_data) {
+void CapsuleShape2DSW::set_data(const Variant &p_data) {
- ERR_FAIL_COND(p_data.get_type()!=Variant::ARRAY && p_data.get_type()!=Variant::VECTOR2);
+ ERR_FAIL_COND(p_data.get_type() != Variant::ARRAY && p_data.get_type() != Variant::VECTOR2);
- if (p_data.get_type()==Variant::ARRAY) {
- Array arr=p_data;
- ERR_FAIL_COND(arr.size()!=2);
- height=arr[0];
- radius=arr[1];
+ if (p_data.get_type() == Variant::ARRAY) {
+ Array arr = p_data;
+ ERR_FAIL_COND(arr.size() != 2);
+ height = arr[0];
+ radius = arr[1];
} else {
Point2 p = p_data;
- radius=p.x;
- height=p.y;
+ radius = p.x;
+ height = p.y;
}
- Point2 he(radius,height*0.5+radius);
- configure(Rect2(-he,he*2));
-
+ Point2 he(radius, height * 0.5 + radius);
+ configure(Rect2(-he, he * 2));
}
Variant CapsuleShape2DSW::get_data() const {
- return Point2(height,radius);
+ return Point2(height, radius);
}
-
-
/*********************************************************/
/*********************************************************/
/*********************************************************/
+void ConvexPolygonShape2DSW::get_supports(const Vector2 &p_normal, Vector2 *r_supports, int &r_amount) const {
+ int support_idx = -1;
+ real_t d = -1e10;
-void ConvexPolygonShape2DSW::get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const {
-
- int support_idx=-1;
- real_t d=-1e10;
-
- for(int i=0;i<point_count;i++) {
+ for (int i = 0; i < point_count; i++) {
//test point
real_t ld = p_normal.dot(points[i].pos);
- if (ld>d) {
- support_idx=i;
- d=ld;
+ if (ld > d) {
+ support_idx = i;
+ d = ld;
}
//test segment
- if (points[i].normal.dot(p_normal)>_SEGMENT_IS_VALID_SUPPORT_TRESHOLD) {
+ if (points[i].normal.dot(p_normal) > _SEGMENT_IS_VALID_SUPPORT_TRESHOLD) {
- r_amount=2;
- r_supports[0]=points[i].pos;
- r_supports[1]=points[(i+1)%point_count].pos;
+ r_amount = 2;
+ r_supports[0] = points[i].pos;
+ r_supports[1] = points[(i + 1) % point_count].pos;
return;
}
}
- ERR_FAIL_COND(support_idx==-1);
-
- r_amount=1;
- r_supports[0]=points[support_idx].pos;
+ ERR_FAIL_COND(support_idx == -1);
+ r_amount = 1;
+ r_supports[0] = points[support_idx].pos;
}
+bool ConvexPolygonShape2DSW::contains_point(const Vector2 &p_point) const {
-bool ConvexPolygonShape2DSW::contains_point(const Vector2& p_point) const {
+ bool out = false;
+ bool in = false;
- bool out=false;
- bool in=false;
-
- for(int i=0;i<point_count;i++) {
+ for (int i = 0; i < point_count; i++) {
float d = points[i].normal.dot(p_point) - points[i].normal.dot(points[i].pos);
- if (d>0)
- out=true;
+ if (d > 0)
+ out = true;
else
- in=true;
+ in = true;
}
return (in && !out) || (!in && out);
}
+bool ConvexPolygonShape2DSW::intersect_segment(const Vector2 &p_begin, const Vector2 &p_end, Vector2 &r_point, Vector2 &r_normal) const {
-bool ConvexPolygonShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const {
-
- Vector2 n = (p_end-p_begin).normalized();
- real_t d=1e10;
- bool inters=false;
+ Vector2 n = (p_end - p_begin).normalized();
+ real_t d = 1e10;
+ bool inters = false;
- for(int i=0;i<point_count;i++) {
+ for (int i = 0; i < point_count; i++) {
//hmm crap.. no can do..
//if (d.dot(points[i].normal)>=0)
// continue;
-
Vector2 res;
- if (!Geometry::segment_intersects_segment_2d(p_begin,p_end,points[i].pos,points[(i+1)%point_count].pos,&res))
+ if (!Geometry::segment_intersects_segment_2d(p_begin, p_end, points[i].pos, points[(i + 1) % point_count].pos, &res))
continue;
float nd = n.dot(res);
- if (nd<d) {
+ if (nd < d) {
- d=nd;
- r_point=res;
- r_normal=points[i].normal;
- inters=true;
+ d = nd;
+ r_point = res;
+ r_normal = points[i].normal;
+ inters = true;
}
-
}
-
if (inters) {
- if (n.dot(r_normal)>0)
- r_normal=-r_normal;
+ if (n.dot(r_normal) > 0)
+ r_normal = -r_normal;
}
//return get_aabb().intersects_segment(p_begin,p_end,&r_point,&r_normal);
return inters; //todo
}
-real_t ConvexPolygonShape2DSW::get_moment_of_inertia(float p_mass,const Size2& p_scale) const {
+real_t ConvexPolygonShape2DSW::get_moment_of_inertia(float p_mass, const Size2 &p_scale) const {
Rect2 aabb;
- aabb.pos=points[0].pos*p_scale;
- for(int i=0;i<point_count;i++) {
+ aabb.pos = points[0].pos * p_scale;
+ for (int i = 0; i < point_count; i++) {
- aabb.expand_to(points[i].pos*p_scale);
+ aabb.expand_to(points[i].pos * p_scale);
}
- return p_mass*aabb.size.dot(aabb.size)/12.0f + p_mass * (aabb.pos+aabb.size*0.5).length_squared();
+ return p_mass * aabb.size.dot(aabb.size) / 12.0f + p_mass * (aabb.pos + aabb.size * 0.5).length_squared();
}
-void ConvexPolygonShape2DSW::set_data(const Variant& p_data) {
-
- ERR_FAIL_COND(p_data.get_type()!=Variant::VECTOR2_ARRAY && p_data.get_type()!=Variant::REAL_ARRAY);
+void ConvexPolygonShape2DSW::set_data(const Variant &p_data) {
+ ERR_FAIL_COND(p_data.get_type() != Variant::VECTOR2_ARRAY && p_data.get_type() != Variant::REAL_ARRAY);
if (points)
memdelete_arr(points);
- points=NULL;
- point_count=0;
+ points = NULL;
+ point_count = 0;
- if (p_data.get_type()==Variant::VECTOR2_ARRAY) {
- DVector<Vector2> arr=p_data;
- ERR_FAIL_COND(arr.size()==0);
- point_count=arr.size();
- points = memnew_arr(Point,point_count);
+ if (p_data.get_type() == Variant::VECTOR2_ARRAY) {
+ DVector<Vector2> arr = p_data;
+ ERR_FAIL_COND(arr.size() == 0);
+ point_count = arr.size();
+ points = memnew_arr(Point, point_count);
DVector<Vector2>::Read r = arr.read();
- for(int i=0;i<point_count;i++) {
- points[i].pos=r[i];
+ for (int i = 0; i < point_count; i++) {
+ points[i].pos = r[i];
}
- for(int i=0;i<point_count;i++) {
+ for (int i = 0; i < point_count; i++) {
Vector2 p = points[i].pos;
- Vector2 pn = points[(i+1)%point_count].pos;
- points[i].normal=(pn-p).tangent().normalized();
+ Vector2 pn = points[(i + 1) % point_count].pos;
+ points[i].normal = (pn - p).tangent().normalized();
}
} else {
DVector<real_t> dvr = p_data;
- point_count=dvr.size()/4;
- ERR_FAIL_COND(point_count==0);
+ point_count = dvr.size() / 4;
+ ERR_FAIL_COND(point_count == 0);
- points = memnew_arr(Point,point_count);
+ points = memnew_arr(Point, point_count);
DVector<real_t>::Read r = dvr.read();
- for(int i=0;i<point_count;i++) {
-
- int idx=i<<2;
- points[i].pos.x=r[idx+0];
- points[i].pos.y=r[idx+1];
- points[i].normal.x=r[idx+2];
- points[i].normal.y=r[idx+3];
+ for (int i = 0; i < point_count; i++) {
+ int idx = i << 2;
+ points[i].pos.x = r[idx + 0];
+ points[i].pos.y = r[idx + 1];
+ points[i].normal.x = r[idx + 2];
+ points[i].normal.y = r[idx + 3];
}
}
-
- ERR_FAIL_COND(point_count==0);
+ ERR_FAIL_COND(point_count == 0);
Rect2 aabb;
- aabb.pos=points[0].pos;
- for(int i=1;i<point_count;i++)
+ aabb.pos = points[0].pos;
+ for (int i = 1; i < point_count; i++)
aabb.expand_to(points[i].pos);
configure(aabb);
@@ -745,408 +687,378 @@ Variant ConvexPolygonShape2DSW::get_data() const {
dvr.resize(point_count);
- for(int i=0;i<point_count;i++) {
- dvr.set(i,points[i].pos);
+ for (int i = 0; i < point_count; i++) {
+ dvr.set(i, points[i].pos);
}
return dvr;
}
-
ConvexPolygonShape2DSW::ConvexPolygonShape2DSW() {
- points=NULL;
- point_count=0;
-
+ points = NULL;
+ point_count = 0;
}
-ConvexPolygonShape2DSW::~ConvexPolygonShape2DSW(){
+ConvexPolygonShape2DSW::~ConvexPolygonShape2DSW() {
if (points)
memdelete_arr(points);
-
}
//////////////////////////////////////////////////
+void ConcavePolygonShape2DSW::get_supports(const Vector2 &p_normal, Vector2 *r_supports, int &r_amount) const {
-void ConcavePolygonShape2DSW::get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const {
-
- real_t d=-1e10;
- int idx=-1;
- for(int i=0;i<points.size();i++) {
+ real_t d = -1e10;
+ int idx = -1;
+ for (int i = 0; i < points.size(); i++) {
real_t ld = p_normal.dot(points[i]);
- if (ld>d) {
- d=ld;
- idx=i;
+ if (ld > d) {
+ d = ld;
+ idx = i;
}
}
-
- r_amount=1;
- ERR_FAIL_COND(idx==-1);
- *r_supports=points[idx];
-
+ r_amount = 1;
+ ERR_FAIL_COND(idx == -1);
+ *r_supports = points[idx];
}
-bool ConcavePolygonShape2DSW::contains_point(const Vector2& p_point) const {
+bool ConcavePolygonShape2DSW::contains_point(const Vector2 &p_point) const {
return false; //sorry
}
+bool ConcavePolygonShape2DSW::intersect_segment(const Vector2 &p_begin, const Vector2 &p_end, Vector2 &r_point, Vector2 &r_normal) const {
-bool ConcavePolygonShape2DSW::intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const{
-
- uint32_t* stack = (uint32_t*)alloca(sizeof(int)*bvh_depth);
+ uint32_t *stack = (uint32_t *)alloca(sizeof(int) * bvh_depth);
enum {
- TEST_AABB_BIT=0,
- VISIT_LEFT_BIT=1,
- VISIT_RIGHT_BIT=2,
- VISIT_DONE_BIT=3,
- VISITED_BIT_SHIFT=29,
- NODE_IDX_MASK=(1<<VISITED_BIT_SHIFT)-1,
- VISITED_BIT_MASK=~NODE_IDX_MASK,
-
+ TEST_AABB_BIT = 0,
+ VISIT_LEFT_BIT = 1,
+ VISIT_RIGHT_BIT = 2,
+ VISIT_DONE_BIT = 3,
+ VISITED_BIT_SHIFT = 29,
+ NODE_IDX_MASK = (1 << VISITED_BIT_SHIFT) - 1,
+ VISITED_BIT_MASK = ~NODE_IDX_MASK,
};
- Vector2 n = (p_end-p_begin).normalized();
- real_t d=1e10;
- bool inters=false;
+ Vector2 n = (p_end - p_begin).normalized();
+ real_t d = 1e10;
+ bool inters = false;
//for(int i=0;i<bvh_depth;i++)
// stack[i]=0;
- int level=0;
+ int level = 0;
- const Segment *segmentptr=&segments[0];
- const Vector2 *pointptr=&points[0];
+ const Segment *segmentptr = &segments[0];
+ const Vector2 *pointptr = &points[0];
const BVH *bvhptr = &bvh[0];
+ stack[0] = 0;
+ while (true) {
- stack[0]=0;
- while(true) {
+ uint32_t node = stack[level] & NODE_IDX_MASK;
+ const BVH &b = bvhptr[node];
+ bool done = false;
- uint32_t node = stack[level]&NODE_IDX_MASK;
- const BVH &b = bvhptr[ node ];
- bool done=false;
-
- switch(stack[level]>>VISITED_BIT_SHIFT) {
+ switch (stack[level] >> VISITED_BIT_SHIFT) {
case TEST_AABB_BIT: {
-
- bool valid = b.aabb.intersects_segment(p_begin,p_end);
+ bool valid = b.aabb.intersects_segment(p_begin, p_end);
if (!valid) {
- stack[level]=(VISIT_DONE_BIT<<VISITED_BIT_SHIFT)|node;
+ stack[level] = (VISIT_DONE_BIT << VISITED_BIT_SHIFT) | node;
} else {
- if (b.left<0) {
-
- const Segment &s=segmentptr[ b.right ];
- Vector2 a = pointptr[ s.points[0] ];
- Vector2 b = pointptr[ s.points[1] ];
+ if (b.left < 0) {
+ const Segment &s = segmentptr[b.right];
+ Vector2 a = pointptr[s.points[0]];
+ Vector2 b = pointptr[s.points[1]];
Vector2 res;
- if (Geometry::segment_intersects_segment_2d(p_begin,p_end,a,b,&res)) {
+ if (Geometry::segment_intersects_segment_2d(p_begin, p_end, a, b, &res)) {
float nd = n.dot(res);
- if (nd<d) {
+ if (nd < d) {
- d=nd;
- r_point=res;
- r_normal=(b-a).tangent().normalized();
- inters=true;
+ d = nd;
+ r_point = res;
+ r_normal = (b - a).tangent().normalized();
+ inters = true;
}
-
}
- stack[level]=(VISIT_DONE_BIT<<VISITED_BIT_SHIFT)|node;
+ stack[level] = (VISIT_DONE_BIT << VISITED_BIT_SHIFT) | node;
} else {
- stack[level]=(VISIT_LEFT_BIT<<VISITED_BIT_SHIFT)|node;
+ stack[level] = (VISIT_LEFT_BIT << VISITED_BIT_SHIFT) | node;
}
}
-
- } continue;
+ }
+ continue;
case VISIT_LEFT_BIT: {
- stack[level]=(VISIT_RIGHT_BIT<<VISITED_BIT_SHIFT)|node;
- stack[level+1]=b.left|TEST_AABB_BIT;
+ stack[level] = (VISIT_RIGHT_BIT << VISITED_BIT_SHIFT) | node;
+ stack[level + 1] = b.left | TEST_AABB_BIT;
level++;
-
- } continue;
+ }
+ continue;
case VISIT_RIGHT_BIT: {
- stack[level]=(VISIT_DONE_BIT<<VISITED_BIT_SHIFT)|node;
- stack[level+1]=b.right|TEST_AABB_BIT;
+ stack[level] = (VISIT_DONE_BIT << VISITED_BIT_SHIFT) | node;
+ stack[level + 1] = b.right | TEST_AABB_BIT;
level++;
- } continue;
+ }
+ continue;
case VISIT_DONE_BIT: {
- if (level==0) {
- done=true;
+ if (level == 0) {
+ done = true;
break;
} else
level--;
-
- } continue;
+ }
+ continue;
}
-
if (done)
break;
}
-
if (inters) {
- if (n.dot(r_normal)>0)
- r_normal=-r_normal;
+ if (n.dot(r_normal) > 0)
+ r_normal = -r_normal;
}
return inters;
-
}
+int ConcavePolygonShape2DSW::_generate_bvh(BVH *p_bvh, int p_len, int p_depth) {
+ if (p_len == 1) {
-int ConcavePolygonShape2DSW::_generate_bvh(BVH *p_bvh,int p_len,int p_depth) {
-
- if (p_len==1) {
-
- bvh_depth=MAX(p_depth,bvh_depth);
+ bvh_depth = MAX(p_depth, bvh_depth);
bvh.push_back(*p_bvh);
- return bvh.size()-1;
+ return bvh.size() - 1;
}
//else sort best
- Rect2 global_aabb=p_bvh[0].aabb;
- for(int i=1;i<p_len;i++) {
- global_aabb=global_aabb.merge(p_bvh[i].aabb);
+ Rect2 global_aabb = p_bvh[0].aabb;
+ for (int i = 1; i < p_len; i++) {
+ global_aabb = global_aabb.merge(p_bvh[i].aabb);
}
if (global_aabb.size.x > global_aabb.size.y) {
- SortArray<BVH,BVH_CompareX> sort;
- sort.sort(p_bvh,p_len);
+ SortArray<BVH, BVH_CompareX> sort;
+ sort.sort(p_bvh, p_len);
} else {
- SortArray<BVH,BVH_CompareY> sort;
- sort.sort(p_bvh,p_len);
-
+ SortArray<BVH, BVH_CompareY> sort;
+ sort.sort(p_bvh, p_len);
}
- int median = p_len/2;
-
+ int median = p_len / 2;
BVH node;
- node.aabb=global_aabb;
+ node.aabb = global_aabb;
int node_idx = bvh.size();
bvh.push_back(node);
- int l = _generate_bvh(p_bvh,median,p_depth+1);
- int r = _generate_bvh(&p_bvh[median],p_len-median,p_depth+1);
- bvh[node_idx].left=l;
- bvh[node_idx].right=r;
+ int l = _generate_bvh(p_bvh, median, p_depth + 1);
+ int r = _generate_bvh(&p_bvh[median], p_len - median, p_depth + 1);
+ bvh[node_idx].left = l;
+ bvh[node_idx].right = r;
return node_idx;
-
}
-void ConcavePolygonShape2DSW::set_data(const Variant& p_data) {
+void ConcavePolygonShape2DSW::set_data(const Variant &p_data) {
- ERR_FAIL_COND(p_data.get_type()!=Variant::VECTOR2_ARRAY && p_data.get_type()!=Variant::REAL_ARRAY);
+ ERR_FAIL_COND(p_data.get_type() != Variant::VECTOR2_ARRAY && p_data.get_type() != Variant::REAL_ARRAY);
Rect2 aabb;
- if (p_data.get_type()==Variant::VECTOR2_ARRAY) {
+ if (p_data.get_type() == Variant::VECTOR2_ARRAY) {
DVector<Vector2> p2arr = p_data;
int len = p2arr.size();
- ERR_FAIL_COND(len%2);
+ ERR_FAIL_COND(len % 2);
segments.clear();
points.clear();
bvh.clear();
- bvh_depth=1;
+ bvh_depth = 1;
- if (len==0) {
+ if (len == 0) {
configure(aabb);
return;
}
DVector<Vector2>::Read arr = p2arr.read();
- Map<Point2,int> pointmap;
- for(int i=0;i<len;i+=2) {
+ Map<Point2, int> pointmap;
+ for (int i = 0; i < len; i += 2) {
- Point2 p1 =arr[i];
- Point2 p2 =arr[i+1];
- int idx_p1,idx_p2;
+ Point2 p1 = arr[i];
+ Point2 p2 = arr[i + 1];
+ int idx_p1, idx_p2;
if (pointmap.has(p1)) {
- idx_p1=pointmap[p1];
+ idx_p1 = pointmap[p1];
} else {
- idx_p1=pointmap.size();
- pointmap[p1]=idx_p1;
+ idx_p1 = pointmap.size();
+ pointmap[p1] = idx_p1;
}
if (pointmap.has(p2)) {
- idx_p2=pointmap[p2];
+ idx_p2 = pointmap[p2];
} else {
- idx_p2=pointmap.size();
- pointmap[p2]=idx_p2;
+ idx_p2 = pointmap.size();
+ pointmap[p2] = idx_p2;
}
Segment s;
- s.points[0]=idx_p1;
- s.points[1]=idx_p2;
+ s.points[0] = idx_p1;
+ s.points[1] = idx_p2;
segments.push_back(s);
}
points.resize(pointmap.size());
- aabb.pos=pointmap.front()->key();
- for(Map<Point2,int>::Element *E=pointmap.front();E;E=E->next()) {
+ aabb.pos = pointmap.front()->key();
+ for (Map<Point2, int>::Element *E = pointmap.front(); E; E = E->next()) {
aabb.expand_to(E->key());
- points[E->get()]=E->key();
+ points[E->get()] = E->key();
}
Vector<BVH> main_vbh;
main_vbh.resize(segments.size());
- for(int i=0;i<main_vbh.size();i++) {
-
+ for (int i = 0; i < main_vbh.size(); i++) {
- main_vbh[i].aabb.pos=points[segments[i].points[0]];
+ main_vbh[i].aabb.pos = points[segments[i].points[0]];
main_vbh[i].aabb.expand_to(points[segments[i].points[1]]);
- main_vbh[i].left=-1;
- main_vbh[i].right=i;
+ main_vbh[i].left = -1;
+ main_vbh[i].right = i;
}
- _generate_bvh(&main_vbh[0],main_vbh.size(),1);
-
+ _generate_bvh(&main_vbh[0], main_vbh.size(), 1);
} else {
//dictionary with arrays
-
}
-
configure(aabb);
}
Variant ConcavePolygonShape2DSW::get_data() const {
-
DVector<Vector2> rsegments;
int len = segments.size();
- rsegments.resize(len*2);
+ rsegments.resize(len * 2);
DVector<Vector2>::Write w = rsegments.write();
- for(int i=0;i<len;i++) {
+ for (int i = 0; i < len; i++) {
- w[(i<<1)+0]=points[segments[i].points[0]];
- w[(i<<1)+1]=points[segments[i].points[1]];
+ w[(i << 1) + 0] = points[segments[i].points[0]];
+ w[(i << 1) + 1] = points[segments[i].points[1]];
}
- w=DVector<Vector2>::Write();
+ w = DVector<Vector2>::Write();
return rsegments;
}
-void ConcavePolygonShape2DSW::cull(const Rect2& p_local_aabb,Callback p_callback,void* p_userdata) const {
+void ConcavePolygonShape2DSW::cull(const Rect2 &p_local_aabb, Callback p_callback, void *p_userdata) const {
- uint32_t* stack = (uint32_t*)alloca(sizeof(int)*bvh_depth);
+ uint32_t *stack = (uint32_t *)alloca(sizeof(int) * bvh_depth);
enum {
- TEST_AABB_BIT=0,
- VISIT_LEFT_BIT=1,
- VISIT_RIGHT_BIT=2,
- VISIT_DONE_BIT=3,
- VISITED_BIT_SHIFT=29,
- NODE_IDX_MASK=(1<<VISITED_BIT_SHIFT)-1,
- VISITED_BIT_MASK=~NODE_IDX_MASK,
-
+ TEST_AABB_BIT = 0,
+ VISIT_LEFT_BIT = 1,
+ VISIT_RIGHT_BIT = 2,
+ VISIT_DONE_BIT = 3,
+ VISITED_BIT_SHIFT = 29,
+ NODE_IDX_MASK = (1 << VISITED_BIT_SHIFT) - 1,
+ VISITED_BIT_MASK = ~NODE_IDX_MASK,
};
//for(int i=0;i<bvh_depth;i++)
// stack[i]=0;
+ int level = 0;
- int level=0;
-
- const Segment *segmentptr=&segments[0];
- const Vector2 *pointptr=&points[0];
+ const Segment *segmentptr = &segments[0];
+ const Vector2 *pointptr = &points[0];
const BVH *bvhptr = &bvh[0];
+ stack[0] = 0;
+ while (true) {
- stack[0]=0;
- while(true) {
+ uint32_t node = stack[level] & NODE_IDX_MASK;
+ const BVH &b = bvhptr[node];
- uint32_t node = stack[level]&NODE_IDX_MASK;
- const BVH &b = bvhptr[ node ];
-
- switch(stack[level]>>VISITED_BIT_SHIFT) {
+ switch (stack[level] >> VISITED_BIT_SHIFT) {
case TEST_AABB_BIT: {
-
bool valid = p_local_aabb.intersects(b.aabb);
if (!valid) {
- stack[level]=(VISIT_DONE_BIT<<VISITED_BIT_SHIFT)|node;
+ stack[level] = (VISIT_DONE_BIT << VISITED_BIT_SHIFT) | node;
} else {
- if (b.left<0) {
+ if (b.left < 0) {
- const Segment &s=segmentptr[ b.right ];
- Vector2 a = pointptr[ s.points[0] ];
- Vector2 b = pointptr[ s.points[1] ];
+ const Segment &s = segmentptr[b.right];
+ Vector2 a = pointptr[s.points[0]];
+ Vector2 b = pointptr[s.points[1]];
- SegmentShape2DSW ss(a,b,(b-a).tangent().normalized());
+ SegmentShape2DSW ss(a, b, (b - a).tangent().normalized());
- p_callback(p_userdata,&ss);
- stack[level]=(VISIT_DONE_BIT<<VISITED_BIT_SHIFT)|node;
+ p_callback(p_userdata, &ss);
+ stack[level] = (VISIT_DONE_BIT << VISITED_BIT_SHIFT) | node;
} else {
- stack[level]=(VISIT_LEFT_BIT<<VISITED_BIT_SHIFT)|node;
+ stack[level] = (VISIT_LEFT_BIT << VISITED_BIT_SHIFT) | node;
}
}
-
- } continue;
+ }
+ continue;
case VISIT_LEFT_BIT: {
- stack[level]=(VISIT_RIGHT_BIT<<VISITED_BIT_SHIFT)|node;
- stack[level+1]=b.left|TEST_AABB_BIT;
+ stack[level] = (VISIT_RIGHT_BIT << VISITED_BIT_SHIFT) | node;
+ stack[level + 1] = b.left | TEST_AABB_BIT;
level++;
-
- } continue;
+ }
+ continue;
case VISIT_RIGHT_BIT: {
- stack[level]=(VISIT_DONE_BIT<<VISITED_BIT_SHIFT)|node;
- stack[level+1]=b.right|TEST_AABB_BIT;
+ stack[level] = (VISIT_DONE_BIT << VISITED_BIT_SHIFT) | node;
+ stack[level + 1] = b.right | TEST_AABB_BIT;
level++;
- } continue;
+ }
+ continue;
case VISIT_DONE_BIT: {
- if (level==0)
+ if (level == 0)
return;
else
level--;
-
- } continue;
+ }
+ continue;
}
}
-
}
-
-
diff --git a/servers/physics_2d/shape_2d_sw.h b/servers/physics_2d/shape_2d_sw.h
index 785771663..10c0f9f59 100644
--- a/servers/physics_2d/shape_2d_sw.h
+++ b/servers/physics_2d/shape_2d_sw.h
@@ -48,9 +48,8 @@ class Shape2DSW;
class ShapeOwner2DSW {
public:
-
- virtual void _shape_changed()=0;
- virtual void remove_shape(Shape2DSW *p_shape)=0;
+ virtual void _shape_changed() = 0;
+ virtual void remove_shape(Shape2DSW *p_shape) = 0;
virtual ~ShapeOwner2DSW() {}
};
@@ -62,77 +61,75 @@ class Shape2DSW {
bool configured;
real_t custom_bias;
- Map<ShapeOwner2DSW*,int> owners;
+ Map<ShapeOwner2DSW *, int> owners;
+
protected:
+ void configure(const Rect2 &p_aabb);
- void configure(const Rect2& p_aabb);
public:
+ _FORCE_INLINE_ void set_self(const RID &p_self) { self = p_self; }
+ _FORCE_INLINE_ RID get_self() const { return self; }
- _FORCE_INLINE_ void set_self(const RID& p_self) { self=p_self; }
- _FORCE_INLINE_ RID get_self() const {return self; }
-
- virtual Physics2DServer::ShapeType get_type() const=0;
+ virtual Physics2DServer::ShapeType get_type() const = 0;
_FORCE_INLINE_ Rect2 get_aabb() const { return aabb; }
_FORCE_INLINE_ bool is_configured() const { return configured; }
virtual bool is_concave() const { return false; }
- virtual bool contains_point(const Vector2& p_point) const=0;
+ virtual bool contains_point(const Vector2 &p_point) const = 0;
- virtual void project_rangev(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const=0;
- virtual void project_range_castv(const Vector2& p_cast, const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const=0;
- virtual Vector2 get_support(const Vector2& p_normal) const;
- virtual void get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const=0;
+ virtual void project_rangev(const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const = 0;
+ virtual void project_range_castv(const Vector2 &p_cast, const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const = 0;
+ virtual Vector2 get_support(const Vector2 &p_normal) const;
+ virtual void get_supports(const Vector2 &p_normal, Vector2 *r_supports, int &r_amount) const = 0;
- virtual bool intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const=0;
- virtual real_t get_moment_of_inertia(float p_mass,const Size2& p_scale) const=0;
- virtual void set_data(const Variant& p_data)=0;
- virtual Variant get_data() const=0;
+ virtual bool intersect_segment(const Vector2 &p_begin, const Vector2 &p_end, Vector2 &r_point, Vector2 &r_normal) const = 0;
+ virtual real_t get_moment_of_inertia(float p_mass, const Size2 &p_scale) const = 0;
+ virtual void set_data(const Variant &p_data) = 0;
+ virtual Variant get_data() const = 0;
- _FORCE_INLINE_ void set_custom_bias(real_t p_bias) { custom_bias=p_bias; }
+ _FORCE_INLINE_ void set_custom_bias(real_t p_bias) { custom_bias = p_bias; }
_FORCE_INLINE_ real_t get_custom_bias() const { return custom_bias; }
void add_owner(ShapeOwner2DSW *p_owner);
void remove_owner(ShapeOwner2DSW *p_owner);
bool is_owner(ShapeOwner2DSW *p_owner) const;
- const Map<ShapeOwner2DSW*,int>& get_owners() const;
-
+ const Map<ShapeOwner2DSW *, int> &get_owners() const;
- _FORCE_INLINE_ void get_supports_transformed_cast(const Vector2& p_cast,const Vector2& p_normal,const Matrix32& p_xform,Vector2 *r_supports,int & r_amount) const {
+ _FORCE_INLINE_ void get_supports_transformed_cast(const Vector2 &p_cast, const Vector2 &p_normal, const Matrix32 &p_xform, Vector2 *r_supports, int &r_amount) const {
- get_supports(p_xform.basis_xform_inv(p_normal).normalized(),r_supports,r_amount);
- for(int i=0;i<r_amount;i++)
- r_supports[i]=p_xform.xform(r_supports[i]);
+ get_supports(p_xform.basis_xform_inv(p_normal).normalized(), r_supports, r_amount);
+ for (int i = 0; i < r_amount; i++)
+ r_supports[i] = p_xform.xform(r_supports[i]);
- if (r_amount==1) {
+ if (r_amount == 1) {
- if (Math::abs( p_normal.dot(p_cast.normalized()) )<(1.0-_SEGMENT_IS_VALID_SUPPORT_TRESHOLD) ) {
+ if (Math::abs(p_normal.dot(p_cast.normalized())) < (1.0 - _SEGMENT_IS_VALID_SUPPORT_TRESHOLD)) {
//make line because they are parallel
- r_amount=2;
- r_supports[1]=r_supports[0]+p_cast;
- } else if (p_cast.dot(p_normal)>0) {
+ r_amount = 2;
+ r_supports[1] = r_supports[0] + p_cast;
+ } else if (p_cast.dot(p_normal) > 0) {
//normal points towards cast, add cast
- r_supports[0]+=p_cast;
+ r_supports[0] += p_cast;
}
} else {
- if (Math::abs( p_normal.dot(p_cast.normalized()) )<(1.0-_SEGMENT_IS_VALID_SUPPORT_TRESHOLD) ) {
+ if (Math::abs(p_normal.dot(p_cast.normalized())) < (1.0 - _SEGMENT_IS_VALID_SUPPORT_TRESHOLD)) {
//optimize line and make it larger because they are parallel
- if ((r_supports[1]-r_supports[0]).dot(p_cast)>0) {
+ if ((r_supports[1] - r_supports[0]).dot(p_cast) > 0) {
//larger towards 1
- r_supports[1]+=p_cast;
+ r_supports[1] += p_cast;
} else {
//larger towards 0
- r_supports[0]+=p_cast;
+ r_supports[0] += p_cast;
}
- } else if (p_cast.dot(p_normal)>0) {
+ } else if (p_cast.dot(p_normal) > 0) {
//normal points towards cast, add cast
- r_supports[0]+=p_cast;
- r_supports[1]+=p_cast;
+ r_supports[0] += p_cast;
+ r_supports[1] += p_cast;
}
-
}
}
@@ -141,305 +138,274 @@ public:
};
//let the optimizer do the magic
-#define DEFAULT_PROJECT_RANGE_CAST \
-virtual void project_range_castv(const Vector2& p_cast, const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const {\
- project_range_cast(p_cast,p_normal,p_transform,r_min,r_max);\
-}\
-_FORCE_INLINE_ void project_range_cast(const Vector2& p_cast, const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const {\
-\
- real_t mina,maxa;\
- real_t minb,maxb;\
- Matrix32 ofsb=p_transform;\
- ofsb.elements[2]+=p_cast;\
- project_range(p_normal,p_transform,mina,maxa);\
- project_range(p_normal,ofsb,minb,maxb); \
- r_min=MIN(mina,minb);\
- r_max=MAX(maxa,maxb);\
-}
+#define DEFAULT_PROJECT_RANGE_CAST \
+ virtual void project_range_castv(const Vector2 &p_cast, const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const { \
+ project_range_cast(p_cast, p_normal, p_transform, r_min, r_max); \
+ } \
+ _FORCE_INLINE_ void project_range_cast(const Vector2 &p_cast, const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const { \
+ \
+ real_t mina, maxa; \
+ real_t minb, maxb; \
+ Matrix32 ofsb = p_transform; \
+ ofsb.elements[2] += p_cast; \
+ project_range(p_normal, p_transform, mina, maxa); \
+ project_range(p_normal, ofsb, minb, maxb); \
+ r_min = MIN(mina, minb); \
+ r_max = MAX(maxa, maxb); \
+ }
class LineShape2DSW : public Shape2DSW {
-
Vector2 normal;
real_t d;
public:
-
_FORCE_INLINE_ Vector2 get_normal() const { return normal; }
_FORCE_INLINE_ real_t get_d() const { return d; }
virtual Physics2DServer::ShapeType get_type() const { return Physics2DServer::SHAPE_LINE; }
- virtual void project_rangev(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { project_range(p_normal,p_transform,r_min,r_max); }
- virtual void get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const;
+ virtual void project_rangev(const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const { project_range(p_normal, p_transform, r_min, r_max); }
+ virtual void get_supports(const Vector2 &p_normal, Vector2 *r_supports, int &r_amount) const;
- virtual bool contains_point(const Vector2& p_point) const;
- virtual bool intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const;
- virtual real_t get_moment_of_inertia(float p_mass,const Size2& p_scale) const;
+ virtual bool contains_point(const Vector2 &p_point) const;
+ virtual bool intersect_segment(const Vector2 &p_begin, const Vector2 &p_end, Vector2 &r_point, Vector2 &r_normal) const;
+ virtual real_t get_moment_of_inertia(float p_mass, const Size2 &p_scale) const;
- virtual void set_data(const Variant& p_data);
+ virtual void set_data(const Variant &p_data);
virtual Variant get_data() const;
- _FORCE_INLINE_ void project_range(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const {
+ _FORCE_INLINE_ void project_range(const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const {
//real large
- r_min=-1e10;
- r_max=1e10;
+ r_min = -1e10;
+ r_max = 1e10;
}
- virtual void project_range_castv(const Vector2& p_cast, const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const {
- project_range_cast(p_cast,p_normal,p_transform,r_min,r_max);
+ virtual void project_range_castv(const Vector2 &p_cast, const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const {
+ project_range_cast(p_cast, p_normal, p_transform, r_min, r_max);
}
- _FORCE_INLINE_ void project_range_cast(const Vector2& p_cast, const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const {
+ _FORCE_INLINE_ void project_range_cast(const Vector2 &p_cast, const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const {
//real large
- r_min=-1e10;
- r_max=1e10;
+ r_min = -1e10;
+ r_max = 1e10;
}
-
-
-
};
-
class RayShape2DSW : public Shape2DSW {
-
real_t length;
public:
-
-
- _FORCE_INLINE_ real_t get_length() const { return length; }
+ _FORCE_INLINE_ real_t get_length() const { return length; }
virtual Physics2DServer::ShapeType get_type() const { return Physics2DServer::SHAPE_RAY; }
- virtual void project_rangev(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { project_range(p_normal,p_transform,r_min,r_max); }
- virtual void get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const;
+ virtual void project_rangev(const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const { project_range(p_normal, p_transform, r_min, r_max); }
+ virtual void get_supports(const Vector2 &p_normal, Vector2 *r_supports, int &r_amount) const;
- virtual bool contains_point(const Vector2& p_point) const;
- virtual bool intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const;
- virtual real_t get_moment_of_inertia(float p_mass,const Size2& p_scale) const;
+ virtual bool contains_point(const Vector2 &p_point) const;
+ virtual bool intersect_segment(const Vector2 &p_begin, const Vector2 &p_end, Vector2 &r_point, Vector2 &r_normal) const;
+ virtual real_t get_moment_of_inertia(float p_mass, const Size2 &p_scale) const;
- virtual void set_data(const Variant& p_data);
+ virtual void set_data(const Variant &p_data);
virtual Variant get_data() const;
- _FORCE_INLINE_ void project_range(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const {
+ _FORCE_INLINE_ void project_range(const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const {
//real large
r_max = p_normal.dot(p_transform.get_origin());
- r_min = p_normal.dot(p_transform.xform(Vector2(0,length)));
- if (r_max<r_min) {
+ r_min = p_normal.dot(p_transform.xform(Vector2(0, length)));
+ if (r_max < r_min) {
- SWAP(r_max,r_min);
+ SWAP(r_max, r_min);
}
}
DEFAULT_PROJECT_RANGE_CAST
-
_FORCE_INLINE_ RayShape2DSW() {}
- _FORCE_INLINE_ RayShape2DSW(real_t p_length) { length=p_length; }
+ _FORCE_INLINE_ RayShape2DSW(real_t p_length) { length = p_length; }
};
-
class SegmentShape2DSW : public Shape2DSW {
-
Vector2 a;
Vector2 b;
Vector2 n;
public:
-
-
- _FORCE_INLINE_ const Vector2& get_a() const { return a; }
- _FORCE_INLINE_ const Vector2& get_b() const { return b; }
- _FORCE_INLINE_ const Vector2& get_normal() const { return n; }
+ _FORCE_INLINE_ const Vector2 &get_a() const { return a; }
+ _FORCE_INLINE_ const Vector2 &get_b() const { return b; }
+ _FORCE_INLINE_ const Vector2 &get_normal() const { return n; }
virtual Physics2DServer::ShapeType get_type() const { return Physics2DServer::SHAPE_SEGMENT; }
- _FORCE_INLINE_ Vector2 get_xformed_normal(const Matrix32& p_xform) const {
+ _FORCE_INLINE_ Vector2 get_xformed_normal(const Matrix32 &p_xform) const {
return (p_xform.xform(b) - p_xform.xform(a)).normalized().tangent();
}
- virtual void project_rangev(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { project_range(p_normal,p_transform,r_min,r_max); }
- virtual void get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const;
+ virtual void project_rangev(const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const { project_range(p_normal, p_transform, r_min, r_max); }
+ virtual void get_supports(const Vector2 &p_normal, Vector2 *r_supports, int &r_amount) const;
- virtual bool contains_point(const Vector2& p_point) const;
- virtual bool intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const;
- virtual real_t get_moment_of_inertia(float p_mass,const Size2& p_scale) const;
+ virtual bool contains_point(const Vector2 &p_point) const;
+ virtual bool intersect_segment(const Vector2 &p_begin, const Vector2 &p_end, Vector2 &r_point, Vector2 &r_normal) const;
+ virtual real_t get_moment_of_inertia(float p_mass, const Size2 &p_scale) const;
- virtual void set_data(const Variant& p_data);
+ virtual void set_data(const Variant &p_data);
virtual Variant get_data() const;
- _FORCE_INLINE_ void project_range(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const {
+ _FORCE_INLINE_ void project_range(const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const {
//real large
r_max = p_normal.dot(p_transform.xform(a));
r_min = p_normal.dot(p_transform.xform(b));
- if (r_max<r_min) {
+ if (r_max < r_min) {
- SWAP(r_max,r_min);
+ SWAP(r_max, r_min);
}
}
DEFAULT_PROJECT_RANGE_CAST
_FORCE_INLINE_ SegmentShape2DSW() {}
- _FORCE_INLINE_ SegmentShape2DSW(const Vector2& p_a,const Vector2& p_b,const Vector2& p_n) { a=p_a; b=p_b; n=p_n; }
+ _FORCE_INLINE_ SegmentShape2DSW(const Vector2 &p_a, const Vector2 &p_b, const Vector2 &p_n) {
+ a = p_a;
+ b = p_b;
+ n = p_n;
+ }
};
-
class CircleShape2DSW : public Shape2DSW {
-
real_t radius;
public:
-
- _FORCE_INLINE_ const real_t& get_radius() const { return radius; }
+ _FORCE_INLINE_ const real_t &get_radius() const { return radius; }
virtual Physics2DServer::ShapeType get_type() const { return Physics2DServer::SHAPE_CIRCLE; }
- virtual void project_rangev(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { project_range(p_normal,p_transform,r_min,r_max); }
- virtual void get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const;
+ virtual void project_rangev(const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const { project_range(p_normal, p_transform, r_min, r_max); }
+ virtual void get_supports(const Vector2 &p_normal, Vector2 *r_supports, int &r_amount) const;
- virtual bool contains_point(const Vector2& p_point) const;
- virtual bool intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const;
- virtual real_t get_moment_of_inertia(float p_mass,const Size2& p_scale) const;
+ virtual bool contains_point(const Vector2 &p_point) const;
+ virtual bool intersect_segment(const Vector2 &p_begin, const Vector2 &p_end, Vector2 &r_point, Vector2 &r_normal) const;
+ virtual real_t get_moment_of_inertia(float p_mass, const Size2 &p_scale) const;
- virtual void set_data(const Variant& p_data);
+ virtual void set_data(const Variant &p_data);
virtual Variant get_data() const;
- _FORCE_INLINE_ void project_range(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const {
+ _FORCE_INLINE_ void project_range(const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const {
//real large
- real_t d = p_normal.dot( p_transform.get_origin() );
+ real_t d = p_normal.dot(p_transform.get_origin());
// figure out scale at point
Vector2 local_normal = p_transform.basis_xform_inv(p_normal);
real_t scale = local_normal.length();
- r_min = d - (radius) * scale;
- r_max = d + (radius) * scale;
+ r_min = d - (radius)*scale;
+ r_max = d + (radius)*scale;
}
-
DEFAULT_PROJECT_RANGE_CAST
-
};
-
-
class RectangleShape2DSW : public Shape2DSW {
-
Vector2 half_extents;
public:
-
- _FORCE_INLINE_ const Vector2& get_half_extents() const { return half_extents; }
+ _FORCE_INLINE_ const Vector2 &get_half_extents() const { return half_extents; }
virtual Physics2DServer::ShapeType get_type() const { return Physics2DServer::SHAPE_RECTANGLE; }
- virtual void project_rangev(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { project_range(p_normal,p_transform,r_min,r_max); }
- virtual void get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const;
+ virtual void project_rangev(const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const { project_range(p_normal, p_transform, r_min, r_max); }
+ virtual void get_supports(const Vector2 &p_normal, Vector2 *r_supports, int &r_amount) const;
- virtual bool contains_point(const Vector2& p_point) const;
- virtual bool intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const;
- virtual real_t get_moment_of_inertia(float p_mass,const Size2& p_scale) const;
+ virtual bool contains_point(const Vector2 &p_point) const;
+ virtual bool intersect_segment(const Vector2 &p_begin, const Vector2 &p_end, Vector2 &r_point, Vector2 &r_normal) const;
+ virtual real_t get_moment_of_inertia(float p_mass, const Size2 &p_scale) const;
- virtual void set_data(const Variant& p_data);
+ virtual void set_data(const Variant &p_data);
virtual Variant get_data() const;
- _FORCE_INLINE_ void project_range(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const {
+ _FORCE_INLINE_ void project_range(const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const {
// no matter the angle, the box is mirrored anyway
- r_max=-1e20;
- r_min=1e20;
- for(int i=0;i<4;i++) {
-
- real_t d=p_normal.dot(p_transform.xform(Vector2( ((i&1)*2-1)*half_extents.x, ((i>>1)*2-1)*half_extents.y )));
+ r_max = -1e20;
+ r_min = 1e20;
+ for (int i = 0; i < 4; i++) {
- if (d>r_max)
- r_max=d;
- if (d<r_min)
- r_min=d;
+ real_t d = p_normal.dot(p_transform.xform(Vector2(((i & 1) * 2 - 1) * half_extents.x, ((i >> 1) * 2 - 1) * half_extents.y)));
+ if (d > r_max)
+ r_max = d;
+ if (d < r_min)
+ r_min = d;
}
}
-
-
- _FORCE_INLINE_ Vector2 get_circle_axis(const Matrix32& p_xform, const Matrix32& p_xform_inv,const Vector2& p_circle) const {
+ _FORCE_INLINE_ Vector2 get_circle_axis(const Matrix32 &p_xform, const Matrix32 &p_xform_inv, const Vector2 &p_circle) const {
Vector2 local_v = p_xform_inv.xform(p_circle);
Vector2 he(
- (local_v.x<0) ? -half_extents.x : half_extents.x,
- (local_v.y<0) ? -half_extents.y : half_extents.y
- );
+ (local_v.x < 0) ? -half_extents.x : half_extents.x,
+ (local_v.y < 0) ? -half_extents.y : half_extents.y);
- return (p_xform.xform(he)-p_circle).normalized();
+ return (p_xform.xform(he) - p_circle).normalized();
}
- _FORCE_INLINE_ Vector2 get_box_axis(const Matrix32& p_xform, const Matrix32& p_xform_inv,const RectangleShape2DSW *p_B,const Matrix32& p_B_xform, const Matrix32& p_B_xform_inv) const {
+ _FORCE_INLINE_ Vector2 get_box_axis(const Matrix32 &p_xform, const Matrix32 &p_xform_inv, const RectangleShape2DSW *p_B, const Matrix32 &p_B_xform, const Matrix32 &p_B_xform_inv) const {
- Vector2 a,b;
+ Vector2 a, b;
{
Vector2 local_v = p_xform_inv.xform(p_B_xform.get_origin());
Vector2 he(
- (local_v.x<0) ? -half_extents.x : half_extents.x,
- (local_v.y<0) ? -half_extents.y : half_extents.y
- );
-
- a=p_xform.xform(he);
+ (local_v.x < 0) ? -half_extents.x : half_extents.x,
+ (local_v.y < 0) ? -half_extents.y : half_extents.y);
+ a = p_xform.xform(he);
}
{
Vector2 local_v = p_B_xform_inv.xform(p_xform.get_origin());
Vector2 he(
- (local_v.x<0) ? -p_B->half_extents.x : p_B->half_extents.x,
- (local_v.y<0) ? -p_B->half_extents.y : p_B->half_extents.y
- );
-
- b=p_B_xform.xform(he);
+ (local_v.x < 0) ? -p_B->half_extents.x : p_B->half_extents.x,
+ (local_v.y < 0) ? -p_B->half_extents.y : p_B->half_extents.y);
+ b = p_B_xform.xform(he);
}
- return (a-b).normalized();
+ return (a - b).normalized();
}
-
DEFAULT_PROJECT_RANGE_CAST
-
};
class CapsuleShape2DSW : public Shape2DSW {
-
real_t radius;
real_t height;
public:
-
- _FORCE_INLINE_ const real_t& get_radius() const { return radius; }
- _FORCE_INLINE_ const real_t& get_height() const { return height; }
+ _FORCE_INLINE_ const real_t &get_radius() const { return radius; }
+ _FORCE_INLINE_ const real_t &get_height() const { return height; }
virtual Physics2DServer::ShapeType get_type() const { return Physics2DServer::SHAPE_CAPSULE; }
- virtual void project_rangev(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { project_range(p_normal,p_transform,r_min,r_max); }
- virtual void get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const;
+ virtual void project_rangev(const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const { project_range(p_normal, p_transform, r_min, r_max); }
+ virtual void get_supports(const Vector2 &p_normal, Vector2 *r_supports, int &r_amount) const;
- virtual bool contains_point(const Vector2& p_point) const;
- virtual bool intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const;
- virtual real_t get_moment_of_inertia(float p_mass,const Size2& p_scale) const;
+ virtual bool contains_point(const Vector2 &p_point) const;
+ virtual bool intersect_segment(const Vector2 &p_begin, const Vector2 &p_end, Vector2 &r_point, Vector2 &r_normal) const;
+ virtual real_t get_moment_of_inertia(float p_mass, const Size2 &p_scale) const;
- virtual void set_data(const Variant& p_data);
+ virtual void set_data(const Variant &p_data);
virtual Variant get_data() const;
- _FORCE_INLINE_ void project_range(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const {
+ _FORCE_INLINE_ void project_range(const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const {
// no matter the angle, the box is mirrored anyway
- Vector2 n=p_transform.basis_xform_inv(p_normal).normalized();
+ Vector2 n = p_transform.basis_xform_inv(p_normal).normalized();
float h = (n.y > 0) ? height : -height;
n *= radius;
@@ -448,24 +414,19 @@ public:
r_max = p_normal.dot(p_transform.xform(n));
r_min = p_normal.dot(p_transform.xform(-n));
- if (r_max<r_min) {
+ if (r_max < r_min) {
- SWAP(r_max,r_min);
+ SWAP(r_max, r_min);
}
//ERR_FAIL_COND( r_max < r_min );
}
DEFAULT_PROJECT_RANGE_CAST
-
};
-
-
-
class ConvexPolygonShape2DSW : public Shape2DSW {
-
struct Point {
Vector2 pos;
@@ -476,44 +437,41 @@ class ConvexPolygonShape2DSW : public Shape2DSW {
int point_count;
public:
-
_FORCE_INLINE_ int get_point_count() const { return point_count; }
- _FORCE_INLINE_ const Vector2& get_point(int p_idx) const { return points[p_idx].pos; }
- _FORCE_INLINE_ const Vector2& get_segment_normal(int p_idx) const { return points[p_idx].normal; }
- _FORCE_INLINE_ Vector2 get_xformed_segment_normal(const Matrix32& p_xform, int p_idx) const {
+ _FORCE_INLINE_ const Vector2 &get_point(int p_idx) const { return points[p_idx].pos; }
+ _FORCE_INLINE_ const Vector2 &get_segment_normal(int p_idx) const { return points[p_idx].normal; }
+ _FORCE_INLINE_ Vector2 get_xformed_segment_normal(const Matrix32 &p_xform, int p_idx) const {
Vector2 a = points[p_idx].pos;
p_idx++;
- Vector2 b = points[p_idx==point_count?0:p_idx].pos;
- return (p_xform.xform(b)-p_xform.xform(a)).normalized().tangent();
+ Vector2 b = points[p_idx == point_count ? 0 : p_idx].pos;
+ return (p_xform.xform(b) - p_xform.xform(a)).normalized().tangent();
}
virtual Physics2DServer::ShapeType get_type() const { return Physics2DServer::SHAPE_CONVEX_POLYGON; }
- virtual void project_rangev(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { project_range(p_normal,p_transform,r_min,r_max); }
- virtual void get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const;
+ virtual void project_rangev(const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const { project_range(p_normal, p_transform, r_min, r_max); }
+ virtual void get_supports(const Vector2 &p_normal, Vector2 *r_supports, int &r_amount) const;
- virtual bool contains_point(const Vector2& p_point) const;
- virtual bool intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const;
- virtual real_t get_moment_of_inertia(float p_mass,const Size2& p_scale) const;
+ virtual bool contains_point(const Vector2 &p_point) const;
+ virtual bool intersect_segment(const Vector2 &p_begin, const Vector2 &p_end, Vector2 &r_point, Vector2 &r_normal) const;
+ virtual real_t get_moment_of_inertia(float p_mass, const Size2 &p_scale) const;
- virtual void set_data(const Variant& p_data);
+ virtual void set_data(const Variant &p_data);
virtual Variant get_data() const;
- _FORCE_INLINE_ void project_range(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const {
+ _FORCE_INLINE_ void project_range(const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const {
// no matter the angle, the box is mirrored anyway
r_min = r_max = p_normal.dot(p_transform.xform(points[0].pos));
- for(int i=1;i<point_count;i++) {
+ for (int i = 1; i < point_count; i++) {
float d = p_normal.dot(p_transform.xform(points[i].pos));
- if (d>r_max)
- r_max=d;
- if (d<r_min)
- r_min=d;
-
+ if (d > r_max)
+ r_max = d;
+ if (d < r_min)
+ r_min = d;
}
-
}
DEFAULT_PROJECT_RANGE_CAST
@@ -522,16 +480,13 @@ public:
~ConvexPolygonShape2DSW();
};
-
class ConcaveShape2DSW : public Shape2DSW {
public:
-
virtual bool is_concave() const { return true; }
- typedef void (*Callback)(void* p_userdata,Shape2DSW *p_convex);
-
- virtual void cull(const Rect2& p_local_aabb,Callback p_callback,void* p_userdata) const=0;
+ typedef void (*Callback)(void *p_userdata, Shape2DSW *p_convex);
+ virtual void cull(const Rect2 &p_local_aabb, Callback p_callback, void *p_userdata) const = 0;
};
class ConcavePolygonShape2DSW : public ConcaveShape2DSW {
@@ -547,53 +502,50 @@ class ConcavePolygonShape2DSW : public ConcaveShape2DSW {
struct BVH {
Rect2 aabb;
- int left,right;
+ int left, right;
};
-
Vector<BVH> bvh;
int bvh_depth;
-
struct BVH_CompareX {
- _FORCE_INLINE_ bool operator ()(const BVH& a, const BVH& b) const {
+ _FORCE_INLINE_ bool operator()(const BVH &a, const BVH &b) const {
- return (a.aabb.pos.x+a.aabb.size.x*0.5) < (b.aabb.pos.x+b.aabb.size.x*0.5);
+ return (a.aabb.pos.x + a.aabb.size.x * 0.5) < (b.aabb.pos.x + b.aabb.size.x * 0.5);
}
};
struct BVH_CompareY {
- _FORCE_INLINE_ bool operator ()(const BVH& a, const BVH& b) const {
+ _FORCE_INLINE_ bool operator()(const BVH &a, const BVH &b) const {
- return (a.aabb.pos.y+a.aabb.size.y*0.5) < (b.aabb.pos.y+b.aabb.size.y*0.5);
+ return (a.aabb.pos.y + a.aabb.size.y * 0.5) < (b.aabb.pos.y + b.aabb.size.y * 0.5);
}
};
- int _generate_bvh(BVH *p_bvh,int p_len,int p_depth);
+ int _generate_bvh(BVH *p_bvh, int p_len, int p_depth);
public:
-
virtual Physics2DServer::ShapeType get_type() const { return Physics2DServer::SHAPE_CONCAVE_POLYGON; }
- virtual void project_rangev(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { /*project_range(p_normal,p_transform,r_min,r_max);*/ }
- virtual void project_range(const Vector2& p_normal, const Matrix32& p_transform, real_t &r_min, real_t &r_max) const { /*project_range(p_normal,p_transform,r_min,r_max);*/ }
- virtual void get_supports(const Vector2& p_normal,Vector2 *r_supports,int & r_amount) const;
+ virtual void project_rangev(const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const { /*project_range(p_normal,p_transform,r_min,r_max);*/
+ }
+ virtual void project_range(const Vector2 &p_normal, const Matrix32 &p_transform, real_t &r_min, real_t &r_max) const { /*project_range(p_normal,p_transform,r_min,r_max);*/
+ }
+ virtual void get_supports(const Vector2 &p_normal, Vector2 *r_supports, int &r_amount) const;
- virtual bool contains_point(const Vector2& p_point) const;
- virtual bool intersect_segment(const Vector2& p_begin,const Vector2& p_end,Vector2 &r_point, Vector2 &r_normal) const;
+ virtual bool contains_point(const Vector2 &p_point) const;
+ virtual bool intersect_segment(const Vector2 &p_begin, const Vector2 &p_end, Vector2 &r_point, Vector2 &r_normal) const;
- virtual real_t get_moment_of_inertia(float p_mass,const Size2& p_scale) const { return 0; }
+ virtual real_t get_moment_of_inertia(float p_mass, const Size2 &p_scale) const { return 0; }
- virtual void set_data(const Variant& p_data);
+ virtual void set_data(const Variant &p_data);
virtual Variant get_data() const;
- virtual void cull(const Rect2& p_local_aabb,Callback p_callback,void* p_userdata) const;
-
+ virtual void cull(const Rect2 &p_local_aabb, Callback p_callback, void *p_userdata) const;
DEFAULT_PROJECT_RANGE_CAST
-
};
#undef DEFAULT_PROJECT_RANGE_CAST
diff --git a/servers/physics_2d/space_2d_sw.cpp b/servers/physics_2d/space_2d_sw.cpp
index 8a08e8160..6a40c24e5 100644
--- a/servers/physics_2d/space_2d_sw.cpp
+++ b/servers/physics_2d/space_2d_sw.cpp
@@ -30,109 +30,101 @@
#include "collision_solver_2d_sw.h"
#include "physics_2d_server_sw.h"
-
_FORCE_INLINE_ static bool _match_object_type_query(CollisionObject2DSW *p_object, uint32_t p_layer_mask, uint32_t p_type_mask) {
- if ((p_object->get_layer_mask()&p_layer_mask)==0)
+ if ((p_object->get_layer_mask() & p_layer_mask) == 0)
return false;
- if (p_object->get_type()==CollisionObject2DSW::TYPE_AREA)
- return p_type_mask&Physics2DDirectSpaceState::TYPE_MASK_AREA;
-
- Body2DSW *body = static_cast<Body2DSW*>(p_object);
+ if (p_object->get_type() == CollisionObject2DSW::TYPE_AREA)
+ return p_type_mask & Physics2DDirectSpaceState::TYPE_MASK_AREA;
- return (1<<body->get_mode())&p_type_mask;
+ Body2DSW *body = static_cast<Body2DSW *>(p_object);
+ return (1 << body->get_mode()) & p_type_mask;
}
+int Physics2DDirectSpaceStateSW::intersect_point(const Vector2 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude, uint32_t p_layer_mask, uint32_t p_object_type_mask, bool p_pick_point) {
-int Physics2DDirectSpaceStateSW::intersect_point(const Vector2& p_point,ShapeResult *r_results,int p_result_max,const Set<RID>& p_exclude,uint32_t p_layer_mask,uint32_t p_object_type_mask,bool p_pick_point) {
-
- if (p_result_max<=0)
+ if (p_result_max <= 0)
return 0;
Rect2 aabb;
- aabb.pos=p_point-Vector2(0.00001,0.00001);
- aabb.size=Vector2(0.00002,0.00002);
+ aabb.pos = p_point - Vector2(0.00001, 0.00001);
+ aabb.size = Vector2(0.00002, 0.00002);
- int amount = space->broadphase->cull_aabb(aabb,space->intersection_query_results,Space2DSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results);
+ int amount = space->broadphase->cull_aabb(aabb, space->intersection_query_results, Space2DSW::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
- int cc=0;
+ int cc = 0;
- for(int i=0;i<amount;i++) {
+ for (int i = 0; i < amount; i++) {
- if (!_match_object_type_query(space->intersection_query_results[i],p_layer_mask,p_object_type_mask))
+ if (!_match_object_type_query(space->intersection_query_results[i], p_layer_mask, p_object_type_mask))
continue;
- if (p_exclude.has( space->intersection_query_results[i]->get_self()))
+ if (p_exclude.has(space->intersection_query_results[i]->get_self()))
continue;
- const CollisionObject2DSW *col_obj=space->intersection_query_results[i];
+ const CollisionObject2DSW *col_obj = space->intersection_query_results[i];
if (p_pick_point && !col_obj->is_pickable())
continue;
- int shape_idx=space->intersection_query_subindex_results[i];
+ int shape_idx = space->intersection_query_subindex_results[i];
- Shape2DSW * shape = col_obj->get_shape(shape_idx);
+ Shape2DSW *shape = col_obj->get_shape(shape_idx);
Vector2 local_point = (col_obj->get_transform() * col_obj->get_shape_transform(shape_idx)).affine_inverse().xform(p_point);
if (!shape->contains_point(local_point))
continue;
- if (cc>=p_result_max)
+ if (cc >= p_result_max)
continue;
- r_results[cc].collider_id=col_obj->get_instance_id();
- if (r_results[cc].collider_id!=0)
- r_results[cc].collider=ObjectDB::get_instance(r_results[cc].collider_id);
- r_results[cc].rid=col_obj->get_self();
- r_results[cc].shape=shape_idx;
- r_results[cc].metadata=col_obj->get_shape_metadata(shape_idx);
+ r_results[cc].collider_id = col_obj->get_instance_id();
+ if (r_results[cc].collider_id != 0)
+ r_results[cc].collider = ObjectDB::get_instance(r_results[cc].collider_id);
+ r_results[cc].rid = col_obj->get_self();
+ r_results[cc].shape = shape_idx;
+ r_results[cc].metadata = col_obj->get_shape_metadata(shape_idx);
cc++;
}
return cc;
-
-
}
-bool Physics2DDirectSpaceStateSW::intersect_ray(const Vector2& p_from, const Vector2& p_to,RayResult &r_result,const Set<RID>& p_exclude,uint32_t p_layer_mask,uint32_t p_object_type_mask) {
-
-
+bool Physics2DDirectSpaceStateSW::intersect_ray(const Vector2 &p_from, const Vector2 &p_to, RayResult &r_result, const Set<RID> &p_exclude, uint32_t p_layer_mask, uint32_t p_object_type_mask) {
- ERR_FAIL_COND_V(space->locked,false);
+ ERR_FAIL_COND_V(space->locked, false);
- Vector2 begin,end;
+ Vector2 begin, end;
Vector2 normal;
- begin=p_from;
- end=p_to;
- normal=(end-begin).normalized();
+ begin = p_from;
+ end = p_to;
+ normal = (end - begin).normalized();
- int amount = space->broadphase->cull_segment(begin,end,space->intersection_query_results,Space2DSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results);
+ int amount = space->broadphase->cull_segment(begin, end, space->intersection_query_results, Space2DSW::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
//todo, create another array tha references results, compute AABBs and check closest point to ray origin, sort, and stop evaluating results when beyond first collision
- bool collided=false;
- Vector2 res_point,res_normal;
+ bool collided = false;
+ Vector2 res_point, res_normal;
int res_shape;
const CollisionObject2DSW *res_obj;
- real_t min_d=1e10;
-
+ real_t min_d = 1e10;
- for(int i=0;i<amount;i++) {
+ for (int i = 0; i < amount; i++) {
- if (!_match_object_type_query(space->intersection_query_results[i],p_layer_mask,p_object_type_mask))
+ if (!_match_object_type_query(space->intersection_query_results[i], p_layer_mask, p_object_type_mask))
continue;
- if (p_exclude.has( space->intersection_query_results[i]->get_self()))
+ if (p_exclude.has(space->intersection_query_results[i]->get_self()))
continue;
- const CollisionObject2DSW *col_obj=space->intersection_query_results[i];
+ const CollisionObject2DSW *col_obj = space->intersection_query_results[i];
- int shape_idx=space->intersection_query_subindex_results[i];
+ int shape_idx = space->intersection_query_subindex_results[i];
Matrix32 inv_xform = col_obj->get_shape_inv_transform(shape_idx) * col_obj->get_inv_transform();
Vector2 local_from = inv_xform.xform(begin);
@@ -146,129 +138,111 @@ bool Physics2DDirectSpaceStateSW::intersect_ray(const Vector2& p_from, const Vec
const Shape2DSW *shape = col_obj->get_shape(shape_idx);
- Vector2 shape_point,shape_normal;
-
-
- if (shape->intersect_segment(local_from,local_to,shape_point,shape_normal)) {
-
+ Vector2 shape_point, shape_normal;
+ if (shape->intersect_segment(local_from, local_to, shape_point, shape_normal)) {
Matrix32 xform = col_obj->get_transform() * col_obj->get_shape_transform(shape_idx);
- shape_point=xform.xform(shape_point);
+ shape_point = xform.xform(shape_point);
real_t ld = normal.dot(shape_point);
+ if (ld < min_d) {
- if (ld<min_d) {
-
- min_d=ld;
- res_point=shape_point;
- res_normal=inv_xform.basis_xform_inv(shape_normal).normalized();
- res_shape=shape_idx;
- res_obj=col_obj;
- collided=true;
+ min_d = ld;
+ res_point = shape_point;
+ res_normal = inv_xform.basis_xform_inv(shape_normal).normalized();
+ res_shape = shape_idx;
+ res_obj = col_obj;
+ collided = true;
}
}
-
}
if (!collided)
return false;
-
- r_result.collider_id=res_obj->get_instance_id();
- if (r_result.collider_id!=0)
- r_result.collider=ObjectDB::get_instance(r_result.collider_id);
- r_result.normal=res_normal;
- r_result.metadata=res_obj->get_shape_metadata(res_shape);
- r_result.position=res_point;
- r_result.rid=res_obj->get_self();
- r_result.shape=res_shape;
+ r_result.collider_id = res_obj->get_instance_id();
+ if (r_result.collider_id != 0)
+ r_result.collider = ObjectDB::get_instance(r_result.collider_id);
+ r_result.normal = res_normal;
+ r_result.metadata = res_obj->get_shape_metadata(res_shape);
+ r_result.position = res_point;
+ r_result.rid = res_obj->get_self();
+ r_result.shape = res_shape;
return true;
-
}
+int Physics2DDirectSpaceStateSW::intersect_shape(const RID &p_shape, const Matrix32 &p_xform, const Vector2 &p_motion, float p_margin, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude, uint32_t p_layer_mask, uint32_t p_object_type_mask) {
-int Physics2DDirectSpaceStateSW::intersect_shape(const RID& p_shape, const Matrix32& p_xform,const Vector2& p_motion,float p_margin,ShapeResult *r_results,int p_result_max,const Set<RID>& p_exclude,uint32_t p_layer_mask,uint32_t p_object_type_mask) {
-
- if (p_result_max<=0)
+ if (p_result_max <= 0)
return 0;
Shape2DSW *shape = Physics2DServerSW::singletonsw->shape_owner.get(p_shape);
- ERR_FAIL_COND_V(!shape,0);
+ ERR_FAIL_COND_V(!shape, 0);
Rect2 aabb = p_xform.xform(shape->get_aabb());
- aabb=aabb.grow(p_margin);
+ aabb = aabb.grow(p_margin);
- int amount = space->broadphase->cull_aabb(aabb,space->intersection_query_results,p_result_max,space->intersection_query_subindex_results);
+ int amount = space->broadphase->cull_aabb(aabb, space->intersection_query_results, p_result_max, space->intersection_query_subindex_results);
- int cc=0;
+ int cc = 0;
- for(int i=0;i<amount;i++) {
+ for (int i = 0; i < amount; i++) {
- if (!_match_object_type_query(space->intersection_query_results[i],p_layer_mask,p_object_type_mask))
+ if (!_match_object_type_query(space->intersection_query_results[i], p_layer_mask, p_object_type_mask))
continue;
- if (p_exclude.has( space->intersection_query_results[i]->get_self()))
+ if (p_exclude.has(space->intersection_query_results[i]->get_self()))
continue;
+ const CollisionObject2DSW *col_obj = space->intersection_query_results[i];
+ int shape_idx = space->intersection_query_subindex_results[i];
- const CollisionObject2DSW *col_obj=space->intersection_query_results[i];
- int shape_idx=space->intersection_query_subindex_results[i];
-
- if (!CollisionSolver2DSW::solve(shape,p_xform,p_motion,col_obj->get_shape(shape_idx),col_obj->get_transform() * col_obj->get_shape_transform(shape_idx),Vector2(),NULL,NULL,NULL,p_margin))
+ if (!CollisionSolver2DSW::solve(shape, p_xform, p_motion, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), Vector2(), NULL, NULL, NULL, p_margin))
continue;
- r_results[cc].collider_id=col_obj->get_instance_id();
- if (r_results[cc].collider_id!=0)
- r_results[cc].collider=ObjectDB::get_instance(r_results[cc].collider_id);
- r_results[cc].rid=col_obj->get_self();
- r_results[cc].shape=shape_idx;
- r_results[cc].metadata=col_obj->get_shape_metadata(shape_idx);
+ r_results[cc].collider_id = col_obj->get_instance_id();
+ if (r_results[cc].collider_id != 0)
+ r_results[cc].collider = ObjectDB::get_instance(r_results[cc].collider_id);
+ r_results[cc].rid = col_obj->get_self();
+ r_results[cc].shape = shape_idx;
+ r_results[cc].metadata = col_obj->get_shape_metadata(shape_idx);
cc++;
-
}
return cc;
-
}
-
-
-bool Physics2DDirectSpaceStateSW::cast_motion(const RID& p_shape, const Matrix32& p_xform,const Vector2& p_motion,float p_margin,float &p_closest_safe,float &p_closest_unsafe, const Set<RID>& p_exclude,uint32_t p_layer_mask,uint32_t p_object_type_mask) {
-
-
+bool Physics2DDirectSpaceStateSW::cast_motion(const RID &p_shape, const Matrix32 &p_xform, const Vector2 &p_motion, float p_margin, float &p_closest_safe, float &p_closest_unsafe, const Set<RID> &p_exclude, uint32_t p_layer_mask, uint32_t p_object_type_mask) {
Shape2DSW *shape = Physics2DServerSW::singletonsw->shape_owner.get(p_shape);
- ERR_FAIL_COND_V(!shape,false);
+ ERR_FAIL_COND_V(!shape, false);
Rect2 aabb = p_xform.xform(shape->get_aabb());
- aabb=aabb.merge(Rect2(aabb.pos+p_motion,aabb.size)); //motion
- aabb=aabb.grow(p_margin);
+ aabb = aabb.merge(Rect2(aabb.pos + p_motion, aabb.size)); //motion
+ aabb = aabb.grow(p_margin);
//if (p_motion!=Vector2())
// print_line(p_motion);
- int amount = space->broadphase->cull_aabb(aabb,space->intersection_query_results,Space2DSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results);
+ int amount = space->broadphase->cull_aabb(aabb, space->intersection_query_results, Space2DSW::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
- float best_safe=1;
- float best_unsafe=1;
+ float best_safe = 1;
+ float best_unsafe = 1;
- for(int i=0;i<amount;i++) {
+ for (int i = 0; i < amount; i++) {
-
- if (!_match_object_type_query(space->intersection_query_results[i],p_layer_mask,p_object_type_mask))
+ if (!_match_object_type_query(space->intersection_query_results[i], p_layer_mask, p_object_type_mask))
continue;
- if (p_exclude.has( space->intersection_query_results[i]->get_self()))
+ if (p_exclude.has(space->intersection_query_results[i]->get_self()))
continue; //ignore excluded
-
- const CollisionObject2DSW *col_obj=space->intersection_query_results[i];
- int shape_idx=space->intersection_query_subindex_results[i];
-
+ const CollisionObject2DSW *col_obj = space->intersection_query_results[i];
+ int shape_idx = space->intersection_query_subindex_results[i];
/*if (col_obj->get_type()==CollisionObject2DSW::TYPE_BODY) {
@@ -279,21 +253,19 @@ bool Physics2DDirectSpaceStateSW::cast_motion(const RID& p_shape, const Matrix32
}
}*/
-
Matrix32 col_obj_xform = col_obj->get_transform() * col_obj->get_shape_transform(shape_idx);
//test initial overlap, does it collide if going all the way?
- if (!CollisionSolver2DSW::solve(shape,p_xform,p_motion,col_obj->get_shape(shape_idx),col_obj_xform,Vector2() ,NULL,NULL,NULL,p_margin)) {
+ if (!CollisionSolver2DSW::solve(shape, p_xform, p_motion, col_obj->get_shape(shape_idx), col_obj_xform, Vector2(), NULL, NULL, NULL, p_margin)) {
continue;
}
-
//test initial overlap
- if (CollisionSolver2DSW::solve(shape,p_xform,Vector2(),col_obj->get_shape(shape_idx),col_obj_xform,Vector2() ,NULL,NULL,NULL,p_margin)) {
+ if (CollisionSolver2DSW::solve(shape, p_xform, Vector2(), col_obj->get_shape(shape_idx), col_obj_xform, Vector2(), NULL, NULL, NULL, p_margin)) {
- if (col_obj->get_type()==CollisionObject2DSW::TYPE_BODY) {
+ if (col_obj->get_type() == CollisionObject2DSW::TYPE_BODY) {
//if one way collision direction ignore initial overlap
- const Body2DSW *body=static_cast<const Body2DSW*>(col_obj);
- if (body->get_one_way_collision_direction()!=Vector2()) {
+ const Body2DSW *body = static_cast<const Body2DSW *>(col_obj);
+ if (body->get_one_way_collision_direction() != Vector2()) {
continue;
}
}
@@ -301,131 +273,119 @@ bool Physics2DDirectSpaceStateSW::cast_motion(const RID& p_shape, const Matrix32
return false;
}
-
//just do kinematic solving
- float low=0;
- float hi=1;
- Vector2 mnormal=p_motion.normalized();
+ float low = 0;
+ float hi = 1;
+ Vector2 mnormal = p_motion.normalized();
- for(int i=0;i<8;i++) { //steps should be customizable..
+ for (int i = 0; i < 8; i++) { //steps should be customizable..
- float ofs = (low+hi)*0.5;
+ float ofs = (low + hi) * 0.5;
- Vector2 sep=mnormal; //important optimization for this to work fast enough
- bool collided = CollisionSolver2DSW::solve(shape,p_xform,p_motion*ofs,col_obj->get_shape(shape_idx),col_obj_xform,Vector2(),NULL,NULL,&sep,p_margin);
+ Vector2 sep = mnormal; //important optimization for this to work fast enough
+ bool collided = CollisionSolver2DSW::solve(shape, p_xform, p_motion * ofs, col_obj->get_shape(shape_idx), col_obj_xform, Vector2(), NULL, NULL, &sep, p_margin);
if (collided) {
- hi=ofs;
+ hi = ofs;
} else {
- low=ofs;
+ low = ofs;
}
}
- if (col_obj->get_type()==CollisionObject2DSW::TYPE_BODY) {
+ if (col_obj->get_type() == CollisionObject2DSW::TYPE_BODY) {
- const Body2DSW *body=static_cast<const Body2DSW*>(col_obj);
- if (body->get_one_way_collision_direction()!=Vector2()) {
+ const Body2DSW *body = static_cast<const Body2DSW *>(col_obj);
+ if (body->get_one_way_collision_direction() != Vector2()) {
Vector2 cd[2];
Physics2DServerSW::CollCbkData cbk;
- cbk.max=1;
- cbk.amount=0;
- cbk.ptr=cd;
- cbk.valid_dir=body->get_one_way_collision_direction();
- cbk.valid_depth=body->get_one_way_collision_max_depth();
+ cbk.max = 1;
+ cbk.amount = 0;
+ cbk.ptr = cd;
+ cbk.valid_dir = body->get_one_way_collision_direction();
+ cbk.valid_depth = body->get_one_way_collision_max_depth();
- Vector2 sep=mnormal; //important optimization for this to work fast enough
- bool collided = CollisionSolver2DSW::solve(shape,p_xform,p_motion*(hi+space->contact_max_allowed_penetration),col_obj->get_shape(shape_idx),col_obj_xform,Vector2(),Physics2DServerSW::_shape_col_cbk,&cbk,&sep,p_margin);
- if (!collided || cbk.amount==0) {
+ Vector2 sep = mnormal; //important optimization for this to work fast enough
+ bool collided = CollisionSolver2DSW::solve(shape, p_xform, p_motion * (hi + space->contact_max_allowed_penetration), col_obj->get_shape(shape_idx), col_obj_xform, Vector2(), Physics2DServerSW::_shape_col_cbk, &cbk, &sep, p_margin);
+ if (!collided || cbk.amount == 0) {
continue;
}
-
}
}
-
- if (low<best_safe) {
- best_safe=low;
- best_unsafe=hi;
+ if (low < best_safe) {
+ best_safe = low;
+ best_unsafe = hi;
}
-
}
- p_closest_safe=best_safe;
- p_closest_unsafe=best_unsafe;
+ p_closest_safe = best_safe;
+ p_closest_unsafe = best_unsafe;
return true;
-
-
}
+bool Physics2DDirectSpaceStateSW::collide_shape(RID p_shape, const Matrix32 &p_shape_xform, const Vector2 &p_motion, float p_margin, Vector2 *r_results, int p_result_max, int &r_result_count, const Set<RID> &p_exclude, uint32_t p_layer_mask, uint32_t p_object_type_mask) {
-bool Physics2DDirectSpaceStateSW::collide_shape(RID p_shape, const Matrix32& p_shape_xform,const Vector2& p_motion,float p_margin,Vector2 *r_results,int p_result_max,int &r_result_count, const Set<RID>& p_exclude,uint32_t p_layer_mask,uint32_t p_object_type_mask) {
-
-
- if (p_result_max<=0)
+ if (p_result_max <= 0)
return 0;
Shape2DSW *shape = Physics2DServerSW::singletonsw->shape_owner.get(p_shape);
- ERR_FAIL_COND_V(!shape,0);
+ ERR_FAIL_COND_V(!shape, 0);
Rect2 aabb = p_shape_xform.xform(shape->get_aabb());
- aabb=aabb.merge(Rect2(aabb.pos+p_motion,aabb.size)); //motion
- aabb=aabb.grow(p_margin);
+ aabb = aabb.merge(Rect2(aabb.pos + p_motion, aabb.size)); //motion
+ aabb = aabb.grow(p_margin);
- int amount = space->broadphase->cull_aabb(aabb,space->intersection_query_results,Space2DSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results);
+ int amount = space->broadphase->cull_aabb(aabb, space->intersection_query_results, Space2DSW::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
- bool collided=false;
- r_result_count=0;
+ bool collided = false;
+ r_result_count = 0;
Physics2DServerSW::CollCbkData cbk;
- cbk.max=p_result_max;
- cbk.amount=0;
- cbk.ptr=r_results;
- CollisionSolver2DSW::CallbackResult cbkres=NULL;
+ cbk.max = p_result_max;
+ cbk.amount = 0;
+ cbk.ptr = r_results;
+ CollisionSolver2DSW::CallbackResult cbkres = NULL;
- Physics2DServerSW::CollCbkData *cbkptr=NULL;
- if (p_result_max>0) {
- cbkptr=&cbk;
- cbkres=Physics2DServerSW::_shape_col_cbk;
+ Physics2DServerSW::CollCbkData *cbkptr = NULL;
+ if (p_result_max > 0) {
+ cbkptr = &cbk;
+ cbkres = Physics2DServerSW::_shape_col_cbk;
}
+ for (int i = 0; i < amount; i++) {
- for(int i=0;i<amount;i++) {
-
- if (!_match_object_type_query(space->intersection_query_results[i],p_layer_mask,p_object_type_mask))
+ if (!_match_object_type_query(space->intersection_query_results[i], p_layer_mask, p_object_type_mask))
continue;
- const CollisionObject2DSW *col_obj=space->intersection_query_results[i];
- int shape_idx=space->intersection_query_subindex_results[i];
+ const CollisionObject2DSW *col_obj = space->intersection_query_results[i];
+ int shape_idx = space->intersection_query_subindex_results[i];
- if (p_exclude.has( col_obj->get_self() ))
+ if (p_exclude.has(col_obj->get_self()))
continue;
- if (col_obj->get_type()==CollisionObject2DSW::TYPE_BODY) {
+ if (col_obj->get_type() == CollisionObject2DSW::TYPE_BODY) {
- const Body2DSW *body=static_cast<const Body2DSW*>(col_obj);
- cbk.valid_dir=body->get_one_way_collision_direction();
- cbk.valid_depth=body->get_one_way_collision_max_depth();
+ const Body2DSW *body = static_cast<const Body2DSW *>(col_obj);
+ cbk.valid_dir = body->get_one_way_collision_direction();
+ cbk.valid_depth = body->get_one_way_collision_max_depth();
} else {
- cbk.valid_dir=Vector2();
- cbk.valid_depth=0;
+ cbk.valid_dir = Vector2();
+ cbk.valid_depth = 0;
}
- if (CollisionSolver2DSW::solve(shape,p_shape_xform,p_motion,col_obj->get_shape(shape_idx),col_obj->get_transform() * col_obj->get_shape_transform(shape_idx),Vector2(),cbkres,cbkptr,NULL,p_margin)) {
- collided=p_result_max==0 || cbk.amount>0;
+ if (CollisionSolver2DSW::solve(shape, p_shape_xform, p_motion, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), Vector2(), cbkres, cbkptr, NULL, p_margin)) {
+ collided = p_result_max == 0 || cbk.amount > 0;
}
-
}
-
- r_result_count=cbk.amount;
+ r_result_count = cbk.amount;
return collided;
}
-
struct _RestCallbackData2D {
const CollisionObject2DSW *object;
@@ -439,20 +399,18 @@ struct _RestCallbackData2D {
float valid_depth;
};
-static void _rest_cbk_result(const Vector2& p_point_A,const Vector2& p_point_B,void *p_userdata) {
-
+static void _rest_cbk_result(const Vector2 &p_point_A, const Vector2 &p_point_B, void *p_userdata) {
- _RestCallbackData2D *rd=(_RestCallbackData2D*)p_userdata;
+ _RestCallbackData2D *rd = (_RestCallbackData2D *)p_userdata;
- if (rd->valid_dir!=Vector2()) {
+ if (rd->valid_dir != Vector2()) {
- if (rd->valid_dir!=Vector2()) {
- if (p_point_A.distance_squared_to(p_point_B)>rd->valid_depth*rd->valid_depth)
+ if (rd->valid_dir != Vector2()) {
+ if (p_point_A.distance_squared_to(p_point_B) > rd->valid_depth * rd->valid_depth)
return;
- if (rd->valid_dir.dot((p_point_A-p_point_B).normalized())<Math_PI*0.25)
+ if (rd->valid_dir.dot((p_point_A - p_point_B).normalized()) < Math_PI * 0.25)
return;
}
-
}
Vector2 contact_rel = p_point_B - p_point_A;
@@ -460,139 +418,121 @@ static void _rest_cbk_result(const Vector2& p_point_A,const Vector2& p_point_B,v
if (len <= rd->best_len)
return;
-
- rd->best_len=len;
- rd->best_contact=p_point_B;
- rd->best_normal=contact_rel/len;
- rd->best_object=rd->object;
- rd->best_shape=rd->shape;
-
-
+ rd->best_len = len;
+ rd->best_contact = p_point_B;
+ rd->best_normal = contact_rel / len;
+ rd->best_object = rd->object;
+ rd->best_shape = rd->shape;
}
-
-bool Physics2DDirectSpaceStateSW::rest_info(RID p_shape, const Matrix32& p_shape_xform,const Vector2& p_motion,float p_margin,ShapeRestInfo *r_info, const Set<RID>& p_exclude,uint32_t p_layer_mask,uint32_t p_object_type_mask) {
-
+bool Physics2DDirectSpaceStateSW::rest_info(RID p_shape, const Matrix32 &p_shape_xform, const Vector2 &p_motion, float p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude, uint32_t p_layer_mask, uint32_t p_object_type_mask) {
Shape2DSW *shape = Physics2DServerSW::singletonsw->shape_owner.get(p_shape);
- ERR_FAIL_COND_V(!shape,0);
+ ERR_FAIL_COND_V(!shape, 0);
Rect2 aabb = p_shape_xform.xform(shape->get_aabb());
- aabb=aabb.merge(Rect2(aabb.pos+p_motion,aabb.size)); //motion
- aabb=aabb.grow(p_margin);
+ aabb = aabb.merge(Rect2(aabb.pos + p_motion, aabb.size)); //motion
+ aabb = aabb.grow(p_margin);
- int amount = space->broadphase->cull_aabb(aabb,space->intersection_query_results,Space2DSW::INTERSECTION_QUERY_MAX,space->intersection_query_subindex_results);
+ int amount = space->broadphase->cull_aabb(aabb, space->intersection_query_results, Space2DSW::INTERSECTION_QUERY_MAX, space->intersection_query_subindex_results);
_RestCallbackData2D rcd;
- rcd.best_len=0;
- rcd.best_object=NULL;
- rcd.best_shape=0;
-
- for(int i=0;i<amount;i++) {
+ rcd.best_len = 0;
+ rcd.best_object = NULL;
+ rcd.best_shape = 0;
+ for (int i = 0; i < amount; i++) {
- if (!_match_object_type_query(space->intersection_query_results[i],p_layer_mask,p_object_type_mask))
+ if (!_match_object_type_query(space->intersection_query_results[i], p_layer_mask, p_object_type_mask))
continue;
- const CollisionObject2DSW *col_obj=space->intersection_query_results[i];
- int shape_idx=space->intersection_query_subindex_results[i];
+ const CollisionObject2DSW *col_obj = space->intersection_query_results[i];
+ int shape_idx = space->intersection_query_subindex_results[i];
- if (p_exclude.has( col_obj->get_self() ))
+ if (p_exclude.has(col_obj->get_self()))
continue;
- if (col_obj->get_type()==CollisionObject2DSW::TYPE_BODY) {
+ if (col_obj->get_type() == CollisionObject2DSW::TYPE_BODY) {
- const Body2DSW *body=static_cast<const Body2DSW*>(col_obj);
- rcd.valid_dir=body->get_one_way_collision_direction();
- rcd.valid_depth=body->get_one_way_collision_max_depth();
+ const Body2DSW *body = static_cast<const Body2DSW *>(col_obj);
+ rcd.valid_dir = body->get_one_way_collision_direction();
+ rcd.valid_depth = body->get_one_way_collision_max_depth();
} else {
- rcd.valid_dir=Vector2();
- rcd.valid_depth=0;
+ rcd.valid_dir = Vector2();
+ rcd.valid_depth = 0;
}
-
- rcd.object=col_obj;
- rcd.shape=shape_idx;
- bool sc = CollisionSolver2DSW::solve(shape,p_shape_xform,p_motion,col_obj->get_shape(shape_idx),col_obj->get_transform() * col_obj->get_shape_transform(shape_idx),Vector2() ,_rest_cbk_result,&rcd,NULL,p_margin);
+ rcd.object = col_obj;
+ rcd.shape = shape_idx;
+ bool sc = CollisionSolver2DSW::solve(shape, p_shape_xform, p_motion, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), Vector2(), _rest_cbk_result, &rcd, NULL, p_margin);
if (!sc)
continue;
-
-
}
- if (rcd.best_len==0)
+ if (rcd.best_len == 0)
return false;
- r_info->collider_id=rcd.best_object->get_instance_id();
- r_info->shape=rcd.best_shape;
- r_info->normal=rcd.best_normal;
- r_info->point=rcd.best_contact;
- r_info->rid=rcd.best_object->get_self();
- r_info->metadata=rcd.best_object->get_shape_metadata(rcd.best_shape);
- if (rcd.best_object->get_type()==CollisionObject2DSW::TYPE_BODY) {
+ r_info->collider_id = rcd.best_object->get_instance_id();
+ r_info->shape = rcd.best_shape;
+ r_info->normal = rcd.best_normal;
+ r_info->point = rcd.best_contact;
+ r_info->rid = rcd.best_object->get_self();
+ r_info->metadata = rcd.best_object->get_shape_metadata(rcd.best_shape);
+ if (rcd.best_object->get_type() == CollisionObject2DSW::TYPE_BODY) {
- const Body2DSW *body = static_cast<const Body2DSW*>(rcd.best_object);
- Vector2 rel_vec = r_info->point-body->get_transform().get_origin();
+ const Body2DSW *body = static_cast<const Body2DSW *>(rcd.best_object);
+ Vector2 rel_vec = r_info->point - body->get_transform().get_origin();
r_info->linear_velocity = Vector2(-body->get_angular_velocity() * rel_vec.y, body->get_angular_velocity() * rel_vec.x) + body->get_linear_velocity();
} else {
- r_info->linear_velocity=Vector2();
+ r_info->linear_velocity = Vector2();
}
return true;
}
-
Physics2DDirectSpaceStateSW::Physics2DDirectSpaceStateSW() {
-
- space=NULL;
+ space = NULL;
}
-
////////////////////////////////////////////////////////////////////////////////////////////////////////////
+int Space2DSW::_cull_aabb_for_body(Body2DSW *p_body, const Rect2 &p_aabb) {
+ int amount = broadphase->cull_aabb(p_aabb, intersection_query_results, INTERSECTION_QUERY_MAX, intersection_query_subindex_results);
+ for (int i = 0; i < amount; i++) {
-int Space2DSW::_cull_aabb_for_body(Body2DSW *p_body,const Rect2& p_aabb) {
-
-
- int amount = broadphase->cull_aabb(p_aabb,intersection_query_results,INTERSECTION_QUERY_MAX,intersection_query_subindex_results);
-
- for(int i=0;i<amount;i++) {
+ bool keep = true;
- bool keep=true;
-
- if (intersection_query_results[i]==p_body)
- keep=false;
- else if (intersection_query_results[i]->get_type()==CollisionObject2DSW::TYPE_AREA)
- keep=false;
- else if ((static_cast<Body2DSW*>(intersection_query_results[i])->test_collision_mask(p_body))==0)
- keep=false;
- else if (static_cast<Body2DSW*>(intersection_query_results[i])->has_exception(p_body->get_self()) || p_body->has_exception(intersection_query_results[i]->get_self()))
- keep=false;
- else if (static_cast<Body2DSW*>(intersection_query_results[i])->is_shape_set_as_trigger(intersection_query_subindex_results[i]))
- keep=false;
+ if (intersection_query_results[i] == p_body)
+ keep = false;
+ else if (intersection_query_results[i]->get_type() == CollisionObject2DSW::TYPE_AREA)
+ keep = false;
+ else if ((static_cast<Body2DSW *>(intersection_query_results[i])->test_collision_mask(p_body)) == 0)
+ keep = false;
+ else if (static_cast<Body2DSW *>(intersection_query_results[i])->has_exception(p_body->get_self()) || p_body->has_exception(intersection_query_results[i]->get_self()))
+ keep = false;
+ else if (static_cast<Body2DSW *>(intersection_query_results[i])->is_shape_set_as_trigger(intersection_query_subindex_results[i]))
+ keep = false;
if (!keep) {
- if (i<amount-1) {
- SWAP(intersection_query_results[i],intersection_query_results[amount-1]);
- SWAP(intersection_query_subindex_results[i],intersection_query_subindex_results[amount-1]);
-
+ if (i < amount - 1) {
+ SWAP(intersection_query_results[i], intersection_query_results[amount - 1]);
+ SWAP(intersection_query_subindex_results[i], intersection_query_subindex_results[amount - 1]);
}
amount--;
i--;
-
}
}
return amount;
}
-bool Space2DSW::test_body_motion(Body2DSW *p_body, const Matrix32 &p_from, const Vector2&p_motion, float p_margin, Physics2DServer::MotionResult *r_result) {
+bool Space2DSW::test_body_motion(Body2DSW *p_body, const Matrix32 &p_from, const Vector2 &p_motion, float p_margin, Physics2DServer::MotionResult *r_result) {
//give me back regular physics engine logic
//this is madness
@@ -602,24 +542,23 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Matrix32 &p_from, const
//but is it right? who knows at this point..
if (r_result) {
- r_result->collider_id=0;
- r_result->collider_shape=0;
-
+ r_result->collider_id = 0;
+ r_result->collider_shape = 0;
}
Rect2 body_aabb;
- for(int i=0;i<p_body->get_shape_count();i++) {
+ for (int i = 0; i < p_body->get_shape_count(); i++) {
- if (i==0)
- body_aabb=p_body->get_shape_aabb(i);
+ if (i == 0)
+ body_aabb = p_body->get_shape_aabb(i);
else
- body_aabb=body_aabb.merge(p_body->get_shape_aabb(i));
+ body_aabb = body_aabb.merge(p_body->get_shape_aabb(i));
}
// Undo the currently transform the physics server is aware of and apply the provided one
- body_aabb=p_from.xform(p_body->get_inv_transform().xform(body_aabb));
+ body_aabb = p_from.xform(p_body->get_inv_transform().xform(body_aabb));
- body_aabb=body_aabb.grow(p_margin);
+ body_aabb = body_aabb.grow(p_margin);
Matrix32 body_transform = p_from;
@@ -627,69 +566,67 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Matrix32 &p_from, const
//STEP 1, FREE BODY IF STUCK
const int max_results = 32;
- int recover_attempts=4;
- Vector2 sr[max_results*2];
+ int recover_attempts = 4;
+ Vector2 sr[max_results * 2];
do {
Physics2DServerSW::CollCbkData cbk;
- cbk.max=max_results;
- cbk.amount=0;
- cbk.ptr=sr;
+ cbk.max = max_results;
+ cbk.amount = 0;
+ cbk.ptr = sr;
+ CollisionSolver2DSW::CallbackResult cbkres = NULL;
- CollisionSolver2DSW::CallbackResult cbkres=NULL;
+ Physics2DServerSW::CollCbkData *cbkptr = NULL;
+ cbkptr = &cbk;
+ cbkres = Physics2DServerSW::_shape_col_cbk;
- Physics2DServerSW::CollCbkData *cbkptr=NULL;
- cbkptr=&cbk;
- cbkres=Physics2DServerSW::_shape_col_cbk;
+ bool collided = false;
- bool collided=false;
+ int amount = _cull_aabb_for_body(p_body, body_aabb);
- int amount = _cull_aabb_for_body(p_body,body_aabb);
-
- for(int j=0;j<p_body->get_shape_count();j++) {
+ for (int j = 0; j < p_body->get_shape_count(); j++) {
if (p_body->is_shape_set_as_trigger(j))
continue;
Matrix32 body_shape_xform = body_transform * p_body->get_shape_transform(j);
Shape2DSW *body_shape = p_body->get_shape(j);
- for(int i=0;i<amount;i++) {
+ for (int i = 0; i < amount; i++) {
- const CollisionObject2DSW *col_obj=intersection_query_results[i];
- int shape_idx=intersection_query_subindex_results[i];
+ const CollisionObject2DSW *col_obj = intersection_query_results[i];
+ int shape_idx = intersection_query_subindex_results[i];
- if (col_obj->get_type()==CollisionObject2DSW::TYPE_BODY) {
+ if (col_obj->get_type() == CollisionObject2DSW::TYPE_BODY) {
- const Body2DSW *body=static_cast<const Body2DSW*>(col_obj);
+ const Body2DSW *body = static_cast<const Body2DSW *>(col_obj);
Vector2 cdir = body->get_one_way_collision_direction();
//if (cdir!=Vector2() && p_motion.dot(cdir)<0)
// continue;
- cbk.valid_dir=cdir;
- cbk.valid_depth=body->get_one_way_collision_max_depth();
+ cbk.valid_dir = cdir;
+ cbk.valid_depth = body->get_one_way_collision_max_depth();
} else {
- cbk.valid_dir=Vector2();
- cbk.valid_depth=0;
+ cbk.valid_dir = Vector2();
+ cbk.valid_depth = 0;
}
- if (CollisionSolver2DSW::solve(body_shape,body_shape_xform,Vector2(),col_obj->get_shape(shape_idx),col_obj->get_transform() * col_obj->get_shape_transform(shape_idx),Vector2(),cbkres,cbkptr,NULL,p_margin)) {
- collided=cbk.amount>0;
+ if (CollisionSolver2DSW::solve(body_shape, body_shape_xform, Vector2(), col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), Vector2(), cbkres, cbkptr, NULL, p_margin)) {
+ collided = cbk.amount > 0;
}
}
}
-
if (!collided)
break;
Vector2 recover_motion;
- for(int i=0;i<cbk.amount;i++) {
+ for (int i = 0; i < cbk.amount; i++) {
- Vector2 a = sr[i*2+0];
- Vector2 b = sr[i*2+1];
+ Vector2 a = sr[i * 2 + 0];
+ Vector2 b = sr[i * 2 + 1];
#if 0
Vector2 rel = b-a;
@@ -702,42 +639,40 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Matrix32 &p_from, const
a+=n*traveled;
#endif
- // float d = a.distance_to(b);
+ // float d = a.distance_to(b);
//if (d<margin)
/// continue;
- recover_motion+=(b-a)*0.4;
+ recover_motion += (b - a) * 0.4;
}
- if (recover_motion==Vector2()) {
- collided=false;
+ if (recover_motion == Vector2()) {
+ collided = false;
break;
}
- body_transform.elements[2]+=recover_motion;
- body_aabb.pos+=recover_motion;
+ body_transform.elements[2] += recover_motion;
+ body_aabb.pos += recover_motion;
recover_attempts--;
} while (recover_attempts);
}
-
-
float safe = 1.0;
float unsafe = 1.0;
- int best_shape=-1;
+ int best_shape = -1;
{
// STEP 2 ATTEMPT MOTION
- Rect2 motion_aabb=body_aabb;
- motion_aabb.pos+=p_motion;
- motion_aabb=motion_aabb.merge(body_aabb);
+ Rect2 motion_aabb = body_aabb;
+ motion_aabb.pos += p_motion;
+ motion_aabb = motion_aabb.merge(body_aabb);
- int amount = _cull_aabb_for_body(p_body,motion_aabb);
+ int amount = _cull_aabb_for_body(p_body, motion_aabb);
- for(int j=0;j<p_body->get_shape_count();j++) {
+ for (int j = 0; j < p_body->get_shape_count(); j++) {
if (p_body->is_shape_set_as_trigger(j))
continue;
@@ -745,201 +680,189 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Matrix32 &p_from, const
Matrix32 body_shape_xform = body_transform * p_body->get_shape_transform(j);
Shape2DSW *body_shape = p_body->get_shape(j);
- bool stuck=false;
+ bool stuck = false;
- float best_safe=1;
- float best_unsafe=1;
+ float best_safe = 1;
+ float best_unsafe = 1;
- for(int i=0;i<amount;i++) {
-
- const CollisionObject2DSW *col_obj=intersection_query_results[i];
- int shape_idx=intersection_query_subindex_results[i];
+ for (int i = 0; i < amount; i++) {
+ const CollisionObject2DSW *col_obj = intersection_query_results[i];
+ int shape_idx = intersection_query_subindex_results[i];
Matrix32 col_obj_xform = col_obj->get_transform() * col_obj->get_shape_transform(shape_idx);
//test initial overlap, does it collide if going all the way?
- if (!CollisionSolver2DSW::solve(body_shape,body_shape_xform,p_motion,col_obj->get_shape(shape_idx),col_obj_xform,Vector2() ,NULL,NULL,NULL,0)) {
+ if (!CollisionSolver2DSW::solve(body_shape, body_shape_xform, p_motion, col_obj->get_shape(shape_idx), col_obj_xform, Vector2(), NULL, NULL, NULL, 0)) {
continue;
}
-
//test initial overlap
- if (CollisionSolver2DSW::solve(body_shape,body_shape_xform,Vector2(),col_obj->get_shape(shape_idx),col_obj_xform,Vector2() ,NULL,NULL,NULL,0)) {
+ if (CollisionSolver2DSW::solve(body_shape, body_shape_xform, Vector2(), col_obj->get_shape(shape_idx), col_obj_xform, Vector2(), NULL, NULL, NULL, 0)) {
- if (col_obj->get_type()==CollisionObject2DSW::TYPE_BODY) {
+ if (col_obj->get_type() == CollisionObject2DSW::TYPE_BODY) {
//if one way collision direction ignore initial overlap
- const Body2DSW *body=static_cast<const Body2DSW*>(col_obj);
- if (body->get_one_way_collision_direction()!=Vector2()) {
+ const Body2DSW *body = static_cast<const Body2DSW *>(col_obj);
+ if (body->get_one_way_collision_direction() != Vector2()) {
continue;
}
}
- stuck=true;
+ stuck = true;
break;
}
-
//just do kinematic solving
- float low=0;
- float hi=1;
- Vector2 mnormal=p_motion.normalized();
+ float low = 0;
+ float hi = 1;
+ Vector2 mnormal = p_motion.normalized();
- for(int i=0;i<8;i++) { //steps should be customizable..
+ for (int i = 0; i < 8; i++) { //steps should be customizable..
- float ofs = (low+hi)*0.5;
+ float ofs = (low + hi) * 0.5;
- Vector2 sep=mnormal; //important optimization for this to work fast enough
- bool collided = CollisionSolver2DSW::solve(body_shape,body_shape_xform,p_motion*ofs,col_obj->get_shape(shape_idx),col_obj_xform,Vector2(),NULL,NULL,&sep,0);
+ Vector2 sep = mnormal; //important optimization for this to work fast enough
+ bool collided = CollisionSolver2DSW::solve(body_shape, body_shape_xform, p_motion * ofs, col_obj->get_shape(shape_idx), col_obj_xform, Vector2(), NULL, NULL, &sep, 0);
if (collided) {
- hi=ofs;
+ hi = ofs;
} else {
- low=ofs;
+ low = ofs;
}
}
- if (col_obj->get_type()==CollisionObject2DSW::TYPE_BODY) {
+ if (col_obj->get_type() == CollisionObject2DSW::TYPE_BODY) {
- const Body2DSW *body=static_cast<const Body2DSW*>(col_obj);
- if (body->get_one_way_collision_direction()!=Vector2()) {
+ const Body2DSW *body = static_cast<const Body2DSW *>(col_obj);
+ if (body->get_one_way_collision_direction() != Vector2()) {
Vector2 cd[2];
Physics2DServerSW::CollCbkData cbk;
- cbk.max=1;
- cbk.amount=0;
- cbk.ptr=cd;
- cbk.valid_dir=body->get_one_way_collision_direction();
- cbk.valid_depth=body->get_one_way_collision_max_depth();
+ cbk.max = 1;
+ cbk.amount = 0;
+ cbk.ptr = cd;
+ cbk.valid_dir = body->get_one_way_collision_direction();
+ cbk.valid_depth = body->get_one_way_collision_max_depth();
- Vector2 sep=mnormal; //important optimization for this to work fast enough
- bool collided = CollisionSolver2DSW::solve(body_shape,body_shape_xform,p_motion*(hi+contact_max_allowed_penetration),col_obj->get_shape(shape_idx),col_obj_xform,Vector2(),Physics2DServerSW::_shape_col_cbk,&cbk,&sep,0);
- if (!collided || cbk.amount==0) {
+ Vector2 sep = mnormal; //important optimization for this to work fast enough
+ bool collided = CollisionSolver2DSW::solve(body_shape, body_shape_xform, p_motion * (hi + contact_max_allowed_penetration), col_obj->get_shape(shape_idx), col_obj_xform, Vector2(), Physics2DServerSW::_shape_col_cbk, &cbk, &sep, 0);
+ if (!collided || cbk.amount == 0) {
continue;
}
-
}
}
-
- if (low<best_safe) {
- best_safe=low;
- best_unsafe=hi;
+ if (low < best_safe) {
+ best_safe = low;
+ best_unsafe = hi;
}
}
if (stuck) {
- safe=0;
- unsafe=0;
- best_shape=j; //sadly it's the best
+ safe = 0;
+ unsafe = 0;
+ best_shape = j; //sadly it's the best
break;
}
- if (best_safe==1.0) {
+ if (best_safe == 1.0) {
continue;
}
if (best_safe < safe) {
- safe=best_safe;
- unsafe=best_unsafe;
- best_shape=j;
+ safe = best_safe;
+ unsafe = best_unsafe;
+ best_shape = j;
}
}
}
- bool collided=false;
- if (safe>=1) {
+ bool collided = false;
+ if (safe >= 1) {
//not collided
- collided=false;
+ collided = false;
if (r_result) {
- r_result->motion=p_motion;
- r_result->remainder=Vector2();
- r_result->motion+=(body_transform.elements[2]-p_from.elements[2]);
+ r_result->motion = p_motion;
+ r_result->remainder = Vector2();
+ r_result->motion += (body_transform.elements[2] - p_from.elements[2]);
}
} else {
//it collided, let's get the rest info in unsafe advance
Matrix32 ugt = body_transform;
- ugt.elements[2]+=p_motion*unsafe;
+ ugt.elements[2] += p_motion * unsafe;
_RestCallbackData2D rcd;
- rcd.best_len=0;
- rcd.best_object=NULL;
- rcd.best_shape=0;
+ rcd.best_len = 0;
+ rcd.best_object = NULL;
+ rcd.best_shape = 0;
Matrix32 body_shape_xform = ugt * p_body->get_shape_transform(best_shape);
Shape2DSW *body_shape = p_body->get_shape(best_shape);
- body_aabb.pos+=p_motion*unsafe;
-
- int amount = _cull_aabb_for_body(p_body,body_aabb);
+ body_aabb.pos += p_motion * unsafe;
+ int amount = _cull_aabb_for_body(p_body, body_aabb);
- for(int i=0;i<amount;i++) {
+ for (int i = 0; i < amount; i++) {
+ const CollisionObject2DSW *col_obj = intersection_query_results[i];
+ int shape_idx = intersection_query_subindex_results[i];
- const CollisionObject2DSW *col_obj=intersection_query_results[i];
- int shape_idx=intersection_query_subindex_results[i];
+ if (col_obj->get_type() == CollisionObject2DSW::TYPE_BODY) {
- if (col_obj->get_type()==CollisionObject2DSW::TYPE_BODY) {
-
- const Body2DSW *body=static_cast<const Body2DSW*>(col_obj);
- rcd.valid_dir=body->get_one_way_collision_direction();
- rcd.valid_depth=body->get_one_way_collision_max_depth();
+ const Body2DSW *body = static_cast<const Body2DSW *>(col_obj);
+ rcd.valid_dir = body->get_one_way_collision_direction();
+ rcd.valid_depth = body->get_one_way_collision_max_depth();
} else {
- rcd.valid_dir=Vector2();
- rcd.valid_depth=0;
+ rcd.valid_dir = Vector2();
+ rcd.valid_depth = 0;
}
-
- rcd.object=col_obj;
- rcd.shape=shape_idx;
- bool sc = CollisionSolver2DSW::solve(body_shape,body_shape_xform,Vector2(),col_obj->get_shape(shape_idx),col_obj->get_transform() * col_obj->get_shape_transform(shape_idx),Vector2() ,_rest_cbk_result,&rcd,NULL,p_margin);
+ rcd.object = col_obj;
+ rcd.shape = shape_idx;
+ bool sc = CollisionSolver2DSW::solve(body_shape, body_shape_xform, Vector2(), col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), Vector2(), _rest_cbk_result, &rcd, NULL, p_margin);
if (!sc)
continue;
-
}
- if (rcd.best_len!=0) {
+ if (rcd.best_len != 0) {
if (r_result) {
- r_result->collider=rcd.best_object->get_self();
- r_result->collider_id=rcd.best_object->get_instance_id();
- r_result->collider_shape=rcd.best_shape;
- r_result->collision_normal=rcd.best_normal;
- r_result->collision_point=rcd.best_contact;
- r_result->collider_metadata=rcd.best_object->get_shape_metadata(rcd.best_shape);
+ r_result->collider = rcd.best_object->get_self();
+ r_result->collider_id = rcd.best_object->get_instance_id();
+ r_result->collider_shape = rcd.best_shape;
+ r_result->collision_normal = rcd.best_normal;
+ r_result->collision_point = rcd.best_contact;
+ r_result->collider_metadata = rcd.best_object->get_shape_metadata(rcd.best_shape);
- const Body2DSW *body = static_cast<const Body2DSW*>(rcd.best_object);
- Vector2 rel_vec = r_result->collision_point-body->get_transform().get_origin();
+ const Body2DSW *body = static_cast<const Body2DSW *>(rcd.best_object);
+ Vector2 rel_vec = r_result->collision_point - body->get_transform().get_origin();
r_result->collider_velocity = Vector2(-body->get_angular_velocity() * rel_vec.y, body->get_angular_velocity() * rel_vec.x) + body->get_linear_velocity();
- r_result->motion=safe*p_motion;
- r_result->remainder=p_motion - safe * p_motion;
- r_result->motion+=(body_transform.elements[2]-p_from.elements[2]);
-
+ r_result->motion = safe * p_motion;
+ r_result->remainder = p_motion - safe * p_motion;
+ r_result->motion += (body_transform.elements[2] - p_from.elements[2]);
}
- collided=true;
+ collided = true;
} else {
if (r_result) {
- r_result->motion=p_motion;
- r_result->remainder=Vector2();
- r_result->motion+=(body_transform.elements[2]-p_from.elements[2]);
+ r_result->motion = p_motion;
+ r_result->remainder = Vector2();
+ r_result->motion += (body_transform.elements[2] - p_from.elements[2]);
}
- collided=false;
-
+ collided = false;
}
}
return collided;
-
#if 0
//give me back regular physics engine logic
//this is madness
@@ -1095,82 +1018,71 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Matrix32 &p_from, const
return false;
}
+void *Space2DSW::_broadphase_pair(CollisionObject2DSW *A, int p_subindex_A, CollisionObject2DSW *B, int p_subindex_B, void *p_self) {
+ CollisionObject2DSW::Type type_A = A->get_type();
+ CollisionObject2DSW::Type type_B = B->get_type();
+ if (type_A > type_B) {
-
-void* Space2DSW::_broadphase_pair(CollisionObject2DSW *A,int p_subindex_A,CollisionObject2DSW *B,int p_subindex_B,void *p_self) {
-
-
- CollisionObject2DSW::Type type_A=A->get_type();
- CollisionObject2DSW::Type type_B=B->get_type();
- if (type_A>type_B) {
-
- SWAP(A,B);
- SWAP(p_subindex_A,p_subindex_B);
- SWAP(type_A,type_B);
+ SWAP(A, B);
+ SWAP(p_subindex_A, p_subindex_B);
+ SWAP(type_A, type_B);
}
- Space2DSW *self = (Space2DSW*)p_self;
+ Space2DSW *self = (Space2DSW *)p_self;
self->collision_pairs++;
- if (type_A==CollisionObject2DSW::TYPE_AREA) {
+ if (type_A == CollisionObject2DSW::TYPE_AREA) {
- Area2DSW *area=static_cast<Area2DSW*>(A);
- if (type_B==CollisionObject2DSW::TYPE_AREA) {
+ Area2DSW *area = static_cast<Area2DSW *>(A);
+ if (type_B == CollisionObject2DSW::TYPE_AREA) {
- Area2DSW *area_b=static_cast<Area2DSW*>(B);
- Area2Pair2DSW *area2_pair = memnew(Area2Pair2DSW(area_b,p_subindex_B,area,p_subindex_A) );
+ Area2DSW *area_b = static_cast<Area2DSW *>(B);
+ Area2Pair2DSW *area2_pair = memnew(Area2Pair2DSW(area_b, p_subindex_B, area, p_subindex_A));
return area2_pair;
} else {
- Body2DSW *body=static_cast<Body2DSW*>(B);
- AreaPair2DSW *area_pair = memnew(AreaPair2DSW(body,p_subindex_B,area,p_subindex_A) );
+ Body2DSW *body = static_cast<Body2DSW *>(B);
+ AreaPair2DSW *area_pair = memnew(AreaPair2DSW(body, p_subindex_B, area, p_subindex_A));
return area_pair;
}
-
} else {
-
- BodyPair2DSW *b = memnew( BodyPair2DSW((Body2DSW*)A,p_subindex_A,(Body2DSW*)B,p_subindex_B) );
+ BodyPair2DSW *b = memnew(BodyPair2DSW((Body2DSW *)A, p_subindex_A, (Body2DSW *)B, p_subindex_B));
return b;
-
}
return NULL;
}
-void Space2DSW::_broadphase_unpair(CollisionObject2DSW *A,int p_subindex_A,CollisionObject2DSW *B,int p_subindex_B,void *p_data,void *p_self) {
+void Space2DSW::_broadphase_unpair(CollisionObject2DSW *A, int p_subindex_A, CollisionObject2DSW *B, int p_subindex_B, void *p_data, void *p_self) {
-
- Space2DSW *self = (Space2DSW*)p_self;
+ Space2DSW *self = (Space2DSW *)p_self;
self->collision_pairs--;
- Constraint2DSW *c = (Constraint2DSW*)p_data;
+ Constraint2DSW *c = (Constraint2DSW *)p_data;
memdelete(c);
}
-
-const SelfList<Body2DSW>::List& Space2DSW::get_active_body_list() const {
+const SelfList<Body2DSW>::List &Space2DSW::get_active_body_list() const {
return active_list;
}
-void Space2DSW::body_add_to_active_list(SelfList<Body2DSW>* p_body) {
+void Space2DSW::body_add_to_active_list(SelfList<Body2DSW> *p_body) {
active_list.add(p_body);
}
-void Space2DSW::body_remove_from_active_list(SelfList<Body2DSW>* p_body) {
+void Space2DSW::body_remove_from_active_list(SelfList<Body2DSW> *p_body) {
active_list.remove(p_body);
-
}
-void Space2DSW::body_add_to_inertia_update_list(SelfList<Body2DSW>* p_body) {
-
+void Space2DSW::body_add_to_inertia_update_list(SelfList<Body2DSW> *p_body) {
inertia_update_list.add(p_body);
}
-void Space2DSW::body_remove_from_inertia_update_list(SelfList<Body2DSW>* p_body) {
+void Space2DSW::body_remove_from_inertia_update_list(SelfList<Body2DSW> *p_body) {
inertia_update_list.remove(p_body);
}
@@ -1182,109 +1094,103 @@ BroadPhase2DSW *Space2DSW::get_broadphase() {
void Space2DSW::add_object(CollisionObject2DSW *p_object) {
- ERR_FAIL_COND( objects.has(p_object) );
+ ERR_FAIL_COND(objects.has(p_object));
objects.insert(p_object);
}
void Space2DSW::remove_object(CollisionObject2DSW *p_object) {
- ERR_FAIL_COND( !objects.has(p_object) );
+ ERR_FAIL_COND(!objects.has(p_object));
objects.erase(p_object);
}
-const Set<CollisionObject2DSW*> &Space2DSW::get_objects() const {
+const Set<CollisionObject2DSW *> &Space2DSW::get_objects() const {
return objects;
}
-void Space2DSW::body_add_to_state_query_list(SelfList<Body2DSW>* p_body) {
+void Space2DSW::body_add_to_state_query_list(SelfList<Body2DSW> *p_body) {
state_query_list.add(p_body);
}
-void Space2DSW::body_remove_from_state_query_list(SelfList<Body2DSW>* p_body) {
+void Space2DSW::body_remove_from_state_query_list(SelfList<Body2DSW> *p_body) {
state_query_list.remove(p_body);
}
-void Space2DSW::area_add_to_monitor_query_list(SelfList<Area2DSW>* p_area) {
+void Space2DSW::area_add_to_monitor_query_list(SelfList<Area2DSW> *p_area) {
monitor_query_list.add(p_area);
}
-void Space2DSW::area_remove_from_monitor_query_list(SelfList<Area2DSW>* p_area) {
+void Space2DSW::area_remove_from_monitor_query_list(SelfList<Area2DSW> *p_area) {
monitor_query_list.remove(p_area);
}
-void Space2DSW::area_add_to_moved_list(SelfList<Area2DSW>* p_area) {
+void Space2DSW::area_add_to_moved_list(SelfList<Area2DSW> *p_area) {
area_moved_list.add(p_area);
}
-void Space2DSW::area_remove_from_moved_list(SelfList<Area2DSW>* p_area) {
+void Space2DSW::area_remove_from_moved_list(SelfList<Area2DSW> *p_area) {
area_moved_list.remove(p_area);
}
-const SelfList<Area2DSW>::List& Space2DSW::get_moved_area_list() const {
+const SelfList<Area2DSW>::List &Space2DSW::get_moved_area_list() const {
return area_moved_list;
}
-
void Space2DSW::call_queries() {
- while(state_query_list.first()) {
+ while (state_query_list.first()) {
- Body2DSW * b = state_query_list.first()->self();
+ Body2DSW *b = state_query_list.first()->self();
b->call_queries();
state_query_list.remove(state_query_list.first());
}
- while(monitor_query_list.first()) {
+ while (monitor_query_list.first()) {
- Area2DSW * a = monitor_query_list.first()->self();
+ Area2DSW *a = monitor_query_list.first()->self();
a->call_queries();
monitor_query_list.remove(monitor_query_list.first());
}
-
}
void Space2DSW::setup() {
- contact_debug_count=0;
+ contact_debug_count = 0;
- while(inertia_update_list.first()) {
+ while (inertia_update_list.first()) {
inertia_update_list.first()->self()->update_inertias();
inertia_update_list.remove(inertia_update_list.first());
}
-
-
}
void Space2DSW::update() {
broadphase->update();
-
}
-
void Space2DSW::set_param(Physics2DServer::SpaceParameter p_param, real_t p_value) {
- switch(p_param) {
+ switch (p_param) {
- case Physics2DServer::SPACE_PARAM_CONTACT_RECYCLE_RADIUS: contact_recycle_radius=p_value; break;
- case Physics2DServer::SPACE_PARAM_CONTACT_MAX_SEPARATION: contact_max_separation=p_value; break;
- case Physics2DServer::SPACE_PARAM_BODY_MAX_ALLOWED_PENETRATION: contact_max_allowed_penetration=p_value; break;
- case Physics2DServer::SPACE_PARAM_BODY_LINEAR_VELOCITY_SLEEP_TRESHOLD: body_linear_velocity_sleep_treshold=p_value; break;
- case Physics2DServer::SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_TRESHOLD: body_angular_velocity_sleep_treshold=p_value; break;
- case Physics2DServer::SPACE_PARAM_BODY_TIME_TO_SLEEP: body_time_to_sleep=p_value; break;
- case Physics2DServer::SPACE_PARAM_CONSTRAINT_DEFAULT_BIAS: constraint_bias=p_value; break;
+ case Physics2DServer::SPACE_PARAM_CONTACT_RECYCLE_RADIUS: contact_recycle_radius = p_value; break;
+ case Physics2DServer::SPACE_PARAM_CONTACT_MAX_SEPARATION: contact_max_separation = p_value; break;
+ case Physics2DServer::SPACE_PARAM_BODY_MAX_ALLOWED_PENETRATION: contact_max_allowed_penetration = p_value; break;
+ case Physics2DServer::SPACE_PARAM_BODY_LINEAR_VELOCITY_SLEEP_TRESHOLD: body_linear_velocity_sleep_treshold = p_value; break;
+ case Physics2DServer::SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_TRESHOLD: body_angular_velocity_sleep_treshold = p_value; break;
+ case Physics2DServer::SPACE_PARAM_BODY_TIME_TO_SLEEP: body_time_to_sleep = p_value; break;
+ case Physics2DServer::SPACE_PARAM_CONSTRAINT_DEFAULT_BIAS: constraint_bias = p_value; break;
}
}
real_t Space2DSW::get_param(Physics2DServer::SpaceParameter p_param) const {
- switch(p_param) {
+ switch (p_param) {
case Physics2DServer::SPACE_PARAM_CONTACT_RECYCLE_RADIUS: return contact_recycle_radius;
case Physics2DServer::SPACE_PARAM_CONTACT_MAX_SEPARATION: return contact_max_separation;
@@ -1299,12 +1205,12 @@ real_t Space2DSW::get_param(Physics2DServer::SpaceParameter p_param) const {
void Space2DSW::lock() {
- locked=true;
+ locked = true;
}
void Space2DSW::unlock() {
- locked=false;
+ locked = false;
}
bool Space2DSW::is_locked() const {
@@ -1319,43 +1225,36 @@ Physics2DDirectSpaceStateSW *Space2DSW::get_direct_state() {
Space2DSW::Space2DSW() {
+ collision_pairs = 0;
+ active_objects = 0;
+ island_count = 0;
- collision_pairs=0;
- active_objects=0;
- island_count=0;
+ contact_debug_count = 0;
- contact_debug_count=0;
-
- locked=false;
- contact_recycle_radius=1.0;
- contact_max_separation=1.5;
- contact_max_allowed_penetration= 0.3;
+ locked = false;
+ contact_recycle_radius = 1.0;
+ contact_max_separation = 1.5;
+ contact_max_allowed_penetration = 0.3;
constraint_bias = 0.2;
- body_linear_velocity_sleep_treshold=GLOBAL_DEF("physics_2d/sleep_threashold_linear",2.0);
- body_angular_velocity_sleep_treshold=GLOBAL_DEF("physics_2d/sleep_threshold_angular",(8.0 / 180.0 * Math_PI));
- body_time_to_sleep=GLOBAL_DEF("physics_2d/time_before_sleep",0.5);
-
+ body_linear_velocity_sleep_treshold = GLOBAL_DEF("physics_2d/sleep_threashold_linear", 2.0);
+ body_angular_velocity_sleep_treshold = GLOBAL_DEF("physics_2d/sleep_threshold_angular", (8.0 / 180.0 * Math_PI));
+ body_time_to_sleep = GLOBAL_DEF("physics_2d/time_before_sleep", 0.5);
broadphase = BroadPhase2DSW::create_func();
- broadphase->set_pair_callback(_broadphase_pair,this);
- broadphase->set_unpair_callback(_broadphase_unpair,this);
- area=NULL;
-
- direct_access = memnew( Physics2DDirectSpaceStateSW );
- direct_access->space=this;
-
+ broadphase->set_pair_callback(_broadphase_pair, this);
+ broadphase->set_unpair_callback(_broadphase_unpair, this);
+ area = NULL;
- for(int i=0;i<ELAPSED_TIME_MAX;i++)
- elapsed_time[i]=0;
+ direct_access = memnew(Physics2DDirectSpaceStateSW);
+ direct_access->space = this;
+ for (int i = 0; i < ELAPSED_TIME_MAX; i++)
+ elapsed_time[i] = 0;
}
Space2DSW::~Space2DSW() {
memdelete(broadphase);
- memdelete( direct_access );
+ memdelete(direct_access);
}
-
-
-
diff --git a/servers/physics_2d/space_2d_sw.h b/servers/physics_2d/space_2d_sw.h
index b7976c589..7a23bb2fc 100644
--- a/servers/physics_2d/space_2d_sw.h
+++ b/servers/physics_2d/space_2d_sw.h
@@ -29,40 +29,36 @@
#ifndef SPACE_2D_SW_H
#define SPACE_2D_SW_H
-#include "typedefs.h"
-#include "hash_map.h"
-#include "body_2d_sw.h"
#include "area_2d_sw.h"
-#include "body_pair_2d_sw.h"
#include "area_pair_2d_sw.h"
+#include "body_2d_sw.h"
+#include "body_pair_2d_sw.h"
#include "broad_phase_2d_sw.h"
#include "collision_object_2d_sw.h"
#include "globals.h"
-
+#include "hash_map.h"
+#include "typedefs.h"
class Physics2DDirectSpaceStateSW : public Physics2DDirectSpaceState {
- OBJ_TYPE( Physics2DDirectSpaceStateSW, Physics2DDirectSpaceState );
-public:
+ OBJ_TYPE(Physics2DDirectSpaceStateSW, Physics2DDirectSpaceState);
+public:
Space2DSW *space;
- virtual int intersect_point(const Vector2& p_point,ShapeResult *r_results,int p_result_max,const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION, bool p_pick_point=false);
- virtual bool intersect_ray(const Vector2& p_from, const Vector2& p_to,RayResult &r_result,const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION);
- virtual int intersect_shape(const RID& p_shape, const Matrix32& p_xform,const Vector2& p_motion,float p_margin,ShapeResult *r_results,int p_result_max,const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION);
- virtual bool cast_motion(const RID& p_shape, const Matrix32& p_xform,const Vector2& p_motion,float p_margin,float &p_closest_safe,float &p_closest_unsafe, const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION);
- virtual bool collide_shape(RID p_shape, const Matrix32& p_shape_xform,const Vector2& p_motion,float p_margin,Vector2 *r_results,int p_result_max,int &r_result_count, const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION);
- virtual bool rest_info(RID p_shape, const Matrix32& p_shape_xform,const Vector2& p_motion,float p_margin,ShapeRestInfo *r_info, const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION);
+ virtual int intersect_point(const Vector2 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION, bool p_pick_point = false);
+ virtual bool intersect_ray(const Vector2 &p_from, const Vector2 &p_to, RayResult &r_result, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
+ virtual int intersect_shape(const RID &p_shape, const Matrix32 &p_xform, const Vector2 &p_motion, float p_margin, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
+ virtual bool cast_motion(const RID &p_shape, const Matrix32 &p_xform, const Vector2 &p_motion, float p_margin, float &p_closest_safe, float &p_closest_unsafe, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
+ virtual bool collide_shape(RID p_shape, const Matrix32 &p_shape_xform, const Vector2 &p_motion, float p_margin, Vector2 *r_results, int p_result_max, int &r_result_count, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
+ virtual bool rest_info(RID p_shape, const Matrix32 &p_shape_xform, const Vector2 &p_motion, float p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
Physics2DDirectSpaceStateSW();
};
-
-
class Space2DSW {
public:
-
enum ElapsedTime {
ELAPSED_TIME_INTEGRATE_FORCES,
ELAPSED_TIME_GENERATE_ISLANDS,
@@ -72,8 +68,8 @@ public:
ELAPSED_TIME_MAX
};
-private:
+private:
uint64_t elapsed_time[ELAPSED_TIME_MAX];
Physics2DDirectSpaceStateSW *direct_access;
@@ -86,10 +82,10 @@ private:
SelfList<Area2DSW>::List monitor_query_list;
SelfList<Area2DSW>::List area_moved_list;
- static void* _broadphase_pair(CollisionObject2DSW *A,int p_subindex_A,CollisionObject2DSW *B,int p_subindex_B,void *p_self);
- static void _broadphase_unpair(CollisionObject2DSW *A,int p_subindex_A,CollisionObject2DSW *B,int p_subindex_B,void *p_data,void *p_self);
+ static void *_broadphase_pair(CollisionObject2DSW *A, int p_subindex_A, CollisionObject2DSW *B, int p_subindex_B, void *p_self);
+ static void _broadphase_unpair(CollisionObject2DSW *A, int p_subindex_A, CollisionObject2DSW *B, int p_subindex_B, void *p_data, void *p_self);
- Set<CollisionObject2DSW*> objects;
+ Set<CollisionObject2DSW *> objects;
Area2DSW *area;
@@ -100,7 +96,7 @@ private:
enum {
- INTERSECTION_QUERY_MAX=2048
+ INTERSECTION_QUERY_MAX = 2048
};
CollisionObject2DSW *intersection_query_results[INTERSECTION_QUERY_MAX];
@@ -116,44 +112,40 @@ private:
int active_objects;
int collision_pairs;
- int _cull_aabb_for_body(Body2DSW *p_body,const Rect2& p_aabb);
+ int _cull_aabb_for_body(Body2DSW *p_body, const Rect2 &p_aabb);
Vector<Vector2> contact_debug;
int contact_debug_count;
-friend class Physics2DDirectSpaceStateSW;
+ friend class Physics2DDirectSpaceStateSW;
public:
-
- _FORCE_INLINE_ void set_self(const RID& p_self) { self=p_self; }
+ _FORCE_INLINE_ void set_self(const RID &p_self) { self = p_self; }
_FORCE_INLINE_ RID get_self() const { return self; }
- void set_default_area(Area2DSW *p_area) { area=p_area; }
+ void set_default_area(Area2DSW *p_area) { area = p_area; }
Area2DSW *get_default_area() const { return area; }
- const SelfList<Body2DSW>::List& get_active_body_list() const;
- void body_add_to_active_list(SelfList<Body2DSW>* p_body);
- void body_remove_from_active_list(SelfList<Body2DSW>* p_body);
- void body_add_to_inertia_update_list(SelfList<Body2DSW>* p_body);
- void body_remove_from_inertia_update_list(SelfList<Body2DSW>* p_body);
- void area_add_to_moved_list(SelfList<Area2DSW>* p_area);
- void area_remove_from_moved_list(SelfList<Area2DSW>* p_area);
- const SelfList<Area2DSW>::List& get_moved_area_list() const;
-
-
-
+ const SelfList<Body2DSW>::List &get_active_body_list() const;
+ void body_add_to_active_list(SelfList<Body2DSW> *p_body);
+ void body_remove_from_active_list(SelfList<Body2DSW> *p_body);
+ void body_add_to_inertia_update_list(SelfList<Body2DSW> *p_body);
+ void body_remove_from_inertia_update_list(SelfList<Body2DSW> *p_body);
+ void area_add_to_moved_list(SelfList<Area2DSW> *p_area);
+ void area_remove_from_moved_list(SelfList<Area2DSW> *p_area);
+ const SelfList<Area2DSW>::List &get_moved_area_list() const;
- void body_add_to_state_query_list(SelfList<Body2DSW>* p_body);
- void body_remove_from_state_query_list(SelfList<Body2DSW>* p_body);
+ void body_add_to_state_query_list(SelfList<Body2DSW> *p_body);
+ void body_remove_from_state_query_list(SelfList<Body2DSW> *p_body);
- void area_add_to_monitor_query_list(SelfList<Area2DSW>* p_area);
- void area_remove_from_monitor_query_list(SelfList<Area2DSW>* p_area);
+ void area_add_to_monitor_query_list(SelfList<Area2DSW> *p_area);
+ void area_remove_from_monitor_query_list(SelfList<Area2DSW> *p_area);
BroadPhase2DSW *get_broadphase();
void add_object(CollisionObject2DSW *p_object);
void remove_object(CollisionObject2DSW *p_object);
- const Set<CollisionObject2DSW*> &get_objects() const;
+ const Set<CollisionObject2DSW *> &get_objects() const;
_FORCE_INLINE_ real_t get_contact_recycle_radius() const { return contact_recycle_radius; }
_FORCE_INLINE_ real_t get_contact_max_separation() const { return contact_max_separation; }
@@ -163,13 +155,10 @@ public:
_FORCE_INLINE_ real_t get_body_angular_velocity_sleep_treshold() const { return body_angular_velocity_sleep_treshold; }
_FORCE_INLINE_ real_t get_body_time_to_sleep() const { return body_time_to_sleep; }
-
-
void update();
void setup();
void call_queries();
-
bool is_locked() const;
void lock();
void unlock();
@@ -177,32 +166,31 @@ public:
void set_param(Physics2DServer::SpaceParameter p_param, real_t p_value);
real_t get_param(Physics2DServer::SpaceParameter p_param) const;
- void set_island_count(int p_island_count) { island_count=p_island_count; }
+ void set_island_count(int p_island_count) { island_count = p_island_count; }
int get_island_count() const { return island_count; }
- void set_active_objects(int p_active_objects) { active_objects=p_active_objects; }
+ void set_active_objects(int p_active_objects) { active_objects = p_active_objects; }
int get_active_objects() const { return active_objects; }
int get_collision_pairs() const { return collision_pairs; }
- bool test_body_motion(Body2DSW *p_body, const Matrix32 &p_from, const Vector2&p_motion, float p_margin, Physics2DServer::MotionResult *r_result);
-
+ bool test_body_motion(Body2DSW *p_body, const Matrix32 &p_from, const Vector2 &p_motion, float p_margin, Physics2DServer::MotionResult *r_result);
void set_debug_contacts(int p_amount) { contact_debug.resize(p_amount); }
_FORCE_INLINE_ bool is_debugging_contacts() const { return !contact_debug.empty(); }
- _FORCE_INLINE_ void add_debug_contact(const Vector2& p_contact) { if (contact_debug_count<contact_debug.size()) contact_debug[contact_debug_count++]=p_contact; }
+ _FORCE_INLINE_ void add_debug_contact(const Vector2 &p_contact) {
+ if (contact_debug_count < contact_debug.size()) contact_debug[contact_debug_count++] = p_contact;
+ }
_FORCE_INLINE_ Vector<Vector2> get_debug_contacts() { return contact_debug; }
_FORCE_INLINE_ int get_debug_contact_count() { return contact_debug_count; }
-
Physics2DDirectSpaceStateSW *get_direct_state();
- void set_elapsed_time(ElapsedTime p_time,uint64_t p_msec) { elapsed_time[p_time]=p_msec; }
+ void set_elapsed_time(ElapsedTime p_time, uint64_t p_msec) { elapsed_time[p_time] = p_msec; }
uint64_t get_elapsed_time(ElapsedTime p_time) const { return elapsed_time[p_time]; }
Space2DSW();
~Space2DSW();
};
-
#endif // SPACE_2D_SW_H
diff --git a/servers/physics_2d/step_2d_sw.cpp b/servers/physics_2d/step_2d_sw.cpp
index 05c0bf051..d87dab395 100644
--- a/servers/physics_2d/step_2d_sw.cpp
+++ b/servers/physics_2d/step_2d_sw.cpp
@@ -29,39 +29,38 @@
#include "step_2d_sw.h"
#include "os/os.h"
-void Step2DSW::_populate_island(Body2DSW* p_body,Body2DSW** p_island,Constraint2DSW **p_constraint_island) {
+void Step2DSW::_populate_island(Body2DSW *p_body, Body2DSW **p_island, Constraint2DSW **p_constraint_island) {
p_body->set_island_step(_step);
p_body->set_island_next(*p_island);
- *p_island=p_body;
+ *p_island = p_body;
- for(Map<Constraint2DSW*,int>::Element *E=p_body->get_constraint_map().front();E;E=E->next()) {
+ for (Map<Constraint2DSW *, int>::Element *E = p_body->get_constraint_map().front(); E; E = E->next()) {
- Constraint2DSW *c=(Constraint2DSW*)E->key();
- if (c->get_island_step()==_step)
+ Constraint2DSW *c = (Constraint2DSW *)E->key();
+ if (c->get_island_step() == _step)
continue; //already processed
c->set_island_step(_step);
c->set_island_next(*p_constraint_island);
- *p_constraint_island=c;
+ *p_constraint_island = c;
-
- for(int i=0;i<c->get_body_count();i++) {
- if (i==E->get())
+ for (int i = 0; i < c->get_body_count(); i++) {
+ if (i == E->get())
continue;
Body2DSW *b = c->get_body_ptr()[i];
- if (b->get_island_step()==_step || b->get_mode()==Physics2DServer::BODY_MODE_STATIC || b->get_mode()==Physics2DServer::BODY_MODE_KINEMATIC)
+ if (b->get_island_step() == _step || b->get_mode() == Physics2DServer::BODY_MODE_STATIC || b->get_mode() == Physics2DServer::BODY_MODE_KINEMATIC)
continue; //no go
- _populate_island(c->get_body_ptr()[i],p_island,p_constraint_island);
+ _populate_island(c->get_body_ptr()[i], p_island, p_constraint_island);
}
}
}
-bool Step2DSW::_setup_island(Constraint2DSW *p_island,float p_delta) {
+bool Step2DSW::_setup_island(Constraint2DSW *p_island, float p_delta) {
- Constraint2DSW *ci=p_island;
- Constraint2DSW *prev_ci=NULL;
- bool removed_root=false;
- while(ci) {
+ Constraint2DSW *ci = p_island;
+ Constraint2DSW *prev_ci = NULL;
+ bool removed_root = false;
+ while (ci) {
bool process = ci->setup(p_delta);
if (!process) {
@@ -69,169 +68,161 @@ bool Step2DSW::_setup_island(Constraint2DSW *p_island,float p_delta) {
if (prev_ci) {
prev_ci->set_island_next(ci->get_island_next());
} else {
- removed_root=true;
- prev_ci=ci;
+ removed_root = true;
+ prev_ci = ci;
}
} else {
- prev_ci=ci;
+ prev_ci = ci;
}
- ci=ci->get_island_next();
+ ci = ci->get_island_next();
}
return removed_root;
}
-void Step2DSW::_solve_island(Constraint2DSW *p_island,int p_iterations,float p_delta){
-
+void Step2DSW::_solve_island(Constraint2DSW *p_island, int p_iterations, float p_delta) {
- for(int i=0;i<p_iterations;i++) {
+ for (int i = 0; i < p_iterations; i++) {
- Constraint2DSW *ci=p_island;
- while(ci) {
+ Constraint2DSW *ci = p_island;
+ while (ci) {
ci->solve(p_delta);
- ci=ci->get_island_next();
+ ci = ci->get_island_next();
}
}
}
-void Step2DSW::_check_suspend(Body2DSW *p_island,float p_delta) {
+void Step2DSW::_check_suspend(Body2DSW *p_island, float p_delta) {
-
- bool can_sleep=true;
+ bool can_sleep = true;
Body2DSW *b = p_island;
- while(b) {
+ while (b) {
- if (b->get_mode()==Physics2DServer::BODY_MODE_STATIC || b->get_mode()==Physics2DServer::BODY_MODE_KINEMATIC) {
- b=b->get_island_next();
+ if (b->get_mode() == Physics2DServer::BODY_MODE_STATIC || b->get_mode() == Physics2DServer::BODY_MODE_KINEMATIC) {
+ b = b->get_island_next();
continue; //ignore for static
}
if (!b->sleep_test(p_delta))
- can_sleep=false;
+ can_sleep = false;
- b=b->get_island_next();
+ b = b->get_island_next();
}
//put all to sleep or wake up everyoen
b = p_island;
- while(b) {
+ while (b) {
- if (b->get_mode()==Physics2DServer::BODY_MODE_STATIC || b->get_mode()==Physics2DServer::BODY_MODE_KINEMATIC) {
- b=b->get_island_next();
+ if (b->get_mode() == Physics2DServer::BODY_MODE_STATIC || b->get_mode() == Physics2DServer::BODY_MODE_KINEMATIC) {
+ b = b->get_island_next();
continue; //ignore for static
}
bool active = b->is_active();
- if (active==can_sleep)
+ if (active == can_sleep)
b->set_active(!can_sleep);
- b=b->get_island_next();
+ b = b->get_island_next();
}
}
-void Step2DSW::step(Space2DSW* p_space,float p_delta,int p_iterations) {
-
+void Step2DSW::step(Space2DSW *p_space, float p_delta, int p_iterations) {
p_space->lock(); // can't access space during this
p_space->setup(); //update inertias, etc
- const SelfList<Body2DSW>::List * body_list = &p_space->get_active_body_list();
+ const SelfList<Body2DSW>::List *body_list = &p_space->get_active_body_list();
/* INTEGRATE FORCES */
uint64_t profile_begtime = OS::get_singleton()->get_ticks_usec();
- uint64_t profile_endtime=0;
+ uint64_t profile_endtime = 0;
+ int active_count = 0;
- int active_count=0;
-
- const SelfList<Body2DSW>*b = body_list->first();
- while(b) {
+ const SelfList<Body2DSW> *b = body_list->first();
+ while (b) {
b->self()->integrate_forces(p_delta);
- b=b->next();
+ b = b->next();
active_count++;
}
p_space->set_active_objects(active_count);
-
{ //profile
- profile_endtime=OS::get_singleton()->get_ticks_usec();
- p_space->set_elapsed_time(Space2DSW::ELAPSED_TIME_INTEGRATE_FORCES,profile_endtime-profile_begtime);
- profile_begtime=profile_endtime;
+ profile_endtime = OS::get_singleton()->get_ticks_usec();
+ p_space->set_elapsed_time(Space2DSW::ELAPSED_TIME_INTEGRATE_FORCES, profile_endtime - profile_begtime);
+ profile_begtime = profile_endtime;
}
/* GENERATE CONSTRAINT ISLANDS */
- Body2DSW *island_list=NULL;
- Constraint2DSW *constraint_island_list=NULL;
+ Body2DSW *island_list = NULL;
+ Constraint2DSW *constraint_island_list = NULL;
b = body_list->first();
- int island_count=0;
+ int island_count = 0;
- while(b) {
+ while (b) {
Body2DSW *body = b->self();
+ if (body->get_island_step() != _step) {
- if (body->get_island_step()!=_step) {
-
- Body2DSW *island=NULL;
- Constraint2DSW *constraint_island=NULL;
- _populate_island(body,&island,&constraint_island);
+ Body2DSW *island = NULL;
+ Constraint2DSW *constraint_island = NULL;
+ _populate_island(body, &island, &constraint_island);
island->set_island_list_next(island_list);
- island_list=island;
+ island_list = island;
if (constraint_island) {
constraint_island->set_island_list_next(constraint_island_list);
- constraint_island_list=constraint_island;
+ constraint_island_list = constraint_island;
island_count++;
}
-
}
- b=b->next();
+ b = b->next();
}
p_space->set_island_count(island_count);
const SelfList<Area2DSW>::List &aml = p_space->get_moved_area_list();
+ while (aml.first()) {
+ for (const Set<Constraint2DSW *>::Element *E = aml.first()->self()->get_constraints().front(); E; E = E->next()) {
- while(aml.first()) {
- for(const Set<Constraint2DSW*>::Element *E=aml.first()->self()->get_constraints().front();E;E=E->next()) {
-
- Constraint2DSW*c=E->get();
- if (c->get_island_step()==_step)
+ Constraint2DSW *c = E->get();
+ if (c->get_island_step() == _step)
continue;
c->set_island_step(_step);
c->set_island_next(NULL);
c->set_island_list_next(constraint_island_list);
- constraint_island_list=c;
+ constraint_island_list = c;
}
- p_space->area_remove_from_moved_list((SelfList<Area2DSW>*)aml.first()); //faster to remove here
+ p_space->area_remove_from_moved_list((SelfList<Area2DSW> *)aml.first()); //faster to remove here
}
-// print_line("island count: "+itos(island_count)+" active count: "+itos(active_count));
+ // print_line("island count: "+itos(island_count)+" active count: "+itos(active_count));
{ //profile
- profile_endtime=OS::get_singleton()->get_ticks_usec();
- p_space->set_elapsed_time(Space2DSW::ELAPSED_TIME_GENERATE_ISLANDS,profile_endtime-profile_begtime);
- profile_begtime=profile_endtime;
+ profile_endtime = OS::get_singleton()->get_ticks_usec();
+ p_space->set_elapsed_time(Space2DSW::ELAPSED_TIME_GENERATE_ISLANDS, profile_endtime - profile_begtime);
+ profile_begtime = profile_endtime;
}
/* SETUP CONSTRAINT ISLANDS */
{
- Constraint2DSW *ci=constraint_island_list;
- Constraint2DSW *prev_ci=NULL;
- while(ci) {
+ Constraint2DSW *ci = constraint_island_list;
+ Constraint2DSW *prev_ci = NULL;
+ while (ci) {
- if (_setup_island(ci,p_delta)==true) {
+ if (_setup_island(ci, p_delta) == true) {
//removed the root from the island graph because it is not to be processed
@@ -243,10 +234,9 @@ void Step2DSW::step(Space2DSW* p_space,float p_delta,int p_iterations) {
if (prev_ci) {
prev_ci->set_island_list_next(next);
} else {
- constraint_island_list=next;
-
+ constraint_island_list = next;
}
- prev_ci=next;
+ prev_ci = next;
} else {
//list is empty, just skip
@@ -254,77 +244,73 @@ void Step2DSW::step(Space2DSW* p_space,float p_delta,int p_iterations) {
prev_ci->set_island_list_next(ci->get_island_list_next());
} else {
- constraint_island_list=ci->get_island_list_next();
+ constraint_island_list = ci->get_island_list_next();
}
-
}
} else {
- prev_ci=ci;
+ prev_ci = ci;
}
- ci=ci->get_island_list_next();
+ ci = ci->get_island_list_next();
}
}
{ //profile
- profile_endtime=OS::get_singleton()->get_ticks_usec();
- p_space->set_elapsed_time(Space2DSW::ELAPSED_TIME_SETUP_CONSTRAINTS,profile_endtime-profile_begtime);
- profile_begtime=profile_endtime;
+ profile_endtime = OS::get_singleton()->get_ticks_usec();
+ p_space->set_elapsed_time(Space2DSW::ELAPSED_TIME_SETUP_CONSTRAINTS, profile_endtime - profile_begtime);
+ profile_begtime = profile_endtime;
}
/* SOLVE CONSTRAINT ISLANDS */
{
- Constraint2DSW *ci=constraint_island_list;
- while(ci) {
+ Constraint2DSW *ci = constraint_island_list;
+ while (ci) {
//iterating each island separatedly improves cache efficiency
- _solve_island(ci,p_iterations,p_delta);
- ci=ci->get_island_list_next();
+ _solve_island(ci, p_iterations, p_delta);
+ ci = ci->get_island_list_next();
}
}
{ //profile
- profile_endtime=OS::get_singleton()->get_ticks_usec();
- p_space->set_elapsed_time(Space2DSW::ELAPSED_TIME_SOLVE_CONSTRAINTS,profile_endtime-profile_begtime);
- profile_begtime=profile_endtime;
+ profile_endtime = OS::get_singleton()->get_ticks_usec();
+ p_space->set_elapsed_time(Space2DSW::ELAPSED_TIME_SOLVE_CONSTRAINTS, profile_endtime - profile_begtime);
+ profile_begtime = profile_endtime;
}
/* INTEGRATE VELOCITIES */
b = body_list->first();
- while(b) {
+ while (b) {
- const SelfList<Body2DSW>*n=b->next();
+ const SelfList<Body2DSW> *n = b->next();
b->self()->integrate_velocities(p_delta);
- b=n; // in case it shuts itself down
+ b = n; // in case it shuts itself down
}
/* SLEEP / WAKE UP ISLANDS */
{
- Body2DSW *bi=island_list;
- while(bi) {
+ Body2DSW *bi = island_list;
+ while (bi) {
- _check_suspend(bi,p_delta);
- bi=bi->get_island_list_next();
+ _check_suspend(bi, p_delta);
+ bi = bi->get_island_list_next();
}
}
{ //profile
- profile_endtime=OS::get_singleton()->get_ticks_usec();
- p_space->set_elapsed_time(Space2DSW::ELAPSED_TIME_INTEGRATE_VELOCITIES,profile_endtime-profile_begtime);
+ profile_endtime = OS::get_singleton()->get_ticks_usec();
+ p_space->set_elapsed_time(Space2DSW::ELAPSED_TIME_INTEGRATE_VELOCITIES, profile_endtime - profile_begtime);
//profile_begtime=profile_endtime;
}
p_space->update();
p_space->unlock();
_step++;
-
-
-
}
Step2DSW::Step2DSW() {
- _step=1;
+ _step = 1;
}
diff --git a/servers/physics_2d/step_2d_sw.h b/servers/physics_2d/step_2d_sw.h
index 917d69e7f..ed158acf0 100644
--- a/servers/physics_2d/step_2d_sw.h
+++ b/servers/physics_2d/step_2d_sw.h
@@ -35,13 +35,13 @@ class Step2DSW {
uint64_t _step;
- void _populate_island(Body2DSW* p_body,Body2DSW** p_island,Constraint2DSW **p_constraint_island);
- bool _setup_island(Constraint2DSW *p_island,float p_delta);
- void _solve_island(Constraint2DSW *p_island,int p_iterations,float p_delta);
- void _check_suspend(Body2DSW *p_island,float p_delta);
-public:
+ void _populate_island(Body2DSW *p_body, Body2DSW **p_island, Constraint2DSW **p_constraint_island);
+ bool _setup_island(Constraint2DSW *p_island, float p_delta);
+ void _solve_island(Constraint2DSW *p_island, int p_iterations, float p_delta);
+ void _check_suspend(Body2DSW *p_island, float p_delta);
- void step(Space2DSW* p_space,float p_delta,int p_iterations);
+public:
+ void step(Space2DSW *p_space, float p_delta, int p_iterations);
Step2DSW();
};
diff --git a/servers/physics_2d_server.cpp b/servers/physics_2d_server.cpp
index d618477ca..9f47fbc8c 100644
--- a/servers/physics_2d_server.cpp
+++ b/servers/physics_2d_server.cpp
@@ -28,103 +28,97 @@
/*************************************************************************/
#include "physics_2d_server.h"
#include "print_string.h"
-Physics2DServer * Physics2DServer::singleton=NULL;
-
+Physics2DServer *Physics2DServer::singleton = NULL;
void Physics2DDirectBodyState::integrate_forces() {
real_t step = get_step();
Vector2 lv = get_linear_velocity();
- lv+=get_total_gravity() * step;
+ lv += get_total_gravity() * step;
real_t av = get_angular_velocity();
float damp = 1.0 - step * get_total_linear_damp();
- if (damp<0) // reached zero in the given time
- damp=0;
+ if (damp < 0) // reached zero in the given time
+ damp = 0;
- lv*=damp;
+ lv *= damp;
damp = 1.0 - step * get_total_angular_damp();
- if (damp<0) // reached zero in the given time
- damp=0;
+ if (damp < 0) // reached zero in the given time
+ damp = 0;
- av*=damp;
+ av *= damp;
set_linear_velocity(lv);
set_angular_velocity(av);
-
-
}
-Object* Physics2DDirectBodyState::get_contact_collider_object(int p_contact_idx) const {
+Object *Physics2DDirectBodyState::get_contact_collider_object(int p_contact_idx) const {
ObjectID objid = get_contact_collider_id(p_contact_idx);
- Object *obj = ObjectDB::get_instance( objid );
+ Object *obj = ObjectDB::get_instance(objid);
return obj;
}
-Physics2DServer * Physics2DServer::get_singleton() {
+Physics2DServer *Physics2DServer::get_singleton() {
return singleton;
}
void Physics2DDirectBodyState::_bind_methods() {
- ObjectTypeDB::bind_method(_MD("get_total_gravity"),&Physics2DDirectBodyState::get_total_gravity);
- ObjectTypeDB::bind_method(_MD("get_total_linear_damp"),&Physics2DDirectBodyState::get_total_linear_damp);
- ObjectTypeDB::bind_method(_MD("get_total_angular_damp"),&Physics2DDirectBodyState::get_total_angular_damp);
+ ObjectTypeDB::bind_method(_MD("get_total_gravity"), &Physics2DDirectBodyState::get_total_gravity);
+ ObjectTypeDB::bind_method(_MD("get_total_linear_damp"), &Physics2DDirectBodyState::get_total_linear_damp);
+ ObjectTypeDB::bind_method(_MD("get_total_angular_damp"), &Physics2DDirectBodyState::get_total_angular_damp);
- ObjectTypeDB::bind_method(_MD("get_inverse_mass"),&Physics2DDirectBodyState::get_inverse_mass);
- ObjectTypeDB::bind_method(_MD("get_inverse_inertia"),&Physics2DDirectBodyState::get_inverse_inertia);
+ ObjectTypeDB::bind_method(_MD("get_inverse_mass"), &Physics2DDirectBodyState::get_inverse_mass);
+ ObjectTypeDB::bind_method(_MD("get_inverse_inertia"), &Physics2DDirectBodyState::get_inverse_inertia);
- ObjectTypeDB::bind_method(_MD("set_linear_velocity","velocity"),&Physics2DDirectBodyState::set_linear_velocity);
- ObjectTypeDB::bind_method(_MD("get_linear_velocity"),&Physics2DDirectBodyState::get_linear_velocity);
+ ObjectTypeDB::bind_method(_MD("set_linear_velocity", "velocity"), &Physics2DDirectBodyState::set_linear_velocity);
+ ObjectTypeDB::bind_method(_MD("get_linear_velocity"), &Physics2DDirectBodyState::get_linear_velocity);
- ObjectTypeDB::bind_method(_MD("set_angular_velocity","velocity"),&Physics2DDirectBodyState::set_angular_velocity);
- ObjectTypeDB::bind_method(_MD("get_angular_velocity"),&Physics2DDirectBodyState::get_angular_velocity);
+ ObjectTypeDB::bind_method(_MD("set_angular_velocity", "velocity"), &Physics2DDirectBodyState::set_angular_velocity);
+ ObjectTypeDB::bind_method(_MD("get_angular_velocity"), &Physics2DDirectBodyState::get_angular_velocity);
- ObjectTypeDB::bind_method(_MD("set_transform","transform"),&Physics2DDirectBodyState::set_transform);
- ObjectTypeDB::bind_method(_MD("get_transform"),&Physics2DDirectBodyState::get_transform);
+ ObjectTypeDB::bind_method(_MD("set_transform", "transform"), &Physics2DDirectBodyState::set_transform);
+ ObjectTypeDB::bind_method(_MD("get_transform"), &Physics2DDirectBodyState::get_transform);
- ObjectTypeDB::bind_method(_MD("set_sleep_state","enabled"),&Physics2DDirectBodyState::set_sleep_state);
- ObjectTypeDB::bind_method(_MD("is_sleeping"),&Physics2DDirectBodyState::is_sleeping);
+ ObjectTypeDB::bind_method(_MD("set_sleep_state", "enabled"), &Physics2DDirectBodyState::set_sleep_state);
+ ObjectTypeDB::bind_method(_MD("is_sleeping"), &Physics2DDirectBodyState::is_sleeping);
- ObjectTypeDB::bind_method(_MD("get_contact_count"),&Physics2DDirectBodyState::get_contact_count);
-
- ObjectTypeDB::bind_method(_MD("get_contact_local_pos","contact_idx"),&Physics2DDirectBodyState::get_contact_local_pos);
- ObjectTypeDB::bind_method(_MD("get_contact_local_normal","contact_idx"),&Physics2DDirectBodyState::get_contact_local_normal);
- ObjectTypeDB::bind_method(_MD("get_contact_local_shape","contact_idx"),&Physics2DDirectBodyState::get_contact_local_shape);
- ObjectTypeDB::bind_method(_MD("get_contact_collider","contact_idx"),&Physics2DDirectBodyState::get_contact_collider);
- ObjectTypeDB::bind_method(_MD("get_contact_collider_pos","contact_idx"),&Physics2DDirectBodyState::get_contact_collider_pos);
- ObjectTypeDB::bind_method(_MD("get_contact_collider_id","contact_idx"),&Physics2DDirectBodyState::get_contact_collider_id);
- ObjectTypeDB::bind_method(_MD("get_contact_collider_object","contact_idx"),&Physics2DDirectBodyState::get_contact_collider_object);
- ObjectTypeDB::bind_method(_MD("get_contact_collider_shape","contact_idx"),&Physics2DDirectBodyState::get_contact_collider_shape);
- ObjectTypeDB::bind_method(_MD("get_contact_collider_shape_metadata:Variant","contact_idx"),&Physics2DDirectBodyState::get_contact_collider_shape_metadata);
- ObjectTypeDB::bind_method(_MD("get_contact_collider_velocity_at_pos","contact_idx"),&Physics2DDirectBodyState::get_contact_collider_velocity_at_pos);
- ObjectTypeDB::bind_method(_MD("get_step"),&Physics2DDirectBodyState::get_step);
- ObjectTypeDB::bind_method(_MD("integrate_forces"),&Physics2DDirectBodyState::integrate_forces);
- ObjectTypeDB::bind_method(_MD("get_space_state:Physics2DDirectSpaceState"),&Physics2DDirectBodyState::get_space_state);
+ ObjectTypeDB::bind_method(_MD("get_contact_count"), &Physics2DDirectBodyState::get_contact_count);
+ ObjectTypeDB::bind_method(_MD("get_contact_local_pos", "contact_idx"), &Physics2DDirectBodyState::get_contact_local_pos);
+ ObjectTypeDB::bind_method(_MD("get_contact_local_normal", "contact_idx"), &Physics2DDirectBodyState::get_contact_local_normal);
+ ObjectTypeDB::bind_method(_MD("get_contact_local_shape", "contact_idx"), &Physics2DDirectBodyState::get_contact_local_shape);
+ ObjectTypeDB::bind_method(_MD("get_contact_collider", "contact_idx"), &Physics2DDirectBodyState::get_contact_collider);
+ ObjectTypeDB::bind_method(_MD("get_contact_collider_pos", "contact_idx"), &Physics2DDirectBodyState::get_contact_collider_pos);
+ ObjectTypeDB::bind_method(_MD("get_contact_collider_id", "contact_idx"), &Physics2DDirectBodyState::get_contact_collider_id);
+ ObjectTypeDB::bind_method(_MD("get_contact_collider_object", "contact_idx"), &Physics2DDirectBodyState::get_contact_collider_object);
+ ObjectTypeDB::bind_method(_MD("get_contact_collider_shape", "contact_idx"), &Physics2DDirectBodyState::get_contact_collider_shape);
+ ObjectTypeDB::bind_method(_MD("get_contact_collider_shape_metadata:Variant", "contact_idx"), &Physics2DDirectBodyState::get_contact_collider_shape_metadata);
+ ObjectTypeDB::bind_method(_MD("get_contact_collider_velocity_at_pos", "contact_idx"), &Physics2DDirectBodyState::get_contact_collider_velocity_at_pos);
+ ObjectTypeDB::bind_method(_MD("get_step"), &Physics2DDirectBodyState::get_step);
+ ObjectTypeDB::bind_method(_MD("integrate_forces"), &Physics2DDirectBodyState::integrate_forces);
+ ObjectTypeDB::bind_method(_MD("get_space_state:Physics2DDirectSpaceState"), &Physics2DDirectBodyState::get_space_state);
}
Physics2DDirectBodyState::Physics2DDirectBodyState() {}
///////////////////////////////////////////////////////
-
-
void Physics2DShapeQueryParameters::set_shape(const RES &p_shape) {
ERR_FAIL_COND(p_shape.is_null());
- shape=p_shape->get_rid();
+ shape = p_shape->get_rid();
}
-void Physics2DShapeQueryParameters::set_shape_rid(const RID& p_shape) {
+void Physics2DShapeQueryParameters::set_shape_rid(const RID &p_shape) {
- shape=p_shape;
+ shape = p_shape;
}
RID Physics2DShapeQueryParameters::get_shape_rid() const {
@@ -132,125 +126,120 @@ RID Physics2DShapeQueryParameters::get_shape_rid() const {
return shape;
}
-void Physics2DShapeQueryParameters::set_transform(const Matrix32& p_transform){
+void Physics2DShapeQueryParameters::set_transform(const Matrix32 &p_transform) {
- transform=p_transform;
+ transform = p_transform;
}
-Matrix32 Physics2DShapeQueryParameters::get_transform() const{
+Matrix32 Physics2DShapeQueryParameters::get_transform() const {
return transform;
}
-void Physics2DShapeQueryParameters::set_motion(const Vector2& p_motion){
+void Physics2DShapeQueryParameters::set_motion(const Vector2 &p_motion) {
- motion=p_motion;
+ motion = p_motion;
}
-Vector2 Physics2DShapeQueryParameters::get_motion() const{
+Vector2 Physics2DShapeQueryParameters::get_motion() const {
return motion;
}
-void Physics2DShapeQueryParameters::set_margin(float p_margin){
+void Physics2DShapeQueryParameters::set_margin(float p_margin) {
- margin=p_margin;
+ margin = p_margin;
}
-float Physics2DShapeQueryParameters::get_margin() const{
+float Physics2DShapeQueryParameters::get_margin() const {
return margin;
}
-void Physics2DShapeQueryParameters::set_layer_mask(int p_layer_mask){
+void Physics2DShapeQueryParameters::set_layer_mask(int p_layer_mask) {
- layer_mask=p_layer_mask;
+ layer_mask = p_layer_mask;
}
-int Physics2DShapeQueryParameters::get_layer_mask() const{
+int Physics2DShapeQueryParameters::get_layer_mask() const {
return layer_mask;
}
+void Physics2DShapeQueryParameters::set_object_type_mask(int p_object_type_mask) {
-void Physics2DShapeQueryParameters::set_object_type_mask(int p_object_type_mask){
-
- object_type_mask=p_object_type_mask;
+ object_type_mask = p_object_type_mask;
}
-int Physics2DShapeQueryParameters::get_object_type_mask() const{
+int Physics2DShapeQueryParameters::get_object_type_mask() const {
return object_type_mask;
}
-void Physics2DShapeQueryParameters::set_exclude(const Vector<RID>& p_exclude) {
+void Physics2DShapeQueryParameters::set_exclude(const Vector<RID> &p_exclude) {
exclude.clear();
- for(int i=0;i<p_exclude.size();i++)
+ for (int i = 0; i < p_exclude.size(); i++)
exclude.insert(p_exclude[i]);
-
}
-Vector<RID> Physics2DShapeQueryParameters::get_exclude() const{
+Vector<RID> Physics2DShapeQueryParameters::get_exclude() const {
Vector<RID> ret;
ret.resize(exclude.size());
- int idx=0;
- for(Set<RID>::Element *E=exclude.front();E;E=E->next()) {
- ret[idx]=E->get();
+ int idx = 0;
+ for (Set<RID>::Element *E = exclude.front(); E; E = E->next()) {
+ ret[idx] = E->get();
}
return ret;
}
void Physics2DShapeQueryParameters::_bind_methods() {
- ObjectTypeDB::bind_method(_MD("set_shape","shape:Shape2D"),&Physics2DShapeQueryParameters::set_shape);
- ObjectTypeDB::bind_method(_MD("set_shape_rid","shape"),&Physics2DShapeQueryParameters::set_shape_rid);
- ObjectTypeDB::bind_method(_MD("get_shape_rid"),&Physics2DShapeQueryParameters::get_shape_rid);
-
- ObjectTypeDB::bind_method(_MD("set_transform","transform"),&Physics2DShapeQueryParameters::set_transform);
- ObjectTypeDB::bind_method(_MD("get_transform"),&Physics2DShapeQueryParameters::get_transform);
+ ObjectTypeDB::bind_method(_MD("set_shape", "shape:Shape2D"), &Physics2DShapeQueryParameters::set_shape);
+ ObjectTypeDB::bind_method(_MD("set_shape_rid", "shape"), &Physics2DShapeQueryParameters::set_shape_rid);
+ ObjectTypeDB::bind_method(_MD("get_shape_rid"), &Physics2DShapeQueryParameters::get_shape_rid);
- ObjectTypeDB::bind_method(_MD("set_motion","motion"),&Physics2DShapeQueryParameters::set_motion);
- ObjectTypeDB::bind_method(_MD("get_motion"),&Physics2DShapeQueryParameters::get_motion);
+ ObjectTypeDB::bind_method(_MD("set_transform", "transform"), &Physics2DShapeQueryParameters::set_transform);
+ ObjectTypeDB::bind_method(_MD("get_transform"), &Physics2DShapeQueryParameters::get_transform);
- ObjectTypeDB::bind_method(_MD("set_margin","margin"),&Physics2DShapeQueryParameters::set_margin);
- ObjectTypeDB::bind_method(_MD("get_margin"),&Physics2DShapeQueryParameters::get_margin);
+ ObjectTypeDB::bind_method(_MD("set_motion", "motion"), &Physics2DShapeQueryParameters::set_motion);
+ ObjectTypeDB::bind_method(_MD("get_motion"), &Physics2DShapeQueryParameters::get_motion);
- ObjectTypeDB::bind_method(_MD("set_layer_mask","layer_mask"),&Physics2DShapeQueryParameters::set_layer_mask);
- ObjectTypeDB::bind_method(_MD("get_layer_mask"),&Physics2DShapeQueryParameters::get_layer_mask);
+ ObjectTypeDB::bind_method(_MD("set_margin", "margin"), &Physics2DShapeQueryParameters::set_margin);
+ ObjectTypeDB::bind_method(_MD("get_margin"), &Physics2DShapeQueryParameters::get_margin);
- ObjectTypeDB::bind_method(_MD("set_object_type_mask","object_type_mask"),&Physics2DShapeQueryParameters::set_object_type_mask);
- ObjectTypeDB::bind_method(_MD("get_object_type_mask"),&Physics2DShapeQueryParameters::get_object_type_mask);
-
- ObjectTypeDB::bind_method(_MD("set_exclude","exclude"),&Physics2DShapeQueryParameters::set_exclude);
- ObjectTypeDB::bind_method(_MD("get_exclude"),&Physics2DShapeQueryParameters::get_exclude);
+ ObjectTypeDB::bind_method(_MD("set_layer_mask", "layer_mask"), &Physics2DShapeQueryParameters::set_layer_mask);
+ ObjectTypeDB::bind_method(_MD("get_layer_mask"), &Physics2DShapeQueryParameters::get_layer_mask);
+ ObjectTypeDB::bind_method(_MD("set_object_type_mask", "object_type_mask"), &Physics2DShapeQueryParameters::set_object_type_mask);
+ ObjectTypeDB::bind_method(_MD("get_object_type_mask"), &Physics2DShapeQueryParameters::get_object_type_mask);
+ ObjectTypeDB::bind_method(_MD("set_exclude", "exclude"), &Physics2DShapeQueryParameters::set_exclude);
+ ObjectTypeDB::bind_method(_MD("get_exclude"), &Physics2DShapeQueryParameters::get_exclude);
}
Physics2DShapeQueryParameters::Physics2DShapeQueryParameters() {
- margin=0;
- layer_mask=0x7FFFFFFF;
- object_type_mask=Physics2DDirectSpaceState::TYPE_MASK_COLLISION;
+ margin = 0;
+ layer_mask = 0x7FFFFFFF;
+ object_type_mask = Physics2DDirectSpaceState::TYPE_MASK_COLLISION;
}
-
-Dictionary Physics2DDirectSpaceState::_intersect_ray(const Vector2& p_from, const Vector2& p_to,const Vector<RID>& p_exclude,uint32_t p_layers,uint32_t p_object_type_mask) {
+Dictionary Physics2DDirectSpaceState::_intersect_ray(const Vector2 &p_from, const Vector2 &p_to, const Vector<RID> &p_exclude, uint32_t p_layers, uint32_t p_object_type_mask) {
RayResult inters;
Set<RID> exclude;
- for(int i=0;i<p_exclude.size();i++)
+ for (int i = 0; i < p_exclude.size(); i++)
exclude.insert(p_exclude[i]);
- bool res = intersect_ray(p_from,p_to,inters,exclude,p_layers,p_object_type_mask);
+ bool res = intersect_ray(p_from, p_to, inters, exclude, p_layers, p_object_type_mask);
if (!res)
return Dictionary(true);
Dictionary d(true);
- d["position"]=inters.position;
- d["normal"]=inters.normal;
- d["collider_id"]=inters.collider_id;
- d["collider"]=inters.collider;
- d["shape"]=inters.shape;
- d["rid"]=inters.rid;
- d["metadata"]=inters.metadata;
+ d["position"] = inters.position;
+ d["normal"] = inters.normal;
+ d["collider_id"] = inters.collider_id;
+ d["collider"] = inters.collider;
+ d["shape"] = inters.shape;
+ d["rid"] = inters.rid;
+ d["metadata"] = inters.metadata;
return d;
}
@@ -259,131 +248,119 @@ Array Physics2DDirectSpaceState::_intersect_shape(const Ref<Physics2DShapeQueryP
Vector<ShapeResult> sr;
sr.resize(p_max_results);
- int rc = intersect_shape(psq->shape,psq->transform,psq->motion,psq->margin,sr.ptr(),sr.size(),psq->exclude,psq->layer_mask,psq->object_type_mask);
+ int rc = intersect_shape(psq->shape, psq->transform, psq->motion, psq->margin, sr.ptr(), sr.size(), psq->exclude, psq->layer_mask, psq->object_type_mask);
Array ret;
ret.resize(rc);
- for(int i=0;i<rc;i++) {
+ for (int i = 0; i < rc; i++) {
Dictionary d;
- d["rid"]=sr[i].rid;
- d["collider_id"]=sr[i].collider_id;
- d["collider"]=sr[i].collider;
- d["shape"]=sr[i].shape;
- d["metadata"]=sr[i].metadata;
- ret[i]=d;
+ d["rid"] = sr[i].rid;
+ d["collider_id"] = sr[i].collider_id;
+ d["collider"] = sr[i].collider;
+ d["shape"] = sr[i].shape;
+ d["metadata"] = sr[i].metadata;
+ ret[i] = d;
}
return ret;
}
-Array Physics2DDirectSpaceState::_cast_motion(const Ref<Physics2DShapeQueryParameters> &psq){
+Array Physics2DDirectSpaceState::_cast_motion(const Ref<Physics2DShapeQueryParameters> &psq) {
- float closest_safe,closest_unsafe;
- bool res = cast_motion(psq->shape,psq->transform,psq->motion,psq->margin,closest_safe,closest_unsafe,psq->exclude,psq->layer_mask,psq->object_type_mask);
+ float closest_safe, closest_unsafe;
+ bool res = cast_motion(psq->shape, psq->transform, psq->motion, psq->margin, closest_safe, closest_unsafe, psq->exclude, psq->layer_mask, psq->object_type_mask);
if (!res)
return Array();
Array ret(true);
ret.resize(2);
- ret[0]=closest_safe;
- ret[1]=closest_unsafe;
+ ret[0] = closest_safe;
+ ret[1] = closest_unsafe;
return ret;
-
}
-Array Physics2DDirectSpaceState::_intersect_point(const Vector2& p_point,int p_max_results,const Vector<RID>& p_exclude,uint32_t p_layers,uint32_t p_object_type_mask) {
+Array Physics2DDirectSpaceState::_intersect_point(const Vector2 &p_point, int p_max_results, const Vector<RID> &p_exclude, uint32_t p_layers, uint32_t p_object_type_mask) {
Set<RID> exclude;
- for(int i=0;i<p_exclude.size();i++)
+ for (int i = 0; i < p_exclude.size(); i++)
exclude.insert(p_exclude[i]);
Vector<ShapeResult> ret;
ret.resize(p_max_results);
- int rc = intersect_point(p_point,ret.ptr(),ret.size(),exclude,p_layers,p_object_type_mask);
- if (rc==0)
+ int rc = intersect_point(p_point, ret.ptr(), ret.size(), exclude, p_layers, p_object_type_mask);
+ if (rc == 0)
return Array();
Array r;
r.resize(rc);
- for(int i=0;i<rc;i++) {
+ for (int i = 0; i < rc; i++) {
Dictionary d;
- d["rid"]=ret[i].rid;
- d["collider_id"]=ret[i].collider_id;
- d["collider"]=ret[i].collider;
- d["shape"]=ret[i].shape;
- d["metadata"]=ret[i].metadata;
- r[i]=d;
+ d["rid"] = ret[i].rid;
+ d["collider_id"] = ret[i].collider_id;
+ d["collider"] = ret[i].collider;
+ d["shape"] = ret[i].shape;
+ d["metadata"] = ret[i].metadata;
+ r[i] = d;
}
return r;
-
}
-Array Physics2DDirectSpaceState::_collide_shape(const Ref<Physics2DShapeQueryParameters> &psq, int p_max_results){
+Array Physics2DDirectSpaceState::_collide_shape(const Ref<Physics2DShapeQueryParameters> &psq, int p_max_results) {
Vector<Vector2> ret;
- ret.resize(p_max_results*2);
- int rc=0;
- bool res = collide_shape(psq->shape,psq->transform,psq->motion,psq->margin,ret.ptr(),p_max_results,rc,psq->exclude,psq->layer_mask,psq->object_type_mask);
+ ret.resize(p_max_results * 2);
+ int rc = 0;
+ bool res = collide_shape(psq->shape, psq->transform, psq->motion, psq->margin, ret.ptr(), p_max_results, rc, psq->exclude, psq->layer_mask, psq->object_type_mask);
if (!res)
return Array();
Array r;
- r.resize(rc*2);
- for(int i=0;i<rc*2;i++)
- r[i]=ret[i];
+ r.resize(rc * 2);
+ for (int i = 0; i < rc * 2; i++)
+ r[i] = ret[i];
return r;
-
}
-Dictionary Physics2DDirectSpaceState::_get_rest_info(const Ref<Physics2DShapeQueryParameters> &psq){
+Dictionary Physics2DDirectSpaceState::_get_rest_info(const Ref<Physics2DShapeQueryParameters> &psq) {
ShapeRestInfo sri;
- bool res = rest_info(psq->shape,psq->transform,psq->motion,psq->margin,&sri,psq->exclude,psq->layer_mask,psq->object_type_mask);
+ bool res = rest_info(psq->shape, psq->transform, psq->motion, psq->margin, &sri, psq->exclude, psq->layer_mask, psq->object_type_mask);
Dictionary r(true);
if (!res)
return r;
- r["point"]=sri.point;
- r["normal"]=sri.normal;
- r["rid"]=sri.rid;
- r["collider_id"]=sri.collider_id;
- r["shape"]=sri.shape;
- r["linear_velocity"]=sri.linear_velocity;
- r["metadata"]=sri.metadata;
+ r["point"] = sri.point;
+ r["normal"] = sri.normal;
+ r["rid"] = sri.rid;
+ r["collider_id"] = sri.collider_id;
+ r["shape"] = sri.shape;
+ r["linear_velocity"] = sri.linear_velocity;
+ r["metadata"] = sri.metadata;
return r;
}
-
-
Physics2DDirectSpaceState::Physics2DDirectSpaceState() {
-
-
-
}
-
void Physics2DDirectSpaceState::_bind_methods() {
-
- ObjectTypeDB::bind_method(_MD("intersect_point","point","max_results","exclude","layer_mask","type_mask"),&Physics2DDirectSpaceState::_intersect_point,DEFVAL(32),DEFVAL(Array()),DEFVAL(0x7FFFFFFF),DEFVAL(TYPE_MASK_COLLISION));
- ObjectTypeDB::bind_method(_MD("intersect_ray:Dictionary","from","to","exclude","layer_mask","type_mask"),&Physics2DDirectSpaceState::_intersect_ray,DEFVAL(Array()),DEFVAL(0x7FFFFFFF),DEFVAL(TYPE_MASK_COLLISION));
- ObjectTypeDB::bind_method(_MD("intersect_shape","shape:Physics2DShapeQueryParameters","max_results"),&Physics2DDirectSpaceState::_intersect_shape,DEFVAL(32));
- ObjectTypeDB::bind_method(_MD("cast_motion","shape:Physics2DShapeQueryParameters"),&Physics2DDirectSpaceState::_cast_motion);
- ObjectTypeDB::bind_method(_MD("collide_shape","shape:Physics2DShapeQueryParameters","max_results"),&Physics2DDirectSpaceState::_collide_shape,DEFVAL(32));
- ObjectTypeDB::bind_method(_MD("get_rest_info","shape:Physics2DShapeQueryParameters"),&Physics2DDirectSpaceState::_get_rest_info);
+ ObjectTypeDB::bind_method(_MD("intersect_point", "point", "max_results", "exclude", "layer_mask", "type_mask"), &Physics2DDirectSpaceState::_intersect_point, DEFVAL(32), DEFVAL(Array()), DEFVAL(0x7FFFFFFF), DEFVAL(TYPE_MASK_COLLISION));
+ ObjectTypeDB::bind_method(_MD("intersect_ray:Dictionary", "from", "to", "exclude", "layer_mask", "type_mask"), &Physics2DDirectSpaceState::_intersect_ray, DEFVAL(Array()), DEFVAL(0x7FFFFFFF), DEFVAL(TYPE_MASK_COLLISION));
+ ObjectTypeDB::bind_method(_MD("intersect_shape", "shape:Physics2DShapeQueryParameters", "max_results"), &Physics2DDirectSpaceState::_intersect_shape, DEFVAL(32));
+ ObjectTypeDB::bind_method(_MD("cast_motion", "shape:Physics2DShapeQueryParameters"), &Physics2DDirectSpaceState::_cast_motion);
+ ObjectTypeDB::bind_method(_MD("collide_shape", "shape:Physics2DShapeQueryParameters", "max_results"), &Physics2DDirectSpaceState::_collide_shape, DEFVAL(32));
+ ObjectTypeDB::bind_method(_MD("get_rest_info", "shape:Physics2DShapeQueryParameters"), &Physics2DDirectSpaceState::_get_rest_info);
//ObjectTypeDB::bind_method(_MD("cast_motion","shape","xform","motion","exclude","umask"),&Physics2DDirectSpaceState::_intersect_shape,DEFVAL(Array()),DEFVAL(0));
- BIND_CONSTANT( TYPE_MASK_STATIC_BODY );
- BIND_CONSTANT( TYPE_MASK_KINEMATIC_BODY );
- BIND_CONSTANT( TYPE_MASK_RIGID_BODY );
- BIND_CONSTANT( TYPE_MASK_CHARACTER_BODY );
- BIND_CONSTANT( TYPE_MASK_AREA );
- BIND_CONSTANT( TYPE_MASK_COLLISION );
-
+ BIND_CONSTANT(TYPE_MASK_STATIC_BODY);
+ BIND_CONSTANT(TYPE_MASK_KINEMATIC_BODY);
+ BIND_CONSTANT(TYPE_MASK_RIGID_BODY);
+ BIND_CONSTANT(TYPE_MASK_CHARACTER_BODY);
+ BIND_CONSTANT(TYPE_MASK_AREA);
+ BIND_CONSTANT(TYPE_MASK_COLLISION);
}
-
int Physics2DShapeQueryResult::get_result_count() const {
return result.size();
@@ -396,7 +373,7 @@ ObjectID Physics2DShapeQueryResult::get_result_object_id(int p_idx) const {
return result[p_idx].collider_id;
}
-Object* Physics2DShapeQueryResult::get_result_object(int p_idx) const {
+Object *Physics2DShapeQueryResult::get_result_object(int p_idx) const {
return result[p_idx].collider;
}
@@ -406,19 +383,15 @@ int Physics2DShapeQueryResult::get_result_object_shape(int p_idx) const {
}
Physics2DShapeQueryResult::Physics2DShapeQueryResult() {
-
-
}
void Physics2DShapeQueryResult::_bind_methods() {
- ObjectTypeDB::bind_method(_MD("get_result_count"),&Physics2DShapeQueryResult::get_result_count);
- ObjectTypeDB::bind_method(_MD("get_result_rid","idx"),&Physics2DShapeQueryResult::get_result_rid);
- ObjectTypeDB::bind_method(_MD("get_result_object_id","idx"),&Physics2DShapeQueryResult::get_result_object_id);
- ObjectTypeDB::bind_method(_MD("get_result_object","idx"),&Physics2DShapeQueryResult::get_result_object);
- ObjectTypeDB::bind_method(_MD("get_result_object_shape","idx"),&Physics2DShapeQueryResult::get_result_object_shape);
-
-
+ ObjectTypeDB::bind_method(_MD("get_result_count"), &Physics2DShapeQueryResult::get_result_count);
+ ObjectTypeDB::bind_method(_MD("get_result_rid", "idx"), &Physics2DShapeQueryResult::get_result_rid);
+ ObjectTypeDB::bind_method(_MD("get_result_object_id", "idx"), &Physics2DShapeQueryResult::get_result_object_id);
+ ObjectTypeDB::bind_method(_MD("get_result_object", "idx"), &Physics2DShapeQueryResult::get_result_object);
+ ObjectTypeDB::bind_method(_MD("get_result_object_shape", "idx"), &Physics2DShapeQueryResult::get_result_object_shape);
}
///////////////////////////////
@@ -427,41 +400,41 @@ void Physics2DShapeQueryResult::_bind_methods() {
return colliding;
}*/
-Vector2 Physics2DTestMotionResult::get_motion() const{
+Vector2 Physics2DTestMotionResult::get_motion() const {
return result.motion;
}
-Vector2 Physics2DTestMotionResult::get_motion_remainder() const{
+Vector2 Physics2DTestMotionResult::get_motion_remainder() const {
return result.remainder;
}
-Vector2 Physics2DTestMotionResult::get_collision_point() const{
+Vector2 Physics2DTestMotionResult::get_collision_point() const {
return result.collision_point;
}
-Vector2 Physics2DTestMotionResult::get_collision_normal() const{
+Vector2 Physics2DTestMotionResult::get_collision_normal() const {
return result.collision_normal;
}
-Vector2 Physics2DTestMotionResult::get_collider_velocity() const{
+Vector2 Physics2DTestMotionResult::get_collider_velocity() const {
return result.collider_velocity;
}
-ObjectID Physics2DTestMotionResult::get_collider_id() const{
+ObjectID Physics2DTestMotionResult::get_collider_id() const {
return result.collider_id;
}
-RID Physics2DTestMotionResult::get_collider_rid() const{
+RID Physics2DTestMotionResult::get_collider_rid() const {
return result.collider;
}
-Object* Physics2DTestMotionResult::get_collider() const {
+Object *Physics2DTestMotionResult::get_collider() const {
return ObjectDB::get_instance(result.collider_id);
}
-int Physics2DTestMotionResult::get_collider_shape() const{
+int Physics2DTestMotionResult::get_collider_shape() const {
return result.collider_shape;
}
@@ -469,278 +442,263 @@ int Physics2DTestMotionResult::get_collider_shape() const{
void Physics2DTestMotionResult::_bind_methods() {
//ObjectTypeDB::bind_method(_MD("is_colliding"),&Physics2DTestMotionResult::is_colliding);
- ObjectTypeDB::bind_method(_MD("get_motion"),&Physics2DTestMotionResult::get_motion);
- ObjectTypeDB::bind_method(_MD("get_motion_remainder"),&Physics2DTestMotionResult::get_motion_remainder);
- ObjectTypeDB::bind_method(_MD("get_collision_point"),&Physics2DTestMotionResult::get_collision_point);
- ObjectTypeDB::bind_method(_MD("get_collision_normal"),&Physics2DTestMotionResult::get_collision_normal);
- ObjectTypeDB::bind_method(_MD("get_collider_velocity"),&Physics2DTestMotionResult::get_collider_velocity);
- ObjectTypeDB::bind_method(_MD("get_collider_id"),&Physics2DTestMotionResult::get_collider_id);
- ObjectTypeDB::bind_method(_MD("get_collider_rid"),&Physics2DTestMotionResult::get_collider_rid);
- ObjectTypeDB::bind_method(_MD("get_collider"),&Physics2DTestMotionResult::get_collider);
- ObjectTypeDB::bind_method(_MD("get_collider_shape"),&Physics2DTestMotionResult::get_collider_shape);
-
+ ObjectTypeDB::bind_method(_MD("get_motion"), &Physics2DTestMotionResult::get_motion);
+ ObjectTypeDB::bind_method(_MD("get_motion_remainder"), &Physics2DTestMotionResult::get_motion_remainder);
+ ObjectTypeDB::bind_method(_MD("get_collision_point"), &Physics2DTestMotionResult::get_collision_point);
+ ObjectTypeDB::bind_method(_MD("get_collision_normal"), &Physics2DTestMotionResult::get_collision_normal);
+ ObjectTypeDB::bind_method(_MD("get_collider_velocity"), &Physics2DTestMotionResult::get_collider_velocity);
+ ObjectTypeDB::bind_method(_MD("get_collider_id"), &Physics2DTestMotionResult::get_collider_id);
+ ObjectTypeDB::bind_method(_MD("get_collider_rid"), &Physics2DTestMotionResult::get_collider_rid);
+ ObjectTypeDB::bind_method(_MD("get_collider"), &Physics2DTestMotionResult::get_collider);
+ ObjectTypeDB::bind_method(_MD("get_collider_shape"), &Physics2DTestMotionResult::get_collider_shape);
}
-Physics2DTestMotionResult::Physics2DTestMotionResult(){
+Physics2DTestMotionResult::Physics2DTestMotionResult() {
- colliding=false;
- result.collider_id=0;
- result.collider_shape=0;
+ colliding = false;
+ result.collider_id = 0;
+ result.collider_shape = 0;
}
-
///////////////////////////////////////
+bool Physics2DServer::_body_test_motion(RID p_body, const Vector2 &p_motion, float p_margin, const Ref<Physics2DTestMotionResult> &p_result) {
-
-bool Physics2DServer::_body_test_motion(RID p_body,const Vector2& p_motion,float p_margin,const Ref<Physics2DTestMotionResult>& p_result) {
-
- MotionResult *r=NULL;
+ MotionResult *r = NULL;
if (p_result.is_valid())
- r=p_result->get_result_ptr();
- return body_test_motion(p_body,p_motion,p_margin,r);
+ r = p_result->get_result_ptr();
+ return body_test_motion(p_body, p_motion, p_margin, r);
}
-bool Physics2DServer::_body_test_motion_from(RID p_body,const Matrix32& p_from,const Vector2& p_motion,float p_margin,const Ref<Physics2DTestMotionResult>& p_result) {
+bool Physics2DServer::_body_test_motion_from(RID p_body, const Matrix32 &p_from, const Vector2 &p_motion, float p_margin, const Ref<Physics2DTestMotionResult> &p_result) {
- MotionResult *r=NULL;
+ MotionResult *r = NULL;
if (p_result.is_valid())
- r=p_result->get_result_ptr();
- return body_test_motion_from(p_body,p_from,p_motion,p_margin,r);
+ r = p_result->get_result_ptr();
+ return body_test_motion_from(p_body, p_from, p_motion, p_margin, r);
}
void Physics2DServer::_bind_methods() {
+ ObjectTypeDB::bind_method(_MD("shape_create", "type"), &Physics2DServer::shape_create);
+ ObjectTypeDB::bind_method(_MD("shape_set_data", "shape", "data"), &Physics2DServer::shape_set_data);
- ObjectTypeDB::bind_method(_MD("shape_create","type"),&Physics2DServer::shape_create);
- ObjectTypeDB::bind_method(_MD("shape_set_data","shape","data"),&Physics2DServer::shape_set_data);
-
- ObjectTypeDB::bind_method(_MD("shape_get_type","shape"),&Physics2DServer::shape_get_type);
- ObjectTypeDB::bind_method(_MD("shape_get_data","shape"),&Physics2DServer::shape_get_data);
+ ObjectTypeDB::bind_method(_MD("shape_get_type", "shape"), &Physics2DServer::shape_get_type);
+ ObjectTypeDB::bind_method(_MD("shape_get_data", "shape"), &Physics2DServer::shape_get_data);
+ ObjectTypeDB::bind_method(_MD("space_create"), &Physics2DServer::space_create);
+ ObjectTypeDB::bind_method(_MD("space_set_active", "space", "active"), &Physics2DServer::space_set_active);
+ ObjectTypeDB::bind_method(_MD("space_is_active", "space"), &Physics2DServer::space_is_active);
+ ObjectTypeDB::bind_method(_MD("space_set_param", "space", "param", "value"), &Physics2DServer::space_set_param);
+ ObjectTypeDB::bind_method(_MD("space_get_param", "space", "param"), &Physics2DServer::space_get_param);
+ ObjectTypeDB::bind_method(_MD("space_get_direct_state:Physics2DDirectSpaceState", "space"), &Physics2DServer::space_get_direct_state);
- ObjectTypeDB::bind_method(_MD("space_create"),&Physics2DServer::space_create);
- ObjectTypeDB::bind_method(_MD("space_set_active","space","active"),&Physics2DServer::space_set_active);
- ObjectTypeDB::bind_method(_MD("space_is_active","space"),&Physics2DServer::space_is_active);
- ObjectTypeDB::bind_method(_MD("space_set_param","space","param","value"),&Physics2DServer::space_set_param);
- ObjectTypeDB::bind_method(_MD("space_get_param","space","param"),&Physics2DServer::space_get_param);
- ObjectTypeDB::bind_method(_MD("space_get_direct_state:Physics2DDirectSpaceState","space"),&Physics2DServer::space_get_direct_state);
+ ObjectTypeDB::bind_method(_MD("area_create"), &Physics2DServer::area_create);
+ ObjectTypeDB::bind_method(_MD("area_set_space", "area", "space"), &Physics2DServer::area_set_space);
+ ObjectTypeDB::bind_method(_MD("area_get_space", "area"), &Physics2DServer::area_get_space);
- ObjectTypeDB::bind_method(_MD("area_create"),&Physics2DServer::area_create);
- ObjectTypeDB::bind_method(_MD("area_set_space","area","space"),&Physics2DServer::area_set_space);
- ObjectTypeDB::bind_method(_MD("area_get_space","area"),&Physics2DServer::area_get_space);
+ ObjectTypeDB::bind_method(_MD("area_set_space_override_mode", "area", "mode"), &Physics2DServer::area_set_space_override_mode);
+ ObjectTypeDB::bind_method(_MD("area_get_space_override_mode", "area"), &Physics2DServer::area_get_space_override_mode);
- ObjectTypeDB::bind_method(_MD("area_set_space_override_mode","area","mode"),&Physics2DServer::area_set_space_override_mode);
- ObjectTypeDB::bind_method(_MD("area_get_space_override_mode","area"),&Physics2DServer::area_get_space_override_mode);
+ ObjectTypeDB::bind_method(_MD("area_add_shape", "area", "shape", "transform"), &Physics2DServer::area_add_shape, DEFVAL(Matrix32()));
+ ObjectTypeDB::bind_method(_MD("area_set_shape", "area", "shape_idx", "shape"), &Physics2DServer::area_set_shape);
+ ObjectTypeDB::bind_method(_MD("area_set_shape_transform", "area", "shape_idx", "transform"), &Physics2DServer::area_set_shape_transform);
- ObjectTypeDB::bind_method(_MD("area_add_shape","area","shape","transform"),&Physics2DServer::area_add_shape,DEFVAL(Matrix32()));
- ObjectTypeDB::bind_method(_MD("area_set_shape","area","shape_idx","shape"),&Physics2DServer::area_set_shape);
- ObjectTypeDB::bind_method(_MD("area_set_shape_transform","area","shape_idx","transform"),&Physics2DServer::area_set_shape_transform);
+ ObjectTypeDB::bind_method(_MD("area_get_shape_count", "area"), &Physics2DServer::area_get_shape_count);
+ ObjectTypeDB::bind_method(_MD("area_get_shape", "area", "shape_idx"), &Physics2DServer::area_get_shape);
+ ObjectTypeDB::bind_method(_MD("area_get_shape_transform", "area", "shape_idx"), &Physics2DServer::area_get_shape_transform);
- ObjectTypeDB::bind_method(_MD("area_get_shape_count","area"),&Physics2DServer::area_get_shape_count);
- ObjectTypeDB::bind_method(_MD("area_get_shape","area","shape_idx"),&Physics2DServer::area_get_shape);
- ObjectTypeDB::bind_method(_MD("area_get_shape_transform","area","shape_idx"),&Physics2DServer::area_get_shape_transform);
+ ObjectTypeDB::bind_method(_MD("area_remove_shape", "area", "shape_idx"), &Physics2DServer::area_remove_shape);
+ ObjectTypeDB::bind_method(_MD("area_clear_shapes", "area"), &Physics2DServer::area_clear_shapes);
- ObjectTypeDB::bind_method(_MD("area_remove_shape","area","shape_idx"),&Physics2DServer::area_remove_shape);
- ObjectTypeDB::bind_method(_MD("area_clear_shapes","area"),&Physics2DServer::area_clear_shapes);
+ ObjectTypeDB::bind_method(_MD("area_set_layer_mask", "area", "mask"), &Physics2DServer::area_set_layer_mask);
+ ObjectTypeDB::bind_method(_MD("area_set_collision_mask", "area", "mask"), &Physics2DServer::area_set_collision_mask);
- ObjectTypeDB::bind_method(_MD("area_set_layer_mask","area","mask"),&Physics2DServer::area_set_layer_mask);
- ObjectTypeDB::bind_method(_MD("area_set_collision_mask","area","mask"),&Physics2DServer::area_set_collision_mask);
+ ObjectTypeDB::bind_method(_MD("area_set_param", "area", "param", "value"), &Physics2DServer::area_set_param);
+ ObjectTypeDB::bind_method(_MD("area_set_transform", "area", "transform"), &Physics2DServer::area_set_transform);
- ObjectTypeDB::bind_method(_MD("area_set_param","area","param","value"),&Physics2DServer::area_set_param);
- ObjectTypeDB::bind_method(_MD("area_set_transform","area","transform"),&Physics2DServer::area_set_transform);
+ ObjectTypeDB::bind_method(_MD("area_get_param", "area", "param"), &Physics2DServer::area_get_param);
+ ObjectTypeDB::bind_method(_MD("area_get_transform", "area"), &Physics2DServer::area_get_transform);
- ObjectTypeDB::bind_method(_MD("area_get_param","area","param"),&Physics2DServer::area_get_param);
- ObjectTypeDB::bind_method(_MD("area_get_transform","area"),&Physics2DServer::area_get_transform);
+ ObjectTypeDB::bind_method(_MD("area_attach_object_instance_ID", "area", "id"), &Physics2DServer::area_attach_object_instance_ID);
+ ObjectTypeDB::bind_method(_MD("area_get_object_instance_ID", "area"), &Physics2DServer::area_get_object_instance_ID);
- ObjectTypeDB::bind_method(_MD("area_attach_object_instance_ID","area","id"),&Physics2DServer::area_attach_object_instance_ID);
- ObjectTypeDB::bind_method(_MD("area_get_object_instance_ID","area"),&Physics2DServer::area_get_object_instance_ID);
+ ObjectTypeDB::bind_method(_MD("area_set_monitor_callback", "area", "receiver", "method"), &Physics2DServer::area_set_monitor_callback);
- ObjectTypeDB::bind_method(_MD("area_set_monitor_callback","area","receiver","method"),&Physics2DServer::area_set_monitor_callback);
+ ObjectTypeDB::bind_method(_MD("body_create", "mode", "init_sleeping"), &Physics2DServer::body_create, DEFVAL(BODY_MODE_RIGID), DEFVAL(false));
- ObjectTypeDB::bind_method(_MD("body_create","mode","init_sleeping"),&Physics2DServer::body_create,DEFVAL(BODY_MODE_RIGID),DEFVAL(false));
+ ObjectTypeDB::bind_method(_MD("body_set_space", "body", "space"), &Physics2DServer::body_set_space);
+ ObjectTypeDB::bind_method(_MD("body_get_space", "body"), &Physics2DServer::body_get_space);
- ObjectTypeDB::bind_method(_MD("body_set_space","body","space"),&Physics2DServer::body_set_space);
- ObjectTypeDB::bind_method(_MD("body_get_space","body"),&Physics2DServer::body_get_space);
+ ObjectTypeDB::bind_method(_MD("body_set_mode", "body", "mode"), &Physics2DServer::body_set_mode);
+ ObjectTypeDB::bind_method(_MD("body_get_mode", "body"), &Physics2DServer::body_get_mode);
- ObjectTypeDB::bind_method(_MD("body_set_mode","body","mode"),&Physics2DServer::body_set_mode);
- ObjectTypeDB::bind_method(_MD("body_get_mode","body"),&Physics2DServer::body_get_mode);
+ ObjectTypeDB::bind_method(_MD("body_add_shape", "body", "shape", "transform"), &Physics2DServer::body_add_shape, DEFVAL(Matrix32()));
+ ObjectTypeDB::bind_method(_MD("body_set_shape", "body", "shape_idx", "shape"), &Physics2DServer::body_set_shape);
+ ObjectTypeDB::bind_method(_MD("body_set_shape_transform", "body", "shape_idx", "transform"), &Physics2DServer::body_set_shape_transform);
+ ObjectTypeDB::bind_method(_MD("body_set_shape_metadata", "body", "shape_idx", "metadata"), &Physics2DServer::body_set_shape_metadata);
- ObjectTypeDB::bind_method(_MD("body_add_shape","body","shape","transform"),&Physics2DServer::body_add_shape,DEFVAL(Matrix32()));
- ObjectTypeDB::bind_method(_MD("body_set_shape","body","shape_idx","shape"),&Physics2DServer::body_set_shape);
- ObjectTypeDB::bind_method(_MD("body_set_shape_transform","body","shape_idx","transform"),&Physics2DServer::body_set_shape_transform);
- ObjectTypeDB::bind_method(_MD("body_set_shape_metadata","body","shape_idx","metadata"),&Physics2DServer::body_set_shape_metadata);
+ ObjectTypeDB::bind_method(_MD("body_get_shape_count", "body"), &Physics2DServer::body_get_shape_count);
+ ObjectTypeDB::bind_method(_MD("body_get_shape", "body", "shape_idx"), &Physics2DServer::body_get_shape);
+ ObjectTypeDB::bind_method(_MD("body_get_shape_transform", "body", "shape_idx"), &Physics2DServer::body_get_shape_transform);
+ ObjectTypeDB::bind_method(_MD("body_get_shape_metadata", "body", "shape_idx"), &Physics2DServer::body_get_shape_metadata);
- ObjectTypeDB::bind_method(_MD("body_get_shape_count","body"),&Physics2DServer::body_get_shape_count);
- ObjectTypeDB::bind_method(_MD("body_get_shape","body","shape_idx"),&Physics2DServer::body_get_shape);
- ObjectTypeDB::bind_method(_MD("body_get_shape_transform","body","shape_idx"),&Physics2DServer::body_get_shape_transform);
- ObjectTypeDB::bind_method(_MD("body_get_shape_metadata","body","shape_idx"),&Physics2DServer::body_get_shape_metadata);
+ ObjectTypeDB::bind_method(_MD("body_remove_shape", "body", "shape_idx"), &Physics2DServer::body_remove_shape);
+ ObjectTypeDB::bind_method(_MD("body_clear_shapes", "body"), &Physics2DServer::body_clear_shapes);
- ObjectTypeDB::bind_method(_MD("body_remove_shape","body","shape_idx"),&Physics2DServer::body_remove_shape);
- ObjectTypeDB::bind_method(_MD("body_clear_shapes","body"),&Physics2DServer::body_clear_shapes);
+ ObjectTypeDB::bind_method(_MD("body_set_shape_as_trigger", "body", "shape_idx", "enable"), &Physics2DServer::body_set_shape_as_trigger);
+ ObjectTypeDB::bind_method(_MD("body_is_shape_set_as_trigger", "body", "shape_idx"), &Physics2DServer::body_is_shape_set_as_trigger);
+ ObjectTypeDB::bind_method(_MD("body_attach_object_instance_ID", "body", "id"), &Physics2DServer::body_attach_object_instance_ID);
+ ObjectTypeDB::bind_method(_MD("body_get_object_instance_ID", "body"), &Physics2DServer::body_get_object_instance_ID);
- ObjectTypeDB::bind_method(_MD("body_set_shape_as_trigger","body","shape_idx","enable"),&Physics2DServer::body_set_shape_as_trigger);
- ObjectTypeDB::bind_method(_MD("body_is_shape_set_as_trigger","body","shape_idx"),&Physics2DServer::body_is_shape_set_as_trigger);
+ ObjectTypeDB::bind_method(_MD("body_set_continuous_collision_detection_mode", "body", "mode"), &Physics2DServer::body_set_continuous_collision_detection_mode);
+ ObjectTypeDB::bind_method(_MD("body_get_continuous_collision_detection_mode", "body"), &Physics2DServer::body_get_continuous_collision_detection_mode);
- ObjectTypeDB::bind_method(_MD("body_attach_object_instance_ID","body","id"),&Physics2DServer::body_attach_object_instance_ID);
- ObjectTypeDB::bind_method(_MD("body_get_object_instance_ID","body"),&Physics2DServer::body_get_object_instance_ID);
+ ObjectTypeDB::bind_method(_MD("body_set_layer_mask", "body", "mask"), &Physics2DServer::body_set_layer_mask);
+ ObjectTypeDB::bind_method(_MD("body_get_layer_mask", "body"), &Physics2DServer::body_get_layer_mask);
+ ObjectTypeDB::bind_method(_MD("body_set_collision_mask", "body", "mask"), &Physics2DServer::body_set_collision_mask);
+ ObjectTypeDB::bind_method(_MD("body_get_collision_mask", "body"), &Physics2DServer::body_get_collision_mask);
- ObjectTypeDB::bind_method(_MD("body_set_continuous_collision_detection_mode","body","mode"),&Physics2DServer::body_set_continuous_collision_detection_mode);
- ObjectTypeDB::bind_method(_MD("body_get_continuous_collision_detection_mode","body"),&Physics2DServer::body_get_continuous_collision_detection_mode);
+ ObjectTypeDB::bind_method(_MD("body_set_param", "body", "param", "value"), &Physics2DServer::body_set_param);
+ ObjectTypeDB::bind_method(_MD("body_get_param", "body", "param"), &Physics2DServer::body_get_param);
+ ObjectTypeDB::bind_method(_MD("body_set_state", "body", "state", "value"), &Physics2DServer::body_set_state);
+ ObjectTypeDB::bind_method(_MD("body_get_state", "body", "state"), &Physics2DServer::body_get_state);
- ObjectTypeDB::bind_method(_MD("body_set_layer_mask","body","mask"),&Physics2DServer::body_set_layer_mask);
- ObjectTypeDB::bind_method(_MD("body_get_layer_mask","body"),&Physics2DServer::body_get_layer_mask);
+ ObjectTypeDB::bind_method(_MD("body_apply_impulse", "body", "pos", "impulse"), &Physics2DServer::body_apply_impulse);
+ ObjectTypeDB::bind_method(_MD("body_add_force", "body", "offset", "force"), &Physics2DServer::body_add_force);
+ ObjectTypeDB::bind_method(_MD("body_set_axis_velocity", "body", "axis_velocity"), &Physics2DServer::body_set_axis_velocity);
- ObjectTypeDB::bind_method(_MD("body_set_collision_mask","body","mask"),&Physics2DServer::body_set_collision_mask);
- ObjectTypeDB::bind_method(_MD("body_get_collision_mask","body"),&Physics2DServer::body_get_collision_mask);
+ ObjectTypeDB::bind_method(_MD("body_add_collision_exception", "body", "excepted_body"), &Physics2DServer::body_add_collision_exception);
+ ObjectTypeDB::bind_method(_MD("body_remove_collision_exception", "body", "excepted_body"), &Physics2DServer::body_remove_collision_exception);
+ // virtual void body_get_collision_exceptions(RID p_body, List<RID> *p_exceptions)=0;
+ ObjectTypeDB::bind_method(_MD("body_set_max_contacts_reported", "body", "amount"), &Physics2DServer::body_set_max_contacts_reported);
+ ObjectTypeDB::bind_method(_MD("body_get_max_contacts_reported", "body"), &Physics2DServer::body_get_max_contacts_reported);
- ObjectTypeDB::bind_method(_MD("body_set_param","body","param","value"),&Physics2DServer::body_set_param);
- ObjectTypeDB::bind_method(_MD("body_get_param","body","param"),&Physics2DServer::body_get_param);
+ ObjectTypeDB::bind_method(_MD("body_set_one_way_collision_direction", "body", "normal"), &Physics2DServer::body_set_one_way_collision_direction);
+ ObjectTypeDB::bind_method(_MD("body_get_one_way_collision_direction", "body"), &Physics2DServer::body_get_one_way_collision_direction);
- ObjectTypeDB::bind_method(_MD("body_set_state","body","state","value"),&Physics2DServer::body_set_state);
- ObjectTypeDB::bind_method(_MD("body_get_state","body","state"),&Physics2DServer::body_get_state);
+ ObjectTypeDB::bind_method(_MD("body_set_one_way_collision_max_depth", "body", "depth"), &Physics2DServer::body_set_one_way_collision_max_depth);
+ ObjectTypeDB::bind_method(_MD("body_get_one_way_collision_max_depth", "body"), &Physics2DServer::body_get_one_way_collision_max_depth);
- ObjectTypeDB::bind_method(_MD("body_apply_impulse","body","pos","impulse"),&Physics2DServer::body_apply_impulse);
- ObjectTypeDB::bind_method(_MD("body_add_force","body","offset","force"),&Physics2DServer::body_add_force);
- ObjectTypeDB::bind_method(_MD("body_set_axis_velocity","body","axis_velocity"),&Physics2DServer::body_set_axis_velocity);
+ ObjectTypeDB::bind_method(_MD("body_set_omit_force_integration", "body", "enable"), &Physics2DServer::body_set_omit_force_integration);
+ ObjectTypeDB::bind_method(_MD("body_is_omitting_force_integration", "body"), &Physics2DServer::body_is_omitting_force_integration);
- ObjectTypeDB::bind_method(_MD("body_add_collision_exception","body","excepted_body"),&Physics2DServer::body_add_collision_exception);
- ObjectTypeDB::bind_method(_MD("body_remove_collision_exception","body","excepted_body"),&Physics2DServer::body_remove_collision_exception);
-// virtual void body_get_collision_exceptions(RID p_body, List<RID> *p_exceptions)=0;
+ ObjectTypeDB::bind_method(_MD("body_set_force_integration_callback", "body", "receiver", "method", "userdata"), &Physics2DServer::body_set_force_integration_callback, DEFVAL(Variant()));
- ObjectTypeDB::bind_method(_MD("body_set_max_contacts_reported","body","amount"),&Physics2DServer::body_set_max_contacts_reported);
- ObjectTypeDB::bind_method(_MD("body_get_max_contacts_reported","body"),&Physics2DServer::body_get_max_contacts_reported);
-
- ObjectTypeDB::bind_method(_MD("body_set_one_way_collision_direction","body","normal"),&Physics2DServer::body_set_one_way_collision_direction);
- ObjectTypeDB::bind_method(_MD("body_get_one_way_collision_direction","body"),&Physics2DServer::body_get_one_way_collision_direction);
-
- ObjectTypeDB::bind_method(_MD("body_set_one_way_collision_max_depth","body","depth"),&Physics2DServer::body_set_one_way_collision_max_depth);
- ObjectTypeDB::bind_method(_MD("body_get_one_way_collision_max_depth","body"),&Physics2DServer::body_get_one_way_collision_max_depth);
-
-
- ObjectTypeDB::bind_method(_MD("body_set_omit_force_integration","body","enable"),&Physics2DServer::body_set_omit_force_integration);
- ObjectTypeDB::bind_method(_MD("body_is_omitting_force_integration","body"),&Physics2DServer::body_is_omitting_force_integration);
-
- ObjectTypeDB::bind_method(_MD("body_set_force_integration_callback","body","receiver","method","userdata"),&Physics2DServer::body_set_force_integration_callback,DEFVAL(Variant()));
-
- ObjectTypeDB::bind_method(_MD("body_test_motion","body","motion","margin","result:Physics2DTestMotionResult"),&Physics2DServer::_body_test_motion,DEFVAL(0.08),DEFVAL(Variant()));
- ObjectTypeDB::bind_method(_MD("body_test_motion_from","body","from","motion","margin","result:Physics2DTestMotionResult"),&Physics2DServer::_body_test_motion_from,DEFVAL(0.08),DEFVAL(Variant()));
+ ObjectTypeDB::bind_method(_MD("body_test_motion", "body", "motion", "margin", "result:Physics2DTestMotionResult"), &Physics2DServer::_body_test_motion, DEFVAL(0.08), DEFVAL(Variant()));
+ ObjectTypeDB::bind_method(_MD("body_test_motion_from", "body", "from", "motion", "margin", "result:Physics2DTestMotionResult"), &Physics2DServer::_body_test_motion_from, DEFVAL(0.08), DEFVAL(Variant()));
/* JOINT API */
- ObjectTypeDB::bind_method(_MD("joint_set_param","joint","param","value"),&Physics2DServer::joint_set_param);
- ObjectTypeDB::bind_method(_MD("joint_get_param","joint","param"),&Physics2DServer::joint_get_param);
+ ObjectTypeDB::bind_method(_MD("joint_set_param", "joint", "param", "value"), &Physics2DServer::joint_set_param);
+ ObjectTypeDB::bind_method(_MD("joint_get_param", "joint", "param"), &Physics2DServer::joint_get_param);
- ObjectTypeDB::bind_method(_MD("pin_joint_create","anchor","body_a","body_b"),&Physics2DServer::pin_joint_create,DEFVAL(RID()));
- ObjectTypeDB::bind_method(_MD("groove_joint_create","groove1_a","groove2_a","anchor_b","body_a","body_b"),&Physics2DServer::groove_joint_create,DEFVAL(RID()),DEFVAL(RID()));
- ObjectTypeDB::bind_method(_MD("damped_spring_joint_create","anchor_a","anchor_b","body_a","body_b"),&Physics2DServer::damped_spring_joint_create,DEFVAL(RID()));
+ ObjectTypeDB::bind_method(_MD("pin_joint_create", "anchor", "body_a", "body_b"), &Physics2DServer::pin_joint_create, DEFVAL(RID()));
+ ObjectTypeDB::bind_method(_MD("groove_joint_create", "groove1_a", "groove2_a", "anchor_b", "body_a", "body_b"), &Physics2DServer::groove_joint_create, DEFVAL(RID()), DEFVAL(RID()));
+ ObjectTypeDB::bind_method(_MD("damped_spring_joint_create", "anchor_a", "anchor_b", "body_a", "body_b"), &Physics2DServer::damped_spring_joint_create, DEFVAL(RID()));
- ObjectTypeDB::bind_method(_MD("damped_string_joint_set_param","joint","param","value"),&Physics2DServer::damped_string_joint_set_param);
- ObjectTypeDB::bind_method(_MD("damped_string_joint_get_param","joint","param"),&Physics2DServer::damped_string_joint_get_param);
+ ObjectTypeDB::bind_method(_MD("damped_string_joint_set_param", "joint", "param", "value"), &Physics2DServer::damped_string_joint_set_param);
+ ObjectTypeDB::bind_method(_MD("damped_string_joint_get_param", "joint", "param"), &Physics2DServer::damped_string_joint_get_param);
- ObjectTypeDB::bind_method(_MD("joint_get_type","joint"),&Physics2DServer::joint_get_type);
+ ObjectTypeDB::bind_method(_MD("joint_get_type", "joint"), &Physics2DServer::joint_get_type);
- ObjectTypeDB::bind_method(_MD("free_rid","rid"),&Physics2DServer::free);
+ ObjectTypeDB::bind_method(_MD("free_rid", "rid"), &Physics2DServer::free);
- ObjectTypeDB::bind_method(_MD("set_active","active"),&Physics2DServer::set_active);
+ ObjectTypeDB::bind_method(_MD("set_active", "active"), &Physics2DServer::set_active);
- ObjectTypeDB::bind_method(_MD("get_process_info","process_info"),&Physics2DServer::get_process_info);
+ ObjectTypeDB::bind_method(_MD("get_process_info", "process_info"), &Physics2DServer::get_process_info);
-// ObjectTypeDB::bind_method(_MD("init"),&Physics2DServer::init);
-// ObjectTypeDB::bind_method(_MD("step"),&Physics2DServer::step);
-// ObjectTypeDB::bind_method(_MD("sync"),&Physics2DServer::sync);
+ // ObjectTypeDB::bind_method(_MD("init"),&Physics2DServer::init);
+ // ObjectTypeDB::bind_method(_MD("step"),&Physics2DServer::step);
+ // ObjectTypeDB::bind_method(_MD("sync"),&Physics2DServer::sync);
//ObjectTypeDB::bind_method(_MD("flush_queries"),&Physics2DServer::flush_queries);
- BIND_CONSTANT( SPACE_PARAM_CONTACT_RECYCLE_RADIUS );
- BIND_CONSTANT( SPACE_PARAM_CONTACT_MAX_SEPARATION );
- BIND_CONSTANT( SPACE_PARAM_BODY_MAX_ALLOWED_PENETRATION );
- BIND_CONSTANT( SPACE_PARAM_BODY_LINEAR_VELOCITY_SLEEP_TRESHOLD );
- BIND_CONSTANT( SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_TRESHOLD );
- BIND_CONSTANT( SPACE_PARAM_BODY_TIME_TO_SLEEP );
- BIND_CONSTANT( SPACE_PARAM_CONSTRAINT_DEFAULT_BIAS );
-
- BIND_CONSTANT( SHAPE_LINE );
- BIND_CONSTANT( SHAPE_SEGMENT );
- BIND_CONSTANT( SHAPE_CIRCLE );
- BIND_CONSTANT( SHAPE_RECTANGLE );
- BIND_CONSTANT( SHAPE_CAPSULE );
- BIND_CONSTANT( SHAPE_CONVEX_POLYGON );
- BIND_CONSTANT( SHAPE_CONCAVE_POLYGON );
- BIND_CONSTANT( SHAPE_CUSTOM );
-
- BIND_CONSTANT( AREA_PARAM_GRAVITY );
- BIND_CONSTANT( AREA_PARAM_GRAVITY_VECTOR );
- BIND_CONSTANT( AREA_PARAM_GRAVITY_IS_POINT );
- BIND_CONSTANT( AREA_PARAM_GRAVITY_DISTANCE_SCALE );
- BIND_CONSTANT( AREA_PARAM_GRAVITY_POINT_ATTENUATION );
- BIND_CONSTANT( AREA_PARAM_LINEAR_DAMP);
- BIND_CONSTANT( AREA_PARAM_ANGULAR_DAMP);
- BIND_CONSTANT( AREA_PARAM_PRIORITY );
+ BIND_CONSTANT(SPACE_PARAM_CONTACT_RECYCLE_RADIUS);
+ BIND_CONSTANT(SPACE_PARAM_CONTACT_MAX_SEPARATION);
+ BIND_CONSTANT(SPACE_PARAM_BODY_MAX_ALLOWED_PENETRATION);
+ BIND_CONSTANT(SPACE_PARAM_BODY_LINEAR_VELOCITY_SLEEP_TRESHOLD);
+ BIND_CONSTANT(SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_TRESHOLD);
+ BIND_CONSTANT(SPACE_PARAM_BODY_TIME_TO_SLEEP);
+ BIND_CONSTANT(SPACE_PARAM_CONSTRAINT_DEFAULT_BIAS);
- BIND_CONSTANT( AREA_SPACE_OVERRIDE_DISABLED );
- BIND_CONSTANT( AREA_SPACE_OVERRIDE_COMBINE );
- BIND_CONSTANT( AREA_SPACE_OVERRIDE_COMBINE_REPLACE );
- BIND_CONSTANT( AREA_SPACE_OVERRIDE_REPLACE );
- BIND_CONSTANT( AREA_SPACE_OVERRIDE_REPLACE_COMBINE );
+ BIND_CONSTANT(SHAPE_LINE);
+ BIND_CONSTANT(SHAPE_SEGMENT);
+ BIND_CONSTANT(SHAPE_CIRCLE);
+ BIND_CONSTANT(SHAPE_RECTANGLE);
+ BIND_CONSTANT(SHAPE_CAPSULE);
+ BIND_CONSTANT(SHAPE_CONVEX_POLYGON);
+ BIND_CONSTANT(SHAPE_CONCAVE_POLYGON);
+ BIND_CONSTANT(SHAPE_CUSTOM);
- BIND_CONSTANT( BODY_MODE_STATIC );
- BIND_CONSTANT( BODY_MODE_KINEMATIC );
- BIND_CONSTANT( BODY_MODE_RIGID );
- BIND_CONSTANT( BODY_MODE_CHARACTER );
+ BIND_CONSTANT(AREA_PARAM_GRAVITY);
+ BIND_CONSTANT(AREA_PARAM_GRAVITY_VECTOR);
+ BIND_CONSTANT(AREA_PARAM_GRAVITY_IS_POINT);
+ BIND_CONSTANT(AREA_PARAM_GRAVITY_DISTANCE_SCALE);
+ BIND_CONSTANT(AREA_PARAM_GRAVITY_POINT_ATTENUATION);
+ BIND_CONSTANT(AREA_PARAM_LINEAR_DAMP);
+ BIND_CONSTANT(AREA_PARAM_ANGULAR_DAMP);
+ BIND_CONSTANT(AREA_PARAM_PRIORITY);
- BIND_CONSTANT( BODY_PARAM_BOUNCE );
- BIND_CONSTANT( BODY_PARAM_FRICTION );
- BIND_CONSTANT( BODY_PARAM_MASS );
- BIND_CONSTANT( BODY_PARAM_INERTIA );
- BIND_CONSTANT( BODY_PARAM_GRAVITY_SCALE );
- BIND_CONSTANT( BODY_PARAM_LINEAR_DAMP);
- BIND_CONSTANT( BODY_PARAM_ANGULAR_DAMP);
- BIND_CONSTANT( BODY_PARAM_MAX );
+ BIND_CONSTANT(AREA_SPACE_OVERRIDE_DISABLED);
+ BIND_CONSTANT(AREA_SPACE_OVERRIDE_COMBINE);
+ BIND_CONSTANT(AREA_SPACE_OVERRIDE_COMBINE_REPLACE);
+ BIND_CONSTANT(AREA_SPACE_OVERRIDE_REPLACE);
+ BIND_CONSTANT(AREA_SPACE_OVERRIDE_REPLACE_COMBINE);
- BIND_CONSTANT( BODY_STATE_TRANSFORM );
- BIND_CONSTANT( BODY_STATE_LINEAR_VELOCITY );
- BIND_CONSTANT( BODY_STATE_ANGULAR_VELOCITY );
- BIND_CONSTANT( BODY_STATE_SLEEPING );
- BIND_CONSTANT( BODY_STATE_CAN_SLEEP );
+ BIND_CONSTANT(BODY_MODE_STATIC);
+ BIND_CONSTANT(BODY_MODE_KINEMATIC);
+ BIND_CONSTANT(BODY_MODE_RIGID);
+ BIND_CONSTANT(BODY_MODE_CHARACTER);
- BIND_CONSTANT( JOINT_PIN );
- BIND_CONSTANT( JOINT_GROOVE );
- BIND_CONSTANT( JOINT_DAMPED_SPRING );
+ BIND_CONSTANT(BODY_PARAM_BOUNCE);
+ BIND_CONSTANT(BODY_PARAM_FRICTION);
+ BIND_CONSTANT(BODY_PARAM_MASS);
+ BIND_CONSTANT(BODY_PARAM_INERTIA);
+ BIND_CONSTANT(BODY_PARAM_GRAVITY_SCALE);
+ BIND_CONSTANT(BODY_PARAM_LINEAR_DAMP);
+ BIND_CONSTANT(BODY_PARAM_ANGULAR_DAMP);
+ BIND_CONSTANT(BODY_PARAM_MAX);
- BIND_CONSTANT( DAMPED_STRING_REST_LENGTH );
- BIND_CONSTANT( DAMPED_STRING_STIFFNESS );
- BIND_CONSTANT( DAMPED_STRING_DAMPING );
+ BIND_CONSTANT(BODY_STATE_TRANSFORM);
+ BIND_CONSTANT(BODY_STATE_LINEAR_VELOCITY);
+ BIND_CONSTANT(BODY_STATE_ANGULAR_VELOCITY);
+ BIND_CONSTANT(BODY_STATE_SLEEPING);
+ BIND_CONSTANT(BODY_STATE_CAN_SLEEP);
- BIND_CONSTANT( CCD_MODE_DISABLED );
- BIND_CONSTANT( CCD_MODE_CAST_RAY );
- BIND_CONSTANT( CCD_MODE_CAST_SHAPE );
+ BIND_CONSTANT(JOINT_PIN);
+ BIND_CONSTANT(JOINT_GROOVE);
+ BIND_CONSTANT(JOINT_DAMPED_SPRING);
-// BIND_CONSTANT( TYPE_BODY );
-// BIND_CONSTANT( TYPE_AREA );
+ BIND_CONSTANT(DAMPED_STRING_REST_LENGTH);
+ BIND_CONSTANT(DAMPED_STRING_STIFFNESS);
+ BIND_CONSTANT(DAMPED_STRING_DAMPING);
- BIND_CONSTANT( AREA_BODY_ADDED );
- BIND_CONSTANT( AREA_BODY_REMOVED );
+ BIND_CONSTANT(CCD_MODE_DISABLED);
+ BIND_CONSTANT(CCD_MODE_CAST_RAY);
+ BIND_CONSTANT(CCD_MODE_CAST_SHAPE);
- BIND_CONSTANT( INFO_ACTIVE_OBJECTS );
- BIND_CONSTANT( INFO_COLLISION_PAIRS );
- BIND_CONSTANT( INFO_ISLAND_COUNT );
+ // BIND_CONSTANT( TYPE_BODY );
+ // BIND_CONSTANT( TYPE_AREA );
+ BIND_CONSTANT(AREA_BODY_ADDED);
+ BIND_CONSTANT(AREA_BODY_REMOVED);
+ BIND_CONSTANT(INFO_ACTIVE_OBJECTS);
+ BIND_CONSTANT(INFO_COLLISION_PAIRS);
+ BIND_CONSTANT(INFO_ISLAND_COUNT);
}
-
Physics2DServer::Physics2DServer() {
//ERR_FAIL_COND( singleton!=NULL );
- singleton=this;
+ singleton = this;
}
Physics2DServer::~Physics2DServer() {
- singleton=NULL;
+ singleton = NULL;
}
-
diff --git a/servers/physics_2d_server.h b/servers/physics_2d_server.h
index cd65c01b0..a1406d171 100644
--- a/servers/physics_2d_server.h
+++ b/servers/physics_2d_server.h
@@ -37,61 +37,60 @@ class Physics2DDirectSpaceState;
class Physics2DDirectBodyState : public Object {
- OBJ_TYPE( Physics2DDirectBodyState, Object );
+ OBJ_TYPE(Physics2DDirectBodyState, Object);
+
protected:
static void _bind_methods();
-public:
- virtual Vector2 get_total_gravity() const=0; // get gravity vector working on this body space/area
- virtual float get_total_linear_damp() const=0; // get density of this body space/area
- virtual float get_total_angular_damp() const=0; // get density of this body space/area
+public:
+ virtual Vector2 get_total_gravity() const = 0; // get gravity vector working on this body space/area
+ virtual float get_total_linear_damp() const = 0; // get density of this body space/area
+ virtual float get_total_angular_damp() const = 0; // get density of this body space/area
- virtual float get_inverse_mass() const=0; // get the mass
- virtual real_t get_inverse_inertia() const=0; // get density of this body space
+ virtual float get_inverse_mass() const = 0; // get the mass
+ virtual real_t get_inverse_inertia() const = 0; // get density of this body space
- virtual void set_linear_velocity(const Vector2& p_velocity)=0;
- virtual Vector2 get_linear_velocity() const=0;
+ virtual void set_linear_velocity(const Vector2 &p_velocity) = 0;
+ virtual Vector2 get_linear_velocity() const = 0;
- virtual void set_angular_velocity(real_t p_velocity)=0;
- virtual real_t get_angular_velocity() const=0;
+ virtual void set_angular_velocity(real_t p_velocity) = 0;
+ virtual real_t get_angular_velocity() const = 0;
- virtual void set_transform(const Matrix32& p_transform)=0;
- virtual Matrix32 get_transform() const=0;
+ virtual void set_transform(const Matrix32 &p_transform) = 0;
+ virtual Matrix32 get_transform() const = 0;
- virtual void set_sleep_state(bool p_enable)=0;
- virtual bool is_sleeping() const=0;
+ virtual void set_sleep_state(bool p_enable) = 0;
+ virtual bool is_sleeping() const = 0;
- virtual int get_contact_count() const=0;
+ virtual int get_contact_count() const = 0;
- virtual Vector2 get_contact_local_pos(int p_contact_idx) const=0;
- virtual Vector2 get_contact_local_normal(int p_contact_idx) const=0;
- virtual int get_contact_local_shape(int p_contact_idx) const=0;
+ virtual Vector2 get_contact_local_pos(int p_contact_idx) const = 0;
+ virtual Vector2 get_contact_local_normal(int p_contact_idx) const = 0;
+ virtual int get_contact_local_shape(int p_contact_idx) const = 0;
- virtual RID get_contact_collider(int p_contact_idx) const=0;
- virtual Vector2 get_contact_collider_pos(int p_contact_idx) const=0;
- virtual ObjectID get_contact_collider_id(int p_contact_idx) const=0;
- virtual Object* get_contact_collider_object(int p_contact_idx) const;
- virtual int get_contact_collider_shape(int p_contact_idx) const=0;
- virtual Variant get_contact_collider_shape_metadata(int p_contact_idx) const=0;
- virtual Vector2 get_contact_collider_velocity_at_pos(int p_contact_idx) const=0;
+ virtual RID get_contact_collider(int p_contact_idx) const = 0;
+ virtual Vector2 get_contact_collider_pos(int p_contact_idx) const = 0;
+ virtual ObjectID get_contact_collider_id(int p_contact_idx) const = 0;
+ virtual Object *get_contact_collider_object(int p_contact_idx) const;
+ virtual int get_contact_collider_shape(int p_contact_idx) const = 0;
+ virtual Variant get_contact_collider_shape_metadata(int p_contact_idx) const = 0;
+ virtual Vector2 get_contact_collider_velocity_at_pos(int p_contact_idx) const = 0;
- virtual real_t get_step() const=0;
+ virtual real_t get_step() const = 0;
virtual void integrate_forces();
- virtual Physics2DDirectSpaceState* get_space_state()=0;
+ virtual Physics2DDirectSpaceState *get_space_state() = 0;
Physics2DDirectBodyState();
};
-
class Physics2DShapeQueryResult;
-
//used for script
class Physics2DShapeQueryParameters : public Reference {
OBJ_TYPE(Physics2DShapeQueryParameters, Reference);
-friend class Physics2DDirectSpaceState;
+ friend class Physics2DDirectSpaceState;
RID shape;
Matrix32 transform;
Vector2 motion;
@@ -99,19 +98,19 @@ friend class Physics2DDirectSpaceState;
Set<RID> exclude;
uint32_t layer_mask;
uint32_t object_type_mask;
+
protected:
static void _bind_methods();
-public:
-
- void set_shape(const RES& p_shape);
- void set_shape_rid(const RID& p_shape);
+public:
+ void set_shape(const RES &p_shape);
+ void set_shape_rid(const RID &p_shape);
RID get_shape_rid() const;
- void set_transform(const Matrix32& p_transform);
+ void set_transform(const Matrix32 &p_transform);
Matrix32 get_transform() const;
- void set_motion(const Vector2& p_motion);
+ void set_motion(const Vector2 &p_motion);
Vector2 get_motion() const;
void set_margin(float p_margin);
@@ -123,38 +122,35 @@ public:
void set_object_type_mask(int p_object_type_mask);
int get_object_type_mask() const;
- void set_exclude(const Vector<RID>& p_exclude);
+ void set_exclude(const Vector<RID> &p_exclude);
Vector<RID> get_exclude() const;
Physics2DShapeQueryParameters();
-
};
-
class Physics2DDirectSpaceState : public Object {
- OBJ_TYPE( Physics2DDirectSpaceState, Object );
+ OBJ_TYPE(Physics2DDirectSpaceState, Object);
- Dictionary _intersect_ray(const Vector2& p_from, const Vector2& p_to,const Vector<RID>& p_exclude=Vector<RID>(),uint32_t p_layers=0,uint32_t p_object_type_mask=TYPE_MASK_COLLISION);
+ Dictionary _intersect_ray(const Vector2 &p_from, const Vector2 &p_to, const Vector<RID> &p_exclude = Vector<RID>(), uint32_t p_layers = 0, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
- Array _intersect_point(const Vector2& p_point,int p_max_results=32,const Vector<RID>& p_exclude=Vector<RID>(),uint32_t p_layers=0,uint32_t p_object_type_mask=TYPE_MASK_COLLISION);
- Array _intersect_shape(const Ref<Physics2DShapeQueryParameters> &p_shape_query,int p_max_results=32);
+ Array _intersect_point(const Vector2 &p_point, int p_max_results = 32, const Vector<RID> &p_exclude = Vector<RID>(), uint32_t p_layers = 0, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
+ Array _intersect_shape(const Ref<Physics2DShapeQueryParameters> &p_shape_query, int p_max_results = 32);
Array _cast_motion(const Ref<Physics2DShapeQueryParameters> &p_shape_query);
- Array _collide_shape(const Ref<Physics2DShapeQueryParameters> &p_shape_query,int p_max_results=32);
+ Array _collide_shape(const Ref<Physics2DShapeQueryParameters> &p_shape_query, int p_max_results = 32);
Dictionary _get_rest_info(const Ref<Physics2DShapeQueryParameters> &p_shape_query);
protected:
static void _bind_methods();
public:
-
enum ObjectTypeMask {
- TYPE_MASK_STATIC_BODY=1<<0,
- TYPE_MASK_KINEMATIC_BODY=1<<1,
- TYPE_MASK_RIGID_BODY=1<<2,
- TYPE_MASK_CHARACTER_BODY=1<<3,
- TYPE_MASK_AREA=1<<4,
- TYPE_MASK_COLLISION=TYPE_MASK_STATIC_BODY|TYPE_MASK_CHARACTER_BODY|TYPE_MASK_KINEMATIC_BODY|TYPE_MASK_RIGID_BODY
+ TYPE_MASK_STATIC_BODY = 1 << 0,
+ TYPE_MASK_KINEMATIC_BODY = 1 << 1,
+ TYPE_MASK_RIGID_BODY = 1 << 2,
+ TYPE_MASK_CHARACTER_BODY = 1 << 3,
+ TYPE_MASK_AREA = 1 << 4,
+ TYPE_MASK_COLLISION = TYPE_MASK_STATIC_BODY | TYPE_MASK_CHARACTER_BODY | TYPE_MASK_KINEMATIC_BODY | TYPE_MASK_RIGID_BODY
};
@@ -169,7 +165,7 @@ public:
Variant metadata;
};
- virtual bool intersect_ray(const Vector2& p_from, const Vector2& p_to,RayResult &r_result,const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION)=0;
+ virtual bool intersect_ray(const Vector2 &p_from, const Vector2 &p_to, RayResult &r_result, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION) = 0;
struct ShapeResult {
@@ -178,17 +174,15 @@ public:
Object *collider;
int shape;
Variant metadata;
-
-
};
- virtual int intersect_point(const Vector2& p_point,ShapeResult *r_results,int p_result_max,const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION,bool p_pick_point=false)=0;
+ virtual int intersect_point(const Vector2 &p_point, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION, bool p_pick_point = false) = 0;
- virtual int intersect_shape(const RID& p_shape, const Matrix32& p_xform,const Vector2& p_motion,float p_margin,ShapeResult *r_results,int p_result_max,const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION)=0;
+ virtual int intersect_shape(const RID &p_shape, const Matrix32 &p_xform, const Vector2 &p_motion, float p_margin, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION) = 0;
- virtual bool cast_motion(const RID& p_shape, const Matrix32& p_xform,const Vector2& p_motion,float p_margin,float &p_closest_safe,float &p_closest_unsafe, const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION)=0;
+ virtual bool cast_motion(const RID &p_shape, const Matrix32 &p_xform, const Vector2 &p_motion, float p_margin, float &p_closest_safe, float &p_closest_unsafe, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION) = 0;
- virtual bool collide_shape(RID p_shape, const Matrix32& p_shape_xform,const Vector2& p_motion,float p_margin,Vector2 *r_results,int p_result_max,int &r_result_count, const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION)=0;
+ virtual bool collide_shape(RID p_shape, const Matrix32 &p_shape_xform, const Vector2 &p_motion, float p_margin, Vector2 *r_results, int p_result_max, int &r_result_count, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION) = 0;
struct ShapeRestInfo {
@@ -199,32 +193,29 @@ public:
int shape;
Vector2 linear_velocity; //velocity at contact point
Variant metadata;
-
};
- virtual bool rest_info(RID p_shape, const Matrix32& p_shape_xform,const Vector2& p_motion,float p_margin,ShapeRestInfo *r_info, const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION)=0;
-
+ virtual bool rest_info(RID p_shape, const Matrix32 &p_shape_xform, const Vector2 &p_motion, float p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION) = 0;
Physics2DDirectSpaceState();
};
-
class Physics2DShapeQueryResult : public Reference {
- OBJ_TYPE( Physics2DShapeQueryResult, Reference );
+ OBJ_TYPE(Physics2DShapeQueryResult, Reference);
Vector<Physics2DDirectSpaceState::ShapeResult> result;
-friend class Physics2DDirectSpaceState;
+ friend class Physics2DDirectSpaceState;
protected:
static void _bind_methods();
-public:
+public:
int get_result_count() const;
RID get_result_rid(int p_idx) const;
ObjectID get_result_object_id(int p_idx) const;
- Object* get_result_object(int p_idx) const;
+ Object *get_result_object(int p_idx) const;
int get_result_object_shape(int p_idx) const;
Physics2DShapeQueryResult();
@@ -234,19 +225,18 @@ class Physics2DTestMotionResult;
class Physics2DServer : public Object {
- OBJ_TYPE( Physics2DServer, Object );
+ OBJ_TYPE(Physics2DServer, Object);
- static Physics2DServer * singleton;
+ static Physics2DServer *singleton;
- virtual bool _body_test_motion(RID p_body, const Vector2& p_motion, float p_margin=0.08, const Ref<Physics2DTestMotionResult>& p_result=Ref<Physics2DTestMotionResult>());
- virtual bool _body_test_motion_from(RID p_body, const Matrix32 &p_from, const Vector2& p_motion, float p_margin=0.08, const Ref<Physics2DTestMotionResult>& p_result=Ref<Physics2DTestMotionResult>());
+ virtual bool _body_test_motion(RID p_body, const Vector2 &p_motion, float p_margin = 0.08, const Ref<Physics2DTestMotionResult> &p_result = Ref<Physics2DTestMotionResult>());
+ virtual bool _body_test_motion_from(RID p_body, const Matrix32 &p_from, const Vector2 &p_motion, float p_margin = 0.08, const Ref<Physics2DTestMotionResult> &p_result = Ref<Physics2DTestMotionResult>());
protected:
static void _bind_methods();
public:
-
- static Physics2DServer * get_singleton();
+ static Physics2DServer *get_singleton();
enum ShapeType {
SHAPE_LINE, ///< plane:"plane"
@@ -260,22 +250,22 @@ public:
SHAPE_CUSTOM, ///< Server-Implementation based custom shape, calling shape_create() with this value will result in an error
};
- virtual RID shape_create(ShapeType p_shape)=0;
- virtual void shape_set_data(RID p_shape, const Variant& p_data)=0;
- virtual void shape_set_custom_solver_bias(RID p_shape, real_t p_bias)=0;
+ virtual RID shape_create(ShapeType p_shape) = 0;
+ virtual void shape_set_data(RID p_shape, const Variant &p_data) = 0;
+ virtual void shape_set_custom_solver_bias(RID p_shape, real_t p_bias) = 0;
- virtual ShapeType shape_get_type(RID p_shape) const=0;
- virtual Variant shape_get_data(RID p_shape) const=0;
- virtual real_t shape_get_custom_solver_bias(RID p_shape) const=0;
+ virtual ShapeType shape_get_type(RID p_shape) const = 0;
+ virtual Variant shape_get_data(RID p_shape) const = 0;
+ virtual real_t shape_get_custom_solver_bias(RID p_shape) const = 0;
//these work well, but should be used from the main thread only
- virtual bool shape_collide(RID p_shape_A, const Matrix32& p_xform_A,const Vector2& p_motion_A,RID p_shape_B, const Matrix32& p_xform_B, const Vector2& p_motion_B,Vector2 *r_results,int p_result_max,int &r_result_count)=0;
+ virtual bool shape_collide(RID p_shape_A, const Matrix32 &p_xform_A, const Vector2 &p_motion_A, RID p_shape_B, const Matrix32 &p_xform_B, const Vector2 &p_motion_B, Vector2 *r_results, int p_result_max, int &r_result_count) = 0;
/* SPACE API */
- virtual RID space_create()=0;
- virtual void space_set_active(RID p_space,bool p_active)=0;
- virtual bool space_is_active(RID p_space) const=0;
+ virtual RID space_create() = 0;
+ virtual void space_set_active(RID p_space, bool p_active) = 0;
+ virtual bool space_is_active(RID p_space) const = 0;
enum SpaceParameter {
@@ -288,15 +278,15 @@ public:
SPACE_PARAM_CONSTRAINT_DEFAULT_BIAS,
};
- virtual void space_set_param(RID p_space,SpaceParameter p_param, real_t p_value)=0;
- virtual real_t space_get_param(RID p_space,SpaceParameter p_param) const=0;
+ virtual void space_set_param(RID p_space, SpaceParameter p_param, real_t p_value) = 0;
+ virtual real_t space_get_param(RID p_space, SpaceParameter p_param) const = 0;
// this function only works on fixed process, errors and returns null otherwise
- virtual Physics2DDirectSpaceState* space_get_direct_state(RID p_space)=0;
+ virtual Physics2DDirectSpaceState *space_get_direct_state(RID p_space) = 0;
- virtual void space_set_debug_contacts(RID p_space,int p_max_contacts)=0;
- virtual Vector<Vector2> space_get_contacts(RID p_space) const=0;
- virtual int space_get_contact_count(RID p_space) const=0;
+ virtual void space_set_debug_contacts(RID p_space, int p_max_contacts) = 0;
+ virtual Vector<Vector2> space_get_contacts(RID p_space) const = 0;
+ virtual int space_get_contact_count(RID p_space) const = 0;
//missing space parameters
@@ -304,8 +294,6 @@ public:
//missing attenuation? missing better override?
-
-
enum AreaParameter {
AREA_PARAM_GRAVITY,
AREA_PARAM_GRAVITY_VECTOR,
@@ -317,11 +305,10 @@ public:
AREA_PARAM_PRIORITY
};
- virtual RID area_create()=0;
-
- virtual void area_set_space(RID p_area, RID p_space)=0;
- virtual RID area_get_space(RID p_area) const=0;
+ virtual RID area_create() = 0;
+ virtual void area_set_space(RID p_area, RID p_space) = 0;
+ virtual RID area_get_space(RID p_area) const = 0;
enum AreaSpaceOverrideMode {
AREA_SPACE_OVERRIDE_DISABLED,
@@ -331,37 +318,37 @@ public:
AREA_SPACE_OVERRIDE_REPLACE_COMBINE // Discards all previous calculations, then keeps combining
};
- virtual void area_set_space_override_mode(RID p_area, AreaSpaceOverrideMode p_mode)=0;
- virtual AreaSpaceOverrideMode area_get_space_override_mode(RID p_area) const=0;
+ virtual void area_set_space_override_mode(RID p_area, AreaSpaceOverrideMode p_mode) = 0;
+ virtual AreaSpaceOverrideMode area_get_space_override_mode(RID p_area) const = 0;
- virtual void area_add_shape(RID p_area, RID p_shape, const Matrix32& p_transform=Matrix32())=0;
- virtual void area_set_shape(RID p_area, int p_shape_idx,RID p_shape)=0;
- virtual void area_set_shape_transform(RID p_area, int p_shape_idx, const Matrix32& p_transform)=0;
+ virtual void area_add_shape(RID p_area, RID p_shape, const Matrix32 &p_transform = Matrix32()) = 0;
+ virtual void area_set_shape(RID p_area, int p_shape_idx, RID p_shape) = 0;
+ virtual void area_set_shape_transform(RID p_area, int p_shape_idx, const Matrix32 &p_transform) = 0;
- virtual int area_get_shape_count(RID p_area) const=0;
- virtual RID area_get_shape(RID p_area, int p_shape_idx) const=0;
- virtual Matrix32 area_get_shape_transform(RID p_area, int p_shape_idx) const=0;
+ virtual int area_get_shape_count(RID p_area) const = 0;
+ virtual RID area_get_shape(RID p_area, int p_shape_idx) const = 0;
+ virtual Matrix32 area_get_shape_transform(RID p_area, int p_shape_idx) const = 0;
- virtual void area_remove_shape(RID p_area, int p_shape_idx)=0;
- virtual void area_clear_shapes(RID p_area)=0;
+ virtual void area_remove_shape(RID p_area, int p_shape_idx) = 0;
+ virtual void area_clear_shapes(RID p_area) = 0;
- virtual void area_attach_object_instance_ID(RID p_area,ObjectID p_ID)=0;
- virtual ObjectID area_get_object_instance_ID(RID p_area) const=0;
+ virtual void area_attach_object_instance_ID(RID p_area, ObjectID p_ID) = 0;
+ virtual ObjectID area_get_object_instance_ID(RID p_area) const = 0;
- virtual void area_set_param(RID p_area,AreaParameter p_param,const Variant& p_value)=0;
- virtual void area_set_transform(RID p_area, const Matrix32& p_transform)=0;
+ virtual void area_set_param(RID p_area, AreaParameter p_param, const Variant &p_value) = 0;
+ virtual void area_set_transform(RID p_area, const Matrix32 &p_transform) = 0;
- virtual Variant area_get_param(RID p_parea,AreaParameter p_param) const=0;
- virtual Matrix32 area_get_transform(RID p_area) const=0;
+ virtual Variant area_get_param(RID p_parea, AreaParameter p_param) const = 0;
+ virtual Matrix32 area_get_transform(RID p_area) const = 0;
- virtual void area_set_collision_mask(RID p_area,uint32_t p_mask)=0;
- virtual void area_set_layer_mask(RID p_area,uint32_t p_mask)=0;
+ virtual void area_set_collision_mask(RID p_area, uint32_t p_mask) = 0;
+ virtual void area_set_layer_mask(RID p_area, uint32_t p_mask) = 0;
- virtual void area_set_monitorable(RID p_area,bool p_monitorable)=0;
- virtual void area_set_pickable(RID p_area,bool p_pickable)=0;
+ virtual void area_set_monitorable(RID p_area, bool p_monitorable) = 0;
+ virtual void area_set_pickable(RID p_area, bool p_pickable) = 0;
- virtual void area_set_monitor_callback(RID p_area,Object *p_receiver,const StringName& p_method)=0;
- virtual void area_set_area_monitor_callback(RID p_area,Object *p_receiver,const StringName& p_method)=0;
+ virtual void area_set_monitor_callback(RID p_area, Object *p_receiver, const StringName &p_method) = 0;
+ virtual void area_set_area_monitor_callback(RID p_area, Object *p_receiver, const StringName &p_method) = 0;
/* BODY API */
@@ -375,32 +362,32 @@ public:
//BODY_MODE_SOFT ??
};
- virtual RID body_create(BodyMode p_mode=BODY_MODE_RIGID,bool p_init_sleeping=false)=0;
+ virtual RID body_create(BodyMode p_mode = BODY_MODE_RIGID, bool p_init_sleeping = false) = 0;
- virtual void body_set_space(RID p_body, RID p_space)=0;
- virtual RID body_get_space(RID p_body) const=0;
+ virtual void body_set_space(RID p_body, RID p_space) = 0;
+ virtual RID body_get_space(RID p_body) const = 0;
- virtual void body_set_mode(RID p_body, BodyMode p_mode)=0;
- virtual BodyMode body_get_mode(RID p_body) const=0;
+ virtual void body_set_mode(RID p_body, BodyMode p_mode) = 0;
+ virtual BodyMode body_get_mode(RID p_body) const = 0;
- virtual void body_add_shape(RID p_body, RID p_shape, const Matrix32& p_transform=Matrix32())=0;
- virtual void body_set_shape(RID p_body, int p_shape_idx,RID p_shape)=0;
- virtual void body_set_shape_transform(RID p_body, int p_shape_idx, const Matrix32& p_transform)=0;
- virtual void body_set_shape_metadata(RID p_body, int p_shape_idx, const Variant& p_metadata)=0;
+ virtual void body_add_shape(RID p_body, RID p_shape, const Matrix32 &p_transform = Matrix32()) = 0;
+ virtual void body_set_shape(RID p_body, int p_shape_idx, RID p_shape) = 0;
+ virtual void body_set_shape_transform(RID p_body, int p_shape_idx, const Matrix32 &p_transform) = 0;
+ virtual void body_set_shape_metadata(RID p_body, int p_shape_idx, const Variant &p_metadata) = 0;
- virtual int body_get_shape_count(RID p_body) const=0;
- virtual RID body_get_shape(RID p_body, int p_shape_idx) const=0;
- virtual Matrix32 body_get_shape_transform(RID p_body, int p_shape_idx) const=0;
- virtual Variant body_get_shape_metadata(RID p_body, int p_shape_idx) const=0;
+ virtual int body_get_shape_count(RID p_body) const = 0;
+ virtual RID body_get_shape(RID p_body, int p_shape_idx) const = 0;
+ virtual Matrix32 body_get_shape_transform(RID p_body, int p_shape_idx) const = 0;
+ virtual Variant body_get_shape_metadata(RID p_body, int p_shape_idx) const = 0;
- virtual void body_set_shape_as_trigger(RID p_body, int p_shape_idx,bool p_enable)=0;
- virtual bool body_is_shape_set_as_trigger(RID p_body, int p_shape_idx) const=0;
+ virtual void body_set_shape_as_trigger(RID p_body, int p_shape_idx, bool p_enable) = 0;
+ virtual bool body_is_shape_set_as_trigger(RID p_body, int p_shape_idx) const = 0;
- virtual void body_remove_shape(RID p_body, int p_shape_idx)=0;
- virtual void body_clear_shapes(RID p_body)=0;
+ virtual void body_remove_shape(RID p_body, int p_shape_idx) = 0;
+ virtual void body_clear_shapes(RID p_body) = 0;
- virtual void body_attach_object_instance_ID(RID p_body,uint32_t p_ID)=0;
- virtual uint32_t body_get_object_instance_ID(RID p_body) const=0;
+ virtual void body_attach_object_instance_ID(RID p_body, uint32_t p_ID) = 0;
+ virtual uint32_t body_get_object_instance_ID(RID p_body) const = 0;
enum CCDMode {
CCD_MODE_DISABLED,
@@ -408,30 +395,29 @@ public:
CCD_MODE_CAST_SHAPE,
};
- virtual void body_set_continuous_collision_detection_mode(RID p_body,CCDMode p_mode)=0;
- virtual CCDMode body_get_continuous_collision_detection_mode(RID p_body) const=0;
+ virtual void body_set_continuous_collision_detection_mode(RID p_body, CCDMode p_mode) = 0;
+ virtual CCDMode body_get_continuous_collision_detection_mode(RID p_body) const = 0;
- virtual void body_set_layer_mask(RID p_body, uint32_t p_mask)=0;
- virtual uint32_t body_get_layer_mask(RID p_body) const=0;
+ virtual void body_set_layer_mask(RID p_body, uint32_t p_mask) = 0;
+ virtual uint32_t body_get_layer_mask(RID p_body) const = 0;
- virtual void body_set_collision_mask(RID p_body, uint32_t p_mask)=0;
- virtual uint32_t body_get_collision_mask(RID p_body) const=0;
+ virtual void body_set_collision_mask(RID p_body, uint32_t p_mask) = 0;
+ virtual uint32_t body_get_collision_mask(RID p_body) const = 0;
// common body variables
enum BodyParameter {
BODY_PARAM_BOUNCE,
BODY_PARAM_FRICTION,
BODY_PARAM_MASS, ///< unused for static, always infinite
- BODY_PARAM_INERTIA, // read-only: computed from mass & shapes
+ BODY_PARAM_INERTIA, // read-only: computed from mass & shapes
BODY_PARAM_GRAVITY_SCALE,
BODY_PARAM_LINEAR_DAMP,
BODY_PARAM_ANGULAR_DAMP,
BODY_PARAM_MAX,
};
- virtual void body_set_param(RID p_body, BodyParameter p_param, float p_value)=0;
- virtual float body_get_param(RID p_body, BodyParameter p_param) const=0;
-
+ virtual void body_set_param(RID p_body, BodyParameter p_param, float p_value) = 0;
+ virtual float body_get_param(RID p_body, BodyParameter p_param) const = 0;
//state
enum BodyState {
@@ -442,47 +428,47 @@ public:
BODY_STATE_CAN_SLEEP,
};
- virtual void body_set_state(RID p_body, BodyState p_state, const Variant& p_variant)=0;
- virtual Variant body_get_state(RID p_body, BodyState p_state) const=0;
+ virtual void body_set_state(RID p_body, BodyState p_state, const Variant &p_variant) = 0;
+ virtual Variant body_get_state(RID p_body, BodyState p_state) const = 0;
//do something about it
- virtual void body_set_applied_force(RID p_body, const Vector2& p_force)=0;
- virtual Vector2 body_get_applied_force(RID p_body) const=0;
+ virtual void body_set_applied_force(RID p_body, const Vector2 &p_force) = 0;
+ virtual Vector2 body_get_applied_force(RID p_body) const = 0;
- virtual void body_set_applied_torque(RID p_body, float p_torque)=0;
- virtual float body_get_applied_torque(RID p_body) const=0;
+ virtual void body_set_applied_torque(RID p_body, float p_torque) = 0;
+ virtual float body_get_applied_torque(RID p_body) const = 0;
- virtual void body_add_force(RID p_body, const Vector2& p_offset, const Vector2& p_force)=0;
+ virtual void body_add_force(RID p_body, const Vector2 &p_offset, const Vector2 &p_force) = 0;
- virtual void body_apply_impulse(RID p_body, const Vector2& p_offset, const Vector2& p_impulse)=0;
- virtual void body_set_axis_velocity(RID p_body, const Vector2& p_axis_velocity)=0;
+ virtual void body_apply_impulse(RID p_body, const Vector2 &p_offset, const Vector2 &p_impulse) = 0;
+ virtual void body_set_axis_velocity(RID p_body, const Vector2 &p_axis_velocity) = 0;
//fix
- virtual void body_add_collision_exception(RID p_body, RID p_body_b)=0;
- virtual void body_remove_collision_exception(RID p_body, RID p_body_b)=0;
- virtual void body_get_collision_exceptions(RID p_body, List<RID> *p_exceptions)=0;
+ virtual void body_add_collision_exception(RID p_body, RID p_body_b) = 0;
+ virtual void body_remove_collision_exception(RID p_body, RID p_body_b) = 0;
+ virtual void body_get_collision_exceptions(RID p_body, List<RID> *p_exceptions) = 0;
- virtual void body_set_max_contacts_reported(RID p_body, int p_contacts)=0;
- virtual int body_get_max_contacts_reported(RID p_body) const=0;
+ virtual void body_set_max_contacts_reported(RID p_body, int p_contacts) = 0;
+ virtual int body_get_max_contacts_reported(RID p_body) const = 0;
- virtual void body_set_one_way_collision_direction(RID p_body,const Vector2& p_direction)=0;
- virtual Vector2 body_get_one_way_collision_direction(RID p_body) const=0;
+ virtual void body_set_one_way_collision_direction(RID p_body, const Vector2 &p_direction) = 0;
+ virtual Vector2 body_get_one_way_collision_direction(RID p_body) const = 0;
- virtual void body_set_one_way_collision_max_depth(RID p_body,float p_max_depth)=0;
- virtual float body_get_one_way_collision_max_depth(RID p_body) const=0;
+ virtual void body_set_one_way_collision_max_depth(RID p_body, float p_max_depth) = 0;
+ virtual float body_get_one_way_collision_max_depth(RID p_body) const = 0;
//missing remove
- virtual void body_set_contacts_reported_depth_treshold(RID p_body, float p_treshold)=0;
- virtual float body_get_contacts_reported_depth_treshold(RID p_body) const=0;
+ virtual void body_set_contacts_reported_depth_treshold(RID p_body, float p_treshold) = 0;
+ virtual float body_get_contacts_reported_depth_treshold(RID p_body) const = 0;
- virtual void body_set_omit_force_integration(RID p_body,bool p_omit)=0;
- virtual bool body_is_omitting_force_integration(RID p_body) const=0;
+ virtual void body_set_omit_force_integration(RID p_body, bool p_omit) = 0;
+ virtual bool body_is_omitting_force_integration(RID p_body) const = 0;
- virtual void body_set_force_integration_callback(RID p_body,Object *p_receiver,const StringName& p_method,const Variant& p_udata=Variant())=0;
+ virtual void body_set_force_integration_callback(RID p_body, Object *p_receiver, const StringName &p_method, const Variant &p_udata = Variant()) = 0;
- virtual bool body_collide_shape(RID p_body, int p_body_shape,RID p_shape, const Matrix32& p_shape_xform,const Vector2& p_motion,Vector2 *r_results,int p_result_max,int &r_result_count)=0;
+ virtual bool body_collide_shape(RID p_body, int p_body_shape, RID p_shape, const Matrix32 &p_shape_xform, const Vector2 &p_motion, Vector2 *r_results, int p_result_max, int &r_result_count) = 0;
- virtual void body_set_pickable(RID p_body,bool p_pickable)=0;
+ virtual void body_set_pickable(RID p_body, bool p_pickable) = 0;
struct MotionResult {
@@ -498,8 +484,8 @@ public:
Variant collider_metadata;
};
- virtual bool body_test_motion(RID p_body,const Vector2& p_motion,float p_margin=0.001,MotionResult *r_result=NULL)=0;
- virtual bool body_test_motion_from(RID p_body,const Matrix32& p_from,const Vector2& p_motion,float p_margin=0.001,MotionResult *r_result=NULL)=0;
+ virtual bool body_test_motion(RID p_body, const Vector2 &p_motion, float p_margin = 0.001, MotionResult *r_result = NULL) = 0;
+ virtual bool body_test_motion_from(RID p_body, const Matrix32 &p_from, const Vector2 &p_motion, float p_margin = 0.001, MotionResult *r_result = NULL) = 0;
/* JOINT API */
@@ -516,29 +502,29 @@ public:
JOINT_PARAM_MAX_FORCE,
};
- virtual void joint_set_param(RID p_joint, JointParam p_param, real_t p_value)=0;
- virtual real_t joint_get_param(RID p_joint,JointParam p_param) const=0;
+ virtual void joint_set_param(RID p_joint, JointParam p_param, real_t p_value) = 0;
+ virtual real_t joint_get_param(RID p_joint, JointParam p_param) const = 0;
- virtual RID pin_joint_create(const Vector2& p_anchor,RID p_body_a,RID p_body_b=RID())=0;
- virtual RID groove_joint_create(const Vector2& p_a_groove1,const Vector2& p_a_groove2, const Vector2& p_b_anchor, RID p_body_a,RID p_body_b)=0;
- virtual RID damped_spring_joint_create(const Vector2& p_anchor_a,const Vector2& p_anchor_b,RID p_body_a,RID p_body_b=RID())=0;
+ virtual RID pin_joint_create(const Vector2 &p_anchor, RID p_body_a, RID p_body_b = RID()) = 0;
+ virtual RID groove_joint_create(const Vector2 &p_a_groove1, const Vector2 &p_a_groove2, const Vector2 &p_b_anchor, RID p_body_a, RID p_body_b) = 0;
+ virtual RID damped_spring_joint_create(const Vector2 &p_anchor_a, const Vector2 &p_anchor_b, RID p_body_a, RID p_body_b = RID()) = 0;
enum PinJointParam {
PIN_JOINT_SOFTNESS
};
- virtual void pin_joint_set_param(RID p_joint, PinJointParam p_param, real_t p_value)=0;
- virtual real_t pin_joint_get_param(RID p_joint, PinJointParam p_param) const=0;
+ virtual void pin_joint_set_param(RID p_joint, PinJointParam p_param, real_t p_value) = 0;
+ virtual real_t pin_joint_get_param(RID p_joint, PinJointParam p_param) const = 0;
enum DampedStringParam {
DAMPED_STRING_REST_LENGTH,
DAMPED_STRING_STIFFNESS,
DAMPED_STRING_DAMPING
};
- virtual void damped_string_joint_set_param(RID p_joint, DampedStringParam p_param, real_t p_value)=0;
- virtual real_t damped_string_joint_get_param(RID p_joint, DampedStringParam p_param) const=0;
+ virtual void damped_string_joint_set_param(RID p_joint, DampedStringParam p_param, real_t p_value) = 0;
+ virtual real_t damped_string_joint_get_param(RID p_joint, DampedStringParam p_param) const = 0;
- virtual JointType joint_get_type(RID p_joint) const=0;
+ virtual JointType joint_get_type(RID p_joint) const = 0;
/* QUERY API */
@@ -547,18 +533,17 @@ public:
AREA_BODY_REMOVED
};
-
/* MISC */
- virtual void free(RID p_rid)=0;
+ virtual void free(RID p_rid) = 0;
- virtual void set_active(bool p_active)=0;
- virtual void init()=0;
- virtual void step(float p_step)=0;
- virtual void sync()=0;
- virtual void flush_queries()=0;
- virtual void end_sync()=0;
- virtual void finish()=0;
+ virtual void set_active(bool p_active) = 0;
+ virtual void init() = 0;
+ virtual void step(float p_step) = 0;
+ virtual void sync() = 0;
+ virtual void flush_queries() = 0;
+ virtual void end_sync() = 0;
+ virtual void finish() = 0;
enum ProcessInfo {
@@ -569,26 +554,25 @@ public:
INFO_BROAD_PHASE_TIME
};
- virtual int get_process_info(ProcessInfo p_info)=0;
+ virtual int get_process_info(ProcessInfo p_info) = 0;
Physics2DServer();
~Physics2DServer();
};
-
class Physics2DTestMotionResult : public Reference {
- OBJ_TYPE( Physics2DTestMotionResult, Reference );
+ OBJ_TYPE(Physics2DTestMotionResult, Reference);
Physics2DServer::MotionResult result;
bool colliding;
-friend class Physics2DServer;
+ friend class Physics2DServer;
protected:
static void _bind_methods();
-public:
- Physics2DServer::MotionResult* get_result_ptr() const { return const_cast<Physics2DServer::MotionResult*>(&result); }
+public:
+ Physics2DServer::MotionResult *get_result_ptr() const { return const_cast<Physics2DServer::MotionResult *>(&result); }
//bool is_colliding() const;
Vector2 get_motion() const;
@@ -599,26 +583,25 @@ public:
Vector2 get_collider_velocity() const;
ObjectID get_collider_id() const;
RID get_collider_rid() const;
- Object* get_collider() const;
+ Object *get_collider() const;
int get_collider_shape() const;
Physics2DTestMotionResult();
};
-
-VARIANT_ENUM_CAST( Physics2DServer::ShapeType );
-VARIANT_ENUM_CAST( Physics2DServer::SpaceParameter );
-VARIANT_ENUM_CAST( Physics2DServer::AreaParameter );
-VARIANT_ENUM_CAST( Physics2DServer::AreaSpaceOverrideMode );
-VARIANT_ENUM_CAST( Physics2DServer::BodyMode );
-VARIANT_ENUM_CAST( Physics2DServer::BodyParameter );
-VARIANT_ENUM_CAST( Physics2DServer::BodyState );
-VARIANT_ENUM_CAST( Physics2DServer::CCDMode );
-VARIANT_ENUM_CAST( Physics2DServer::JointParam );
-VARIANT_ENUM_CAST( Physics2DServer::JointType );
-VARIANT_ENUM_CAST( Physics2DServer::DampedStringParam );
+VARIANT_ENUM_CAST(Physics2DServer::ShapeType);
+VARIANT_ENUM_CAST(Physics2DServer::SpaceParameter);
+VARIANT_ENUM_CAST(Physics2DServer::AreaParameter);
+VARIANT_ENUM_CAST(Physics2DServer::AreaSpaceOverrideMode);
+VARIANT_ENUM_CAST(Physics2DServer::BodyMode);
+VARIANT_ENUM_CAST(Physics2DServer::BodyParameter);
+VARIANT_ENUM_CAST(Physics2DServer::BodyState);
+VARIANT_ENUM_CAST(Physics2DServer::CCDMode);
+VARIANT_ENUM_CAST(Physics2DServer::JointParam);
+VARIANT_ENUM_CAST(Physics2DServer::JointType);
+VARIANT_ENUM_CAST(Physics2DServer::DampedStringParam);
//VARIANT_ENUM_CAST( Physics2DServer::ObjectType );
-VARIANT_ENUM_CAST( Physics2DServer::AreaBodyStatus );
-VARIANT_ENUM_CAST( Physics2DServer::ProcessInfo );
+VARIANT_ENUM_CAST(Physics2DServer::AreaBodyStatus);
+VARIANT_ENUM_CAST(Physics2DServer::ProcessInfo);
#endif
diff --git a/servers/physics_server.cpp b/servers/physics_server.cpp
index f93e3ad32..ba67fcd09 100644
--- a/servers/physics_server.cpp
+++ b/servers/physics_server.cpp
@@ -28,106 +28,98 @@
/*************************************************************************/
#include "physics_server.h"
#include "print_string.h"
-PhysicsServer * PhysicsServer::singleton=NULL;
-
+PhysicsServer *PhysicsServer::singleton = NULL;
void PhysicsDirectBodyState::integrate_forces() {
real_t step = get_step();
Vector3 lv = get_linear_velocity();
- lv+=get_total_gravity() * step;
+ lv += get_total_gravity() * step;
Vector3 av = get_angular_velocity();
float linear_damp = 1.0 - step * get_total_linear_damp();
- if (linear_damp<0) // reached zero in the given time
- linear_damp=0;
+ if (linear_damp < 0) // reached zero in the given time
+ linear_damp = 0;
float angular_damp = 1.0 - step * get_total_angular_damp();
- if (angular_damp<0) // reached zero in the given time
- angular_damp=0;
+ if (angular_damp < 0) // reached zero in the given time
+ angular_damp = 0;
- lv*=linear_damp;
- av*=angular_damp;
+ lv *= linear_damp;
+ av *= angular_damp;
set_linear_velocity(lv);
set_angular_velocity(av);
-
-
-
-
}
-Object* PhysicsDirectBodyState::get_contact_collider_object(int p_contact_idx) const {
+Object *PhysicsDirectBodyState::get_contact_collider_object(int p_contact_idx) const {
ObjectID objid = get_contact_collider_id(p_contact_idx);
- Object *obj = ObjectDB::get_instance( objid );
+ Object *obj = ObjectDB::get_instance(objid);
return obj;
}
-PhysicsServer * PhysicsServer::get_singleton() {
+PhysicsServer *PhysicsServer::get_singleton() {
return singleton;
}
void PhysicsDirectBodyState::_bind_methods() {
- ObjectTypeDB::bind_method(_MD("get_total_gravity"),&PhysicsDirectBodyState::get_total_gravity);
- ObjectTypeDB::bind_method(_MD("get_total_linear_damp"),&PhysicsDirectBodyState::get_total_linear_damp);
- ObjectTypeDB::bind_method(_MD("get_total_angular_damp"),&PhysicsDirectBodyState::get_total_angular_damp);
-
- ObjectTypeDB::bind_method(_MD("get_inverse_mass"),&PhysicsDirectBodyState::get_inverse_mass);
- ObjectTypeDB::bind_method(_MD("get_inverse_inertia"),&PhysicsDirectBodyState::get_inverse_inertia);
+ ObjectTypeDB::bind_method(_MD("get_total_gravity"), &PhysicsDirectBodyState::get_total_gravity);
+ ObjectTypeDB::bind_method(_MD("get_total_linear_damp"), &PhysicsDirectBodyState::get_total_linear_damp);
+ ObjectTypeDB::bind_method(_MD("get_total_angular_damp"), &PhysicsDirectBodyState::get_total_angular_damp);
- ObjectTypeDB::bind_method(_MD("set_linear_velocity","velocity"),&PhysicsDirectBodyState::set_linear_velocity);
- ObjectTypeDB::bind_method(_MD("get_linear_velocity"),&PhysicsDirectBodyState::get_linear_velocity);
+ ObjectTypeDB::bind_method(_MD("get_inverse_mass"), &PhysicsDirectBodyState::get_inverse_mass);
+ ObjectTypeDB::bind_method(_MD("get_inverse_inertia"), &PhysicsDirectBodyState::get_inverse_inertia);
- ObjectTypeDB::bind_method(_MD("set_angular_velocity","velocity"),&PhysicsDirectBodyState::set_angular_velocity);
- ObjectTypeDB::bind_method(_MD("get_angular_velocity"),&PhysicsDirectBodyState::get_angular_velocity);
+ ObjectTypeDB::bind_method(_MD("set_linear_velocity", "velocity"), &PhysicsDirectBodyState::set_linear_velocity);
+ ObjectTypeDB::bind_method(_MD("get_linear_velocity"), &PhysicsDirectBodyState::get_linear_velocity);
- ObjectTypeDB::bind_method(_MD("set_transform","transform"),&PhysicsDirectBodyState::set_transform);
- ObjectTypeDB::bind_method(_MD("get_transform"),&PhysicsDirectBodyState::get_transform);
+ ObjectTypeDB::bind_method(_MD("set_angular_velocity", "velocity"), &PhysicsDirectBodyState::set_angular_velocity);
+ ObjectTypeDB::bind_method(_MD("get_angular_velocity"), &PhysicsDirectBodyState::get_angular_velocity);
- ObjectTypeDB::bind_method(_MD("add_force","force","pos"),&PhysicsDirectBodyState::add_force);
- ObjectTypeDB::bind_method(_MD("apply_impulse","pos","j"),&PhysicsDirectBodyState::apply_impulse);
+ ObjectTypeDB::bind_method(_MD("set_transform", "transform"), &PhysicsDirectBodyState::set_transform);
+ ObjectTypeDB::bind_method(_MD("get_transform"), &PhysicsDirectBodyState::get_transform);
- ObjectTypeDB::bind_method(_MD("set_sleep_state","enabled"),&PhysicsDirectBodyState::set_sleep_state);
- ObjectTypeDB::bind_method(_MD("is_sleeping"),&PhysicsDirectBodyState::is_sleeping);
+ ObjectTypeDB::bind_method(_MD("add_force", "force", "pos"), &PhysicsDirectBodyState::add_force);
+ ObjectTypeDB::bind_method(_MD("apply_impulse", "pos", "j"), &PhysicsDirectBodyState::apply_impulse);
- ObjectTypeDB::bind_method(_MD("get_contact_count"),&PhysicsDirectBodyState::get_contact_count);
+ ObjectTypeDB::bind_method(_MD("set_sleep_state", "enabled"), &PhysicsDirectBodyState::set_sleep_state);
+ ObjectTypeDB::bind_method(_MD("is_sleeping"), &PhysicsDirectBodyState::is_sleeping);
- ObjectTypeDB::bind_method(_MD("get_contact_local_pos","contact_idx"),&PhysicsDirectBodyState::get_contact_local_pos);
- ObjectTypeDB::bind_method(_MD("get_contact_local_normal","contact_idx"),&PhysicsDirectBodyState::get_contact_local_normal);
- ObjectTypeDB::bind_method(_MD("get_contact_local_shape","contact_idx"),&PhysicsDirectBodyState::get_contact_local_shape);
- ObjectTypeDB::bind_method(_MD("get_contact_collider","contact_idx"),&PhysicsDirectBodyState::get_contact_collider);
- ObjectTypeDB::bind_method(_MD("get_contact_collider_pos","contact_idx"),&PhysicsDirectBodyState::get_contact_collider_pos);
- ObjectTypeDB::bind_method(_MD("get_contact_collider_id","contact_idx"),&PhysicsDirectBodyState::get_contact_collider_id);
- ObjectTypeDB::bind_method(_MD("get_contact_collider_object","contact_idx"),&PhysicsDirectBodyState::get_contact_collider_object);
- ObjectTypeDB::bind_method(_MD("get_contact_collider_shape","contact_idx"),&PhysicsDirectBodyState::get_contact_collider_shape);
- ObjectTypeDB::bind_method(_MD("get_contact_collider_velocity_at_pos","contact_idx"),&PhysicsDirectBodyState::get_contact_collider_velocity_at_pos);
- ObjectTypeDB::bind_method(_MD("get_step"),&PhysicsDirectBodyState::get_step);
- ObjectTypeDB::bind_method(_MD("integrate_forces"),&PhysicsDirectBodyState::integrate_forces);
- ObjectTypeDB::bind_method(_MD("get_space_state:PhysicsDirectSpaceState"),&PhysicsDirectBodyState::get_space_state);
+ ObjectTypeDB::bind_method(_MD("get_contact_count"), &PhysicsDirectBodyState::get_contact_count);
+ ObjectTypeDB::bind_method(_MD("get_contact_local_pos", "contact_idx"), &PhysicsDirectBodyState::get_contact_local_pos);
+ ObjectTypeDB::bind_method(_MD("get_contact_local_normal", "contact_idx"), &PhysicsDirectBodyState::get_contact_local_normal);
+ ObjectTypeDB::bind_method(_MD("get_contact_local_shape", "contact_idx"), &PhysicsDirectBodyState::get_contact_local_shape);
+ ObjectTypeDB::bind_method(_MD("get_contact_collider", "contact_idx"), &PhysicsDirectBodyState::get_contact_collider);
+ ObjectTypeDB::bind_method(_MD("get_contact_collider_pos", "contact_idx"), &PhysicsDirectBodyState::get_contact_collider_pos);
+ ObjectTypeDB::bind_method(_MD("get_contact_collider_id", "contact_idx"), &PhysicsDirectBodyState::get_contact_collider_id);
+ ObjectTypeDB::bind_method(_MD("get_contact_collider_object", "contact_idx"), &PhysicsDirectBodyState::get_contact_collider_object);
+ ObjectTypeDB::bind_method(_MD("get_contact_collider_shape", "contact_idx"), &PhysicsDirectBodyState::get_contact_collider_shape);
+ ObjectTypeDB::bind_method(_MD("get_contact_collider_velocity_at_pos", "contact_idx"), &PhysicsDirectBodyState::get_contact_collider_velocity_at_pos);
+ ObjectTypeDB::bind_method(_MD("get_step"), &PhysicsDirectBodyState::get_step);
+ ObjectTypeDB::bind_method(_MD("integrate_forces"), &PhysicsDirectBodyState::integrate_forces);
+ ObjectTypeDB::bind_method(_MD("get_space_state:PhysicsDirectSpaceState"), &PhysicsDirectBodyState::get_space_state);
}
PhysicsDirectBodyState::PhysicsDirectBodyState() {}
///////////////////////////////////////////////////////
-
-
void PhysicsShapeQueryParameters::set_shape(const RES &p_shape) {
ERR_FAIL_COND(p_shape.is_null());
- shape=p_shape->get_rid();
+ shape = p_shape->get_rid();
}
-void PhysicsShapeQueryParameters::set_shape_rid(const RID& p_shape) {
+void PhysicsShapeQueryParameters::set_shape_rid(const RID &p_shape) {
- shape=p_shape;
+ shape = p_shape;
}
RID PhysicsShapeQueryParameters::get_shape_rid() const {
@@ -135,95 +127,89 @@ RID PhysicsShapeQueryParameters::get_shape_rid() const {
return shape;
}
-void PhysicsShapeQueryParameters::set_transform(const Transform& p_transform){
+void PhysicsShapeQueryParameters::set_transform(const Transform &p_transform) {
- transform=p_transform;
+ transform = p_transform;
}
-Transform PhysicsShapeQueryParameters::get_transform() const{
+Transform PhysicsShapeQueryParameters::get_transform() const {
return transform;
}
-void PhysicsShapeQueryParameters::set_margin(float p_margin){
+void PhysicsShapeQueryParameters::set_margin(float p_margin) {
- margin=p_margin;
+ margin = p_margin;
}
-float PhysicsShapeQueryParameters::get_margin() const{
+float PhysicsShapeQueryParameters::get_margin() const {
return margin;
}
-void PhysicsShapeQueryParameters::set_layer_mask(int p_layer_mask){
+void PhysicsShapeQueryParameters::set_layer_mask(int p_layer_mask) {
- layer_mask=p_layer_mask;
+ layer_mask = p_layer_mask;
}
-int PhysicsShapeQueryParameters::get_layer_mask() const{
+int PhysicsShapeQueryParameters::get_layer_mask() const {
return layer_mask;
}
+void PhysicsShapeQueryParameters::set_object_type_mask(int p_object_type_mask) {
-void PhysicsShapeQueryParameters::set_object_type_mask(int p_object_type_mask){
-
- object_type_mask=p_object_type_mask;
+ object_type_mask = p_object_type_mask;
}
-int PhysicsShapeQueryParameters::get_object_type_mask() const{
+int PhysicsShapeQueryParameters::get_object_type_mask() const {
return object_type_mask;
}
-void PhysicsShapeQueryParameters::set_exclude(const Vector<RID>& p_exclude) {
+void PhysicsShapeQueryParameters::set_exclude(const Vector<RID> &p_exclude) {
exclude.clear();
- for(int i=0;i<p_exclude.size();i++)
+ for (int i = 0; i < p_exclude.size(); i++)
exclude.insert(p_exclude[i]);
-
}
-Vector<RID> PhysicsShapeQueryParameters::get_exclude() const{
+Vector<RID> PhysicsShapeQueryParameters::get_exclude() const {
Vector<RID> ret;
ret.resize(exclude.size());
- int idx=0;
- for(Set<RID>::Element *E=exclude.front();E;E=E->next()) {
- ret[idx]=E->get();
+ int idx = 0;
+ for (Set<RID>::Element *E = exclude.front(); E; E = E->next()) {
+ ret[idx] = E->get();
}
return ret;
}
void PhysicsShapeQueryParameters::_bind_methods() {
- ObjectTypeDB::bind_method(_MD("set_shape","shape:Shape"),&PhysicsShapeQueryParameters::set_shape);
- ObjectTypeDB::bind_method(_MD("set_shape_rid","shape"),&PhysicsShapeQueryParameters::set_shape_rid);
- ObjectTypeDB::bind_method(_MD("get_shape_rid"),&PhysicsShapeQueryParameters::get_shape_rid);
-
- ObjectTypeDB::bind_method(_MD("set_transform","transform"),&PhysicsShapeQueryParameters::set_transform);
- ObjectTypeDB::bind_method(_MD("get_transform"),&PhysicsShapeQueryParameters::get_transform);
+ ObjectTypeDB::bind_method(_MD("set_shape", "shape:Shape"), &PhysicsShapeQueryParameters::set_shape);
+ ObjectTypeDB::bind_method(_MD("set_shape_rid", "shape"), &PhysicsShapeQueryParameters::set_shape_rid);
+ ObjectTypeDB::bind_method(_MD("get_shape_rid"), &PhysicsShapeQueryParameters::get_shape_rid);
- ObjectTypeDB::bind_method(_MD("set_margin","margin"),&PhysicsShapeQueryParameters::set_margin);
- ObjectTypeDB::bind_method(_MD("get_margin"),&PhysicsShapeQueryParameters::get_margin);
+ ObjectTypeDB::bind_method(_MD("set_transform", "transform"), &PhysicsShapeQueryParameters::set_transform);
+ ObjectTypeDB::bind_method(_MD("get_transform"), &PhysicsShapeQueryParameters::get_transform);
- ObjectTypeDB::bind_method(_MD("set_layer_mask","layer_mask"),&PhysicsShapeQueryParameters::set_layer_mask);
- ObjectTypeDB::bind_method(_MD("get_layer_mask"),&PhysicsShapeQueryParameters::get_layer_mask);
+ ObjectTypeDB::bind_method(_MD("set_margin", "margin"), &PhysicsShapeQueryParameters::set_margin);
+ ObjectTypeDB::bind_method(_MD("get_margin"), &PhysicsShapeQueryParameters::get_margin);
- ObjectTypeDB::bind_method(_MD("set_object_type_mask","object_type_mask"),&PhysicsShapeQueryParameters::set_object_type_mask);
- ObjectTypeDB::bind_method(_MD("get_object_type_mask"),&PhysicsShapeQueryParameters::get_object_type_mask);
-
- ObjectTypeDB::bind_method(_MD("set_exclude","exclude"),&PhysicsShapeQueryParameters::set_exclude);
- ObjectTypeDB::bind_method(_MD("get_exclude"),&PhysicsShapeQueryParameters::get_exclude);
+ ObjectTypeDB::bind_method(_MD("set_layer_mask", "layer_mask"), &PhysicsShapeQueryParameters::set_layer_mask);
+ ObjectTypeDB::bind_method(_MD("get_layer_mask"), &PhysicsShapeQueryParameters::get_layer_mask);
+ ObjectTypeDB::bind_method(_MD("set_object_type_mask", "object_type_mask"), &PhysicsShapeQueryParameters::set_object_type_mask);
+ ObjectTypeDB::bind_method(_MD("get_object_type_mask"), &PhysicsShapeQueryParameters::get_object_type_mask);
+ ObjectTypeDB::bind_method(_MD("set_exclude", "exclude"), &PhysicsShapeQueryParameters::set_exclude);
+ ObjectTypeDB::bind_method(_MD("get_exclude"), &PhysicsShapeQueryParameters::get_exclude);
}
PhysicsShapeQueryParameters::PhysicsShapeQueryParameters() {
- margin=0;
- layer_mask=0x7FFFFFFF;
- object_type_mask=PhysicsDirectSpaceState::TYPE_MASK_COLLISION;
+ margin = 0;
+ layer_mask = 0x7FFFFFFF;
+ object_type_mask = PhysicsDirectSpaceState::TYPE_MASK_COLLISION;
}
-
-
/////////////////////////////////////
/*
@@ -256,26 +242,25 @@ Variant PhysicsDirectSpaceState::_intersect_shape(const RID& p_shape, const Tran
}
*/
-
-Dictionary PhysicsDirectSpaceState::_intersect_ray(const Vector3& p_from, const Vector3& p_to,const Vector<RID>& p_exclude,uint32_t p_layers,uint32_t p_object_type_mask) {
+Dictionary PhysicsDirectSpaceState::_intersect_ray(const Vector3 &p_from, const Vector3 &p_to, const Vector<RID> &p_exclude, uint32_t p_layers, uint32_t p_object_type_mask) {
RayResult inters;
Set<RID> exclude;
- for(int i=0;i<p_exclude.size();i++)
+ for (int i = 0; i < p_exclude.size(); i++)
exclude.insert(p_exclude[i]);
- bool res = intersect_ray(p_from,p_to,inters,exclude,p_layers,p_object_type_mask);
+ bool res = intersect_ray(p_from, p_to, inters, exclude, p_layers, p_object_type_mask);
if (!res)
return Dictionary(true);
Dictionary d(true);
- d["position"]=inters.position;
- d["normal"]=inters.normal;
- d["collider_id"]=inters.collider_id;
- d["collider"]=inters.collider;
- d["shape"]=inters.shape;
- d["rid"]=inters.rid;
+ d["position"] = inters.position;
+ d["normal"] = inters.normal;
+ d["collider_id"] = inters.collider_id;
+ d["collider"] = inters.collider;
+ d["shape"] = inters.shape;
+ d["rid"] = inters.rid;
return d;
}
@@ -284,101 +269,89 @@ Array PhysicsDirectSpaceState::_intersect_shape(const Ref<PhysicsShapeQueryParam
Vector<ShapeResult> sr;
sr.resize(p_max_results);
- int rc = intersect_shape(psq->shape,psq->transform,psq->margin,sr.ptr(),sr.size(),psq->exclude,psq->layer_mask,psq->object_type_mask);
+ int rc = intersect_shape(psq->shape, psq->transform, psq->margin, sr.ptr(), sr.size(), psq->exclude, psq->layer_mask, psq->object_type_mask);
Array ret;
ret.resize(rc);
- for(int i=0;i<rc;i++) {
+ for (int i = 0; i < rc; i++) {
Dictionary d;
- d["rid"]=sr[i].rid;
- d["collider_id"]=sr[i].collider_id;
- d["collider"]=sr[i].collider;
- d["shape"]=sr[i].shape;
- ret[i]=d;
+ d["rid"] = sr[i].rid;
+ d["collider_id"] = sr[i].collider_id;
+ d["collider"] = sr[i].collider;
+ d["shape"] = sr[i].shape;
+ ret[i] = d;
}
return ret;
}
-Array PhysicsDirectSpaceState::_cast_motion(const Ref<PhysicsShapeQueryParameters> &psq,const Vector3& p_motion){
+Array PhysicsDirectSpaceState::_cast_motion(const Ref<PhysicsShapeQueryParameters> &psq, const Vector3 &p_motion) {
- float closest_safe,closest_unsafe;
- bool res = cast_motion(psq->shape,psq->transform,p_motion,psq->margin,closest_safe,closest_unsafe,psq->exclude,psq->layer_mask,psq->object_type_mask);
+ float closest_safe, closest_unsafe;
+ bool res = cast_motion(psq->shape, psq->transform, p_motion, psq->margin, closest_safe, closest_unsafe, psq->exclude, psq->layer_mask, psq->object_type_mask);
if (!res)
return Array();
Array ret(true);
ret.resize(2);
- ret[0]=closest_safe;
- ret[1]=closest_unsafe;
+ ret[0] = closest_safe;
+ ret[1] = closest_unsafe;
return ret;
-
}
-Array PhysicsDirectSpaceState::_collide_shape(const Ref<PhysicsShapeQueryParameters> &psq, int p_max_results){
+Array PhysicsDirectSpaceState::_collide_shape(const Ref<PhysicsShapeQueryParameters> &psq, int p_max_results) {
Vector<Vector3> ret;
- ret.resize(p_max_results*2);
- int rc=0;
- bool res = collide_shape(psq->shape,psq->transform,psq->margin,ret.ptr(),p_max_results,rc,psq->exclude,psq->layer_mask,psq->object_type_mask);
+ ret.resize(p_max_results * 2);
+ int rc = 0;
+ bool res = collide_shape(psq->shape, psq->transform, psq->margin, ret.ptr(), p_max_results, rc, psq->exclude, psq->layer_mask, psq->object_type_mask);
if (!res)
return Array();
Array r;
- r.resize(rc*2);
- for(int i=0;i<rc*2;i++)
- r[i]=ret[i];
+ r.resize(rc * 2);
+ for (int i = 0; i < rc * 2; i++)
+ r[i] = ret[i];
return r;
-
}
-Dictionary PhysicsDirectSpaceState::_get_rest_info(const Ref<PhysicsShapeQueryParameters> &psq){
+Dictionary PhysicsDirectSpaceState::_get_rest_info(const Ref<PhysicsShapeQueryParameters> &psq) {
ShapeRestInfo sri;
- bool res = rest_info(psq->shape,psq->transform,psq->margin,&sri,psq->exclude,psq->layer_mask,psq->object_type_mask);
+ bool res = rest_info(psq->shape, psq->transform, psq->margin, &sri, psq->exclude, psq->layer_mask, psq->object_type_mask);
Dictionary r(true);
if (!res)
return r;
- r["point"]=sri.point;
- r["normal"]=sri.normal;
- r["rid"]=sri.rid;
- r["collider_id"]=sri.collider_id;
- r["shape"]=sri.shape;
- r["linear_velocity"]=sri.linear_velocity;
+ r["point"] = sri.point;
+ r["normal"] = sri.normal;
+ r["rid"] = sri.rid;
+ r["collider_id"] = sri.collider_id;
+ r["shape"] = sri.shape;
+ r["linear_velocity"] = sri.linear_velocity;
return r;
}
-
-
PhysicsDirectSpaceState::PhysicsDirectSpaceState() {
-
-
-
}
-
void PhysicsDirectSpaceState::_bind_methods() {
+ // ObjectTypeDB::bind_method(_MD("intersect_ray","from","to","exclude","umask"),&PhysicsDirectSpaceState::_intersect_ray,DEFVAL(Array()),DEFVAL(0));
+ // ObjectTypeDB::bind_method(_MD("intersect_shape:PhysicsShapeQueryResult","shape","xform","result_max","exclude","umask"),&PhysicsDirectSpaceState::_intersect_shape,DEFVAL(Array()),DEFVAL(0));
-// ObjectTypeDB::bind_method(_MD("intersect_ray","from","to","exclude","umask"),&PhysicsDirectSpaceState::_intersect_ray,DEFVAL(Array()),DEFVAL(0));
-// ObjectTypeDB::bind_method(_MD("intersect_shape:PhysicsShapeQueryResult","shape","xform","result_max","exclude","umask"),&PhysicsDirectSpaceState::_intersect_shape,DEFVAL(Array()),DEFVAL(0));
-
- ObjectTypeDB::bind_method(_MD("intersect_ray:Dictionary","from","to","exclude","layer_mask","type_mask"),&PhysicsDirectSpaceState::_intersect_ray,DEFVAL(Array()),DEFVAL(0x7FFFFFFF),DEFVAL(TYPE_MASK_COLLISION));
- ObjectTypeDB::bind_method(_MD("intersect_shape","shape:PhysicsShapeQueryParameters","max_results"),&PhysicsDirectSpaceState::_intersect_shape,DEFVAL(32));
- ObjectTypeDB::bind_method(_MD("cast_motion","shape:PhysicsShapeQueryParameters","motion"),&PhysicsDirectSpaceState::_cast_motion);
- ObjectTypeDB::bind_method(_MD("collide_shape","shape:PhysicsShapeQueryParameters","max_results"),&PhysicsDirectSpaceState::_collide_shape,DEFVAL(32));
- ObjectTypeDB::bind_method(_MD("get_rest_info","shape:PhysicsShapeQueryParameters"),&PhysicsDirectSpaceState::_get_rest_info);
-
-
- BIND_CONSTANT( TYPE_MASK_STATIC_BODY );
- BIND_CONSTANT( TYPE_MASK_KINEMATIC_BODY );
- BIND_CONSTANT( TYPE_MASK_RIGID_BODY );
- BIND_CONSTANT( TYPE_MASK_CHARACTER_BODY );
- BIND_CONSTANT( TYPE_MASK_AREA );
- BIND_CONSTANT( TYPE_MASK_COLLISION );
+ ObjectTypeDB::bind_method(_MD("intersect_ray:Dictionary", "from", "to", "exclude", "layer_mask", "type_mask"), &PhysicsDirectSpaceState::_intersect_ray, DEFVAL(Array()), DEFVAL(0x7FFFFFFF), DEFVAL(TYPE_MASK_COLLISION));
+ ObjectTypeDB::bind_method(_MD("intersect_shape", "shape:PhysicsShapeQueryParameters", "max_results"), &PhysicsDirectSpaceState::_intersect_shape, DEFVAL(32));
+ ObjectTypeDB::bind_method(_MD("cast_motion", "shape:PhysicsShapeQueryParameters", "motion"), &PhysicsDirectSpaceState::_cast_motion);
+ ObjectTypeDB::bind_method(_MD("collide_shape", "shape:PhysicsShapeQueryParameters", "max_results"), &PhysicsDirectSpaceState::_collide_shape, DEFVAL(32));
+ ObjectTypeDB::bind_method(_MD("get_rest_info", "shape:PhysicsShapeQueryParameters"), &PhysicsDirectSpaceState::_get_rest_info);
+ BIND_CONSTANT(TYPE_MASK_STATIC_BODY);
+ BIND_CONSTANT(TYPE_MASK_KINEMATIC_BODY);
+ BIND_CONSTANT(TYPE_MASK_RIGID_BODY);
+ BIND_CONSTANT(TYPE_MASK_CHARACTER_BODY);
+ BIND_CONSTANT(TYPE_MASK_AREA);
+ BIND_CONSTANT(TYPE_MASK_COLLISION);
}
-
int PhysicsShapeQueryResult::get_result_count() const {
return result.size();
@@ -391,7 +364,7 @@ ObjectID PhysicsShapeQueryResult::get_result_object_id(int p_idx) const {
return result[p_idx].collider_id;
}
-Object* PhysicsShapeQueryResult::get_result_object(int p_idx) const {
+Object *PhysicsShapeQueryResult::get_result_object(int p_idx) const {
return result[p_idx].collider;
}
@@ -401,164 +374,151 @@ int PhysicsShapeQueryResult::get_result_object_shape(int p_idx) const {
}
PhysicsShapeQueryResult::PhysicsShapeQueryResult() {
-
-
}
void PhysicsShapeQueryResult::_bind_methods() {
- ObjectTypeDB::bind_method(_MD("get_result_count"),&PhysicsShapeQueryResult::get_result_count);
- ObjectTypeDB::bind_method(_MD("get_result_rid","idx"),&PhysicsShapeQueryResult::get_result_rid);
- ObjectTypeDB::bind_method(_MD("get_result_object_id","idx"),&PhysicsShapeQueryResult::get_result_object_id);
- ObjectTypeDB::bind_method(_MD("get_result_object","idx"),&PhysicsShapeQueryResult::get_result_object);
- ObjectTypeDB::bind_method(_MD("get_result_object_shape","idx"),&PhysicsShapeQueryResult::get_result_object_shape);
-
-
+ ObjectTypeDB::bind_method(_MD("get_result_count"), &PhysicsShapeQueryResult::get_result_count);
+ ObjectTypeDB::bind_method(_MD("get_result_rid", "idx"), &PhysicsShapeQueryResult::get_result_rid);
+ ObjectTypeDB::bind_method(_MD("get_result_object_id", "idx"), &PhysicsShapeQueryResult::get_result_object_id);
+ ObjectTypeDB::bind_method(_MD("get_result_object", "idx"), &PhysicsShapeQueryResult::get_result_object);
+ ObjectTypeDB::bind_method(_MD("get_result_object_shape", "idx"), &PhysicsShapeQueryResult::get_result_object_shape);
}
-
-
-
-
///////////////////////////////////////
void PhysicsServer::_bind_methods() {
+ ObjectTypeDB::bind_method(_MD("shape_create", "type"), &PhysicsServer::shape_create);
+ ObjectTypeDB::bind_method(_MD("shape_set_data", "shape", "data"), &PhysicsServer::shape_set_data);
- ObjectTypeDB::bind_method(_MD("shape_create","type"),&PhysicsServer::shape_create);
- ObjectTypeDB::bind_method(_MD("shape_set_data","shape","data"),&PhysicsServer::shape_set_data);
-
- ObjectTypeDB::bind_method(_MD("shape_get_type","shape"),&PhysicsServer::shape_get_type);
- ObjectTypeDB::bind_method(_MD("shape_get_data","shape"),&PhysicsServer::shape_get_data);
-
-
- ObjectTypeDB::bind_method(_MD("space_create"),&PhysicsServer::space_create);
- ObjectTypeDB::bind_method(_MD("space_set_active","space","active"),&PhysicsServer::space_set_active);
- ObjectTypeDB::bind_method(_MD("space_is_active","space"),&PhysicsServer::space_is_active);
- ObjectTypeDB::bind_method(_MD("space_set_param","space","param","value"),&PhysicsServer::space_set_param);
- ObjectTypeDB::bind_method(_MD("space_get_param","space","param"),&PhysicsServer::space_get_param);
- ObjectTypeDB::bind_method(_MD("space_get_direct_state:PhysicsDirectSpaceState","space"),&PhysicsServer::space_get_direct_state);
+ ObjectTypeDB::bind_method(_MD("shape_get_type", "shape"), &PhysicsServer::shape_get_type);
+ ObjectTypeDB::bind_method(_MD("shape_get_data", "shape"), &PhysicsServer::shape_get_data);
- ObjectTypeDB::bind_method(_MD("area_create"),&PhysicsServer::area_create);
- ObjectTypeDB::bind_method(_MD("area_set_space","area","space"),&PhysicsServer::area_set_space);
- ObjectTypeDB::bind_method(_MD("area_get_space","area"),&PhysicsServer::area_get_space);
+ ObjectTypeDB::bind_method(_MD("space_create"), &PhysicsServer::space_create);
+ ObjectTypeDB::bind_method(_MD("space_set_active", "space", "active"), &PhysicsServer::space_set_active);
+ ObjectTypeDB::bind_method(_MD("space_is_active", "space"), &PhysicsServer::space_is_active);
+ ObjectTypeDB::bind_method(_MD("space_set_param", "space", "param", "value"), &PhysicsServer::space_set_param);
+ ObjectTypeDB::bind_method(_MD("space_get_param", "space", "param"), &PhysicsServer::space_get_param);
+ ObjectTypeDB::bind_method(_MD("space_get_direct_state:PhysicsDirectSpaceState", "space"), &PhysicsServer::space_get_direct_state);
- ObjectTypeDB::bind_method(_MD("area_set_space_override_mode","area","mode"),&PhysicsServer::area_set_space_override_mode);
- ObjectTypeDB::bind_method(_MD("area_get_space_override_mode","area"),&PhysicsServer::area_get_space_override_mode);
+ ObjectTypeDB::bind_method(_MD("area_create"), &PhysicsServer::area_create);
+ ObjectTypeDB::bind_method(_MD("area_set_space", "area", "space"), &PhysicsServer::area_set_space);
+ ObjectTypeDB::bind_method(_MD("area_get_space", "area"), &PhysicsServer::area_get_space);
- ObjectTypeDB::bind_method(_MD("area_add_shape","area","shape","transform"),&PhysicsServer::area_add_shape,DEFVAL(Transform()));
- ObjectTypeDB::bind_method(_MD("area_set_shape","area","shape_idx","shape"),&PhysicsServer::area_set_shape);
- ObjectTypeDB::bind_method(_MD("area_set_shape_transform","area","shape_idx","transform"),&PhysicsServer::area_set_shape_transform);
+ ObjectTypeDB::bind_method(_MD("area_set_space_override_mode", "area", "mode"), &PhysicsServer::area_set_space_override_mode);
+ ObjectTypeDB::bind_method(_MD("area_get_space_override_mode", "area"), &PhysicsServer::area_get_space_override_mode);
- ObjectTypeDB::bind_method(_MD("area_get_shape_count","area"),&PhysicsServer::area_get_shape_count);
- ObjectTypeDB::bind_method(_MD("area_get_shape","area","shape_idx"),&PhysicsServer::area_get_shape);
- ObjectTypeDB::bind_method(_MD("area_get_shape_transform","area","shape_idx"),&PhysicsServer::area_get_shape_transform);
+ ObjectTypeDB::bind_method(_MD("area_add_shape", "area", "shape", "transform"), &PhysicsServer::area_add_shape, DEFVAL(Transform()));
+ ObjectTypeDB::bind_method(_MD("area_set_shape", "area", "shape_idx", "shape"), &PhysicsServer::area_set_shape);
+ ObjectTypeDB::bind_method(_MD("area_set_shape_transform", "area", "shape_idx", "transform"), &PhysicsServer::area_set_shape_transform);
- ObjectTypeDB::bind_method(_MD("area_remove_shape","area","shape_idx"),&PhysicsServer::area_remove_shape);
- ObjectTypeDB::bind_method(_MD("area_clear_shapes","area"),&PhysicsServer::area_clear_shapes);
+ ObjectTypeDB::bind_method(_MD("area_get_shape_count", "area"), &PhysicsServer::area_get_shape_count);
+ ObjectTypeDB::bind_method(_MD("area_get_shape", "area", "shape_idx"), &PhysicsServer::area_get_shape);
+ ObjectTypeDB::bind_method(_MD("area_get_shape_transform", "area", "shape_idx"), &PhysicsServer::area_get_shape_transform);
- ObjectTypeDB::bind_method(_MD("area_set_layer_mask","area","mask"),&PhysicsServer::area_set_layer_mask);
- ObjectTypeDB::bind_method(_MD("area_set_collision_mask","area","mask"),&PhysicsServer::area_set_collision_mask);
+ ObjectTypeDB::bind_method(_MD("area_remove_shape", "area", "shape_idx"), &PhysicsServer::area_remove_shape);
+ ObjectTypeDB::bind_method(_MD("area_clear_shapes", "area"), &PhysicsServer::area_clear_shapes);
- ObjectTypeDB::bind_method(_MD("area_set_param","area","param","value"),&PhysicsServer::area_set_param);
- ObjectTypeDB::bind_method(_MD("area_set_transform","area","transform"),&PhysicsServer::area_set_transform);
+ ObjectTypeDB::bind_method(_MD("area_set_layer_mask", "area", "mask"), &PhysicsServer::area_set_layer_mask);
+ ObjectTypeDB::bind_method(_MD("area_set_collision_mask", "area", "mask"), &PhysicsServer::area_set_collision_mask);
- ObjectTypeDB::bind_method(_MD("area_get_param","area","param"),&PhysicsServer::area_get_param);
- ObjectTypeDB::bind_method(_MD("area_get_transform","area"),&PhysicsServer::area_get_transform);
+ ObjectTypeDB::bind_method(_MD("area_set_param", "area", "param", "value"), &PhysicsServer::area_set_param);
+ ObjectTypeDB::bind_method(_MD("area_set_transform", "area", "transform"), &PhysicsServer::area_set_transform);
- ObjectTypeDB::bind_method(_MD("area_attach_object_instance_ID","area","id"),&PhysicsServer::area_attach_object_instance_ID);
- ObjectTypeDB::bind_method(_MD("area_get_object_instance_ID","area"),&PhysicsServer::area_get_object_instance_ID);
+ ObjectTypeDB::bind_method(_MD("area_get_param", "area", "param"), &PhysicsServer::area_get_param);
+ ObjectTypeDB::bind_method(_MD("area_get_transform", "area"), &PhysicsServer::area_get_transform);
- ObjectTypeDB::bind_method(_MD("area_set_monitor_callback","area","receiver","method"),&PhysicsServer::area_set_monitor_callback);
+ ObjectTypeDB::bind_method(_MD("area_attach_object_instance_ID", "area", "id"), &PhysicsServer::area_attach_object_instance_ID);
+ ObjectTypeDB::bind_method(_MD("area_get_object_instance_ID", "area"), &PhysicsServer::area_get_object_instance_ID);
- ObjectTypeDB::bind_method(_MD("area_set_ray_pickable","area","enable"),&PhysicsServer::area_set_ray_pickable);
- ObjectTypeDB::bind_method(_MD("area_is_ray_pickable","area"),&PhysicsServer::area_is_ray_pickable);
+ ObjectTypeDB::bind_method(_MD("area_set_monitor_callback", "area", "receiver", "method"), &PhysicsServer::area_set_monitor_callback);
- ObjectTypeDB::bind_method(_MD("body_create","mode","init_sleeping"),&PhysicsServer::body_create,DEFVAL(BODY_MODE_RIGID),DEFVAL(false));
+ ObjectTypeDB::bind_method(_MD("area_set_ray_pickable", "area", "enable"), &PhysicsServer::area_set_ray_pickable);
+ ObjectTypeDB::bind_method(_MD("area_is_ray_pickable", "area"), &PhysicsServer::area_is_ray_pickable);
- ObjectTypeDB::bind_method(_MD("body_set_space","body","space"),&PhysicsServer::body_set_space);
- ObjectTypeDB::bind_method(_MD("body_get_space","body"),&PhysicsServer::body_get_space);
+ ObjectTypeDB::bind_method(_MD("body_create", "mode", "init_sleeping"), &PhysicsServer::body_create, DEFVAL(BODY_MODE_RIGID), DEFVAL(false));
- ObjectTypeDB::bind_method(_MD("body_set_mode","body","mode"),&PhysicsServer::body_set_mode);
- ObjectTypeDB::bind_method(_MD("body_get_mode","body"),&PhysicsServer::body_get_mode);
+ ObjectTypeDB::bind_method(_MD("body_set_space", "body", "space"), &PhysicsServer::body_set_space);
+ ObjectTypeDB::bind_method(_MD("body_get_space", "body"), &PhysicsServer::body_get_space);
- ObjectTypeDB::bind_method(_MD("body_set_layer_mask","body","mask"),&PhysicsServer::body_set_layer_mask);
- ObjectTypeDB::bind_method(_MD("body_get_layer_mask","body"),&PhysicsServer::body_get_layer_mask);
+ ObjectTypeDB::bind_method(_MD("body_set_mode", "body", "mode"), &PhysicsServer::body_set_mode);
+ ObjectTypeDB::bind_method(_MD("body_get_mode", "body"), &PhysicsServer::body_get_mode);
- ObjectTypeDB::bind_method(_MD("body_set_collision_mask","body","mask"),&PhysicsServer::body_set_collision_mask);
- ObjectTypeDB::bind_method(_MD("body_get_collision_mask","body"),&PhysicsServer::body_get_collision_mask);
+ ObjectTypeDB::bind_method(_MD("body_set_layer_mask", "body", "mask"), &PhysicsServer::body_set_layer_mask);
+ ObjectTypeDB::bind_method(_MD("body_get_layer_mask", "body"), &PhysicsServer::body_get_layer_mask);
- ObjectTypeDB::bind_method(_MD("body_add_shape","body","shape","transform"),&PhysicsServer::body_add_shape,DEFVAL(Transform()));
- ObjectTypeDB::bind_method(_MD("body_set_shape","body","shape_idx","shape"),&PhysicsServer::body_set_shape);
- ObjectTypeDB::bind_method(_MD("body_set_shape_transform","body","shape_idx","transform"),&PhysicsServer::body_set_shape_transform);
+ ObjectTypeDB::bind_method(_MD("body_set_collision_mask", "body", "mask"), &PhysicsServer::body_set_collision_mask);
+ ObjectTypeDB::bind_method(_MD("body_get_collision_mask", "body"), &PhysicsServer::body_get_collision_mask);
- ObjectTypeDB::bind_method(_MD("body_get_shape_count","body"),&PhysicsServer::body_get_shape_count);
- ObjectTypeDB::bind_method(_MD("body_get_shape","body","shape_idx"),&PhysicsServer::body_get_shape);
- ObjectTypeDB::bind_method(_MD("body_get_shape_transform","body","shape_idx"),&PhysicsServer::body_get_shape_transform);
+ ObjectTypeDB::bind_method(_MD("body_add_shape", "body", "shape", "transform"), &PhysicsServer::body_add_shape, DEFVAL(Transform()));
+ ObjectTypeDB::bind_method(_MD("body_set_shape", "body", "shape_idx", "shape"), &PhysicsServer::body_set_shape);
+ ObjectTypeDB::bind_method(_MD("body_set_shape_transform", "body", "shape_idx", "transform"), &PhysicsServer::body_set_shape_transform);
- ObjectTypeDB::bind_method(_MD("body_remove_shape","body","shape_idx"),&PhysicsServer::body_remove_shape);
- ObjectTypeDB::bind_method(_MD("body_clear_shapes","body"),&PhysicsServer::body_clear_shapes);
+ ObjectTypeDB::bind_method(_MD("body_get_shape_count", "body"), &PhysicsServer::body_get_shape_count);
+ ObjectTypeDB::bind_method(_MD("body_get_shape", "body", "shape_idx"), &PhysicsServer::body_get_shape);
+ ObjectTypeDB::bind_method(_MD("body_get_shape_transform", "body", "shape_idx"), &PhysicsServer::body_get_shape_transform);
- ObjectTypeDB::bind_method(_MD("body_attach_object_instance_ID","body","id"),&PhysicsServer::body_attach_object_instance_ID);
- ObjectTypeDB::bind_method(_MD("body_get_object_instance_ID","body"),&PhysicsServer::body_get_object_instance_ID);
+ ObjectTypeDB::bind_method(_MD("body_remove_shape", "body", "shape_idx"), &PhysicsServer::body_remove_shape);
+ ObjectTypeDB::bind_method(_MD("body_clear_shapes", "body"), &PhysicsServer::body_clear_shapes);
+ ObjectTypeDB::bind_method(_MD("body_attach_object_instance_ID", "body", "id"), &PhysicsServer::body_attach_object_instance_ID);
+ ObjectTypeDB::bind_method(_MD("body_get_object_instance_ID", "body"), &PhysicsServer::body_get_object_instance_ID);
- ObjectTypeDB::bind_method(_MD("body_set_enable_continuous_collision_detection","body","enable"),&PhysicsServer::body_set_enable_continuous_collision_detection);
- ObjectTypeDB::bind_method(_MD("body_is_continuous_collision_detection_enabled","body"),&PhysicsServer::body_is_continuous_collision_detection_enabled);
-
+ ObjectTypeDB::bind_method(_MD("body_set_enable_continuous_collision_detection", "body", "enable"), &PhysicsServer::body_set_enable_continuous_collision_detection);
+ ObjectTypeDB::bind_method(_MD("body_is_continuous_collision_detection_enabled", "body"), &PhysicsServer::body_is_continuous_collision_detection_enabled);
//ObjectTypeDB::bind_method(_MD("body_set_user_flags","flags""),&PhysicsServer::body_set_shape,DEFVAL(Transform));
//ObjectTypeDB::bind_method(_MD("body_get_user_flags","body","shape_idx","shape"),&PhysicsServer::body_get_shape);
- ObjectTypeDB::bind_method(_MD("body_set_param","body","param","value"),&PhysicsServer::body_set_param);
- ObjectTypeDB::bind_method(_MD("body_get_param","body","param"),&PhysicsServer::body_get_param);
+ ObjectTypeDB::bind_method(_MD("body_set_param", "body", "param", "value"), &PhysicsServer::body_set_param);
+ ObjectTypeDB::bind_method(_MD("body_get_param", "body", "param"), &PhysicsServer::body_get_param);
- ObjectTypeDB::bind_method(_MD("body_set_state","body","state","value"),&PhysicsServer::body_set_state);
- ObjectTypeDB::bind_method(_MD("body_get_state","body","state"),&PhysicsServer::body_get_state);
+ ObjectTypeDB::bind_method(_MD("body_set_state", "body", "state", "value"), &PhysicsServer::body_set_state);
+ ObjectTypeDB::bind_method(_MD("body_get_state", "body", "state"), &PhysicsServer::body_get_state);
- ObjectTypeDB::bind_method(_MD("body_apply_impulse","body","pos","impulse"),&PhysicsServer::body_apply_impulse);
- ObjectTypeDB::bind_method(_MD("body_set_axis_velocity","body","axis_velocity"),&PhysicsServer::body_set_axis_velocity);
+ ObjectTypeDB::bind_method(_MD("body_apply_impulse", "body", "pos", "impulse"), &PhysicsServer::body_apply_impulse);
+ ObjectTypeDB::bind_method(_MD("body_set_axis_velocity", "body", "axis_velocity"), &PhysicsServer::body_set_axis_velocity);
- ObjectTypeDB::bind_method(_MD("body_set_axis_lock","body","axis"),&PhysicsServer::body_set_axis_lock);
- ObjectTypeDB::bind_method(_MD("body_get_axis_lock","body"),&PhysicsServer::body_get_axis_lock);
+ ObjectTypeDB::bind_method(_MD("body_set_axis_lock", "body", "axis"), &PhysicsServer::body_set_axis_lock);
+ ObjectTypeDB::bind_method(_MD("body_get_axis_lock", "body"), &PhysicsServer::body_get_axis_lock);
- ObjectTypeDB::bind_method(_MD("body_add_collision_exception","body","excepted_body"),&PhysicsServer::body_add_collision_exception);
- ObjectTypeDB::bind_method(_MD("body_remove_collision_exception","body","excepted_body"),&PhysicsServer::body_remove_collision_exception);
-// virtual void body_get_collision_exceptions(RID p_body, List<RID> *p_exceptions)=0;
+ ObjectTypeDB::bind_method(_MD("body_add_collision_exception", "body", "excepted_body"), &PhysicsServer::body_add_collision_exception);
+ ObjectTypeDB::bind_method(_MD("body_remove_collision_exception", "body", "excepted_body"), &PhysicsServer::body_remove_collision_exception);
+ // virtual void body_get_collision_exceptions(RID p_body, List<RID> *p_exceptions)=0;
- ObjectTypeDB::bind_method(_MD("body_set_max_contacts_reported","body","amount"),&PhysicsServer::body_set_max_contacts_reported);
- ObjectTypeDB::bind_method(_MD("body_get_max_contacts_reported","body"),&PhysicsServer::body_get_max_contacts_reported);
+ ObjectTypeDB::bind_method(_MD("body_set_max_contacts_reported", "body", "amount"), &PhysicsServer::body_set_max_contacts_reported);
+ ObjectTypeDB::bind_method(_MD("body_get_max_contacts_reported", "body"), &PhysicsServer::body_get_max_contacts_reported);
- ObjectTypeDB::bind_method(_MD("body_set_omit_force_integration","body","enable"),&PhysicsServer::body_set_omit_force_integration);
- ObjectTypeDB::bind_method(_MD("body_is_omitting_force_integration","body"),&PhysicsServer::body_is_omitting_force_integration);
+ ObjectTypeDB::bind_method(_MD("body_set_omit_force_integration", "body", "enable"), &PhysicsServer::body_set_omit_force_integration);
+ ObjectTypeDB::bind_method(_MD("body_is_omitting_force_integration", "body"), &PhysicsServer::body_is_omitting_force_integration);
- ObjectTypeDB::bind_method(_MD("body_set_force_integration_callback","body","receiver","method","userdata"),&PhysicsServer::body_set_force_integration_callback,DEFVAL(Variant()));
+ ObjectTypeDB::bind_method(_MD("body_set_force_integration_callback", "body", "receiver", "method", "userdata"), &PhysicsServer::body_set_force_integration_callback, DEFVAL(Variant()));
- ObjectTypeDB::bind_method(_MD("body_set_ray_pickable","body","enable"),&PhysicsServer::body_set_ray_pickable);
- ObjectTypeDB::bind_method(_MD("body_is_ray_pickable","body"),&PhysicsServer::body_is_ray_pickable);
+ ObjectTypeDB::bind_method(_MD("body_set_ray_pickable", "body", "enable"), &PhysicsServer::body_set_ray_pickable);
+ ObjectTypeDB::bind_method(_MD("body_is_ray_pickable", "body"), &PhysicsServer::body_is_ray_pickable);
/* JOINT API */
- BIND_CONSTANT( JOINT_PIN );
- BIND_CONSTANT( JOINT_HINGE );
- BIND_CONSTANT( JOINT_SLIDER );
- BIND_CONSTANT( JOINT_CONE_TWIST );
- BIND_CONSTANT( JOINT_6DOF );
-
- ObjectTypeDB::bind_method(_MD("joint_create_pin","body_A","local_A","body_B","local_B"),&PhysicsServer::joint_create_pin);
- ObjectTypeDB::bind_method(_MD("pin_joint_set_param","joint","param","value"),&PhysicsServer::pin_joint_set_param);
- ObjectTypeDB::bind_method(_MD("pin_joint_get_param","joint","param"),&PhysicsServer::pin_joint_get_param);
+ BIND_CONSTANT(JOINT_PIN);
+ BIND_CONSTANT(JOINT_HINGE);
+ BIND_CONSTANT(JOINT_SLIDER);
+ BIND_CONSTANT(JOINT_CONE_TWIST);
+ BIND_CONSTANT(JOINT_6DOF);
- ObjectTypeDB::bind_method(_MD("pin_joint_set_local_A","joint","local_A"),&PhysicsServer::pin_joint_set_local_A);
- ObjectTypeDB::bind_method(_MD("pin_joint_get_local_A","joint"),&PhysicsServer::pin_joint_get_local_A);
+ ObjectTypeDB::bind_method(_MD("joint_create_pin", "body_A", "local_A", "body_B", "local_B"), &PhysicsServer::joint_create_pin);
+ ObjectTypeDB::bind_method(_MD("pin_joint_set_param", "joint", "param", "value"), &PhysicsServer::pin_joint_set_param);
+ ObjectTypeDB::bind_method(_MD("pin_joint_get_param", "joint", "param"), &PhysicsServer::pin_joint_get_param);
- ObjectTypeDB::bind_method(_MD("pin_joint_set_local_B","joint","local_B"),&PhysicsServer::pin_joint_set_local_B);
- ObjectTypeDB::bind_method(_MD("pin_joint_get_local_B","joint"),&PhysicsServer::pin_joint_get_local_B);
+ ObjectTypeDB::bind_method(_MD("pin_joint_set_local_A", "joint", "local_A"), &PhysicsServer::pin_joint_set_local_A);
+ ObjectTypeDB::bind_method(_MD("pin_joint_get_local_A", "joint"), &PhysicsServer::pin_joint_get_local_A);
- BIND_CONSTANT(PIN_JOINT_BIAS );
- BIND_CONSTANT(PIN_JOINT_DAMPING );
- BIND_CONSTANT(PIN_JOINT_IMPULSE_CLAMP );
+ ObjectTypeDB::bind_method(_MD("pin_joint_set_local_B", "joint", "local_B"), &PhysicsServer::pin_joint_set_local_B);
+ ObjectTypeDB::bind_method(_MD("pin_joint_get_local_B", "joint"), &PhysicsServer::pin_joint_get_local_B);
+ BIND_CONSTANT(PIN_JOINT_BIAS);
+ BIND_CONSTANT(PIN_JOINT_DAMPING);
+ BIND_CONSTANT(PIN_JOINT_IMPULSE_CLAMP);
BIND_CONSTANT(HINGE_JOINT_BIAS);
BIND_CONSTANT(HINGE_JOINT_LIMIT_UPPER);
@@ -571,92 +531,88 @@ void PhysicsServer::_bind_methods() {
BIND_CONSTANT(HINGE_JOINT_FLAG_USE_LIMIT);
BIND_CONSTANT(HINGE_JOINT_FLAG_ENABLE_MOTOR);
- ObjectTypeDB::bind_method(_MD("joint_create_hinge","body_A","hinge_A","body_B","hinge_B"),&PhysicsServer::joint_create_hinge);
+ ObjectTypeDB::bind_method(_MD("joint_create_hinge", "body_A", "hinge_A", "body_B", "hinge_B"), &PhysicsServer::joint_create_hinge);
- ObjectTypeDB::bind_method(_MD("hinge_joint_set_param","joint","param","value"),&PhysicsServer::hinge_joint_set_param);
- ObjectTypeDB::bind_method(_MD("hinge_joint_get_param","joint","param"),&PhysicsServer::hinge_joint_get_param);
+ ObjectTypeDB::bind_method(_MD("hinge_joint_set_param", "joint", "param", "value"), &PhysicsServer::hinge_joint_set_param);
+ ObjectTypeDB::bind_method(_MD("hinge_joint_get_param", "joint", "param"), &PhysicsServer::hinge_joint_get_param);
- ObjectTypeDB::bind_method(_MD("hinge_joint_set_flag","joint","flag","enabled"),&PhysicsServer::hinge_joint_set_flag);
- ObjectTypeDB::bind_method(_MD("hinge_joint_get_flag","joint","flag"),&PhysicsServer::hinge_joint_get_flag);
+ ObjectTypeDB::bind_method(_MD("hinge_joint_set_flag", "joint", "flag", "enabled"), &PhysicsServer::hinge_joint_set_flag);
+ ObjectTypeDB::bind_method(_MD("hinge_joint_get_flag", "joint", "flag"), &PhysicsServer::hinge_joint_get_flag);
- ObjectTypeDB::bind_method(_MD("joint_create_slider","body_A","local_ref_A","body_B","local_ref_B"),&PhysicsServer::joint_create_slider);
+ ObjectTypeDB::bind_method(_MD("joint_create_slider", "body_A", "local_ref_A", "body_B", "local_ref_B"), &PhysicsServer::joint_create_slider);
- ObjectTypeDB::bind_method(_MD("slider_joint_set_param","joint","param","value"),&PhysicsServer::slider_joint_set_param);
- ObjectTypeDB::bind_method(_MD("slider_joint_get_param","joint","param"),&PhysicsServer::slider_joint_get_param);
+ ObjectTypeDB::bind_method(_MD("slider_joint_set_param", "joint", "param", "value"), &PhysicsServer::slider_joint_set_param);
+ ObjectTypeDB::bind_method(_MD("slider_joint_get_param", "joint", "param"), &PhysicsServer::slider_joint_get_param);
- BIND_CONSTANT( SLIDER_JOINT_LINEAR_LIMIT_UPPER );
- BIND_CONSTANT( SLIDER_JOINT_LINEAR_LIMIT_LOWER );
- BIND_CONSTANT( SLIDER_JOINT_LINEAR_LIMIT_SOFTNESS );
- BIND_CONSTANT( SLIDER_JOINT_LINEAR_LIMIT_RESTITUTION );
- BIND_CONSTANT( SLIDER_JOINT_LINEAR_LIMIT_DAMPING );
- BIND_CONSTANT( SLIDER_JOINT_LINEAR_MOTION_SOFTNESS );
- BIND_CONSTANT( SLIDER_JOINT_LINEAR_MOTION_RESTITUTION );
- BIND_CONSTANT( SLIDER_JOINT_LINEAR_MOTION_DAMPING );
- BIND_CONSTANT( SLIDER_JOINT_LINEAR_ORTHOGONAL_SOFTNESS );
- BIND_CONSTANT( SLIDER_JOINT_LINEAR_ORTHOGONAL_RESTITUTION );
- BIND_CONSTANT( SLIDER_JOINT_LINEAR_ORTHOGONAL_DAMPING );
+ BIND_CONSTANT(SLIDER_JOINT_LINEAR_LIMIT_UPPER);
+ BIND_CONSTANT(SLIDER_JOINT_LINEAR_LIMIT_LOWER);
+ BIND_CONSTANT(SLIDER_JOINT_LINEAR_LIMIT_SOFTNESS);
+ BIND_CONSTANT(SLIDER_JOINT_LINEAR_LIMIT_RESTITUTION);
+ BIND_CONSTANT(SLIDER_JOINT_LINEAR_LIMIT_DAMPING);
+ BIND_CONSTANT(SLIDER_JOINT_LINEAR_MOTION_SOFTNESS);
+ BIND_CONSTANT(SLIDER_JOINT_LINEAR_MOTION_RESTITUTION);
+ BIND_CONSTANT(SLIDER_JOINT_LINEAR_MOTION_DAMPING);
+ BIND_CONSTANT(SLIDER_JOINT_LINEAR_ORTHOGONAL_SOFTNESS);
+ BIND_CONSTANT(SLIDER_JOINT_LINEAR_ORTHOGONAL_RESTITUTION);
+ BIND_CONSTANT(SLIDER_JOINT_LINEAR_ORTHOGONAL_DAMPING);
- BIND_CONSTANT( SLIDER_JOINT_ANGULAR_LIMIT_UPPER );
- BIND_CONSTANT( SLIDER_JOINT_ANGULAR_LIMIT_LOWER );
- BIND_CONSTANT( SLIDER_JOINT_ANGULAR_LIMIT_SOFTNESS );
- BIND_CONSTANT( SLIDER_JOINT_ANGULAR_LIMIT_RESTITUTION );
- BIND_CONSTANT( SLIDER_JOINT_ANGULAR_LIMIT_DAMPING );
- BIND_CONSTANT( SLIDER_JOINT_ANGULAR_MOTION_SOFTNESS );
- BIND_CONSTANT( SLIDER_JOINT_ANGULAR_MOTION_RESTITUTION );
- BIND_CONSTANT( SLIDER_JOINT_ANGULAR_MOTION_DAMPING );
- BIND_CONSTANT( SLIDER_JOINT_ANGULAR_ORTHOGONAL_SOFTNESS );
- BIND_CONSTANT( SLIDER_JOINT_ANGULAR_ORTHOGONAL_RESTITUTION );
- BIND_CONSTANT( SLIDER_JOINT_ANGULAR_ORTHOGONAL_DAMPING );
- BIND_CONSTANT( SLIDER_JOINT_MAX );
+ BIND_CONSTANT(SLIDER_JOINT_ANGULAR_LIMIT_UPPER);
+ BIND_CONSTANT(SLIDER_JOINT_ANGULAR_LIMIT_LOWER);
+ BIND_CONSTANT(SLIDER_JOINT_ANGULAR_LIMIT_SOFTNESS);
+ BIND_CONSTANT(SLIDER_JOINT_ANGULAR_LIMIT_RESTITUTION);
+ BIND_CONSTANT(SLIDER_JOINT_ANGULAR_LIMIT_DAMPING);
+ BIND_CONSTANT(SLIDER_JOINT_ANGULAR_MOTION_SOFTNESS);
+ BIND_CONSTANT(SLIDER_JOINT_ANGULAR_MOTION_RESTITUTION);
+ BIND_CONSTANT(SLIDER_JOINT_ANGULAR_MOTION_DAMPING);
+ BIND_CONSTANT(SLIDER_JOINT_ANGULAR_ORTHOGONAL_SOFTNESS);
+ BIND_CONSTANT(SLIDER_JOINT_ANGULAR_ORTHOGONAL_RESTITUTION);
+ BIND_CONSTANT(SLIDER_JOINT_ANGULAR_ORTHOGONAL_DAMPING);
+ BIND_CONSTANT(SLIDER_JOINT_MAX);
+ ObjectTypeDB::bind_method(_MD("joint_create_cone_twist", "body_A", "local_ref_A", "body_B", "local_ref_B"), &PhysicsServer::joint_create_cone_twist);
- ObjectTypeDB::bind_method(_MD("joint_create_cone_twist","body_A","local_ref_A","body_B","local_ref_B"),&PhysicsServer::joint_create_cone_twist);
+ ObjectTypeDB::bind_method(_MD("cone_twist_joint_set_param", "joint", "param", "value"), &PhysicsServer::cone_twist_joint_set_param);
+ ObjectTypeDB::bind_method(_MD("cone_twist_joint_get_param", "joint", "param"), &PhysicsServer::cone_twist_joint_get_param);
- ObjectTypeDB::bind_method(_MD("cone_twist_joint_set_param","joint","param","value"),&PhysicsServer::cone_twist_joint_set_param);
- ObjectTypeDB::bind_method(_MD("cone_twist_joint_get_param","joint","param"),&PhysicsServer::cone_twist_joint_get_param);
+ BIND_CONSTANT(CONE_TWIST_JOINT_SWING_SPAN);
+ BIND_CONSTANT(CONE_TWIST_JOINT_TWIST_SPAN);
+ BIND_CONSTANT(CONE_TWIST_JOINT_BIAS);
+ BIND_CONSTANT(CONE_TWIST_JOINT_SOFTNESS);
+ BIND_CONSTANT(CONE_TWIST_JOINT_RELAXATION);
- BIND_CONSTANT( CONE_TWIST_JOINT_SWING_SPAN );
- BIND_CONSTANT( CONE_TWIST_JOINT_TWIST_SPAN );
- BIND_CONSTANT( CONE_TWIST_JOINT_BIAS );
- BIND_CONSTANT( CONE_TWIST_JOINT_SOFTNESS );
- BIND_CONSTANT( CONE_TWIST_JOINT_RELAXATION );
+ BIND_CONSTANT(G6DOF_JOINT_LINEAR_LOWER_LIMIT);
+ BIND_CONSTANT(G6DOF_JOINT_LINEAR_UPPER_LIMIT);
+ BIND_CONSTANT(G6DOF_JOINT_LINEAR_LIMIT_SOFTNESS);
+ BIND_CONSTANT(G6DOF_JOINT_LINEAR_RESTITUTION);
+ BIND_CONSTANT(G6DOF_JOINT_LINEAR_DAMPING);
+ BIND_CONSTANT(G6DOF_JOINT_ANGULAR_LOWER_LIMIT);
+ BIND_CONSTANT(G6DOF_JOINT_ANGULAR_UPPER_LIMIT);
+ BIND_CONSTANT(G6DOF_JOINT_ANGULAR_LIMIT_SOFTNESS);
+ BIND_CONSTANT(G6DOF_JOINT_ANGULAR_DAMPING);
+ BIND_CONSTANT(G6DOF_JOINT_ANGULAR_RESTITUTION);
+ BIND_CONSTANT(G6DOF_JOINT_ANGULAR_FORCE_LIMIT);
+ BIND_CONSTANT(G6DOF_JOINT_ANGULAR_ERP);
+ BIND_CONSTANT(G6DOF_JOINT_ANGULAR_MOTOR_TARGET_VELOCITY);
+ BIND_CONSTANT(G6DOF_JOINT_ANGULAR_MOTOR_FORCE_LIMIT);
+ BIND_CONSTANT(G6DOF_JOINT_FLAG_ENABLE_LINEAR_LIMIT);
+ BIND_CONSTANT(G6DOF_JOINT_FLAG_ENABLE_ANGULAR_LIMIT);
+ BIND_CONSTANT(G6DOF_JOINT_FLAG_ENABLE_MOTOR);
- BIND_CONSTANT( G6DOF_JOINT_LINEAR_LOWER_LIMIT );
- BIND_CONSTANT( G6DOF_JOINT_LINEAR_UPPER_LIMIT );
- BIND_CONSTANT( G6DOF_JOINT_LINEAR_LIMIT_SOFTNESS );
- BIND_CONSTANT( G6DOF_JOINT_LINEAR_RESTITUTION );
- BIND_CONSTANT( G6DOF_JOINT_LINEAR_DAMPING );
- BIND_CONSTANT( G6DOF_JOINT_ANGULAR_LOWER_LIMIT );
- BIND_CONSTANT( G6DOF_JOINT_ANGULAR_UPPER_LIMIT );
- BIND_CONSTANT( G6DOF_JOINT_ANGULAR_LIMIT_SOFTNESS );
- BIND_CONSTANT( G6DOF_JOINT_ANGULAR_DAMPING );
- BIND_CONSTANT( G6DOF_JOINT_ANGULAR_RESTITUTION );
- BIND_CONSTANT( G6DOF_JOINT_ANGULAR_FORCE_LIMIT );
- BIND_CONSTANT( G6DOF_JOINT_ANGULAR_ERP );
- BIND_CONSTANT( G6DOF_JOINT_ANGULAR_MOTOR_TARGET_VELOCITY );
- BIND_CONSTANT( G6DOF_JOINT_ANGULAR_MOTOR_FORCE_LIMIT );
+ ObjectTypeDB::bind_method(_MD("joint_get_type", "joint"), &PhysicsServer::joint_get_type);
+ ObjectTypeDB::bind_method(_MD("joint_set_solver_priority", "joint", "priority"), &PhysicsServer::joint_set_solver_priority);
+ ObjectTypeDB::bind_method(_MD("joint_get_solver_priority", "joint"), &PhysicsServer::joint_get_solver_priority);
- BIND_CONSTANT( G6DOF_JOINT_FLAG_ENABLE_LINEAR_LIMIT );
- BIND_CONSTANT( G6DOF_JOINT_FLAG_ENABLE_ANGULAR_LIMIT );
- BIND_CONSTANT( G6DOF_JOINT_FLAG_ENABLE_MOTOR );
+ ObjectTypeDB::bind_method(_MD("joint_create_generic_6dof", "body_A", "local_ref_A", "body_B", "local_ref_B"), &PhysicsServer::joint_create_generic_6dof);
- ObjectTypeDB::bind_method(_MD("joint_get_type","joint"),&PhysicsServer::joint_get_type);
-
- ObjectTypeDB::bind_method(_MD("joint_set_solver_priority","joint","priority"),&PhysicsServer::joint_set_solver_priority);
- ObjectTypeDB::bind_method(_MD("joint_get_solver_priority","joint"),&PhysicsServer::joint_get_solver_priority);
-
- ObjectTypeDB::bind_method(_MD("joint_create_generic_6dof","body_A","local_ref_A","body_B","local_ref_B"),&PhysicsServer::joint_create_generic_6dof);
-
- ObjectTypeDB::bind_method(_MD("generic_6dof_joint_set_param","joint","axis","param","value"),&PhysicsServer::generic_6dof_joint_set_param);
- ObjectTypeDB::bind_method(_MD("generic_6dof_joint_get_param","joint","axis","param"),&PhysicsServer::generic_6dof_joint_get_param);
+ ObjectTypeDB::bind_method(_MD("generic_6dof_joint_set_param", "joint", "axis", "param", "value"), &PhysicsServer::generic_6dof_joint_set_param);
+ ObjectTypeDB::bind_method(_MD("generic_6dof_joint_get_param", "joint", "axis", "param"), &PhysicsServer::generic_6dof_joint_get_param);
- ObjectTypeDB::bind_method(_MD("generic_6dof_joint_set_flag","joint","axis","flag","enable"),&PhysicsServer::generic_6dof_joint_set_flag);
- ObjectTypeDB::bind_method(_MD("generic_6dof_joint_get_flag","joint","axis","flag"),&PhysicsServer::generic_6dof_joint_get_flag);
+ ObjectTypeDB::bind_method(_MD("generic_6dof_joint_set_flag", "joint", "axis", "flag", "enable"), &PhysicsServer::generic_6dof_joint_set_flag);
+ ObjectTypeDB::bind_method(_MD("generic_6dof_joint_get_flag", "joint", "axis", "flag"), &PhysicsServer::generic_6dof_joint_get_flag);
-
-/*
+ /*
ObjectTypeDB::bind_method(_MD("joint_set_param","joint","param","value"),&PhysicsServer::joint_set_param);
ObjectTypeDB::bind_method(_MD("joint_get_param","joint","param"),&PhysicsServer::joint_get_param);
@@ -669,63 +625,61 @@ void PhysicsServer::_bind_methods() {
ObjectTypeDB::bind_method(_MD("joint_get_type","joint"),&PhysicsServer::joint_get_type);
*/
- ObjectTypeDB::bind_method(_MD("free_rid","rid"),&PhysicsServer::free);
+ ObjectTypeDB::bind_method(_MD("free_rid", "rid"), &PhysicsServer::free);
- ObjectTypeDB::bind_method(_MD("set_active","active"),&PhysicsServer::set_active);
+ ObjectTypeDB::bind_method(_MD("set_active", "active"), &PhysicsServer::set_active);
-// ObjectTypeDB::bind_method(_MD("init"),&PhysicsServer::init);
-// ObjectTypeDB::bind_method(_MD("step"),&PhysicsServer::step);
-// ObjectTypeDB::bind_method(_MD("sync"),&PhysicsServer::sync);
+ // ObjectTypeDB::bind_method(_MD("init"),&PhysicsServer::init);
+ // ObjectTypeDB::bind_method(_MD("step"),&PhysicsServer::step);
+ // ObjectTypeDB::bind_method(_MD("sync"),&PhysicsServer::sync);
//ObjectTypeDB::bind_method(_MD("flush_queries"),&PhysicsServer::flush_queries);
+ ObjectTypeDB::bind_method(_MD("get_process_info", "process_info"), &PhysicsServer::get_process_info);
- ObjectTypeDB::bind_method(_MD("get_process_info","process_info"),&PhysicsServer::get_process_info);
-
- BIND_CONSTANT( SHAPE_PLANE );
- BIND_CONSTANT( SHAPE_RAY );
- BIND_CONSTANT( SHAPE_SPHERE );
- BIND_CONSTANT( SHAPE_BOX );
- BIND_CONSTANT( SHAPE_CAPSULE );
- BIND_CONSTANT( SHAPE_CONVEX_POLYGON );
- BIND_CONSTANT( SHAPE_CONCAVE_POLYGON );
- BIND_CONSTANT( SHAPE_HEIGHTMAP );
- BIND_CONSTANT( SHAPE_CUSTOM );
+ BIND_CONSTANT(SHAPE_PLANE);
+ BIND_CONSTANT(SHAPE_RAY);
+ BIND_CONSTANT(SHAPE_SPHERE);
+ BIND_CONSTANT(SHAPE_BOX);
+ BIND_CONSTANT(SHAPE_CAPSULE);
+ BIND_CONSTANT(SHAPE_CONVEX_POLYGON);
+ BIND_CONSTANT(SHAPE_CONCAVE_POLYGON);
+ BIND_CONSTANT(SHAPE_HEIGHTMAP);
+ BIND_CONSTANT(SHAPE_CUSTOM);
+ BIND_CONSTANT(AREA_PARAM_GRAVITY);
+ BIND_CONSTANT(AREA_PARAM_GRAVITY_VECTOR);
+ BIND_CONSTANT(AREA_PARAM_GRAVITY_IS_POINT);
+ BIND_CONSTANT(AREA_PARAM_GRAVITY_DISTANCE_SCALE);
+ BIND_CONSTANT(AREA_PARAM_GRAVITY_POINT_ATTENUATION);
+ BIND_CONSTANT(AREA_PARAM_LINEAR_DAMP);
+ BIND_CONSTANT(AREA_PARAM_ANGULAR_DAMP);
+ BIND_CONSTANT(AREA_PARAM_PRIORITY);
- BIND_CONSTANT( AREA_PARAM_GRAVITY );
- BIND_CONSTANT( AREA_PARAM_GRAVITY_VECTOR );
- BIND_CONSTANT( AREA_PARAM_GRAVITY_IS_POINT );
- BIND_CONSTANT( AREA_PARAM_GRAVITY_DISTANCE_SCALE );
- BIND_CONSTANT( AREA_PARAM_GRAVITY_POINT_ATTENUATION );
- BIND_CONSTANT( AREA_PARAM_LINEAR_DAMP );
- BIND_CONSTANT( AREA_PARAM_ANGULAR_DAMP );
- BIND_CONSTANT( AREA_PARAM_PRIORITY );
+ BIND_CONSTANT(AREA_SPACE_OVERRIDE_DISABLED);
+ BIND_CONSTANT(AREA_SPACE_OVERRIDE_COMBINE);
+ BIND_CONSTANT(AREA_SPACE_OVERRIDE_COMBINE_REPLACE);
+ BIND_CONSTANT(AREA_SPACE_OVERRIDE_REPLACE);
+ BIND_CONSTANT(AREA_SPACE_OVERRIDE_REPLACE_COMBINE);
- BIND_CONSTANT( AREA_SPACE_OVERRIDE_DISABLED );
- BIND_CONSTANT( AREA_SPACE_OVERRIDE_COMBINE );
- BIND_CONSTANT( AREA_SPACE_OVERRIDE_COMBINE_REPLACE );
- BIND_CONSTANT( AREA_SPACE_OVERRIDE_REPLACE );
- BIND_CONSTANT( AREA_SPACE_OVERRIDE_REPLACE_COMBINE );
+ BIND_CONSTANT(BODY_MODE_STATIC);
+ BIND_CONSTANT(BODY_MODE_KINEMATIC);
+ BIND_CONSTANT(BODY_MODE_RIGID);
+ BIND_CONSTANT(BODY_MODE_CHARACTER);
- BIND_CONSTANT( BODY_MODE_STATIC );
- BIND_CONSTANT( BODY_MODE_KINEMATIC );
- BIND_CONSTANT( BODY_MODE_RIGID );
- BIND_CONSTANT( BODY_MODE_CHARACTER );
+ BIND_CONSTANT(BODY_PARAM_BOUNCE);
+ BIND_CONSTANT(BODY_PARAM_FRICTION);
+ BIND_CONSTANT(BODY_PARAM_MASS);
+ BIND_CONSTANT(BODY_PARAM_GRAVITY_SCALE);
+ BIND_CONSTANT(BODY_PARAM_ANGULAR_DAMP);
+ BIND_CONSTANT(BODY_PARAM_LINEAR_DAMP);
+ BIND_CONSTANT(BODY_PARAM_MAX);
- BIND_CONSTANT( BODY_PARAM_BOUNCE );
- BIND_CONSTANT( BODY_PARAM_FRICTION );
- BIND_CONSTANT( BODY_PARAM_MASS );
- BIND_CONSTANT( BODY_PARAM_GRAVITY_SCALE );
- BIND_CONSTANT( BODY_PARAM_ANGULAR_DAMP );
- BIND_CONSTANT( BODY_PARAM_LINEAR_DAMP );
- BIND_CONSTANT( BODY_PARAM_MAX );
-
- BIND_CONSTANT( BODY_STATE_TRANSFORM );
- BIND_CONSTANT( BODY_STATE_LINEAR_VELOCITY );
- BIND_CONSTANT( BODY_STATE_ANGULAR_VELOCITY );
- BIND_CONSTANT( BODY_STATE_SLEEPING );
- BIND_CONSTANT( BODY_STATE_CAN_SLEEP );
-/*
+ BIND_CONSTANT(BODY_STATE_TRANSFORM);
+ BIND_CONSTANT(BODY_STATE_LINEAR_VELOCITY);
+ BIND_CONSTANT(BODY_STATE_ANGULAR_VELOCITY);
+ BIND_CONSTANT(BODY_STATE_SLEEPING);
+ BIND_CONSTANT(BODY_STATE_CAN_SLEEP);
+ /*
BIND_CONSTANT( JOINT_PIN );
BIND_CONSTANT( JOINT_GROOVE );
BIND_CONSTANT( JOINT_DAMPED_SPRING );
@@ -734,29 +688,24 @@ void PhysicsServer::_bind_methods() {
BIND_CONSTANT( DAMPED_STRING_STIFFNESS );
BIND_CONSTANT( DAMPED_STRING_DAMPING );
*/
-// BIND_CONSTANT( TYPE_BODY );
-// BIND_CONSTANT( TYPE_AREA );
-
- BIND_CONSTANT( AREA_BODY_ADDED );
- BIND_CONSTANT( AREA_BODY_REMOVED );
-
- BIND_CONSTANT( INFO_ACTIVE_OBJECTS );
- BIND_CONSTANT( INFO_COLLISION_PAIRS );
- BIND_CONSTANT( INFO_ISLAND_COUNT );
-
+ // BIND_CONSTANT( TYPE_BODY );
+ // BIND_CONSTANT( TYPE_AREA );
+ BIND_CONSTANT(AREA_BODY_ADDED);
+ BIND_CONSTANT(AREA_BODY_REMOVED);
+ BIND_CONSTANT(INFO_ACTIVE_OBJECTS);
+ BIND_CONSTANT(INFO_COLLISION_PAIRS);
+ BIND_CONSTANT(INFO_ISLAND_COUNT);
}
-
PhysicsServer::PhysicsServer() {
- ERR_FAIL_COND( singleton!=NULL );
- singleton=this;
+ ERR_FAIL_COND(singleton != NULL);
+ singleton = this;
}
PhysicsServer::~PhysicsServer() {
- singleton=NULL;
+ singleton = NULL;
}
-
diff --git a/servers/physics_server.h b/servers/physics_server.h
index a839b734b..8b77cfc3f 100644
--- a/servers/physics_server.h
+++ b/servers/physics_server.h
@@ -36,78 +36,78 @@ class PhysicsDirectSpaceState;
class PhysicsDirectBodyState : public Object {
- OBJ_TYPE( PhysicsDirectBodyState, Object );
+ OBJ_TYPE(PhysicsDirectBodyState, Object);
+
protected:
static void _bind_methods();
-public:
- virtual Vector3 get_total_gravity() const=0;
- virtual float get_total_angular_damp() const=0;
- virtual float get_total_linear_damp() const=0;
+public:
+ virtual Vector3 get_total_gravity() const = 0;
+ virtual float get_total_angular_damp() const = 0;
+ virtual float get_total_linear_damp() const = 0;
- virtual float get_inverse_mass() const=0; // get the mass
- virtual Vector3 get_inverse_inertia() const=0; // get density of this body space
- virtual Matrix3 get_inverse_inertia_tensor() const=0; // get density of this body space
+ virtual float get_inverse_mass() const = 0; // get the mass
+ virtual Vector3 get_inverse_inertia() const = 0; // get density of this body space
+ virtual Matrix3 get_inverse_inertia_tensor() const = 0; // get density of this body space
- virtual void set_linear_velocity(const Vector3& p_velocity)=0;
- virtual Vector3 get_linear_velocity() const=0;
+ virtual void set_linear_velocity(const Vector3 &p_velocity) = 0;
+ virtual Vector3 get_linear_velocity() const = 0;
- virtual void set_angular_velocity(const Vector3& p_velocity)=0;
- virtual Vector3 get_angular_velocity() const=0;
+ virtual void set_angular_velocity(const Vector3 &p_velocity) = 0;
+ virtual Vector3 get_angular_velocity() const = 0;
- virtual void set_transform(const Transform& p_transform)=0;
- virtual Transform get_transform() const=0;
+ virtual void set_transform(const Transform &p_transform) = 0;
+ virtual Transform get_transform() const = 0;
- virtual void add_force(const Vector3& p_force, const Vector3& p_pos)=0;
- virtual void apply_impulse(const Vector3& p_pos, const Vector3& p_j)=0;
+ virtual void add_force(const Vector3 &p_force, const Vector3 &p_pos) = 0;
+ virtual void apply_impulse(const Vector3 &p_pos, const Vector3 &p_j) = 0;
- virtual void set_sleep_state(bool p_enable)=0;
- virtual bool is_sleeping() const=0;
+ virtual void set_sleep_state(bool p_enable) = 0;
+ virtual bool is_sleeping() const = 0;
- virtual int get_contact_count() const=0;
+ virtual int get_contact_count() const = 0;
- virtual Vector3 get_contact_local_pos(int p_contact_idx) const=0;
- virtual Vector3 get_contact_local_normal(int p_contact_idx) const=0;
- virtual int get_contact_local_shape(int p_contact_idx) const=0;
+ virtual Vector3 get_contact_local_pos(int p_contact_idx) const = 0;
+ virtual Vector3 get_contact_local_normal(int p_contact_idx) const = 0;
+ virtual int get_contact_local_shape(int p_contact_idx) const = 0;
- virtual RID get_contact_collider(int p_contact_idx) const=0;
- virtual Vector3 get_contact_collider_pos(int p_contact_idx) const=0;
- virtual ObjectID get_contact_collider_id(int p_contact_idx) const=0;
- virtual Object* get_contact_collider_object(int p_contact_idx) const;
- virtual int get_contact_collider_shape(int p_contact_idx) const=0;
- virtual Vector3 get_contact_collider_velocity_at_pos(int p_contact_idx) const=0;
+ virtual RID get_contact_collider(int p_contact_idx) const = 0;
+ virtual Vector3 get_contact_collider_pos(int p_contact_idx) const = 0;
+ virtual ObjectID get_contact_collider_id(int p_contact_idx) const = 0;
+ virtual Object *get_contact_collider_object(int p_contact_idx) const;
+ virtual int get_contact_collider_shape(int p_contact_idx) const = 0;
+ virtual Vector3 get_contact_collider_velocity_at_pos(int p_contact_idx) const = 0;
- virtual real_t get_step() const=0;
+ virtual real_t get_step() const = 0;
virtual void integrate_forces();
- virtual PhysicsDirectSpaceState* get_space_state()=0;
+ virtual PhysicsDirectSpaceState *get_space_state() = 0;
PhysicsDirectBodyState();
};
-
class PhysicsShapeQueryResult;
class PhysicsShapeQueryParameters : public Reference {
OBJ_TYPE(PhysicsShapeQueryParameters, Reference);
-friend class PhysicsDirectSpaceState;
+ friend class PhysicsDirectSpaceState;
RID shape;
Transform transform;
float margin;
Set<RID> exclude;
uint32_t layer_mask;
uint32_t object_type_mask;
+
protected:
static void _bind_methods();
-public:
-
- void set_shape(const RES& p_shape);
- void set_shape_rid(const RID& p_shape);
+public:
+ void set_shape(const RES &p_shape);
+ void set_shape_rid(const RID &p_shape);
RID get_shape_rid() const;
- void set_transform(const Transform& p_transform);
+ void set_transform(const Transform &p_transform);
Transform get_transform() const;
void set_margin(float p_margin);
@@ -119,47 +119,39 @@ public:
void set_object_type_mask(int p_object_type_mask);
int get_object_type_mask() const;
- void set_exclude(const Vector<RID>& p_exclude);
+ void set_exclude(const Vector<RID> &p_exclude);
Vector<RID> get_exclude() const;
PhysicsShapeQueryParameters();
-
};
-
-
class PhysicsDirectSpaceState : public Object {
- OBJ_TYPE( PhysicsDirectSpaceState, Object );
+ OBJ_TYPE(PhysicsDirectSpaceState, Object);
-// Variant _intersect_ray(const Vector3& p_from, const Vector3& p_to,const Vector<RID>& p_exclude=Vector<RID>(),uint32_t p_collision_mask=0);
-// Variant _intersect_shape(const RID& p_shape, const Transform& p_xform,int p_result_max=64,const Vector<RID>& p_exclude=Vector<RID>(),uint32_t p_collision_mask=0);
+ // Variant _intersect_ray(const Vector3& p_from, const Vector3& p_to,const Vector<RID>& p_exclude=Vector<RID>(),uint32_t p_collision_mask=0);
+ // Variant _intersect_shape(const RID& p_shape, const Transform& p_xform,int p_result_max=64,const Vector<RID>& p_exclude=Vector<RID>(),uint32_t p_collision_mask=0);
public:
-
enum ObjectTypeMask {
- TYPE_MASK_STATIC_BODY=1<<0,
- TYPE_MASK_KINEMATIC_BODY=1<<1,
- TYPE_MASK_RIGID_BODY=1<<2,
- TYPE_MASK_CHARACTER_BODY=1<<3,
- TYPE_MASK_AREA=1<<4,
- TYPE_MASK_COLLISION=TYPE_MASK_STATIC_BODY|TYPE_MASK_CHARACTER_BODY|TYPE_MASK_KINEMATIC_BODY|TYPE_MASK_RIGID_BODY
+ TYPE_MASK_STATIC_BODY = 1 << 0,
+ TYPE_MASK_KINEMATIC_BODY = 1 << 1,
+ TYPE_MASK_RIGID_BODY = 1 << 2,
+ TYPE_MASK_CHARACTER_BODY = 1 << 3,
+ TYPE_MASK_AREA = 1 << 4,
+ TYPE_MASK_COLLISION = TYPE_MASK_STATIC_BODY | TYPE_MASK_CHARACTER_BODY | TYPE_MASK_KINEMATIC_BODY | TYPE_MASK_RIGID_BODY
};
-
private:
- Dictionary _intersect_ray(const Vector3& p_from, const Vector3& p_to,const Vector<RID>& p_exclude=Vector<RID>(),uint32_t p_layers=0,uint32_t p_object_type_mask=TYPE_MASK_COLLISION);
- Array _intersect_shape(const Ref<PhysicsShapeQueryParameters> &p_shape_query,int p_max_results=32);
- Array _cast_motion(const Ref<PhysicsShapeQueryParameters> &p_shape_query,const Vector3& p_motion);
- Array _collide_shape(const Ref<PhysicsShapeQueryParameters> &p_shape_query,int p_max_results=32);
+ Dictionary _intersect_ray(const Vector3 &p_from, const Vector3 &p_to, const Vector<RID> &p_exclude = Vector<RID>(), uint32_t p_layers = 0, uint32_t p_object_type_mask = TYPE_MASK_COLLISION);
+ Array _intersect_shape(const Ref<PhysicsShapeQueryParameters> &p_shape_query, int p_max_results = 32);
+ Array _cast_motion(const Ref<PhysicsShapeQueryParameters> &p_shape_query, const Vector3 &p_motion);
+ Array _collide_shape(const Ref<PhysicsShapeQueryParameters> &p_shape_query, int p_max_results = 32);
Dictionary _get_rest_info(const Ref<PhysicsShapeQueryParameters> &p_shape_query);
-
protected:
static void _bind_methods();
public:
-
-
struct RayResult {
Vector3 position;
@@ -170,7 +162,7 @@ public:
int shape;
};
- virtual bool intersect_ray(const Vector3& p_from, const Vector3& p_to,RayResult &r_result,const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION,bool p_pick_ray=false)=0;
+ virtual bool intersect_ray(const Vector3 &p_from, const Vector3 &p_to, RayResult &r_result, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION, bool p_pick_ray = false) = 0;
struct ShapeResult {
@@ -178,10 +170,9 @@ public:
ObjectID collider_id;
Object *collider;
int shape;
-
};
- virtual int intersect_shape(const RID& p_shape, const Transform& p_xform,float p_margin,ShapeResult *r_results,int p_result_max,const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION)=0;
+ virtual int intersect_shape(const RID &p_shape, const Transform &p_xform, float p_margin, ShapeResult *r_results, int p_result_max, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION) = 0;
struct ShapeRestInfo {
@@ -191,55 +182,49 @@ public:
ObjectID collider_id;
int shape;
Vector3 linear_velocity; //velocity at contact point
-
};
- virtual bool cast_motion(const RID& p_shape, const Transform& p_xform,const Vector3& p_motion,float p_margin,float &p_closest_safe,float &p_closest_unsafe, const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION,ShapeRestInfo *r_info=NULL)=0;
-
- virtual bool collide_shape(RID p_shape, const Transform& p_shape_xform,float p_margin,Vector3 *r_results,int p_result_max,int &r_result_count, const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION)=0;
+ virtual bool cast_motion(const RID &p_shape, const Transform &p_xform, const Vector3 &p_motion, float p_margin, float &p_closest_safe, float &p_closest_unsafe, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION, ShapeRestInfo *r_info = NULL) = 0;
- virtual bool rest_info(RID p_shape, const Transform& p_shape_xform,float p_margin,ShapeRestInfo *r_info, const Set<RID>& p_exclude=Set<RID>(),uint32_t p_layer_mask=0xFFFFFFFF,uint32_t p_object_type_mask=TYPE_MASK_COLLISION)=0;
+ virtual bool collide_shape(RID p_shape, const Transform &p_shape_xform, float p_margin, Vector3 *r_results, int p_result_max, int &r_result_count, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION) = 0;
+ virtual bool rest_info(RID p_shape, const Transform &p_shape_xform, float p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude = Set<RID>(), uint32_t p_layer_mask = 0xFFFFFFFF, uint32_t p_object_type_mask = TYPE_MASK_COLLISION) = 0;
PhysicsDirectSpaceState();
};
-
class PhysicsShapeQueryResult : public Reference {
- OBJ_TYPE( PhysicsShapeQueryResult, Reference );
+ OBJ_TYPE(PhysicsShapeQueryResult, Reference);
Vector<PhysicsDirectSpaceState::ShapeResult> result;
-friend class PhysicsDirectSpaceState;
+ friend class PhysicsDirectSpaceState;
protected:
static void _bind_methods();
-public:
+public:
int get_result_count() const;
RID get_result_rid(int p_idx) const;
ObjectID get_result_object_id(int p_idx) const;
- Object* get_result_object(int p_idx) const;
+ Object *get_result_object(int p_idx) const;
int get_result_object_shape(int p_idx) const;
PhysicsShapeQueryResult();
};
-
class PhysicsServer : public Object {
- OBJ_TYPE( PhysicsServer, Object );
-
- static PhysicsServer * singleton;
+ OBJ_TYPE(PhysicsServer, Object);
+ static PhysicsServer *singleton;
protected:
static void _bind_methods();
public:
-
- static PhysicsServer * get_singleton();
+ static PhysicsServer *get_singleton();
enum ShapeType {
SHAPE_PLANE, ///< plane:"plane"
@@ -253,20 +238,19 @@ public:
SHAPE_CUSTOM, ///< Server-Implementation based custom shape, calling shape_create() with this value will result in an error
};
- virtual RID shape_create(ShapeType p_shape)=0;
- virtual void shape_set_data(RID p_shape, const Variant& p_data)=0;
- virtual void shape_set_custom_solver_bias(RID p_shape, real_t p_bias)=0;
-
- virtual ShapeType shape_get_type(RID p_shape) const=0;
- virtual Variant shape_get_data(RID p_shape) const=0;
- virtual real_t shape_get_custom_solver_bias(RID p_shape) const=0;
+ virtual RID shape_create(ShapeType p_shape) = 0;
+ virtual void shape_set_data(RID p_shape, const Variant &p_data) = 0;
+ virtual void shape_set_custom_solver_bias(RID p_shape, real_t p_bias) = 0;
+ virtual ShapeType shape_get_type(RID p_shape) const = 0;
+ virtual Variant shape_get_data(RID p_shape) const = 0;
+ virtual real_t shape_get_custom_solver_bias(RID p_shape) const = 0;
/* SPACE API */
- virtual RID space_create()=0;
- virtual void space_set_active(RID p_space,bool p_active)=0;
- virtual bool space_is_active(RID p_space) const=0;
+ virtual RID space_create() = 0;
+ virtual void space_set_active(RID p_space, bool p_active) = 0;
+ virtual bool space_is_active(RID p_space) const = 0;
enum SpaceParameter {
@@ -280,15 +264,15 @@ public:
SPACE_PARAM_CONSTRAINT_DEFAULT_BIAS,
};
- virtual void space_set_param(RID p_space,SpaceParameter p_param, real_t p_value)=0;
- virtual real_t space_get_param(RID p_space,SpaceParameter p_param) const=0;
+ virtual void space_set_param(RID p_space, SpaceParameter p_param, real_t p_value) = 0;
+ virtual real_t space_get_param(RID p_space, SpaceParameter p_param) const = 0;
// this function only works on fixed process, errors and returns null otherwise
- virtual PhysicsDirectSpaceState* space_get_direct_state(RID p_space)=0;
+ virtual PhysicsDirectSpaceState *space_get_direct_state(RID p_space) = 0;
- virtual void space_set_debug_contacts(RID p_space,int p_max_contacts)=0;
- virtual Vector<Vector3> space_get_contacts(RID p_space) const=0;
- virtual int space_get_contact_count(RID p_space) const=0;
+ virtual void space_set_debug_contacts(RID p_space, int p_max_contacts) = 0;
+ virtual Vector<Vector3> space_get_contacts(RID p_space) const = 0;
+ virtual int space_get_contact_count(RID p_space) const = 0;
//missing space parameters
@@ -296,8 +280,6 @@ public:
//missing attenuation? missing better override?
-
-
enum AreaParameter {
AREA_PARAM_GRAVITY,
AREA_PARAM_GRAVITY_VECTOR,
@@ -309,11 +291,10 @@ public:
AREA_PARAM_PRIORITY
};
- virtual RID area_create()=0;
-
- virtual void area_set_space(RID p_area, RID p_space)=0;
- virtual RID area_get_space(RID p_area) const=0;
+ virtual RID area_create() = 0;
+ virtual void area_set_space(RID p_area, RID p_space) = 0;
+ virtual RID area_get_space(RID p_area) const = 0;
enum AreaSpaceOverrideMode {
AREA_SPACE_OVERRIDE_DISABLED,
@@ -323,39 +304,39 @@ public:
AREA_SPACE_OVERRIDE_REPLACE_COMBINE
};
- virtual void area_set_space_override_mode(RID p_area, AreaSpaceOverrideMode p_mode)=0;
- virtual AreaSpaceOverrideMode area_get_space_override_mode(RID p_area) const=0;
+ virtual void area_set_space_override_mode(RID p_area, AreaSpaceOverrideMode p_mode) = 0;
+ virtual AreaSpaceOverrideMode area_get_space_override_mode(RID p_area) const = 0;
- virtual void area_add_shape(RID p_area, RID p_shape, const Transform& p_transform=Transform())=0;
- virtual void area_set_shape(RID p_area, int p_shape_idx,RID p_shape)=0;
- virtual void area_set_shape_transform(RID p_area, int p_shape_idx, const Transform& p_transform)=0;
+ virtual void area_add_shape(RID p_area, RID p_shape, const Transform &p_transform = Transform()) = 0;
+ virtual void area_set_shape(RID p_area, int p_shape_idx, RID p_shape) = 0;
+ virtual void area_set_shape_transform(RID p_area, int p_shape_idx, const Transform &p_transform) = 0;
- virtual int area_get_shape_count(RID p_area) const=0;
- virtual RID area_get_shape(RID p_area, int p_shape_idx) const=0;
- virtual Transform area_get_shape_transform(RID p_area, int p_shape_idx) const=0;
+ virtual int area_get_shape_count(RID p_area) const = 0;
+ virtual RID area_get_shape(RID p_area, int p_shape_idx) const = 0;
+ virtual Transform area_get_shape_transform(RID p_area, int p_shape_idx) const = 0;
- virtual void area_remove_shape(RID p_area, int p_shape_idx)=0;
- virtual void area_clear_shapes(RID p_area)=0;
+ virtual void area_remove_shape(RID p_area, int p_shape_idx) = 0;
+ virtual void area_clear_shapes(RID p_area) = 0;
- virtual void area_attach_object_instance_ID(RID p_area,ObjectID p_ID)=0;
- virtual ObjectID area_get_object_instance_ID(RID p_area) const=0;
+ virtual void area_attach_object_instance_ID(RID p_area, ObjectID p_ID) = 0;
+ virtual ObjectID area_get_object_instance_ID(RID p_area) const = 0;
- virtual void area_set_param(RID p_area,AreaParameter p_param,const Variant& p_value)=0;
- virtual void area_set_transform(RID p_area, const Transform& p_transform)=0;
+ virtual void area_set_param(RID p_area, AreaParameter p_param, const Variant &p_value) = 0;
+ virtual void area_set_transform(RID p_area, const Transform &p_transform) = 0;
- virtual Variant area_get_param(RID p_parea,AreaParameter p_param) const=0;
- virtual Transform area_get_transform(RID p_area) const=0;
+ virtual Variant area_get_param(RID p_parea, AreaParameter p_param) const = 0;
+ virtual Transform area_get_transform(RID p_area) const = 0;
- virtual void area_set_collision_mask(RID p_area,uint32_t p_mask)=0;
- virtual void area_set_layer_mask(RID p_area,uint32_t p_mask)=0;
+ virtual void area_set_collision_mask(RID p_area, uint32_t p_mask) = 0;
+ virtual void area_set_layer_mask(RID p_area, uint32_t p_mask) = 0;
- virtual void area_set_monitorable(RID p_area,bool p_monitorable)=0;
+ virtual void area_set_monitorable(RID p_area, bool p_monitorable) = 0;
- virtual void area_set_monitor_callback(RID p_area,Object *p_receiver,const StringName& p_method)=0;
- virtual void area_set_area_monitor_callback(RID p_area,Object *p_receiver,const StringName& p_method)=0;
+ virtual void area_set_monitor_callback(RID p_area, Object *p_receiver, const StringName &p_method) = 0;
+ virtual void area_set_area_monitor_callback(RID p_area, Object *p_receiver, const StringName &p_method) = 0;
- virtual void area_set_ray_pickable(RID p_area,bool p_enable)=0;
- virtual bool area_is_ray_pickable(RID p_area) const=0;
+ virtual void area_set_ray_pickable(RID p_area, bool p_enable) = 0;
+ virtual bool area_is_ray_pickable(RID p_area) const = 0;
/* BODY API */
@@ -369,42 +350,42 @@ public:
BODY_MODE_CHARACTER
};
- virtual RID body_create(BodyMode p_mode=BODY_MODE_RIGID,bool p_init_sleeping=false)=0;
+ virtual RID body_create(BodyMode p_mode = BODY_MODE_RIGID, bool p_init_sleeping = false) = 0;
- virtual void body_set_space(RID p_body, RID p_space)=0;
- virtual RID body_get_space(RID p_body) const=0;
+ virtual void body_set_space(RID p_body, RID p_space) = 0;
+ virtual RID body_get_space(RID p_body) const = 0;
- virtual void body_set_mode(RID p_body, BodyMode p_mode)=0;
- virtual BodyMode body_get_mode(RID p_body) const=0;
+ virtual void body_set_mode(RID p_body, BodyMode p_mode) = 0;
+ virtual BodyMode body_get_mode(RID p_body) const = 0;
- virtual void body_add_shape(RID p_body, RID p_shape, const Transform& p_transform=Transform())=0;
- virtual void body_set_shape(RID p_body, int p_shape_idx,RID p_shape)=0;
- virtual void body_set_shape_transform(RID p_body, int p_shape_idx, const Transform& p_transform)=0;
+ virtual void body_add_shape(RID p_body, RID p_shape, const Transform &p_transform = Transform()) = 0;
+ virtual void body_set_shape(RID p_body, int p_shape_idx, RID p_shape) = 0;
+ virtual void body_set_shape_transform(RID p_body, int p_shape_idx, const Transform &p_transform) = 0;
- virtual int body_get_shape_count(RID p_body) const=0;
- virtual RID body_get_shape(RID p_body, int p_shape_idx) const=0;
- virtual Transform body_get_shape_transform(RID p_body, int p_shape_idx) const=0;
+ virtual int body_get_shape_count(RID p_body) const = 0;
+ virtual RID body_get_shape(RID p_body, int p_shape_idx) const = 0;
+ virtual Transform body_get_shape_transform(RID p_body, int p_shape_idx) const = 0;
- virtual void body_set_shape_as_trigger(RID p_body, int p_shape_idx,bool p_enable)=0;
- virtual bool body_is_shape_set_as_trigger(RID p_body, int p_shape_idx) const=0;
+ virtual void body_set_shape_as_trigger(RID p_body, int p_shape_idx, bool p_enable) = 0;
+ virtual bool body_is_shape_set_as_trigger(RID p_body, int p_shape_idx) const = 0;
- virtual void body_remove_shape(RID p_body, int p_shape_idx)=0;
- virtual void body_clear_shapes(RID p_body)=0;
+ virtual void body_remove_shape(RID p_body, int p_shape_idx) = 0;
+ virtual void body_clear_shapes(RID p_body) = 0;
- virtual void body_attach_object_instance_ID(RID p_body,uint32_t p_ID)=0;
- virtual uint32_t body_get_object_instance_ID(RID p_body) const=0;
+ virtual void body_attach_object_instance_ID(RID p_body, uint32_t p_ID) = 0;
+ virtual uint32_t body_get_object_instance_ID(RID p_body) const = 0;
- virtual void body_set_enable_continuous_collision_detection(RID p_body,bool p_enable)=0;
- virtual bool body_is_continuous_collision_detection_enabled(RID p_body) const=0;
+ virtual void body_set_enable_continuous_collision_detection(RID p_body, bool p_enable) = 0;
+ virtual bool body_is_continuous_collision_detection_enabled(RID p_body) const = 0;
- virtual void body_set_layer_mask(RID p_body, uint32_t p_mask)=0;
- virtual uint32_t body_get_layer_mask(RID p_body, uint32_t p_mask) const=0;
+ virtual void body_set_layer_mask(RID p_body, uint32_t p_mask) = 0;
+ virtual uint32_t body_get_layer_mask(RID p_body, uint32_t p_mask) const = 0;
- virtual void body_set_collision_mask(RID p_body, uint32_t p_mask)=0;
- virtual uint32_t body_get_collision_mask(RID p_body, uint32_t p_mask) const=0;
+ virtual void body_set_collision_mask(RID p_body, uint32_t p_mask) = 0;
+ virtual uint32_t body_get_collision_mask(RID p_body, uint32_t p_mask) const = 0;
- virtual void body_set_user_flags(RID p_body, uint32_t p_flags)=0;
- virtual uint32_t body_get_user_flags(RID p_body, uint32_t p_flags) const=0;
+ virtual void body_set_user_flags(RID p_body, uint32_t p_flags) = 0;
+ virtual uint32_t body_get_user_flags(RID p_body, uint32_t p_flags) const = 0;
// common body variables
enum BodyParameter {
@@ -417,9 +398,8 @@ public:
BODY_PARAM_MAX,
};
- virtual void body_set_param(RID p_body, BodyParameter p_param, float p_value)=0;
- virtual float body_get_param(RID p_body, BodyParameter p_param) const=0;
-
+ virtual void body_set_param(RID p_body, BodyParameter p_param, float p_value) = 0;
+ virtual float body_get_param(RID p_body, BodyParameter p_param) const = 0;
//state
enum BodyState {
@@ -430,18 +410,18 @@ public:
BODY_STATE_CAN_SLEEP
};
- virtual void body_set_state(RID p_body, BodyState p_state, const Variant& p_variant)=0;
- virtual Variant body_get_state(RID p_body, BodyState p_state) const=0;
+ virtual void body_set_state(RID p_body, BodyState p_state, const Variant &p_variant) = 0;
+ virtual Variant body_get_state(RID p_body, BodyState p_state) const = 0;
//do something about it
- virtual void body_set_applied_force(RID p_body, const Vector3& p_force)=0;
- virtual Vector3 body_get_applied_force(RID p_body) const=0;
+ virtual void body_set_applied_force(RID p_body, const Vector3 &p_force) = 0;
+ virtual Vector3 body_get_applied_force(RID p_body) const = 0;
- virtual void body_set_applied_torque(RID p_body, const Vector3& p_torque)=0;
- virtual Vector3 body_get_applied_torque(RID p_body) const=0;
+ virtual void body_set_applied_torque(RID p_body, const Vector3 &p_torque) = 0;
+ virtual Vector3 body_get_applied_torque(RID p_body) const = 0;
- virtual void body_apply_impulse(RID p_body, const Vector3& p_pos, const Vector3& p_impulse)=0;
- virtual void body_set_axis_velocity(RID p_body, const Vector3& p_axis_velocity)=0;
+ virtual void body_apply_impulse(RID p_body, const Vector3 &p_pos, const Vector3 &p_impulse) = 0;
+ virtual void body_set_axis_velocity(RID p_body, const Vector3 &p_axis_velocity) = 0;
enum BodyAxisLock {
BODY_AXIS_LOCK_DISABLED,
@@ -450,29 +430,28 @@ public:
BODY_AXIS_LOCK_Z,
};
- virtual void body_set_axis_lock(RID p_body,BodyAxisLock p_lock)=0;
- virtual BodyAxisLock body_get_axis_lock(RID p_body) const=0;
+ virtual void body_set_axis_lock(RID p_body, BodyAxisLock p_lock) = 0;
+ virtual BodyAxisLock body_get_axis_lock(RID p_body) const = 0;
//fix
- virtual void body_add_collision_exception(RID p_body, RID p_body_b)=0;
- virtual void body_remove_collision_exception(RID p_body, RID p_body_b)=0;
- virtual void body_get_collision_exceptions(RID p_body, List<RID> *p_exceptions)=0;
+ virtual void body_add_collision_exception(RID p_body, RID p_body_b) = 0;
+ virtual void body_remove_collision_exception(RID p_body, RID p_body_b) = 0;
+ virtual void body_get_collision_exceptions(RID p_body, List<RID> *p_exceptions) = 0;
- virtual void body_set_max_contacts_reported(RID p_body, int p_contacts)=0;
- virtual int body_get_max_contacts_reported(RID p_body) const=0;
+ virtual void body_set_max_contacts_reported(RID p_body, int p_contacts) = 0;
+ virtual int body_get_max_contacts_reported(RID p_body) const = 0;
//missing remove
- virtual void body_set_contacts_reported_depth_treshold(RID p_body, float p_treshold)=0;
- virtual float body_get_contacts_reported_depth_treshold(RID p_body) const=0;
-
- virtual void body_set_omit_force_integration(RID p_body,bool p_omit)=0;
- virtual bool body_is_omitting_force_integration(RID p_body) const=0;
+ virtual void body_set_contacts_reported_depth_treshold(RID p_body, float p_treshold) = 0;
+ virtual float body_get_contacts_reported_depth_treshold(RID p_body) const = 0;
- virtual void body_set_force_integration_callback(RID p_body,Object *p_receiver,const StringName& p_method,const Variant& p_udata=Variant())=0;
+ virtual void body_set_omit_force_integration(RID p_body, bool p_omit) = 0;
+ virtual bool body_is_omitting_force_integration(RID p_body) const = 0;
- virtual void body_set_ray_pickable(RID p_body,bool p_enable)=0;
- virtual bool body_is_ray_pickable(RID p_body) const=0;
+ virtual void body_set_force_integration_callback(RID p_body, Object *p_receiver, const StringName &p_method, const Variant &p_udata = Variant()) = 0;
+ virtual void body_set_ray_pickable(RID p_body, bool p_enable) = 0;
+ virtual bool body_is_ray_pickable(RID p_body) const = 0;
/* JOINT API */
@@ -486,13 +465,12 @@ public:
};
- virtual JointType joint_get_type(RID p_joint) const=0;
-
- virtual void joint_set_solver_priority(RID p_joint,int p_priority)=0;
- virtual int joint_get_solver_priority(RID p_joint) const=0;
+ virtual JointType joint_get_type(RID p_joint) const = 0;
+ virtual void joint_set_solver_priority(RID p_joint, int p_priority) = 0;
+ virtual int joint_get_solver_priority(RID p_joint) const = 0;
- virtual RID joint_create_pin(RID p_body_A,const Vector3& p_local_A,RID p_body_B,const Vector3& p_local_B)=0;
+ virtual RID joint_create_pin(RID p_body_A, const Vector3 &p_local_A, RID p_body_B, const Vector3 &p_local_B) = 0;
enum PinJointParam {
PIN_JOINT_BIAS,
@@ -500,14 +478,14 @@ public:
PIN_JOINT_IMPULSE_CLAMP
};
- virtual void pin_joint_set_param(RID p_joint,PinJointParam p_param, float p_value)=0;
- virtual float pin_joint_get_param(RID p_joint,PinJointParam p_param) const=0;
+ virtual void pin_joint_set_param(RID p_joint, PinJointParam p_param, float p_value) = 0;
+ virtual float pin_joint_get_param(RID p_joint, PinJointParam p_param) const = 0;
- virtual void pin_joint_set_local_A(RID p_joint, const Vector3& p_A)=0;
- virtual Vector3 pin_joint_get_local_A(RID p_joint) const=0;
+ virtual void pin_joint_set_local_A(RID p_joint, const Vector3 &p_A) = 0;
+ virtual Vector3 pin_joint_get_local_A(RID p_joint) const = 0;
- virtual void pin_joint_set_local_B(RID p_joint, const Vector3& p_B)=0;
- virtual Vector3 pin_joint_get_local_B(RID p_joint) const=0;
+ virtual void pin_joint_set_local_B(RID p_joint, const Vector3 &p_B) = 0;
+ virtual Vector3 pin_joint_get_local_B(RID p_joint) const = 0;
enum HingeJointParam {
@@ -528,15 +506,14 @@ public:
HINGE_JOINT_FLAG_MAX
};
- virtual RID joint_create_hinge(RID p_body_A,const Transform& p_hinge_A,RID p_body_B,const Transform& p_hinge_B)=0;
- virtual RID joint_create_hinge_simple(RID p_body_A,const Vector3& p_pivot_A,const Vector3& p_axis_A,RID p_body_B,const Vector3& p_pivot_B,const Vector3& p_axis_B)=0;
-
+ virtual RID joint_create_hinge(RID p_body_A, const Transform &p_hinge_A, RID p_body_B, const Transform &p_hinge_B) = 0;
+ virtual RID joint_create_hinge_simple(RID p_body_A, const Vector3 &p_pivot_A, const Vector3 &p_axis_A, RID p_body_B, const Vector3 &p_pivot_B, const Vector3 &p_axis_B) = 0;
- virtual void hinge_joint_set_param(RID p_joint,HingeJointParam p_param, float p_value)=0;
- virtual float hinge_joint_get_param(RID p_joint,HingeJointParam p_param) const=0;
+ virtual void hinge_joint_set_param(RID p_joint, HingeJointParam p_param, float p_value) = 0;
+ virtual float hinge_joint_get_param(RID p_joint, HingeJointParam p_param) const = 0;
- virtual void hinge_joint_set_flag(RID p_joint,HingeJointFlag p_flag, bool p_value)=0;
- virtual bool hinge_joint_get_flag(RID p_joint,HingeJointFlag p_flag) const=0;
+ virtual void hinge_joint_set_flag(RID p_joint, HingeJointFlag p_flag, bool p_value) = 0;
+ virtual bool hinge_joint_get_flag(RID p_joint, HingeJointFlag p_flag) const = 0;
enum SliderJointParam {
SLIDER_JOINT_LINEAR_LIMIT_UPPER,
@@ -564,13 +541,12 @@ public:
SLIDER_JOINT_ANGULAR_ORTHOGONAL_DAMPING,
SLIDER_JOINT_MAX
-
};
- virtual RID joint_create_slider(RID p_body_A,const Transform& p_local_frame_A,RID p_body_B,const Transform& p_local_frame_B)=0; //reference frame is A
+ virtual RID joint_create_slider(RID p_body_A, const Transform &p_local_frame_A, RID p_body_B, const Transform &p_local_frame_B) = 0; //reference frame is A
- virtual void slider_joint_set_param(RID p_joint,SliderJointParam p_param, float p_value)=0;
- virtual float slider_joint_get_param(RID p_joint,SliderJointParam p_param) const=0;
+ virtual void slider_joint_set_param(RID p_joint, SliderJointParam p_param, float p_value) = 0;
+ virtual float slider_joint_get_param(RID p_joint, SliderJointParam p_param) const = 0;
enum ConeTwistJointParam {
CONE_TWIST_JOINT_SWING_SPAN,
@@ -581,12 +557,10 @@ public:
CONE_TWIST_MAX
};
+ virtual RID joint_create_cone_twist(RID p_body_A, const Transform &p_local_frame_A, RID p_body_B, const Transform &p_local_frame_B) = 0; //reference frame is A
- virtual RID joint_create_cone_twist(RID p_body_A,const Transform& p_local_frame_A,RID p_body_B,const Transform& p_local_frame_B)=0; //reference frame is A
-
- virtual void cone_twist_joint_set_param(RID p_joint,ConeTwistJointParam p_param, float p_value)=0;
- virtual float cone_twist_joint_get_param(RID p_joint,ConeTwistJointParam p_param) const=0;
-
+ virtual void cone_twist_joint_set_param(RID p_joint, ConeTwistJointParam p_param, float p_value) = 0;
+ virtual float cone_twist_joint_get_param(RID p_joint, ConeTwistJointParam p_param) const = 0;
enum G6DOFJointAxisParam {
G6DOF_JOINT_LINEAR_LOWER_LIMIT,
@@ -614,16 +588,13 @@ public:
G6DOF_JOINT_FLAG_MAX
};
+ virtual RID joint_create_generic_6dof(RID p_body_A, const Transform &p_local_frame_A, RID p_body_B, const Transform &p_local_frame_B) = 0; //reference frame is A
+ virtual void generic_6dof_joint_set_param(RID p_joint, Vector3::Axis, G6DOFJointAxisParam p_param, float p_value) = 0;
+ virtual float generic_6dof_joint_get_param(RID p_joint, Vector3::Axis, G6DOFJointAxisParam p_param) = 0;
- virtual RID joint_create_generic_6dof(RID p_body_A,const Transform& p_local_frame_A,RID p_body_B,const Transform& p_local_frame_B)=0; //reference frame is A
-
- virtual void generic_6dof_joint_set_param(RID p_joint,Vector3::Axis,G6DOFJointAxisParam p_param, float p_value)=0;
- virtual float generic_6dof_joint_get_param(RID p_joint,Vector3::Axis,G6DOFJointAxisParam p_param)=0;
-
- virtual void generic_6dof_joint_set_flag(RID p_joint,Vector3::Axis,G6DOFJointAxisFlag p_flag, bool p_enable)=0;
- virtual bool generic_6dof_joint_get_flag(RID p_joint,Vector3::Axis,G6DOFJointAxisFlag p_flag)=0;
-
+ virtual void generic_6dof_joint_set_flag(RID p_joint, Vector3::Axis, G6DOFJointAxisFlag p_flag, bool p_enable) = 0;
+ virtual bool generic_6dof_joint_get_flag(RID p_joint, Vector3::Axis, G6DOFJointAxisFlag p_flag) = 0;
#if 0
enum JointType {
@@ -663,17 +634,16 @@ public:
AREA_BODY_REMOVED
};
-
/* MISC */
- virtual void free(RID p_rid)=0;
+ virtual void free(RID p_rid) = 0;
- virtual void set_active(bool p_active)=0;
- virtual void init()=0;
- virtual void step(float p_step)=0;
- virtual void sync()=0;
- virtual void flush_queries()=0;
- virtual void finish()=0;
+ virtual void set_active(bool p_active) = 0;
+ virtual void init() = 0;
+ virtual void step(float p_step) = 0;
+ virtual void sync() = 0;
+ virtual void flush_queries() = 0;
+ virtual void finish() = 0;
enum ProcessInfo {
@@ -682,30 +652,30 @@ public:
INFO_ISLAND_COUNT
};
- virtual int get_process_info(ProcessInfo p_info)=0;
+ virtual int get_process_info(ProcessInfo p_info) = 0;
PhysicsServer();
~PhysicsServer();
};
-VARIANT_ENUM_CAST( PhysicsServer::ShapeType );
-VARIANT_ENUM_CAST( PhysicsServer::SpaceParameter );
-VARIANT_ENUM_CAST( PhysicsServer::AreaParameter );
-VARIANT_ENUM_CAST( PhysicsServer::AreaSpaceOverrideMode );
-VARIANT_ENUM_CAST( PhysicsServer::BodyMode );
-VARIANT_ENUM_CAST( PhysicsServer::BodyParameter );
-VARIANT_ENUM_CAST( PhysicsServer::BodyState );
-VARIANT_ENUM_CAST( PhysicsServer::BodyAxisLock );
-VARIANT_ENUM_CAST( PhysicsServer::PinJointParam );
-VARIANT_ENUM_CAST( PhysicsServer::JointType );
-VARIANT_ENUM_CAST( PhysicsServer::HingeJointParam );
-VARIANT_ENUM_CAST( PhysicsServer::HingeJointFlag );
-VARIANT_ENUM_CAST( PhysicsServer::SliderJointParam );
-VARIANT_ENUM_CAST( PhysicsServer::ConeTwistJointParam );
-VARIANT_ENUM_CAST( PhysicsServer::G6DOFJointAxisParam );
-VARIANT_ENUM_CAST( PhysicsServer::G6DOFJointAxisFlag);
+VARIANT_ENUM_CAST(PhysicsServer::ShapeType);
+VARIANT_ENUM_CAST(PhysicsServer::SpaceParameter);
+VARIANT_ENUM_CAST(PhysicsServer::AreaParameter);
+VARIANT_ENUM_CAST(PhysicsServer::AreaSpaceOverrideMode);
+VARIANT_ENUM_CAST(PhysicsServer::BodyMode);
+VARIANT_ENUM_CAST(PhysicsServer::BodyParameter);
+VARIANT_ENUM_CAST(PhysicsServer::BodyState);
+VARIANT_ENUM_CAST(PhysicsServer::BodyAxisLock);
+VARIANT_ENUM_CAST(PhysicsServer::PinJointParam);
+VARIANT_ENUM_CAST(PhysicsServer::JointType);
+VARIANT_ENUM_CAST(PhysicsServer::HingeJointParam);
+VARIANT_ENUM_CAST(PhysicsServer::HingeJointFlag);
+VARIANT_ENUM_CAST(PhysicsServer::SliderJointParam);
+VARIANT_ENUM_CAST(PhysicsServer::ConeTwistJointParam);
+VARIANT_ENUM_CAST(PhysicsServer::G6DOFJointAxisParam);
+VARIANT_ENUM_CAST(PhysicsServer::G6DOFJointAxisFlag);
//VARIANT_ENUM_CAST( PhysicsServer::ObjectType );
-VARIANT_ENUM_CAST( PhysicsServer::AreaBodyStatus );
-VARIANT_ENUM_CAST( PhysicsServer::ProcessInfo );
+VARIANT_ENUM_CAST(PhysicsServer::AreaBodyStatus);
+VARIANT_ENUM_CAST(PhysicsServer::ProcessInfo);
#endif
diff --git a/servers/register_server_types.cpp b/servers/register_server_types.cpp
index 21514a7f9..7d31cc4db 100644
--- a/servers/register_server_types.cpp
+++ b/servers/register_server_types.cpp
@@ -29,47 +29,45 @@
#include "register_server_types.h"
#include "globals.h"
-#include "visual_server.h"
#include "audio_server.h"
-#include "physics_server.h"
#include "physics_2d_server.h"
-#include "spatial_sound_server.h"
-#include "spatial_sound_2d_server.h"
+#include "physics_server.h"
#include "script_debugger_remote.h"
+#include "spatial_sound_2d_server.h"
+#include "spatial_sound_server.h"
+#include "visual_server.h"
-static void _debugger_get_resource_usage(List<ScriptDebuggerRemote::ResourceUsage>* r_usage) {
+static void _debugger_get_resource_usage(List<ScriptDebuggerRemote::ResourceUsage> *r_usage) {
List<VS::TextureInfo> tinfo;
VS::get_singleton()->texture_debug_usage(&tinfo);
- for (List<VS::TextureInfo>::Element *E=tinfo.front();E;E=E->next()) {
+ for (List<VS::TextureInfo>::Element *E = tinfo.front(); E; E = E->next()) {
ScriptDebuggerRemote::ResourceUsage usage;
- usage.path=E->get().path;
- usage.vram=E->get().bytes;
- usage.id=E->get().texture;
- usage.type="Texture";
- usage.format=itos(E->get().size.width)+"x"+itos(E->get().size.height)+" "+Image::get_format_name(E->get().format);
+ usage.path = E->get().path;
+ usage.vram = E->get().bytes;
+ usage.id = E->get().texture;
+ usage.type = "Texture";
+ usage.format = itos(E->get().size.width) + "x" + itos(E->get().size.height) + " " + Image::get_format_name(E->get().format);
r_usage->push_back(usage);
}
-
}
void register_server_types() {
- Globals::get_singleton()->add_singleton( Globals::Singleton("VisualServer",VisualServer::get_singleton()) );
- Globals::get_singleton()->add_singleton( Globals::Singleton("VS",VisualServer::get_singleton()) );
- Globals::get_singleton()->add_singleton( Globals::Singleton("AudioServer",AudioServer::get_singleton()) );
- Globals::get_singleton()->add_singleton( Globals::Singleton("AS",AudioServer::get_singleton()) );
- Globals::get_singleton()->add_singleton( Globals::Singleton("PhysicsServer",PhysicsServer::get_singleton()) );
- Globals::get_singleton()->add_singleton( Globals::Singleton("PS",PhysicsServer::get_singleton()) );
- Globals::get_singleton()->add_singleton( Globals::Singleton("Physics2DServer",Physics2DServer::get_singleton()) );
- Globals::get_singleton()->add_singleton( Globals::Singleton("PS2D",Physics2DServer::get_singleton()) );
- Globals::get_singleton()->add_singleton( Globals::Singleton("SpatialSoundServer",SpatialSoundServer::get_singleton()) );
- Globals::get_singleton()->add_singleton( Globals::Singleton("SS",SpatialSoundServer::get_singleton()) );
- Globals::get_singleton()->add_singleton( Globals::Singleton("SpatialSound2DServer",SpatialSound2DServer::get_singleton()) );
- Globals::get_singleton()->add_singleton( Globals::Singleton("SS2D",SpatialSound2DServer::get_singleton()) );
-
+ Globals::get_singleton()->add_singleton(Globals::Singleton("VisualServer", VisualServer::get_singleton()));
+ Globals::get_singleton()->add_singleton(Globals::Singleton("VS", VisualServer::get_singleton()));
+ Globals::get_singleton()->add_singleton(Globals::Singleton("AudioServer", AudioServer::get_singleton()));
+ Globals::get_singleton()->add_singleton(Globals::Singleton("AS", AudioServer::get_singleton()));
+ Globals::get_singleton()->add_singleton(Globals::Singleton("PhysicsServer", PhysicsServer::get_singleton()));
+ Globals::get_singleton()->add_singleton(Globals::Singleton("PS", PhysicsServer::get_singleton()));
+ Globals::get_singleton()->add_singleton(Globals::Singleton("Physics2DServer", Physics2DServer::get_singleton()));
+ Globals::get_singleton()->add_singleton(Globals::Singleton("PS2D", Physics2DServer::get_singleton()));
+ Globals::get_singleton()->add_singleton(Globals::Singleton("SpatialSoundServer", SpatialSoundServer::get_singleton()));
+ Globals::get_singleton()->add_singleton(Globals::Singleton("SS", SpatialSoundServer::get_singleton()));
+ Globals::get_singleton()->add_singleton(Globals::Singleton("SpatialSound2DServer", SpatialSound2DServer::get_singleton()));
+ Globals::get_singleton()->add_singleton(Globals::Singleton("SS2D", SpatialSound2DServer::get_singleton()));
ObjectTypeDB::register_virtual_type<Physics2DDirectBodyState>();
ObjectTypeDB::register_virtual_type<Physics2DDirectSpaceState>();
@@ -82,10 +80,8 @@ void register_server_types() {
ObjectTypeDB::register_virtual_type<PhysicsDirectSpaceState>();
ObjectTypeDB::register_virtual_type<PhysicsShapeQueryResult>();
- ScriptDebuggerRemote::resource_usage_func=_debugger_get_resource_usage;
+ ScriptDebuggerRemote::resource_usage_func = _debugger_get_resource_usage;
}
-void unregister_server_types(){
-
-
+void unregister_server_types() {
}
diff --git a/servers/server_wrap_mt_common.h b/servers/server_wrap_mt_common.h
index fbc68fc87..cfb65cf16 100644
--- a/servers/server_wrap_mt_common.h
+++ b/servers/server_wrap_mt_common.h
@@ -27,763 +27,722 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
-#define FUNC0R(m_r,m_type)\
- virtual m_r m_type() { \
- if (Thread::get_caller_ID()!=server_thread) {\
- m_r ret;\
- command_queue.push_and_ret( server_name, &ServerName::m_type,&ret);\
- SYNC_DEBUG\
- return ret;\
- } else {\
- return server_name->m_type();\
- }\
+#define FUNC0R(m_r, m_type) \
+ virtual m_r m_type() { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ m_r ret; \
+ command_queue.push_and_ret(server_name, &ServerName::m_type, &ret); \
+ SYNC_DEBUG \
+ return ret; \
+ } else { \
+ return server_name->m_type(); \
+ } \
}
-
-#define FUNCRID(m_type)\
- int m_type##allocn() {\
- for(int i=0;i<m_type##_pool_max_size;i++) {\
- m_type##_id_pool.push_back( server_name->m_type##_create() );\
- }\
- return 0;\
- }\
- void m_type##_free_cached_ids() {\
- while (m_type##_id_pool.size()) {\
- free(m_type##_id_pool.front()->get());\
- m_type##_id_pool.pop_front();\
- }\
- }\
- virtual RID m_type##_create() { \
- if (Thread::get_caller_ID()!=server_thread) {\
- RID rid;\
- alloc_mutex->lock();\
- if (m_type##_id_pool.size()==0) {\
- int ret;\
- command_queue.push_and_ret( this, &ServerNameWrapMT::m_type##allocn,&ret);\
- }\
- rid=m_type##_id_pool.front()->get();\
- m_type##_id_pool.pop_front();\
- alloc_mutex->unlock();\
- return rid;\
- } else {\
- return server_name->m_type##_create();\
- }\
+#define FUNCRID(m_type) \
+ int m_type##allocn() { \
+ for (int i = 0; i < m_type##_pool_max_size; i++) { \
+ m_type##_id_pool.push_back(server_name->m_type##_create()); \
+ } \
+ return 0; \
+ } \
+ void m_type##_free_cached_ids() { \
+ while (m_type##_id_pool.size()) { \
+ free(m_type##_id_pool.front()->get()); \
+ m_type##_id_pool.pop_front(); \
+ } \
+ } \
+ virtual RID m_type##_create() { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ RID rid; \
+ alloc_mutex->lock(); \
+ if (m_type##_id_pool.size() == 0) { \
+ int ret; \
+ command_queue.push_and_ret(this, &ServerNameWrapMT::m_type##allocn, &ret); \
+ } \
+ rid = m_type##_id_pool.front()->get(); \
+ m_type##_id_pool.pop_front(); \
+ alloc_mutex->unlock(); \
+ return rid; \
+ } else { \
+ return server_name->m_type##_create(); \
+ } \
}
-#define FUNC1RID(m_type,m_arg1)\
- int m_type##allocn() {\
- for(int i=0;i<m_type##_pool_max_size;i++) {\
- m_type##_id_pool.push_back( server_name->m_type##_create() );\
- }\
- return 0;\
- }\
- void m_type##_free_cached_ids() {\
- while (m_type##_id_pool.size()) {\
- free(m_type##_id_pool.front()->get());\
- m_type##_id_pool.pop_front();\
- }\
- }\
- virtual RID m_type##_create(m_arg1 p1) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- RID rid;\
- alloc_mutex->lock();\
- if (m_type##_id_pool.size()==0) {\
- int ret;\
- command_queue.push_and_ret( this, &ServerNameWrapMT::m_type##allocn,p1,&ret);\
- }\
- rid=m_type##_id_pool.front()->get();\
- m_type##_id_pool.pop_front();\
- alloc_mutex->unlock();\
- return rid;\
- } else {\
- return server_name->m_type##_create(p1);\
- }\
+#define FUNC1RID(m_type, m_arg1) \
+ int m_type##allocn() { \
+ for (int i = 0; i < m_type##_pool_max_size; i++) { \
+ m_type##_id_pool.push_back(server_name->m_type##_create()); \
+ } \
+ return 0; \
+ } \
+ void m_type##_free_cached_ids() { \
+ while (m_type##_id_pool.size()) { \
+ free(m_type##_id_pool.front()->get()); \
+ m_type##_id_pool.pop_front(); \
+ } \
+ } \
+ virtual RID m_type##_create(m_arg1 p1) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ RID rid; \
+ alloc_mutex->lock(); \
+ if (m_type##_id_pool.size() == 0) { \
+ int ret; \
+ command_queue.push_and_ret(this, &ServerNameWrapMT::m_type##allocn, p1, &ret); \
+ } \
+ rid = m_type##_id_pool.front()->get(); \
+ m_type##_id_pool.pop_front(); \
+ alloc_mutex->unlock(); \
+ return rid; \
+ } else { \
+ return server_name->m_type##_create(p1); \
+ } \
}
-#define FUNC2RID(m_type,m_arg1,m_arg2)\
- int m_type##allocn() {\
- for(int i=0;i<m_type##_pool_max_size;i++) {\
- m_type##_id_pool.push_back( server_name->m_type##_create() );\
- }\
- return 0;\
- }\
- void m_type##_free_cached_ids() {\
- while (m_type##_id_pool.size()) {\
- free(m_type##_id_pool.front()->get());\
- m_type##_id_pool.pop_front();\
- }\
- }\
- virtual RID m_type##_create(m_arg1 p1,m_arg2 p2) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- RID rid;\
- alloc_mutex->lock();\
- if (m_type##_id_pool.size()==0) {\
- int ret;\
- command_queue.push_and_ret( this, &ServerNameWrapMT::m_type##allocn,p1,p2,&ret);\
- }\
- rid=m_type##_id_pool.front()->get();\
- m_type##_id_pool.pop_front();\
- alloc_mutex->unlock();\
- return rid;\
- } else {\
- return server_name->m_type##_create(p1,p2);\
- }\
+#define FUNC2RID(m_type, m_arg1, m_arg2) \
+ int m_type##allocn() { \
+ for (int i = 0; i < m_type##_pool_max_size; i++) { \
+ m_type##_id_pool.push_back(server_name->m_type##_create()); \
+ } \
+ return 0; \
+ } \
+ void m_type##_free_cached_ids() { \
+ while (m_type##_id_pool.size()) { \
+ free(m_type##_id_pool.front()->get()); \
+ m_type##_id_pool.pop_front(); \
+ } \
+ } \
+ virtual RID m_type##_create(m_arg1 p1, m_arg2 p2) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ RID rid; \
+ alloc_mutex->lock(); \
+ if (m_type##_id_pool.size() == 0) { \
+ int ret; \
+ command_queue.push_and_ret(this, &ServerNameWrapMT::m_type##allocn, p1, p2, &ret); \
+ } \
+ rid = m_type##_id_pool.front()->get(); \
+ m_type##_id_pool.pop_front(); \
+ alloc_mutex->unlock(); \
+ return rid; \
+ } else { \
+ return server_name->m_type##_create(p1, p2); \
+ } \
}
-#define FUNC3RID(m_type,m_arg1,m_arg2,m_arg3)\
- int m_type##allocn() {\
- for(int i=0;i<m_type##_pool_max_size;i++) {\
- m_type##_id_pool.push_back( server_name->m_type##_create() );\
- }\
- return 0;\
- }\
- void m_type##_free_cached_ids() {\
- while (m_type##_id_pool.size()) {\
- free(m_type##_id_pool.front()->get());\
- m_type##_id_pool.pop_front();\
- }\
- }\
- virtual RID m_type##_create(m_arg1 p1,m_arg2 p2,m_arg3 p3) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- RID rid;\
- alloc_mutex->lock();\
- if (m_type##_id_pool.size()==0) {\
- int ret;\
- command_queue.push_and_ret( this, &ServerNameWrapMT::m_type##allocn,p1,p2,p3,&ret);\
- }\
- rid=m_type##_id_pool.front()->get();\
- m_type##_id_pool.pop_front();\
- alloc_mutex->unlock();\
- return rid;\
- } else {\
- return server_name->m_type##_create(p1,p2,p3);\
- }\
+#define FUNC3RID(m_type, m_arg1, m_arg2, m_arg3) \
+ int m_type##allocn() { \
+ for (int i = 0; i < m_type##_pool_max_size; i++) { \
+ m_type##_id_pool.push_back(server_name->m_type##_create()); \
+ } \
+ return 0; \
+ } \
+ void m_type##_free_cached_ids() { \
+ while (m_type##_id_pool.size()) { \
+ free(m_type##_id_pool.front()->get()); \
+ m_type##_id_pool.pop_front(); \
+ } \
+ } \
+ virtual RID m_type##_create(m_arg1 p1, m_arg2 p2, m_arg3 p3) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ RID rid; \
+ alloc_mutex->lock(); \
+ if (m_type##_id_pool.size() == 0) { \
+ int ret; \
+ command_queue.push_and_ret(this, &ServerNameWrapMT::m_type##allocn, p1, p2, p3, &ret); \
+ } \
+ rid = m_type##_id_pool.front()->get(); \
+ m_type##_id_pool.pop_front(); \
+ alloc_mutex->unlock(); \
+ return rid; \
+ } else { \
+ return server_name->m_type##_create(p1, p2, p3); \
+ } \
}
-
-#define FUNC4RID(m_type,m_arg1,m_arg2,m_arg3,m_arg4)\
- int m_type##allocn() {\
- for(int i=0;i<m_type##_pool_max_size;i++) {\
- m_type##_id_pool.push_back( server_name->m_type##_create() );\
- }\
- return 0;\
- }\
- void m_type##_free_cached_ids() {\
- while (m_type##_id_pool.size()) {\
- free(m_type##_id_pool.front()->get());\
- m_type##_id_pool.pop_front();\
- }\
- }\
- virtual RID m_type##_create(m_arg1 p1,m_arg2 p2,m_arg3 p3,m_arg4 p4) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- RID rid;\
- alloc_mutex->lock();\
- if (m_type##_id_pool.size()==0) {\
- int ret;\
- command_queue.push_and_ret( this, &ServerNameWrapMT::m_type##allocn,p1,p2,p3,p4,&ret);\
- }\
- rid=m_type##_id_pool.front()->get();\
- m_type##_id_pool.pop_front();\
- alloc_mutex->unlock();\
- return rid;\
- } else {\
- return server_name->m_type##_create(p1,p2,p3,p4);\
- }\
+#define FUNC4RID(m_type, m_arg1, m_arg2, m_arg3, m_arg4) \
+ int m_type##allocn() { \
+ for (int i = 0; i < m_type##_pool_max_size; i++) { \
+ m_type##_id_pool.push_back(server_name->m_type##_create()); \
+ } \
+ return 0; \
+ } \
+ void m_type##_free_cached_ids() { \
+ while (m_type##_id_pool.size()) { \
+ free(m_type##_id_pool.front()->get()); \
+ m_type##_id_pool.pop_front(); \
+ } \
+ } \
+ virtual RID m_type##_create(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ RID rid; \
+ alloc_mutex->lock(); \
+ if (m_type##_id_pool.size() == 0) { \
+ int ret; \
+ command_queue.push_and_ret(this, &ServerNameWrapMT::m_type##allocn, p1, p2, p3, p4, &ret); \
+ } \
+ rid = m_type##_id_pool.front()->get(); \
+ m_type##_id_pool.pop_front(); \
+ alloc_mutex->unlock(); \
+ return rid; \
+ } else { \
+ return server_name->m_type##_create(p1, p2, p3, p4); \
+ } \
}
-
-#define FUNC5RID(m_type,m_arg1,m_arg2,m_arg3,m_arg4,m_arg5)\
- int m_type##allocn() {\
- for(int i=0;i<m_type##_pool_max_size;i++) {\
- m_type##_id_pool.push_back( server_name->m_type##_create() );\
- }\
- return 0;\
- }\
- void m_type##_free_cached_ids() {\
- while (m_type##_id_pool.size()) {\
- free(m_type##_id_pool.front()->get());\
- m_type##_id_pool.pop_front();\
- }\
- }\
- virtual RID m_type##_create(m_arg1 p1,m_arg2 p2,m_arg3 p3,m_arg4 p4,m_arg5 p5) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- RID rid;\
- alloc_mutex->lock();\
- if (m_type##_id_pool.size()==0) {\
- int ret;\
- command_queue.push_and_ret( this, &ServerNameWrapMT::m_type##allocn,p1,p2,p3,p4,p5,&ret);\
- }\
- rid=m_type##_id_pool.front()->get();\
- m_type##_id_pool.pop_front();\
- alloc_mutex->unlock();\
- return rid;\
- } else {\
- return server_name->m_type##_create(p1,p2,p3,p4,p5);\
- }\
+#define FUNC5RID(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5) \
+ int m_type##allocn() { \
+ for (int i = 0; i < m_type##_pool_max_size; i++) { \
+ m_type##_id_pool.push_back(server_name->m_type##_create()); \
+ } \
+ return 0; \
+ } \
+ void m_type##_free_cached_ids() { \
+ while (m_type##_id_pool.size()) { \
+ free(m_type##_id_pool.front()->get()); \
+ m_type##_id_pool.pop_front(); \
+ } \
+ } \
+ virtual RID m_type##_create(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ RID rid; \
+ alloc_mutex->lock(); \
+ if (m_type##_id_pool.size() == 0) { \
+ int ret; \
+ command_queue.push_and_ret(this, &ServerNameWrapMT::m_type##allocn, p1, p2, p3, p4, p5, &ret); \
+ } \
+ rid = m_type##_id_pool.front()->get(); \
+ m_type##_id_pool.pop_front(); \
+ alloc_mutex->unlock(); \
+ return rid; \
+ } else { \
+ return server_name->m_type##_create(p1, p2, p3, p4, p5); \
+ } \
}
-#define FUNC0RC(m_r,m_type)\
- virtual m_r m_type() const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- m_r ret;\
- command_queue.push_and_ret( server_name, &ServerName::m_type,&ret);\
- SYNC_DEBUG\
- return ret;\
- } else {\
- return server_name->m_type();\
- }\
+#define FUNC0RC(m_r, m_type) \
+ virtual m_r m_type() const { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ m_r ret; \
+ command_queue.push_and_ret(server_name, &ServerName::m_type, &ret); \
+ SYNC_DEBUG \
+ return ret; \
+ } else { \
+ return server_name->m_type(); \
+ } \
}
-
-#define FUNC0(m_type)\
- virtual void m_type() { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push( server_name, &ServerName::m_type);\
- } else {\
- server_name->m_type();\
- }\
+#define FUNC0(m_type) \
+ virtual void m_type() { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push(server_name, &ServerName::m_type); \
+ } else { \
+ server_name->m_type(); \
+ } \
}
-#define FUNC0C(m_type)\
- virtual void m_type() const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push( server_name, &ServerName::m_type);\
- } else {\
- server_name->m_type();\
- }\
+#define FUNC0C(m_type) \
+ virtual void m_type() const { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push(server_name, &ServerName::m_type); \
+ } else { \
+ server_name->m_type(); \
+ } \
}
-
-#define FUNC0S(m_type)\
- virtual void m_type() { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push_and_sync( server_name, &ServerName::m_type);\
- } else {\
- server_name->m_type();\
- }\
+#define FUNC0S(m_type) \
+ virtual void m_type() { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push_and_sync(server_name, &ServerName::m_type); \
+ } else { \
+ server_name->m_type(); \
+ } \
}
-#define FUNC0SC(m_type)\
- virtual void m_type() const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push_and_sync( server_name, &ServerName::m_type);\
- } else {\
- server_name->m_type();\
- }\
+#define FUNC0SC(m_type) \
+ virtual void m_type() const { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push_and_sync(server_name, &ServerName::m_type); \
+ } else { \
+ server_name->m_type(); \
+ } \
}
-
///////////////////////////////////////////////
-
-#define FUNC1R(m_r,m_type,m_arg1)\
- virtual m_r m_type(m_arg1 p1) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- m_r ret;\
- command_queue.push_and_ret( server_name, &ServerName::m_type,p1,&ret);\
- SYNC_DEBUG\
- return ret;\
- } else {\
- return server_name->m_type(p1);\
- }\
+#define FUNC1R(m_r, m_type, m_arg1) \
+ virtual m_r m_type(m_arg1 p1) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ m_r ret; \
+ command_queue.push_and_ret(server_name, &ServerName::m_type, p1, &ret); \
+ SYNC_DEBUG \
+ return ret; \
+ } else { \
+ return server_name->m_type(p1); \
+ } \
}
-#define FUNC1RC(m_r,m_type,m_arg1)\
- virtual m_r m_type(m_arg1 p1) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- m_r ret;\
- command_queue.push_and_ret( server_name, &ServerName::m_type,p1,&ret);\
- SYNC_DEBUG\
- return ret;\
- } else {\
- return server_name->m_type(p1);\
- }\
+#define FUNC1RC(m_r, m_type, m_arg1) \
+ virtual m_r m_type(m_arg1 p1) const { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ m_r ret; \
+ command_queue.push_and_ret(server_name, &ServerName::m_type, p1, &ret); \
+ SYNC_DEBUG \
+ return ret; \
+ } else { \
+ return server_name->m_type(p1); \
+ } \
}
-
-#define FUNC1S(m_type,m_arg1)\
- virtual void m_type(m_arg1 p1) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push_and_sync( server_name, &ServerName::m_type,p1);\
- } else {\
- server_name->m_type(p1);\
- }\
+#define FUNC1S(m_type, m_arg1) \
+ virtual void m_type(m_arg1 p1) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push_and_sync(server_name, &ServerName::m_type, p1); \
+ } else { \
+ server_name->m_type(p1); \
+ } \
}
-#define FUNC1SC(m_type,m_arg1)\
- virtual void m_type(m_arg1 p1) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push_and_sync( server_name, &ServerName::m_type,p1);\
- } else {\
- server_name->m_type(p1);\
- }\
+#define FUNC1SC(m_type, m_arg1) \
+ virtual void m_type(m_arg1 p1) const { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push_and_sync(server_name, &ServerName::m_type, p1); \
+ } else { \
+ server_name->m_type(p1); \
+ } \
}
-
-#define FUNC1(m_type,m_arg1)\
- virtual void m_type(m_arg1 p1) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push( server_name, &ServerName::m_type,p1);\
- } else {\
- server_name->m_type(p1);\
- }\
+#define FUNC1(m_type, m_arg1) \
+ virtual void m_type(m_arg1 p1) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push(server_name, &ServerName::m_type, p1); \
+ } else { \
+ server_name->m_type(p1); \
+ } \
}
-#define FUNC1C(m_type,m_arg1)\
- virtual void m_type(m_arg1 p1) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push( server_name, &ServerName::m_type,p1);\
- } else {\
- server_name->m_type(p1);\
- }\
+#define FUNC1C(m_type, m_arg1) \
+ virtual void m_type(m_arg1 p1) const { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push(server_name, &ServerName::m_type, p1); \
+ } else { \
+ server_name->m_type(p1); \
+ } \
}
-
-
-
-#define FUNC2R(m_r,m_type,m_arg1, m_arg2)\
- virtual m_r m_type(m_arg1 p1, m_arg2 p2) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- m_r ret;\
- command_queue.push_and_ret( server_name, &ServerName::m_type,p1, p2,&ret);\
- SYNC_DEBUG\
- return ret;\
- } else {\
- return server_name->m_type(p1, p2);\
- }\
+#define FUNC2R(m_r, m_type, m_arg1, m_arg2) \
+ virtual m_r m_type(m_arg1 p1, m_arg2 p2) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ m_r ret; \
+ command_queue.push_and_ret(server_name, &ServerName::m_type, p1, p2, &ret); \
+ SYNC_DEBUG \
+ return ret; \
+ } else { \
+ return server_name->m_type(p1, p2); \
+ } \
}
-#define FUNC2RC(m_r,m_type,m_arg1, m_arg2)\
- virtual m_r m_type(m_arg1 p1, m_arg2 p2) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- m_r ret;\
- command_queue.push_and_ret( server_name, &ServerName::m_type,p1, p2,&ret);\
- SYNC_DEBUG\
- return ret;\
- } else {\
- return server_name->m_type(p1, p2);\
- }\
+#define FUNC2RC(m_r, m_type, m_arg1, m_arg2) \
+ virtual m_r m_type(m_arg1 p1, m_arg2 p2) const { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ m_r ret; \
+ command_queue.push_and_ret(server_name, &ServerName::m_type, p1, p2, &ret); \
+ SYNC_DEBUG \
+ return ret; \
+ } else { \
+ return server_name->m_type(p1, p2); \
+ } \
}
-
-#define FUNC2S(m_type,m_arg1, m_arg2)\
- virtual void m_type(m_arg1 p1, m_arg2 p2) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push_and_sync( server_name, &ServerName::m_type,p1, p2);\
- } else {\
- server_name->m_type(p1, p2);\
- }\
+#define FUNC2S(m_type, m_arg1, m_arg2) \
+ virtual void m_type(m_arg1 p1, m_arg2 p2) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2); \
+ } else { \
+ server_name->m_type(p1, p2); \
+ } \
}
-#define FUNC2SC(m_type,m_arg1, m_arg2)\
- virtual void m_type(m_arg1 p1, m_arg2 p2) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push_and_sync( server_name, &ServerName::m_type,p1, p2);\
- } else {\
- server_name->m_type(p1, p2);\
- }\
+#define FUNC2SC(m_type, m_arg1, m_arg2) \
+ virtual void m_type(m_arg1 p1, m_arg2 p2) const { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2); \
+ } else { \
+ server_name->m_type(p1, p2); \
+ } \
}
-
-#define FUNC2(m_type,m_arg1, m_arg2)\
- virtual void m_type(m_arg1 p1, m_arg2 p2) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push( server_name, &ServerName::m_type,p1, p2);\
- } else {\
- server_name->m_type(p1, p2);\
- }\
+#define FUNC2(m_type, m_arg1, m_arg2) \
+ virtual void m_type(m_arg1 p1, m_arg2 p2) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push(server_name, &ServerName::m_type, p1, p2); \
+ } else { \
+ server_name->m_type(p1, p2); \
+ } \
}
-#define FUNC2C(m_type,m_arg1, m_arg2)\
- virtual void m_type(m_arg1 p1, m_arg2 p2) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push( server_name, &ServerName::m_type,p1, p2);\
- } else {\
- server_name->m_type(p1, p2);\
- }\
+#define FUNC2C(m_type, m_arg1, m_arg2) \
+ virtual void m_type(m_arg1 p1, m_arg2 p2) const { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push(server_name, &ServerName::m_type, p1, p2); \
+ } else { \
+ server_name->m_type(p1, p2); \
+ } \
}
-
-
-
-#define FUNC3R(m_r,m_type,m_arg1, m_arg2, m_arg3)\
- virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- m_r ret;\
- command_queue.push_and_ret( server_name, &ServerName::m_type,p1, p2, p3,&ret);\
- SYNC_DEBUG\
- return ret;\
- } else {\
- return server_name->m_type(p1, p2, p3);\
- }\
+#define FUNC3R(m_r, m_type, m_arg1, m_arg2, m_arg3) \
+ virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ m_r ret; \
+ command_queue.push_and_ret(server_name, &ServerName::m_type, p1, p2, p3, &ret); \
+ SYNC_DEBUG \
+ return ret; \
+ } else { \
+ return server_name->m_type(p1, p2, p3); \
+ } \
}
-#define FUNC3RC(m_r,m_type,m_arg1, m_arg2, m_arg3)\
- virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- m_r ret;\
- command_queue.push_and_ret( server_name, &ServerName::m_type,p1, p2, p3,&ret);\
- return ret;\
- } else {\
- return server_name->m_type(p1, p2, p3);\
- }\
+#define FUNC3RC(m_r, m_type, m_arg1, m_arg2, m_arg3) \
+ virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3) const { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ m_r ret; \
+ command_queue.push_and_ret(server_name, &ServerName::m_type, p1, p2, p3, &ret); \
+ return ret; \
+ } else { \
+ return server_name->m_type(p1, p2, p3); \
+ } \
}
-
-#define FUNC3S(m_type,m_arg1, m_arg2, m_arg3)\
- virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push_and_sync( server_name, &ServerName::m_type,p1, p2, p3);\
- } else {\
- server_name->m_type(p1, p2, p3);\
- }\
+#define FUNC3S(m_type, m_arg1, m_arg2, m_arg3) \
+ virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3); \
+ } else { \
+ server_name->m_type(p1, p2, p3); \
+ } \
}
-#define FUNC3SC(m_type,m_arg1, m_arg2, m_arg3)\
- virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push_and_sync( server_name, &ServerName::m_type,p1, p2, p3);\
- } else {\
- server_name->m_type(p1, p2, p3);\
- }\
+#define FUNC3SC(m_type, m_arg1, m_arg2, m_arg3) \
+ virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3) const { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3); \
+ } else { \
+ server_name->m_type(p1, p2, p3); \
+ } \
}
-
-#define FUNC3(m_type,m_arg1, m_arg2, m_arg3)\
- virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push( server_name, &ServerName::m_type,p1, p2, p3);\
- } else {\
- server_name->m_type(p1, p2, p3);\
- }\
+#define FUNC3(m_type, m_arg1, m_arg2, m_arg3) \
+ virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push(server_name, &ServerName::m_type, p1, p2, p3); \
+ } else { \
+ server_name->m_type(p1, p2, p3); \
+ } \
}
-#define FUNC3C(m_type,m_arg1, m_arg2, m_arg3)\
- virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push( server_name, &ServerName::m_type,p1, p2, p3);\
- } else {\
- server_name->m_type(p1, p2, p3);\
- }\
+#define FUNC3C(m_type, m_arg1, m_arg2, m_arg3) \
+ virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3) const { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push(server_name, &ServerName::m_type, p1, p2, p3); \
+ } else { \
+ server_name->m_type(p1, p2, p3); \
+ } \
}
-
-
-
-#define FUNC4R(m_r,m_type,m_arg1, m_arg2, m_arg3, m_arg4)\
- virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- m_r ret;\
- command_queue.push_and_ret( server_name, &ServerName::m_type,p1, p2, p3, p4,&ret);\
- SYNC_DEBUG\
- return ret;\
- } else {\
- return server_name->m_type(p1, p2, p3, p4);\
- }\
+#define FUNC4R(m_r, m_type, m_arg1, m_arg2, m_arg3, m_arg4) \
+ virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ m_r ret; \
+ command_queue.push_and_ret(server_name, &ServerName::m_type, p1, p2, p3, p4, &ret); \
+ SYNC_DEBUG \
+ return ret; \
+ } else { \
+ return server_name->m_type(p1, p2, p3, p4); \
+ } \
}
-#define FUNC4RC(m_r,m_type,m_arg1, m_arg2, m_arg3, m_arg4)\
- virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- m_r ret;\
- command_queue.push_and_ret( server_name, &ServerName::m_type,p1, p2, p3, p4,&ret);\
- SYNC_DEBUG\
- return ret;\
- } else {\
- return server_name->m_type(p1, p2, p3, p4);\
- }\
+#define FUNC4RC(m_r, m_type, m_arg1, m_arg2, m_arg3, m_arg4) \
+ virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4) const { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ m_r ret; \
+ command_queue.push_and_ret(server_name, &ServerName::m_type, p1, p2, p3, p4, &ret); \
+ SYNC_DEBUG \
+ return ret; \
+ } else { \
+ return server_name->m_type(p1, p2, p3, p4); \
+ } \
}
-
-#define FUNC4S(m_type,m_arg1, m_arg2, m_arg3, m_arg4)\
- virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push_and_sync( server_name, &ServerName::m_type,p1, p2, p3, p4);\
- } else {\
- server_name->m_type(p1, p2, p3, p4);\
- }\
+#define FUNC4S(m_type, m_arg1, m_arg2, m_arg3, m_arg4) \
+ virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3, p4); \
+ } else { \
+ server_name->m_type(p1, p2, p3, p4); \
+ } \
}
-#define FUNC4SC(m_type,m_arg1, m_arg2, m_arg3, m_arg4)\
- virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push_and_sync( server_name, &ServerName::m_type,p1, p2, p3, p4);\
- } else {\
- server_name->m_type(p1, p2, p3, p4);\
- }\
+#define FUNC4SC(m_type, m_arg1, m_arg2, m_arg3, m_arg4) \
+ virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4) const { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3, p4); \
+ } else { \
+ server_name->m_type(p1, p2, p3, p4); \
+ } \
}
-
-#define FUNC4(m_type,m_arg1, m_arg2, m_arg3, m_arg4)\
- virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push( server_name, &ServerName::m_type,p1, p2, p3, p4);\
- } else {\
- server_name->m_type(p1, p2, p3, p4);\
- }\
+#define FUNC4(m_type, m_arg1, m_arg2, m_arg3, m_arg4) \
+ virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4); \
+ } else { \
+ server_name->m_type(p1, p2, p3, p4); \
+ } \
}
-#define FUNC4C(m_type,m_arg1, m_arg2, m_arg3, m_arg4)\
- virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push( server_name, &ServerName::m_type,p1, p2, p3, p4);\
- } else {\
- server_name->m_type(p1, p2, p3, p4);\
- }\
+#define FUNC4C(m_type, m_arg1, m_arg2, m_arg3, m_arg4) \
+ virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4) const { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4); \
+ } else { \
+ server_name->m_type(p1, p2, p3, p4); \
+ } \
}
-
-
-
-#define FUNC5R(m_r,m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5)\
- virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- m_r ret;\
- command_queue.push_and_ret( server_name, &ServerName::m_type,p1, p2, p3, p4, p5,&ret);\
- SYNC_DEBUG\
- return ret;\
- } else {\
- return server_name->m_type(p1, p2, p3, p4, p5);\
- }\
+#define FUNC5R(m_r, m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5) \
+ virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ m_r ret; \
+ command_queue.push_and_ret(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, &ret); \
+ SYNC_DEBUG \
+ return ret; \
+ } else { \
+ return server_name->m_type(p1, p2, p3, p4, p5); \
+ } \
}
-#define FUNC5RC(m_r,m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5)\
- virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- m_r ret;\
- command_queue.push_and_ret( server_name, &ServerName::m_type,p1, p2, p3, p4, p5,&ret);\
- SYNC_DEBUG\
- return ret;\
- } else {\
- return server_name->m_type(p1, p2, p3, p4, p5);\
- }\
+#define FUNC5RC(m_r, m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5) \
+ virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5) const { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ m_r ret; \
+ command_queue.push_and_ret(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, &ret); \
+ SYNC_DEBUG \
+ return ret; \
+ } else { \
+ return server_name->m_type(p1, p2, p3, p4, p5); \
+ } \
}
-
-#define FUNC5S(m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5)\
- virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push_and_sync( server_name, &ServerName::m_type,p1, p2, p3, p4, p5);\
- } else {\
- server_name->m_type(p1, p2, p3, p4, p5);\
- }\
+#define FUNC5S(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5) \
+ virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3, p4, p5); \
+ } else { \
+ server_name->m_type(p1, p2, p3, p4, p5); \
+ } \
}
-#define FUNC5SC(m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5)\
- virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push_and_sync( server_name, &ServerName::m_type,p1, p2, p3, p4, p5);\
- } else {\
- server_name->m_type(p1, p2, p3, p4, p5);\
- }\
+#define FUNC5SC(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5) \
+ virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5) const { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3, p4, p5); \
+ } else { \
+ server_name->m_type(p1, p2, p3, p4, p5); \
+ } \
}
-
-#define FUNC5(m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5)\
- virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push( server_name, &ServerName::m_type,p1, p2, p3, p4, p5);\
- } else {\
- server_name->m_type(p1, p2, p3, p4, p5);\
- }\
+#define FUNC5(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5) \
+ virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5); \
+ } else { \
+ server_name->m_type(p1, p2, p3, p4, p5); \
+ } \
}
-#define FUNC5C(m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5)\
+#define FUNC5C(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5) \
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push( server_name, &ServerName::m_type,p1, p2, p3, p4, p5);\
- } else {\
- server_name->m_type(p1, p2, p3, p4, p5);\
- }\
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5); \
+ } else { \
+ server_name->m_type(p1, p2, p3, p4, p5); \
+ } \
}
-
-
-
-#define FUNC6R(m_r,m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6)\
- virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- m_r ret;\
- command_queue.push_and_ret( server_name, &ServerName::m_type,p1, p2, p3, p4, p5, p6,&ret);\
- SYNC_DEBUG\
- return ret;\
- } else {\
- return server_name->m_type(p1, p2, p3, p4, p5, p6);\
- }\
+#define FUNC6R(m_r, m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6) \
+ virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ m_r ret; \
+ command_queue.push_and_ret(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, &ret); \
+ SYNC_DEBUG \
+ return ret; \
+ } else { \
+ return server_name->m_type(p1, p2, p3, p4, p5, p6); \
+ } \
}
-#define FUNC6RC(m_r,m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6)\
- virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- m_r ret;\
- command_queue.push_and_ret( server_name, &ServerName::m_type,p1, p2, p3, p4, p5, p6,&ret);\
- return ret;\
- } else {\
- return server_name->m_type(p1, p2, p3, p4, p5, p6);\
- }\
+#define FUNC6RC(m_r, m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6) \
+ virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6) const { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ m_r ret; \
+ command_queue.push_and_ret(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, &ret); \
+ return ret; \
+ } else { \
+ return server_name->m_type(p1, p2, p3, p4, p5, p6); \
+ } \
}
-
-#define FUNC6S(m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6)\
- virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push_and_sync( server_name, &ServerName::m_type,p1, p2, p3, p4, p5, p6);\
- } else {\
- server_name->m_type(p1, p2, p3, p4, p5, p6);\
- }\
+#define FUNC6S(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6) \
+ virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6); \
+ } else { \
+ server_name->m_type(p1, p2, p3, p4, p5, p6); \
+ } \
}
-#define FUNC6SC(m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6)\
- virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push_and_sync( server_name, &ServerName::m_type,p1, p2, p3, p4, p5, p6);\
- } else {\
- server_name->m_type(p1, p2, p3, p4, p5, p6);\
- }\
+#define FUNC6SC(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6) \
+ virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6) const { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6); \
+ } else { \
+ server_name->m_type(p1, p2, p3, p4, p5, p6); \
+ } \
}
-
-#define FUNC6(m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6)\
+#define FUNC6(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6) \
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push( server_name, &ServerName::m_type,p1, p2, p3, p4, p5, p6);\
- } else {\
- server_name->m_type(p1, p2, p3, p4, p5, p6);\
- }\
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6); \
+ } else { \
+ server_name->m_type(p1, p2, p3, p4, p5, p6); \
+ } \
}
-#define FUNC6C(m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6)\
+#define FUNC6C(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6) \
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push( server_name, &ServerName::m_type,p1, p2, p3, p4, p5, p6);\
- } else {\
- server_name->m_type(p1, p2, p3, p4, p5, p6);\
- }\
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6); \
+ } else { \
+ server_name->m_type(p1, p2, p3, p4, p5, p6); \
+ } \
}
-
-
-
-#define FUNC7R(m_r,m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7)\
- virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- m_r ret;\
- command_queue.push_and_ret( server_name, &ServerName::m_type,p1, p2, p3, p4, p5, p6, p7,&ret);\
- SYNC_DEBUG\
- return ret;\
- } else {\
- return server_name->m_type(p1, p2, p3, p4, p5, p6, p7);\
- }\
+#define FUNC7R(m_r, m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7) \
+ virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7) { \
+ if (Thread::get_caller_ID() != server_thread) { \
+ m_r ret; \
+ command_queue.push_and_ret(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7, &ret); \
+ SYNC_DEBUG \
+ return ret; \
+ } else { \
+ return server_name->m_type(p1, p2, p3, p4, p5, p6, p7); \
+ } \
}
-#define FUNC7RC(m_r,m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7)\
+#define FUNC7RC(m_r, m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7) \
virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- m_r ret;\
- command_queue.push_and_ret( server_name, &ServerName::m_type,p1, p2, p3, p4, p5, p6, p7,&ret);\
- SYNC_DEBUG\
- return ret;\
- } else {\
- return server_name->m_type(p1, p2, p3, p4, p5, p6, p7);\
- }\
+ if (Thread::get_caller_ID() != server_thread) { \
+ m_r ret; \
+ command_queue.push_and_ret(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7, &ret); \
+ SYNC_DEBUG \
+ return ret; \
+ } else { \
+ return server_name->m_type(p1, p2, p3, p4, p5, p6, p7); \
+ } \
}
-
-#define FUNC7S(m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7)\
+#define FUNC7S(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7) \
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push_and_sync( server_name, &ServerName::m_type,p1, p2, p3, p4, p5, p6, p7);\
- } else {\
- server_name->m_type(p1, p2, p3, p4, p5, p6, p7);\
- }\
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7); \
+ } else { \
+ server_name->m_type(p1, p2, p3, p4, p5, p6, p7); \
+ } \
}
-#define FUNC7SC(m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7)\
+#define FUNC7SC(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7) \
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push_and_sync( server_name, &ServerName::m_type,p1, p2, p3, p4, p5, p6, p7);\
- } else {\
- server_name->m_type(p1, p2, p3, p4, p5, p6, p7);\
- }\
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7); \
+ } else { \
+ server_name->m_type(p1, p2, p3, p4, p5, p6, p7); \
+ } \
}
-
-#define FUNC7(m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7)\
+#define FUNC7(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7) \
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push( server_name, &ServerName::m_type,p1, p2, p3, p4, p5, p6, p7);\
- } else {\
- server_name->m_type(p1, p2, p3, p4, p5, p6, p7);\
- }\
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7); \
+ } else { \
+ server_name->m_type(p1, p2, p3, p4, p5, p6, p7); \
+ } \
}
-#define FUNC7C(m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7)\
+#define FUNC7C(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7) \
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push( server_name, &ServerName::m_type,p1, p2, p3, p4, p5, p6, p7);\
- } else {\
- server_name->m_type(p1, p2, p3, p4, p5, p6, p7);\
- }\
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7); \
+ } else { \
+ server_name->m_type(p1, p2, p3, p4, p5, p6, p7); \
+ } \
}
-#define FUNC8R(m_r,m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8)\
+#define FUNC8R(m_r, m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8) \
virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7, m_arg8 p8) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- m_r ret;\
- command_queue.push_and_ret( server_name, &ServerName::m_type,p1, p2, p3, p4, p5, p6, p7, p8, &ret);\
- SYNC_DEBUG\
- return ret;\
- } else {\
- return server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8);\
- }\
+ if (Thread::get_caller_ID() != server_thread) { \
+ m_r ret; \
+ command_queue.push_and_ret(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7, p8, &ret); \
+ SYNC_DEBUG \
+ return ret; \
+ } else { \
+ return server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8); \
+ } \
}
-#define FUNC8RC(m_r,m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8)\
+#define FUNC8RC(m_r, m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8) \
virtual m_r m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7, m_arg8 p8) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- m_r ret;\
- command_queue.push_and_ret( server_name, &ServerName::m_type,p1, p2, p3, p4, p5, p6, p7, p8, &ret);\
- SYNC_DEBUG\
- return ret;\
- } else {\
- return server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8);\
- }\
+ if (Thread::get_caller_ID() != server_thread) { \
+ m_r ret; \
+ command_queue.push_and_ret(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7, p8, &ret); \
+ SYNC_DEBUG \
+ return ret; \
+ } else { \
+ return server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8); \
+ } \
}
-
-#define FUNC8S(m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8)\
+#define FUNC8S(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8) \
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7, m_arg8 p8) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push_and_sync( server_name, &ServerName::m_type,p1, p2, p3, p4, p5, p6, p7, p8);\
- } else {\
- server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8);\
- }\
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7, p8); \
+ } else { \
+ server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8); \
+ } \
}
-#define FUNC8SC(m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8)\
+#define FUNC8SC(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8) \
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7, m_arg8 p8) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push_and_sync( server_name, &ServerName::m_type,p1, p2, p3, p4, p5, p6, p7, p8);\
- } else {\
- server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8);\
- }\
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push_and_sync(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7, p8); \
+ } else { \
+ server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8); \
+ } \
}
-
-#define FUNC8(m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8)\
+#define FUNC8(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8) \
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7, m_arg8 p8) { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push( server_name, &ServerName::m_type,p1, p2, p3, p4, p5, p6, p7, p8);\
- } else {\
- server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8);\
- }\
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7, p8); \
+ } else { \
+ server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8); \
+ } \
}
-#define FUNC8C(m_type,m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8)\
+#define FUNC8C(m_type, m_arg1, m_arg2, m_arg3, m_arg4, m_arg5, m_arg6, m_arg7, m_arg8) \
virtual void m_type(m_arg1 p1, m_arg2 p2, m_arg3 p3, m_arg4 p4, m_arg5 p5, m_arg6 p6, m_arg7 p7, m_arg8 p8) const { \
- if (Thread::get_caller_ID()!=server_thread) {\
- command_queue.push( server_name, &ServerName::m_type,p1, p2, p3, p4, p5, p6, p7, p8);\
- } else {\
- server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8);\
- }\
+ if (Thread::get_caller_ID() != server_thread) { \
+ command_queue.push(server_name, &ServerName::m_type, p1, p2, p3, p4, p5, p6, p7, p8); \
+ } else { \
+ server_name->m_type(p1, p2, p3, p4, p5, p6, p7, p8); \
+ } \
}
diff --git a/servers/spatial_sound/spatial_sound_server_sw.cpp b/servers/spatial_sound/spatial_sound_server_sw.cpp
index 83b42c529..6a10b175e 100644
--- a/servers/spatial_sound/spatial_sound_server_sw.cpp
+++ b/servers/spatial_sound/spatial_sound_server_sw.cpp
@@ -30,16 +30,12 @@
#include "os/os.h"
#include "servers/audio/audio_filter_sw.h"
-
-
int SpatialSoundServerSW::InternalAudioStream::get_channel_count() const {
return AudioServer::get_singleton()->get_default_channel_count();
}
void SpatialSoundServerSW::InternalAudioStream::set_mix_rate(int p_rate) {
-
-
}
void SpatialSoundServerSW::InternalAudioStream::update() {
@@ -47,92 +43,85 @@ void SpatialSoundServerSW::InternalAudioStream::update() {
owner->_update_sources();
}
-bool SpatialSoundServerSW::InternalAudioStream::mix(int32_t *p_buffer,int p_frames) {
+bool SpatialSoundServerSW::InternalAudioStream::mix(int32_t *p_buffer, int p_frames) {
- return owner->internal_buffer_mix(p_buffer,p_frames);
+ return owner->internal_buffer_mix(p_buffer, p_frames);
}
void SpatialSoundServerSW::_update_sources() {
_THREAD_SAFE_METHOD_
- for (Set<Source*>::Element *E=streaming_sources.front();E;E=E->next()) {
+ for (Set<Source *>::Element *E = streaming_sources.front(); E; E = E->next()) {
- Source *s=E->get();
+ Source *s = E->get();
ERR_CONTINUE(!s->stream);
s->stream->update();
}
}
-
SpatialSoundServerSW::Room::Room() {
-// params[ROOM_PARAM_SPEED_OF_SOUND]=343.0;
- params[ROOM_PARAM_SPEED_OF_SOUND_SCALE]=1;
- params[ROOM_PARAM_DOPPLER_FACTOR]=1.0;
- params[ROOM_PARAM_PITCH_SCALE]=1.0;
- params[ROOM_PARAM_VOLUME_SCALE_DB]=0;
- params[ROOM_PARAM_REVERB_SEND]=0;
- params[ROOM_PARAM_CHORUS_SEND]=0;
- params[ROOM_PARAM_ATTENUATION_SCALE]=1.0;
- params[ROOM_PARAM_ATTENUATION_HF_CUTOFF]=5000;
- params[ROOM_PARAM_ATTENUATION_HF_FLOOR_DB]=-24.0;
- params[ROOM_PARAM_ATTENUATION_HF_RATIO_EXP]=1.0;
- params[ROOM_PARAM_ATTENUATION_REVERB_SCALE]=0.0;
- override_other_sources=false;
- reverb=ROOM_REVERB_HALL;
- octree_id=0;
- level=-1;
-
-
+ // params[ROOM_PARAM_SPEED_OF_SOUND]=343.0;
+ params[ROOM_PARAM_SPEED_OF_SOUND_SCALE] = 1;
+ params[ROOM_PARAM_DOPPLER_FACTOR] = 1.0;
+ params[ROOM_PARAM_PITCH_SCALE] = 1.0;
+ params[ROOM_PARAM_VOLUME_SCALE_DB] = 0;
+ params[ROOM_PARAM_REVERB_SEND] = 0;
+ params[ROOM_PARAM_CHORUS_SEND] = 0;
+ params[ROOM_PARAM_ATTENUATION_SCALE] = 1.0;
+ params[ROOM_PARAM_ATTENUATION_HF_CUTOFF] = 5000;
+ params[ROOM_PARAM_ATTENUATION_HF_FLOOR_DB] = -24.0;
+ params[ROOM_PARAM_ATTENUATION_HF_RATIO_EXP] = 1.0;
+ params[ROOM_PARAM_ATTENUATION_REVERB_SCALE] = 0.0;
+ override_other_sources = false;
+ reverb = ROOM_REVERB_HALL;
+ octree_id = 0;
+ level = -1;
}
-
SpatialSoundServerSW::Source::Source() {
- params[SOURCE_PARAM_VOLUME_DB]=0.0;
- params[SOURCE_PARAM_PITCH_SCALE]=1.0;
- params[SOURCE_PARAM_ATTENUATION_MIN_DISTANCE]=1;
- params[SOURCE_PARAM_ATTENUATION_MAX_DISTANCE]=100;
- params[SOURCE_PARAM_ATTENUATION_DISTANCE_EXP]=1.0; //linear (and not really good)
- params[SOURCE_PARAM_EMISSION_CONE_DEGREES]=180.0; //cone disabled
- params[SOURCE_PARAM_EMISSION_CONE_ATTENUATION_DB]=-6.0; //minus 6 db attenuation
- stream=NULL;
+ params[SOURCE_PARAM_VOLUME_DB] = 0.0;
+ params[SOURCE_PARAM_PITCH_SCALE] = 1.0;
+ params[SOURCE_PARAM_ATTENUATION_MIN_DISTANCE] = 1;
+ params[SOURCE_PARAM_ATTENUATION_MAX_DISTANCE] = 100;
+ params[SOURCE_PARAM_ATTENUATION_DISTANCE_EXP] = 1.0; //linear (and not really good)
+ params[SOURCE_PARAM_EMISSION_CONE_DEGREES] = 180.0; //cone disabled
+ params[SOURCE_PARAM_EMISSION_CONE_ATTENUATION_DB] = -6.0; //minus 6 db attenuation
+ stream = NULL;
voices.resize(1);
- last_voice=0;
+ last_voice = 0;
}
SpatialSoundServerSW::Source::Voice::Voice() {
- active=false;
- restart=false;
- pitch_scale=1.0;
- volume_scale=0.0;
- voice_rid=AudioServer::get_singleton()->voice_create();
-
+ active = false;
+ restart = false;
+ pitch_scale = 1.0;
+ volume_scale = 0.0;
+ voice_rid = AudioServer::get_singleton()->voice_create();
}
SpatialSoundServerSW::Source::Voice::~Voice() {
AudioServer::get_singleton()->free(voice_rid);
}
-
SpatialSoundServerSW::Listener::Listener() {
- params[LISTENER_PARAM_VOLUME_SCALE_DB]=0.0;
- params[LISTENER_PARAM_PITCH_SCALE]=1.0;
- params[LISTENER_PARAM_ATTENUATION_SCALE]=1.0;
- params[LISTENER_PARAM_RECEPTION_CONE_DEGREES]=60.0;
- params[LISTENER_PARAM_RECEPTION_CONE_ATTENUATION_DB]=-6; // minus six decibels
-
+ params[LISTENER_PARAM_VOLUME_SCALE_DB] = 0.0;
+ params[LISTENER_PARAM_PITCH_SCALE] = 1.0;
+ params[LISTENER_PARAM_ATTENUATION_SCALE] = 1.0;
+ params[LISTENER_PARAM_RECEPTION_CONE_DEGREES] = 60.0;
+ params[LISTENER_PARAM_RECEPTION_CONE_ATTENUATION_DB] = -6; // minus six decibels
}
/* SPACE */
RID SpatialSoundServerSW::space_create() {
- Space* space = memnew( Space );
+ Space *space = memnew(Space);
RID space_rid = space_owner.make_rid(space);
- space->default_room=room_create();
- room_set_space(space->default_room,space_rid);
+ space->default_room = room_create();
+ room_set_space(space->default_room, space_rid);
return space_rid;
}
@@ -140,11 +129,11 @@ RID SpatialSoundServerSW::space_create() {
RID SpatialSoundServerSW::room_create() {
- Room *room = memnew( Room );
+ Room *room = memnew(Room);
return room_owner.make_rid(room);
}
-void SpatialSoundServerSW::room_set_space(RID p_room,RID p_space) {
+void SpatialSoundServerSW::room_set_space(RID p_room, RID p_space) {
Room *room = room_owner.get(p_room);
ERR_FAIL_COND(!room);
@@ -157,110 +146,102 @@ void SpatialSoundServerSW::room_set_space(RID p_room,RID p_space) {
//room->octree_id=0;
}
- room->space=RID();
+ room->space = RID();
if (p_space.is_valid()) {
Space *space = space_owner.get(p_space);
ERR_FAIL_COND(!space);
space->rooms.insert(p_room);
- room->octree_id=space->octree.create(room,AABB());
+ room->octree_id = space->octree.create(room, AABB());
//set bounds
- AABB aabb = room->bounds.is_empty()?AABB():room->bounds.get_aabb();
- space->octree.move(room->octree_id,room->transform.xform(aabb));
- room->space=p_space;
+ AABB aabb = room->bounds.is_empty() ? AABB() : room->bounds.get_aabb();
+ space->octree.move(room->octree_id, room->transform.xform(aabb));
+ room->space = p_space;
}
-
-
}
RID SpatialSoundServerSW::room_get_space(RID p_room) const {
Room *room = room_owner.get(p_room);
- ERR_FAIL_COND_V(!room,RID());
-
+ ERR_FAIL_COND_V(!room, RID());
return room->space;
}
-
-
-void SpatialSoundServerSW::room_set_bounds(RID p_room, const BSP_Tree& p_bounds) {
+void SpatialSoundServerSW::room_set_bounds(RID p_room, const BSP_Tree &p_bounds) {
Room *room = room_owner.get(p_room);
ERR_FAIL_COND(!room);
- room->bounds=p_bounds;
+ room->bounds = p_bounds;
if (!room->space.is_valid())
return;
- AABB aabb = room->bounds.is_empty()?AABB():room->bounds.get_aabb();
- Space* space = space_owner.get(room->space);
+ AABB aabb = room->bounds.is_empty() ? AABB() : room->bounds.get_aabb();
+ Space *space = space_owner.get(room->space);
ERR_FAIL_COND(!space);
- space->octree.move(room->octree_id,room->transform.xform(aabb));
-
+ space->octree.move(room->octree_id, room->transform.xform(aabb));
}
BSP_Tree SpatialSoundServerSW::room_get_bounds(RID p_room) const {
Room *room = room_owner.get(p_room);
- ERR_FAIL_COND_V(!room,BSP_Tree());
+ ERR_FAIL_COND_V(!room, BSP_Tree());
return room->bounds;
}
-void SpatialSoundServerSW::room_set_transform(RID p_room, const Transform& p_transform) {
+void SpatialSoundServerSW::room_set_transform(RID p_room, const Transform &p_transform) {
if (space_owner.owns(p_room))
- p_room=space_owner.get(p_room)->default_room;
+ p_room = space_owner.get(p_room)->default_room;
Room *room = room_owner.get(p_room);
ERR_FAIL_COND(!room);
- room->transform=p_transform;
- room->inverse_transform=p_transform.affine_inverse(); // needs to be done to unscale BSP properly
+ room->transform = p_transform;
+ room->inverse_transform = p_transform.affine_inverse(); // needs to be done to unscale BSP properly
if (!room->space.is_valid())
return;
if (!room->bounds.is_empty()) {
- Space* space = space_owner.get(room->space);
+ Space *space = space_owner.get(room->space);
ERR_FAIL_COND(!space);
- space->octree.move(room->octree_id,room->transform.xform(room->bounds.get_aabb()));
+ space->octree.move(room->octree_id, room->transform.xform(room->bounds.get_aabb()));
}
}
Transform SpatialSoundServerSW::room_get_transform(RID p_room) const {
if (space_owner.owns(p_room))
- p_room=space_owner.get(p_room)->default_room;
+ p_room = space_owner.get(p_room)->default_room;
Room *room = room_owner.get(p_room);
- ERR_FAIL_COND_V(!room,Transform());
+ ERR_FAIL_COND_V(!room, Transform());
return room->transform;
}
-
void SpatialSoundServerSW::room_set_param(RID p_room, RoomParam p_param, float p_value) {
if (space_owner.owns(p_room))
- p_room=space_owner.get(p_room)->default_room;
+ p_room = space_owner.get(p_room)->default_room;
- ERR_FAIL_INDEX(p_param,ROOM_PARAM_MAX);
+ ERR_FAIL_INDEX(p_param, ROOM_PARAM_MAX);
Room *room = room_owner.get(p_room);
ERR_FAIL_COND(!room);
- room->params[p_param]=p_value;
-
+ room->params[p_param] = p_value;
}
float SpatialSoundServerSW::room_get_param(RID p_room, RoomParam p_param) const {
if (space_owner.owns(p_room))
- p_room=space_owner.get(p_room)->default_room;
+ p_room = space_owner.get(p_room)->default_room;
- ERR_FAIL_INDEX_V(p_param,ROOM_PARAM_MAX,0);
+ ERR_FAIL_INDEX_V(p_param, ROOM_PARAM_MAX, 0);
Room *room = room_owner.get(p_room);
- ERR_FAIL_COND_V(!room,0);
+ ERR_FAIL_COND_V(!room, 0);
return room->params[p_param];
}
@@ -268,36 +249,32 @@ void SpatialSoundServerSW::room_set_level(RID p_room, int p_level) {
Room *room = room_owner.get(p_room);
ERR_FAIL_COND(!room);
- room->level =p_level;
-
+ room->level = p_level;
}
int SpatialSoundServerSW::room_get_level(RID p_room) const {
Room *room = room_owner.get(p_room);
- ERR_FAIL_COND_V(!room,0);
+ ERR_FAIL_COND_V(!room, 0);
return room->level;
-
}
-
void SpatialSoundServerSW::room_set_reverb(RID p_room, RoomReverb p_reverb) {
if (space_owner.owns(p_room))
- p_room=space_owner.get(p_room)->default_room;
+ p_room = space_owner.get(p_room)->default_room;
Room *room = room_owner.get(p_room);
ERR_FAIL_COND(!room);
- room->reverb=p_reverb;
-
+ room->reverb = p_reverb;
}
SpatialSoundServerSW::RoomReverb SpatialSoundServerSW::room_get_reverb(RID p_room) const {
if (space_owner.owns(p_room))
- p_room=space_owner.get(p_room)->default_room;
+ p_room = space_owner.get(p_room)->default_room;
Room *room = room_owner.get(p_room);
- ERR_FAIL_COND_V(!room,ROOM_REVERB_SMALL);
+ ERR_FAIL_COND_V(!room, ROOM_REVERB_SMALL);
return room->reverb;
}
@@ -305,20 +282,19 @@ SpatialSoundServerSW::RoomReverb SpatialSoundServerSW::room_get_reverb(RID p_roo
void SpatialSoundServerSW::room_set_force_params_to_all_sources(RID p_room, bool p_force) {
if (space_owner.owns(p_room))
- p_room=space_owner.get(p_room)->default_room;
+ p_room = space_owner.get(p_room)->default_room;
Room *room = room_owner.get(p_room);
ERR_FAIL_COND(!room);
- room->override_other_sources=p_force;
-
+ room->override_other_sources = p_force;
}
bool SpatialSoundServerSW::room_is_forcing_params_to_all_sources(RID p_room) const {
if (space_owner.owns(p_room))
- p_room=space_owner.get(p_room)->default_room;
+ p_room = space_owner.get(p_room)->default_room;
Room *room = room_owner.get(p_room);
- ERR_FAIL_COND_V(!room,false);
+ ERR_FAIL_COND_V(!room, false);
return room->override_other_sources;
}
@@ -327,76 +303,69 @@ bool SpatialSoundServerSW::room_is_forcing_params_to_all_sources(RID p_room) con
RID SpatialSoundServerSW::source_create(RID p_space) {
Space *space = space_owner.get(p_space);
- ERR_FAIL_COND_V(!space,RID());
+ ERR_FAIL_COND_V(!space, RID());
- Source *source = memnew( Source );
- source->space=p_space;
+ Source *source = memnew(Source);
+ source->space = p_space;
RID source_rid = source_owner.make_rid(source);
space->sources.insert(source_rid);
return source_rid;
}
+void SpatialSoundServerSW::source_set_polyphony(RID p_source, int p_voice_count) {
-void SpatialSoundServerSW::source_set_polyphony(RID p_source,int p_voice_count) {
-
-
- ERR_FAIL_COND(p_voice_count<=0); // more than 32 is too much, change this if you really need more
- if (p_voice_count>32) {
+ ERR_FAIL_COND(p_voice_count <= 0); // more than 32 is too much, change this if you really need more
+ if (p_voice_count > 32) {
ERR_PRINT("Voices will be clipped to 32");
- p_voice_count=32;
+ p_voice_count = 32;
}
Source *source = source_owner.get(p_source);
ERR_FAIL_COND(!source);
- if (p_voice_count<source->voices.size()) {
+ if (p_voice_count < source->voices.size()) {
- for(int i=p_voice_count;i<source->voices.size();i++) {
- active_voices.erase(ActiveVoice(source,i)); //erase from active voices
+ for (int i = p_voice_count; i < source->voices.size(); i++) {
+ active_voices.erase(ActiveVoice(source, i)); //erase from active voices
}
}
source->voices.resize(p_voice_count);
-
}
int SpatialSoundServerSW::source_get_polyphony(RID p_source) const {
Source *source = source_owner.get(p_source);
- ERR_FAIL_COND_V(!source,-1);
+ ERR_FAIL_COND_V(!source, -1);
return source->voices.size();
-
}
-void SpatialSoundServerSW::source_set_transform(RID p_source, const Transform& p_transform) {
+void SpatialSoundServerSW::source_set_transform(RID p_source, const Transform &p_transform) {
Source *source = source_owner.get(p_source);
ERR_FAIL_COND(!source);
- source->transform=p_transform;
+ source->transform = p_transform;
source->transform.orthonormalize();
}
Transform SpatialSoundServerSW::source_get_transform(RID p_source) const {
Source *source = source_owner.get(p_source);
- ERR_FAIL_COND_V(!source,Transform());
+ ERR_FAIL_COND_V(!source, Transform());
return source->transform;
}
void SpatialSoundServerSW::source_set_param(RID p_source, SourceParam p_param, float p_value) {
- ERR_FAIL_INDEX(p_param,SOURCE_PARAM_MAX);
+ ERR_FAIL_INDEX(p_param, SOURCE_PARAM_MAX);
Source *source = source_owner.get(p_source);
ERR_FAIL_COND(!source);
- source->params[p_param]=p_value;
-
+ source->params[p_param] = p_value;
}
float SpatialSoundServerSW::source_get_param(RID p_source, SourceParam p_param) const {
- ERR_FAIL_INDEX_V(p_param,SOURCE_PARAM_MAX,0);
+ ERR_FAIL_INDEX_V(p_param, SOURCE_PARAM_MAX, 0);
Source *source = source_owner.get(p_source);
- ERR_FAIL_COND_V(!source,0);
+ ERR_FAIL_COND_V(!source, 0);
return source->params[p_param];
-
-
}
void SpatialSoundServerSW::source_set_audio_stream(RID p_source, AudioServer::AudioStream *p_stream) {
@@ -404,16 +373,16 @@ void SpatialSoundServerSW::source_set_audio_stream(RID p_source, AudioServer::Au
Source *source = source_owner.get(p_source);
ERR_FAIL_COND(!source);
AudioServer::get_singleton()->lock();
- source->stream=p_stream;
+ source->stream = p_stream;
_THREAD_SAFE_METHOD_
if (!p_stream) {
streaming_sources.erase(source);
- active_voices.erase(ActiveVoice(source,VOICE_IS_STREAM));
+ active_voices.erase(ActiveVoice(source, VOICE_IS_STREAM));
} else {
streaming_sources.insert(source);
- active_voices.insert(ActiveVoice(source,VOICE_IS_STREAM));
- zeromem(source->stream_data.filter_state,sizeof(Source::StreamData::FilterState)*4); //reset filter for safetyness
+ active_voices.insert(ActiveVoice(source, VOICE_IS_STREAM));
+ zeromem(source->stream_data.filter_state, sizeof(Source::StreamData::FilterState) * 4); //reset filter for safetyness
p_stream->set_mix_rate(AudioServer::get_singleton()->get_default_mix_rate());
}
@@ -424,27 +393,27 @@ void SpatialSoundServerSW::source_set_audio_stream(RID p_source, AudioServer::Au
SpatialSoundServer::SourceVoiceID SpatialSoundServerSW::source_play_sample(RID p_source, RID p_sample, int p_mix_rate, int p_voice) {
Source *source = source_owner.get(p_source);
- ERR_FAIL_COND_V(!source,SOURCE_INVALID_VOICE);
+ ERR_FAIL_COND_V(!source, SOURCE_INVALID_VOICE);
- int to_play=0;
+ int to_play = 0;
- if (p_voice==SOURCE_NEXT_VOICE) {
- to_play=source->last_voice+1;
- if (to_play>=source->voices.size())
- to_play=0;
+ if (p_voice == SOURCE_NEXT_VOICE) {
+ to_play = source->last_voice + 1;
+ if (to_play >= source->voices.size())
+ to_play = 0;
} else
- to_play=p_voice;
+ to_play = p_voice;
- ERR_FAIL_INDEX_V(to_play,source->voices.size(),SOURCE_INVALID_VOICE);
+ ERR_FAIL_INDEX_V(to_play, source->voices.size(), SOURCE_INVALID_VOICE);
- source->voices[to_play].restart=true;
- source->voices[to_play].sample_rid=p_sample;
- source->voices[to_play].sample_mix_rate=p_mix_rate;
- source->voices[to_play].pitch_scale=1;
- source->voices[to_play].volume_scale=0;
- source->last_voice=to_play;
- active_voices.insert(ActiveVoice(source,to_play));
+ source->voices[to_play].restart = true;
+ source->voices[to_play].sample_rid = p_sample;
+ source->voices[to_play].sample_mix_rate = p_mix_rate;
+ source->voices[to_play].pitch_scale = 1;
+ source->voices[to_play].volume_scale = 0;
+ source->last_voice = to_play;
+ active_voices.insert(ActiveVoice(source, to_play));
return to_play;
}
@@ -453,51 +422,47 @@ void SpatialSoundServerSW::source_voice_set_pitch_scale(RID p_source, SourceVoic
Source *source = source_owner.get(p_source);
ERR_FAIL_COND(!source);
- ERR_FAIL_INDEX(p_voice,source->voices.size());
- source->voices[p_voice].pitch_scale=p_pitch_scale;
-
+ ERR_FAIL_INDEX(p_voice, source->voices.size());
+ source->voices[p_voice].pitch_scale = p_pitch_scale;
}
void SpatialSoundServerSW::source_voice_set_volume_scale_db(RID p_source, SourceVoiceID p_voice, float p_db) {
Source *source = source_owner.get(p_source);
ERR_FAIL_COND(!source);
- ERR_FAIL_INDEX(p_voice,source->voices.size());
- source->voices[p_voice].volume_scale=p_db;
-
+ ERR_FAIL_INDEX(p_voice, source->voices.size());
+ source->voices[p_voice].volume_scale = p_db;
}
bool SpatialSoundServerSW::source_is_voice_active(RID p_source, SourceVoiceID p_voice) const {
Source *source = source_owner.get(p_source);
- ERR_FAIL_COND_V(!source,false);
- ERR_FAIL_INDEX_V(p_voice,source->voices.size(),false);
+ ERR_FAIL_COND_V(!source, false);
+ ERR_FAIL_INDEX_V(p_voice, source->voices.size(), false);
return source->voices[p_voice].active || source->voices[p_voice].restart;
-
}
void SpatialSoundServerSW::source_stop_voice(RID p_source, SourceVoiceID p_voice) {
Source *source = source_owner.get(p_source);
ERR_FAIL_COND(!source);
- ERR_FAIL_INDEX(p_voice,source->voices.size());
+ ERR_FAIL_INDEX(p_voice, source->voices.size());
if (source->voices[p_voice].active) {
AudioServer::get_singleton()->voice_stop(source->voices[p_voice].voice_rid);
}
- source->voices[p_voice].active=false;
- source->voices[p_voice].restart=false;
- active_voices.erase(ActiveVoice(source,p_voice));
+ source->voices[p_voice].active = false;
+ source->voices[p_voice].restart = false;
+ active_voices.erase(ActiveVoice(source, p_voice));
}
/* LISTENER */
RID SpatialSoundServerSW::listener_create() {
- Listener *listener = memnew( Listener );
+ Listener *listener = memnew(Listener);
RID listener_rid = listener_owner.make_rid(listener);
return listener_rid;
-
}
-void SpatialSoundServerSW::listener_set_space(RID p_listener,RID p_space) {
+void SpatialSoundServerSW::listener_set_space(RID p_listener, RID p_space) {
Listener *listener = listener_owner.get(p_listener);
ERR_FAIL_COND(!listener);
@@ -509,67 +474,64 @@ void SpatialSoundServerSW::listener_set_space(RID p_listener,RID p_space) {
lspace->listeners.erase(p_listener);
}
- listener->space=RID();
+ listener->space = RID();
if (p_space.is_valid()) {
Space *space = space_owner.get(p_space);
ERR_FAIL_COND(!space);
- listener->space=p_space;
+ listener->space = p_space;
space->listeners.insert(p_listener);
}
-
}
-void SpatialSoundServerSW::listener_set_transform(RID p_listener, const Transform& p_transform) {
+void SpatialSoundServerSW::listener_set_transform(RID p_listener, const Transform &p_transform) {
Listener *listener = listener_owner.get(p_listener);
ERR_FAIL_COND(!listener);
- listener->transform=p_transform;
+ listener->transform = p_transform;
listener->transform.orthonormalize(); //must be done..
}
Transform SpatialSoundServerSW::listener_get_transform(RID p_listener) const {
Listener *listener = listener_owner.get(p_listener);
- ERR_FAIL_COND_V(!listener,Transform());
+ ERR_FAIL_COND_V(!listener, Transform());
return listener->transform;
}
void SpatialSoundServerSW::listener_set_param(RID p_listener, ListenerParam p_param, float p_value) {
- ERR_FAIL_INDEX(p_param,LISTENER_PARAM_MAX);
+ ERR_FAIL_INDEX(p_param, LISTENER_PARAM_MAX);
Listener *listener = listener_owner.get(p_listener);
ERR_FAIL_COND(!listener);
- listener->params[p_param]=p_value;
+ listener->params[p_param] = p_value;
}
float SpatialSoundServerSW::listener_get_param(RID p_listener, ListenerParam p_param) const {
- ERR_FAIL_INDEX_V(p_param,LISTENER_PARAM_MAX,0);
+ ERR_FAIL_INDEX_V(p_param, LISTENER_PARAM_MAX, 0);
Listener *listener = listener_owner.get(p_listener);
- ERR_FAIL_COND_V(!listener,0);
+ ERR_FAIL_COND_V(!listener, 0);
return listener->params[p_param];
}
-
/* MISC */
void SpatialSoundServerSW::free(RID p_id) {
-
if (space_owner.owns(p_id)) {
Space *space = space_owner.get(p_id);
free(space->default_room);
- while(space->listeners.size()) {
- listener_set_space(space->listeners.front()->get(),RID());
+ while (space->listeners.size()) {
+ listener_set_space(space->listeners.front()->get(), RID());
}
- while(space->sources.size()) {
+ while (space->sources.size()) {
free(space->sources.front()->get());
}
- while(space->rooms.size()) {
- room_set_space(space->rooms.front()->get(),RID());
+ while (space->rooms.size()) {
+ room_set_space(space->rooms.front()->get(), RID());
}
space_owner.free(p_id);
memdelete(space);
@@ -578,13 +540,13 @@ void SpatialSoundServerSW::free(RID p_id) {
Source *source = source_owner.get(p_id);
if (source->stream)
- source_set_audio_stream(p_id,NULL);
+ source_set_audio_stream(p_id, NULL);
Space *space = space_owner.get(source->space);
ERR_FAIL_COND(!space);
space->sources.erase(p_id);
- for(int i=0;i<source->voices.size();i++) {
- active_voices.erase(ActiveVoice(source,i));
+ for (int i = 0; i < source->voices.size(); i++) {
+ active_voices.erase(ActiveVoice(source, i));
}
source_owner.free(p_id);
memdelete(source);
@@ -612,9 +574,8 @@ void SpatialSoundServerSW::free(RID p_id) {
room_owner.free(p_id);
memdelete(room);
} else {
- ERR_PRINT("Attempt to free invalid ID") ;
+ ERR_PRINT("Attempt to free invalid ID");
}
-
}
void SpatialSoundServerSW::_clean_up_owner(RID_OwnerBase *p_owner, const char *p_area) {
@@ -622,10 +583,10 @@ void SpatialSoundServerSW::_clean_up_owner(RID_OwnerBase *p_owner, const char *p
List<RID> rids;
p_owner->get_owned_list(&rids);
- for(List<RID>::Element *I=rids.front();I;I=I->next()) {
+ for (List<RID>::Element *I = rids.front(); I; I = I->next()) {
if (OS::get_singleton()->is_stdout_verbose()) {
- print_line("Leaked RID ("+itos(I->get().get_id())+") of type "+String(p_area));
+ print_line("Leaked RID (" + itos(I->get().get_id()) + ") of type " + String(p_area));
}
free(I->get());
}
@@ -633,47 +594,41 @@ void SpatialSoundServerSW::_clean_up_owner(RID_OwnerBase *p_owner, const char *p
void SpatialSoundServerSW::init() {
- internal_buffer = memnew_arr(int32_t, INTERNAL_BUFFER_SIZE*INTERNAL_BUFFER_MAX_CHANNELS);
- internal_buffer_channels=AudioServer::get_singleton()->get_default_channel_count();
+ internal_buffer = memnew_arr(int32_t, INTERNAL_BUFFER_SIZE * INTERNAL_BUFFER_MAX_CHANNELS);
+ internal_buffer_channels = AudioServer::get_singleton()->get_default_channel_count();
- internal_audio_stream = memnew( InternalAudioStream );
- internal_audio_stream->owner=this;
+ internal_audio_stream = memnew(InternalAudioStream);
+ internal_audio_stream->owner = this;
internal_audio_stream_rid = AudioServer::get_singleton()->audio_stream_create(internal_audio_stream);
- AudioServer::get_singleton()->stream_set_active(internal_audio_stream_rid,true);
-
+ AudioServer::get_singleton()->stream_set_active(internal_audio_stream_rid, true);
}
-
-
static float _get_attenuation(float cosine, float angle, float attenuation) {
+ float listener_ang = Math::rad2deg(Math::acos(cosine)) - angle;
- float listener_ang = Math::rad2deg(Math::acos(cosine))-angle;
-
- if (listener_ang>0 && angle<180.0) {
- listener_ang/=(180.0-angle);
- return Math::db2linear(Math::sin(listener_ang*(Math_PI/2.0))*attenuation);
+ if (listener_ang > 0 && angle < 180.0) {
+ listener_ang /= (180.0 - angle);
+ return Math::db2linear(Math::sin(listener_ang * (Math_PI / 2.0)) * attenuation);
}
return 1.0;
}
+bool SpatialSoundServerSW::internal_buffer_mix(int32_t *p_buffer, int p_frames) {
-bool SpatialSoundServerSW::internal_buffer_mix(int32_t *p_buffer,int p_frames) {
-
- if (streaming_sources.size()==0)
+ if (streaming_sources.size() == 0)
return false; //nothing to mix
+ for (Set<Source *>::Element *E = streaming_sources.front(); E; E = E->next()) {
- for (Set<Source*>::Element *E=streaming_sources.front();E;E=E->next()) {
-
- Source *s=E->get();
+ Source *s = E->get();
ERR_CONTINUE(!s->stream);
int channels = s->stream->get_channel_count();
- Source::StreamData &sd=s->stream_data;
+ Source::StreamData &sd = s->stream_data;
- int todo=p_frames;
+ int todo = p_frames;
AudioFilterSW filter;
filter.set_sampling_rate(AudioServer::get_singleton()->get_default_mix_rate());
@@ -687,164 +642,162 @@ bool SpatialSoundServerSW::internal_buffer_mix(int32_t *p_buffer,int p_frames) {
int32_t in[4];
#ifndef SPATIAL_SOUND_SERVER_NO_FILTER
-#define DO_FILTER(m_c)\
- {\
- float val = in[m_c];\
- float pre=val;\
- val = val*coefs.b0 + sd.filter_state[m_c].hb[0]*coefs.b1 + sd.filter_state[m_c].hb[1]*coefs.b2 + sd.filter_state[m_c].ha[0]*coefs.a1 + sd.filter_state[m_c].ha[1]*coefs.a2;\
- sd.filter_state[m_c].ha[1]=sd.filter_state[m_c].ha[0];\
- sd.filter_state[m_c].hb[1]=sd.filter_state[m_c].hb[0]; \
- sd.filter_state[m_c].hb[0]=pre;\
- sd.filter_state[m_c].ha[0]=val;\
- in[m_c]=Math::fast_ftoi(val);\
- }
+#define DO_FILTER(m_c) \
+ { \
+ float val = in[m_c]; \
+ float pre = val; \
+ val = val * coefs.b0 + sd.filter_state[m_c].hb[0] * coefs.b1 + sd.filter_state[m_c].hb[1] * coefs.b2 + sd.filter_state[m_c].ha[0] * coefs.a1 + sd.filter_state[m_c].ha[1] * coefs.a2; \
+ sd.filter_state[m_c].ha[1] = sd.filter_state[m_c].ha[0]; \
+ sd.filter_state[m_c].hb[1] = sd.filter_state[m_c].hb[0]; \
+ sd.filter_state[m_c].hb[0] = pre; \
+ sd.filter_state[m_c].ha[0] = val; \
+ in[m_c] = Math::fast_ftoi(val); \
+ }
#else
#define DO_FILTER(m_c)
#endif
- while(todo) {
+ while (todo) {
- int to_mix=MIN(todo,INTERNAL_BUFFER_SIZE);
+ int to_mix = MIN(todo, INTERNAL_BUFFER_SIZE);
- s->stream->mix(internal_buffer,to_mix);
+ s->stream->mix(internal_buffer, to_mix);
- switch(internal_buffer_channels) {
+ switch (internal_buffer_channels) {
case 2: {
- float p = sd.panning.x*0.5+0.5;
- float panf[2]={ (1.0-p),p };
- panf[0]*=sd.volume;
- panf[1]*=sd.volume;
+ float p = sd.panning.x * 0.5 + 0.5;
+ float panf[2] = { (1.0 - p), p };
+ panf[0] *= sd.volume;
+ panf[1] *= sd.volume;
- int32_t pan[2]={Math::fast_ftoi(panf[0]*(1<<16)),Math::fast_ftoi(panf[1]*(1<<16))};
+ int32_t pan[2] = { Math::fast_ftoi(panf[0] * (1 << 16)), Math::fast_ftoi(panf[1] * (1 << 16)) };
- switch(channels) {
+ switch (channels) {
case 1: {
- for(int i=0;i<to_mix;i++) {
+ for (int i = 0; i < to_mix; i++) {
- in[0]=internal_buffer[i];
- in[1]=internal_buffer[i];
+ in[0] = internal_buffer[i];
+ in[1] = internal_buffer[i];
DO_FILTER(0);
DO_FILTER(1);
- p_buffer[(i<<1)+0]=((in[0]>>16)*pan[0]);
- p_buffer[(i<<1)+1]=((in[1]>>16)*pan[1]);
+ p_buffer[(i << 1) + 0] = ((in[0] >> 16) * pan[0]);
+ p_buffer[(i << 1) + 1] = ((in[1] >> 16) * pan[1]);
}
} break;
case 2: {
- for(int i=0;i<to_mix;i++) {
+ for (int i = 0; i < to_mix; i++) {
- in[0]=internal_buffer[(i<<1)+0];
- in[1]=internal_buffer[(i<<1)+1];
+ in[0] = internal_buffer[(i << 1) + 0];
+ in[1] = internal_buffer[(i << 1) + 1];
DO_FILTER(0);
DO_FILTER(1);
- p_buffer[(i<<1)+0]=((in[0]>>16)*pan[0]);
- p_buffer[(i<<1)+1]=((in[1]>>16)*pan[1]);
+ p_buffer[(i << 1) + 0] = ((in[0] >> 16) * pan[0]);
+ p_buffer[(i << 1) + 1] = ((in[1] >> 16) * pan[1]);
}
} break;
case 4: {
- for(int i=0;i<to_mix;i++) {
+ for (int i = 0; i < to_mix; i++) {
- in[0]=(internal_buffer[(i<<2)+0]+internal_buffer[(i<<2)+2])>>1;
- in[1]=(internal_buffer[(i<<2)+1]+internal_buffer[(i<<2)+3])>>1;
+ in[0] = (internal_buffer[(i << 2) + 0] + internal_buffer[(i << 2) + 2]) >> 1;
+ in[1] = (internal_buffer[(i << 2) + 1] + internal_buffer[(i << 2) + 3]) >> 1;
DO_FILTER(0);
DO_FILTER(1);
- p_buffer[(i<<1)+0]=((in[0]>>16)*pan[0]);
- p_buffer[(i<<1)+1]=((in[1]>>16)*pan[1]);
+ p_buffer[(i << 1) + 0] = ((in[0] >> 16) * pan[0]);
+ p_buffer[(i << 1) + 1] = ((in[1] >> 16) * pan[1]);
}
} break;
-
- } break;
+ }
+ break;
} break;
case 4: {
- float xp = sd.panning.x*0.5+0.5;
- float yp = sd.panning.y*0.5+0.5;
- float panf[4]={ (1.0-xp)*(1.0-yp),(xp)*(1.0-yp),(1.0-xp)*(yp),(xp)*(yp) };
- panf[0]*=sd.volume;
- panf[1]*=sd.volume;
- panf[2]*=sd.volume;
- panf[3]*=sd.volume;
+ float xp = sd.panning.x * 0.5 + 0.5;
+ float yp = sd.panning.y * 0.5 + 0.5;
+ float panf[4] = { (1.0 - xp) * (1.0 - yp), (xp) * (1.0 - yp), (1.0 - xp) * (yp), (xp) * (yp) };
+ panf[0] *= sd.volume;
+ panf[1] *= sd.volume;
+ panf[2] *= sd.volume;
+ panf[3] *= sd.volume;
- int32_t pan[4]={
- Math::fast_ftoi(panf[0]*(1<<16)),
- Math::fast_ftoi(panf[1]*(1<<16)),
- Math::fast_ftoi(panf[2]*(1<<16)),
- Math::fast_ftoi(panf[3]*(1<<16))};
+ int32_t pan[4] = {
+ Math::fast_ftoi(panf[0] * (1 << 16)),
+ Math::fast_ftoi(panf[1] * (1 << 16)),
+ Math::fast_ftoi(panf[2] * (1 << 16)),
+ Math::fast_ftoi(panf[3] * (1 << 16))
+ };
- switch(channels) {
+ switch (channels) {
case 1: {
- for(int i=0;i<to_mix;i++) {
+ for (int i = 0; i < to_mix; i++) {
- in[0]=internal_buffer[i];
- in[1]=internal_buffer[i];
- in[2]=internal_buffer[i];
- in[3]=internal_buffer[i];
+ in[0] = internal_buffer[i];
+ in[1] = internal_buffer[i];
+ in[2] = internal_buffer[i];
+ in[3] = internal_buffer[i];
DO_FILTER(0);
DO_FILTER(1);
DO_FILTER(2);
DO_FILTER(3);
- p_buffer[(i<<2)+0]=((in[0]>>16)*pan[0]);
- p_buffer[(i<<2)+1]=((in[1]>>16)*pan[1]);
- p_buffer[(i<<2)+2]=((in[2]>>16)*pan[2]);
- p_buffer[(i<<2)+3]=((in[3]>>16)*pan[3]);
+ p_buffer[(i << 2) + 0] = ((in[0] >> 16) * pan[0]);
+ p_buffer[(i << 2) + 1] = ((in[1] >> 16) * pan[1]);
+ p_buffer[(i << 2) + 2] = ((in[2] >> 16) * pan[2]);
+ p_buffer[(i << 2) + 3] = ((in[3] >> 16) * pan[3]);
}
} break;
case 2: {
- for(int i=0;i<to_mix;i++) {
+ for (int i = 0; i < to_mix; i++) {
- in[0]=internal_buffer[(i<<1)+0];
- in[1]=internal_buffer[(i<<1)+1];
- in[2]=internal_buffer[(i<<1)+0];
- in[3]=internal_buffer[(i<<1)+1];
+ in[0] = internal_buffer[(i << 1) + 0];
+ in[1] = internal_buffer[(i << 1) + 1];
+ in[2] = internal_buffer[(i << 1) + 0];
+ in[3] = internal_buffer[(i << 1) + 1];
DO_FILTER(0);
DO_FILTER(1);
DO_FILTER(2);
DO_FILTER(3);
- p_buffer[(i<<2)+0]=((in[0]>>16)*pan[0]);
- p_buffer[(i<<2)+1]=((in[1]>>16)*pan[1]);
- p_buffer[(i<<2)+2]=((in[2]>>16)*pan[2]);
- p_buffer[(i<<2)+3]=((in[3]>>16)*pan[3]);
+ p_buffer[(i << 2) + 0] = ((in[0] >> 16) * pan[0]);
+ p_buffer[(i << 2) + 1] = ((in[1] >> 16) * pan[1]);
+ p_buffer[(i << 2) + 2] = ((in[2] >> 16) * pan[2]);
+ p_buffer[(i << 2) + 3] = ((in[3] >> 16) * pan[3]);
}
} break;
case 4: {
- for(int i=0;i<to_mix;i++) {
+ for (int i = 0; i < to_mix; i++) {
- in[0]=internal_buffer[(i<<2)+0];
- in[1]=internal_buffer[(i<<2)+1];
- in[2]=internal_buffer[(i<<2)+2];
- in[3]=internal_buffer[(i<<2)+3];
+ in[0] = internal_buffer[(i << 2) + 0];
+ in[1] = internal_buffer[(i << 2) + 1];
+ in[2] = internal_buffer[(i << 2) + 2];
+ in[3] = internal_buffer[(i << 2) + 3];
DO_FILTER(0);
DO_FILTER(1);
DO_FILTER(2);
DO_FILTER(3);
- p_buffer[(i<<2)+0]=((in[0]>>16)*pan[0]);
- p_buffer[(i<<2)+1]=((in[1]>>16)*pan[1]);
- p_buffer[(i<<2)+2]=((in[2]>>16)*pan[2]);
- p_buffer[(i<<2)+3]=((in[3]>>16)*pan[3]);
+ p_buffer[(i << 2) + 0] = ((in[0] >> 16) * pan[0]);
+ p_buffer[(i << 2) + 1] = ((in[1] >> 16) * pan[1]);
+ p_buffer[(i << 2) + 2] = ((in[2] >> 16) * pan[2]);
+ p_buffer[(i << 2) + 3] = ((in[3] >> 16) * pan[3]);
}
} break;
-
- } break;
+ }
+ break;
} break;
case 6: {
-
} break;
}
- p_buffer+=to_mix*internal_buffer_channels;
- todo-=to_mix;
-
+ p_buffer += to_mix * internal_buffer_channels;
+ todo -= to_mix;
}
-
}
return true;
@@ -854,90 +807,85 @@ void SpatialSoundServerSW::update(float p_delta) {
List<ActiveVoice> to_disable;
-
- for(Set<ActiveVoice>::Element *E=active_voices.front();E;E=E->next()) {
+ for (Set<ActiveVoice>::Element *E = active_voices.front(); E; E = E->next()) {
Source *source = E->get().source;
int voice = E->get().voice;
- if (voice!=VOICE_IS_STREAM) {
- Source::Voice &v=source->voices[voice];
+ if (voice != VOICE_IS_STREAM) {
+ Source::Voice &v = source->voices[voice];
ERR_CONTINUE(!v.active && !v.restart); // likely a bug...
}
//this could be optimized at some point... am not sure
- Space *space=space_owner.get(source->space);
- Room *room=room_owner.get(space->default_room);
- int max_level=-0x80000000;
- int rooms_culled = space->octree.cull_point(source->transform.origin,cull_rooms,MAX_CULL_ROOMS);
- for(int i=0;i<rooms_culled;i++) {
+ Space *space = space_owner.get(source->space);
+ Room *room = room_owner.get(space->default_room);
+ int max_level = -0x80000000;
+ int rooms_culled = space->octree.cull_point(source->transform.origin, cull_rooms, MAX_CULL_ROOMS);
+ for (int i = 0; i < rooms_culled; i++) {
- Room *r=cull_rooms[i];
- ERR_CONTINUE( r->bounds.is_empty() ); // how did this happen??
- if (r->level<=max_level) //ignore optimization (level too low)
+ Room *r = cull_rooms[i];
+ ERR_CONTINUE(r->bounds.is_empty()); // how did this happen??
+ if (r->level <= max_level) //ignore optimization (level too low)
continue;
Vector3 local_point = r->inverse_transform.xform(source->transform.origin);
if (!r->bounds.point_is_inside(local_point))
continue;
- room=r;
- max_level=r->level;
-
+ room = r;
+ max_level = r->level;
}
-
//compute mixing weights (support for multiple listeners in the same output)
- float total_distance=0;
- for(Set<RID>::Element *L=space->listeners.front();L;L=L->next()) {
- Listener *listener=listener_owner.get(L->get());
- total_distance+=listener->transform.origin.distance_to(source->transform.origin);
+ float total_distance = 0;
+ for (Set<RID>::Element *L = space->listeners.front(); L; L = L->next()) {
+ Listener *listener = listener_owner.get(L->get());
+ total_distance += listener->transform.origin.distance_to(source->transform.origin);
}
//compute spatialization variables, weighted according to distance
float volume_attenuation = 0.0;
float air_absorption_hf_cutoff = 0.0;
float air_absorption = 0.0;
- float pitch_scale=1.0;
+ float pitch_scale = 1.0;
Vector3 panning;
-
//print_line("listeners: "+itos(space->listeners.size()));
+ for (Set<RID>::Element *L = space->listeners.front(); L; L = L->next()) {
- for(Set<RID>::Element *L=space->listeners.front();L;L=L->next()) {
-
- Listener *listener=listener_owner.get(L->get());
+ Listener *listener = listener_owner.get(L->get());
Vector3 rel_vector = listener->transform.xform_inv(source->transform.origin);
Vector3 source_rel_vector = source->transform.xform_inv(listener->transform.origin).normalized();
- float distance=rel_vector.length();
- float weight = distance/total_distance;
- float pscale=1.0;
+ float distance = rel_vector.length();
+ float weight = distance / total_distance;
+ float pscale = 1.0;
- float distance_scale=listener->params[LISTENER_PARAM_ATTENUATION_SCALE]*room->params[ROOM_PARAM_ATTENUATION_SCALE];
- float distance_min=source->params[SOURCE_PARAM_ATTENUATION_MIN_DISTANCE]*distance_scale;
- float distance_max=source->params[SOURCE_PARAM_ATTENUATION_MAX_DISTANCE]*distance_scale;
- float attenuation_exp=source->params[SOURCE_PARAM_ATTENUATION_DISTANCE_EXP];
- float attenuation=1;
+ float distance_scale = listener->params[LISTENER_PARAM_ATTENUATION_SCALE] * room->params[ROOM_PARAM_ATTENUATION_SCALE];
+ float distance_min = source->params[SOURCE_PARAM_ATTENUATION_MIN_DISTANCE] * distance_scale;
+ float distance_max = source->params[SOURCE_PARAM_ATTENUATION_MAX_DISTANCE] * distance_scale;
+ float attenuation_exp = source->params[SOURCE_PARAM_ATTENUATION_DISTANCE_EXP];
+ float attenuation = 1;
//print_line("DIST MIN: "+rtos(distance_min));
//print_line("DIST MAX: "+rtos(distance_max));
- if (distance_max>0) {
- distance = CLAMP(distance,distance_min,distance_max);
- attenuation = Math::pow(1.0 - ((distance - distance_min)/(distance_max-distance_min)),CLAMP(attenuation_exp,0.001,16));
+ if (distance_max > 0) {
+ distance = CLAMP(distance, distance_min, distance_max);
+ attenuation = Math::pow(1.0 - ((distance - distance_min) / (distance_max - distance_min)), CLAMP(attenuation_exp, 0.001, 16));
}
float hf_attenuation_cutoff = room->params[ROOM_PARAM_ATTENUATION_HF_CUTOFF];
float hf_attenuation_exp = room->params[ROOM_PARAM_ATTENUATION_HF_RATIO_EXP];
float hf_attenuation_floor = room->params[ROOM_PARAM_ATTENUATION_HF_FLOOR_DB];
- float absorption=Math::db2linear(Math::lerp(hf_attenuation_floor,0,Math::pow(attenuation,hf_attenuation_exp)));
+ float absorption = Math::db2linear(Math::lerp(hf_attenuation_floor, 0, Math::pow(attenuation, hf_attenuation_exp)));
// source emission cone
- float emission_deg=source->params[SOURCE_PARAM_EMISSION_CONE_DEGREES];
- float emission_attdb=source->params[SOURCE_PARAM_EMISSION_CONE_ATTENUATION_DB];
- absorption*=_get_attenuation(source_rel_vector.dot(Vector3(0,0,-1)),emission_deg,emission_attdb);
+ float emission_deg = source->params[SOURCE_PARAM_EMISSION_CONE_DEGREES];
+ float emission_attdb = source->params[SOURCE_PARAM_EMISSION_CONE_ATTENUATION_DB];
+ absorption *= _get_attenuation(source_rel_vector.dot(Vector3(0, 0, -1)), emission_deg, emission_attdb);
- Vector3 vpanning=rel_vector.normalized();
+ Vector3 vpanning = rel_vector.normalized();
//listener stuff
@@ -945,30 +893,24 @@ void SpatialSoundServerSW::update(float p_delta) {
// head cone
- float reception_deg=listener->params[LISTENER_PARAM_RECEPTION_CONE_DEGREES];
- float reception_attdb=listener->params[LISTENER_PARAM_RECEPTION_CONE_ATTENUATION_DB];
+ float reception_deg = listener->params[LISTENER_PARAM_RECEPTION_CONE_DEGREES];
+ float reception_attdb = listener->params[LISTENER_PARAM_RECEPTION_CONE_ATTENUATION_DB];
- absorption*=_get_attenuation(vpanning.dot(Vector3(0,0,-1)),reception_deg,reception_attdb);
+ absorption *= _get_attenuation(vpanning.dot(Vector3(0, 0, -1)), reception_deg, reception_attdb);
// scale
- attenuation*=Math::db2linear(listener->params[LISTENER_PARAM_VOLUME_SCALE_DB]);
- pscale*=Math::db2linear(listener->params[LISTENER_PARAM_PITCH_SCALE]);
-
-
+ attenuation *= Math::db2linear(listener->params[LISTENER_PARAM_VOLUME_SCALE_DB]);
+ pscale *= Math::db2linear(listener->params[LISTENER_PARAM_PITCH_SCALE]);
}
-
-
-
//add values
- volume_attenuation+=weight*attenuation; // plus other stuff i guess
- air_absorption+=weight*absorption;
- air_absorption_hf_cutoff+=weight*hf_attenuation_cutoff;
- panning+=vpanning*weight;
+ volume_attenuation += weight * attenuation; // plus other stuff i guess
+ air_absorption += weight * absorption;
+ air_absorption_hf_cutoff += weight * hf_attenuation_cutoff;
+ panning += vpanning * weight;
//pitch_scale+=pscale*weight;
-
}
RoomReverb reverb_room;
@@ -977,95 +919,89 @@ void SpatialSoundServerSW::update(float p_delta) {
/* APPLY ROOM SETTINGS */
{
- pitch_scale*=room->params[ROOM_PARAM_PITCH_SCALE];
- volume_attenuation*=Math::db2linear(room->params[ROOM_PARAM_VOLUME_SCALE_DB]);
- reverb_room=room->reverb;
- reverb_send=Math::lerp(1.0,volume_attenuation,room->params[ROOM_PARAM_ATTENUATION_REVERB_SCALE])*room->params[ROOM_PARAM_REVERB_SEND];
-
+ pitch_scale *= room->params[ROOM_PARAM_PITCH_SCALE];
+ volume_attenuation *= Math::db2linear(room->params[ROOM_PARAM_VOLUME_SCALE_DB]);
+ reverb_room = room->reverb;
+ reverb_send = Math::lerp(1.0, volume_attenuation, room->params[ROOM_PARAM_ATTENUATION_REVERB_SCALE]) * room->params[ROOM_PARAM_REVERB_SEND];
}
/* UPDATE VOICE & STREAM */
-
-
- if (voice==VOICE_IS_STREAM) {
+ if (voice == VOICE_IS_STREAM) {
//update voice!!
- source->stream_data.panning=panning;
- source->stream_data.volume=volume_attenuation*Math::db2linear(source->params[SOURCE_PARAM_VOLUME_DB]);
- source->stream_data.reverb=reverb_room;
- source->stream_data.reverb_send=reverb_send;
- source->stream_data.filter_gain=air_absorption;
- source->stream_data.filter_cutoff=air_absorption_hf_cutoff;
+ source->stream_data.panning = panning;
+ source->stream_data.volume = volume_attenuation * Math::db2linear(source->params[SOURCE_PARAM_VOLUME_DB]);
+ source->stream_data.reverb = reverb_room;
+ source->stream_data.reverb_send = reverb_send;
+ source->stream_data.filter_gain = air_absorption;
+ source->stream_data.filter_cutoff = air_absorption_hf_cutoff;
if (!source->stream) //stream is gone bye bye
- to_disable.push_back(ActiveVoice(source,voice)); // oh well..
+ to_disable.push_back(ActiveVoice(source, voice)); // oh well..
- } else if (voice>=0) {
+ } else if (voice >= 0) {
//update stream!!
- Source::Voice &v=source->voices[voice];
+ Source::Voice &v = source->voices[voice];
if (v.restart)
- AudioServer::get_singleton()->voice_play(v.voice_rid,v.sample_rid);
-
- float volume_scale = Math::db2linear(v.volume_scale)*Math::db2linear(source->params[SOURCE_PARAM_VOLUME_DB]);
- float volume = volume_attenuation*volume_scale;
- reverb_send*=volume_scale;
- int mix_rate = v.sample_mix_rate*v.pitch_scale*pitch_scale*source->params[SOURCE_PARAM_PITCH_SCALE];
+ AudioServer::get_singleton()->voice_play(v.voice_rid, v.sample_rid);
+ float volume_scale = Math::db2linear(v.volume_scale) * Math::db2linear(source->params[SOURCE_PARAM_VOLUME_DB]);
+ float volume = volume_attenuation * volume_scale;
+ reverb_send *= volume_scale;
+ int mix_rate = v.sample_mix_rate * v.pitch_scale * pitch_scale * source->params[SOURCE_PARAM_PITCH_SCALE];
- if (mix_rate<=0) {
+ if (mix_rate <= 0) {
ERR_PRINT("Invalid mix rate for voice (0) check for invalid pitch_scale param.");
- to_disable.push_back(ActiveVoice(source,voice)); // oh well..
+ to_disable.push_back(ActiveVoice(source, voice)); // oh well..
continue; //invalid mix rate, disabling
}
- if (v.restart || v.last_volume!=volume)
- AudioServer::get_singleton()->voice_set_volume(v.voice_rid,volume);
- if (v.restart || v.last_mix_rate!=mix_rate)
- AudioServer::get_singleton()->voice_set_mix_rate(v.voice_rid,mix_rate);
- if (v.restart || v.last_filter_gain!=air_absorption || v.last_filter_cutoff!=air_absorption_hf_cutoff)
- AudioServer::get_singleton()->voice_set_filter(v.voice_rid,AudioServer::FILTER_HIGH_SHELF,air_absorption_hf_cutoff,1.0,air_absorption);
- if (v.restart || v.last_panning!=panning)
- AudioServer::get_singleton()->voice_set_pan(v.voice_rid,panning.x,panning.y,panning.z);
- if (v.restart || v.last_reverb_room!=reverb_room || v.last_reverb_send!=reverb_send)
- AudioServer::get_singleton()->voice_set_reverb(v.voice_rid,AudioServer::ReverbRoomType(reverb_room),reverb_send);
+ if (v.restart || v.last_volume != volume)
+ AudioServer::get_singleton()->voice_set_volume(v.voice_rid, volume);
+ if (v.restart || v.last_mix_rate != mix_rate)
+ AudioServer::get_singleton()->voice_set_mix_rate(v.voice_rid, mix_rate);
+ if (v.restart || v.last_filter_gain != air_absorption || v.last_filter_cutoff != air_absorption_hf_cutoff)
+ AudioServer::get_singleton()->voice_set_filter(v.voice_rid, AudioServer::FILTER_HIGH_SHELF, air_absorption_hf_cutoff, 1.0, air_absorption);
+ if (v.restart || v.last_panning != panning)
+ AudioServer::get_singleton()->voice_set_pan(v.voice_rid, panning.x, panning.y, panning.z);
+ if (v.restart || v.last_reverb_room != reverb_room || v.last_reverb_send != reverb_send)
+ AudioServer::get_singleton()->voice_set_reverb(v.voice_rid, AudioServer::ReverbRoomType(reverb_room), reverb_send);
- v.last_volume=volume;
- v.last_mix_rate=mix_rate;
- v.last_filter_gain=air_absorption;
- v.last_filter_cutoff=air_absorption_hf_cutoff;
- v.last_panning=panning;
- v.restart=false;
- v.active=true;
+ v.last_volume = volume;
+ v.last_mix_rate = mix_rate;
+ v.last_filter_gain = air_absorption;
+ v.last_filter_cutoff = air_absorption_hf_cutoff;
+ v.last_panning = panning;
+ v.restart = false;
+ v.active = true;
if (!AudioServer::get_singleton()->voice_is_active(v.voice_rid))
- to_disable.push_back(ActiveVoice(source,voice)); // oh well..
+ to_disable.push_back(ActiveVoice(source, voice)); // oh well..
}
}
- while(to_disable.size()) {
+ while (to_disable.size()) {
ActiveVoice av = to_disable.front()->get();
- av.source->voices[av.voice].active=false;
- av.source->voices[av.voice].restart=false;
+ av.source->voices[av.voice].active = false;
+ av.source->voices[av.voice].restart = false;
active_voices.erase(av);
to_disable.pop_front();
}
-
}
void SpatialSoundServerSW::finish() {
AudioServer::get_singleton()->free(internal_audio_stream_rid);
memdelete(internal_audio_stream);
- _clean_up_owner(&source_owner,"Source");
- _clean_up_owner(&listener_owner,"Listener");
- _clean_up_owner(&room_owner,"Room");
- _clean_up_owner(&space_owner,"Space");
+ _clean_up_owner(&source_owner, "Source");
+ _clean_up_owner(&listener_owner, "Listener");
+ _clean_up_owner(&room_owner, "Room");
+ _clean_up_owner(&space_owner, "Space");
memdelete_arr(internal_buffer);
}
SpatialSoundServerSW::SpatialSoundServerSW() {
-
}
diff --git a/servers/spatial_sound/spatial_sound_server_sw.h b/servers/spatial_sound/spatial_sound_server_sw.h
index c9780607f..e05b78a94 100644
--- a/servers/spatial_sound/spatial_sound_server_sw.h
+++ b/servers/spatial_sound/spatial_sound_server_sw.h
@@ -29,32 +29,30 @@
#ifndef SPATIAL_SOUND_SERVER_SW_H
#define SPATIAL_SOUND_SERVER_SW_H
-#include "servers/spatial_sound_server.h"
#include "octree.h"
#include "os/thread_safe.h"
-
+#include "servers/spatial_sound_server.h"
class SpatialSoundServerSW : public SpatialSoundServer {
- OBJ_TYPE(SpatialSoundServerSW,SpatialSoundServer);
+ OBJ_TYPE(SpatialSoundServerSW, SpatialSoundServer);
_THREAD_SAFE_CLASS_
enum {
- MAX_CULL_ROOMS=128,
- INTERNAL_BUFFER_SIZE=4096,
- INTERNAL_BUFFER_MAX_CHANNELS=4,
- VOICE_IS_STREAM=-1
+ MAX_CULL_ROOMS = 128,
+ INTERNAL_BUFFER_SIZE = 4096,
+ INTERNAL_BUFFER_MAX_CHANNELS = 4,
+ VOICE_IS_STREAM = -1
};
-
struct InternalAudioStream : public AudioServer::AudioStream {
::SpatialSoundServerSW *owner;
virtual int get_channel_count() const;
virtual void set_mix_rate(int p_rate); //notify the stream of the mix rate
- virtual bool mix(int32_t *p_buffer,int p_frames);
+ virtual bool mix(int32_t *p_buffer, int p_frames);
virtual void update();
};
@@ -63,7 +61,7 @@ class SpatialSoundServerSW : public SpatialSoundServer {
int32_t *internal_buffer;
int internal_buffer_channels;
- bool internal_buffer_mix(int32_t *p_buffer,int p_frames);
+ bool internal_buffer_mix(int32_t *p_buffer, int p_frames);
struct Room;
@@ -95,8 +93,6 @@ class SpatialSoundServerSW : public SpatialSoundServer {
mutable RID_Owner<Room> room_owner;
-
-
struct Source {
struct Voice {
@@ -109,7 +105,6 @@ class SpatialSoundServerSW : public SpatialSoundServer {
float volume_scale;
int sample_mix_rate;
-
float last_volume;
float last_filter_gain;
float last_filter_cutoff;
@@ -124,7 +119,6 @@ class SpatialSoundServerSW : public SpatialSoundServer {
struct StreamData {
-
Vector3 panning;
RoomReverb reverb;
float reverb_send;
@@ -140,12 +134,11 @@ class SpatialSoundServerSW : public SpatialSoundServer {
StreamData() {
- reverb_send=0;
- reverb=ROOM_REVERB_HALL;
- volume=1.0;
- filter_gain=1;
- filter_cutoff=5000;
-
+ reverb_send = 0;
+ reverb = ROOM_REVERB_HALL;
+ volume = 1.0;
+ filter_gain = 1;
+ filter_cutoff = 5000;
}
} stream_data;
@@ -176,35 +169,36 @@ class SpatialSoundServerSW : public SpatialSoundServer {
Source *source;
int voice;
- bool operator<(const ActiveVoice& p_voice) const { return (voice==p_voice.voice)?(source<p_voice.source):(voice<p_voice.voice); }
- ActiveVoice(Source *p_source=NULL,int p_voice=0) { source=p_source; voice=p_voice; }
+ bool operator<(const ActiveVoice &p_voice) const { return (voice == p_voice.voice) ? (source < p_voice.source) : (voice < p_voice.voice); }
+ ActiveVoice(Source *p_source = NULL, int p_voice = 0) {
+ source = p_source;
+ voice = p_voice;
+ }
};
Room *cull_rooms[MAX_CULL_ROOMS];
- Set<Source*> streaming_sources;
+ Set<Source *> streaming_sources;
Set<ActiveVoice> active_voices;
void _clean_up_owner(RID_OwnerBase *p_owner, const char *p_area);
void _update_sources();
public:
-
/* SPACE */
virtual RID space_create();
/* ROOM */
virtual RID room_create();
- virtual void room_set_space(RID p_room,RID p_space);
+ virtual void room_set_space(RID p_room, RID p_space);
virtual RID room_get_space(RID p_room) const;
- virtual void room_set_bounds(RID p_room, const BSP_Tree& p_bounds);
+ virtual void room_set_bounds(RID p_room, const BSP_Tree &p_bounds);
virtual BSP_Tree room_get_bounds(RID p_room) const;
- virtual void room_set_transform(RID p_room, const Transform& p_transform);
+ virtual void room_set_transform(RID p_room, const Transform &p_transform);
virtual Transform room_get_transform(RID p_room) const;
-
virtual void room_set_param(RID p_room, RoomParam p_param, float p_value);
virtual float room_get_param(RID p_room, RoomParam p_param) const;
@@ -222,17 +216,17 @@ public:
virtual RID source_create(RID p_space);
- virtual void source_set_polyphony(RID p_source,int p_voice_count);
+ virtual void source_set_polyphony(RID p_source, int p_voice_count);
virtual int source_get_polyphony(RID p_source) const;
- virtual void source_set_transform(RID p_source, const Transform& p_transform);
+ virtual void source_set_transform(RID p_source, const Transform &p_transform);
virtual Transform source_get_transform(RID p_source) const;
virtual void source_set_param(RID p_source, SourceParam p_param, float p_value);
virtual float source_get_param(RID p_source, SourceParam p_param) const;
virtual void source_set_audio_stream(RID p_source, AudioServer::AudioStream *p_stream); //null to unset
- virtual SourceVoiceID source_play_sample(RID p_source, RID p_sample, int p_mix_rate, int p_voice=SOURCE_NEXT_VOICE);
+ virtual SourceVoiceID source_play_sample(RID p_source, RID p_sample, int p_mix_rate, int p_voice = SOURCE_NEXT_VOICE);
/* VOICES */
virtual void source_voice_set_pitch_scale(RID p_source, SourceVoiceID p_voice, float p_pitch_scale);
virtual void source_voice_set_volume_scale_db(RID p_source, SourceVoiceID p_voice, float p_volume);
@@ -245,13 +239,12 @@ public:
virtual RID listener_create();
virtual void listener_set_space(RID p_listener, RID p_space);
- virtual void listener_set_transform(RID p_listener, const Transform& p_transform);
+ virtual void listener_set_transform(RID p_listener, const Transform &p_transform);
virtual Transform listener_get_transform(RID p_listener) const;
virtual void listener_set_param(RID p_listener, ListenerParam p_param, float p_value);
virtual float listener_get_param(RID p_listener, ListenerParam p_param) const;
-
/* MISC */
virtual void free(RID p_id);
diff --git a/servers/spatial_sound_2d/spatial_sound_2d_server_sw.cpp b/servers/spatial_sound_2d/spatial_sound_2d_server_sw.cpp
index 3ec19b60c..2c6614da8 100644
--- a/servers/spatial_sound_2d/spatial_sound_2d_server_sw.cpp
+++ b/servers/spatial_sound_2d/spatial_sound_2d_server_sw.cpp
@@ -31,16 +31,12 @@
#include "os/os.h"
#include "servers/audio/audio_filter_sw.h"
-
-
int SpatialSound2DServerSW::InternalAudioStream::get_channel_count() const {
return AudioServer::get_singleton()->get_default_channel_count();
}
void SpatialSound2DServerSW::InternalAudioStream::set_mix_rate(int p_rate) {
-
-
}
void SpatialSound2DServerSW::InternalAudioStream::update() {
@@ -48,87 +44,80 @@ void SpatialSound2DServerSW::InternalAudioStream::update() {
owner->_update_sources();
}
-bool SpatialSound2DServerSW::InternalAudioStream::mix(int32_t *p_buffer,int p_frames) {
+bool SpatialSound2DServerSW::InternalAudioStream::mix(int32_t *p_buffer, int p_frames) {
- return owner->internal_buffer_mix(p_buffer,p_frames);
+ return owner->internal_buffer_mix(p_buffer, p_frames);
}
void SpatialSound2DServerSW::_update_sources() {
_THREAD_SAFE_METHOD_
- for (Set<Source*>::Element *E=streaming_sources.front();E;E=E->next()) {
+ for (Set<Source *>::Element *E = streaming_sources.front(); E; E = E->next()) {
- Source *s=E->get();
+ Source *s = E->get();
ERR_CONTINUE(!s->stream);
s->stream->update();
}
}
-
SpatialSound2DServerSW::Room::Room() {
-// params[ROOM_PARAM_SPEED_OF_SOUND]=343.0;
- params[ROOM_PARAM_PITCH_SCALE]=1.0;
- params[ROOM_PARAM_VOLUME_SCALE_DB]=0;
- params[ROOM_PARAM_REVERB_SEND]=0;
- params[ROOM_PARAM_CHORUS_SEND]=0;
- params[ROOM_PARAM_ATTENUATION_SCALE]=1.0;
- params[ROOM_PARAM_ATTENUATION_HF_CUTOFF]=5000;
- params[ROOM_PARAM_ATTENUATION_HF_FLOOR_DB]=-24.0;
- params[ROOM_PARAM_ATTENUATION_HF_RATIO_EXP]=1.0;
- params[ROOM_PARAM_ATTENUATION_REVERB_SCALE]=0.0;
- override_other_sources=false;
- reverb=ROOM_REVERB_HALL;
-// octree_id=0;
- level=-1;
-
-
+ // params[ROOM_PARAM_SPEED_OF_SOUND]=343.0;
+ params[ROOM_PARAM_PITCH_SCALE] = 1.0;
+ params[ROOM_PARAM_VOLUME_SCALE_DB] = 0;
+ params[ROOM_PARAM_REVERB_SEND] = 0;
+ params[ROOM_PARAM_CHORUS_SEND] = 0;
+ params[ROOM_PARAM_ATTENUATION_SCALE] = 1.0;
+ params[ROOM_PARAM_ATTENUATION_HF_CUTOFF] = 5000;
+ params[ROOM_PARAM_ATTENUATION_HF_FLOOR_DB] = -24.0;
+ params[ROOM_PARAM_ATTENUATION_HF_RATIO_EXP] = 1.0;
+ params[ROOM_PARAM_ATTENUATION_REVERB_SCALE] = 0.0;
+ override_other_sources = false;
+ reverb = ROOM_REVERB_HALL;
+ // octree_id=0;
+ level = -1;
}
-
SpatialSound2DServerSW::Source::Source() {
- params[SOURCE_PARAM_VOLUME_DB]=0.0;
- params[SOURCE_PARAM_PITCH_SCALE]=1.0;
- params[SOURCE_PARAM_ATTENUATION_MIN_DISTANCE]=1;
- params[SOURCE_PARAM_ATTENUATION_MAX_DISTANCE]=100;
- params[SOURCE_PARAM_ATTENUATION_DISTANCE_EXP]=1.0; //linear (and not really good)
- stream=NULL;
+ params[SOURCE_PARAM_VOLUME_DB] = 0.0;
+ params[SOURCE_PARAM_PITCH_SCALE] = 1.0;
+ params[SOURCE_PARAM_ATTENUATION_MIN_DISTANCE] = 1;
+ params[SOURCE_PARAM_ATTENUATION_MAX_DISTANCE] = 100;
+ params[SOURCE_PARAM_ATTENUATION_DISTANCE_EXP] = 1.0; //linear (and not really good)
+ stream = NULL;
voices.resize(1);
- last_voice=0;
+ last_voice = 0;
}
SpatialSound2DServerSW::Source::Voice::Voice() {
- active=false;
- restart=false;
- pitch_scale=1.0;
- volume_scale=0.0;
- voice_rid=AudioServer::get_singleton()->voice_create();
-
+ active = false;
+ restart = false;
+ pitch_scale = 1.0;
+ volume_scale = 0.0;
+ voice_rid = AudioServer::get_singleton()->voice_create();
}
SpatialSound2DServerSW::Source::Voice::~Voice() {
AudioServer::get_singleton()->free(voice_rid);
}
-
SpatialSound2DServerSW::Listener::Listener() {
- params[LISTENER_PARAM_VOLUME_SCALE_DB]=0.0;
- params[LISTENER_PARAM_PITCH_SCALE]=1.0;
- params[LISTENER_PARAM_ATTENUATION_SCALE]=1.0;
- params[LISTENER_PARAM_PAN_RANGE]=128;
-
+ params[LISTENER_PARAM_VOLUME_SCALE_DB] = 0.0;
+ params[LISTENER_PARAM_PITCH_SCALE] = 1.0;
+ params[LISTENER_PARAM_ATTENUATION_SCALE] = 1.0;
+ params[LISTENER_PARAM_PAN_RANGE] = 128;
}
/* SPACE */
RID SpatialSound2DServerSW::space_create() {
- Space* space = memnew( Space );
+ Space *space = memnew(Space);
RID space_rid = space_owner.make_rid(space);
- space->default_room=room_create();
- room_set_space(space->default_room,space_rid);
+ space->default_room = room_create();
+ room_set_space(space->default_room, space_rid);
return space_rid;
}
@@ -136,11 +125,11 @@ RID SpatialSound2DServerSW::space_create() {
RID SpatialSound2DServerSW::room_create() {
- Room *room = memnew( Room );
+ Room *room = memnew(Room);
return room_owner.make_rid(room);
}
-void SpatialSound2DServerSW::room_set_space(RID p_room,RID p_space) {
+void SpatialSound2DServerSW::room_set_space(RID p_room, RID p_space) {
Room *room = room_owner.get(p_room);
ERR_FAIL_COND(!room);
@@ -149,71 +138,65 @@ void SpatialSound2DServerSW::room_set_space(RID p_room,RID p_space) {
Space *space = space_owner.get(room->space);
space->rooms.erase(p_room);
-// space->octree.erase(room->octree_id);
+ // space->octree.erase(room->octree_id);
//room->octree_id=0;
}
- room->space=RID();
+ room->space = RID();
if (p_space.is_valid()) {
Space *space = space_owner.get(p_space);
ERR_FAIL_COND(!space);
space->rooms.insert(p_room);
-// room->octree_id=space->octree.create(room,AABB());
+ // room->octree_id=space->octree.create(room,AABB());
//set bounds
-// AABB aabb = room->bounds.is_empty()?AABB():room->bounds.get_aabb();
- // space->octree.move(room->octree_id,room->transform.xform(aabb));
- room->space=p_space;
+ // AABB aabb = room->bounds.is_empty()?AABB():room->bounds.get_aabb();
+ // space->octree.move(room->octree_id,room->transform.xform(aabb));
+ room->space = p_space;
}
-
-
}
RID SpatialSound2DServerSW::room_get_space(RID p_room) const {
Room *room = room_owner.get(p_room);
- ERR_FAIL_COND_V(!room,RID());
-
+ ERR_FAIL_COND_V(!room, RID());
return room->space;
}
-
-
-void SpatialSound2DServerSW::room_set_bounds(RID p_room, const DVector<Point2>& p_bounds) {
+void SpatialSound2DServerSW::room_set_bounds(RID p_room, const DVector<Point2> &p_bounds) {
Room *room = room_owner.get(p_room);
ERR_FAIL_COND(!room);
- room->bounds=p_bounds;
+ room->bounds = p_bounds;
if (!room->space.is_valid())
return;
-// AABB aabb = room->bounds.is_empty()?AABB():room->bounds.get_aabb();
-// Space* space = space_owner.get(room->space);
-// ERR_FAIL_COND(!space);
-
-// space->octree.move(room->octree_id,room->transform.xform(aabb));
+ // AABB aabb = room->bounds.is_empty()?AABB():room->bounds.get_aabb();
+ // Space* space = space_owner.get(room->space);
+ // ERR_FAIL_COND(!space);
+ // space->octree.move(room->octree_id,room->transform.xform(aabb));
}
DVector<Point2> SpatialSound2DServerSW::room_get_bounds(RID p_room) const {
Room *room = room_owner.get(p_room);
- ERR_FAIL_COND_V(!room,DVector<Point2>());
+ ERR_FAIL_COND_V(!room, DVector<Point2>());
return room->bounds;
}
-void SpatialSound2DServerSW::room_set_transform(RID p_room, const Matrix32& p_transform) {
+void SpatialSound2DServerSW::room_set_transform(RID p_room, const Matrix32 &p_transform) {
if (space_owner.owns(p_room))
- p_room=space_owner.get(p_room)->default_room;
+ p_room = space_owner.get(p_room)->default_room;
Room *room = room_owner.get(p_room);
ERR_FAIL_COND(!room);
- room->transform=p_transform;
- room->inverse_transform=p_transform.affine_inverse(); // needs to be done to unscale BSP properly
+ room->transform = p_transform;
+ room->inverse_transform = p_transform.affine_inverse(); // needs to be done to unscale BSP properly
if (!room->space.is_valid())
return;
@@ -231,33 +214,31 @@ void SpatialSound2DServerSW::room_set_transform(RID p_room, const Matrix32& p_tr
Matrix32 SpatialSound2DServerSW::room_get_transform(RID p_room) const {
if (space_owner.owns(p_room))
- p_room=space_owner.get(p_room)->default_room;
+ p_room = space_owner.get(p_room)->default_room;
Room *room = room_owner.get(p_room);
- ERR_FAIL_COND_V(!room,Matrix32());
+ ERR_FAIL_COND_V(!room, Matrix32());
return room->transform;
}
-
void SpatialSound2DServerSW::room_set_param(RID p_room, RoomParam p_param, float p_value) {
if (space_owner.owns(p_room))
- p_room=space_owner.get(p_room)->default_room;
+ p_room = space_owner.get(p_room)->default_room;
- ERR_FAIL_INDEX(p_param,ROOM_PARAM_MAX);
+ ERR_FAIL_INDEX(p_param, ROOM_PARAM_MAX);
Room *room = room_owner.get(p_room);
ERR_FAIL_COND(!room);
- room->params[p_param]=p_value;
-
+ room->params[p_param] = p_value;
}
float SpatialSound2DServerSW::room_get_param(RID p_room, RoomParam p_param) const {
if (space_owner.owns(p_room))
- p_room=space_owner.get(p_room)->default_room;
+ p_room = space_owner.get(p_room)->default_room;
- ERR_FAIL_INDEX_V(p_param,ROOM_PARAM_MAX,0);
+ ERR_FAIL_INDEX_V(p_param, ROOM_PARAM_MAX, 0);
Room *room = room_owner.get(p_room);
- ERR_FAIL_COND_V(!room,0);
+ ERR_FAIL_COND_V(!room, 0);
return room->params[p_param];
}
@@ -265,36 +246,32 @@ void SpatialSound2DServerSW::room_set_level(RID p_room, int p_level) {
Room *room = room_owner.get(p_room);
ERR_FAIL_COND(!room);
- room->level =p_level;
-
+ room->level = p_level;
}
int SpatialSound2DServerSW::room_get_level(RID p_room) const {
Room *room = room_owner.get(p_room);
- ERR_FAIL_COND_V(!room,0);
+ ERR_FAIL_COND_V(!room, 0);
return room->level;
-
}
-
void SpatialSound2DServerSW::room_set_reverb(RID p_room, RoomReverb p_reverb) {
if (space_owner.owns(p_room))
- p_room=space_owner.get(p_room)->default_room;
+ p_room = space_owner.get(p_room)->default_room;
Room *room = room_owner.get(p_room);
ERR_FAIL_COND(!room);
- room->reverb=p_reverb;
-
+ room->reverb = p_reverb;
}
SpatialSound2DServerSW::RoomReverb SpatialSound2DServerSW::room_get_reverb(RID p_room) const {
if (space_owner.owns(p_room))
- p_room=space_owner.get(p_room)->default_room;
+ p_room = space_owner.get(p_room)->default_room;
Room *room = room_owner.get(p_room);
- ERR_FAIL_COND_V(!room,ROOM_REVERB_SMALL);
+ ERR_FAIL_COND_V(!room, ROOM_REVERB_SMALL);
return room->reverb;
}
@@ -302,20 +279,19 @@ SpatialSound2DServerSW::RoomReverb SpatialSound2DServerSW::room_get_reverb(RID p
void SpatialSound2DServerSW::room_set_force_params_to_all_sources(RID p_room, bool p_force) {
if (space_owner.owns(p_room))
- p_room=space_owner.get(p_room)->default_room;
+ p_room = space_owner.get(p_room)->default_room;
Room *room = room_owner.get(p_room);
ERR_FAIL_COND(!room);
- room->override_other_sources=p_force;
-
+ room->override_other_sources = p_force;
}
bool SpatialSound2DServerSW::room_is_forcing_params_to_all_sources(RID p_room) const {
if (space_owner.owns(p_room))
- p_room=space_owner.get(p_room)->default_room;
+ p_room = space_owner.get(p_room)->default_room;
Room *room = room_owner.get(p_room);
- ERR_FAIL_COND_V(!room,false);
+ ERR_FAIL_COND_V(!room, false);
return room->override_other_sources;
}
@@ -324,76 +300,69 @@ bool SpatialSound2DServerSW::room_is_forcing_params_to_all_sources(RID p_room) c
RID SpatialSound2DServerSW::source_create(RID p_space) {
Space *space = space_owner.get(p_space);
- ERR_FAIL_COND_V(!space,RID());
+ ERR_FAIL_COND_V(!space, RID());
- Source *source = memnew( Source );
- source->space=p_space;
+ Source *source = memnew(Source);
+ source->space = p_space;
RID source_rid = source_owner.make_rid(source);
space->sources.insert(source_rid);
return source_rid;
}
+void SpatialSound2DServerSW::source_set_polyphony(RID p_source, int p_voice_count) {
-void SpatialSound2DServerSW::source_set_polyphony(RID p_source,int p_voice_count) {
-
-
- ERR_FAIL_COND(p_voice_count<=0); // more than 32 is too much, change this if you really need more
- if (p_voice_count>32) {
+ ERR_FAIL_COND(p_voice_count <= 0); // more than 32 is too much, change this if you really need more
+ if (p_voice_count > 32) {
ERR_PRINT("Voices will be clipped to 32");
- p_voice_count=32;
+ p_voice_count = 32;
}
Source *source = source_owner.get(p_source);
ERR_FAIL_COND(!source);
- if (p_voice_count<source->voices.size()) {
+ if (p_voice_count < source->voices.size()) {
- for(int i=p_voice_count;i<source->voices.size();i++) {
- active_voices.erase(ActiveVoice(source,i)); //erase from active voices
+ for (int i = p_voice_count; i < source->voices.size(); i++) {
+ active_voices.erase(ActiveVoice(source, i)); //erase from active voices
}
}
source->voices.resize(p_voice_count);
-
}
int SpatialSound2DServerSW::source_get_polyphony(RID p_source) const {
Source *source = source_owner.get(p_source);
- ERR_FAIL_COND_V(!source,-1);
+ ERR_FAIL_COND_V(!source, -1);
return source->voices.size();
-
}
-void SpatialSound2DServerSW::source_set_transform(RID p_source, const Matrix32& p_transform) {
+void SpatialSound2DServerSW::source_set_transform(RID p_source, const Matrix32 &p_transform) {
Source *source = source_owner.get(p_source);
ERR_FAIL_COND(!source);
- source->transform=p_transform;
+ source->transform = p_transform;
source->transform.orthonormalize();
}
Matrix32 SpatialSound2DServerSW::source_get_transform(RID p_source) const {
Source *source = source_owner.get(p_source);
- ERR_FAIL_COND_V(!source,Matrix32());
+ ERR_FAIL_COND_V(!source, Matrix32());
return source->transform;
}
void SpatialSound2DServerSW::source_set_param(RID p_source, SourceParam p_param, float p_value) {
- ERR_FAIL_INDEX(p_param,SOURCE_PARAM_MAX);
+ ERR_FAIL_INDEX(p_param, SOURCE_PARAM_MAX);
Source *source = source_owner.get(p_source);
ERR_FAIL_COND(!source);
- source->params[p_param]=p_value;
-
+ source->params[p_param] = p_value;
}
float SpatialSound2DServerSW::source_get_param(RID p_source, SourceParam p_param) const {
- ERR_FAIL_INDEX_V(p_param,SOURCE_PARAM_MAX,0);
+ ERR_FAIL_INDEX_V(p_param, SOURCE_PARAM_MAX, 0);
Source *source = source_owner.get(p_source);
- ERR_FAIL_COND_V(!source,0);
+ ERR_FAIL_COND_V(!source, 0);
return source->params[p_param];
-
-
}
void SpatialSound2DServerSW::source_set_audio_stream(RID p_source, AudioServer::AudioStream *p_stream) {
@@ -401,16 +370,16 @@ void SpatialSound2DServerSW::source_set_audio_stream(RID p_source, AudioServer::
Source *source = source_owner.get(p_source);
ERR_FAIL_COND(!source);
AudioServer::get_singleton()->lock();
- source->stream=p_stream;
+ source->stream = p_stream;
_THREAD_SAFE_METHOD_
if (!p_stream) {
streaming_sources.erase(source);
- active_voices.erase(ActiveVoice(source,VOICE_IS_STREAM));
+ active_voices.erase(ActiveVoice(source, VOICE_IS_STREAM));
} else {
streaming_sources.insert(source);
- active_voices.insert(ActiveVoice(source,VOICE_IS_STREAM));
- zeromem(source->stream_data.filter_state,sizeof(Source::StreamData::FilterState)*4); //reset filter for safetyness
+ active_voices.insert(ActiveVoice(source, VOICE_IS_STREAM));
+ zeromem(source->stream_data.filter_state, sizeof(Source::StreamData::FilterState) * 4); //reset filter for safetyness
p_stream->set_mix_rate(AudioServer::get_singleton()->get_default_mix_rate());
}
@@ -421,27 +390,27 @@ void SpatialSound2DServerSW::source_set_audio_stream(RID p_source, AudioServer::
SpatialSound2DServer::SourceVoiceID SpatialSound2DServerSW::source_play_sample(RID p_source, RID p_sample, int p_mix_rate, int p_voice) {
Source *source = source_owner.get(p_source);
- ERR_FAIL_COND_V(!source,SOURCE_INVALID_VOICE);
+ ERR_FAIL_COND_V(!source, SOURCE_INVALID_VOICE);
- int to_play=0;
+ int to_play = 0;
- if (p_voice==SOURCE_NEXT_VOICE) {
- to_play=source->last_voice+1;
- if (to_play>=source->voices.size())
- to_play=0;
+ if (p_voice == SOURCE_NEXT_VOICE) {
+ to_play = source->last_voice + 1;
+ if (to_play >= source->voices.size())
+ to_play = 0;
} else
- to_play=p_voice;
+ to_play = p_voice;
- ERR_FAIL_INDEX_V(to_play,source->voices.size(),SOURCE_INVALID_VOICE);
+ ERR_FAIL_INDEX_V(to_play, source->voices.size(), SOURCE_INVALID_VOICE);
- source->voices[to_play].restart=true;
- source->voices[to_play].sample_rid=p_sample;
- source->voices[to_play].sample_mix_rate=p_mix_rate;
- source->voices[to_play].pitch_scale=1;
- source->voices[to_play].volume_scale=0;
- source->last_voice=to_play;
- active_voices.insert(ActiveVoice(source,to_play));
+ source->voices[to_play].restart = true;
+ source->voices[to_play].sample_rid = p_sample;
+ source->voices[to_play].sample_mix_rate = p_mix_rate;
+ source->voices[to_play].pitch_scale = 1;
+ source->voices[to_play].volume_scale = 0;
+ source->last_voice = to_play;
+ active_voices.insert(ActiveVoice(source, to_play));
return to_play;
}
@@ -450,51 +419,47 @@ void SpatialSound2DServerSW::source_voice_set_pitch_scale(RID p_source, SourceVo
Source *source = source_owner.get(p_source);
ERR_FAIL_COND(!source);
- ERR_FAIL_INDEX(p_voice,source->voices.size());
- source->voices[p_voice].pitch_scale=p_pitch_scale;
-
+ ERR_FAIL_INDEX(p_voice, source->voices.size());
+ source->voices[p_voice].pitch_scale = p_pitch_scale;
}
void SpatialSound2DServerSW::source_voice_set_volume_scale_db(RID p_source, SourceVoiceID p_voice, float p_db) {
Source *source = source_owner.get(p_source);
ERR_FAIL_COND(!source);
- ERR_FAIL_INDEX(p_voice,source->voices.size());
- source->voices[p_voice].volume_scale=p_db;
-
+ ERR_FAIL_INDEX(p_voice, source->voices.size());
+ source->voices[p_voice].volume_scale = p_db;
}
bool SpatialSound2DServerSW::source_is_voice_active(RID p_source, SourceVoiceID p_voice) const {
Source *source = source_owner.get(p_source);
- ERR_FAIL_COND_V(!source,false);
- ERR_FAIL_INDEX_V(p_voice,source->voices.size(),false);
+ ERR_FAIL_COND_V(!source, false);
+ ERR_FAIL_INDEX_V(p_voice, source->voices.size(), false);
return source->voices[p_voice].active || source->voices[p_voice].restart;
-
}
void SpatialSound2DServerSW::source_stop_voice(RID p_source, SourceVoiceID p_voice) {
Source *source = source_owner.get(p_source);
ERR_FAIL_COND(!source);
- ERR_FAIL_INDEX(p_voice,source->voices.size());
+ ERR_FAIL_INDEX(p_voice, source->voices.size());
if (source->voices[p_voice].active) {
AudioServer::get_singleton()->voice_stop(source->voices[p_voice].voice_rid);
}
- source->voices[p_voice].active=false;
- source->voices[p_voice].restart=false;
- active_voices.erase(ActiveVoice(source,p_voice));
+ source->voices[p_voice].active = false;
+ source->voices[p_voice].restart = false;
+ active_voices.erase(ActiveVoice(source, p_voice));
}
/* LISTENER */
RID SpatialSound2DServerSW::listener_create() {
- Listener *listener = memnew( Listener );
+ Listener *listener = memnew(Listener);
RID listener_rid = listener_owner.make_rid(listener);
return listener_rid;
-
}
-void SpatialSound2DServerSW::listener_set_space(RID p_listener,RID p_space) {
+void SpatialSound2DServerSW::listener_set_space(RID p_listener, RID p_space) {
Listener *listener = listener_owner.get(p_listener);
ERR_FAIL_COND(!listener);
@@ -506,67 +471,64 @@ void SpatialSound2DServerSW::listener_set_space(RID p_listener,RID p_space) {
lspace->listeners.erase(p_listener);
}
- listener->space=RID();
+ listener->space = RID();
if (p_space.is_valid()) {
Space *space = space_owner.get(p_space);
ERR_FAIL_COND(!space);
- listener->space=p_space;
+ listener->space = p_space;
space->listeners.insert(p_listener);
}
-
}
-void SpatialSound2DServerSW::listener_set_transform(RID p_listener, const Matrix32& p_transform) {
+void SpatialSound2DServerSW::listener_set_transform(RID p_listener, const Matrix32 &p_transform) {
Listener *listener = listener_owner.get(p_listener);
ERR_FAIL_COND(!listener);
- listener->transform=p_transform;
+ listener->transform = p_transform;
listener->transform.orthonormalize(); //must be done..
}
Matrix32 SpatialSound2DServerSW::listener_get_transform(RID p_listener) const {
Listener *listener = listener_owner.get(p_listener);
- ERR_FAIL_COND_V(!listener,Matrix32());
+ ERR_FAIL_COND_V(!listener, Matrix32());
return listener->transform;
}
void SpatialSound2DServerSW::listener_set_param(RID p_listener, ListenerParam p_param, float p_value) {
- ERR_FAIL_INDEX(p_param,LISTENER_PARAM_MAX);
+ ERR_FAIL_INDEX(p_param, LISTENER_PARAM_MAX);
Listener *listener = listener_owner.get(p_listener);
ERR_FAIL_COND(!listener);
- listener->params[p_param]=p_value;
+ listener->params[p_param] = p_value;
}
float SpatialSound2DServerSW::listener_get_param(RID p_listener, ListenerParam p_param) const {
- ERR_FAIL_INDEX_V(p_param,LISTENER_PARAM_MAX,0);
+ ERR_FAIL_INDEX_V(p_param, LISTENER_PARAM_MAX, 0);
Listener *listener = listener_owner.get(p_listener);
- ERR_FAIL_COND_V(!listener,0);
+ ERR_FAIL_COND_V(!listener, 0);
return listener->params[p_param];
}
-
/* MISC */
void SpatialSound2DServerSW::free(RID p_id) {
-
if (space_owner.owns(p_id)) {
Space *space = space_owner.get(p_id);
free(space->default_room);
- while(space->listeners.size()) {
- listener_set_space(space->listeners.front()->get(),RID());
+ while (space->listeners.size()) {
+ listener_set_space(space->listeners.front()->get(), RID());
}
- while(space->sources.size()) {
+ while (space->sources.size()) {
free(space->sources.front()->get());
}
- while(space->rooms.size()) {
- room_set_space(space->rooms.front()->get(),RID());
+ while (space->rooms.size()) {
+ room_set_space(space->rooms.front()->get(), RID());
}
space_owner.free(p_id);
memdelete(space);
@@ -575,13 +537,13 @@ void SpatialSound2DServerSW::free(RID p_id) {
Source *source = source_owner.get(p_id);
if (source->stream)
- source_set_audio_stream(p_id,NULL);
+ source_set_audio_stream(p_id, NULL);
Space *space = space_owner.get(source->space);
ERR_FAIL_COND(!space);
space->sources.erase(p_id);
- for(int i=0;i<source->voices.size();i++) {
- active_voices.erase(ActiveVoice(source,i));
+ for (int i = 0; i < source->voices.size(); i++) {
+ active_voices.erase(ActiveVoice(source, i));
}
source_owner.free(p_id);
memdelete(source);
@@ -603,15 +565,14 @@ void SpatialSound2DServerSW::free(RID p_id) {
if (room->space.is_valid()) {
Space *space = space_owner.get(room->space);
ERR_FAIL_COND(!space);
-// space->octree.erase(room->octree_id);
+ // space->octree.erase(room->octree_id);
space->rooms.erase(p_id);
}
room_owner.free(p_id);
memdelete(room);
} else {
- ERR_PRINT("Attempt to free invalid ID") ;
+ ERR_PRINT("Attempt to free invalid ID");
}
-
}
void SpatialSound2DServerSW::_clean_up_owner(RID_OwnerBase *p_owner, const char *p_area) {
@@ -619,10 +580,10 @@ void SpatialSound2DServerSW::_clean_up_owner(RID_OwnerBase *p_owner, const char
List<RID> rids;
p_owner->get_owned_list(&rids);
- for(List<RID>::Element *I=rids.front();I;I=I->next()) {
+ for (List<RID>::Element *I = rids.front(); I; I = I->next()) {
if (OS::get_singleton()->is_stdout_verbose()) {
- print_line("Leaked RID ("+itos(I->get().get_id())+") of type "+String(p_area));
+ print_line("Leaked RID (" + itos(I->get().get_id()) + ") of type " + String(p_area));
}
free(I->get());
}
@@ -630,34 +591,30 @@ void SpatialSound2DServerSW::_clean_up_owner(RID_OwnerBase *p_owner, const char
void SpatialSound2DServerSW::init() {
- internal_buffer = memnew_arr(int32_t, INTERNAL_BUFFER_SIZE*INTERNAL_BUFFER_MAX_CHANNELS);
- internal_buffer_channels=AudioServer::get_singleton()->get_default_channel_count();
+ internal_buffer = memnew_arr(int32_t, INTERNAL_BUFFER_SIZE * INTERNAL_BUFFER_MAX_CHANNELS);
+ internal_buffer_channels = AudioServer::get_singleton()->get_default_channel_count();
- internal_audio_stream = memnew( InternalAudioStream );
- internal_audio_stream->owner=this;
+ internal_audio_stream = memnew(InternalAudioStream);
+ internal_audio_stream->owner = this;
internal_audio_stream_rid = AudioServer::get_singleton()->audio_stream_create(internal_audio_stream);
- AudioServer::get_singleton()->stream_set_active(internal_audio_stream_rid,true);
-
+ AudioServer::get_singleton()->stream_set_active(internal_audio_stream_rid, true);
}
+bool SpatialSound2DServerSW::internal_buffer_mix(int32_t *p_buffer, int p_frames) {
-
-bool SpatialSound2DServerSW::internal_buffer_mix(int32_t *p_buffer,int p_frames) {
-
- if (streaming_sources.size()==0)
+ if (streaming_sources.size() == 0)
return false; //nothing to mix
+ for (Set<Source *>::Element *E = streaming_sources.front(); E; E = E->next()) {
- for (Set<Source*>::Element *E=streaming_sources.front();E;E=E->next()) {
-
- Source *s=E->get();
+ Source *s = E->get();
ERR_CONTINUE(!s->stream);
int channels = s->stream->get_channel_count();
- Source::StreamData &sd=s->stream_data;
+ Source::StreamData &sd = s->stream_data;
- int todo=p_frames;
+ int todo = p_frames;
AudioFilterSW filter;
filter.set_sampling_rate(AudioServer::get_singleton()->get_default_mix_rate());
@@ -671,164 +628,162 @@ bool SpatialSound2DServerSW::internal_buffer_mix(int32_t *p_buffer,int p_frames)
int32_t in[4];
#ifndef SPATIAL_SOUND_SERVER_NO_FILTER
-#define DO_FILTER(m_c)\
- {\
- float val = in[m_c];\
- float pre=val;\
- val = val*coefs.b0 + sd.filter_state[m_c].hb[0]*coefs.b1 + sd.filter_state[m_c].hb[1]*coefs.b2 + sd.filter_state[m_c].ha[0]*coefs.a1 + sd.filter_state[m_c].ha[1]*coefs.a2;\
- sd.filter_state[m_c].ha[1]=sd.filter_state[m_c].ha[0];\
- sd.filter_state[m_c].hb[1]=sd.filter_state[m_c].hb[0]; \
- sd.filter_state[m_c].hb[0]=pre;\
- sd.filter_state[m_c].ha[0]=val;\
- in[m_c]=Math::fast_ftoi(val);\
- }
+#define DO_FILTER(m_c) \
+ { \
+ float val = in[m_c]; \
+ float pre = val; \
+ val = val * coefs.b0 + sd.filter_state[m_c].hb[0] * coefs.b1 + sd.filter_state[m_c].hb[1] * coefs.b2 + sd.filter_state[m_c].ha[0] * coefs.a1 + sd.filter_state[m_c].ha[1] * coefs.a2; \
+ sd.filter_state[m_c].ha[1] = sd.filter_state[m_c].ha[0]; \
+ sd.filter_state[m_c].hb[1] = sd.filter_state[m_c].hb[0]; \
+ sd.filter_state[m_c].hb[0] = pre; \
+ sd.filter_state[m_c].ha[0] = val; \
+ in[m_c] = Math::fast_ftoi(val); \
+ }
#else
#define DO_FILTER(m_c)
#endif
- while(todo) {
+ while (todo) {
- int to_mix=MIN(todo,INTERNAL_BUFFER_SIZE);
+ int to_mix = MIN(todo, INTERNAL_BUFFER_SIZE);
- s->stream->mix(internal_buffer,to_mix);
+ s->stream->mix(internal_buffer, to_mix);
- switch(internal_buffer_channels) {
+ switch (internal_buffer_channels) {
case 2: {
- float p = sd.panning.x*0.5+0.5;
- float panf[2]={ (1.0-p),p };
- panf[0]*=sd.volume;
- panf[1]*=sd.volume;
+ float p = sd.panning.x * 0.5 + 0.5;
+ float panf[2] = { (1.0 - p), p };
+ panf[0] *= sd.volume;
+ panf[1] *= sd.volume;
- int32_t pan[2]={Math::fast_ftoi(panf[0]*(1<<16)),Math::fast_ftoi(panf[1]*(1<<16))};
+ int32_t pan[2] = { Math::fast_ftoi(panf[0] * (1 << 16)), Math::fast_ftoi(panf[1] * (1 << 16)) };
- switch(channels) {
+ switch (channels) {
case 1: {
- for(int i=0;i<to_mix;i++) {
+ for (int i = 0; i < to_mix; i++) {
- in[0]=internal_buffer[i];
- in[1]=internal_buffer[i];
+ in[0] = internal_buffer[i];
+ in[1] = internal_buffer[i];
DO_FILTER(0);
DO_FILTER(1);
- p_buffer[(i<<1)+0]=((in[0]>>16)*pan[0]);
- p_buffer[(i<<1)+1]=((in[1]>>16)*pan[1]);
+ p_buffer[(i << 1) + 0] = ((in[0] >> 16) * pan[0]);
+ p_buffer[(i << 1) + 1] = ((in[1] >> 16) * pan[1]);
}
} break;
case 2: {
- for(int i=0;i<to_mix;i++) {
+ for (int i = 0; i < to_mix; i++) {
- in[0]=internal_buffer[(i<<1)+0];
- in[1]=internal_buffer[(i<<1)+1];
+ in[0] = internal_buffer[(i << 1) + 0];
+ in[1] = internal_buffer[(i << 1) + 1];
DO_FILTER(0);
DO_FILTER(1);
- p_buffer[(i<<1)+0]=((in[0]>>16)*pan[0]);
- p_buffer[(i<<1)+1]=((in[1]>>16)*pan[1]);
+ p_buffer[(i << 1) + 0] = ((in[0] >> 16) * pan[0]);
+ p_buffer[(i << 1) + 1] = ((in[1] >> 16) * pan[1]);
}
} break;
case 4: {
- for(int i=0;i<to_mix;i++) {
+ for (int i = 0; i < to_mix; i++) {
- in[0]=(internal_buffer[(i<<2)+0]+internal_buffer[(i<<2)+2])>>1;
- in[1]=(internal_buffer[(i<<2)+1]+internal_buffer[(i<<2)+3])>>1;
+ in[0] = (internal_buffer[(i << 2) + 0] + internal_buffer[(i << 2) + 2]) >> 1;
+ in[1] = (internal_buffer[(i << 2) + 1] + internal_buffer[(i << 2) + 3]) >> 1;
DO_FILTER(0);
DO_FILTER(1);
- p_buffer[(i<<1)+0]=((in[0]>>16)*pan[0]);
- p_buffer[(i<<1)+1]=((in[1]>>16)*pan[1]);
+ p_buffer[(i << 1) + 0] = ((in[0] >> 16) * pan[0]);
+ p_buffer[(i << 1) + 1] = ((in[1] >> 16) * pan[1]);
}
} break;
-
- } break;
+ }
+ break;
} break;
case 4: {
- float xp = sd.panning.x*0.5+0.5;
- float yp = sd.panning.y*0.5+0.5;
- float panf[4]={ (1.0-xp)*(1.0-yp),(xp)*(1.0-yp),(1.0-xp)*(yp),(xp)*(yp) };
- panf[0]*=sd.volume;
- panf[1]*=sd.volume;
- panf[2]*=sd.volume;
- panf[3]*=sd.volume;
+ float xp = sd.panning.x * 0.5 + 0.5;
+ float yp = sd.panning.y * 0.5 + 0.5;
+ float panf[4] = { (1.0 - xp) * (1.0 - yp), (xp) * (1.0 - yp), (1.0 - xp) * (yp), (xp) * (yp) };
+ panf[0] *= sd.volume;
+ panf[1] *= sd.volume;
+ panf[2] *= sd.volume;
+ panf[3] *= sd.volume;
- int32_t pan[4]={
- Math::fast_ftoi(panf[0]*(1<<16)),
- Math::fast_ftoi(panf[1]*(1<<16)),
- Math::fast_ftoi(panf[2]*(1<<16)),
- Math::fast_ftoi(panf[3]*(1<<16))};
+ int32_t pan[4] = {
+ Math::fast_ftoi(panf[0] * (1 << 16)),
+ Math::fast_ftoi(panf[1] * (1 << 16)),
+ Math::fast_ftoi(panf[2] * (1 << 16)),
+ Math::fast_ftoi(panf[3] * (1 << 16))
+ };
- switch(channels) {
+ switch (channels) {
case 1: {
- for(int i=0;i<to_mix;i++) {
+ for (int i = 0; i < to_mix; i++) {
- in[0]=internal_buffer[i];
- in[1]=internal_buffer[i];
- in[2]=internal_buffer[i];
- in[3]=internal_buffer[i];
+ in[0] = internal_buffer[i];
+ in[1] = internal_buffer[i];
+ in[2] = internal_buffer[i];
+ in[3] = internal_buffer[i];
DO_FILTER(0);
DO_FILTER(1);
DO_FILTER(2);
DO_FILTER(3);
- p_buffer[(i<<2)+0]=((in[0]>>16)*pan[0]);
- p_buffer[(i<<2)+1]=((in[1]>>16)*pan[1]);
- p_buffer[(i<<2)+2]=((in[2]>>16)*pan[2]);
- p_buffer[(i<<2)+3]=((in[3]>>16)*pan[3]);
+ p_buffer[(i << 2) + 0] = ((in[0] >> 16) * pan[0]);
+ p_buffer[(i << 2) + 1] = ((in[1] >> 16) * pan[1]);
+ p_buffer[(i << 2) + 2] = ((in[2] >> 16) * pan[2]);
+ p_buffer[(i << 2) + 3] = ((in[3] >> 16) * pan[3]);
}
} break;
case 2: {
- for(int i=0;i<to_mix;i++) {
+ for (int i = 0; i < to_mix; i++) {
- in[0]=internal_buffer[(i<<1)+0];
- in[1]=internal_buffer[(i<<1)+1];
- in[2]=internal_buffer[(i<<1)+0];
- in[3]=internal_buffer[(i<<1)+1];
+ in[0] = internal_buffer[(i << 1) + 0];
+ in[1] = internal_buffer[(i << 1) + 1];
+ in[2] = internal_buffer[(i << 1) + 0];
+ in[3] = internal_buffer[(i << 1) + 1];
DO_FILTER(0);
DO_FILTER(1);
DO_FILTER(2);
DO_FILTER(3);
- p_buffer[(i<<2)+0]=((in[0]>>16)*pan[0]);
- p_buffer[(i<<2)+1]=((in[1]>>16)*pan[1]);
- p_buffer[(i<<2)+2]=((in[2]>>16)*pan[2]);
- p_buffer[(i<<2)+3]=((in[3]>>16)*pan[3]);
+ p_buffer[(i << 2) + 0] = ((in[0] >> 16) * pan[0]);
+ p_buffer[(i << 2) + 1] = ((in[1] >> 16) * pan[1]);
+ p_buffer[(i << 2) + 2] = ((in[2] >> 16) * pan[2]);
+ p_buffer[(i << 2) + 3] = ((in[3] >> 16) * pan[3]);
}
} break;
case 4: {
- for(int i=0;i<to_mix;i++) {
+ for (int i = 0; i < to_mix; i++) {
- in[0]=internal_buffer[(i<<2)+0];
- in[1]=internal_buffer[(i<<2)+1];
- in[2]=internal_buffer[(i<<2)+2];
- in[3]=internal_buffer[(i<<2)+3];
+ in[0] = internal_buffer[(i << 2) + 0];
+ in[1] = internal_buffer[(i << 2) + 1];
+ in[2] = internal_buffer[(i << 2) + 2];
+ in[3] = internal_buffer[(i << 2) + 3];
DO_FILTER(0);
DO_FILTER(1);
DO_FILTER(2);
DO_FILTER(3);
- p_buffer[(i<<2)+0]=((in[0]>>16)*pan[0]);
- p_buffer[(i<<2)+1]=((in[1]>>16)*pan[1]);
- p_buffer[(i<<2)+2]=((in[2]>>16)*pan[2]);
- p_buffer[(i<<2)+3]=((in[3]>>16)*pan[3]);
+ p_buffer[(i << 2) + 0] = ((in[0] >> 16) * pan[0]);
+ p_buffer[(i << 2) + 1] = ((in[1] >> 16) * pan[1]);
+ p_buffer[(i << 2) + 2] = ((in[2] >> 16) * pan[2]);
+ p_buffer[(i << 2) + 3] = ((in[3] >> 16) * pan[3]);
}
} break;
-
- } break;
+ }
+ break;
} break;
case 6: {
-
} break;
}
- p_buffer+=to_mix*internal_buffer_channels;
- todo-=to_mix;
-
+ p_buffer += to_mix * internal_buffer_channels;
+ todo -= to_mix;
}
-
}
return true;
@@ -838,79 +793,79 @@ void SpatialSound2DServerSW::update(float p_delta) {
List<ActiveVoice> to_disable;
- for(Set<ActiveVoice>::Element *E=active_voices.front();E;E=E->next()) {
+ for (Set<ActiveVoice>::Element *E = active_voices.front(); E; E = E->next()) {
Source *source = E->get().source;
int voice = E->get().voice;
- if (voice!=VOICE_IS_STREAM) {
- Source::Voice &v=source->voices[voice];
+ if (voice != VOICE_IS_STREAM) {
+ Source::Voice &v = source->voices[voice];
ERR_CONTINUE(!v.active && !v.restart); // likely a bug...
}
//this could be optimized at some point... am not sure
- Space *space=space_owner.get(source->space);
- Room *room=room_owner.get(space->default_room);
+ Space *space = space_owner.get(source->space);
+ Room *room = room_owner.get(space->default_room);
//compute mixing weights (support for multiple listeners in the same output)
- float total_distance=0;
- for(Set<RID>::Element *L=space->listeners.front();L;L=L->next()) {
- Listener *listener=listener_owner.get(L->get());
+ float total_distance = 0;
+ for (Set<RID>::Element *L = space->listeners.front(); L; L = L->next()) {
+ Listener *listener = listener_owner.get(L->get());
float d = listener->transform.get_origin().distance_to(source->transform.get_origin());
- if (d==0)
- d=0.1;
- total_distance+=d;
+ if (d == 0)
+ d = 0.1;
+ total_distance += d;
}
//compute spatialization variables, weighted according to distance
float volume_attenuation = 0.0;
float air_absorption_hf_cutoff = 0.0;
float air_absorption = 0.0;
- float pitch_scale=0.0;
+ float pitch_scale = 0.0;
Vector2 panning;
- for(Set<RID>::Element *L=space->listeners.front();L;L=L->next()) {
+ for (Set<RID>::Element *L = space->listeners.front(); L; L = L->next()) {
- Listener *listener=listener_owner.get(L->get());
+ Listener *listener = listener_owner.get(L->get());
Vector2 rel_vector = -listener->transform.xform_inv(source->transform.get_origin());
//Vector2 source_rel_vector = source->transform.xform_inv(listener->transform.get_origin()).normalized();
- float distance=rel_vector.length();
- float weight = distance/total_distance;
- float pscale=1.0;
+ float distance = rel_vector.length();
+ float weight = distance / total_distance;
+ float pscale = 1.0;
- float distance_scale=listener->params[LISTENER_PARAM_ATTENUATION_SCALE]*room->params[ROOM_PARAM_ATTENUATION_SCALE];
- float distance_min=source->params[SOURCE_PARAM_ATTENUATION_MIN_DISTANCE]*distance_scale;
- float distance_max=source->params[SOURCE_PARAM_ATTENUATION_MAX_DISTANCE]*distance_scale;
- float attenuation_exp=source->params[SOURCE_PARAM_ATTENUATION_DISTANCE_EXP];
- float attenuation=1;
+ float distance_scale = listener->params[LISTENER_PARAM_ATTENUATION_SCALE] * room->params[ROOM_PARAM_ATTENUATION_SCALE];
+ float distance_min = source->params[SOURCE_PARAM_ATTENUATION_MIN_DISTANCE] * distance_scale;
+ float distance_max = source->params[SOURCE_PARAM_ATTENUATION_MAX_DISTANCE] * distance_scale;
+ float attenuation_exp = source->params[SOURCE_PARAM_ATTENUATION_DISTANCE_EXP];
+ float attenuation = 1;
- if (distance_max>0) {
- distance = CLAMP(distance,distance_min,distance_max);
- attenuation = Math::pow(1.0 - ((distance - distance_min)/(distance_max-distance_min)),CLAMP(attenuation_exp,0.001,16));
+ if (distance_max > 0) {
+ distance = CLAMP(distance, distance_min, distance_max);
+ attenuation = Math::pow(1.0 - ((distance - distance_min) / (distance_max - distance_min)), CLAMP(attenuation_exp, 0.001, 16));
}
float hf_attenuation_cutoff = room->params[ROOM_PARAM_ATTENUATION_HF_CUTOFF];
float hf_attenuation_exp = room->params[ROOM_PARAM_ATTENUATION_HF_RATIO_EXP];
float hf_attenuation_floor = room->params[ROOM_PARAM_ATTENUATION_HF_FLOOR_DB];
- float absorption=Math::db2linear(Math::lerp(hf_attenuation_floor,0,Math::pow(attenuation,hf_attenuation_exp)));
+ float absorption = Math::db2linear(Math::lerp(hf_attenuation_floor, 0, Math::pow(attenuation, hf_attenuation_exp)));
// source emission cone
-/* only for 3D
+ /* only for 3D
float emission_deg=source->params[SOURCE_PARAM_EMISSION_CONE_DEGREES];
float emission_attdb=source->params[SOURCE_PARAM_EMISSION_CONE_ATTENUATION_DB];
absorption*=_get_attenuation(source_rel_vector.dot(Vector2(0,0,-1)),emission_deg,emission_attdb);
*/
- Vector2 vpanning=rel_vector.normalized();
+ Vector2 vpanning = rel_vector.normalized();
if (distance < listener->params[LISTENER_PARAM_PAN_RANGE])
- vpanning*=distance/listener->params[LISTENER_PARAM_PAN_RANGE];
+ vpanning *= distance / listener->params[LISTENER_PARAM_PAN_RANGE];
//listener stuff
{
// head cone
-/* only for 3D
+ /* only for 3D
float reception_deg=listener->params[LISTENER_PARAM_RECEPTION_CONE_DEGREES];
float reception_attdb=listener->params[LISTENER_PARAM_RECEPTION_CONE_ATTENUATION_DB];
@@ -919,124 +874,112 @@ void SpatialSound2DServerSW::update(float p_delta) {
// scale
- attenuation*=Math::db2linear(listener->params[LISTENER_PARAM_VOLUME_SCALE_DB]);
- pscale*=Math::db2linear(listener->params[LISTENER_PARAM_PITCH_SCALE]);
-
-
+ attenuation *= Math::db2linear(listener->params[LISTENER_PARAM_VOLUME_SCALE_DB]);
+ pscale *= Math::db2linear(listener->params[LISTENER_PARAM_PITCH_SCALE]);
}
-
-
-
//add values
- volume_attenuation+=weight*attenuation; // plus other stuff i guess
- air_absorption+=weight*absorption;
- air_absorption_hf_cutoff+=weight*hf_attenuation_cutoff;
- panning+=vpanning*weight;
- pitch_scale+=pscale*weight;
-
+ volume_attenuation += weight * attenuation; // plus other stuff i guess
+ air_absorption += weight * absorption;
+ air_absorption_hf_cutoff += weight * hf_attenuation_cutoff;
+ panning += vpanning * weight;
+ pitch_scale += pscale * weight;
}
- RoomReverb reverb_room=ROOM_REVERB_HALL;
- float reverb_send=0;
+ RoomReverb reverb_room = ROOM_REVERB_HALL;
+ float reverb_send = 0;
/* APPLY ROOM SETTINGS */
{
- pitch_scale*=room->params[ROOM_PARAM_PITCH_SCALE];
- volume_attenuation*=Math::db2linear(room->params[ROOM_PARAM_VOLUME_SCALE_DB]);
- reverb_room=room->reverb;
- reverb_send=Math::lerp(1.0,volume_attenuation,room->params[ROOM_PARAM_ATTENUATION_REVERB_SCALE])*room->params[ROOM_PARAM_REVERB_SEND];
-
+ pitch_scale *= room->params[ROOM_PARAM_PITCH_SCALE];
+ volume_attenuation *= Math::db2linear(room->params[ROOM_PARAM_VOLUME_SCALE_DB]);
+ reverb_room = room->reverb;
+ reverb_send = Math::lerp(1.0, volume_attenuation, room->params[ROOM_PARAM_ATTENUATION_REVERB_SCALE]) * room->params[ROOM_PARAM_REVERB_SEND];
}
/* UPDATE VOICE & STREAM */
-
-
- if (voice==VOICE_IS_STREAM) {
+ if (voice == VOICE_IS_STREAM) {
//update voice!!
- source->stream_data.panning=panning;
- source->stream_data.volume=volume_attenuation*Math::db2linear(source->params[SOURCE_PARAM_VOLUME_DB]);
- source->stream_data.reverb=reverb_room;
- source->stream_data.reverb_send=reverb_send;
- source->stream_data.filter_gain=air_absorption;
- source->stream_data.filter_cutoff=air_absorption_hf_cutoff;
+ source->stream_data.panning = panning;
+ source->stream_data.volume = volume_attenuation * Math::db2linear(source->params[SOURCE_PARAM_VOLUME_DB]);
+ source->stream_data.reverb = reverb_room;
+ source->stream_data.reverb_send = reverb_send;
+ source->stream_data.filter_gain = air_absorption;
+ source->stream_data.filter_cutoff = air_absorption_hf_cutoff;
if (!source->stream) //stream is gone bye bye
- to_disable.push_back(ActiveVoice(source,voice)); // oh well..
+ to_disable.push_back(ActiveVoice(source, voice)); // oh well..
- } else if (voice>=0) {
+ } else if (voice >= 0) {
//update stream!!
- Source::Voice &v=source->voices[voice];
+ Source::Voice &v = source->voices[voice];
if (v.restart)
- AudioServer::get_singleton()->voice_play(v.voice_rid,v.sample_rid);
-
- float volume_scale = Math::db2linear(v.volume_scale)*Math::db2linear(source->params[SOURCE_PARAM_VOLUME_DB]);
- float volume = volume_attenuation*volume_scale;
- reverb_send*=volume_scale;
- int mix_rate = v.sample_mix_rate*v.pitch_scale*pitch_scale*source->params[SOURCE_PARAM_PITCH_SCALE];
+ AudioServer::get_singleton()->voice_play(v.voice_rid, v.sample_rid);
+ float volume_scale = Math::db2linear(v.volume_scale) * Math::db2linear(source->params[SOURCE_PARAM_VOLUME_DB]);
+ float volume = volume_attenuation * volume_scale;
+ reverb_send *= volume_scale;
+ int mix_rate = v.sample_mix_rate * v.pitch_scale * pitch_scale * source->params[SOURCE_PARAM_PITCH_SCALE];
- if (mix_rate<=0) {
+ if (mix_rate <= 0) {
ERR_PRINT("Invalid mix rate for voice (0) check for invalid pitch_scale param.");
- to_disable.push_back(ActiveVoice(source,voice)); // oh well..
+ to_disable.push_back(ActiveVoice(source, voice)); // oh well..
continue; //invalid mix rate, disabling
}
- if (v.restart || v.last_volume!=volume)
- AudioServer::get_singleton()->voice_set_volume(v.voice_rid,volume);
- if (v.restart || v.last_mix_rate!=mix_rate)
- AudioServer::get_singleton()->voice_set_mix_rate(v.voice_rid,mix_rate);
- if (v.restart || v.last_filter_gain!=air_absorption || v.last_filter_cutoff!=air_absorption_hf_cutoff)
- AudioServer::get_singleton()->voice_set_filter(v.voice_rid,AudioServer::FILTER_HIGH_SHELF,air_absorption_hf_cutoff,1.0,air_absorption);
- if (v.restart || v.last_panning!=panning) {
- AudioServer::get_singleton()->voice_set_pan(v.voice_rid,-panning.x,panning.y,0);
+ if (v.restart || v.last_volume != volume)
+ AudioServer::get_singleton()->voice_set_volume(v.voice_rid, volume);
+ if (v.restart || v.last_mix_rate != mix_rate)
+ AudioServer::get_singleton()->voice_set_mix_rate(v.voice_rid, mix_rate);
+ if (v.restart || v.last_filter_gain != air_absorption || v.last_filter_cutoff != air_absorption_hf_cutoff)
+ AudioServer::get_singleton()->voice_set_filter(v.voice_rid, AudioServer::FILTER_HIGH_SHELF, air_absorption_hf_cutoff, 1.0, air_absorption);
+ if (v.restart || v.last_panning != panning) {
+ AudioServer::get_singleton()->voice_set_pan(v.voice_rid, -panning.x, panning.y, 0);
}
- if (v.restart || v.last_reverb_room!=reverb_room || v.last_reverb_send!=reverb_send)
- AudioServer::get_singleton()->voice_set_reverb(v.voice_rid,AudioServer::ReverbRoomType(reverb_room),reverb_send);
+ if (v.restart || v.last_reverb_room != reverb_room || v.last_reverb_send != reverb_send)
+ AudioServer::get_singleton()->voice_set_reverb(v.voice_rid, AudioServer::ReverbRoomType(reverb_room), reverb_send);
- v.last_volume=volume;
- v.last_mix_rate=mix_rate;
- v.last_filter_gain=air_absorption;
- v.last_filter_cutoff=air_absorption_hf_cutoff;
- v.last_panning=panning;
- v.last_reverb_room=reverb_room;
- v.last_reverb_send=reverb_send;
- v.restart=false;
- v.active=true;
+ v.last_volume = volume;
+ v.last_mix_rate = mix_rate;
+ v.last_filter_gain = air_absorption;
+ v.last_filter_cutoff = air_absorption_hf_cutoff;
+ v.last_panning = panning;
+ v.last_reverb_room = reverb_room;
+ v.last_reverb_send = reverb_send;
+ v.restart = false;
+ v.active = true;
if (!AudioServer::get_singleton()->voice_is_active(v.voice_rid))
- to_disable.push_back(ActiveVoice(source,voice)); // oh well..
+ to_disable.push_back(ActiveVoice(source, voice)); // oh well..
}
}
- while(to_disable.size()) {
+ while (to_disable.size()) {
ActiveVoice av = to_disable.front()->get();
- av.source->voices[av.voice].active=false;
- av.source->voices[av.voice].restart=false;
+ av.source->voices[av.voice].active = false;
+ av.source->voices[av.voice].restart = false;
active_voices.erase(av);
to_disable.pop_front();
}
-
}
void SpatialSound2DServerSW::finish() {
AudioServer::get_singleton()->free(internal_audio_stream_rid);
memdelete(internal_audio_stream);
- _clean_up_owner(&source_owner,"Source");
- _clean_up_owner(&listener_owner,"Listener");
- _clean_up_owner(&room_owner,"Room");
- _clean_up_owner(&space_owner,"Space");
+ _clean_up_owner(&source_owner, "Source");
+ _clean_up_owner(&listener_owner, "Listener");
+ _clean_up_owner(&room_owner, "Room");
+ _clean_up_owner(&space_owner, "Space");
memdelete_arr(internal_buffer);
}
SpatialSound2DServerSW::SpatialSound2DServerSW() {
-
}
diff --git a/servers/spatial_sound_2d/spatial_sound_2d_server_sw.h b/servers/spatial_sound_2d/spatial_sound_2d_server_sw.h
index fc595b7df..acc70e69c 100644
--- a/servers/spatial_sound_2d/spatial_sound_2d_server_sw.h
+++ b/servers/spatial_sound_2d/spatial_sound_2d_server_sw.h
@@ -33,27 +33,25 @@
#include "os/thread_safe.h"
-
class SpatialSound2DServerSW : public SpatialSound2DServer {
- OBJ_TYPE(SpatialSound2DServerSW,SpatialSound2DServer);
+ OBJ_TYPE(SpatialSound2DServerSW, SpatialSound2DServer);
_THREAD_SAFE_CLASS_
enum {
- INTERNAL_BUFFER_SIZE=4096,
- INTERNAL_BUFFER_MAX_CHANNELS=4,
- VOICE_IS_STREAM=-1
+ INTERNAL_BUFFER_SIZE = 4096,
+ INTERNAL_BUFFER_MAX_CHANNELS = 4,
+ VOICE_IS_STREAM = -1
};
-
struct InternalAudioStream : public AudioServer::AudioStream {
::SpatialSound2DServerSW *owner;
virtual int get_channel_count() const;
virtual void set_mix_rate(int p_rate); //notify the stream of the mix rate
- virtual bool mix(int32_t *p_buffer,int p_frames);
+ virtual bool mix(int32_t *p_buffer, int p_frames);
virtual void update();
};
@@ -62,7 +60,7 @@ class SpatialSound2DServerSW : public SpatialSound2DServer {
int32_t *internal_buffer;
int internal_buffer_channels;
- bool internal_buffer_mix(int32_t *p_buffer,int p_frames);
+ bool internal_buffer_mix(int32_t *p_buffer, int p_frames);
struct Room;
@@ -94,8 +92,6 @@ class SpatialSound2DServerSW : public SpatialSound2DServer {
mutable RID_Owner<Room> room_owner;
-
-
struct Source {
struct Voice {
@@ -108,7 +104,6 @@ class SpatialSound2DServerSW : public SpatialSound2DServer {
float volume_scale;
int sample_mix_rate;
-
float last_volume;
float last_filter_gain;
float last_filter_cutoff;
@@ -123,7 +118,6 @@ class SpatialSound2DServerSW : public SpatialSound2DServer {
struct StreamData {
-
Vector2 panning;
RoomReverb reverb;
float reverb_send;
@@ -139,12 +133,11 @@ class SpatialSound2DServerSW : public SpatialSound2DServer {
StreamData() {
- reverb_send=0;
- reverb=ROOM_REVERB_HALL;
- volume=1.0;
- filter_gain=1;
- filter_cutoff=5000;
-
+ reverb_send = 0;
+ reverb = ROOM_REVERB_HALL;
+ volume = 1.0;
+ filter_gain = 1;
+ filter_cutoff = 5000;
}
} stream_data;
@@ -175,35 +168,36 @@ class SpatialSound2DServerSW : public SpatialSound2DServer {
Source *source;
int voice;
- bool operator<(const ActiveVoice& p_voice) const { return (voice==p_voice.voice)?(source<p_voice.source):(voice<p_voice.voice); }
- ActiveVoice(Source *p_source=NULL,int p_voice=0) { source=p_source; voice=p_voice; }
+ bool operator<(const ActiveVoice &p_voice) const { return (voice == p_voice.voice) ? (source < p_voice.source) : (voice < p_voice.voice); }
+ ActiveVoice(Source *p_source = NULL, int p_voice = 0) {
+ source = p_source;
+ voice = p_voice;
+ }
};
-// Room *cull_rooms[MAX_CULL_ROOMS];
+ // Room *cull_rooms[MAX_CULL_ROOMS];
- Set<Source*> streaming_sources;
+ Set<Source *> streaming_sources;
Set<ActiveVoice> active_voices;
void _clean_up_owner(RID_OwnerBase *p_owner, const char *p_area);
void _update_sources();
public:
-
/* SPACE */
virtual RID space_create();
/* ROOM */
virtual RID room_create();
- virtual void room_set_space(RID p_room,RID p_space);
+ virtual void room_set_space(RID p_room, RID p_space);
virtual RID room_get_space(RID p_room) const;
- virtual void room_set_bounds(RID p_room, const DVector<Point2>& p_bounds);
+ virtual void room_set_bounds(RID p_room, const DVector<Point2> &p_bounds);
virtual DVector<Point2> room_get_bounds(RID p_room) const;
- virtual void room_set_transform(RID p_room, const Matrix32& p_transform);
+ virtual void room_set_transform(RID p_room, const Matrix32 &p_transform);
virtual Matrix32 room_get_transform(RID p_room) const;
-
virtual void room_set_param(RID p_room, RoomParam p_param, float p_value);
virtual float room_get_param(RID p_room, RoomParam p_param) const;
@@ -221,17 +215,17 @@ public:
virtual RID source_create(RID p_space);
- virtual void source_set_polyphony(RID p_source,int p_voice_count);
+ virtual void source_set_polyphony(RID p_source, int p_voice_count);
virtual int source_get_polyphony(RID p_source) const;
- virtual void source_set_transform(RID p_source, const Matrix32& p_transform);
+ virtual void source_set_transform(RID p_source, const Matrix32 &p_transform);
virtual Matrix32 source_get_transform(RID p_source) const;
virtual void source_set_param(RID p_source, SourceParam p_param, float p_value);
virtual float source_get_param(RID p_source, SourceParam p_param) const;
virtual void source_set_audio_stream(RID p_source, AudioServer::AudioStream *p_stream); //null to unset
- virtual SourceVoiceID source_play_sample(RID p_source, RID p_sample, int p_mix_rate, int p_voice=SOURCE_NEXT_VOICE);
+ virtual SourceVoiceID source_play_sample(RID p_source, RID p_sample, int p_mix_rate, int p_voice = SOURCE_NEXT_VOICE);
/* VOICES */
virtual void source_voice_set_pitch_scale(RID p_source, SourceVoiceID p_voice, float p_pitch_scale);
virtual void source_voice_set_volume_scale_db(RID p_source, SourceVoiceID p_voice, float p_volume);
@@ -244,13 +238,12 @@ public:
virtual RID listener_create();
virtual void listener_set_space(RID p_listener, RID p_space);
- virtual void listener_set_transform(RID p_listener, const Matrix32& p_transform);
+ virtual void listener_set_transform(RID p_listener, const Matrix32 &p_transform);
virtual Matrix32 listener_get_transform(RID p_listener) const;
virtual void listener_set_param(RID p_listener, ListenerParam p_param, float p_value);
virtual float listener_get_param(RID p_listener, ListenerParam p_param) const;
-
/* MISC */
virtual void free(RID p_id);
diff --git a/servers/spatial_sound_2d_server.cpp b/servers/spatial_sound_2d_server.cpp
index 90f384ea2..d7aced449 100644
--- a/servers/spatial_sound_2d_server.cpp
+++ b/servers/spatial_sound_2d_server.cpp
@@ -28,17 +28,15 @@
/*************************************************************************/
#include "spatial_sound_2d_server.h"
-SpatialSound2DServer *SpatialSound2DServer::singleton=NULL;
-
+SpatialSound2DServer *SpatialSound2DServer::singleton = NULL;
SpatialSound2DServer *SpatialSound2DServer::get_singleton() {
return singleton;
}
-
SpatialSound2DServer::SpatialSound2DServer() {
- ERR_FAIL_COND(singleton!=NULL);
- singleton=this;
+ ERR_FAIL_COND(singleton != NULL);
+ singleton = this;
}
diff --git a/servers/spatial_sound_2d_server.h b/servers/spatial_sound_2d_server.h
index e7f40efb0..7c577e8be 100644
--- a/servers/spatial_sound_2d_server.h
+++ b/servers/spatial_sound_2d_server.h
@@ -29,38 +29,36 @@
#ifndef SPATIAL_SOUND_2D_SERVER_H
#define SPATIAL_SOUND_2D_SERVER_H
-#include "object.h"
#include "bsp_tree.h"
+#include "object.h"
#include "servers/audio_server.h"
class SpatialSound2DServer : public Object {
- OBJ_TYPE(SpatialSound2DServer,Object);
+ OBJ_TYPE(SpatialSound2DServer, Object);
static SpatialSound2DServer *singleton;
-public:
-
+public:
enum {
- SOURCE_INVALID_VOICE=-1,
- SOURCE_NEXT_VOICE=-2,
+ SOURCE_INVALID_VOICE = -1,
+ SOURCE_NEXT_VOICE = -2,
};
typedef int SourceVoiceID;
/* SPACE */
- virtual RID space_create()=0;
+ virtual RID space_create() = 0;
/* ROOM */
- virtual RID room_create()=0;
- virtual void room_set_space(RID p_room,RID p_space)=0;
- virtual RID room_get_space(RID p_room) const=0;
-
+ virtual RID room_create() = 0;
+ virtual void room_set_space(RID p_room, RID p_space) = 0;
+ virtual RID room_get_space(RID p_room) const = 0;
- virtual void room_set_bounds(RID p_room, const DVector<Point2>& p_bounds)=0;
- virtual DVector<Point2> room_get_bounds(RID p_room) const=0;
- virtual void room_set_transform(RID p_room, const Matrix32& p_transform)=0;
- virtual Matrix32 room_get_transform(RID p_room) const=0;
+ virtual void room_set_bounds(RID p_room, const DVector<Point2> &p_bounds) = 0;
+ virtual DVector<Point2> room_get_bounds(RID p_room) const = 0;
+ virtual void room_set_transform(RID p_room, const Matrix32 &p_transform) = 0;
+ virtual Matrix32 room_get_transform(RID p_room) const = 0;
enum RoomParam {
ROOM_PARAM_PITCH_SCALE,
@@ -75,8 +73,8 @@ public:
ROOM_PARAM_MAX
};
- virtual void room_set_param(RID p_room, RoomParam p_param, float p_value)=0;
- virtual float room_get_param(RID p_room, RoomParam p_param) const=0;
+ virtual void room_set_param(RID p_room, RoomParam p_param, float p_value) = 0;
+ virtual float room_get_param(RID p_room, RoomParam p_param) const = 0;
enum RoomReverb {
ROOM_REVERB_SMALL,
@@ -85,25 +83,25 @@ public:
ROOM_REVERB_HALL
};
- virtual void room_set_reverb(RID p_room, RoomReverb p_reverb)=0;
- virtual RoomReverb room_get_reverb(RID p_room) const=0;
+ virtual void room_set_reverb(RID p_room, RoomReverb p_reverb) = 0;
+ virtual RoomReverb room_get_reverb(RID p_room) const = 0;
- virtual void room_set_level(RID p_room, int p_level)=0;
- virtual int room_get_level(RID p_room) const=0;
+ virtual void room_set_level(RID p_room, int p_level) = 0;
+ virtual int room_get_level(RID p_room) const = 0;
//useful for underwater or rooms with very strange conditions
- virtual void room_set_force_params_to_all_sources(RID p_room, bool p_force)=0;
- virtual bool room_is_forcing_params_to_all_sources(RID p_room) const=0;
+ virtual void room_set_force_params_to_all_sources(RID p_room, bool p_force) = 0;
+ virtual bool room_is_forcing_params_to_all_sources(RID p_room) const = 0;
/* SOURCE */
- virtual RID source_create(RID p_space)=0;
+ virtual RID source_create(RID p_space) = 0;
- virtual void source_set_transform(RID p_source, const Matrix32& p_transform)=0;
- virtual Matrix32 source_get_transform(RID p_source) const=0;
+ virtual void source_set_transform(RID p_source, const Matrix32 &p_transform) = 0;
+ virtual Matrix32 source_get_transform(RID p_source) const = 0;
- virtual void source_set_polyphony(RID p_source,int p_voice_count)=0;
- virtual int source_get_polyphony(RID p_source) const=0;
+ virtual void source_set_polyphony(RID p_source, int p_voice_count) = 0;
+ virtual int source_get_polyphony(RID p_source) const = 0;
enum SourceParam {
@@ -115,17 +113,17 @@ public:
SOURCE_PARAM_MAX
};
- virtual void source_set_param(RID p_source, SourceParam p_param, float p_value)=0;
- virtual float source_get_param(RID p_source, SourceParam p_param) const=0;
+ virtual void source_set_param(RID p_source, SourceParam p_param, float p_value) = 0;
+ virtual float source_get_param(RID p_source, SourceParam p_param) const = 0;
- virtual void source_set_audio_stream(RID p_source, AudioServer::AudioStream *p_stream)=0; //null to unset
- virtual SourceVoiceID source_play_sample(RID p_source, RID p_sample, int p_mix_rate, int p_voice=SOURCE_NEXT_VOICE)=0;
+ virtual void source_set_audio_stream(RID p_source, AudioServer::AudioStream *p_stream) = 0; //null to unset
+ virtual SourceVoiceID source_play_sample(RID p_source, RID p_sample, int p_mix_rate, int p_voice = SOURCE_NEXT_VOICE) = 0;
//voices
- virtual void source_voice_set_pitch_scale(RID p_source,SourceVoiceID p_voice, float p_pitch_scale)=0;
- virtual void source_voice_set_volume_scale_db(RID p_source,SourceVoiceID p_voice, float p_volume_db)=0;
+ virtual void source_voice_set_pitch_scale(RID p_source, SourceVoiceID p_voice, float p_pitch_scale) = 0;
+ virtual void source_voice_set_volume_scale_db(RID p_source, SourceVoiceID p_voice, float p_volume_db) = 0;
- virtual bool source_is_voice_active(RID p_source,SourceVoiceID p_voice) const=0;
- virtual void source_stop_voice(RID p_source,SourceVoiceID p_voice)=0;
+ virtual bool source_is_voice_active(RID p_source, SourceVoiceID p_voice) const = 0;
+ virtual void source_stop_voice(RID p_source, SourceVoiceID p_voice) = 0;
/* LISTENER */
@@ -138,27 +136,26 @@ public:
LISTENER_PARAM_MAX
};
- virtual RID listener_create()=0;
- virtual void listener_set_space(RID p_listener, RID p_space)=0;
+ virtual RID listener_create() = 0;
+ virtual void listener_set_space(RID p_listener, RID p_space) = 0;
- virtual void listener_set_transform(RID p_listener, const Matrix32& p_transform)=0;
- virtual Matrix32 listener_get_transform(RID p_listener) const=0;
+ virtual void listener_set_transform(RID p_listener, const Matrix32 &p_transform) = 0;
+ virtual Matrix32 listener_get_transform(RID p_listener) const = 0;
- virtual void listener_set_param(RID p_listener, ListenerParam p_param, float p_value)=0;
- virtual float listener_get_param(RID p_listener, ListenerParam p_param) const=0;
+ virtual void listener_set_param(RID p_listener, ListenerParam p_param, float p_value) = 0;
+ virtual float listener_get_param(RID p_listener, ListenerParam p_param) const = 0;
/* MISC */
- virtual void free(RID p_id)=0;
+ virtual void free(RID p_id) = 0;
- virtual void init()=0;
- virtual void update(float p_delta)=0;
- virtual void finish()=0;
+ virtual void init() = 0;
+ virtual void update(float p_delta) = 0;
+ virtual void finish() = 0;
static SpatialSound2DServer *get_singleton();
SpatialSound2DServer();
-
};
#endif // SPATIAL_SOUND_2D_SERVER_H
diff --git a/servers/spatial_sound_server.cpp b/servers/spatial_sound_server.cpp
index f49367d4c..99bd5116e 100644
--- a/servers/spatial_sound_server.cpp
+++ b/servers/spatial_sound_server.cpp
@@ -28,17 +28,15 @@
/*************************************************************************/
#include "spatial_sound_server.h"
-SpatialSoundServer *SpatialSoundServer::singleton=NULL;
-
+SpatialSoundServer *SpatialSoundServer::singleton = NULL;
SpatialSoundServer *SpatialSoundServer::get_singleton() {
return singleton;
}
-
SpatialSoundServer::SpatialSoundServer() {
- ERR_FAIL_COND(singleton!=NULL);
- singleton=this;
+ ERR_FAIL_COND(singleton != NULL);
+ singleton = this;
}
diff --git a/servers/spatial_sound_server.h b/servers/spatial_sound_server.h
index c23c7fa8e..72d3ae0af 100644
--- a/servers/spatial_sound_server.h
+++ b/servers/spatial_sound_server.h
@@ -29,38 +29,36 @@
#ifndef SPATIAL_SOUND_SERVER_H
#define SPATIAL_SOUND_SERVER_H
-#include "object.h"
#include "bsp_tree.h"
+#include "object.h"
#include "servers/audio_server.h"
class SpatialSoundServer : public Object {
- OBJ_TYPE(SpatialSoundServer,Object);
+ OBJ_TYPE(SpatialSoundServer, Object);
static SpatialSoundServer *singleton;
-public:
-
+public:
enum {
- SOURCE_INVALID_VOICE=-1,
- SOURCE_NEXT_VOICE=-2,
+ SOURCE_INVALID_VOICE = -1,
+ SOURCE_NEXT_VOICE = -2,
};
typedef int SourceVoiceID;
/* SPACE */
- virtual RID space_create()=0;
+ virtual RID space_create() = 0;
/* ROOM */
- virtual RID room_create()=0;
- virtual void room_set_space(RID p_room,RID p_space)=0;
- virtual RID room_get_space(RID p_room) const=0;
-
+ virtual RID room_create() = 0;
+ virtual void room_set_space(RID p_room, RID p_space) = 0;
+ virtual RID room_get_space(RID p_room) const = 0;
- virtual void room_set_bounds(RID p_room, const BSP_Tree& p_bounds)=0;
- virtual BSP_Tree room_get_bounds(RID p_room) const=0;
- virtual void room_set_transform(RID p_room, const Transform& p_transform)=0;
- virtual Transform room_get_transform(RID p_room) const=0;
+ virtual void room_set_bounds(RID p_room, const BSP_Tree &p_bounds) = 0;
+ virtual BSP_Tree room_get_bounds(RID p_room) const = 0;
+ virtual void room_set_transform(RID p_room, const Transform &p_transform) = 0;
+ virtual Transform room_get_transform(RID p_room) const = 0;
enum RoomParam {
ROOM_PARAM_SPEED_OF_SOUND_SCALE,
@@ -77,8 +75,8 @@ public:
ROOM_PARAM_MAX
};
- virtual void room_set_param(RID p_room, RoomParam p_param, float p_value)=0;
- virtual float room_get_param(RID p_room, RoomParam p_param) const=0;
+ virtual void room_set_param(RID p_room, RoomParam p_param, float p_value) = 0;
+ virtual float room_get_param(RID p_room, RoomParam p_param) const = 0;
enum RoomReverb {
ROOM_REVERB_SMALL,
@@ -87,25 +85,25 @@ public:
ROOM_REVERB_HALL
};
- virtual void room_set_reverb(RID p_room, RoomReverb p_reverb)=0;
- virtual RoomReverb room_get_reverb(RID p_room) const=0;
+ virtual void room_set_reverb(RID p_room, RoomReverb p_reverb) = 0;
+ virtual RoomReverb room_get_reverb(RID p_room) const = 0;
- virtual void room_set_level(RID p_room, int p_level)=0;
- virtual int room_get_level(RID p_room) const=0;
+ virtual void room_set_level(RID p_room, int p_level) = 0;
+ virtual int room_get_level(RID p_room) const = 0;
//useful for underwater or rooms with very strange conditions
- virtual void room_set_force_params_to_all_sources(RID p_room, bool p_force)=0;
- virtual bool room_is_forcing_params_to_all_sources(RID p_room) const=0;
+ virtual void room_set_force_params_to_all_sources(RID p_room, bool p_force) = 0;
+ virtual bool room_is_forcing_params_to_all_sources(RID p_room) const = 0;
/* SOURCE */
- virtual RID source_create(RID p_space)=0;
+ virtual RID source_create(RID p_space) = 0;
- virtual void source_set_transform(RID p_source, const Transform& p_transform)=0;
- virtual Transform source_get_transform(RID p_source) const=0;
+ virtual void source_set_transform(RID p_source, const Transform &p_transform) = 0;
+ virtual Transform source_get_transform(RID p_source) const = 0;
- virtual void source_set_polyphony(RID p_source,int p_voice_count)=0;
- virtual int source_get_polyphony(RID p_source) const=0;
+ virtual void source_set_polyphony(RID p_source, int p_voice_count) = 0;
+ virtual int source_get_polyphony(RID p_source) const = 0;
enum SourceParam {
@@ -119,17 +117,17 @@ public:
SOURCE_PARAM_MAX
};
- virtual void source_set_param(RID p_source, SourceParam p_param, float p_value)=0;
- virtual float source_get_param(RID p_source, SourceParam p_param) const=0;
+ virtual void source_set_param(RID p_source, SourceParam p_param, float p_value) = 0;
+ virtual float source_get_param(RID p_source, SourceParam p_param) const = 0;
- virtual void source_set_audio_stream(RID p_source, AudioServer::AudioStream *p_stream)=0; //null to unset
- virtual SourceVoiceID source_play_sample(RID p_source, RID p_sample, int p_mix_rate, int p_voice=SOURCE_NEXT_VOICE)=0;
+ virtual void source_set_audio_stream(RID p_source, AudioServer::AudioStream *p_stream) = 0; //null to unset
+ virtual SourceVoiceID source_play_sample(RID p_source, RID p_sample, int p_mix_rate, int p_voice = SOURCE_NEXT_VOICE) = 0;
//voices
- virtual void source_voice_set_pitch_scale(RID p_source,SourceVoiceID p_voice, float p_pitch_scale)=0;
- virtual void source_voice_set_volume_scale_db(RID p_source,SourceVoiceID p_voice, float p_volume_db)=0;
+ virtual void source_voice_set_pitch_scale(RID p_source, SourceVoiceID p_voice, float p_pitch_scale) = 0;
+ virtual void source_voice_set_volume_scale_db(RID p_source, SourceVoiceID p_voice, float p_volume_db) = 0;
- virtual bool source_is_voice_active(RID p_source,SourceVoiceID p_voice) const=0;
- virtual void source_stop_voice(RID p_source,SourceVoiceID p_voice)=0;
+ virtual bool source_is_voice_active(RID p_source, SourceVoiceID p_voice) const = 0;
+ virtual void source_stop_voice(RID p_source, SourceVoiceID p_voice) = 0;
/* LISTENER */
@@ -143,22 +141,22 @@ public:
LISTENER_PARAM_MAX
};
- virtual RID listener_create()=0;
- virtual void listener_set_space(RID p_listener, RID p_space)=0;
+ virtual RID listener_create() = 0;
+ virtual void listener_set_space(RID p_listener, RID p_space) = 0;
- virtual void listener_set_transform(RID p_listener, const Transform& p_transform)=0;
- virtual Transform listener_get_transform(RID p_listener) const=0;
+ virtual void listener_set_transform(RID p_listener, const Transform &p_transform) = 0;
+ virtual Transform listener_get_transform(RID p_listener) const = 0;
- virtual void listener_set_param(RID p_listener, ListenerParam p_param, float p_value)=0;
- virtual float listener_get_param(RID p_listener, ListenerParam p_param) const=0;
+ virtual void listener_set_param(RID p_listener, ListenerParam p_param, float p_value) = 0;
+ virtual float listener_get_param(RID p_listener, ListenerParam p_param) const = 0;
/* MISC */
- virtual void free(RID p_id)=0;
+ virtual void free(RID p_id) = 0;
- virtual void init()=0;
- virtual void update(float p_delta)=0;
- virtual void finish()=0;
+ virtual void init() = 0;
+ virtual void update(float p_delta) = 0;
+ virtual void finish() = 0;
static SpatialSoundServer *get_singleton();
diff --git a/servers/visual/particle_system_sw.cpp b/servers/visual/particle_system_sw.cpp
index 9f26589ff..15809f51a 100644
--- a/servers/visual/particle_system_sw.cpp
+++ b/servers/visual/particle_system_sw.cpp
@@ -29,53 +29,48 @@
#include "particle_system_sw.h"
#include "sort.h"
-
ParticleSystemSW::ParticleSystemSW() {
- amount=8;
- emitting=true;
+ amount = 8;
+ emitting = true;
- for (int i=0;i<VS::PARTICLE_VAR_MAX;i++) {
- particle_randomness[i]=0.0;
+ for (int i = 0; i < VS::PARTICLE_VAR_MAX; i++) {
+ particle_randomness[i] = 0.0;
}
- particle_vars[VS::PARTICLE_LIFETIME]=2.0;//
- particle_vars[VS::PARTICLE_SPREAD]=0.2;//
- particle_vars[VS::PARTICLE_GRAVITY]=9.8;//
- particle_vars[VS::PARTICLE_LINEAR_VELOCITY]=0.2;//
- particle_vars[VS::PARTICLE_ANGULAR_VELOCITY]=0.0;//
- particle_vars[VS::PARTICLE_LINEAR_ACCELERATION]=0.0;//
- particle_vars[VS::PARTICLE_RADIAL_ACCELERATION]=0.0;//
- particle_vars[VS::PARTICLE_TANGENTIAL_ACCELERATION]=1.0;//
- particle_vars[VS::PARTICLE_DAMPING]=0.0;//
- particle_vars[VS::PARTICLE_INITIAL_SIZE]=1.0;
- particle_vars[VS::PARTICLE_FINAL_SIZE]=0.8;
- particle_vars[VS::PARTICLE_HEIGHT]=1;
- particle_vars[VS::PARTICLE_HEIGHT_SPEED_SCALE]=1;
+ particle_vars[VS::PARTICLE_LIFETIME] = 2.0; //
+ particle_vars[VS::PARTICLE_SPREAD] = 0.2; //
+ particle_vars[VS::PARTICLE_GRAVITY] = 9.8; //
+ particle_vars[VS::PARTICLE_LINEAR_VELOCITY] = 0.2; //
+ particle_vars[VS::PARTICLE_ANGULAR_VELOCITY] = 0.0; //
+ particle_vars[VS::PARTICLE_LINEAR_ACCELERATION] = 0.0; //
+ particle_vars[VS::PARTICLE_RADIAL_ACCELERATION] = 0.0; //
+ particle_vars[VS::PARTICLE_TANGENTIAL_ACCELERATION] = 1.0; //
+ particle_vars[VS::PARTICLE_DAMPING] = 0.0; //
+ particle_vars[VS::PARTICLE_INITIAL_SIZE] = 1.0;
+ particle_vars[VS::PARTICLE_FINAL_SIZE] = 0.8;
+ particle_vars[VS::PARTICLE_HEIGHT] = 1;
+ particle_vars[VS::PARTICLE_HEIGHT_SPEED_SCALE] = 1;
- height_from_velocity=false;
- local_coordinates=false;
+ height_from_velocity = false;
+ local_coordinates = false;
- particle_vars[VS::PARTICLE_INITIAL_ANGLE]=0.0;//
+ particle_vars[VS::PARTICLE_INITIAL_ANGLE] = 0.0; //
- gravity_normal=Vector3(0,-1.0,0);
+ gravity_normal = Vector3(0, -1.0, 0);
//emission_half_extents=Vector3(0.1,0.1,0.1);
- emission_half_extents=Vector3(1,1,1);
- color_phase_count=0;
- color_phases[0].pos=0.0;
- color_phases[0].color=Color(1.0,0.0,0.0);
- visibility_aabb=AABB(Vector3(-64,-64,-64),Vector3(128,128,128));
-
- attractor_count=0;
+ emission_half_extents = Vector3(1, 1, 1);
+ color_phase_count = 0;
+ color_phases[0].pos = 0.0;
+ color_phases[0].color = Color(1.0, 0.0, 0.0);
+ visibility_aabb = AABB(Vector3(-64, -64, -64), Vector3(128, 128, 128));
+ attractor_count = 0;
}
-
-ParticleSystemSW::~ParticleSystemSW()
-{
+ParticleSystemSW::~ParticleSystemSW() {
}
-
#define DEFAULT_SEED 1234567
_FORCE_INLINE_ static float _rand_from_seed(uint32_t *seed) {
@@ -90,8 +85,8 @@ _FORCE_INLINE_ static float _rand_from_seed(uint32_t *seed) {
s += 2147483647;
(*seed) = s;
- float v=((float)((*seed) & 0xFFFFF))/(float)0xFFFFF;
- v=v*2.0-1.0;
+ float v = ((float)((*seed) & 0xFFFFF)) / (float)0xFFFFF;
+ v = v * 2.0 - 1.0;
return v;
}
@@ -110,112 +105,108 @@ _FORCE_INLINE_ static uint32_t _irand_from_seed(uint32_t *seed) {
return s;
}
-void ParticleSystemProcessSW::process(const ParticleSystemSW *p_system,const Transform& p_transform,float p_time) {
+void ParticleSystemProcessSW::process(const ParticleSystemSW *p_system, const Transform &p_transform, float p_time) {
- valid=false;
- if (p_system->amount<=0) {
- ERR_EXPLAIN("Invalid amount of particles: "+itos(p_system->amount));
- ERR_FAIL_COND(p_system->amount<=0);
+ valid = false;
+ if (p_system->amount <= 0) {
+ ERR_EXPLAIN("Invalid amount of particles: " + itos(p_system->amount));
+ ERR_FAIL_COND(p_system->amount <= 0);
}
- if (p_system->attractor_count<0 || p_system->attractor_count>VS::MAX_PARTICLE_ATTRACTORS) {
+ if (p_system->attractor_count < 0 || p_system->attractor_count > VS::MAX_PARTICLE_ATTRACTORS) {
ERR_EXPLAIN("Invalid amount of particle attractors.");
- ERR_FAIL_COND(p_system->attractor_count<0 || p_system->attractor_count>VS::MAX_PARTICLE_ATTRACTORS);
+ ERR_FAIL_COND(p_system->attractor_count < 0 || p_system->attractor_count > VS::MAX_PARTICLE_ATTRACTORS);
}
float lifetime = p_system->particle_vars[VS::PARTICLE_LIFETIME];
- if (lifetime<CMP_EPSILON) {
+ if (lifetime < CMP_EPSILON) {
ERR_EXPLAIN("Particle system lifetime too small.");
- ERR_FAIL_COND(lifetime<CMP_EPSILON);
+ ERR_FAIL_COND(lifetime < CMP_EPSILON);
}
- valid=true;
- int particle_count=MIN(p_system->amount,ParticleSystemSW::MAX_PARTICLES);;
-
+ valid = true;
+ int particle_count = MIN(p_system->amount, ParticleSystemSW::MAX_PARTICLES);
+ ;
int emission_point_count = p_system->emission_points.size();
DVector<Vector3>::Read r;
if (emission_point_count)
- r=p_system->emission_points.read();
+ r = p_system->emission_points.read();
- if (particle_count!=particle_data.size()) {
+ if (particle_count != particle_data.size()) {
//clear the whole system if particle amount changed
particle_data.clear();
particle_data.resize(p_system->amount);
- particle_system_time=0;
+ particle_system_time = 0;
}
- float next_time = particle_system_time+p_time;
+ float next_time = particle_system_time + p_time;
if (next_time > lifetime)
- next_time=Math::fmod(next_time,lifetime);
-
+ next_time = Math::fmod(next_time, lifetime);
- ParticleData *pdata=&particle_data[0];
+ ParticleData *pdata = &particle_data[0];
Vector3 attractor_positions[VS::MAX_PARTICLE_ATTRACTORS];
- for(int i=0;i<p_system->attractor_count;i++) {
+ for (int i = 0; i < p_system->attractor_count; i++) {
- attractor_positions[i]=p_transform.xform(p_system->attractors[i].pos);
+ attractor_positions[i] = p_transform.xform(p_system->attractors[i].pos);
}
+ for (int i = 0; i < particle_count; i++) {
- for(int i=0;i<particle_count;i++) {
-
- ParticleData &p=pdata[i];
+ ParticleData &p = pdata[i];
float restart_time = (i * lifetime / p_system->amount);
- bool restart=false;
+ bool restart = false;
- if ( next_time < particle_system_time ) {
+ if (next_time < particle_system_time) {
- if (restart_time > particle_system_time || restart_time < next_time )
- restart=true;
+ if (restart_time > particle_system_time || restart_time < next_time)
+ restart = true;
- } else if (restart_time > particle_system_time && restart_time < next_time ) {
- restart=true;
+ } else if (restart_time > particle_system_time && restart_time < next_time) {
+ restart = true;
}
if (restart) {
-
if (p_system->emitting) {
- if (emission_point_count==0) { //use AABB
+ if (emission_point_count == 0) { //use AABB
if (p_system->local_coordinates)
- p.pos = p_system->emission_half_extents * Vector3( _rand_from_seed(&rand_seed), _rand_from_seed(&rand_seed), _rand_from_seed(&rand_seed) );
+ p.pos = p_system->emission_half_extents * Vector3(_rand_from_seed(&rand_seed), _rand_from_seed(&rand_seed), _rand_from_seed(&rand_seed));
else
- p.pos = p_transform.xform( p_system->emission_half_extents * Vector3( _rand_from_seed(&rand_seed), _rand_from_seed(&rand_seed), _rand_from_seed(&rand_seed) ) );
+ p.pos = p_transform.xform(p_system->emission_half_extents * Vector3(_rand_from_seed(&rand_seed), _rand_from_seed(&rand_seed), _rand_from_seed(&rand_seed)));
} else {
//use preset positions
if (p_system->local_coordinates)
- p.pos = r[_irand_from_seed(&rand_seed)%emission_point_count];
+ p.pos = r[_irand_from_seed(&rand_seed) % emission_point_count];
else
- p.pos = p_transform.xform( r[_irand_from_seed(&rand_seed)%emission_point_count] );
+ p.pos = p_transform.xform(r[_irand_from_seed(&rand_seed) % emission_point_count]);
}
+ float angle1 = _rand_from_seed(&rand_seed) * p_system->particle_vars[VS::PARTICLE_SPREAD] * Math_PI;
+ float angle2 = _rand_from_seed(&rand_seed) * 20.0 * Math_PI; // make it more random like
- float angle1 = _rand_from_seed(&rand_seed)*p_system->particle_vars[VS::PARTICLE_SPREAD]*Math_PI;
- float angle2 = _rand_from_seed(&rand_seed)*20.0*Math_PI; // make it more random like
-
- Vector3 rot_xz=Vector3( Math::sin(angle1), 0.0, Math::cos(angle1) );
- Vector3 rot = Vector3( Math::cos(angle2)*rot_xz.x,Math::sin(angle2)*rot_xz.x, rot_xz.z);
+ Vector3 rot_xz = Vector3(Math::sin(angle1), 0.0, Math::cos(angle1));
+ Vector3 rot = Vector3(Math::cos(angle2) * rot_xz.x, Math::sin(angle2) * rot_xz.x, rot_xz.z);
- p.vel=(rot*p_system->particle_vars[VS::PARTICLE_LINEAR_VELOCITY]+rot*p_system->particle_randomness[VS::PARTICLE_LINEAR_VELOCITY]*_rand_from_seed(&rand_seed));
+ p.vel = (rot * p_system->particle_vars[VS::PARTICLE_LINEAR_VELOCITY] + rot * p_system->particle_randomness[VS::PARTICLE_LINEAR_VELOCITY] * _rand_from_seed(&rand_seed));
if (!p_system->local_coordinates)
- p.vel=p_transform.basis.xform( p.vel );
+ p.vel = p_transform.basis.xform(p.vel);
- p.vel+=p_system->emission_base_velocity;
+ p.vel += p_system->emission_base_velocity;
- p.rot=p_system->particle_vars[VS::PARTICLE_INITIAL_ANGLE]+p_system->particle_randomness[VS::PARTICLE_INITIAL_ANGLE]*_rand_from_seed(&rand_seed);
- p.active=true;
- for(int r=0;r<PARTICLE_RANDOM_NUMBERS;r++)
- p.random[r]=_rand_from_seed(&rand_seed);
+ p.rot = p_system->particle_vars[VS::PARTICLE_INITIAL_ANGLE] + p_system->particle_randomness[VS::PARTICLE_INITIAL_ANGLE] * _rand_from_seed(&rand_seed);
+ p.active = true;
+ for (int r = 0; r < PARTICLE_RANDOM_NUMBERS; r++)
+ p.random[r] = _rand_from_seed(&rand_seed);
} else {
- p.pos=Vector3();
- p.rot=0;
- p.vel=Vector3();
- p.active=false;
+ p.pos = Vector3();
+ p.rot = 0;
+ p.vel = Vector3();
+ p.active = false;
}
} else {
@@ -225,110 +216,100 @@ void ParticleSystemProcessSW::process(const ParticleSystemSW *p_system,const Tra
Vector3 force;
//apply gravity
- force=p_system->gravity_normal * (p_system->particle_vars[VS::PARTICLE_GRAVITY]+(p_system->particle_randomness[VS::PARTICLE_GRAVITY]*p.random[0]));
+ force = p_system->gravity_normal * (p_system->particle_vars[VS::PARTICLE_GRAVITY] + (p_system->particle_randomness[VS::PARTICLE_GRAVITY] * p.random[0]));
//apply linear acceleration
- force+=p.vel.normalized() * (p_system->particle_vars[VS::PARTICLE_LINEAR_ACCELERATION]+p_system->particle_randomness[VS::PARTICLE_LINEAR_ACCELERATION]*p.random[1]);
+ force += p.vel.normalized() * (p_system->particle_vars[VS::PARTICLE_LINEAR_ACCELERATION] + p_system->particle_randomness[VS::PARTICLE_LINEAR_ACCELERATION] * p.random[1]);
//apply radial acceleration
Vector3 org;
if (!p_system->local_coordinates)
- org=p_transform.origin;
- force+=(p.pos-org).normalized() * (p_system->particle_vars[VS::PARTICLE_RADIAL_ACCELERATION]+p_system->particle_randomness[VS::PARTICLE_RADIAL_ACCELERATION]*p.random[2]);
+ org = p_transform.origin;
+ force += (p.pos - org).normalized() * (p_system->particle_vars[VS::PARTICLE_RADIAL_ACCELERATION] + p_system->particle_randomness[VS::PARTICLE_RADIAL_ACCELERATION] * p.random[2]);
//apply tangential acceleration
- force+=(p.pos-org).cross(p_system->gravity_normal).normalized() * (p_system->particle_vars[VS::PARTICLE_TANGENTIAL_ACCELERATION]+p_system->particle_randomness[VS::PARTICLE_TANGENTIAL_ACCELERATION]*p.random[3]);
+ force += (p.pos - org).cross(p_system->gravity_normal).normalized() * (p_system->particle_vars[VS::PARTICLE_TANGENTIAL_ACCELERATION] + p_system->particle_randomness[VS::PARTICLE_TANGENTIAL_ACCELERATION] * p.random[3]);
//apply attractor forces
- for(int a=0;a<p_system->attractor_count;a++) {
+ for (int a = 0; a < p_system->attractor_count; a++) {
- force+=(p.pos-attractor_positions[a]).normalized() * p_system->attractors[a].force;
+ force += (p.pos - attractor_positions[a]).normalized() * p_system->attractors[a].force;
}
-
- p.vel+=force * p_time;
+ p.vel += force * p_time;
if (p_system->particle_vars[VS::PARTICLE_DAMPING]) {
float v = p.vel.length();
float damp = p_system->particle_vars[VS::PARTICLE_DAMPING] + p_system->particle_vars[VS::PARTICLE_DAMPING] * p_system->particle_randomness[VS::PARTICLE_DAMPING];
v -= damp * p_time;
- if (v<0) {
- p.vel=Vector3();
+ if (v < 0) {
+ p.vel = Vector3();
} else {
- p.vel=p.vel.normalized() * v;
+ p.vel = p.vel.normalized() * v;
}
-
}
- p.rot+=(p_system->particle_vars[VS::PARTICLE_ANGULAR_VELOCITY]+p_system->particle_randomness[VS::PARTICLE_ANGULAR_VELOCITY]*p.random[4]) *p_time;
- p.pos+=p.vel * p_time;
+ p.rot += (p_system->particle_vars[VS::PARTICLE_ANGULAR_VELOCITY] + p_system->particle_randomness[VS::PARTICLE_ANGULAR_VELOCITY] * p.random[4]) * p_time;
+ p.pos += p.vel * p_time;
}
}
- particle_system_time=Math::fmod( particle_system_time+p_time, lifetime );
-
-
+ particle_system_time = Math::fmod(particle_system_time + p_time, lifetime);
}
ParticleSystemProcessSW::ParticleSystemProcessSW() {
- particle_system_time=0;
- rand_seed=1234567;
- valid=false;
+ particle_system_time = 0;
+ rand_seed = 1234567;
+ valid = false;
}
-
struct _ParticleSorterSW {
-
- _FORCE_INLINE_ bool operator()(const ParticleSystemDrawInfoSW::ParticleDrawInfo *p_a,const ParticleSystemDrawInfoSW::ParticleDrawInfo *p_b) const {
+ _FORCE_INLINE_ bool operator()(const ParticleSystemDrawInfoSW::ParticleDrawInfo *p_a, const ParticleSystemDrawInfoSW::ParticleDrawInfo *p_b) const {
return p_a->d > p_b->d; // draw from further away to closest
}
};
-void ParticleSystemDrawInfoSW::prepare(const ParticleSystemSW *p_system,const ParticleSystemProcessSW *p_process,const Transform& p_system_transform,const Transform& p_camera_transform) {
+void ParticleSystemDrawInfoSW::prepare(const ParticleSystemSW *p_system, const ParticleSystemProcessSW *p_process, const Transform &p_system_transform, const Transform &p_camera_transform) {
ERR_FAIL_COND(p_process->particle_data.size() != p_system->amount);
- ERR_FAIL_COND(p_system->amount<=0 || p_system->amount>=ParticleSystemSW::MAX_PARTICLES);
+ ERR_FAIL_COND(p_system->amount <= 0 || p_system->amount >= ParticleSystemSW::MAX_PARTICLES);
- const ParticleSystemProcessSW::ParticleData *pdata=&p_process->particle_data[0];
- float time_pos=p_process->particle_system_time/p_system->particle_vars[VS::PARTICLE_LIFETIME];
+ const ParticleSystemProcessSW::ParticleData *pdata = &p_process->particle_data[0];
+ float time_pos = p_process->particle_system_time / p_system->particle_vars[VS::PARTICLE_LIFETIME];
ParticleSystemSW::ColorPhase cphase[VS::MAX_PARTICLE_COLOR_PHASES];
- float last=-1;
- int col_count=0;
+ float last = -1;
+ int col_count = 0;
- for(int i=0;i<p_system->color_phase_count;i++) {
+ for (int i = 0; i < p_system->color_phase_count; i++) {
- if (p_system->color_phases[i].pos<=last)
+ if (p_system->color_phases[i].pos <= last)
break;
- cphase[i]=p_system->color_phases[i];
+ cphase[i] = p_system->color_phases[i];
col_count++;
}
-
-
-
-
Vector3 camera_z_axis = p_camera_transform.basis.get_axis(2);
- for(int i=0;i<p_system->amount;i++) {
+ for (int i = 0; i < p_system->amount; i++) {
- ParticleDrawInfo &pdi=draw_info[i];
- pdi.data=&pdata[i];
- pdi.transform.origin=pdi.data->pos;
+ ParticleDrawInfo &pdi = draw_info[i];
+ pdi.data = &pdata[i];
+ pdi.transform.origin = pdi.data->pos;
if (p_system->local_coordinates)
- pdi.transform.origin=p_system_transform.xform(pdi.transform.origin);
+ pdi.transform.origin = p_system_transform.xform(pdi.transform.origin);
- pdi.d=-camera_z_axis.dot(pdi.transform.origin);
+ pdi.d = -camera_z_axis.dot(pdi.transform.origin);
// adjust particle size, color and rotation
float time = ((float)i / p_system->amount);
- if (time<time_pos)
- time=time_pos-time;
+ if (time < time_pos)
+ time = time_pos - time;
else
- time=(1.0-time)+time_pos;
+ time = (1.0 - time) + time_pos;
- Vector3 up=p_camera_transform.basis.get_axis(1); // up determines the rotation
- float up_scale=1.0;
+ Vector3 up = p_camera_transform.basis.get_axis(1); // up determines the rotation
+ float up_scale = 1.0;
if (p_system->height_from_velocity) {
@@ -336,47 +317,43 @@ void ParticleSystemDrawInfoSW::prepare(const ParticleSystemSW *p_system,const Pa
Vector3 cam_z = camera_z_axis.normalized();
float vc = Math::abs(veld.normalized().dot(cam_z));
- if (vc<(1.0-CMP_EPSILON)) {
- up = Plane(cam_z,0).project(veld).normalized();
- float h = p_system->particle_vars[VS::PARTICLE_HEIGHT]+p_system->particle_randomness[VS::PARTICLE_HEIGHT]*pdi.data->random[7];
+ if (vc < (1.0 - CMP_EPSILON)) {
+ up = Plane(cam_z, 0).project(veld).normalized();
+ float h = p_system->particle_vars[VS::PARTICLE_HEIGHT] + p_system->particle_randomness[VS::PARTICLE_HEIGHT] * pdi.data->random[7];
float velh = veld.length();
- h+=velh*(p_system->particle_vars[VS::PARTICLE_HEIGHT_SPEED_SCALE]+p_system->particle_randomness[VS::PARTICLE_HEIGHT_SPEED_SCALE]*pdi.data->random[7]);
-
+ h += velh * (p_system->particle_vars[VS::PARTICLE_HEIGHT_SPEED_SCALE] + p_system->particle_randomness[VS::PARTICLE_HEIGHT_SPEED_SCALE] * pdi.data->random[7]);
- up_scale=Math::lerp(1.0,h,(1.0-vc));
+ up_scale = Math::lerp(1.0, h, (1.0 - vc));
}
} else if (pdi.data->rot) {
- up.rotate(camera_z_axis,pdi.data->rot);
+ up.rotate(camera_z_axis, pdi.data->rot);
}
{
// matrix
- Vector3 v_z = (p_camera_transform.origin-pdi.transform.origin).normalized();
-// Vector3 v_z = (p_camera_transform.origin-pdi.data->pos).normalized();
+ Vector3 v_z = (p_camera_transform.origin - pdi.transform.origin).normalized();
+ // Vector3 v_z = (p_camera_transform.origin-pdi.data->pos).normalized();
Vector3 v_y = up;
Vector3 v_x = v_y.cross(v_z);
v_y = v_z.cross(v_x);
v_x.normalize();
v_y.normalize();
-
float initial_scale, final_scale;
- initial_scale = p_system->particle_vars[VS::PARTICLE_INITIAL_SIZE]+p_system->particle_randomness[VS::PARTICLE_INITIAL_SIZE]*pdi.data->random[5];
- final_scale = p_system->particle_vars[VS::PARTICLE_FINAL_SIZE]+p_system->particle_randomness[VS::PARTICLE_FINAL_SIZE]*pdi.data->random[6];
+ initial_scale = p_system->particle_vars[VS::PARTICLE_INITIAL_SIZE] + p_system->particle_randomness[VS::PARTICLE_INITIAL_SIZE] * pdi.data->random[5];
+ final_scale = p_system->particle_vars[VS::PARTICLE_FINAL_SIZE] + p_system->particle_randomness[VS::PARTICLE_FINAL_SIZE] * pdi.data->random[6];
float scale = initial_scale + time * (final_scale - initial_scale);
- pdi.transform.basis.set_axis(0,v_x * scale);
- pdi.transform.basis.set_axis(1,v_y * scale * up_scale);
- pdi.transform.basis.set_axis(2,v_z * scale);
+ pdi.transform.basis.set_axis(0, v_x * scale);
+ pdi.transform.basis.set_axis(1, v_y * scale * up_scale);
+ pdi.transform.basis.set_axis(2, v_z * scale);
}
+ int cpos = 0;
-
- int cpos=0;
-
- while(cpos<col_count) {
+ while (cpos < col_count) {
if (cphase[cpos].pos > time)
break;
@@ -385,28 +362,23 @@ void ParticleSystemDrawInfoSW::prepare(const ParticleSystemSW *p_system,const Pa
cpos--;
-
- if (cpos==-1)
- pdi.color=Color(1,1,1,1);
+ if (cpos == -1)
+ pdi.color = Color(1, 1, 1, 1);
else {
- if (cpos==col_count-1)
- pdi.color=cphase[cpos].color;
+ if (cpos == col_count - 1)
+ pdi.color = cphase[cpos].color;
else {
- float diff = (cphase[cpos+1].pos-cphase[cpos].pos);
- if (diff>0)
- pdi.color=cphase[cpos].color.linear_interpolate(cphase[cpos+1].color, (time - cphase[cpos].pos) / diff );
+ float diff = (cphase[cpos + 1].pos - cphase[cpos].pos);
+ if (diff > 0)
+ pdi.color = cphase[cpos].color.linear_interpolate(cphase[cpos + 1].color, (time - cphase[cpos].pos) / diff);
else
- pdi.color=cphase[cpos+1].color;
+ pdi.color = cphase[cpos + 1].color;
}
}
-
- draw_info_order[i]=&pdi;
-
+ draw_info_order[i] = &pdi;
}
-
- SortArray<ParticleDrawInfo*,_ParticleSorterSW> particle_sort;
- particle_sort.sort(&draw_info_order[0],p_system->amount);
-
+ SortArray<ParticleDrawInfo *, _ParticleSorterSW> particle_sort;
+ particle_sort.sort(&draw_info_order[0], p_system->amount);
}
diff --git a/servers/visual/particle_system_sw.h b/servers/visual/particle_system_sw.h
index 8f4a5f8ec..a3878b83d 100644
--- a/servers/visual/particle_system_sw.h
+++ b/servers/visual/particle_system_sw.h
@@ -38,7 +38,7 @@
struct ParticleSystemSW {
enum {
- MAX_PARTICLES=1024
+ MAX_PARTICLES = 1024
};
float particle_vars[VS::PARTICLE_VAR_MAX];
@@ -59,13 +59,15 @@ struct ParticleSystemSW {
float pos;
Color color;
- ColorPhase() { pos=1.0; color=Color(0.0,0.0,1.0,1.0); }
+ ColorPhase() {
+ pos = 1.0;
+ color = Color(0.0, 0.0, 1.0, 1.0);
+ }
};
int color_phase_count;
ColorPhase color_phases[VS::MAX_PARTICLE_COLOR_PHASES];
-
struct Attractor {
Vector3 pos;
@@ -75,13 +77,10 @@ struct ParticleSystemSW {
int attractor_count;
Attractor attractors[VS::MAX_PARTICLE_ATTRACTORS];
-
ParticleSystemSW();
~ParticleSystemSW();
-
};
-
struct ParticleSystemProcessSW {
enum {
@@ -96,16 +95,18 @@ struct ParticleSystemProcessSW {
bool active;
float random[PARTICLE_RANDOM_NUMBERS];
- ParticleData() { active=0; rot=0; }
+ ParticleData() {
+ active = 0;
+ rot = 0;
+ }
};
-
bool valid;
float particle_system_time;
uint32_t rand_seed;
Vector<ParticleData> particle_data;
- void process(const ParticleSystemSW *p_system,const Transform& p_transform,float p_time);
+ void process(const ParticleSystemSW *p_system, const Transform &p_transform, float p_time);
ParticleSystemProcessSW();
};
@@ -118,14 +119,12 @@ struct ParticleSystemDrawInfoSW {
float d;
Transform transform;
Color color;
-
};
ParticleDrawInfo draw_info[ParticleSystemSW::MAX_PARTICLES];
ParticleDrawInfo *draw_info_order[ParticleSystemSW::MAX_PARTICLES];
- void prepare(const ParticleSystemSW *p_system,const ParticleSystemProcessSW *p_process,const Transform& p_system_transform,const Transform& p_camera_transform);
-
+ void prepare(const ParticleSystemSW *p_system, const ParticleSystemProcessSW *p_process, const Transform &p_system_transform, const Transform &p_camera_transform);
};
#endif
diff --git a/servers/visual/rasterizer.cpp b/servers/visual/rasterizer.cpp
index e5e135fd3..69a6030f5 100644
--- a/servers/visual/rasterizer.cpp
+++ b/servers/visual/rasterizer.cpp
@@ -27,21 +27,20 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include "rasterizer.h"
-#include "print_string.h"
#include "os/os.h"
+#include "print_string.h"
RID Rasterizer::create_default_material() {
return material_create();
}
-
/* Fixed MAterial SHADER API */
-RID Rasterizer::_create_shader(const FixedMaterialShaderKey& p_key) {
+RID Rasterizer::_create_shader(const FixedMaterialShaderKey &p_key) {
- ERR_FAIL_COND_V(!p_key.valid,RID());
- Map<FixedMaterialShaderKey,FixedMaterialShader>::Element *E=fixed_material_shaders.find(p_key);
+ ERR_FAIL_COND_V(!p_key.valid, RID());
+ Map<FixedMaterialShaderKey, FixedMaterialShader>::Element *E = fixed_material_shaders.find(p_key);
if (E) {
E->get().refcount++;
@@ -51,200 +50,192 @@ RID Rasterizer::_create_shader(const FixedMaterialShaderKey& p_key) {
uint64_t t = OS::get_singleton()->get_ticks_usec();
FixedMaterialShader fms;
- fms.refcount=1;
- fms.shader=shader_create();
+ fms.refcount = 1;
+ fms.shader = shader_create();
//create shader code
-
- int texcoords_used=0;
+ int texcoords_used = 0;
String code;
- static const char* _uv_str[4]={"UV","uv_xform","UV2","uv_sphere"};
-#define _TEXUVSTR(m_idx) String( _uv_str[(p_key.texcoord_mask>>(m_idx*2))&0x3] )
-
+ static const char *_uv_str[4] = { "UV", "uv_xform", "UV2", "uv_sphere" };
+#define _TEXUVSTR(m_idx) String(_uv_str[(p_key.texcoord_mask >> (m_idx * 2)) & 0x3])
if (p_key.use_pointsize) {
- code+="UV=POINT_COORD;\n";
+ code += "UV=POINT_COORD;\n";
}
+ for (int i = 0; i < VS::FIXED_MATERIAL_PARAM_MAX; i++) {
- for(int i=0;i<VS::FIXED_MATERIAL_PARAM_MAX;i++) {
-
- if (p_key.texture_mask&(1<<i))
- texcoords_used|=(1<<((p_key.texcoord_mask>>(i*2))&0x3));
+ if (p_key.texture_mask & (1 << i))
+ texcoords_used |= (1 << ((p_key.texcoord_mask >> (i * 2)) & 0x3));
}
- if (texcoords_used&(1<<VS::FIXED_MATERIAL_TEXCOORD_UV_TRANSFORM)) {
+ if (texcoords_used & (1 << VS::FIXED_MATERIAL_TEXCOORD_UV_TRANSFORM)) {
- code+="uniform mat4 fmp_uv_xform;\n";
- code+="vec2 uv_xform = (fmp_uv_xform * vec4(UV,0,1)).xy;\n";
+ code += "uniform mat4 fmp_uv_xform;\n";
+ code += "vec2 uv_xform = (fmp_uv_xform * vec4(UV,0,1)).xy;\n";
}
/* HANDLE NORMAL MAPPING */
-
- if (p_key.texture_mask&(1<<VS::FIXED_MATERIAL_PARAM_NORMAL)) {
+ if (p_key.texture_mask & (1 << VS::FIXED_MATERIAL_PARAM_NORMAL)) {
String scode;
- scode+="uniform float fmp_normal;\n";
- scode+="uniform texture fmp_normal_tex;\n";
+ scode += "uniform float fmp_normal;\n";
+ scode += "uniform texture fmp_normal_tex;\n";
String uv_str;
- if (((p_key.texcoord_mask>>(VS::FIXED_MATERIAL_PARAM_NORMAL*2))&0x3)==VS::FIXED_MATERIAL_TEXCOORD_SPHERE) {
- uv_str="uv"; //sorry not supported
+ if (((p_key.texcoord_mask >> (VS::FIXED_MATERIAL_PARAM_NORMAL * 2)) & 0x3) == VS::FIXED_MATERIAL_TEXCOORD_SPHERE) {
+ uv_str = "uv"; //sorry not supported
} else {
- uv_str=_TEXUVSTR(VS::FIXED_MATERIAL_PARAM_NORMAL);
+ uv_str = _TEXUVSTR(VS::FIXED_MATERIAL_PARAM_NORMAL);
}
if (p_key.use_xy_normalmap) {
- scode+="vec2 ywnormal=tex( fmp_normal_tex,"+uv_str+").wy * vec2(2.0,2.0) - vec2(1.0,1.0);\n";
- scode+="NORMALMAP=vec3(ywnormal,sqrt(1 - (ywnormal.x * ywnormal.x) - (ywnormal.y * ywnormal.y) ));\n";
+ scode += "vec2 ywnormal=tex( fmp_normal_tex," + uv_str + ").wy * vec2(2.0,2.0) - vec2(1.0,1.0);\n";
+ scode += "NORMALMAP=vec3(ywnormal,sqrt(1 - (ywnormal.x * ywnormal.x) - (ywnormal.y * ywnormal.y) ));\n";
} else {
- scode+="NORMALMAP=tex( fmp_normal_tex,"+uv_str+").xyz * vec3(2.0,2.0,1.0) - vec3(1.0,1.0,0.0);\n";
+ scode += "NORMALMAP=tex( fmp_normal_tex," + uv_str + ").xyz * vec3(2.0,2.0,1.0) - vec3(1.0,1.0,0.0);\n";
}
- scode+="NORMALMAP_DEPTH=fmp_normal;\n";
+ scode += "NORMALMAP_DEPTH=fmp_normal;\n";
- code+=scode;
+ code += scode;
}
//handle sphere uv if used, do it here because it needs the normal, which may be transformed by a normal map
- if (texcoords_used&(1<<VS::FIXED_MATERIAL_TEXCOORD_SPHERE)) {
+ if (texcoords_used & (1 << VS::FIXED_MATERIAL_TEXCOORD_SPHERE)) {
String tcode;
- tcode="vec3 eye_normal = normalize(VERTEX);\n";
- tcode+="vec3 ref = (eye_normal - 2.0*dot(NORMAL, eye_normal)*NORMAL);\n";
- tcode+="ref.z+=1.0;\n";
- tcode+="vec2 uv_sphere = ref.xy*vec2(0.5,0.0-0.5)+vec2(0.5,0.0-0.5);\n";
- code+=tcode;
+ tcode = "vec3 eye_normal = normalize(VERTEX);\n";
+ tcode += "vec3 ref = (eye_normal - 2.0*dot(NORMAL, eye_normal)*NORMAL);\n";
+ tcode += "ref.z+=1.0;\n";
+ tcode += "vec2 uv_sphere = ref.xy*vec2(0.5,0.0-0.5)+vec2(0.5,0.0-0.5);\n";
+ code += tcode;
}
/* HANDLE DIFFUSE LIGHTING */
- code+="uniform color fmp_diffuse;\n";
- code+="color diffuse=fmp_diffuse;\n";
+ code += "uniform color fmp_diffuse;\n";
+ code += "color diffuse=fmp_diffuse;\n";
if (p_key.use_color_array)
- code+="diffuse*=COLOR;\n";
-
- if (p_key.texture_mask&(1<<VS::FIXED_MATERIAL_PARAM_DIFFUSE)) {
+ code += "diffuse*=COLOR;\n";
+ if (p_key.texture_mask & (1 << VS::FIXED_MATERIAL_PARAM_DIFFUSE)) {
- code+="uniform texture fmp_diffuse_tex;\n";
- code+="diffuse*=tex( fmp_diffuse_tex,"+_TEXUVSTR(VS::FIXED_MATERIAL_PARAM_DIFFUSE)+");\n";
+ code += "uniform texture fmp_diffuse_tex;\n";
+ code += "diffuse*=tex( fmp_diffuse_tex," + _TEXUVSTR(VS::FIXED_MATERIAL_PARAM_DIFFUSE) + ");\n";
}
- if (p_key.texture_mask&(1<<VS::FIXED_MATERIAL_PARAM_DETAIL)) {
+ if (p_key.texture_mask & (1 << VS::FIXED_MATERIAL_PARAM_DETAIL)) {
String dcode;
- dcode+="uniform texture fmp_detail_tex;\n";
- dcode+="uniform float fmp_detail;\n";
- dcode+="color detail=tex( fmp_detail_tex,"+_TEXUVSTR(VS::FIXED_MATERIAL_PARAM_DETAIL)+");\n";
+ dcode += "uniform texture fmp_detail_tex;\n";
+ dcode += "uniform float fmp_detail;\n";
+ dcode += "color detail=tex( fmp_detail_tex," + _TEXUVSTR(VS::FIXED_MATERIAL_PARAM_DETAIL) + ");\n";
//aways mix
- dcode+="diffuse=vec4(mix(diffuse.rgb,detail.rgb,detail.a*fmp_detail),diffuse.a);\n";
+ dcode += "diffuse=vec4(mix(diffuse.rgb,detail.rgb,detail.a*fmp_detail),diffuse.a);\n";
- code+=dcode;
+ code += dcode;
}
if (p_key.use_alpha) {
- code+="DIFFUSE_ALPHA=diffuse;\n";
+ code += "DIFFUSE_ALPHA=diffuse;\n";
if (p_key.discard_alpha) {
- code+="DISCARD=diffuse.a<0.5;\n";
+ code += "DISCARD=diffuse.a<0.5;\n";
}
} else {
- code+="DIFFUSE=diffuse.rgb;\n";
+ code += "DIFFUSE=diffuse.rgb;\n";
}
/* HANDLE SPECULAR LIGHTING */
- code+="uniform color fmp_specular;\n";
- code+="color specular=fmp_specular;\n";
+ code += "uniform color fmp_specular;\n";
+ code += "color specular=fmp_specular;\n";
- if (p_key.texture_mask&(1<<VS::FIXED_MATERIAL_PARAM_SPECULAR)) {
+ if (p_key.texture_mask & (1 << VS::FIXED_MATERIAL_PARAM_SPECULAR)) {
String scode;
- scode+="uniform texture fmp_specular_tex;\n";
- scode+="specular*=tex( fmp_specular_tex,"+_TEXUVSTR(VS::FIXED_MATERIAL_PARAM_SPECULAR)+");\n";
- code+=scode;
+ scode += "uniform texture fmp_specular_tex;\n";
+ scode += "specular*=tex( fmp_specular_tex," + _TEXUVSTR(VS::FIXED_MATERIAL_PARAM_SPECULAR) + ");\n";
+ code += scode;
}
- code+="SPECULAR=specular.rgb;\n";
+ code += "SPECULAR=specular.rgb;\n";
- code+="uniform float fmp_specular_exp;\n";
- code+="float specular_exp=fmp_specular_exp;\n";
+ code += "uniform float fmp_specular_exp;\n";
+ code += "float specular_exp=fmp_specular_exp;\n";
- if (p_key.texture_mask&(1<<VS::FIXED_MATERIAL_PARAM_SPECULAR_EXP)) {
+ if (p_key.texture_mask & (1 << VS::FIXED_MATERIAL_PARAM_SPECULAR_EXP)) {
String scode;
- scode+="uniform texture fmp_specular_exp_tex;\n";
- scode+="specular_exp*=tex( fmp_specular_exp_tex,"+_TEXUVSTR(VS::FIXED_MATERIAL_PARAM_SPECULAR_EXP)+").r;\n";
- code+=scode;
+ scode += "uniform texture fmp_specular_exp_tex;\n";
+ scode += "specular_exp*=tex( fmp_specular_exp_tex," + _TEXUVSTR(VS::FIXED_MATERIAL_PARAM_SPECULAR_EXP) + ").r;\n";
+ code += scode;
}
- code+="SPEC_EXP=specular_exp;\n";
+ code += "SPEC_EXP=specular_exp;\n";
/* HANDLE EMISSION LIGHTING */
- code+="uniform color fmp_emission;\n";
- code+="color emission=fmp_emission;\n";
+ code += "uniform color fmp_emission;\n";
+ code += "color emission=fmp_emission;\n";
- if (p_key.texture_mask&(1<<VS::FIXED_MATERIAL_PARAM_EMISSION)) {
+ if (p_key.texture_mask & (1 << VS::FIXED_MATERIAL_PARAM_EMISSION)) {
String scode;
- scode+="uniform texture fmp_emission_tex;\n";
- scode+="emission*=tex( fmp_emission_tex,"+_TEXUVSTR(VS::FIXED_MATERIAL_PARAM_EMISSION)+");\n";
- code+=scode;
+ scode += "uniform texture fmp_emission_tex;\n";
+ scode += "emission*=tex( fmp_emission_tex," + _TEXUVSTR(VS::FIXED_MATERIAL_PARAM_EMISSION) + ");\n";
+ code += scode;
}
- code+="EMISSION=emission.rgb;\n";
-
+ code += "EMISSION=emission.rgb;\n";
/* HANDLE GLOW */
- code+="uniform float fmp_glow;\n";
- code+="float glow=fmp_glow;\n";
+ code += "uniform float fmp_glow;\n";
+ code += "float glow=fmp_glow;\n";
- if (p_key.texture_mask&(1<<VS::FIXED_MATERIAL_PARAM_GLOW)) {
+ if (p_key.texture_mask & (1 << VS::FIXED_MATERIAL_PARAM_GLOW)) {
String scode;
- scode+="uniform texture fmp_glow_tex;\n";
- scode+="glow*=tex( fmp_glow_tex,"+_TEXUVSTR(VS::FIXED_MATERIAL_PARAM_GLOW)+").r;\n";
- code+=scode;
+ scode += "uniform texture fmp_glow_tex;\n";
+ scode += "glow*=tex( fmp_glow_tex," + _TEXUVSTR(VS::FIXED_MATERIAL_PARAM_GLOW) + ").r;\n";
+ code += scode;
}
- code+="GLOW=glow;\n";
+ code += "GLOW=glow;\n";
- if (p_key.texture_mask&(1<<VS::FIXED_MATERIAL_PARAM_SHADE_PARAM)) {
+ if (p_key.texture_mask & (1 << VS::FIXED_MATERIAL_PARAM_SHADE_PARAM)) {
String scode;
- scode+="uniform texture fmp_shade_param_tex;\n";
- scode+="SHADE_PARAM=tex( fmp_shade_param_tex,"+_TEXUVSTR(VS::FIXED_MATERIAL_PARAM_SHADE_PARAM)+").r;\n";
- code+=scode;
+ scode += "uniform texture fmp_shade_param_tex;\n";
+ scode += "SHADE_PARAM=tex( fmp_shade_param_tex," + _TEXUVSTR(VS::FIXED_MATERIAL_PARAM_SHADE_PARAM) + ").r;\n";
+ code += scode;
} else {
String scode;
- scode+="uniform float fmp_shade_param;\n";
- scode+="SHADE_PARAM=fmp_shade_param;\n";
- code+=scode;
-
+ scode += "uniform float fmp_shade_param;\n";
+ scode += "SHADE_PARAM=fmp_shade_param;\n";
+ code += scode;
}
-
//print_line("**FRAGMENT SHADER GENERATED code: \n"+code);
String vcode;
- vcode="uniform float "+_fixed_material_param_names[VS::FIXED_MATERIAL_PARAM_SPECULAR_EXP]+";\n";
- vcode+="SPEC_EXP="+_fixed_material_param_names[VS::FIXED_MATERIAL_PARAM_SPECULAR_EXP]+";\n";
+ vcode = "uniform float " + _fixed_material_param_names[VS::FIXED_MATERIAL_PARAM_SPECULAR_EXP] + ";\n";
+ vcode += "SPEC_EXP=" + _fixed_material_param_names[VS::FIXED_MATERIAL_PARAM_SPECULAR_EXP] + ";\n";
if (p_key.use_pointsize) {
- vcode+="uniform float "+_fixed_material_point_size_name+";\n";
- vcode+="POINT_SIZE="+_fixed_material_point_size_name+";\n";
-// vcode+="POINT_SIZE=10.0;\n";
+ vcode += "uniform float " + _fixed_material_point_size_name + ";\n";
+ vcode += "POINT_SIZE=" + _fixed_material_point_size_name + ";\n";
+ // vcode+="POINT_SIZE=10.0;\n";
}
String lcode;
- switch(p_key.light_shader) {
+ switch (p_key.light_shader) {
case VS::FIXED_MATERIAL_LIGHT_SHADER_LAMBERT: {
//do nothing
@@ -252,324 +243,310 @@ RID Rasterizer::_create_shader(const FixedMaterialShaderKey& p_key) {
} break;
case VS::FIXED_MATERIAL_LIGHT_SHADER_WRAP: {
- lcode+="float NdotL = max(0.0,((dot( NORMAL, LIGHT_DIR )+SHADE_PARAM)/(1.0+SHADE_PARAM)));";
- lcode+="vec3 half_vec = normalize(LIGHT_DIR + EYE_VEC);";
- lcode+="float eye_light = max(dot(NORMAL, half_vec),0.0);";
- lcode+="LIGHT = LIGHT_DIFFUSE * DIFFUSE * NdotL;";
- lcode+="if (NdotL > 0.0) {";
- lcode+="\tLIGHT+=LIGHT_SPECULAR * SPECULAR * pow( eye_light, SPECULAR_EXP );";
- lcode+="};";
+ lcode += "float NdotL = max(0.0,((dot( NORMAL, LIGHT_DIR )+SHADE_PARAM)/(1.0+SHADE_PARAM)));";
+ lcode += "vec3 half_vec = normalize(LIGHT_DIR + EYE_VEC);";
+ lcode += "float eye_light = max(dot(NORMAL, half_vec),0.0);";
+ lcode += "LIGHT = LIGHT_DIFFUSE * DIFFUSE * NdotL;";
+ lcode += "if (NdotL > 0.0) {";
+ lcode += "\tLIGHT+=LIGHT_SPECULAR * SPECULAR * pow( eye_light, SPECULAR_EXP );";
+ lcode += "};";
} break;
case VS::FIXED_MATERIAL_LIGHT_SHADER_VELVET: {
- lcode+="float NdotL = max(0.0,dot( NORMAL, LIGHT_DIR ));";
- lcode+="vec3 half_vec = normalize(LIGHT_DIR + EYE_VEC);";
- lcode+="float eye_light = max(dot(NORMAL, half_vec),0.0);";
- lcode+="LIGHT = LIGHT_DIFFUSE * DIFFUSE * NdotL;";
- lcode+="float rim = (1.0-abs(dot(NORMAL,vec3(0,0,1))))*SHADE_PARAM;";
- lcode+="LIGHT += LIGHT_DIFFUSE * DIFFUSE * rim;";
- lcode+="if (NdotL > 0.0) {";
- lcode+="\tLIGHT+=LIGHT_SPECULAR * SPECULAR * pow( eye_light, SPECULAR_EXP );";
- lcode+="};";
-
+ lcode += "float NdotL = max(0.0,dot( NORMAL, LIGHT_DIR ));";
+ lcode += "vec3 half_vec = normalize(LIGHT_DIR + EYE_VEC);";
+ lcode += "float eye_light = max(dot(NORMAL, half_vec),0.0);";
+ lcode += "LIGHT = LIGHT_DIFFUSE * DIFFUSE * NdotL;";
+ lcode += "float rim = (1.0-abs(dot(NORMAL,vec3(0,0,1))))*SHADE_PARAM;";
+ lcode += "LIGHT += LIGHT_DIFFUSE * DIFFUSE * rim;";
+ lcode += "if (NdotL > 0.0) {";
+ lcode += "\tLIGHT+=LIGHT_SPECULAR * SPECULAR * pow( eye_light, SPECULAR_EXP );";
+ lcode += "};";
} break;
case VS::FIXED_MATERIAL_LIGHT_SHADER_TOON: {
- lcode+="float NdotL = dot( NORMAL, LIGHT_DIR );";
- lcode+="vec3 light_ref = reflect( LIGHT_DIR, NORMAL );";
- lcode+="float eye_light = clamp( dot( light_ref, vec3(0,0,0)-EYE_VEC), 0.0, 1.0 );";
- lcode+="float NdotL_diffuse = smoothstep( max( SHADE_PARAM-0.05, 0.0-1.0), min( SHADE_PARAM+0.05, 1.0), NdotL );";
- lcode+="float spec_radius=clamp((1.0-(SPECULAR_EXP/64.0)),0.0,1.0);";
- lcode+="float NdotL_specular = smoothstep( max( spec_radius-0.05, 0.0), min( spec_radius+0.05, 1.0), eye_light )*max(NdotL,0);";
- lcode+="LIGHT = NdotL_diffuse * LIGHT_DIFFUSE*DIFFUSE + NdotL_specular * LIGHT_SPECULAR*SPECULAR;";
+ lcode += "float NdotL = dot( NORMAL, LIGHT_DIR );";
+ lcode += "vec3 light_ref = reflect( LIGHT_DIR, NORMAL );";
+ lcode += "float eye_light = clamp( dot( light_ref, vec3(0,0,0)-EYE_VEC), 0.0, 1.0 );";
+ lcode += "float NdotL_diffuse = smoothstep( max( SHADE_PARAM-0.05, 0.0-1.0), min( SHADE_PARAM+0.05, 1.0), NdotL );";
+ lcode += "float spec_radius=clamp((1.0-(SPECULAR_EXP/64.0)),0.0,1.0);";
+ lcode += "float NdotL_specular = smoothstep( max( spec_radius-0.05, 0.0), min( spec_radius+0.05, 1.0), eye_light )*max(NdotL,0);";
+ lcode += "LIGHT = NdotL_diffuse * LIGHT_DIFFUSE*DIFFUSE + NdotL_specular * LIGHT_SPECULAR*SPECULAR;";
} break;
-
}
//print_line("**VERTEX SHADER GENERATED code: \n"+vcode);
- double tf = (OS::get_singleton()->get_ticks_usec()-t)/1000.0;
-// print_line("generate: "+rtos(tf));
+ double tf = (OS::get_singleton()->get_ticks_usec() - t) / 1000.0;
+ // print_line("generate: "+rtos(tf));
- shader_set_code(fms.shader,vcode,code,lcode,0,0);
+ shader_set_code(fms.shader, vcode, code, lcode, 0, 0);
- fixed_material_shaders[p_key]=fms;
+ fixed_material_shaders[p_key] = fms;
return fms.shader;
}
-void Rasterizer::_free_shader(const FixedMaterialShaderKey& p_key) {
+void Rasterizer::_free_shader(const FixedMaterialShaderKey &p_key) {
- if (p_key.valid==0)
+ if (p_key.valid == 0)
return; //not a valid key
- Map<FixedMaterialShaderKey,FixedMaterialShader>::Element *E=fixed_material_shaders.find(p_key);
+ Map<FixedMaterialShaderKey, FixedMaterialShader>::Element *E = fixed_material_shaders.find(p_key);
ERR_FAIL_COND(!E);
E->get().refcount--;
- if (E->get().refcount==0) {
+ if (E->get().refcount == 0) {
free(E->get().shader);
fixed_material_shaders.erase(E);
}
-
}
-
void Rasterizer::fixed_material_set_flag(RID p_material, VS::FixedMaterialFlags p_flag, bool p_enabled) {
-
- Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
+ Map<RID, FixedMaterial *>::Element *E = fixed_materials.find(p_material);
ERR_FAIL_COND(!E);
- FixedMaterial &fm=*E->get();
+ FixedMaterial &fm = *E->get();
- switch(p_flag) {
+ switch (p_flag) {
- case VS::FIXED_MATERIAL_FLAG_USE_ALPHA: fm.use_alpha=p_enabled; break;
- case VS::FIXED_MATERIAL_FLAG_USE_COLOR_ARRAY: fm.use_color_array=p_enabled; break;
- case VS::FIXED_MATERIAL_FLAG_USE_POINT_SIZE: fm.use_pointsize=p_enabled; break;
- case VS::FIXED_MATERIAL_FLAG_DISCARD_ALPHA: fm.discard_alpha=p_enabled; break;
- case VS::FIXED_MATERIAL_FLAG_USE_XY_NORMALMAP: fm.use_xy_normalmap=p_enabled; break;
+ case VS::FIXED_MATERIAL_FLAG_USE_ALPHA: fm.use_alpha = p_enabled; break;
+ case VS::FIXED_MATERIAL_FLAG_USE_COLOR_ARRAY: fm.use_color_array = p_enabled; break;
+ case VS::FIXED_MATERIAL_FLAG_USE_POINT_SIZE: fm.use_pointsize = p_enabled; break;
+ case VS::FIXED_MATERIAL_FLAG_DISCARD_ALPHA: fm.discard_alpha = p_enabled; break;
+ case VS::FIXED_MATERIAL_FLAG_USE_XY_NORMALMAP: fm.use_xy_normalmap = p_enabled; break;
}
if (!fm.dirty_list.in_list())
- fixed_material_dirty_list.add( &fm.dirty_list );
-
+ fixed_material_dirty_list.add(&fm.dirty_list);
}
-bool Rasterizer::fixed_material_get_flag(RID p_material, VS::FixedMaterialFlags p_flag) const{
-
- const Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
- ERR_FAIL_COND_V(!E,false);
- const FixedMaterial &fm=*E->get();
- switch(p_flag) {
+bool Rasterizer::fixed_material_get_flag(RID p_material, VS::FixedMaterialFlags p_flag) const {
- case VS::FIXED_MATERIAL_FLAG_USE_ALPHA: return fm.use_alpha;; break;
- case VS::FIXED_MATERIAL_FLAG_USE_COLOR_ARRAY: return fm.use_color_array;; break;
- case VS::FIXED_MATERIAL_FLAG_USE_POINT_SIZE: return fm.use_pointsize;; break;
- case VS::FIXED_MATERIAL_FLAG_DISCARD_ALPHA: return fm.discard_alpha;; break;
- case VS::FIXED_MATERIAL_FLAG_USE_XY_NORMALMAP: return fm.use_xy_normalmap;; break;
+ const Map<RID, FixedMaterial *>::Element *E = fixed_materials.find(p_material);
+ ERR_FAIL_COND_V(!E, false);
+ const FixedMaterial &fm = *E->get();
+ switch (p_flag) {
+ case VS::FIXED_MATERIAL_FLAG_USE_ALPHA:
+ return fm.use_alpha;
+ ;
+ break;
+ case VS::FIXED_MATERIAL_FLAG_USE_COLOR_ARRAY:
+ return fm.use_color_array;
+ ;
+ break;
+ case VS::FIXED_MATERIAL_FLAG_USE_POINT_SIZE:
+ return fm.use_pointsize;
+ ;
+ break;
+ case VS::FIXED_MATERIAL_FLAG_DISCARD_ALPHA:
+ return fm.discard_alpha;
+ ;
+ break;
+ case VS::FIXED_MATERIAL_FLAG_USE_XY_NORMALMAP:
+ return fm.use_xy_normalmap;
+ ;
+ break;
}
-
return false;
}
-
RID Rasterizer::fixed_material_create() {
RID mat = material_create();
- fixed_materials[mat]=memnew( FixedMaterial() );
- FixedMaterial &fm=*fixed_materials[mat];
- fm.self=mat;
+ fixed_materials[mat] = memnew(FixedMaterial());
+ FixedMaterial &fm = *fixed_materials[mat];
+ fm.self = mat;
fm.get_key();
- material_set_flag(mat,VS::MATERIAL_FLAG_COLOR_ARRAY_SRGB,true);
- for(int i=0;i<VS::FIXED_MATERIAL_PARAM_MAX;i++) {
+ material_set_flag(mat, VS::MATERIAL_FLAG_COLOR_ARRAY_SRGB, true);
+ for (int i = 0; i < VS::FIXED_MATERIAL_PARAM_MAX; i++) {
- material_set_param(mat,_fixed_material_param_names[i],fm.param[i]); //must be there
+ material_set_param(mat, _fixed_material_param_names[i], fm.param[i]); //must be there
}
fixed_material_dirty_list.add(&fm.dirty_list);
//print_line("FMC: "+itos(mat.get_id()));
return mat;
}
+void Rasterizer::fixed_material_set_parameter(RID p_material, VS::FixedMaterialParam p_parameter, const Variant &p_value) {
-
-
-void Rasterizer::fixed_material_set_parameter(RID p_material, VS::FixedMaterialParam p_parameter, const Variant& p_value){
-
- Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
+ Map<RID, FixedMaterial *>::Element *E = fixed_materials.find(p_material);
ERR_FAIL_COND(!E);
- FixedMaterial &fm=*E->get();
- RID material=E->key();
- ERR_FAIL_INDEX(p_parameter,VS::FIXED_MATERIAL_PARAM_MAX);
+ FixedMaterial &fm = *E->get();
+ RID material = E->key();
+ ERR_FAIL_INDEX(p_parameter, VS::FIXED_MATERIAL_PARAM_MAX);
- if ((p_parameter==VS::FIXED_MATERIAL_PARAM_DIFFUSE || p_parameter==VS::FIXED_MATERIAL_PARAM_SPECULAR || p_parameter==VS::FIXED_MATERIAL_PARAM_EMISSION)) {
+ if ((p_parameter == VS::FIXED_MATERIAL_PARAM_DIFFUSE || p_parameter == VS::FIXED_MATERIAL_PARAM_SPECULAR || p_parameter == VS::FIXED_MATERIAL_PARAM_EMISSION)) {
- if (p_value.get_type()!=Variant::COLOR) {
- ERR_EXPLAIN(String(_fixed_material_param_names[p_parameter])+" expects Color");
+ if (p_value.get_type() != Variant::COLOR) {
+ ERR_EXPLAIN(String(_fixed_material_param_names[p_parameter]) + " expects Color");
ERR_FAIL();
}
} else {
if (!p_value.is_num()) {
- ERR_EXPLAIN(String(_fixed_material_param_names[p_parameter])+" expects scalar");
+ ERR_EXPLAIN(String(_fixed_material_param_names[p_parameter]) + " expects scalar");
ERR_FAIL();
}
}
- fm.param[p_parameter]=p_value;
- VS::get_singleton()->material_set_param(material,_fixed_material_param_names[p_parameter],p_value);
-
-
+ fm.param[p_parameter] = p_value;
+ VS::get_singleton()->material_set_param(material, _fixed_material_param_names[p_parameter], p_value);
}
-Variant Rasterizer::fixed_material_get_parameter(RID p_material,VS::FixedMaterialParam p_parameter) const{
+Variant Rasterizer::fixed_material_get_parameter(RID p_material, VS::FixedMaterialParam p_parameter) const {
- const Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
- ERR_FAIL_COND_V(!E,Variant());
- const FixedMaterial &fm=*E->get();
- ERR_FAIL_INDEX_V(p_parameter,VS::FIXED_MATERIAL_PARAM_MAX,Variant());
+ const Map<RID, FixedMaterial *>::Element *E = fixed_materials.find(p_material);
+ ERR_FAIL_COND_V(!E, Variant());
+ const FixedMaterial &fm = *E->get();
+ ERR_FAIL_INDEX_V(p_parameter, VS::FIXED_MATERIAL_PARAM_MAX, Variant());
return fm.param[p_parameter];
}
-void Rasterizer::fixed_material_set_texture(RID p_material,VS::FixedMaterialParam p_parameter, RID p_texture){
+void Rasterizer::fixed_material_set_texture(RID p_material, VS::FixedMaterialParam p_parameter, RID p_texture) {
- Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
+ Map<RID, FixedMaterial *>::Element *E = fixed_materials.find(p_material);
if (!E) {
- print_line("Not found: "+itos(p_material.get_id()));
+ print_line("Not found: " + itos(p_material.get_id()));
}
ERR_FAIL_COND(!E);
- FixedMaterial &fm=*E->get();
-
+ FixedMaterial &fm = *E->get();
- ERR_FAIL_INDEX(p_parameter,VS::FIXED_MATERIAL_PARAM_MAX);
- RID material=E->key();
- fm.texture[p_parameter]=p_texture;
- VS::get_singleton()->material_set_param(material,_fixed_material_tex_names[p_parameter],p_texture);
+ ERR_FAIL_INDEX(p_parameter, VS::FIXED_MATERIAL_PARAM_MAX);
+ RID material = E->key();
+ fm.texture[p_parameter] = p_texture;
+ VS::get_singleton()->material_set_param(material, _fixed_material_tex_names[p_parameter], p_texture);
if (!fm.dirty_list.in_list())
- fixed_material_dirty_list.add( &fm.dirty_list );
-
-
-
-
+ fixed_material_dirty_list.add(&fm.dirty_list);
}
-RID Rasterizer::fixed_material_get_texture(RID p_material,VS::FixedMaterialParam p_parameter) const{
+RID Rasterizer::fixed_material_get_texture(RID p_material, VS::FixedMaterialParam p_parameter) const {
- const Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
- ERR_FAIL_COND_V(!E,RID());
- const FixedMaterial &fm=*E->get();
- ERR_FAIL_INDEX_V(p_parameter,VS::FIXED_MATERIAL_PARAM_MAX,RID());
+ const Map<RID, FixedMaterial *>::Element *E = fixed_materials.find(p_material);
+ ERR_FAIL_COND_V(!E, RID());
+ const FixedMaterial &fm = *E->get();
+ ERR_FAIL_INDEX_V(p_parameter, VS::FIXED_MATERIAL_PARAM_MAX, RID());
return fm.texture[p_parameter];
}
+void Rasterizer::fixed_material_set_texcoord_mode(RID p_material, VS::FixedMaterialParam p_parameter, VS::FixedMaterialTexCoordMode p_mode) {
-void Rasterizer::fixed_material_set_texcoord_mode(RID p_material,VS::FixedMaterialParam p_parameter, VS::FixedMaterialTexCoordMode p_mode) {
-
- Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
+ Map<RID, FixedMaterial *>::Element *E = fixed_materials.find(p_material);
ERR_FAIL_COND(!E);
- FixedMaterial &fm=*E->get();
- ERR_FAIL_INDEX(p_parameter,VS::FIXED_MATERIAL_PARAM_MAX);
+ FixedMaterial &fm = *E->get();
+ ERR_FAIL_INDEX(p_parameter, VS::FIXED_MATERIAL_PARAM_MAX);
fm.get_key();
- fm.texture_tc[p_parameter]=p_mode;
+ fm.texture_tc[p_parameter] = p_mode;
if (!fm.dirty_list.in_list())
- fixed_material_dirty_list.add( &fm.dirty_list );
-
+ fixed_material_dirty_list.add(&fm.dirty_list);
}
-VS::FixedMaterialTexCoordMode Rasterizer::fixed_material_get_texcoord_mode(RID p_material,VS::FixedMaterialParam p_parameter) const {
+VS::FixedMaterialTexCoordMode Rasterizer::fixed_material_get_texcoord_mode(RID p_material, VS::FixedMaterialParam p_parameter) const {
- const Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
- ERR_FAIL_COND_V(!E,VS::FIXED_MATERIAL_TEXCOORD_UV);
- const FixedMaterial &fm=*E->get();
- ERR_FAIL_INDEX_V(p_parameter,VS::FIXED_MATERIAL_PARAM_MAX,VS::FIXED_MATERIAL_TEXCOORD_UV);
+ const Map<RID, FixedMaterial *>::Element *E = fixed_materials.find(p_material);
+ ERR_FAIL_COND_V(!E, VS::FIXED_MATERIAL_TEXCOORD_UV);
+ const FixedMaterial &fm = *E->get();
+ ERR_FAIL_INDEX_V(p_parameter, VS::FIXED_MATERIAL_PARAM_MAX, VS::FIXED_MATERIAL_TEXCOORD_UV);
return fm.texture_tc[p_parameter];
}
-void Rasterizer::fixed_material_set_uv_transform(RID p_material,const Transform& p_transform) {
+void Rasterizer::fixed_material_set_uv_transform(RID p_material, const Transform &p_transform) {
- Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
+ Map<RID, FixedMaterial *>::Element *E = fixed_materials.find(p_material);
ERR_FAIL_COND(!E);
- FixedMaterial &fm=*E->get();
- RID material=E->key();
+ FixedMaterial &fm = *E->get();
+ RID material = E->key();
- VS::get_singleton()->material_set_param(material,_fixed_material_uv_xform_name,p_transform);
-
- fm.uv_xform=p_transform;
+ VS::get_singleton()->material_set_param(material, _fixed_material_uv_xform_name, p_transform);
+ fm.uv_xform = p_transform;
}
-
-
Transform Rasterizer::fixed_material_get_uv_transform(RID p_material) const {
- const Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
- ERR_FAIL_COND_V(!E,Transform());
- const FixedMaterial &fm=*E->get();
+ const Map<RID, FixedMaterial *>::Element *E = fixed_materials.find(p_material);
+ ERR_FAIL_COND_V(!E, Transform());
+ const FixedMaterial &fm = *E->get();
return fm.uv_xform;
}
-void Rasterizer::fixed_material_set_light_shader(RID p_material,VS::FixedMaterialLightShader p_shader) {
+void Rasterizer::fixed_material_set_light_shader(RID p_material, VS::FixedMaterialLightShader p_shader) {
- Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
+ Map<RID, FixedMaterial *>::Element *E = fixed_materials.find(p_material);
ERR_FAIL_COND(!E);
- FixedMaterial &fm=*E->get();
+ FixedMaterial &fm = *E->get();
- fm.light_shader=p_shader;
+ fm.light_shader = p_shader;
if (!fm.dirty_list.in_list())
- fixed_material_dirty_list.add( &fm.dirty_list );
-
+ fixed_material_dirty_list.add(&fm.dirty_list);
}
VS::FixedMaterialLightShader Rasterizer::fixed_material_get_light_shader(RID p_material) const {
- const Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
- ERR_FAIL_COND_V(!E,VS::FIXED_MATERIAL_LIGHT_SHADER_LAMBERT);
- const FixedMaterial &fm=*E->get();
+ const Map<RID, FixedMaterial *>::Element *E = fixed_materials.find(p_material);
+ ERR_FAIL_COND_V(!E, VS::FIXED_MATERIAL_LIGHT_SHADER_LAMBERT);
+ const FixedMaterial &fm = *E->get();
return fm.light_shader;
}
-void Rasterizer::fixed_material_set_point_size(RID p_material,float p_size) {
+void Rasterizer::fixed_material_set_point_size(RID p_material, float p_size) {
- Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
+ Map<RID, FixedMaterial *>::Element *E = fixed_materials.find(p_material);
ERR_FAIL_COND(!E);
- FixedMaterial &fm=*E->get();
- RID material=E->key();
-
- VS::get_singleton()->material_set_param(material,_fixed_material_point_size_name,p_size);
-
- fm.point_size=p_size;
+ FixedMaterial &fm = *E->get();
+ RID material = E->key();
+ VS::get_singleton()->material_set_param(material, _fixed_material_point_size_name, p_size);
+ fm.point_size = p_size;
}
-float Rasterizer::fixed_material_get_point_size(RID p_material) const{
+float Rasterizer::fixed_material_get_point_size(RID p_material) const {
- const Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
- ERR_FAIL_COND_V(!E,1.0);
- const FixedMaterial &fm=*E->get();
+ const Map<RID, FixedMaterial *>::Element *E = fixed_materials.find(p_material);
+ ERR_FAIL_COND_V(!E, 1.0);
+ const FixedMaterial &fm = *E->get();
return fm.point_size;
-
}
void Rasterizer::_update_fixed_materials() {
+ while (fixed_material_dirty_list.first()) {
- while(fixed_material_dirty_list.first()) {
-
- FixedMaterial &fm=*fixed_material_dirty_list.first()->self();
+ FixedMaterial &fm = *fixed_material_dirty_list.first()->self();
FixedMaterialShaderKey new_key = fm.get_key();
- if (new_key.key!=fm.current_key.key) {
+ if (new_key.key != fm.current_key.key) {
_free_shader(fm.current_key);
RID new_rid = _create_shader(new_key);
- fm.current_key=new_key;
- material_set_shader(fm.self,new_rid);
+ fm.current_key = new_key;
+ material_set_shader(fm.self, new_rid);
if (fm.texture[VS::FIXED_MATERIAL_PARAM_DETAIL].is_valid()) {
//send these again just in case.
- material_set_param(fm.self,_fixed_material_param_names[VS::FIXED_MATERIAL_PARAM_DETAIL],fm.param[VS::FIXED_MATERIAL_PARAM_DETAIL]);
+ material_set_param(fm.self, _fixed_material_param_names[VS::FIXED_MATERIAL_PARAM_DETAIL], fm.param[VS::FIXED_MATERIAL_PARAM_DETAIL]);
}
if (fm.texture[VS::FIXED_MATERIAL_PARAM_NORMAL].is_valid()) {
//send these again just in case.
- material_set_param(fm.self,_fixed_material_param_names[VS::FIXED_MATERIAL_PARAM_NORMAL],fm.param[VS::FIXED_MATERIAL_PARAM_NORMAL]);
+ material_set_param(fm.self, _fixed_material_param_names[VS::FIXED_MATERIAL_PARAM_NORMAL], fm.param[VS::FIXED_MATERIAL_PARAM_NORMAL]);
}
- material_set_param(fm.self,_fixed_material_uv_xform_name,fm.uv_xform);
+ material_set_param(fm.self, _fixed_material_uv_xform_name, fm.uv_xform);
if (fm.use_pointsize) {
- material_set_param(fm.self,_fixed_material_point_size_name,fm.point_size);
+ material_set_param(fm.self, _fixed_material_point_size_name, fm.point_size);
}
}
@@ -577,24 +554,20 @@ void Rasterizer::_update_fixed_materials() {
}
}
+void Rasterizer::_free_fixed_material(const RID &p_material) {
-void Rasterizer::_free_fixed_material(const RID& p_material) {
-
- Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
+ Map<RID, FixedMaterial *>::Element *E = fixed_materials.find(p_material);
if (E) {
_free_shader(E->get()->current_key); //free shader
if (E->get()->dirty_list.in_list())
- fixed_material_dirty_list.remove( &E->get()->dirty_list);
+ fixed_material_dirty_list.remove(&E->get()->dirty_list);
memdelete(E->get());
fixed_materials.erase(E); //free material
}
-
-
}
-
void Rasterizer::flush_frame() {
//not really necesary to implement
@@ -602,40 +575,39 @@ void Rasterizer::flush_frame() {
Rasterizer::Rasterizer() {
- static const char* fm_names[VS::FIXED_MATERIAL_PARAM_MAX]={
- "diffuse",
- "detail",
- "specular",
- "emission",
- "specular_exp",
- "glow",
- "normal",
- "shade_param"};
+ static const char *fm_names[VS::FIXED_MATERIAL_PARAM_MAX] = {
+ "diffuse",
+ "detail",
+ "specular",
+ "emission",
+ "specular_exp",
+ "glow",
+ "normal",
+ "shade_param"
+ };
- for(int i=0;i<VS::FIXED_MATERIAL_PARAM_MAX;i++) {
+ for (int i = 0; i < VS::FIXED_MATERIAL_PARAM_MAX; i++) {
- _fixed_material_param_names[i]=String("fmp_")+fm_names[i];
- _fixed_material_tex_names[i]=String("fmp_")+fm_names[i]+"_tex";
+ _fixed_material_param_names[i] = String("fmp_") + fm_names[i];
+ _fixed_material_tex_names[i] = String("fmp_") + fm_names[i] + "_tex";
}
- _fixed_material_uv_xform_name="fmp_uv_xform";
- _fixed_material_point_size_name="fmp_point_size";
+ _fixed_material_uv_xform_name = "fmp_uv_xform";
+ _fixed_material_point_size_name = "fmp_point_size";
- draw_viewport_func=NULL;
-
- ERR_FAIL_COND( sizeof(FixedMaterialShaderKey)!=4);
+ draw_viewport_func = NULL;
+ ERR_FAIL_COND(sizeof(FixedMaterialShaderKey) != 4);
}
RID Rasterizer::create_overdraw_debug_material() {
RID mat = fixed_material_create();
- fixed_material_set_parameter( mat,VisualServer::FIXED_MATERIAL_PARAM_SPECULAR,Color(0,0,0) );
- fixed_material_set_parameter( mat,VisualServer::FIXED_MATERIAL_PARAM_DIFFUSE,Color(0.1,0.1,0.2) );
- fixed_material_set_parameter( mat,VisualServer::FIXED_MATERIAL_PARAM_EMISSION,Color(0,0,0) );
- fixed_material_set_flag( mat, VS::FIXED_MATERIAL_FLAG_USE_ALPHA, true);
- material_set_flag( mat, VisualServer::MATERIAL_FLAG_UNSHADED, true );
- material_set_blend_mode( mat,VisualServer::MATERIAL_BLEND_MODE_ADD );
-
+ fixed_material_set_parameter(mat, VisualServer::FIXED_MATERIAL_PARAM_SPECULAR, Color(0, 0, 0));
+ fixed_material_set_parameter(mat, VisualServer::FIXED_MATERIAL_PARAM_DIFFUSE, Color(0.1, 0.1, 0.2));
+ fixed_material_set_parameter(mat, VisualServer::FIXED_MATERIAL_PARAM_EMISSION, Color(0, 0, 0));
+ fixed_material_set_flag(mat, VS::FIXED_MATERIAL_FLAG_USE_ALPHA, true);
+ material_set_flag(mat, VisualServer::MATERIAL_FLAG_UNSHADED, true);
+ material_set_blend_mode(mat, VisualServer::MATERIAL_BLEND_MODE_ADD);
return mat;
}
diff --git a/servers/visual/rasterizer.h b/servers/visual/rasterizer.h
index 0fe0bd663..51bc4d0f9 100644
--- a/servers/visual/rasterizer.h
+++ b/servers/visual/rasterizer.h
@@ -32,21 +32,18 @@
/**
@author Juan Linietsky <reduzio@gmail.com>
*/
-#include "servers/visual_server.h"
#include "camera_matrix.h"
#include "map.h"
#include "self_list.h"
+#include "servers/visual_server.h"
class Rasterizer {
protected:
-
-
- typedef void (*CanvasItemDrawViewportFunc)(VisualServer*owner,void*ud,const Rect2& p_rect);
+ typedef void (*CanvasItemDrawViewportFunc)(VisualServer *owner, void *ud, const Rect2 &p_rect);
RID create_default_material();
RID create_overdraw_debug_material();
-
/* Fixed Material Shader API */
union FixedMaterialShaderKey {
@@ -54,18 +51,18 @@ protected:
struct {
uint16_t texcoord_mask;
uint8_t texture_mask;
- uint8_t light_shader:2;
- bool use_alpha:1;
- bool use_color_array:1;
- bool use_pointsize:1;
- bool discard_alpha:1;
- bool use_xy_normalmap:1;
- bool valid:1;
+ uint8_t light_shader : 2;
+ bool use_alpha : 1;
+ bool use_color_array : 1;
+ bool use_pointsize : 1;
+ bool discard_alpha : 1;
+ bool use_xy_normalmap : 1;
+ bool valid : 1;
};
uint32_t key;
- _FORCE_INLINE_ bool operator<(const FixedMaterialShaderKey& p_key) const { return key<p_key.key; }
+ _FORCE_INLINE_ bool operator<(const FixedMaterialShaderKey &p_key) const { return key < p_key.key; }
};
struct FixedMaterialShader {
@@ -74,14 +71,13 @@ protected:
RID shader;
};
- Map<FixedMaterialShaderKey,FixedMaterialShader> fixed_material_shaders;
+ Map<FixedMaterialShaderKey, FixedMaterialShader> fixed_material_shaders;
- RID _create_shader(const FixedMaterialShaderKey& p_key);
- void _free_shader(const FixedMaterialShaderKey& p_key);
+ RID _create_shader(const FixedMaterialShaderKey &p_key);
+ void _free_shader(const FixedMaterialShaderKey &p_key);
struct FixedMaterial {
-
RID self;
bool use_alpha;
bool use_color_array;
@@ -101,52 +97,49 @@ protected:
_FORCE_INLINE_ FixedMaterialShaderKey get_key() const {
-
FixedMaterialShaderKey k;
- k.key=0;
- k.use_alpha=use_alpha;
- k.use_color_array=use_color_array;
- k.use_pointsize=use_pointsize;
- k.use_xy_normalmap=use_xy_normalmap;
- k.discard_alpha=discard_alpha;
- k.light_shader=light_shader;
- k.valid=true;
- for(int i=0;i<VS::FIXED_MATERIAL_PARAM_MAX;i++) {
+ k.key = 0;
+ k.use_alpha = use_alpha;
+ k.use_color_array = use_color_array;
+ k.use_pointsize = use_pointsize;
+ k.use_xy_normalmap = use_xy_normalmap;
+ k.discard_alpha = discard_alpha;
+ k.light_shader = light_shader;
+ k.valid = true;
+ for (int i = 0; i < VS::FIXED_MATERIAL_PARAM_MAX; i++) {
if (texture[i].is_valid()) {
//print_line("valid: "+itos(i));
- k.texture_mask|=(1<<i);
- k.texcoord_mask|=(texture_tc[i])<<(i*2);
+ k.texture_mask |= (1 << i);
+ k.texcoord_mask |= (texture_tc[i]) << (i * 2);
}
}
return k;
}
+ FixedMaterial()
+ : dirty_list(this) {
- FixedMaterial() : dirty_list(this) {
-
- use_alpha=false;
- use_color_array=false;
- use_pointsize=false;
- discard_alpha=false;
- use_xy_normalmap=false;
- point_size=1.0;
- light_shader=VS::FIXED_MATERIAL_LIGHT_SHADER_LAMBERT;
- for(int i=0;i<VS::FIXED_MATERIAL_PARAM_MAX;i++) {
- texture_tc[i]=VS::FIXED_MATERIAL_TEXCOORD_UV;
+ use_alpha = false;
+ use_color_array = false;
+ use_pointsize = false;
+ discard_alpha = false;
+ use_xy_normalmap = false;
+ point_size = 1.0;
+ light_shader = VS::FIXED_MATERIAL_LIGHT_SHADER_LAMBERT;
+ for (int i = 0; i < VS::FIXED_MATERIAL_PARAM_MAX; i++) {
+ texture_tc[i] = VS::FIXED_MATERIAL_TEXCOORD_UV;
}
- param[VS::FIXED_MATERIAL_PARAM_DIFFUSE]=Color(1,1,1);
- param[VS::FIXED_MATERIAL_PARAM_DETAIL]=1.0;
- param[VS::FIXED_MATERIAL_PARAM_EMISSION]=Color(0,0,0);
- param[VS::FIXED_MATERIAL_PARAM_GLOW]=0;
- param[VS::FIXED_MATERIAL_PARAM_SHADE_PARAM]=0;
- param[VS::FIXED_MATERIAL_PARAM_SPECULAR]=Color(0.0,0.0,0.0);
- param[VS::FIXED_MATERIAL_PARAM_SPECULAR_EXP]=40;
- param[VS::FIXED_MATERIAL_PARAM_NORMAL]=1;
-
- current_key.key=0;
-
+ param[VS::FIXED_MATERIAL_PARAM_DIFFUSE] = Color(1, 1, 1);
+ param[VS::FIXED_MATERIAL_PARAM_DETAIL] = 1.0;
+ param[VS::FIXED_MATERIAL_PARAM_EMISSION] = Color(0, 0, 0);
+ param[VS::FIXED_MATERIAL_PARAM_GLOW] = 0;
+ param[VS::FIXED_MATERIAL_PARAM_SHADE_PARAM] = 0;
+ param[VS::FIXED_MATERIAL_PARAM_SPECULAR] = Color(0.0, 0.0, 0.0);
+ param[VS::FIXED_MATERIAL_PARAM_SPECULAR_EXP] = 40;
+ param[VS::FIXED_MATERIAL_PARAM_NORMAL] = 1;
+ current_key.key = 0;
}
};
@@ -155,16 +148,15 @@ protected:
StringName _fixed_material_uv_xform_name;
StringName _fixed_material_point_size_name;
- Map<RID,FixedMaterial*> fixed_materials;
+ Map<RID, FixedMaterial *> fixed_materials;
SelfList<FixedMaterial>::List fixed_material_dirty_list;
protected:
void _update_fixed_materials();
- void _free_fixed_material(const RID& p_material);
+ void _free_fixed_material(const RID &p_material);
public:
-
enum ShadowFilterTechnique {
SHADOW_FILTER_NONE,
SHADOW_FILTER_PCF5,
@@ -173,72 +165,69 @@ public:
SHADOW_FILTER_VSM,
};
-
-
/* TEXTURE API */
- virtual RID texture_create()=0;
- RID texture_create_from_image(const Image& p_image,uint32_t p_flags=VS::TEXTURE_FLAGS_DEFAULT); // helper
- virtual void texture_allocate(RID p_texture,int p_width, int p_height,Image::Format p_format,uint32_t p_flags=VS::TEXTURE_FLAGS_DEFAULT)=0;
- virtual void texture_set_data(RID p_texture,const Image& p_image,VS::CubeMapSide p_cube_side=VS::CUBEMAP_LEFT)=0;
- virtual Image texture_get_data(RID p_texture,VS::CubeMapSide p_cube_side=VS::CUBEMAP_LEFT) const=0;
- virtual void texture_set_flags(RID p_texture,uint32_t p_flags)=0;
- virtual uint32_t texture_get_flags(RID p_texture) const=0;
- virtual Image::Format texture_get_format(RID p_texture) const=0;
- virtual uint32_t texture_get_width(RID p_texture) const=0;
- virtual uint32_t texture_get_height(RID p_texture) const=0;
- virtual bool texture_has_alpha(RID p_texture) const=0;
- virtual void texture_set_size_override(RID p_texture,int p_width, int p_height)=0;
+ virtual RID texture_create() = 0;
+ RID texture_create_from_image(const Image &p_image, uint32_t p_flags = VS::TEXTURE_FLAGS_DEFAULT); // helper
+ virtual void texture_allocate(RID p_texture, int p_width, int p_height, Image::Format p_format, uint32_t p_flags = VS::TEXTURE_FLAGS_DEFAULT) = 0;
+ virtual void texture_set_data(RID p_texture, const Image &p_image, VS::CubeMapSide p_cube_side = VS::CUBEMAP_LEFT) = 0;
+ virtual Image texture_get_data(RID p_texture, VS::CubeMapSide p_cube_side = VS::CUBEMAP_LEFT) const = 0;
+ virtual void texture_set_flags(RID p_texture, uint32_t p_flags) = 0;
+ virtual uint32_t texture_get_flags(RID p_texture) const = 0;
+ virtual Image::Format texture_get_format(RID p_texture) const = 0;
+ virtual uint32_t texture_get_width(RID p_texture) const = 0;
+ virtual uint32_t texture_get_height(RID p_texture) const = 0;
+ virtual bool texture_has_alpha(RID p_texture) const = 0;
+ virtual void texture_set_size_override(RID p_texture, int p_width, int p_height) = 0;
- virtual void texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const=0;
+ virtual void texture_set_reload_hook(RID p_texture, ObjectID p_owner, const StringName &p_function) const = 0;
- virtual void texture_set_path(RID p_texture,const String& p_path)=0;
- virtual String texture_get_path(RID p_texture) const=0;
- virtual void texture_debug_usage(List<VS::TextureInfo> *r_info)=0;
+ virtual void texture_set_path(RID p_texture, const String &p_path) = 0;
+ virtual String texture_get_path(RID p_texture) const = 0;
+ virtual void texture_debug_usage(List<VS::TextureInfo> *r_info) = 0;
- virtual void texture_set_shrink_all_x2_on_set_data(bool p_enable)=0;
+ virtual void texture_set_shrink_all_x2_on_set_data(bool p_enable) = 0;
/* SHADER API */
- virtual RID shader_create(VS::ShaderMode p_mode=VS::SHADER_MATERIAL)=0;
+ virtual RID shader_create(VS::ShaderMode p_mode = VS::SHADER_MATERIAL) = 0;
- virtual void shader_set_mode(RID p_shader,VS::ShaderMode p_mode)=0;
- virtual VS::ShaderMode shader_get_mode(RID p_shader) const=0;
+ virtual void shader_set_mode(RID p_shader, VS::ShaderMode p_mode) = 0;
+ virtual VS::ShaderMode shader_get_mode(RID p_shader) const = 0;
- virtual void shader_set_code(RID p_shader, const String& p_vertex, const String& p_fragment,const String& p_light,int p_vertex_ofs=0,int p_fragment_ofs=0,int p_light_ofs=0)=0;
- virtual String shader_get_fragment_code(RID p_shader) const=0;
- virtual String shader_get_vertex_code(RID p_shader) const=0;
- virtual String shader_get_light_code(RID p_shader) const=0;
+ virtual void shader_set_code(RID p_shader, const String &p_vertex, const String &p_fragment, const String &p_light, int p_vertex_ofs = 0, int p_fragment_ofs = 0, int p_light_ofs = 0) = 0;
+ virtual String shader_get_fragment_code(RID p_shader) const = 0;
+ virtual String shader_get_vertex_code(RID p_shader) const = 0;
+ virtual String shader_get_light_code(RID p_shader) const = 0;
- virtual void shader_get_param_list(RID p_shader, List<PropertyInfo> *p_param_list) const=0;
+ virtual void shader_get_param_list(RID p_shader, List<PropertyInfo> *p_param_list) const = 0;
- virtual void shader_set_default_texture_param(RID p_shader, const StringName& p_name, RID p_texture)=0;
- virtual RID shader_get_default_texture_param(RID p_shader, const StringName& p_name) const=0;
+ virtual void shader_set_default_texture_param(RID p_shader, const StringName &p_name, RID p_texture) = 0;
+ virtual RID shader_get_default_texture_param(RID p_shader, const StringName &p_name) const = 0;
- virtual Variant shader_get_default_param(RID p_shader, const StringName& p_name)=0;
+ virtual Variant shader_get_default_param(RID p_shader, const StringName &p_name) = 0;
/* COMMON MATERIAL API */
- virtual RID material_create()=0;
-
- virtual void material_set_shader(RID p_shader_material, RID p_shader)=0;
- virtual RID material_get_shader(RID p_shader_material) const=0;
+ virtual RID material_create() = 0;
- virtual void material_set_param(RID p_material, const StringName& p_param, const Variant& p_value)=0;
- virtual Variant material_get_param(RID p_material, const StringName& p_param) const=0;
+ virtual void material_set_shader(RID p_shader_material, RID p_shader) = 0;
+ virtual RID material_get_shader(RID p_shader_material) const = 0;
- virtual void material_set_flag(RID p_material, VS::MaterialFlag p_flag,bool p_enabled)=0;
- virtual bool material_get_flag(RID p_material,VS::MaterialFlag p_flag) const=0;
+ virtual void material_set_param(RID p_material, const StringName &p_param, const Variant &p_value) = 0;
+ virtual Variant material_get_param(RID p_material, const StringName &p_param) const = 0;
- virtual void material_set_depth_draw_mode(RID p_material, VS::MaterialDepthDrawMode p_mode)=0;
- virtual VS::MaterialDepthDrawMode material_get_depth_draw_mode(RID p_material) const=0;
+ virtual void material_set_flag(RID p_material, VS::MaterialFlag p_flag, bool p_enabled) = 0;
+ virtual bool material_get_flag(RID p_material, VS::MaterialFlag p_flag) const = 0;
- virtual void material_set_blend_mode(RID p_material,VS::MaterialBlendMode p_mode)=0;
- virtual VS::MaterialBlendMode material_get_blend_mode(RID p_material) const=0;
+ virtual void material_set_depth_draw_mode(RID p_material, VS::MaterialDepthDrawMode p_mode) = 0;
+ virtual VS::MaterialDepthDrawMode material_get_depth_draw_mode(RID p_material) const = 0;
- virtual void material_set_line_width(RID p_material,float p_line_width)=0;
- virtual float material_get_line_width(RID p_material) const=0;
+ virtual void material_set_blend_mode(RID p_material, VS::MaterialBlendMode p_mode) = 0;
+ virtual VS::MaterialBlendMode material_get_blend_mode(RID p_material) const = 0;
+ virtual void material_set_line_width(RID p_material, float p_line_width) = 0;
+ virtual float material_get_line_width(RID p_material) const = 0;
/* FIXED MATERIAL */
@@ -247,205 +236,198 @@ public:
virtual void fixed_material_set_flag(RID p_material, VS::FixedMaterialFlags p_flag, bool p_enabled);
virtual bool fixed_material_get_flag(RID p_material, VS::FixedMaterialFlags p_flag) const;
- virtual void fixed_material_set_parameter(RID p_material, VS::FixedMaterialParam p_parameter, const Variant& p_value);
- virtual Variant fixed_material_get_parameter(RID p_material,VS::FixedMaterialParam p_parameter) const;
+ virtual void fixed_material_set_parameter(RID p_material, VS::FixedMaterialParam p_parameter, const Variant &p_value);
+ virtual Variant fixed_material_get_parameter(RID p_material, VS::FixedMaterialParam p_parameter) const;
- virtual void fixed_material_set_texture(RID p_material,VS::FixedMaterialParam p_parameter, RID p_texture);
- virtual RID fixed_material_get_texture(RID p_material,VS::FixedMaterialParam p_parameter) const;
+ virtual void fixed_material_set_texture(RID p_material, VS::FixedMaterialParam p_parameter, RID p_texture);
+ virtual RID fixed_material_get_texture(RID p_material, VS::FixedMaterialParam p_parameter) const;
- virtual void fixed_material_set_texcoord_mode(RID p_material,VS::FixedMaterialParam p_parameter, VS::FixedMaterialTexCoordMode p_mode);
- virtual VS::FixedMaterialTexCoordMode fixed_material_get_texcoord_mode(RID p_material,VS::FixedMaterialParam p_parameter) const;
+ virtual void fixed_material_set_texcoord_mode(RID p_material, VS::FixedMaterialParam p_parameter, VS::FixedMaterialTexCoordMode p_mode);
+ virtual VS::FixedMaterialTexCoordMode fixed_material_get_texcoord_mode(RID p_material, VS::FixedMaterialParam p_parameter) const;
- virtual void fixed_material_set_uv_transform(RID p_material,const Transform& p_transform);
+ virtual void fixed_material_set_uv_transform(RID p_material, const Transform &p_transform);
virtual Transform fixed_material_get_uv_transform(RID p_material) const;
- virtual void fixed_material_set_light_shader(RID p_material,VS::FixedMaterialLightShader p_shader);
+ virtual void fixed_material_set_light_shader(RID p_material, VS::FixedMaterialLightShader p_shader);
virtual VS::FixedMaterialLightShader fixed_material_get_light_shader(RID p_material) const;
- virtual void fixed_material_set_point_size(RID p_material,float p_size);
+ virtual void fixed_material_set_point_size(RID p_material, float p_size);
virtual float fixed_material_get_point_size(RID p_material) const;
/* MESH API */
- virtual RID mesh_create()=0;
+ virtual RID mesh_create() = 0;
+ virtual void mesh_add_surface(RID p_mesh, VS::PrimitiveType p_primitive, const Array &p_arrays, const Array &p_blend_shapes = Array(), bool p_alpha_sort = false) = 0;
+ virtual Array mesh_get_surface_arrays(RID p_mesh, int p_surface) const = 0;
+ virtual Array mesh_get_surface_morph_arrays(RID p_mesh, int p_surface) const = 0;
- virtual void mesh_add_surface(RID p_mesh,VS::PrimitiveType p_primitive,const Array& p_arrays,const Array& p_blend_shapes=Array(),bool p_alpha_sort=false)=0;
- virtual Array mesh_get_surface_arrays(RID p_mesh,int p_surface) const=0;
- virtual Array mesh_get_surface_morph_arrays(RID p_mesh,int p_surface) const=0;
+ virtual void mesh_add_custom_surface(RID p_mesh, const Variant &p_dat) = 0;
- virtual void mesh_add_custom_surface(RID p_mesh,const Variant& p_dat)=0;
+ virtual void mesh_set_morph_target_count(RID p_mesh, int p_amount) = 0;
+ virtual int mesh_get_morph_target_count(RID p_mesh) const = 0;
- virtual void mesh_set_morph_target_count(RID p_mesh,int p_amount)=0;
- virtual int mesh_get_morph_target_count(RID p_mesh) const=0;
+ virtual void mesh_set_morph_target_mode(RID p_mesh, VS::MorphTargetMode p_mode) = 0;
+ virtual VS::MorphTargetMode mesh_get_morph_target_mode(RID p_mesh) const = 0;
- virtual void mesh_set_morph_target_mode(RID p_mesh,VS::MorphTargetMode p_mode)=0;
- virtual VS::MorphTargetMode mesh_get_morph_target_mode(RID p_mesh) const=0;
+ virtual void mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material, bool p_owned = false) = 0;
+ virtual RID mesh_surface_get_material(RID p_mesh, int p_surface) const = 0;
- virtual void mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material,bool p_owned=false)=0;
- virtual RID mesh_surface_get_material(RID p_mesh, int p_surface) const=0;
+ virtual int mesh_surface_get_array_len(RID p_mesh, int p_surface) const = 0;
+ virtual int mesh_surface_get_array_index_len(RID p_mesh, int p_surface) const = 0;
+ virtual uint32_t mesh_surface_get_format(RID p_mesh, int p_surface) const = 0;
+ virtual VS::PrimitiveType mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const = 0;
- virtual int mesh_surface_get_array_len(RID p_mesh, int p_surface) const=0;
- virtual int mesh_surface_get_array_index_len(RID p_mesh, int p_surface) const=0;
- virtual uint32_t mesh_surface_get_format(RID p_mesh, int p_surface) const=0;
- virtual VS::PrimitiveType mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const=0;
+ virtual void mesh_remove_surface(RID p_mesh, int p_index) = 0;
+ virtual int mesh_get_surface_count(RID p_mesh) const = 0;
- virtual void mesh_remove_surface(RID p_mesh,int p_index)=0;
- virtual int mesh_get_surface_count(RID p_mesh) const=0;
+ virtual AABB mesh_get_aabb(RID p_mesh, RID p_skeleton = RID()) const = 0;
- virtual AABB mesh_get_aabb(RID p_mesh,RID p_skeleton=RID()) const=0;
-
- virtual void mesh_set_custom_aabb(RID p_mesh,const AABB& p_aabb)=0;
- virtual AABB mesh_get_custom_aabb(RID p_mesh) const=0;
+ virtual void mesh_set_custom_aabb(RID p_mesh, const AABB &p_aabb) = 0;
+ virtual AABB mesh_get_custom_aabb(RID p_mesh) const = 0;
/* MULTIMESH API */
- virtual RID multimesh_create()=0;
+ virtual RID multimesh_create() = 0;
- virtual void multimesh_set_instance_count(RID p_multimesh,int p_count)=0;
- virtual int multimesh_get_instance_count(RID p_multimesh) const=0;
+ virtual void multimesh_set_instance_count(RID p_multimesh, int p_count) = 0;
+ virtual int multimesh_get_instance_count(RID p_multimesh) const = 0;
- virtual void multimesh_set_mesh(RID p_multimesh,RID p_mesh)=0;
- virtual void multimesh_set_aabb(RID p_multimesh,const AABB& p_aabb)=0;
- virtual void multimesh_instance_set_transform(RID p_multimesh,int p_index,const Transform& p_transform)=0;
- virtual void multimesh_instance_set_color(RID p_multimesh,int p_index,const Color& p_color)=0;
+ virtual void multimesh_set_mesh(RID p_multimesh, RID p_mesh) = 0;
+ virtual void multimesh_set_aabb(RID p_multimesh, const AABB &p_aabb) = 0;
+ virtual void multimesh_instance_set_transform(RID p_multimesh, int p_index, const Transform &p_transform) = 0;
+ virtual void multimesh_instance_set_color(RID p_multimesh, int p_index, const Color &p_color) = 0;
- virtual RID multimesh_get_mesh(RID p_multimesh) const=0;
- virtual AABB multimesh_get_aabb(RID p_multimesh) const=0;
+ virtual RID multimesh_get_mesh(RID p_multimesh) const = 0;
+ virtual AABB multimesh_get_aabb(RID p_multimesh) const = 0;
- virtual Transform multimesh_instance_get_transform(RID p_multimesh,int p_index) const=0;
- virtual Color multimesh_instance_get_color(RID p_multimesh,int p_index) const=0;
+ virtual Transform multimesh_instance_get_transform(RID p_multimesh, int p_index) const = 0;
+ virtual Color multimesh_instance_get_color(RID p_multimesh, int p_index) const = 0;
- virtual void multimesh_set_visible_instances(RID p_multimesh,int p_visible)=0;
- virtual int multimesh_get_visible_instances(RID p_multimesh) const=0;
+ virtual void multimesh_set_visible_instances(RID p_multimesh, int p_visible) = 0;
+ virtual int multimesh_get_visible_instances(RID p_multimesh) const = 0;
/* BAKED LIGHT */
-
-
-
/* IMMEDIATE API */
- virtual RID immediate_create()=0;
- virtual void immediate_begin(RID p_immediate,VS::PrimitiveType p_rimitive,RID p_texture=RID())=0;
- virtual void immediate_vertex(RID p_immediate,const Vector3& p_vertex)=0;
- virtual void immediate_normal(RID p_immediate,const Vector3& p_normal)=0;
- virtual void immediate_tangent(RID p_immediate,const Plane& p_tangent)=0;
- virtual void immediate_color(RID p_immediate,const Color& p_color)=0;
- virtual void immediate_uv(RID p_immediate,const Vector2& tex_uv)=0;
- virtual void immediate_uv2(RID p_immediate,const Vector2& tex_uv)=0;
- virtual void immediate_end(RID p_immediate)=0;
- virtual void immediate_clear(RID p_immediate)=0;
- virtual AABB immediate_get_aabb(RID p_immediate) const=0;
- virtual void immediate_set_material(RID p_immediate,RID p_material)=0;
- virtual RID immediate_get_material(RID p_immediate) const=0;
-
+ virtual RID immediate_create() = 0;
+ virtual void immediate_begin(RID p_immediate, VS::PrimitiveType p_rimitive, RID p_texture = RID()) = 0;
+ virtual void immediate_vertex(RID p_immediate, const Vector3 &p_vertex) = 0;
+ virtual void immediate_normal(RID p_immediate, const Vector3 &p_normal) = 0;
+ virtual void immediate_tangent(RID p_immediate, const Plane &p_tangent) = 0;
+ virtual void immediate_color(RID p_immediate, const Color &p_color) = 0;
+ virtual void immediate_uv(RID p_immediate, const Vector2 &tex_uv) = 0;
+ virtual void immediate_uv2(RID p_immediate, const Vector2 &tex_uv) = 0;
+ virtual void immediate_end(RID p_immediate) = 0;
+ virtual void immediate_clear(RID p_immediate) = 0;
+ virtual AABB immediate_get_aabb(RID p_immediate) const = 0;
+ virtual void immediate_set_material(RID p_immediate, RID p_material) = 0;
+ virtual RID immediate_get_material(RID p_immediate) const = 0;
/* PARTICLES API */
- virtual RID particles_create()=0;
+ virtual RID particles_create() = 0;
- virtual void particles_set_amount(RID p_particles, int p_amount)=0;
- virtual int particles_get_amount(RID p_particles) const=0;
+ virtual void particles_set_amount(RID p_particles, int p_amount) = 0;
+ virtual int particles_get_amount(RID p_particles) const = 0;
- virtual void particles_set_emitting(RID p_particles, bool p_emitting)=0;
- virtual bool particles_is_emitting(RID p_particles) const=0;
+ virtual void particles_set_emitting(RID p_particles, bool p_emitting) = 0;
+ virtual bool particles_is_emitting(RID p_particles) const = 0;
- virtual void particles_set_visibility_aabb(RID p_particles, const AABB& p_visibility)=0;
- virtual AABB particles_get_visibility_aabb(RID p_particles) const=0;
+ virtual void particles_set_visibility_aabb(RID p_particles, const AABB &p_visibility) = 0;
+ virtual AABB particles_get_visibility_aabb(RID p_particles) const = 0;
- virtual void particles_set_emission_half_extents(RID p_particles, const Vector3& p_half_extents)=0;
- virtual Vector3 particles_get_emission_half_extents(RID p_particles) const=0;
+ virtual void particles_set_emission_half_extents(RID p_particles, const Vector3 &p_half_extents) = 0;
+ virtual Vector3 particles_get_emission_half_extents(RID p_particles) const = 0;
- virtual void particles_set_emission_base_velocity(RID p_particles, const Vector3& p_base_velocity)=0;
- virtual Vector3 particles_get_emission_base_velocity(RID p_particles) const=0;
+ virtual void particles_set_emission_base_velocity(RID p_particles, const Vector3 &p_base_velocity) = 0;
+ virtual Vector3 particles_get_emission_base_velocity(RID p_particles) const = 0;
- virtual void particles_set_emission_points(RID p_particles, const DVector<Vector3>& p_points)=0;
- virtual DVector<Vector3> particles_get_emission_points(RID p_particles) const=0;
+ virtual void particles_set_emission_points(RID p_particles, const DVector<Vector3> &p_points) = 0;
+ virtual DVector<Vector3> particles_get_emission_points(RID p_particles) const = 0;
- virtual void particles_set_gravity_normal(RID p_particles, const Vector3& p_normal)=0;
- virtual Vector3 particles_get_gravity_normal(RID p_particles) const=0;
+ virtual void particles_set_gravity_normal(RID p_particles, const Vector3 &p_normal) = 0;
+ virtual Vector3 particles_get_gravity_normal(RID p_particles) const = 0;
- virtual void particles_set_variable(RID p_particles, VS::ParticleVariable p_variable,float p_value)=0;
- virtual float particles_get_variable(RID p_particles, VS::ParticleVariable p_variable) const=0;
+ virtual void particles_set_variable(RID p_particles, VS::ParticleVariable p_variable, float p_value) = 0;
+ virtual float particles_get_variable(RID p_particles, VS::ParticleVariable p_variable) const = 0;
- virtual void particles_set_randomness(RID p_particles, VS::ParticleVariable p_variable,float p_randomness)=0;
- virtual float particles_get_randomness(RID p_particles, VS::ParticleVariable p_variable) const=0;
+ virtual void particles_set_randomness(RID p_particles, VS::ParticleVariable p_variable, float p_randomness) = 0;
+ virtual float particles_get_randomness(RID p_particles, VS::ParticleVariable p_variable) const = 0;
- virtual void particles_set_color_phase_pos(RID p_particles, int p_phase, float p_pos)=0;
- virtual float particles_get_color_phase_pos(RID p_particles, int p_phase) const=0;
+ virtual void particles_set_color_phase_pos(RID p_particles, int p_phase, float p_pos) = 0;
+ virtual float particles_get_color_phase_pos(RID p_particles, int p_phase) const = 0;
- virtual void particles_set_color_phases(RID p_particles, int p_phases)=0;
- virtual int particles_get_color_phases(RID p_particles) const=0;
+ virtual void particles_set_color_phases(RID p_particles, int p_phases) = 0;
+ virtual int particles_get_color_phases(RID p_particles) const = 0;
- virtual void particles_set_color_phase_color(RID p_particles, int p_phase, const Color& p_color)=0;
- virtual Color particles_get_color_phase_color(RID p_particles, int p_phase) const=0;
+ virtual void particles_set_color_phase_color(RID p_particles, int p_phase, const Color &p_color) = 0;
+ virtual Color particles_get_color_phase_color(RID p_particles, int p_phase) const = 0;
- virtual void particles_set_attractors(RID p_particles, int p_attractors)=0;
- virtual int particles_get_attractors(RID p_particles) const=0;
+ virtual void particles_set_attractors(RID p_particles, int p_attractors) = 0;
+ virtual int particles_get_attractors(RID p_particles) const = 0;
- virtual void particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3& p_pos)=0;
- virtual Vector3 particles_get_attractor_pos(RID p_particles,int p_attractor) const=0;
+ virtual void particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3 &p_pos) = 0;
+ virtual Vector3 particles_get_attractor_pos(RID p_particles, int p_attractor) const = 0;
- virtual void particles_set_attractor_strength(RID p_particles, int p_attractor, float p_force)=0;
- virtual float particles_get_attractor_strength(RID p_particles,int p_attractor) const=0;
+ virtual void particles_set_attractor_strength(RID p_particles, int p_attractor, float p_force) = 0;
+ virtual float particles_get_attractor_strength(RID p_particles, int p_attractor) const = 0;
- virtual void particles_set_material(RID p_particles, RID p_material,bool p_owned=false)=0;
- virtual RID particles_get_material(RID p_particles) const=0;
+ virtual void particles_set_material(RID p_particles, RID p_material, bool p_owned = false) = 0;
+ virtual RID particles_get_material(RID p_particles) const = 0;
- virtual AABB particles_get_aabb(RID p_particles) const=0;
+ virtual AABB particles_get_aabb(RID p_particles) const = 0;
- virtual void particles_set_height_from_velocity(RID p_particles, bool p_enable)=0;
- virtual bool particles_has_height_from_velocity(RID p_particles) const=0;
+ virtual void particles_set_height_from_velocity(RID p_particles, bool p_enable) = 0;
+ virtual bool particles_has_height_from_velocity(RID p_particles) const = 0;
- virtual void particles_set_use_local_coordinates(RID p_particles, bool p_enable)=0;
- virtual bool particles_is_using_local_coordinates(RID p_particles) const=0;
+ virtual void particles_set_use_local_coordinates(RID p_particles, bool p_enable) = 0;
+ virtual bool particles_is_using_local_coordinates(RID p_particles) const = 0;
/* SKELETON API */
- virtual RID skeleton_create()=0;
- virtual void skeleton_resize(RID p_skeleton,int p_bones)=0;
- virtual int skeleton_get_bone_count(RID p_skeleton) const=0;
- virtual void skeleton_bone_set_transform(RID p_skeleton,int p_bone, const Transform& p_transform)=0;
- virtual Transform skeleton_bone_get_transform(RID p_skeleton,int p_bone)=0;
-
+ virtual RID skeleton_create() = 0;
+ virtual void skeleton_resize(RID p_skeleton, int p_bones) = 0;
+ virtual int skeleton_get_bone_count(RID p_skeleton) const = 0;
+ virtual void skeleton_bone_set_transform(RID p_skeleton, int p_bone, const Transform &p_transform) = 0;
+ virtual Transform skeleton_bone_get_transform(RID p_skeleton, int p_bone) = 0;
/* LIGHT API */
- virtual RID light_create(VS::LightType p_type)=0;
- virtual VS::LightType light_get_type(RID p_light) const=0;
-
- virtual void light_set_color(RID p_light,VS::LightColor p_type, const Color& p_color)=0;
- virtual Color light_get_color(RID p_light,VS::LightColor p_type) const=0;
+ virtual RID light_create(VS::LightType p_type) = 0;
+ virtual VS::LightType light_get_type(RID p_light) const = 0;
- virtual void light_set_shadow(RID p_light,bool p_enabled)=0;
- virtual bool light_has_shadow(RID p_light) const=0;
+ virtual void light_set_color(RID p_light, VS::LightColor p_type, const Color &p_color) = 0;
+ virtual Color light_get_color(RID p_light, VS::LightColor p_type) const = 0;
- virtual void light_set_volumetric(RID p_light,bool p_enabled)=0;
- virtual bool light_is_volumetric(RID p_light) const=0;
+ virtual void light_set_shadow(RID p_light, bool p_enabled) = 0;
+ virtual bool light_has_shadow(RID p_light) const = 0;
- virtual void light_set_projector(RID p_light,RID p_texture)=0;
- virtual RID light_get_projector(RID p_light) const=0;
+ virtual void light_set_volumetric(RID p_light, bool p_enabled) = 0;
+ virtual bool light_is_volumetric(RID p_light) const = 0;
- virtual void light_set_var(RID p_light, VS::LightParam p_var, float p_value)=0;
- virtual float light_get_var(RID p_light, VS::LightParam p_var) const=0;
+ virtual void light_set_projector(RID p_light, RID p_texture) = 0;
+ virtual RID light_get_projector(RID p_light) const = 0;
- virtual void light_set_operator(RID p_light,VS::LightOp p_op)=0;
- virtual VS::LightOp light_get_operator(RID p_light) const=0;
+ virtual void light_set_var(RID p_light, VS::LightParam p_var, float p_value) = 0;
+ virtual float light_get_var(RID p_light, VS::LightParam p_var) const = 0;
- virtual void light_omni_set_shadow_mode(RID p_light,VS::LightOmniShadowMode p_mode)=0;
- virtual VS::LightOmniShadowMode light_omni_get_shadow_mode(RID p_light) const=0;
+ virtual void light_set_operator(RID p_light, VS::LightOp p_op) = 0;
+ virtual VS::LightOp light_get_operator(RID p_light) const = 0;
- virtual void light_directional_set_shadow_mode(RID p_light,VS::LightDirectionalShadowMode p_mode)=0;
- virtual VS::LightDirectionalShadowMode light_directional_get_shadow_mode(RID p_light) const=0;
- virtual void light_directional_set_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param, float p_value)=0;
- virtual float light_directional_get_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param) const=0;
+ virtual void light_omni_set_shadow_mode(RID p_light, VS::LightOmniShadowMode p_mode) = 0;
+ virtual VS::LightOmniShadowMode light_omni_get_shadow_mode(RID p_light) const = 0;
- virtual AABB light_get_aabb(RID p_poly) const=0;
+ virtual void light_directional_set_shadow_mode(RID p_light, VS::LightDirectionalShadowMode p_mode) = 0;
+ virtual VS::LightDirectionalShadowMode light_directional_get_shadow_mode(RID p_light) const = 0;
+ virtual void light_directional_set_shadow_param(RID p_light, VS::LightDirectionalShadowParam p_param, float p_value) = 0;
+ virtual float light_directional_get_shadow_param(RID p_light, VS::LightDirectionalShadowParam p_param) const = 0;
- virtual RID light_instance_create(RID p_light)=0;
- virtual void light_instance_set_transform(RID p_light_instance,const Transform& p_transform)=0;
+ virtual AABB light_get_aabb(RID p_poly) const = 0;
+ virtual RID light_instance_create(RID p_light) = 0;
+ virtual void light_instance_set_transform(RID p_light_instance, const Transform &p_transform) = 0;
enum ShadowType {
SHADOW_NONE,
@@ -458,60 +440,60 @@ public:
};
enum ShadowPass {
- PASS_DUAL_PARABOLOID_FRONT=0,
- PASS_DUAL_PARABOLOID_BACK=1,
- PASS_CUBE_FRONT=0,
- PASS_CUBE_BACK=1,
- PASS_CUBE_TOP=2,
- PASS_CUBE_BOTTOM=3,
- PASS_CUBE_LEFT=4,
- PASS_CUBE_RIGHT=5,
+ PASS_DUAL_PARABOLOID_FRONT = 0,
+ PASS_DUAL_PARABOLOID_BACK = 1,
+ PASS_CUBE_FRONT = 0,
+ PASS_CUBE_BACK = 1,
+ PASS_CUBE_TOP = 2,
+ PASS_CUBE_BOTTOM = 3,
+ PASS_CUBE_LEFT = 4,
+ PASS_CUBE_RIGHT = 5,
};
- virtual ShadowType light_instance_get_shadow_type(RID p_light_instance,bool p_far=false) const=0;
- virtual int light_instance_get_shadow_passes(RID p_light_instance) const=0;
- virtual void light_instance_set_shadow_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near=0,float p_split_far=0)=0;
- virtual int light_instance_get_shadow_size(RID p_light_instance, int p_index=0) const=0;
- virtual bool light_instance_get_pssm_shadow_overlap(RID p_light_instance) const=0;
+ virtual ShadowType light_instance_get_shadow_type(RID p_light_instance, bool p_far = false) const = 0;
+ virtual int light_instance_get_shadow_passes(RID p_light_instance) const = 0;
+ virtual void light_instance_set_shadow_transform(RID p_light_instance, int p_index, const CameraMatrix &p_camera, const Transform &p_transform, float p_split_near = 0, float p_split_far = 0) = 0;
+ virtual int light_instance_get_shadow_size(RID p_light_instance, int p_index = 0) const = 0;
+ virtual bool light_instance_get_pssm_shadow_overlap(RID p_light_instance) const = 0;
/* SHADOWS */
- virtual void shadow_clear_near()=0;
- virtual bool shadow_allocate_near(RID p_light)=0; //true on successful alloc
- virtual bool shadow_allocate_far(RID p_light)=0; //true on successful alloc
+ virtual void shadow_clear_near() = 0;
+ virtual bool shadow_allocate_near(RID p_light) = 0; //true on successful alloc
+ virtual bool shadow_allocate_far(RID p_light) = 0; //true on successful alloc
/* PARTICLES INSTANCE */
- virtual RID particles_instance_create(RID p_particles)=0;
- virtual void particles_instance_set_transform(RID p_particles_instance,const Transform& p_transform)=0;
+ virtual RID particles_instance_create(RID p_particles) = 0;
+ virtual void particles_instance_set_transform(RID p_particles_instance, const Transform &p_transform) = 0;
/* RENDER API */
/* all calls (inside begin/end shadow) are always warranted to be in the following order: */
/* VIEWPORT API */
- virtual RID viewport_data_create()=0;
+ virtual RID viewport_data_create() = 0;
- virtual RID render_target_create()=0;
- virtual void render_target_set_size(RID p_render_target, int p_width, int p_height)=0;
- virtual RID render_target_get_texture(RID p_render_target) const=0;
- virtual bool render_target_renedered_in_frame(RID p_render_target)=0;
+ virtual RID render_target_create() = 0;
+ virtual void render_target_set_size(RID p_render_target, int p_width, int p_height) = 0;
+ virtual RID render_target_get_texture(RID p_render_target) const = 0;
+ virtual bool render_target_renedered_in_frame(RID p_render_target) = 0;
- virtual void begin_frame()=0;
+ virtual void begin_frame() = 0;
- virtual void set_viewport(const VS::ViewportRect& p_viewport)=0;
- virtual void set_render_target(RID p_render_target,bool p_transparent_bg=false,bool p_vflip=false)=0;
- virtual void clear_viewport(const Color& p_color)=0;
- virtual void capture_viewport(Image* r_capture)=0;
+ virtual void set_viewport(const VS::ViewportRect &p_viewport) = 0;
+ virtual void set_render_target(RID p_render_target, bool p_transparent_bg = false, bool p_vflip = false) = 0;
+ virtual void clear_viewport(const Color &p_color) = 0;
+ virtual void capture_viewport(Image *r_capture) = 0;
- virtual void begin_scene(RID p_viewport_data,RID p_env,VS::ScenarioDebugMode p_debug)=0;
- virtual void begin_shadow_map( RID p_light_instance, int p_shadow_pass )=0;
+ virtual void begin_scene(RID p_viewport_data, RID p_env, VS::ScenarioDebugMode p_debug) = 0;
+ virtual void begin_shadow_map(RID p_light_instance, int p_shadow_pass) = 0;
- virtual void set_camera(const Transform& p_world,const CameraMatrix& p_projection,bool p_ortho_hint)=0;
+ virtual void set_camera(const Transform &p_world, const CameraMatrix &p_projection, bool p_ortho_hint) = 0;
- virtual void add_light( RID p_light_instance )=0; ///< all "add_light" calls happen before add_geometry calls
+ virtual void add_light(RID p_light_instance) = 0; ///< all "add_light" calls happen before add_geometry calls
- typedef Map<StringName,Variant> ParamOverrideMap;
+ typedef Map<StringName, Variant> ParamOverrideMap;
struct BakedLightData {
@@ -520,7 +502,7 @@ public:
RID light_texture;
float color_multiplier; //used for both lightmaps and octree
Transform octree_transform;
- Map<int,RID> lightmaps;
+ Map<int, RID> lightmaps;
//cache
float octree_lattice_size;
@@ -549,42 +531,37 @@ public:
VS::ShadowCastingSetting cast_shadows;
Transform *baked_light_octree_xform;
int baked_lightmap_id;
- bool mirror :8;
- bool depth_scale :8;
- bool billboard :8;
- bool billboard_y :8;
+ bool mirror : 8;
+ bool depth_scale : 8;
+ bool billboard : 8;
+ bool billboard_y : 8;
bool receive_shadows : 8;
-
};
- virtual void add_mesh( const RID& p_mesh, const InstanceData *p_data)=0;
- virtual void add_multimesh( const RID& p_multimesh, const InstanceData *p_data)=0;
- virtual void add_immediate( const RID& p_immediate, const InstanceData *p_data)=0;
- virtual void add_particles( const RID& p_particle_instance, const InstanceData *p_data)=0;
-
+ virtual void add_mesh(const RID &p_mesh, const InstanceData *p_data) = 0;
+ virtual void add_multimesh(const RID &p_multimesh, const InstanceData *p_data) = 0;
+ virtual void add_immediate(const RID &p_immediate, const InstanceData *p_data) = 0;
+ virtual void add_particles(const RID &p_particle_instance, const InstanceData *p_data) = 0;
- virtual void end_scene()=0;
- virtual void end_shadow_map()=0;
+ virtual void end_scene() = 0;
+ virtual void end_shadow_map() = 0;
- virtual void end_frame()=0;
+ virtual void end_frame() = 0;
virtual void flush_frame(); //not necesary in most cases
/* CANVAS API */
enum CanvasRectFlags {
- CANVAS_RECT_REGION=1,
- CANVAS_RECT_TILE=2,
- CANVAS_RECT_FLIP_H=4,
- CANVAS_RECT_FLIP_V=8,
- CANVAS_RECT_TRANSPOSE=16
+ CANVAS_RECT_REGION = 1,
+ CANVAS_RECT_TILE = 2,
+ CANVAS_RECT_FLIP_H = 4,
+ CANVAS_RECT_FLIP_V = 8,
+ CANVAS_RECT_TRANSPOSE = 16
};
-
struct CanvasLight {
-
-
bool enabled;
Color color;
Matrix32 xform;
@@ -606,7 +583,6 @@ public:
float shadow_esm_mult;
Color shadow_color;
-
void *texture_cache; // implementation dependent
Rect2 rect_cache;
Matrix32 xform_cache;
@@ -622,40 +598,42 @@ public:
CanvasLight *mask_next_ptr;
CanvasLight() {
- enabled=true;
- color=Color(1,1,1);
- shadow_color=Color(0,0,0,0);
- height=0;
- z_min=-1024;
- z_max=1024;
- layer_min=0;
- layer_max=0;
- item_mask=1;
- scale=1.0;
- energy=1.0;
- item_shadow_mask=-1;
- mode=VS::CANVAS_LIGHT_MODE_ADD;
- texture_cache=NULL;
- next_ptr=NULL;
- mask_next_ptr=NULL;
- filter_next_ptr=NULL;
- shadow_buffer_size=2048;
- shadow_esm_mult=80;
-
+ enabled = true;
+ color = Color(1, 1, 1);
+ shadow_color = Color(0, 0, 0, 0);
+ height = 0;
+ z_min = -1024;
+ z_max = 1024;
+ layer_min = 0;
+ layer_max = 0;
+ item_mask = 1;
+ scale = 1.0;
+ energy = 1.0;
+ item_shadow_mask = -1;
+ mode = VS::CANVAS_LIGHT_MODE_ADD;
+ texture_cache = NULL;
+ next_ptr = NULL;
+ mask_next_ptr = NULL;
+ filter_next_ptr = NULL;
+ shadow_buffer_size = 2048;
+ shadow_esm_mult = 80;
}
};
struct CanvasItem;
- struct CanvasItemMaterial {
+ struct CanvasItemMaterial {
RID shader;
- Map<StringName,Variant> shader_param;
+ Map<StringName, Variant> shader_param;
uint32_t shader_version;
- Set<CanvasItem*> owners;
+ Set<CanvasItem *> owners;
VS::CanvasItemShadingMode shading_mode;
- CanvasItemMaterial() {shading_mode=VS::CANVAS_ITEM_SHADING_NORMAL; shader_version=0; }
+ CanvasItemMaterial() {
+ shading_mode = VS::CANVAS_ITEM_SHADING_NORMAL;
+ shader_version = 0;
+ }
};
struct CanvasItem {
@@ -677,12 +655,12 @@ public:
};
Type type;
- virtual ~Command(){}
+ virtual ~Command() {}
};
struct CommandLine : public Command {
- Point2 from,to;
+ Point2 from, to;
Color color;
float width;
CommandLine() { type = TYPE_LINE; }
@@ -696,7 +674,10 @@ public:
Rect2 source;
uint8_t flags;
- CommandRect() { flags=0; type = TYPE_RECT; }
+ CommandRect() {
+ flags = 0;
+ type = TYPE_RECT;
+ }
};
struct CommandStyle : public Command {
@@ -707,7 +688,10 @@ public:
float margin[4];
bool draw_center;
Color color;
- CommandStyle() { draw_center=true; type = TYPE_STYLE; }
+ CommandStyle() {
+ draw_center = true;
+ type = TYPE_STYLE;
+ }
};
struct CommandPrimitive : public Command {
@@ -718,7 +702,10 @@ public:
RID texture;
float width;
- CommandPrimitive() { type = TYPE_PRIMITIVE; width=1;}
+ CommandPrimitive() {
+ type = TYPE_PRIMITIVE;
+ width = 1;
+ }
};
struct CommandPolygon : public Command {
@@ -730,19 +717,25 @@ public:
RID texture;
int count;
- CommandPolygon() { type = TYPE_POLYGON; count = 0; }
+ CommandPolygon() {
+ type = TYPE_POLYGON;
+ count = 0;
+ }
};
struct CommandPolygonPtr : public Command {
- const int* indices;
- const Point2* points;
- const Point2* uvs;
- const Color* colors;
+ const int *indices;
+ const Point2 *points;
+ const Point2 *uvs;
+ const Color *colors;
RID texture;
int count;
- CommandPolygonPtr() { type = TYPE_POLYGON_PTR; count = 0; }
+ CommandPolygonPtr() {
+ type = TYPE_POLYGON_PTR;
+ count = 0;
+ }
};
struct CommandCircle : public Command {
@@ -762,18 +755,23 @@ public:
struct CommandBlendMode : public Command {
VS::MaterialBlendMode blend_mode;
- CommandBlendMode() { type = TYPE_BLEND_MODE; blend_mode = VS::MATERIAL_BLEND_MODE_MIX; }
+ CommandBlendMode() {
+ type = TYPE_BLEND_MODE;
+ blend_mode = VS::MATERIAL_BLEND_MODE_MIX;
+ }
};
struct CommandClipIgnore : public Command {
bool ignore;
- CommandClipIgnore() { type = TYPE_CLIP_IGNORE; ignore=false; }
+ CommandClipIgnore() {
+ type = TYPE_CLIP_IGNORE;
+ ignore = false;
+ }
};
-
struct ViewportRender {
- VisualServer*owner;
- void* udata;
+ VisualServer *owner;
+ void *udata;
Rect2 rect;
};
@@ -783,12 +781,12 @@ public:
bool ontop;
VS::MaterialBlendMode blend_mode;
int light_mask;
- Vector<Command*> commands;
+ Vector<Command *> commands;
mutable bool custom_rect;
mutable bool rect_dirty;
mutable Rect2 rect;
- CanvasItem*next;
- CanvasItemMaterial* material;
+ CanvasItem *next;
+ CanvasItemMaterial *material;
struct CopyBackBuffer {
Rect2 rect;
Rect2 screen_rect;
@@ -796,98 +794,94 @@ public:
};
CopyBackBuffer *copy_back_buffer;
-
float final_opacity;
Matrix32 final_transform;
Rect2 final_clip_rect;
- CanvasItem* final_clip_owner;
- CanvasItem* material_owner;
+ CanvasItem *final_clip_owner;
+ CanvasItem *material_owner;
ViewportRender *vp_render;
bool distance_field;
bool light_masked;
Rect2 global_rect_cache;
- const Rect2& get_rect() const {
+ const Rect2 &get_rect() const {
if (custom_rect || !rect_dirty)
return rect;
//must update rect
- int s=commands.size();
- if (s==0) {
+ int s = commands.size();
+ if (s == 0) {
- rect=Rect2();
- rect_dirty=false;
+ rect = Rect2();
+ rect_dirty = false;
return rect;
}
Matrix32 xf;
- bool found_xform=false;
- bool first=true;
-
- const CanvasItem::Command * const *cmd = &commands[0];
+ bool found_xform = false;
+ bool first = true;
+ const CanvasItem::Command *const *cmd = &commands[0];
- for (int i=0;i<s;i++) {
+ for (int i = 0; i < s; i++) {
- const CanvasItem::Command *c=cmd[i];
+ const CanvasItem::Command *c = cmd[i];
Rect2 r;
- switch(c->type) {
+ switch (c->type) {
case CanvasItem::Command::TYPE_LINE: {
- const CanvasItem::CommandLine* line = static_cast< const CanvasItem::CommandLine*>(c);
- r.pos=line->from;
+ const CanvasItem::CommandLine *line = static_cast<const CanvasItem::CommandLine *>(c);
+ r.pos = line->from;
r.expand_to(line->to);
} break;
case CanvasItem::Command::TYPE_RECT: {
- const CanvasItem::CommandRect* crect = static_cast< const CanvasItem::CommandRect*>(c);
- r=crect->rect;
+ const CanvasItem::CommandRect *crect = static_cast<const CanvasItem::CommandRect *>(c);
+ r = crect->rect;
} break;
case CanvasItem::Command::TYPE_STYLE: {
- const CanvasItem::CommandStyle* style = static_cast< const CanvasItem::CommandStyle*>(c);
- r=style->rect;
+ const CanvasItem::CommandStyle *style = static_cast<const CanvasItem::CommandStyle *>(c);
+ r = style->rect;
} break;
case CanvasItem::Command::TYPE_PRIMITIVE: {
- const CanvasItem::CommandPrimitive* primitive = static_cast< const CanvasItem::CommandPrimitive*>(c);
- r.pos=primitive->points[0];
- for(int i=1;i<primitive->points.size();i++) {
+ const CanvasItem::CommandPrimitive *primitive = static_cast<const CanvasItem::CommandPrimitive *>(c);
+ r.pos = primitive->points[0];
+ for (int i = 1; i < primitive->points.size(); i++) {
r.expand_to(primitive->points[i]);
-
}
} break;
case CanvasItem::Command::TYPE_POLYGON: {
- const CanvasItem::CommandPolygon* polygon = static_cast< const CanvasItem::CommandPolygon*>(c);
+ const CanvasItem::CommandPolygon *polygon = static_cast<const CanvasItem::CommandPolygon *>(c);
int l = polygon->points.size();
- const Point2*pp=&polygon->points[0];
- r.pos=pp[0];
- for(int i=1;i<l;i++) {
+ const Point2 *pp = &polygon->points[0];
+ r.pos = pp[0];
+ for (int i = 1; i < l; i++) {
r.expand_to(pp[i]);
-
}
} break;
case CanvasItem::Command::TYPE_POLYGON_PTR: {
- const CanvasItem::CommandPolygonPtr* polygon = static_cast< const CanvasItem::CommandPolygonPtr*>(c);
+ const CanvasItem::CommandPolygonPtr *polygon = static_cast<const CanvasItem::CommandPolygonPtr *>(c);
int l = polygon->count;
if (polygon->indices != NULL) {
- r.pos=polygon->points[polygon->indices[0]];
- for (int i=1; i<l; i++) {
+ r.pos = polygon->points[polygon->indices[0]];
+ for (int i = 1; i < l; i++) {
r.expand_to(polygon->points[polygon->indices[i]]);
}
} else {
- r.pos=polygon->points[0];
- for (int i=1; i<l; i++) {
+ r.pos = polygon->points[0];
+ for (int i = 1; i < l; i++) {
r.expand_to(polygon->points[i]);
}
@@ -895,15 +889,15 @@ public:
} break;
case CanvasItem::Command::TYPE_CIRCLE: {
- const CanvasItem::CommandCircle* circle = static_cast< const CanvasItem::CommandCircle*>(c);
- r.pos=Point2(-circle->radius,-circle->radius)+circle->pos;
- r.size=Point2(circle->radius*2.0,circle->radius*2.0);
+ const CanvasItem::CommandCircle *circle = static_cast<const CanvasItem::CommandCircle *>(c);
+ r.pos = Point2(-circle->radius, -circle->radius) + circle->pos;
+ r.size = Point2(circle->radius * 2.0, circle->radius * 2.0);
} break;
case CanvasItem::Command::TYPE_TRANSFORM: {
- const CanvasItem::CommandTransform* transform = static_cast<const CanvasItem::CommandTransform*>(c);
- xf=transform->xform;
- found_xform=true;
+ const CanvasItem::CommandTransform *transform = static_cast<const CanvasItem::CommandTransform *>(c);
+ xf = transform->xform;
+ found_xform = true;
continue;
} break;
case CanvasItem::Command::TYPE_BLEND_MODE: {
@@ -916,58 +910,82 @@ public:
if (found_xform) {
r = xf.xform(r);
- found_xform=false;
+ found_xform = false;
}
-
if (first) {
- rect=r;
- first=false;
+ rect = r;
+ first = false;
} else
- rect=rect.merge(r);
+ rect = rect.merge(r);
}
- rect_dirty=false;
+ rect_dirty = false;
return rect;
}
- void clear() { for (int i=0;i<commands.size();i++) memdelete( commands[i] ); commands.clear(); clip=false; rect_dirty=true; final_clip_owner=NULL; material_owner=NULL; light_masked=false; }
- CanvasItem() { light_mask=1; vp_render=NULL; next=NULL; final_clip_owner=NULL; clip=false; final_opacity=1; blend_mode=VS::MATERIAL_BLEND_MODE_MIX; visible=true; rect_dirty=true; custom_rect=false; ontop=true; material_owner=NULL; material=NULL; copy_back_buffer=NULL; distance_field=false; light_masked=false; }
- virtual ~CanvasItem() { clear(); if (copy_back_buffer) memdelete(copy_back_buffer); }
+ void clear() {
+ for (int i = 0; i < commands.size(); i++)
+ memdelete(commands[i]);
+ commands.clear();
+ clip = false;
+ rect_dirty = true;
+ final_clip_owner = NULL;
+ material_owner = NULL;
+ light_masked = false;
+ }
+ CanvasItem() {
+ light_mask = 1;
+ vp_render = NULL;
+ next = NULL;
+ final_clip_owner = NULL;
+ clip = false;
+ final_opacity = 1;
+ blend_mode = VS::MATERIAL_BLEND_MODE_MIX;
+ visible = true;
+ rect_dirty = true;
+ custom_rect = false;
+ ontop = true;
+ material_owner = NULL;
+ material = NULL;
+ copy_back_buffer = NULL;
+ distance_field = false;
+ light_masked = false;
+ }
+ virtual ~CanvasItem() {
+ clear();
+ if (copy_back_buffer) memdelete(copy_back_buffer);
+ }
};
-
CanvasItemDrawViewportFunc draw_viewport_func;
+ virtual void begin_canvas_bg() = 0;
+ virtual void canvas_begin() = 0;
+ virtual void canvas_disable_blending() = 0;
+ virtual void canvas_set_opacity(float p_opacity) = 0;
+ virtual void canvas_set_blend_mode(VS::MaterialBlendMode p_mode) = 0;
+ virtual void canvas_begin_rect(const Matrix32 &p_transform) = 0;
+ virtual void canvas_set_clip(bool p_clip, const Rect2 &p_rect) = 0;
+ virtual void canvas_end_rect() = 0;
+ virtual void canvas_draw_line(const Point2 &p_from, const Point2 &p_to, const Color &p_color, float p_width) = 0;
+ virtual void canvas_draw_rect(const Rect2 &p_rect, int p_flags, const Rect2 &p_source, RID p_texture, const Color &p_modulate) = 0;
+ virtual void canvas_draw_style_box(const Rect2 &p_rect, const Rect2 &p_src_region, RID p_texture, const float *p_margins, bool p_draw_center = true, const Color &p_modulate = Color(1, 1, 1)) = 0;
+ virtual void canvas_draw_primitive(const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs, RID p_texture, float p_width) = 0;
+ virtual void canvas_draw_polygon(int p_vertex_count, const int *p_indices, const Vector2 *p_vertices, const Vector2 *p_uvs, const Color *p_colors, const RID &p_texture, bool p_singlecolor) = 0;
+ virtual void canvas_set_transform(const Matrix32 &p_transform) = 0;
- virtual void begin_canvas_bg()=0;
- virtual void canvas_begin()=0;
- virtual void canvas_disable_blending()=0;
- virtual void canvas_set_opacity(float p_opacity)=0;
- virtual void canvas_set_blend_mode(VS::MaterialBlendMode p_mode)=0;
- virtual void canvas_begin_rect(const Matrix32& p_transform)=0;
- virtual void canvas_set_clip(bool p_clip, const Rect2& p_rect)=0;
- virtual void canvas_end_rect()=0;
- virtual void canvas_draw_line(const Point2& p_from, const Point2& p_to,const Color& p_color,float p_width)=0;
- virtual void canvas_draw_rect(const Rect2& p_rect, int p_flags, const Rect2& p_source,RID p_texture,const Color& p_modulate)=0;
- virtual void canvas_draw_style_box(const Rect2& p_rect, const Rect2& p_src_region, RID p_texture,const float *p_margins, bool p_draw_center=true,const Color& p_modulate=Color(1,1,1))=0;
- virtual void canvas_draw_primitive(const Vector<Point2>& p_points, const Vector<Color>& p_colors,const Vector<Point2>& p_uvs, RID p_texture,float p_width)=0;
- virtual void canvas_draw_polygon(int p_vertex_count, const int* p_indices, const Vector2* p_vertices, const Vector2* p_uvs, const Color* p_colors,const RID& p_texture,bool p_singlecolor)=0;
- virtual void canvas_set_transform(const Matrix32& p_transform)=0;
-
- virtual void canvas_render_items(CanvasItem *p_item_list,int p_z,const Color& p_modulate,CanvasLight *p_light)=0;
- virtual void canvas_debug_viewport_shadows(CanvasLight* p_lights_with_shadow)=0;
+ virtual void canvas_render_items(CanvasItem *p_item_list, int p_z, const Color &p_modulate, CanvasLight *p_light) = 0;
+ virtual void canvas_debug_viewport_shadows(CanvasLight *p_lights_with_shadow) = 0;
/* LIGHT SHADOW MAPPING */
- virtual RID canvas_light_occluder_create()=0;
- virtual void canvas_light_occluder_set_polylines(RID p_occluder, const DVector<Vector2>& p_lines)=0;
-
+ virtual RID canvas_light_occluder_create() = 0;
+ virtual void canvas_light_occluder_set_polylines(RID p_occluder, const DVector<Vector2> &p_lines) = 0;
- virtual RID canvas_light_shadow_buffer_create(int p_width)=0;
+ virtual RID canvas_light_shadow_buffer_create(int p_width) = 0;
struct CanvasLightOccluderInstance {
-
bool enabled;
RID canvas;
RID polygon;
@@ -980,67 +998,68 @@ public:
CanvasLightOccluderInstance *next;
- CanvasLightOccluderInstance() { enabled=true; next=NULL; light_mask=1; cull_cache=VS::CANVAS_OCCLUDER_POLYGON_CULL_DISABLED; }
+ CanvasLightOccluderInstance() {
+ enabled = true;
+ next = NULL;
+ light_mask = 1;
+ cull_cache = VS::CANVAS_OCCLUDER_POLYGON_CULL_DISABLED;
+ }
};
-
-
- virtual void canvas_light_shadow_buffer_update(RID p_buffer, const Matrix32& p_light_xform, int p_light_mask,float p_near, float p_far, CanvasLightOccluderInstance* p_occluders, CameraMatrix *p_xform_cache)=0;
+ virtual void canvas_light_shadow_buffer_update(RID p_buffer, const Matrix32 &p_light_xform, int p_light_mask, float p_near, float p_far, CanvasLightOccluderInstance *p_occluders, CameraMatrix *p_xform_cache) = 0;
/* ENVIRONMENT */
+ virtual RID environment_create() = 0;
- virtual RID environment_create()=0;
-
- virtual void environment_set_background(RID p_env,VS::EnvironmentBG p_bg)=0;
- virtual VS::EnvironmentBG environment_get_background(RID p_env) const=0;
+ virtual void environment_set_background(RID p_env, VS::EnvironmentBG p_bg) = 0;
+ virtual VS::EnvironmentBG environment_get_background(RID p_env) const = 0;
- virtual void environment_set_background_param(RID p_env,VS::EnvironmentBGParam p_param, const Variant& p_value)=0;
- virtual Variant environment_get_background_param(RID p_env,VS::EnvironmentBGParam p_param) const=0;
+ virtual void environment_set_background_param(RID p_env, VS::EnvironmentBGParam p_param, const Variant &p_value) = 0;
+ virtual Variant environment_get_background_param(RID p_env, VS::EnvironmentBGParam p_param) const = 0;
- virtual void environment_set_enable_fx(RID p_env,VS::EnvironmentFx p_effect,bool p_enabled)=0;
- virtual bool environment_is_fx_enabled(RID p_env,VS::EnvironmentFx p_effect) const=0;
+ virtual void environment_set_enable_fx(RID p_env, VS::EnvironmentFx p_effect, bool p_enabled) = 0;
+ virtual bool environment_is_fx_enabled(RID p_env, VS::EnvironmentFx p_effect) const = 0;
- virtual void environment_fx_set_param(RID p_env,VS::EnvironmentFxParam p_param,const Variant& p_value)=0;
- virtual Variant environment_fx_get_param(RID p_env,VS::EnvironmentFxParam p_param) const=0;
+ virtual void environment_fx_set_param(RID p_env, VS::EnvironmentFxParam p_param, const Variant &p_value) = 0;
+ virtual Variant environment_fx_get_param(RID p_env, VS::EnvironmentFxParam p_param) const = 0;
/* SAMPLED LIGHT */
- virtual RID sampled_light_dp_create(int p_width,int p_height)=0;
- virtual void sampled_light_dp_update(RID p_sampled_light,const Color *p_data,float p_multiplier)=0;
-
+ virtual RID sampled_light_dp_create(int p_width, int p_height) = 0;
+ virtual void sampled_light_dp_update(RID p_sampled_light, const Color *p_data, float p_multiplier) = 0;
/*MISC*/
- virtual bool is_texture(const RID& p_rid) const=0;
- virtual bool is_material(const RID& p_rid) const=0;
- virtual bool is_mesh(const RID& p_rid) const=0;
- virtual bool is_multimesh(const RID& p_rid) const=0;
- virtual bool is_immediate(const RID& p_rid) const=0;
- virtual bool is_particles(const RID &p_beam) const=0;
+ virtual bool is_texture(const RID &p_rid) const = 0;
+ virtual bool is_material(const RID &p_rid) const = 0;
+ virtual bool is_mesh(const RID &p_rid) const = 0;
+ virtual bool is_multimesh(const RID &p_rid) const = 0;
+ virtual bool is_immediate(const RID &p_rid) const = 0;
+ virtual bool is_particles(const RID &p_beam) const = 0;
- virtual bool is_light(const RID& p_rid) const=0;
- virtual bool is_light_instance(const RID& p_rid) const=0;
- virtual bool is_particles_instance(const RID& p_rid) const=0;
- virtual bool is_skeleton(const RID& p_rid) const=0;
- virtual bool is_environment(const RID& p_rid) const=0;
- virtual bool is_shader(const RID& p_rid) const=0;
+ virtual bool is_light(const RID &p_rid) const = 0;
+ virtual bool is_light_instance(const RID &p_rid) const = 0;
+ virtual bool is_particles_instance(const RID &p_rid) const = 0;
+ virtual bool is_skeleton(const RID &p_rid) const = 0;
+ virtual bool is_environment(const RID &p_rid) const = 0;
+ virtual bool is_shader(const RID &p_rid) const = 0;
- virtual bool is_canvas_light_occluder(const RID& p_rid) const=0;
+ virtual bool is_canvas_light_occluder(const RID &p_rid) const = 0;
- virtual void free(const RID& p_rid)=0;
+ virtual void free(const RID &p_rid) = 0;
- virtual void init()=0;
- virtual void finish()=0;
+ virtual void init() = 0;
+ virtual void finish() = 0;
- virtual bool needs_to_draw_next_frame() const=0;
+ virtual bool needs_to_draw_next_frame() const = 0;
virtual void reload_vram() {}
- virtual bool has_feature(VS::Features p_feature) const=0;
+ virtual bool has_feature(VS::Features p_feature) const = 0;
- virtual void restore_framebuffer()=0;
+ virtual void restore_framebuffer() = 0;
- virtual int get_render_info(VS::RenderInfo p_info)=0;
+ virtual int get_render_info(VS::RenderInfo p_info) = 0;
virtual void set_force_16_bits_fbo(bool p_force) {}
@@ -1048,6 +1067,4 @@ public:
virtual ~Rasterizer() {}
};
-
-
#endif
diff --git a/servers/visual/rasterizer_dummy.cpp b/servers/visual/rasterizer_dummy.cpp
index 611b4d186..be3a4e383 100644
--- a/servers/visual/rasterizer_dummy.cpp
+++ b/servers/visual/rasterizer_dummy.cpp
@@ -30,115 +30,105 @@
/* TEXTURE API */
-
RID RasterizerDummy::texture_create() {
Texture *texture = memnew(Texture);
- ERR_FAIL_COND_V(!texture,RID());
- return texture_owner.make_rid( texture );
-
+ ERR_FAIL_COND_V(!texture, RID());
+ return texture_owner.make_rid(texture);
}
-void RasterizerDummy::texture_allocate(RID p_texture,int p_width, int p_height,Image::Format p_format,uint32_t p_flags) {
-
+void RasterizerDummy::texture_allocate(RID p_texture, int p_width, int p_height, Image::Format p_format, uint32_t p_flags) {
- Texture *texture = texture_owner.get( p_texture );
+ Texture *texture = texture_owner.get(p_texture);
ERR_FAIL_COND(!texture);
- texture->width=p_width;
- texture->height=p_height;
- texture->format=p_format;
- texture->flags=p_flags;
+ texture->width = p_width;
+ texture->height = p_height;
+ texture->format = p_format;
+ texture->flags = p_flags;
}
-void RasterizerDummy::texture_set_data(RID p_texture,const Image& p_image,VS::CubeMapSide p_cube_side) {
+void RasterizerDummy::texture_set_data(RID p_texture, const Image &p_image, VS::CubeMapSide p_cube_side) {
- Texture * texture = texture_owner.get(p_texture);
+ Texture *texture = texture_owner.get(p_texture);
ERR_FAIL_COND(!texture);
- ERR_FAIL_COND(texture->format != p_image.get_format() );
-
- texture->image[p_cube_side]=p_image;
+ ERR_FAIL_COND(texture->format != p_image.get_format());
+ texture->image[p_cube_side] = p_image;
}
-Image RasterizerDummy::texture_get_data(RID p_texture,VS::CubeMapSide p_cube_side) const {
+Image RasterizerDummy::texture_get_data(RID p_texture, VS::CubeMapSide p_cube_side) const {
- Texture * texture = texture_owner.get(p_texture);
+ Texture *texture = texture_owner.get(p_texture);
- ERR_FAIL_COND_V(!texture,Image());
+ ERR_FAIL_COND_V(!texture, Image());
return texture->image[p_cube_side];
}
-void RasterizerDummy::texture_set_flags(RID p_texture,uint32_t p_flags) {
+void RasterizerDummy::texture_set_flags(RID p_texture, uint32_t p_flags) {
- Texture *texture = texture_owner.get( p_texture );
+ Texture *texture = texture_owner.get(p_texture);
ERR_FAIL_COND(!texture);
uint32_t cube = texture->flags & VS::TEXTURE_FLAG_CUBEMAP;
- texture->flags=p_flags|cube; // can't remove a cube from being a cube
-
+ texture->flags = p_flags | cube; // can't remove a cube from being a cube
}
uint32_t RasterizerDummy::texture_get_flags(RID p_texture) const {
- Texture * texture = texture_owner.get(p_texture);
+ Texture *texture = texture_owner.get(p_texture);
- ERR_FAIL_COND_V(!texture,0);
+ ERR_FAIL_COND_V(!texture, 0);
return texture->flags;
-
}
Image::Format RasterizerDummy::texture_get_format(RID p_texture) const {
- Texture * texture = texture_owner.get(p_texture);
+ Texture *texture = texture_owner.get(p_texture);
- ERR_FAIL_COND_V(!texture,Image::FORMAT_GRAYSCALE);
+ ERR_FAIL_COND_V(!texture, Image::FORMAT_GRAYSCALE);
return texture->format;
}
uint32_t RasterizerDummy::texture_get_width(RID p_texture) const {
- Texture * texture = texture_owner.get(p_texture);
+ Texture *texture = texture_owner.get(p_texture);
- ERR_FAIL_COND_V(!texture,0);
+ ERR_FAIL_COND_V(!texture, 0);
return texture->width;
}
uint32_t RasterizerDummy::texture_get_height(RID p_texture) const {
- Texture * texture = texture_owner.get(p_texture);
+ Texture *texture = texture_owner.get(p_texture);
- ERR_FAIL_COND_V(!texture,0);
+ ERR_FAIL_COND_V(!texture, 0);
return texture->height;
}
bool RasterizerDummy::texture_has_alpha(RID p_texture) const {
- Texture * texture = texture_owner.get(p_texture);
+ Texture *texture = texture_owner.get(p_texture);
- ERR_FAIL_COND_V(!texture,0);
+ ERR_FAIL_COND_V(!texture, 0);
return false;
-
}
-void RasterizerDummy::texture_set_size_override(RID p_texture,int p_width, int p_height) {
+void RasterizerDummy::texture_set_size_override(RID p_texture, int p_width, int p_height) {
- Texture * texture = texture_owner.get(p_texture);
+ Texture *texture = texture_owner.get(p_texture);
ERR_FAIL_COND(!texture);
- ERR_FAIL_COND(p_width<=0 || p_width>4096);
- ERR_FAIL_COND(p_height<=0 || p_height>4096);
+ ERR_FAIL_COND(p_width <= 0 || p_width > 4096);
+ ERR_FAIL_COND(p_height <= 0 || p_height > 4096);
//real texture size is in alloc width and height
-// texture->width=p_width;
-// texture->height=p_height;
-
+ // texture->width=p_width;
+ // texture->height=p_height;
}
-void RasterizerDummy::texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const {
-
-
+void RasterizerDummy::texture_set_reload_hook(RID p_texture, ObjectID p_owner, const StringName &p_function) const {
}
/* SHADER API */
@@ -147,132 +137,117 @@ void RasterizerDummy::texture_set_reload_hook(RID p_texture,ObjectID p_owner,con
RID RasterizerDummy::shader_create(VS::ShaderMode p_mode) {
- Shader *shader = memnew( Shader );
- shader->mode=p_mode;
- shader->fragment_line=0;
- shader->vertex_line=0;
- shader->light_line=0;
+ Shader *shader = memnew(Shader);
+ shader->mode = p_mode;
+ shader->fragment_line = 0;
+ shader->vertex_line = 0;
+ shader->light_line = 0;
RID rid = shader_owner.make_rid(shader);
return rid;
-
}
+void RasterizerDummy::shader_set_mode(RID p_shader, VS::ShaderMode p_mode) {
-
-void RasterizerDummy::shader_set_mode(RID p_shader,VS::ShaderMode p_mode) {
-
- ERR_FAIL_INDEX(p_mode,3);
- Shader *shader=shader_owner.get(p_shader);
+ ERR_FAIL_INDEX(p_mode, 3);
+ Shader *shader = shader_owner.get(p_shader);
ERR_FAIL_COND(!shader);
- shader->mode=p_mode;
-
+ shader->mode = p_mode;
}
VS::ShaderMode RasterizerDummy::shader_get_mode(RID p_shader) const {
- Shader *shader=shader_owner.get(p_shader);
- ERR_FAIL_COND_V(!shader,VS::SHADER_MATERIAL);
+ Shader *shader = shader_owner.get(p_shader);
+ ERR_FAIL_COND_V(!shader, VS::SHADER_MATERIAL);
return shader->mode;
}
-void RasterizerDummy::shader_set_code(RID p_shader, const String& p_vertex, const String& p_fragment,const String& p_light,int p_vertex_ofs,int p_fragment_ofs,int p_light_ofs) {
-
+void RasterizerDummy::shader_set_code(RID p_shader, const String &p_vertex, const String &p_fragment, const String &p_light, int p_vertex_ofs, int p_fragment_ofs, int p_light_ofs) {
- Shader *shader=shader_owner.get(p_shader);
+ Shader *shader = shader_owner.get(p_shader);
ERR_FAIL_COND(!shader);
- shader->fragment_code=p_fragment;
- shader->vertex_code=p_vertex;
- shader->light_code=p_light;
- shader->fragment_line=p_fragment_ofs;
- shader->vertex_line=p_vertex_ofs;
- shader->light_line=p_vertex_ofs;
-
+ shader->fragment_code = p_fragment;
+ shader->vertex_code = p_vertex;
+ shader->light_code = p_light;
+ shader->fragment_line = p_fragment_ofs;
+ shader->vertex_line = p_vertex_ofs;
+ shader->light_line = p_vertex_ofs;
}
-
String RasterizerDummy::shader_get_vertex_code(RID p_shader) const {
- Shader *shader=shader_owner.get(p_shader);
- ERR_FAIL_COND_V(!shader,String());
+ Shader *shader = shader_owner.get(p_shader);
+ ERR_FAIL_COND_V(!shader, String());
return shader->vertex_code;
-
}
String RasterizerDummy::shader_get_fragment_code(RID p_shader) const {
- Shader *shader=shader_owner.get(p_shader);
- ERR_FAIL_COND_V(!shader,String());
+ Shader *shader = shader_owner.get(p_shader);
+ ERR_FAIL_COND_V(!shader, String());
return shader->fragment_code;
-
}
String RasterizerDummy::shader_get_light_code(RID p_shader) const {
- Shader *shader=shader_owner.get(p_shader);
- ERR_FAIL_COND_V(!shader,String());
+ Shader *shader = shader_owner.get(p_shader);
+ ERR_FAIL_COND_V(!shader, String());
return shader->light_code;
-
}
void RasterizerDummy::shader_get_param_list(RID p_shader, List<PropertyInfo> *p_param_list) const {
- Shader *shader=shader_owner.get(p_shader);
+ Shader *shader = shader_owner.get(p_shader);
ERR_FAIL_COND(!shader);
-
}
-
-void RasterizerDummy::shader_set_default_texture_param(RID p_shader, const StringName& p_name, RID p_texture) {
-
+void RasterizerDummy::shader_set_default_texture_param(RID p_shader, const StringName &p_name, RID p_texture) {
}
-RID RasterizerDummy::shader_get_default_texture_param(RID p_shader, const StringName& p_name) const {
+RID RasterizerDummy::shader_get_default_texture_param(RID p_shader, const StringName &p_name) const {
return RID();
}
-Variant RasterizerDummy::shader_get_default_param(RID p_shader, const StringName& p_name) {
+Variant RasterizerDummy::shader_get_default_param(RID p_shader, const StringName &p_name) {
return Variant();
}
/* COMMON MATERIAL API */
-
RID RasterizerDummy::material_create() {
- return material_owner.make_rid( memnew( Material ) );
+ return material_owner.make_rid(memnew(Material));
}
void RasterizerDummy::material_set_shader(RID p_material, RID p_shader) {
Material *material = material_owner.get(p_material);
ERR_FAIL_COND(!material);
- material->shader=p_shader;
-
+ material->shader = p_shader;
}
RID RasterizerDummy::material_get_shader(RID p_material) const {
Material *material = material_owner.get(p_material);
- ERR_FAIL_COND_V(!material,RID());
+ ERR_FAIL_COND_V(!material, RID());
return material->shader;
}
-void RasterizerDummy::material_set_param(RID p_material, const StringName& p_param, const Variant& p_value) {
+void RasterizerDummy::material_set_param(RID p_material, const StringName &p_param, const Variant &p_value) {
Material *material = material_owner.get(p_material);
ERR_FAIL_COND(!material);
- if (p_value.get_type()==Variant::NIL)
+ if (p_value.get_type() == Variant::NIL)
material->shader_params.erase(p_param);
else
- material->shader_params[p_param]=p_value;
+ material->shader_params[p_param] = p_value;
}
-Variant RasterizerDummy::material_get_param(RID p_material, const StringName& p_param) const {
+Variant RasterizerDummy::material_get_param(RID p_material, const StringName &p_param) const {
Material *material = material_owner.get(p_material);
- ERR_FAIL_COND_V(!material,Variant());
+ ERR_FAIL_COND_V(!material, Variant());
if (material->shader_params.has(p_param))
return material->shader_params[p_param];
@@ -280,313 +255,281 @@ Variant RasterizerDummy::material_get_param(RID p_material, const StringName& p_
return Variant();
}
-
-void RasterizerDummy::material_set_flag(RID p_material, VS::MaterialFlag p_flag,bool p_enabled) {
+void RasterizerDummy::material_set_flag(RID p_material, VS::MaterialFlag p_flag, bool p_enabled) {
Material *material = material_owner.get(p_material);
ERR_FAIL_COND(!material);
- ERR_FAIL_INDEX(p_flag,VS::MATERIAL_FLAG_MAX);
- material->flags[p_flag]=p_enabled;
-
+ ERR_FAIL_INDEX(p_flag, VS::MATERIAL_FLAG_MAX);
+ material->flags[p_flag] = p_enabled;
}
-bool RasterizerDummy::material_get_flag(RID p_material,VS::MaterialFlag p_flag) const {
+bool RasterizerDummy::material_get_flag(RID p_material, VS::MaterialFlag p_flag) const {
Material *material = material_owner.get(p_material);
- ERR_FAIL_COND_V(!material,false);
- ERR_FAIL_INDEX_V(p_flag,VS::MATERIAL_FLAG_MAX,false);
+ ERR_FAIL_COND_V(!material, false);
+ ERR_FAIL_INDEX_V(p_flag, VS::MATERIAL_FLAG_MAX, false);
return material->flags[p_flag];
-
-
}
void RasterizerDummy::material_set_depth_draw_mode(RID p_material, VS::MaterialDepthDrawMode p_mode) {
Material *material = material_owner.get(p_material);
ERR_FAIL_COND(!material);
- material->depth_draw_mode=p_mode;
+ material->depth_draw_mode = p_mode;
}
-VS::MaterialDepthDrawMode RasterizerDummy::material_get_depth_draw_mode(RID p_material) const{
+VS::MaterialDepthDrawMode RasterizerDummy::material_get_depth_draw_mode(RID p_material) const {
Material *material = material_owner.get(p_material);
- ERR_FAIL_COND_V(!material,VS::MATERIAL_DEPTH_DRAW_ALWAYS);
+ ERR_FAIL_COND_V(!material, VS::MATERIAL_DEPTH_DRAW_ALWAYS);
return material->depth_draw_mode;
-
}
-
-void RasterizerDummy::material_set_blend_mode(RID p_material,VS::MaterialBlendMode p_mode) {
+void RasterizerDummy::material_set_blend_mode(RID p_material, VS::MaterialBlendMode p_mode) {
Material *material = material_owner.get(p_material);
ERR_FAIL_COND(!material);
- material->blend_mode=p_mode;
-
+ material->blend_mode = p_mode;
}
VS::MaterialBlendMode RasterizerDummy::material_get_blend_mode(RID p_material) const {
Material *material = material_owner.get(p_material);
- ERR_FAIL_COND_V(!material,VS::MATERIAL_BLEND_MODE_ADD);
+ ERR_FAIL_COND_V(!material, VS::MATERIAL_BLEND_MODE_ADD);
return material->blend_mode;
}
-void RasterizerDummy::material_set_line_width(RID p_material,float p_line_width) {
+void RasterizerDummy::material_set_line_width(RID p_material, float p_line_width) {
Material *material = material_owner.get(p_material);
ERR_FAIL_COND(!material);
- material->line_width=p_line_width;
-
+ material->line_width = p_line_width;
}
float RasterizerDummy::material_get_line_width(RID p_material) const {
Material *material = material_owner.get(p_material);
- ERR_FAIL_COND_V(!material,0);
+ ERR_FAIL_COND_V(!material, 0);
return material->line_width;
}
/* MESH API */
-
RID RasterizerDummy::mesh_create() {
-
- return mesh_owner.make_rid( memnew( Mesh ) );
+ return mesh_owner.make_rid(memnew(Mesh));
}
+void RasterizerDummy::mesh_add_surface(RID p_mesh, VS::PrimitiveType p_primitive, const Array &p_arrays, const Array &p_blend_shapes, bool p_alpha_sort) {
-void RasterizerDummy::mesh_add_surface(RID p_mesh,VS::PrimitiveType p_primitive,const Array& p_arrays,const Array& p_blend_shapes,bool p_alpha_sort) {
-
- Mesh *mesh = mesh_owner.get( p_mesh );
+ Mesh *mesh = mesh_owner.get(p_mesh);
ERR_FAIL_COND(!mesh);
- ERR_FAIL_INDEX( p_primitive, VS::PRIMITIVE_MAX );
- ERR_FAIL_COND(p_arrays.size()!=VS::ARRAY_MAX);
+ ERR_FAIL_INDEX(p_primitive, VS::PRIMITIVE_MAX);
+ ERR_FAIL_COND(p_arrays.size() != VS::ARRAY_MAX);
Surface s;
+ s.format = 0;
- s.format=0;
-
- for(int i=0;i<p_arrays.size();i++) {
+ for (int i = 0; i < p_arrays.size(); i++) {
- if (p_arrays[i].get_type()==Variant::NIL)
+ if (p_arrays[i].get_type() == Variant::NIL)
continue;
- s.format|=(1<<i);
+ s.format |= (1 << i);
- if (i==VS::ARRAY_VERTEX) {
+ if (i == VS::ARRAY_VERTEX) {
Vector3Array v = p_arrays[i];
int len = v.size();
- ERR_FAIL_COND(len==0);
+ ERR_FAIL_COND(len == 0);
Vector3Array::Read r = v.read();
+ for (int i = 0; i < len; i++) {
- for(int i=0;i<len;i++) {
-
- if (i==0)
- s.aabb.pos=r[0];
+ if (i == 0)
+ s.aabb.pos = r[0];
else
s.aabb.expand_to(r[i]);
}
-
}
}
- ERR_FAIL_COND((s.format&VS::ARRAY_FORMAT_VERTEX)==0); // mandatory
+ ERR_FAIL_COND((s.format & VS::ARRAY_FORMAT_VERTEX) == 0); // mandatory
- s.data=p_arrays;
- s.morph_data=p_blend_shapes;
- s.primitive=p_primitive;
- s.alpha_sort=p_alpha_sort;
- s.morph_target_count=mesh->morph_target_count;
- s.morph_format=s.format;
+ s.data = p_arrays;
+ s.morph_data = p_blend_shapes;
+ s.primitive = p_primitive;
+ s.alpha_sort = p_alpha_sort;
+ s.morph_target_count = mesh->morph_target_count;
+ s.morph_format = s.format;
-
- Surface *surface = memnew( Surface );
- *surface=s;
+ Surface *surface = memnew(Surface);
+ *surface = s;
mesh->surfaces.push_back(surface);
-
-
}
-
-
-void RasterizerDummy::mesh_add_custom_surface(RID p_mesh,const Variant& p_dat) {
+void RasterizerDummy::mesh_add_custom_surface(RID p_mesh, const Variant &p_dat) {
ERR_EXPLAIN("Dummy Rasterizer does not support custom surfaces. Running on wrong platform?");
ERR_FAIL_V();
}
-Array RasterizerDummy::mesh_get_surface_arrays(RID p_mesh,int p_surface) const {
+Array RasterizerDummy::mesh_get_surface_arrays(RID p_mesh, int p_surface) const {
- Mesh *mesh = mesh_owner.get( p_mesh );
- ERR_FAIL_COND_V(!mesh,Array());
- ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), Array() );
+ Mesh *mesh = mesh_owner.get(p_mesh);
+ ERR_FAIL_COND_V(!mesh, Array());
+ ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), Array());
Surface *surface = mesh->surfaces[p_surface];
- ERR_FAIL_COND_V( !surface, Array() );
+ ERR_FAIL_COND_V(!surface, Array());
return surface->data;
-
-
}
-Array RasterizerDummy::mesh_get_surface_morph_arrays(RID p_mesh,int p_surface) const{
+Array RasterizerDummy::mesh_get_surface_morph_arrays(RID p_mesh, int p_surface) const {
- Mesh *mesh = mesh_owner.get( p_mesh );
- ERR_FAIL_COND_V(!mesh,Array());
- ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), Array() );
+ Mesh *mesh = mesh_owner.get(p_mesh);
+ ERR_FAIL_COND_V(!mesh, Array());
+ ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), Array());
Surface *surface = mesh->surfaces[p_surface];
- ERR_FAIL_COND_V( !surface, Array() );
+ ERR_FAIL_COND_V(!surface, Array());
return surface->morph_data;
-
}
+void RasterizerDummy::mesh_set_morph_target_count(RID p_mesh, int p_amount) {
-void RasterizerDummy::mesh_set_morph_target_count(RID p_mesh,int p_amount) {
-
- Mesh *mesh = mesh_owner.get( p_mesh );
+ Mesh *mesh = mesh_owner.get(p_mesh);
ERR_FAIL_COND(!mesh);
- ERR_FAIL_COND( mesh->surfaces.size()!=0 );
-
- mesh->morph_target_count=p_amount;
+ ERR_FAIL_COND(mesh->surfaces.size() != 0);
+ mesh->morph_target_count = p_amount;
}
-int RasterizerDummy::mesh_get_morph_target_count(RID p_mesh) const{
+int RasterizerDummy::mesh_get_morph_target_count(RID p_mesh) const {
- Mesh *mesh = mesh_owner.get( p_mesh );
- ERR_FAIL_COND_V(!mesh,-1);
+ Mesh *mesh = mesh_owner.get(p_mesh);
+ ERR_FAIL_COND_V(!mesh, -1);
return mesh->morph_target_count;
-
}
-void RasterizerDummy::mesh_set_morph_target_mode(RID p_mesh,VS::MorphTargetMode p_mode) {
+void RasterizerDummy::mesh_set_morph_target_mode(RID p_mesh, VS::MorphTargetMode p_mode) {
- ERR_FAIL_INDEX(p_mode,2);
- Mesh *mesh = mesh_owner.get( p_mesh );
+ ERR_FAIL_INDEX(p_mode, 2);
+ Mesh *mesh = mesh_owner.get(p_mesh);
ERR_FAIL_COND(!mesh);
- mesh->morph_target_mode=p_mode;
-
+ mesh->morph_target_mode = p_mode;
}
VS::MorphTargetMode RasterizerDummy::mesh_get_morph_target_mode(RID p_mesh) const {
- Mesh *mesh = mesh_owner.get( p_mesh );
- ERR_FAIL_COND_V(!mesh,VS::MORPH_MODE_NORMALIZED);
+ Mesh *mesh = mesh_owner.get(p_mesh);
+ ERR_FAIL_COND_V(!mesh, VS::MORPH_MODE_NORMALIZED);
return mesh->morph_target_mode;
-
}
+void RasterizerDummy::mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material, bool p_owned) {
-
-void RasterizerDummy::mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material,bool p_owned) {
-
- Mesh *mesh = mesh_owner.get( p_mesh );
+ Mesh *mesh = mesh_owner.get(p_mesh);
ERR_FAIL_COND(!mesh);
- ERR_FAIL_INDEX(p_surface, mesh->surfaces.size() );
+ ERR_FAIL_INDEX(p_surface, mesh->surfaces.size());
Surface *surface = mesh->surfaces[p_surface];
- ERR_FAIL_COND( !surface);
+ ERR_FAIL_COND(!surface);
if (surface->material_owned && surface->material.is_valid())
free(surface->material);
- surface->material_owned=p_owned;
- surface->material=p_material;
+ surface->material_owned = p_owned;
+ surface->material = p_material;
}
RID RasterizerDummy::mesh_surface_get_material(RID p_mesh, int p_surface) const {
- Mesh *mesh = mesh_owner.get( p_mesh );
- ERR_FAIL_COND_V(!mesh,RID());
- ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), RID() );
+ Mesh *mesh = mesh_owner.get(p_mesh);
+ ERR_FAIL_COND_V(!mesh, RID());
+ ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), RID());
Surface *surface = mesh->surfaces[p_surface];
- ERR_FAIL_COND_V( !surface, RID() );
+ ERR_FAIL_COND_V(!surface, RID());
return surface->material;
}
int RasterizerDummy::mesh_surface_get_array_len(RID p_mesh, int p_surface) const {
- Mesh *mesh = mesh_owner.get( p_mesh );
- ERR_FAIL_COND_V(!mesh,-1);
- ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), -1 );
+ Mesh *mesh = mesh_owner.get(p_mesh);
+ ERR_FAIL_COND_V(!mesh, -1);
+ ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), -1);
Surface *surface = mesh->surfaces[p_surface];
- ERR_FAIL_COND_V( !surface, -1 );
+ ERR_FAIL_COND_V(!surface, -1);
Vector3Array arr = surface->data[VS::ARRAY_VERTEX];
return arr.size();
-
}
int RasterizerDummy::mesh_surface_get_array_index_len(RID p_mesh, int p_surface) const {
- Mesh *mesh = mesh_owner.get( p_mesh );
- ERR_FAIL_COND_V(!mesh,-1);
- ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), -1 );
+ Mesh *mesh = mesh_owner.get(p_mesh);
+ ERR_FAIL_COND_V(!mesh, -1);
+ ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), -1);
Surface *surface = mesh->surfaces[p_surface];
- ERR_FAIL_COND_V( !surface, -1 );
+ ERR_FAIL_COND_V(!surface, -1);
IntArray arr = surface->data[VS::ARRAY_INDEX];
return arr.size();
-
}
uint32_t RasterizerDummy::mesh_surface_get_format(RID p_mesh, int p_surface) const {
- Mesh *mesh = mesh_owner.get( p_mesh );
- ERR_FAIL_COND_V(!mesh,0);
- ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), 0 );
+ Mesh *mesh = mesh_owner.get(p_mesh);
+ ERR_FAIL_COND_V(!mesh, 0);
+ ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), 0);
Surface *surface = mesh->surfaces[p_surface];
- ERR_FAIL_COND_V( !surface, 0 );
+ ERR_FAIL_COND_V(!surface, 0);
return surface->format;
}
VS::PrimitiveType RasterizerDummy::mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const {
- Mesh *mesh = mesh_owner.get( p_mesh );
- ERR_FAIL_COND_V(!mesh,VS::PRIMITIVE_POINTS);
- ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), VS::PRIMITIVE_POINTS );
+ Mesh *mesh = mesh_owner.get(p_mesh);
+ ERR_FAIL_COND_V(!mesh, VS::PRIMITIVE_POINTS);
+ ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), VS::PRIMITIVE_POINTS);
Surface *surface = mesh->surfaces[p_surface];
- ERR_FAIL_COND_V( !surface, VS::PRIMITIVE_POINTS );
+ ERR_FAIL_COND_V(!surface, VS::PRIMITIVE_POINTS);
return surface->primitive;
}
-void RasterizerDummy::mesh_remove_surface(RID p_mesh,int p_index) {
+void RasterizerDummy::mesh_remove_surface(RID p_mesh, int p_index) {
- Mesh *mesh = mesh_owner.get( p_mesh );
+ Mesh *mesh = mesh_owner.get(p_mesh);
ERR_FAIL_COND(!mesh);
- ERR_FAIL_INDEX(p_index, mesh->surfaces.size() );
+ ERR_FAIL_INDEX(p_index, mesh->surfaces.size());
Surface *surface = mesh->surfaces[p_index];
- ERR_FAIL_COND( !surface);
+ ERR_FAIL_COND(!surface);
- memdelete( mesh->surfaces[p_index] );
+ memdelete(mesh->surfaces[p_index]);
mesh->surfaces.remove(p_index);
-
}
int RasterizerDummy::mesh_get_surface_count(RID p_mesh) const {
- Mesh *mesh = mesh_owner.get( p_mesh );
- ERR_FAIL_COND_V(!mesh,-1);
+ Mesh *mesh = mesh_owner.get(p_mesh);
+ ERR_FAIL_COND_V(!mesh, -1);
return mesh->surfaces.size();
}
-AABB RasterizerDummy::mesh_get_aabb(RID p_mesh,RID p_skeleton) const {
+AABB RasterizerDummy::mesh_get_aabb(RID p_mesh, RID p_skeleton) const {
- Mesh *mesh = mesh_owner.get( p_mesh );
- ERR_FAIL_COND_V(!mesh,AABB());
+ Mesh *mesh = mesh_owner.get(p_mesh);
+ ERR_FAIL_COND_V(!mesh, AABB());
AABB aabb;
- for (int i=0;i<mesh->surfaces.size();i++) {
+ for (int i = 0; i < mesh->surfaces.size(); i++) {
- if (i==0)
- aabb=mesh->surfaces[i]->aabb;
+ if (i == 0)
+ aabb = mesh->surfaces[i]->aabb;
else
aabb.merge_with(mesh->surfaces[i]->aabb);
}
@@ -594,515 +537,463 @@ AABB RasterizerDummy::mesh_get_aabb(RID p_mesh,RID p_skeleton) const {
return aabb;
}
-void RasterizerDummy::mesh_set_custom_aabb(RID p_mesh,const AABB& p_aabb) {
+void RasterizerDummy::mesh_set_custom_aabb(RID p_mesh, const AABB &p_aabb) {
- Mesh *mesh = mesh_owner.get( p_mesh );
+ Mesh *mesh = mesh_owner.get(p_mesh);
ERR_FAIL_COND(!mesh);
- mesh->custom_aabb=p_aabb;
+ mesh->custom_aabb = p_aabb;
}
AABB RasterizerDummy::mesh_get_custom_aabb(RID p_mesh) const {
- const Mesh *mesh = mesh_owner.get( p_mesh );
- ERR_FAIL_COND_V(!mesh,AABB());
+ const Mesh *mesh = mesh_owner.get(p_mesh);
+ ERR_FAIL_COND_V(!mesh, AABB());
return mesh->custom_aabb;
-
}
/* MULTIMESH API */
RID RasterizerDummy::multimesh_create() {
- return multimesh_owner.make_rid( memnew( MultiMesh ));
+ return multimesh_owner.make_rid(memnew(MultiMesh));
}
-void RasterizerDummy::multimesh_set_instance_count(RID p_multimesh,int p_count) {
+void RasterizerDummy::multimesh_set_instance_count(RID p_multimesh, int p_count) {
MultiMesh *multimesh = multimesh_owner.get(p_multimesh);
ERR_FAIL_COND(!multimesh);
multimesh->elements.clear(); // make sure to delete everything, so it "fails" in all implementations
multimesh->elements.resize(p_count);
-
}
int RasterizerDummy::multimesh_get_instance_count(RID p_multimesh) const {
MultiMesh *multimesh = multimesh_owner.get(p_multimesh);
- ERR_FAIL_COND_V(!multimesh,-1);
+ ERR_FAIL_COND_V(!multimesh, -1);
return multimesh->elements.size();
}
-void RasterizerDummy::multimesh_set_mesh(RID p_multimesh,RID p_mesh) {
+void RasterizerDummy::multimesh_set_mesh(RID p_multimesh, RID p_mesh) {
MultiMesh *multimesh = multimesh_owner.get(p_multimesh);
ERR_FAIL_COND(!multimesh);
- multimesh->mesh=p_mesh;
-
+ multimesh->mesh = p_mesh;
}
-void RasterizerDummy::multimesh_set_aabb(RID p_multimesh,const AABB& p_aabb) {
+void RasterizerDummy::multimesh_set_aabb(RID p_multimesh, const AABB &p_aabb) {
MultiMesh *multimesh = multimesh_owner.get(p_multimesh);
ERR_FAIL_COND(!multimesh);
- multimesh->aabb=p_aabb;
+ multimesh->aabb = p_aabb;
}
-void RasterizerDummy::multimesh_instance_set_transform(RID p_multimesh,int p_index,const Transform& p_transform) {
+void RasterizerDummy::multimesh_instance_set_transform(RID p_multimesh, int p_index, const Transform &p_transform) {
MultiMesh *multimesh = multimesh_owner.get(p_multimesh);
ERR_FAIL_COND(!multimesh);
- ERR_FAIL_INDEX(p_index,multimesh->elements.size());
- multimesh->elements[p_index].xform=p_transform;
-
+ ERR_FAIL_INDEX(p_index, multimesh->elements.size());
+ multimesh->elements[p_index].xform = p_transform;
}
-void RasterizerDummy::multimesh_instance_set_color(RID p_multimesh,int p_index,const Color& p_color) {
+void RasterizerDummy::multimesh_instance_set_color(RID p_multimesh, int p_index, const Color &p_color) {
MultiMesh *multimesh = multimesh_owner.get(p_multimesh);
ERR_FAIL_COND(!multimesh)
- ERR_FAIL_INDEX(p_index,multimesh->elements.size());
- multimesh->elements[p_index].color=p_color;
-
+ ERR_FAIL_INDEX(p_index, multimesh->elements.size());
+ multimesh->elements[p_index].color = p_color;
}
RID RasterizerDummy::multimesh_get_mesh(RID p_multimesh) const {
MultiMesh *multimesh = multimesh_owner.get(p_multimesh);
- ERR_FAIL_COND_V(!multimesh,RID());
+ ERR_FAIL_COND_V(!multimesh, RID());
return multimesh->mesh;
}
AABB RasterizerDummy::multimesh_get_aabb(RID p_multimesh) const {
MultiMesh *multimesh = multimesh_owner.get(p_multimesh);
- ERR_FAIL_COND_V(!multimesh,AABB());
+ ERR_FAIL_COND_V(!multimesh, AABB());
return multimesh->aabb;
}
-Transform RasterizerDummy::multimesh_instance_get_transform(RID p_multimesh,int p_index) const {
+Transform RasterizerDummy::multimesh_instance_get_transform(RID p_multimesh, int p_index) const {
MultiMesh *multimesh = multimesh_owner.get(p_multimesh);
- ERR_FAIL_COND_V(!multimesh,Transform());
+ ERR_FAIL_COND_V(!multimesh, Transform());
- ERR_FAIL_INDEX_V(p_index,multimesh->elements.size(),Transform());
+ ERR_FAIL_INDEX_V(p_index, multimesh->elements.size(), Transform());
return multimesh->elements[p_index].xform;
-
}
-Color RasterizerDummy::multimesh_instance_get_color(RID p_multimesh,int p_index) const {
+Color RasterizerDummy::multimesh_instance_get_color(RID p_multimesh, int p_index) const {
MultiMesh *multimesh = multimesh_owner.get(p_multimesh);
- ERR_FAIL_COND_V(!multimesh,Color());
- ERR_FAIL_INDEX_V(p_index,multimesh->elements.size(),Color());
+ ERR_FAIL_COND_V(!multimesh, Color());
+ ERR_FAIL_INDEX_V(p_index, multimesh->elements.size(), Color());
return multimesh->elements[p_index].color;
}
-void RasterizerDummy::multimesh_set_visible_instances(RID p_multimesh,int p_visible) {
+void RasterizerDummy::multimesh_set_visible_instances(RID p_multimesh, int p_visible) {
MultiMesh *multimesh = multimesh_owner.get(p_multimesh);
ERR_FAIL_COND(!multimesh);
- multimesh->visible=p_visible;
-
+ multimesh->visible = p_visible;
}
int RasterizerDummy::multimesh_get_visible_instances(RID p_multimesh) const {
MultiMesh *multimesh = multimesh_owner.get(p_multimesh);
- ERR_FAIL_COND_V(!multimesh,-1);
+ ERR_FAIL_COND_V(!multimesh, -1);
return multimesh->visible;
-
}
/* IMMEDIATE API */
-
RID RasterizerDummy::immediate_create() {
- Immediate *im = memnew( Immediate );
+ Immediate *im = memnew(Immediate);
return immediate_owner.make_rid(im);
-
}
-void RasterizerDummy::immediate_begin(RID p_immediate,VS::PrimitiveType p_rimitive,RID p_texture){
-
-
+void RasterizerDummy::immediate_begin(RID p_immediate, VS::PrimitiveType p_rimitive, RID p_texture) {
}
-void RasterizerDummy::immediate_vertex(RID p_immediate,const Vector3& p_vertex){
-
-
+void RasterizerDummy::immediate_vertex(RID p_immediate, const Vector3 &p_vertex) {
}
-void RasterizerDummy::immediate_normal(RID p_immediate,const Vector3& p_normal){
-
-
+void RasterizerDummy::immediate_normal(RID p_immediate, const Vector3 &p_normal) {
}
-void RasterizerDummy::immediate_tangent(RID p_immediate,const Plane& p_tangent){
-
-
+void RasterizerDummy::immediate_tangent(RID p_immediate, const Plane &p_tangent) {
}
-void RasterizerDummy::immediate_color(RID p_immediate,const Color& p_color){
-
-
+void RasterizerDummy::immediate_color(RID p_immediate, const Color &p_color) {
}
-void RasterizerDummy::immediate_uv(RID p_immediate,const Vector2& tex_uv){
-
-
+void RasterizerDummy::immediate_uv(RID p_immediate, const Vector2 &tex_uv) {
}
-void RasterizerDummy::immediate_uv2(RID p_immediate,const Vector2& tex_uv){
-
-
+void RasterizerDummy::immediate_uv2(RID p_immediate, const Vector2 &tex_uv) {
}
-void RasterizerDummy::immediate_end(RID p_immediate){
-
-
+void RasterizerDummy::immediate_end(RID p_immediate) {
}
void RasterizerDummy::immediate_clear(RID p_immediate) {
-
-
}
AABB RasterizerDummy::immediate_get_aabb(RID p_immediate) const {
- return AABB(Vector3(-1,-1,-1),Vector3(2,2,2));
+ return AABB(Vector3(-1, -1, -1), Vector3(2, 2, 2));
}
-void RasterizerDummy::immediate_set_material(RID p_immediate,RID p_material) {
+void RasterizerDummy::immediate_set_material(RID p_immediate, RID p_material) {
Immediate *im = immediate_owner.get(p_immediate);
ERR_FAIL_COND(!im);
- im->material=p_material;
-
+ im->material = p_material;
}
RID RasterizerDummy::immediate_get_material(RID p_immediate) const {
const Immediate *im = immediate_owner.get(p_immediate);
- ERR_FAIL_COND_V(!im,RID());
+ ERR_FAIL_COND_V(!im, RID());
return im->material;
-
}
/* PARTICLES API */
RID RasterizerDummy::particles_create() {
- Particles *particles = memnew( Particles );
- ERR_FAIL_COND_V(!particles,RID());
+ Particles *particles = memnew(Particles);
+ ERR_FAIL_COND_V(!particles, RID());
return particles_owner.make_rid(particles);
}
void RasterizerDummy::particles_set_amount(RID p_particles, int p_amount) {
- ERR_FAIL_COND(p_amount<1);
- Particles* particles = particles_owner.get( p_particles );
+ ERR_FAIL_COND(p_amount < 1);
+ Particles *particles = particles_owner.get(p_particles);
ERR_FAIL_COND(!particles);
- particles->data.amount=p_amount;
-
+ particles->data.amount = p_amount;
}
int RasterizerDummy::particles_get_amount(RID p_particles) const {
- Particles* particles = particles_owner.get( p_particles );
- ERR_FAIL_COND_V(!particles,-1);
+ Particles *particles = particles_owner.get(p_particles);
+ ERR_FAIL_COND_V(!particles, -1);
return particles->data.amount;
-
}
void RasterizerDummy::particles_set_emitting(RID p_particles, bool p_emitting) {
- Particles* particles = particles_owner.get( p_particles );
+ Particles *particles = particles_owner.get(p_particles);
ERR_FAIL_COND(!particles);
- particles->data.emitting=p_emitting;;
-
+ particles->data.emitting = p_emitting;
+ ;
}
bool RasterizerDummy::particles_is_emitting(RID p_particles) const {
- const Particles* particles = particles_owner.get( p_particles );
- ERR_FAIL_COND_V(!particles,false);
+ const Particles *particles = particles_owner.get(p_particles);
+ ERR_FAIL_COND_V(!particles, false);
return particles->data.emitting;
-
}
-void RasterizerDummy::particles_set_visibility_aabb(RID p_particles, const AABB& p_visibility) {
+void RasterizerDummy::particles_set_visibility_aabb(RID p_particles, const AABB &p_visibility) {
- Particles* particles = particles_owner.get( p_particles );
+ Particles *particles = particles_owner.get(p_particles);
ERR_FAIL_COND(!particles);
- particles->data.visibility_aabb=p_visibility;
-
+ particles->data.visibility_aabb = p_visibility;
}
-void RasterizerDummy::particles_set_emission_half_extents(RID p_particles, const Vector3& p_half_extents) {
+void RasterizerDummy::particles_set_emission_half_extents(RID p_particles, const Vector3 &p_half_extents) {
- Particles* particles = particles_owner.get( p_particles );
+ Particles *particles = particles_owner.get(p_particles);
ERR_FAIL_COND(!particles);
- particles->data.emission_half_extents=p_half_extents;
+ particles->data.emission_half_extents = p_half_extents;
}
Vector3 RasterizerDummy::particles_get_emission_half_extents(RID p_particles) const {
- Particles* particles = particles_owner.get( p_particles );
- ERR_FAIL_COND_V(!particles,Vector3());
+ Particles *particles = particles_owner.get(p_particles);
+ ERR_FAIL_COND_V(!particles, Vector3());
return particles->data.emission_half_extents;
}
-void RasterizerDummy::particles_set_emission_base_velocity(RID p_particles, const Vector3& p_base_velocity) {
+void RasterizerDummy::particles_set_emission_base_velocity(RID p_particles, const Vector3 &p_base_velocity) {
- Particles* particles = particles_owner.get( p_particles );
+ Particles *particles = particles_owner.get(p_particles);
ERR_FAIL_COND(!particles);
- particles->data.emission_base_velocity=p_base_velocity;
+ particles->data.emission_base_velocity = p_base_velocity;
}
Vector3 RasterizerDummy::particles_get_emission_base_velocity(RID p_particles) const {
- Particles* particles = particles_owner.get( p_particles );
- ERR_FAIL_COND_V(!particles,Vector3());
+ Particles *particles = particles_owner.get(p_particles);
+ ERR_FAIL_COND_V(!particles, Vector3());
return particles->data.emission_base_velocity;
}
+void RasterizerDummy::particles_set_emission_points(RID p_particles, const DVector<Vector3> &p_points) {
-void RasterizerDummy::particles_set_emission_points(RID p_particles, const DVector<Vector3>& p_points) {
-
- Particles* particles = particles_owner.get( p_particles );
+ Particles *particles = particles_owner.get(p_particles);
ERR_FAIL_COND(!particles);
- particles->data.emission_points=p_points;
+ particles->data.emission_points = p_points;
}
DVector<Vector3> RasterizerDummy::particles_get_emission_points(RID p_particles) const {
- Particles* particles = particles_owner.get( p_particles );
- ERR_FAIL_COND_V(!particles,DVector<Vector3>());
+ Particles *particles = particles_owner.get(p_particles);
+ ERR_FAIL_COND_V(!particles, DVector<Vector3>());
return particles->data.emission_points;
-
}
-void RasterizerDummy::particles_set_gravity_normal(RID p_particles, const Vector3& p_normal) {
+void RasterizerDummy::particles_set_gravity_normal(RID p_particles, const Vector3 &p_normal) {
- Particles* particles = particles_owner.get( p_particles );
+ Particles *particles = particles_owner.get(p_particles);
ERR_FAIL_COND(!particles);
- particles->data.gravity_normal=p_normal;
-
+ particles->data.gravity_normal = p_normal;
}
Vector3 RasterizerDummy::particles_get_gravity_normal(RID p_particles) const {
- Particles* particles = particles_owner.get( p_particles );
- ERR_FAIL_COND_V(!particles,Vector3());
+ Particles *particles = particles_owner.get(p_particles);
+ ERR_FAIL_COND_V(!particles, Vector3());
return particles->data.gravity_normal;
}
-
AABB RasterizerDummy::particles_get_visibility_aabb(RID p_particles) const {
- const Particles* particles = particles_owner.get( p_particles );
- ERR_FAIL_COND_V(!particles,AABB());
+ const Particles *particles = particles_owner.get(p_particles);
+ ERR_FAIL_COND_V(!particles, AABB());
return particles->data.visibility_aabb;
-
}
-void RasterizerDummy::particles_set_variable(RID p_particles, VS::ParticleVariable p_variable,float p_value) {
+void RasterizerDummy::particles_set_variable(RID p_particles, VS::ParticleVariable p_variable, float p_value) {
- ERR_FAIL_INDEX(p_variable,VS::PARTICLE_VAR_MAX);
+ ERR_FAIL_INDEX(p_variable, VS::PARTICLE_VAR_MAX);
- Particles* particles = particles_owner.get( p_particles );
+ Particles *particles = particles_owner.get(p_particles);
ERR_FAIL_COND(!particles);
- particles->data.particle_vars[p_variable]=p_value;
-
+ particles->data.particle_vars[p_variable] = p_value;
}
float RasterizerDummy::particles_get_variable(RID p_particles, VS::ParticleVariable p_variable) const {
- const Particles* particles = particles_owner.get( p_particles );
- ERR_FAIL_COND_V(!particles,-1);
+ const Particles *particles = particles_owner.get(p_particles);
+ ERR_FAIL_COND_V(!particles, -1);
return particles->data.particle_vars[p_variable];
}
-void RasterizerDummy::particles_set_randomness(RID p_particles, VS::ParticleVariable p_variable,float p_randomness) {
+void RasterizerDummy::particles_set_randomness(RID p_particles, VS::ParticleVariable p_variable, float p_randomness) {
- Particles* particles = particles_owner.get( p_particles );
+ Particles *particles = particles_owner.get(p_particles);
ERR_FAIL_COND(!particles);
- particles->data.particle_randomness[p_variable]=p_randomness;
-
+ particles->data.particle_randomness[p_variable] = p_randomness;
}
float RasterizerDummy::particles_get_randomness(RID p_particles, VS::ParticleVariable p_variable) const {
- const Particles* particles = particles_owner.get( p_particles );
- ERR_FAIL_COND_V(!particles,-1);
+ const Particles *particles = particles_owner.get(p_particles);
+ ERR_FAIL_COND_V(!particles, -1);
return particles->data.particle_randomness[p_variable];
-
}
void RasterizerDummy::particles_set_color_phases(RID p_particles, int p_phases) {
- Particles* particles = particles_owner.get( p_particles );
+ Particles *particles = particles_owner.get(p_particles);
ERR_FAIL_COND(!particles);
- ERR_FAIL_COND( p_phases<0 || p_phases>VS::MAX_PARTICLE_COLOR_PHASES );
- particles->data.color_phase_count=p_phases;
-
+ ERR_FAIL_COND(p_phases < 0 || p_phases > VS::MAX_PARTICLE_COLOR_PHASES);
+ particles->data.color_phase_count = p_phases;
}
int RasterizerDummy::particles_get_color_phases(RID p_particles) const {
- Particles* particles = particles_owner.get( p_particles );
- ERR_FAIL_COND_V(!particles,-1);
+ Particles *particles = particles_owner.get(p_particles);
+ ERR_FAIL_COND_V(!particles, -1);
return particles->data.color_phase_count;
}
-
void RasterizerDummy::particles_set_color_phase_pos(RID p_particles, int p_phase, float p_pos) {
ERR_FAIL_INDEX(p_phase, VS::MAX_PARTICLE_COLOR_PHASES);
- if (p_pos<0.0)
- p_pos=0.0;
- if (p_pos>1.0)
- p_pos=1.0;
+ if (p_pos < 0.0)
+ p_pos = 0.0;
+ if (p_pos > 1.0)
+ p_pos = 1.0;
- Particles* particles = particles_owner.get( p_particles );
+ Particles *particles = particles_owner.get(p_particles);
ERR_FAIL_COND(!particles);
- particles->data.color_phases[p_phase].pos=p_pos;
-
+ particles->data.color_phases[p_phase].pos = p_pos;
}
float RasterizerDummy::particles_get_color_phase_pos(RID p_particles, int p_phase) const {
ERR_FAIL_INDEX_V(p_phase, VS::MAX_PARTICLE_COLOR_PHASES, -1.0);
- const Particles* particles = particles_owner.get( p_particles );
- ERR_FAIL_COND_V(!particles,-1);
+ const Particles *particles = particles_owner.get(p_particles);
+ ERR_FAIL_COND_V(!particles, -1);
return particles->data.color_phases[p_phase].pos;
-
}
-void RasterizerDummy::particles_set_color_phase_color(RID p_particles, int p_phase, const Color& p_color) {
+void RasterizerDummy::particles_set_color_phase_color(RID p_particles, int p_phase, const Color &p_color) {
ERR_FAIL_INDEX(p_phase, VS::MAX_PARTICLE_COLOR_PHASES);
- Particles* particles = particles_owner.get( p_particles );
+ Particles *particles = particles_owner.get(p_particles);
ERR_FAIL_COND(!particles);
- particles->data.color_phases[p_phase].color=p_color;
+ particles->data.color_phases[p_phase].color = p_color;
//update alpha
- particles->has_alpha=false;
- for(int i=0;i<VS::MAX_PARTICLE_COLOR_PHASES;i++) {
- if (particles->data.color_phases[i].color.a<0.99)
- particles->has_alpha=true;
+ particles->has_alpha = false;
+ for (int i = 0; i < VS::MAX_PARTICLE_COLOR_PHASES; i++) {
+ if (particles->data.color_phases[i].color.a < 0.99)
+ particles->has_alpha = true;
}
-
}
Color RasterizerDummy::particles_get_color_phase_color(RID p_particles, int p_phase) const {
ERR_FAIL_INDEX_V(p_phase, VS::MAX_PARTICLE_COLOR_PHASES, Color());
- const Particles* particles = particles_owner.get( p_particles );
- ERR_FAIL_COND_V(!particles,Color());
+ const Particles *particles = particles_owner.get(p_particles);
+ ERR_FAIL_COND_V(!particles, Color());
return particles->data.color_phases[p_phase].color;
-
}
void RasterizerDummy::particles_set_attractors(RID p_particles, int p_attractors) {
- Particles* particles = particles_owner.get( p_particles );
+ Particles *particles = particles_owner.get(p_particles);
ERR_FAIL_COND(!particles);
- ERR_FAIL_COND( p_attractors<0 || p_attractors>VisualServer::MAX_PARTICLE_ATTRACTORS );
- particles->data.attractor_count=p_attractors;
-
+ ERR_FAIL_COND(p_attractors < 0 || p_attractors > VisualServer::MAX_PARTICLE_ATTRACTORS);
+ particles->data.attractor_count = p_attractors;
}
int RasterizerDummy::particles_get_attractors(RID p_particles) const {
- Particles* particles = particles_owner.get( p_particles );
- ERR_FAIL_COND_V(!particles,-1);
+ Particles *particles = particles_owner.get(p_particles);
+ ERR_FAIL_COND_V(!particles, -1);
return particles->data.attractor_count;
}
-void RasterizerDummy::particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3& p_pos) {
+void RasterizerDummy::particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3 &p_pos) {
- Particles* particles = particles_owner.get( p_particles );
+ Particles *particles = particles_owner.get(p_particles);
ERR_FAIL_COND(!particles);
- ERR_FAIL_INDEX(p_attractor,particles->data.attractor_count);
- particles->data.attractors[p_attractor].pos=p_pos;;
+ ERR_FAIL_INDEX(p_attractor, particles->data.attractor_count);
+ particles->data.attractors[p_attractor].pos = p_pos;
+ ;
}
-Vector3 RasterizerDummy::particles_get_attractor_pos(RID p_particles,int p_attractor) const {
+Vector3 RasterizerDummy::particles_get_attractor_pos(RID p_particles, int p_attractor) const {
- Particles* particles = particles_owner.get( p_particles );
- ERR_FAIL_COND_V(!particles,Vector3());
- ERR_FAIL_INDEX_V(p_attractor,particles->data.attractor_count,Vector3());
+ Particles *particles = particles_owner.get(p_particles);
+ ERR_FAIL_COND_V(!particles, Vector3());
+ ERR_FAIL_INDEX_V(p_attractor, particles->data.attractor_count, Vector3());
return particles->data.attractors[p_attractor].pos;
}
void RasterizerDummy::particles_set_attractor_strength(RID p_particles, int p_attractor, float p_force) {
- Particles* particles = particles_owner.get( p_particles );
+ Particles *particles = particles_owner.get(p_particles);
ERR_FAIL_COND(!particles);
- ERR_FAIL_INDEX(p_attractor,particles->data.attractor_count);
- particles->data.attractors[p_attractor].force=p_force;
+ ERR_FAIL_INDEX(p_attractor, particles->data.attractor_count);
+ particles->data.attractors[p_attractor].force = p_force;
}
-float RasterizerDummy::particles_get_attractor_strength(RID p_particles,int p_attractor) const {
+float RasterizerDummy::particles_get_attractor_strength(RID p_particles, int p_attractor) const {
- Particles* particles = particles_owner.get( p_particles );
- ERR_FAIL_COND_V(!particles,0);
- ERR_FAIL_INDEX_V(p_attractor,particles->data.attractor_count,0);
+ Particles *particles = particles_owner.get(p_particles);
+ ERR_FAIL_COND_V(!particles, 0);
+ ERR_FAIL_INDEX_V(p_attractor, particles->data.attractor_count, 0);
return particles->data.attractors[p_attractor].force;
}
-void RasterizerDummy::particles_set_material(RID p_particles, RID p_material,bool p_owned) {
+void RasterizerDummy::particles_set_material(RID p_particles, RID p_material, bool p_owned) {
- Particles* particles = particles_owner.get( p_particles );
+ Particles *particles = particles_owner.get(p_particles);
ERR_FAIL_COND(!particles);
if (particles->material_owned && particles->material.is_valid())
free(particles->material);
- particles->material_owned=p_owned;
-
- particles->material=p_material;
+ particles->material_owned = p_owned;
+ particles->material = p_material;
}
RID RasterizerDummy::particles_get_material(RID p_particles) const {
- const Particles* particles = particles_owner.get( p_particles );
- ERR_FAIL_COND_V(!particles,RID());
+ const Particles *particles = particles_owner.get(p_particles);
+ ERR_FAIL_COND_V(!particles, RID());
return particles->material;
-
}
void RasterizerDummy::particles_set_use_local_coordinates(RID p_particles, bool p_enable) {
- Particles* particles = particles_owner.get( p_particles );
+ Particles *particles = particles_owner.get(p_particles);
ERR_FAIL_COND(!particles);
- particles->data.local_coordinates=p_enable;
-
+ particles->data.local_coordinates = p_enable;
}
bool RasterizerDummy::particles_is_using_local_coordinates(RID p_particles) const {
- const Particles* particles = particles_owner.get( p_particles );
- ERR_FAIL_COND_V(!particles,false);
+ const Particles *particles = particles_owner.get(p_particles);
+ ERR_FAIL_COND_V(!particles, false);
return particles->data.local_coordinates;
}
bool RasterizerDummy::particles_has_height_from_velocity(RID p_particles) const {
- const Particles* particles = particles_owner.get( p_particles );
- ERR_FAIL_COND_V(!particles,false);
+ const Particles *particles = particles_owner.get(p_particles);
+ ERR_FAIL_COND_V(!particles, false);
return particles->data.height_from_velocity;
}
void RasterizerDummy::particles_set_height_from_velocity(RID p_particles, bool p_enable) {
- Particles* particles = particles_owner.get( p_particles );
+ Particles *particles = particles_owner.get(p_particles);
ERR_FAIL_COND(!particles);
- particles->data.height_from_velocity=p_enable;
-
+ particles->data.height_from_velocity = p_enable;
}
AABB RasterizerDummy::particles_get_aabb(RID p_particles) const {
- const Particles* particles = particles_owner.get( p_particles );
- ERR_FAIL_COND_V(!particles,AABB());
+ const Particles *particles = particles_owner.get(p_particles);
+ ERR_FAIL_COND_V(!particles, AABB());
return particles->data.visibility_aabb;
}
@@ -1110,143 +1001,138 @@ AABB RasterizerDummy::particles_get_aabb(RID p_particles) const {
RID RasterizerDummy::skeleton_create() {
- Skeleton *skeleton = memnew( Skeleton );
- ERR_FAIL_COND_V(!skeleton,RID());
- return skeleton_owner.make_rid( skeleton );
+ Skeleton *skeleton = memnew(Skeleton);
+ ERR_FAIL_COND_V(!skeleton, RID());
+ return skeleton_owner.make_rid(skeleton);
}
-void RasterizerDummy::skeleton_resize(RID p_skeleton,int p_bones) {
+void RasterizerDummy::skeleton_resize(RID p_skeleton, int p_bones) {
- Skeleton *skeleton = skeleton_owner.get( p_skeleton );
+ Skeleton *skeleton = skeleton_owner.get(p_skeleton);
ERR_FAIL_COND(!skeleton);
if (p_bones == skeleton->bones.size()) {
return;
};
skeleton->bones.resize(p_bones);
-
}
int RasterizerDummy::skeleton_get_bone_count(RID p_skeleton) const {
- Skeleton *skeleton = skeleton_owner.get( p_skeleton );
+ Skeleton *skeleton = skeleton_owner.get(p_skeleton);
ERR_FAIL_COND_V(!skeleton, -1);
return skeleton->bones.size();
}
-void RasterizerDummy::skeleton_bone_set_transform(RID p_skeleton,int p_bone, const Transform& p_transform) {
+void RasterizerDummy::skeleton_bone_set_transform(RID p_skeleton, int p_bone, const Transform &p_transform) {
- Skeleton *skeleton = skeleton_owner.get( p_skeleton );
+ Skeleton *skeleton = skeleton_owner.get(p_skeleton);
ERR_FAIL_COND(!skeleton);
- ERR_FAIL_INDEX( p_bone, skeleton->bones.size() );
+ ERR_FAIL_INDEX(p_bone, skeleton->bones.size());
skeleton->bones[p_bone] = p_transform;
}
-Transform RasterizerDummy::skeleton_bone_get_transform(RID p_skeleton,int p_bone) {
+Transform RasterizerDummy::skeleton_bone_get_transform(RID p_skeleton, int p_bone) {
- Skeleton *skeleton = skeleton_owner.get( p_skeleton );
+ Skeleton *skeleton = skeleton_owner.get(p_skeleton);
ERR_FAIL_COND_V(!skeleton, Transform());
- ERR_FAIL_INDEX_V( p_bone, skeleton->bones.size(), Transform() );
+ ERR_FAIL_INDEX_V(p_bone, skeleton->bones.size(), Transform());
// something
return skeleton->bones[p_bone];
}
-
/* LIGHT API */
RID RasterizerDummy::light_create(VS::LightType p_type) {
- Light *light = memnew( Light );
- light->type=p_type;
+ Light *light = memnew(Light);
+ light->type = p_type;
return light_owner.make_rid(light);
}
VS::LightType RasterizerDummy::light_get_type(RID p_light) const {
Light *light = light_owner.get(p_light);
- ERR_FAIL_COND_V(!light,VS::LIGHT_OMNI);
+ ERR_FAIL_COND_V(!light, VS::LIGHT_OMNI);
return light->type;
}
-void RasterizerDummy::light_set_color(RID p_light,VS::LightColor p_type, const Color& p_color) {
+void RasterizerDummy::light_set_color(RID p_light, VS::LightColor p_type, const Color &p_color) {
Light *light = light_owner.get(p_light);
ERR_FAIL_COND(!light);
- ERR_FAIL_INDEX( p_type, 3 );
- light->colors[p_type]=p_color;
+ ERR_FAIL_INDEX(p_type, 3);
+ light->colors[p_type] = p_color;
}
-Color RasterizerDummy::light_get_color(RID p_light,VS::LightColor p_type) const {
+Color RasterizerDummy::light_get_color(RID p_light, VS::LightColor p_type) const {
Light *light = light_owner.get(p_light);
ERR_FAIL_COND_V(!light, Color());
- ERR_FAIL_INDEX_V( p_type, 3, Color() );
+ ERR_FAIL_INDEX_V(p_type, 3, Color());
return light->colors[p_type];
}
-void RasterizerDummy::light_set_shadow(RID p_light,bool p_enabled) {
+void RasterizerDummy::light_set_shadow(RID p_light, bool p_enabled) {
Light *light = light_owner.get(p_light);
ERR_FAIL_COND(!light);
- light->shadow_enabled=p_enabled;
+ light->shadow_enabled = p_enabled;
}
bool RasterizerDummy::light_has_shadow(RID p_light) const {
Light *light = light_owner.get(p_light);
- ERR_FAIL_COND_V(!light,false);
+ ERR_FAIL_COND_V(!light, false);
return light->shadow_enabled;
}
-void RasterizerDummy::light_set_volumetric(RID p_light,bool p_enabled) {
+void RasterizerDummy::light_set_volumetric(RID p_light, bool p_enabled) {
Light *light = light_owner.get(p_light);
ERR_FAIL_COND(!light);
- light->volumetric_enabled=p_enabled;
-
+ light->volumetric_enabled = p_enabled;
}
bool RasterizerDummy::light_is_volumetric(RID p_light) const {
Light *light = light_owner.get(p_light);
- ERR_FAIL_COND_V(!light,false);
+ ERR_FAIL_COND_V(!light, false);
return light->volumetric_enabled;
}
-void RasterizerDummy::light_set_projector(RID p_light,RID p_texture) {
+void RasterizerDummy::light_set_projector(RID p_light, RID p_texture) {
Light *light = light_owner.get(p_light);
ERR_FAIL_COND(!light);
- light->projector=p_texture;
+ light->projector = p_texture;
}
RID RasterizerDummy::light_get_projector(RID p_light) const {
Light *light = light_owner.get(p_light);
- ERR_FAIL_COND_V(!light,RID());
+ ERR_FAIL_COND_V(!light, RID());
return light->projector;
}
void RasterizerDummy::light_set_var(RID p_light, VS::LightParam p_var, float p_value) {
- Light * light = light_owner.get( p_light );
+ Light *light = light_owner.get(p_light);
ERR_FAIL_COND(!light);
- ERR_FAIL_INDEX( p_var, VS::LIGHT_PARAM_MAX );
+ ERR_FAIL_INDEX(p_var, VS::LIGHT_PARAM_MAX);
- light->vars[p_var]=p_value;
+ light->vars[p_var] = p_value;
}
float RasterizerDummy::light_get_var(RID p_light, VS::LightParam p_var) const {
- Light * light = light_owner.get( p_light );
- ERR_FAIL_COND_V(!light,0);
+ Light *light = light_owner.get(p_light);
+ ERR_FAIL_COND_V(!light, 0);
- ERR_FAIL_INDEX_V( p_var, VS::LIGHT_PARAM_MAX,0 );
+ ERR_FAIL_INDEX_V(p_var, VS::LIGHT_PARAM_MAX, 0);
return light->vars[p_var];
}
-void RasterizerDummy::light_set_operator(RID p_light,VS::LightOp p_op) {
+void RasterizerDummy::light_set_operator(RID p_light, VS::LightOp p_op) {
- Light * light = light_owner.get( p_light );
+ Light *light = light_owner.get(p_light);
ERR_FAIL_COND(!light);
-
-
};
VS::LightOp RasterizerDummy::light_get_operator(RID p_light) const {
@@ -1254,19 +1140,15 @@ VS::LightOp RasterizerDummy::light_get_operator(RID p_light) const {
return VS::LightOp(0);
};
-void RasterizerDummy::light_omni_set_shadow_mode(RID p_light,VS::LightOmniShadowMode p_mode) {
-
-
+void RasterizerDummy::light_omni_set_shadow_mode(RID p_light, VS::LightOmniShadowMode p_mode) {
}
-VS::LightOmniShadowMode RasterizerDummy::light_omni_get_shadow_mode(RID p_light) const{
+VS::LightOmniShadowMode RasterizerDummy::light_omni_get_shadow_mode(RID p_light) const {
return VS::LightOmniShadowMode(0);
}
-void RasterizerDummy::light_directional_set_shadow_mode(RID p_light,VS::LightDirectionalShadowMode p_mode) {
-
-
+void RasterizerDummy::light_directional_set_shadow_mode(RID p_light, VS::LightDirectionalShadowMode p_mode) {
}
VS::LightDirectionalShadowMode RasterizerDummy::light_directional_get_shadow_mode(RID p_light) const {
@@ -1274,34 +1156,31 @@ VS::LightDirectionalShadowMode RasterizerDummy::light_directional_get_shadow_mod
return VS::LIGHT_DIRECTIONAL_SHADOW_ORTHOGONAL;
}
-void RasterizerDummy::light_directional_set_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param, float p_value) {
-
-
+void RasterizerDummy::light_directional_set_shadow_param(RID p_light, VS::LightDirectionalShadowParam p_param, float p_value) {
}
-float RasterizerDummy::light_directional_get_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param) const {
+float RasterizerDummy::light_directional_get_shadow_param(RID p_light, VS::LightDirectionalShadowParam p_param) const {
return 0;
}
-
AABB RasterizerDummy::light_get_aabb(RID p_light) const {
- Light *light = light_owner.get( p_light );
- ERR_FAIL_COND_V(!light,AABB());
+ Light *light = light_owner.get(p_light);
+ ERR_FAIL_COND_V(!light, AABB());
- switch( light->type ) {
+ switch (light->type) {
case VS::LIGHT_SPOT: {
- float len=light->vars[VS::LIGHT_PARAM_RADIUS];
- float size=Math::tan(Math::deg2rad(light->vars[VS::LIGHT_PARAM_SPOT_ANGLE]))*len;
- return AABB( Vector3( -size,-size,-len ), Vector3( size*2, size*2, len ) );
+ float len = light->vars[VS::LIGHT_PARAM_RADIUS];
+ float size = Math::tan(Math::deg2rad(light->vars[VS::LIGHT_PARAM_SPOT_ANGLE])) * len;
+ return AABB(Vector3(-size, -size, -len), Vector3(size * 2, size * 2, len));
} break;
case VS::LIGHT_OMNI: {
float r = light->vars[VS::LIGHT_PARAM_RADIUS];
- return AABB( -Vector3(r,r,r), Vector3(r,r,r)*2 );
+ return AABB(-Vector3(r, r, r), Vector3(r, r, r) * 2);
} break;
case VS::LIGHT_DIRECTIONAL: {
@@ -1310,51 +1189,44 @@ AABB RasterizerDummy::light_get_aabb(RID p_light) const {
default: {}
}
- ERR_FAIL_V( AABB() );
+ ERR_FAIL_V(AABB());
}
-
RID RasterizerDummy::light_instance_create(RID p_light) {
- Light *light = light_owner.get( p_light );
+ Light *light = light_owner.get(p_light);
ERR_FAIL_COND_V(!light, RID());
- LightInstance *light_instance = memnew( LightInstance );
-
- light_instance->light=p_light;
- light_instance->base=light;
+ LightInstance *light_instance = memnew(LightInstance);
+ light_instance->light = p_light;
+ light_instance->base = light;
- return light_instance_owner.make_rid( light_instance );
+ return light_instance_owner.make_rid(light_instance);
}
-void RasterizerDummy::light_instance_set_transform(RID p_light_instance,const Transform& p_transform) {
+void RasterizerDummy::light_instance_set_transform(RID p_light_instance, const Transform &p_transform) {
- LightInstance *lighti = light_instance_owner.get( p_light_instance );
+ LightInstance *lighti = light_instance_owner.get(p_light_instance);
ERR_FAIL_COND(!lighti);
- lighti->transform=p_transform;
-
+ lighti->transform = p_transform;
}
bool RasterizerDummy::light_instance_has_shadow(RID p_light_instance) const {
return false;
-
}
-
bool RasterizerDummy::light_instance_assign_shadow(RID p_light_instance) {
return false;
-
}
-
Rasterizer::ShadowType RasterizerDummy::light_instance_get_shadow_type(RID p_light_instance) const {
- LightInstance *lighti = light_instance_owner.get( p_light_instance );
- ERR_FAIL_COND_V(!lighti,Rasterizer::SHADOW_NONE);
+ LightInstance *lighti = light_instance_owner.get(p_light_instance);
+ ERR_FAIL_COND_V(!lighti, Rasterizer::SHADOW_NONE);
- switch(lighti->base->type) {
+ switch (lighti->base->type) {
case VS::LIGHT_DIRECTIONAL: return SHADOW_PSM; break;
case VS::LIGHT_OMNI: return SHADOW_DUAL_PARABOLOID; break;
@@ -1364,13 +1236,11 @@ Rasterizer::ShadowType RasterizerDummy::light_instance_get_shadow_type(RID p_lig
return Rasterizer::SHADOW_NONE;
}
-Rasterizer::ShadowType RasterizerDummy::light_instance_get_shadow_type(RID p_light_instance,bool p_far) const {
+Rasterizer::ShadowType RasterizerDummy::light_instance_get_shadow_type(RID p_light_instance, bool p_far) const {
return SHADOW_NONE;
}
-void RasterizerDummy::light_instance_set_shadow_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near,float p_split_far) {
-
-
+void RasterizerDummy::light_instance_set_shadow_transform(RID p_light_instance, int p_index, const CameraMatrix &p_camera, const Transform &p_transform, float p_split_near, float p_split_far) {
}
int RasterizerDummy::light_instance_get_shadow_passes(RID p_light_instance) const {
@@ -1383,22 +1253,18 @@ bool RasterizerDummy::light_instance_get_pssm_shadow_overlap(RID p_light_instanc
return false;
}
+void RasterizerDummy::light_instance_set_custom_transform(RID p_light_instance, int p_index, const CameraMatrix &p_camera, const Transform &p_transform, float p_split_near, float p_split_far) {
-void RasterizerDummy::light_instance_set_custom_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near,float p_split_far) {
-
- LightInstance *lighti = light_instance_owner.get( p_light_instance );
+ LightInstance *lighti = light_instance_owner.get(p_light_instance);
ERR_FAIL_COND(!lighti);
- ERR_FAIL_COND(lighti->base->type!=VS::LIGHT_DIRECTIONAL);
- ERR_FAIL_INDEX(p_index,1);
-
- lighti->custom_projection=p_camera;
- lighti->custom_transform=p_transform;
+ ERR_FAIL_COND(lighti->base->type != VS::LIGHT_DIRECTIONAL);
+ ERR_FAIL_INDEX(p_index, 1);
+ lighti->custom_projection = p_camera;
+ lighti->custom_transform = p_transform;
}
void RasterizerDummy::shadow_clear_near() {
-
-
}
bool RasterizerDummy::shadow_allocate_near(RID p_light) {
@@ -1415,143 +1281,94 @@ bool RasterizerDummy::shadow_allocate_far(RID p_light) {
RID RasterizerDummy::particles_instance_create(RID p_particles) {
- ERR_FAIL_COND_V(!particles_owner.owns(p_particles),RID());
- ParticlesInstance *particles_instance = memnew( ParticlesInstance );
- ERR_FAIL_COND_V(!particles_instance, RID() );
- particles_instance->particles=p_particles;
+ ERR_FAIL_COND_V(!particles_owner.owns(p_particles), RID());
+ ParticlesInstance *particles_instance = memnew(ParticlesInstance);
+ ERR_FAIL_COND_V(!particles_instance, RID());
+ particles_instance->particles = p_particles;
return particles_instance_owner.make_rid(particles_instance);
}
-void RasterizerDummy::particles_instance_set_transform(RID p_particles_instance,const Transform& p_transform) {
+void RasterizerDummy::particles_instance_set_transform(RID p_particles_instance, const Transform &p_transform) {
- ParticlesInstance *particles_instance=particles_instance_owner.get(p_particles_instance);
+ ParticlesInstance *particles_instance = particles_instance_owner.get(p_particles_instance);
ERR_FAIL_COND(!particles_instance);
- particles_instance->transform=p_transform;
+ particles_instance->transform = p_transform;
}
-
/* RENDER API */
/* all calls (inside begin/end shadow) are always warranted to be in the following order: */
-
RID RasterizerDummy::viewport_data_create() {
return RID();
}
-RID RasterizerDummy::render_target_create(){
+RID RasterizerDummy::render_target_create() {
return RID();
-
}
-void RasterizerDummy::render_target_set_size(RID p_render_target, int p_width, int p_height){
-
-
+void RasterizerDummy::render_target_set_size(RID p_render_target, int p_width, int p_height) {
}
-RID RasterizerDummy::render_target_get_texture(RID p_render_target) const{
+RID RasterizerDummy::render_target_get_texture(RID p_render_target) const {
return RID();
-
}
-bool RasterizerDummy::render_target_renedered_in_frame(RID p_render_target){
+bool RasterizerDummy::render_target_renedered_in_frame(RID p_render_target) {
return false;
}
-
void RasterizerDummy::begin_frame() {
-
-
-
}
-void RasterizerDummy::capture_viewport(Image* r_capture) {
-
-
+void RasterizerDummy::capture_viewport(Image *r_capture) {
}
-
-void RasterizerDummy::clear_viewport(const Color& p_color) {
-
+void RasterizerDummy::clear_viewport(const Color &p_color){
};
-void RasterizerDummy::set_viewport(const VS::ViewportRect& p_viewport) {
-
-
-
+void RasterizerDummy::set_viewport(const VS::ViewportRect &p_viewport) {
}
void RasterizerDummy::set_render_target(RID p_render_target, bool p_transparent_bg, bool p_vflip) {
-
-
}
-
-void RasterizerDummy::begin_scene(RID p_viewport_data,RID p_env,VS::ScenarioDebugMode p_debug) {
-
+void RasterizerDummy::begin_scene(RID p_viewport_data, RID p_env, VS::ScenarioDebugMode p_debug){
};
-void RasterizerDummy::begin_shadow_map( RID p_light_instance, int p_shadow_pass ) {
-
+void RasterizerDummy::begin_shadow_map(RID p_light_instance, int p_shadow_pass) {
}
-void RasterizerDummy::set_camera(const Transform& p_world, const CameraMatrix& p_projection, bool p_ortho_hint) {
-
-
+void RasterizerDummy::set_camera(const Transform &p_world, const CameraMatrix &p_projection, bool p_ortho_hint) {
}
-void RasterizerDummy::add_light( RID p_light_instance ) {
-
-
-
+void RasterizerDummy::add_light(RID p_light_instance) {
}
-
-
-
-void RasterizerDummy::add_mesh( const RID& p_mesh, const InstanceData *p_data) {
-
-
+void RasterizerDummy::add_mesh(const RID &p_mesh, const InstanceData *p_data) {
}
-void RasterizerDummy::add_multimesh( const RID& p_multimesh, const InstanceData *p_data){
-
-
-
-
+void RasterizerDummy::add_multimesh(const RID &p_multimesh, const InstanceData *p_data) {
}
-void RasterizerDummy::add_particles( const RID& p_particle_instance, const InstanceData *p_data){
-
-
-
+void RasterizerDummy::add_particles(const RID &p_particle_instance, const InstanceData *p_data) {
}
-
-
void RasterizerDummy::end_scene() {
-
-
}
void RasterizerDummy::end_shadow_map() {
-
}
-
void RasterizerDummy::end_frame() {
-
-
}
RID RasterizerDummy::canvas_light_occluder_create() {
return RID();
}
-void RasterizerDummy::canvas_light_occluder_set_polylines(RID p_occluder, const DVector<Vector2>& p_lines) {
-
-
+void RasterizerDummy::canvas_light_occluder_set_polylines(RID p_occluder, const DVector<Vector2> &p_lines) {
}
RID RasterizerDummy::canvas_light_shadow_buffer_create(int p_width) {
@@ -1559,206 +1376,152 @@ RID RasterizerDummy::canvas_light_shadow_buffer_create(int p_width) {
return RID();
}
-void RasterizerDummy::canvas_light_shadow_buffer_update(RID p_buffer, const Matrix32& p_light_xform, int p_light_mask,float p_near, float p_far, CanvasLightOccluderInstance* p_occluders, CameraMatrix *p_xform_cache) {
-
-
+void RasterizerDummy::canvas_light_shadow_buffer_update(RID p_buffer, const Matrix32 &p_light_xform, int p_light_mask, float p_near, float p_far, CanvasLightOccluderInstance *p_occluders, CameraMatrix *p_xform_cache) {
}
-void RasterizerDummy::canvas_debug_viewport_shadows(CanvasLight* p_lights_with_shadow) {
-
-
+void RasterizerDummy::canvas_debug_viewport_shadows(CanvasLight *p_lights_with_shadow) {
}
/* CANVAS API */
-
void RasterizerDummy::begin_canvas_bg() {
-
}
void RasterizerDummy::canvas_begin() {
-
-
-
}
void RasterizerDummy::canvas_disable_blending() {
-
-
-
}
void RasterizerDummy::canvas_set_opacity(float p_opacity) {
-
-
}
void RasterizerDummy::canvas_set_blend_mode(VS::MaterialBlendMode p_mode) {
-
-
}
-
-void RasterizerDummy::canvas_begin_rect(const Matrix32& p_transform) {
-
-
-
+void RasterizerDummy::canvas_begin_rect(const Matrix32 &p_transform) {
}
-void RasterizerDummy::canvas_set_clip(bool p_clip, const Rect2& p_rect) {
-
-
-
-
+void RasterizerDummy::canvas_set_clip(bool p_clip, const Rect2 &p_rect) {
}
void RasterizerDummy::canvas_end_rect() {
-
-
}
-void RasterizerDummy::canvas_draw_line(const Point2& p_from, const Point2& p_to,const Color& p_color,float p_width) {
-
-
-
+void RasterizerDummy::canvas_draw_line(const Point2 &p_from, const Point2 &p_to, const Color &p_color, float p_width) {
}
-void RasterizerDummy::canvas_draw_rect(const Rect2& p_rect, int p_flags, const Rect2& p_source,RID p_texture,const Color& p_modulate) {
-
-
-
-
+void RasterizerDummy::canvas_draw_rect(const Rect2 &p_rect, int p_flags, const Rect2 &p_source, RID p_texture, const Color &p_modulate) {
}
-void RasterizerDummy::canvas_draw_style_box(const Rect2& p_rect, const Rect2& p_src_region, RID p_texture,const float *p_margin, bool p_draw_center,const Color& p_modulate) {
-
-
+void RasterizerDummy::canvas_draw_style_box(const Rect2 &p_rect, const Rect2 &p_src_region, RID p_texture, const float *p_margin, bool p_draw_center, const Color &p_modulate) {
}
-void RasterizerDummy::canvas_draw_primitive(const Vector<Point2>& p_points, const Vector<Color>& p_colors,const Vector<Point2>& p_uvs, RID p_texture,float p_width) {
-
-
-
+void RasterizerDummy::canvas_draw_primitive(const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs, RID p_texture, float p_width) {
}
-
-void RasterizerDummy::canvas_draw_polygon(int p_vertex_count, const int* p_indices, const Vector2* p_vertices, const Vector2* p_uvs, const Color* p_colors,const RID& p_texture,bool p_singlecolor) {
-
-
-
+void RasterizerDummy::canvas_draw_polygon(int p_vertex_count, const int *p_indices, const Vector2 *p_vertices, const Vector2 *p_uvs, const Color *p_colors, const RID &p_texture, bool p_singlecolor) {
}
-void RasterizerDummy::canvas_set_transform(const Matrix32& p_transform) {
-
-
+void RasterizerDummy::canvas_set_transform(const Matrix32 &p_transform) {
}
-void RasterizerDummy::canvas_render_items(CanvasItem *p_item_list,int p_z,const Color& p_modulate,CanvasLight *p_light) {
-
-
+void RasterizerDummy::canvas_render_items(CanvasItem *p_item_list, int p_z, const Color &p_modulate, CanvasLight *p_light) {
}
/* ENVIRONMENT */
RID RasterizerDummy::environment_create() {
- Environment * env = memnew( Environment );
+ Environment *env = memnew(Environment);
return environment_owner.make_rid(env);
}
-void RasterizerDummy::environment_set_background(RID p_env,VS::EnvironmentBG p_bg) {
+void RasterizerDummy::environment_set_background(RID p_env, VS::EnvironmentBG p_bg) {
- ERR_FAIL_INDEX(p_bg,VS::ENV_BG_MAX);
- Environment * env = environment_owner.get(p_env);
+ ERR_FAIL_INDEX(p_bg, VS::ENV_BG_MAX);
+ Environment *env = environment_owner.get(p_env);
ERR_FAIL_COND(!env);
- env->bg_mode=p_bg;
+ env->bg_mode = p_bg;
}
-VS::EnvironmentBG RasterizerDummy::environment_get_background(RID p_env) const{
+VS::EnvironmentBG RasterizerDummy::environment_get_background(RID p_env) const {
- const Environment * env = environment_owner.get(p_env);
- ERR_FAIL_COND_V(!env,VS::ENV_BG_MAX);
+ const Environment *env = environment_owner.get(p_env);
+ ERR_FAIL_COND_V(!env, VS::ENV_BG_MAX);
return env->bg_mode;
}
-void RasterizerDummy::environment_set_background_param(RID p_env,VS::EnvironmentBGParam p_param, const Variant& p_value){
+void RasterizerDummy::environment_set_background_param(RID p_env, VS::EnvironmentBGParam p_param, const Variant &p_value) {
- ERR_FAIL_INDEX(p_param,VS::ENV_BG_PARAM_MAX);
- Environment * env = environment_owner.get(p_env);
+ ERR_FAIL_INDEX(p_param, VS::ENV_BG_PARAM_MAX);
+ Environment *env = environment_owner.get(p_env);
ERR_FAIL_COND(!env);
- env->bg_param[p_param]=p_value;
-
+ env->bg_param[p_param] = p_value;
}
-Variant RasterizerDummy::environment_get_background_param(RID p_env,VS::EnvironmentBGParam p_param) const{
+Variant RasterizerDummy::environment_get_background_param(RID p_env, VS::EnvironmentBGParam p_param) const {
- ERR_FAIL_INDEX_V(p_param,VS::ENV_BG_PARAM_MAX,Variant());
- const Environment * env = environment_owner.get(p_env);
- ERR_FAIL_COND_V(!env,Variant());
+ ERR_FAIL_INDEX_V(p_param, VS::ENV_BG_PARAM_MAX, Variant());
+ const Environment *env = environment_owner.get(p_env);
+ ERR_FAIL_COND_V(!env, Variant());
return env->bg_param[p_param];
-
}
-void RasterizerDummy::environment_set_enable_fx(RID p_env,VS::EnvironmentFx p_effect,bool p_enabled){
+void RasterizerDummy::environment_set_enable_fx(RID p_env, VS::EnvironmentFx p_effect, bool p_enabled) {
- ERR_FAIL_INDEX(p_effect,VS::ENV_FX_MAX);
- Environment * env = environment_owner.get(p_env);
+ ERR_FAIL_INDEX(p_effect, VS::ENV_FX_MAX);
+ Environment *env = environment_owner.get(p_env);
ERR_FAIL_COND(!env);
- env->fx_enabled[p_effect]=p_enabled;
+ env->fx_enabled[p_effect] = p_enabled;
}
-bool RasterizerDummy::environment_is_fx_enabled(RID p_env,VS::EnvironmentFx p_effect) const{
+bool RasterizerDummy::environment_is_fx_enabled(RID p_env, VS::EnvironmentFx p_effect) const {
- ERR_FAIL_INDEX_V(p_effect,VS::ENV_FX_MAX,false);
- const Environment * env = environment_owner.get(p_env);
- ERR_FAIL_COND_V(!env,false);
+ ERR_FAIL_INDEX_V(p_effect, VS::ENV_FX_MAX, false);
+ const Environment *env = environment_owner.get(p_env);
+ ERR_FAIL_COND_V(!env, false);
return env->fx_enabled[p_effect];
-
}
-void RasterizerDummy::environment_fx_set_param(RID p_env,VS::EnvironmentFxParam p_param,const Variant& p_value){
+void RasterizerDummy::environment_fx_set_param(RID p_env, VS::EnvironmentFxParam p_param, const Variant &p_value) {
- ERR_FAIL_INDEX(p_param,VS::ENV_FX_PARAM_MAX);
- Environment * env = environment_owner.get(p_env);
+ ERR_FAIL_INDEX(p_param, VS::ENV_FX_PARAM_MAX);
+ Environment *env = environment_owner.get(p_env);
ERR_FAIL_COND(!env);
- env->fx_param[p_param]=p_value;
+ env->fx_param[p_param] = p_value;
}
-Variant RasterizerDummy::environment_fx_get_param(RID p_env,VS::EnvironmentFxParam p_param) const{
+Variant RasterizerDummy::environment_fx_get_param(RID p_env, VS::EnvironmentFxParam p_param) const {
- ERR_FAIL_INDEX_V(p_param,VS::ENV_FX_PARAM_MAX,Variant());
- const Environment * env = environment_owner.get(p_env);
- ERR_FAIL_COND_V(!env,Variant());
+ ERR_FAIL_INDEX_V(p_param, VS::ENV_FX_PARAM_MAX, Variant());
+ const Environment *env = environment_owner.get(p_env);
+ ERR_FAIL_COND_V(!env, Variant());
return env->fx_param[p_param];
-
}
-
-RID RasterizerDummy::sampled_light_dp_create(int p_width,int p_height) {
+RID RasterizerDummy::sampled_light_dp_create(int p_width, int p_height) {
return sampled_light_owner.make_rid(memnew(SampledLight));
}
void RasterizerDummy::sampled_light_dp_update(RID p_sampled_light, const Color *p_data, float p_multiplier) {
-
-
}
-
/*MISC*/
-bool RasterizerDummy::is_texture(const RID& p_rid) const {
+bool RasterizerDummy::is_texture(const RID &p_rid) const {
return texture_owner.owns(p_rid);
}
-bool RasterizerDummy::is_material(const RID& p_rid) const {
+bool RasterizerDummy::is_material(const RID &p_rid) const {
return material_owner.owns(p_rid);
}
-bool RasterizerDummy::is_mesh(const RID& p_rid) const {
+bool RasterizerDummy::is_mesh(const RID &p_rid) const {
return mesh_owner.owns(p_rid);
}
-bool RasterizerDummy::is_immediate(const RID& p_rid) const {
+bool RasterizerDummy::is_immediate(const RID &p_rid) const {
return immediate_owner.owns(p_rid);
}
-bool RasterizerDummy::is_multimesh(const RID& p_rid) const {
+bool RasterizerDummy::is_multimesh(const RID &p_rid) const {
return multimesh_owner.owns(p_rid);
}
@@ -1767,38 +1530,38 @@ bool RasterizerDummy::is_particles(const RID &p_beam) const {
return particles_owner.owns(p_beam);
}
-bool RasterizerDummy::is_light(const RID& p_rid) const {
+bool RasterizerDummy::is_light(const RID &p_rid) const {
return light_owner.owns(p_rid);
}
-bool RasterizerDummy::is_light_instance(const RID& p_rid) const {
+bool RasterizerDummy::is_light_instance(const RID &p_rid) const {
return light_instance_owner.owns(p_rid);
}
-bool RasterizerDummy::is_particles_instance(const RID& p_rid) const {
+bool RasterizerDummy::is_particles_instance(const RID &p_rid) const {
return particles_instance_owner.owns(p_rid);
}
-bool RasterizerDummy::is_skeleton(const RID& p_rid) const {
+bool RasterizerDummy::is_skeleton(const RID &p_rid) const {
return skeleton_owner.owns(p_rid);
}
-bool RasterizerDummy::is_environment(const RID& p_rid) const {
+bool RasterizerDummy::is_environment(const RID &p_rid) const {
return environment_owner.owns(p_rid);
}
-bool RasterizerDummy::is_canvas_light_occluder(const RID& p_rid) const {
+bool RasterizerDummy::is_canvas_light_occluder(const RID &p_rid) const {
return false;
}
-bool RasterizerDummy::is_shader(const RID& p_rid) const {
+bool RasterizerDummy::is_shader(const RID &p_rid) const {
return false;
}
-void RasterizerDummy::free(const RID& p_rid) {
+void RasterizerDummy::free(const RID &p_rid) {
if (texture_owner.owns(p_rid)) {
@@ -1816,7 +1579,7 @@ void RasterizerDummy::free(const RID& p_rid) {
} else if (material_owner.owns(p_rid)) {
- Material *material = material_owner.get( p_rid );
+ Material *material = material_owner.get(p_rid);
material_owner.free(p_rid);
memdelete(material);
@@ -1824,9 +1587,9 @@ void RasterizerDummy::free(const RID& p_rid) {
Mesh *mesh = mesh_owner.get(p_rid);
- for (int i=0;i<mesh->surfaces.size();i++) {
+ for (int i = 0; i < mesh->surfaces.size(); i++) {
- memdelete( mesh->surfaces[i] );
+ memdelete(mesh->surfaces[i]);
};
mesh->surfaces.clear();
@@ -1835,9 +1598,9 @@ void RasterizerDummy::free(const RID& p_rid) {
} else if (multimesh_owner.owns(p_rid)) {
- MultiMesh *multimesh = multimesh_owner.get(p_rid);
- multimesh_owner.free(p_rid);
- memdelete(multimesh);
+ MultiMesh *multimesh = multimesh_owner.get(p_rid);
+ multimesh_owner.free(p_rid);
+ memdelete(multimesh);
} else if (immediate_owner.owns(p_rid)) {
@@ -1858,42 +1621,38 @@ void RasterizerDummy::free(const RID& p_rid) {
} else if (skeleton_owner.owns(p_rid)) {
- Skeleton *skeleton = skeleton_owner.get( p_rid );
+ Skeleton *skeleton = skeleton_owner.get(p_rid);
skeleton_owner.free(p_rid);
memdelete(skeleton);
} else if (light_owner.owns(p_rid)) {
- Light *light = light_owner.get( p_rid );
+ Light *light = light_owner.get(p_rid);
light_owner.free(p_rid);
memdelete(light);
} else if (light_instance_owner.owns(p_rid)) {
- LightInstance *light_instance = light_instance_owner.get( p_rid );
+ LightInstance *light_instance = light_instance_owner.get(p_rid);
light_instance_owner.free(p_rid);
- memdelete( light_instance );
-
+ memdelete(light_instance);
} else if (environment_owner.owns(p_rid)) {
- Environment *env = environment_owner.get( p_rid );
+ Environment *env = environment_owner.get(p_rid);
environment_owner.free(p_rid);
- memdelete( env );
+ memdelete(env);
} else if (sampled_light_owner.owns(p_rid)) {
- SampledLight *sampled_light = sampled_light_owner.get( p_rid );
+ SampledLight *sampled_light = sampled_light_owner.get(p_rid);
ERR_FAIL_COND(!sampled_light);
sampled_light_owner.free(p_rid);
- memdelete( sampled_light );
-
+ memdelete(sampled_light);
};
}
-
-void RasterizerDummy::custom_shade_model_set_shader(int p_model, RID p_shader) {
-
+void RasterizerDummy::custom_shade_model_set_shader(int p_model, RID p_shader){
};
@@ -1902,7 +1661,7 @@ RID RasterizerDummy::custom_shade_model_get_shader(int p_model) const {
return RID();
};
-void RasterizerDummy::custom_shade_model_set_name(int p_model, const String& p_name) {
+void RasterizerDummy::custom_shade_model_set_name(int p_model, const String &p_name){
};
@@ -1911,24 +1670,18 @@ String RasterizerDummy::custom_shade_model_get_name(int p_model) const {
return String();
};
-void RasterizerDummy::custom_shade_model_set_param_info(int p_model, const List<PropertyInfo>& p_info) {
+void RasterizerDummy::custom_shade_model_set_param_info(int p_model, const List<PropertyInfo> &p_info){
};
-void RasterizerDummy::custom_shade_model_get_param_info(int p_model, List<PropertyInfo>* p_info) const {
+void RasterizerDummy::custom_shade_model_get_param_info(int p_model, List<PropertyInfo> *p_info) const {
};
-
-
void RasterizerDummy::init() {
-
-
}
void RasterizerDummy::finish() {
-
-
}
int RasterizerDummy::get_render_info(VS::RenderInfo p_info) {
@@ -1941,21 +1694,18 @@ bool RasterizerDummy::needs_to_draw_next_frame() const {
return false;
}
-
bool RasterizerDummy::has_feature(VS::Features p_feature) const {
return false;
-
}
void RasterizerDummy::restore_framebuffer() {
-
}
-RasterizerDummy::RasterizerDummy() {
+RasterizerDummy::RasterizerDummy(){
};
-RasterizerDummy::~RasterizerDummy() {
+RasterizerDummy::~RasterizerDummy(){
};
diff --git a/servers/visual/rasterizer_dummy.h b/servers/visual/rasterizer_dummy.h
index c883de896..9e789f296 100644
--- a/servers/visual/rasterizer_dummy.h
+++ b/servers/visual/rasterizer_dummy.h
@@ -31,16 +31,14 @@
#include "servers/visual/rasterizer.h"
-
+#include "camera_matrix.h"
#include "image.h"
-#include "rid.h"
-#include "servers/visual_server.h"
#include "list.h"
#include "map.h"
-#include "camera_matrix.h"
+#include "rid.h"
+#include "servers/visual_server.h"
#include "sort.h"
-
#include "servers/visual/particle_system_sw.h"
/**
@@ -51,17 +49,16 @@ class RasterizerDummy : public Rasterizer {
struct Texture {
uint32_t flags;
- int width,height;
+ int width, height;
Image::Format format;
Image image[6];
Texture() {
- flags=width=height=0;
- format=Image::FORMAT_GRAYSCALE;
+ flags = width = height = 0;
+ format = Image::FORMAT_GRAYSCALE;
}
~Texture() {
-
}
};
@@ -73,19 +70,17 @@ class RasterizerDummy : public Rasterizer {
String fragment_code;
String light_code;
VS::ShaderMode mode;
- Map<StringName,Variant> params;
+ Map<StringName, Variant> params;
int fragment_line;
int vertex_line;
int light_line;
bool valid;
bool has_alpha;
bool use_world_transform;
-
};
mutable RID_Owner<Shader> shader_owner;
-
struct Material {
bool flags[VS::MATERIAL_FLAG_MAX];
@@ -99,28 +94,24 @@ class RasterizerDummy : public Rasterizer {
RID shader; // shader material
- Map<StringName,Variant> shader_params;
-
+ Map<StringName, Variant> shader_params;
Material() {
+ for (int i = 0; i < VS::MATERIAL_FLAG_MAX; i++)
+ flags[i] = false;
+ flags[VS::MATERIAL_FLAG_VISIBLE] = true;
- for(int i=0;i<VS::MATERIAL_FLAG_MAX;i++)
- flags[i]=false;
- flags[VS::MATERIAL_FLAG_VISIBLE]=true;
-
- depth_draw_mode=VS::MATERIAL_DEPTH_DRAW_OPAQUE_ONLY;
- line_width=1;
- blend_mode=VS::MATERIAL_BLEND_MODE_MIX;
+ depth_draw_mode = VS::MATERIAL_DEPTH_DRAW_OPAQUE_ONLY;
+ line_width = 1;
+ blend_mode = VS::MATERIAL_BLEND_MODE_MIX;
point_size = 1.0;
-
}
};
mutable RID_Owner<Material> material_owner;
void _material_check_alpha(Material *p_material);
-
struct Geometry {
enum Type {
@@ -136,8 +127,11 @@ class RasterizerDummy : public Rasterizer {
bool has_alpha;
bool material_owned;
- Geometry() { has_alpha=false; material_owned = false; }
- virtual ~Geometry() {};
+ Geometry() {
+ has_alpha = false;
+ material_owned = false;
+ }
+ virtual ~Geometry(){};
};
struct GeometryOwner {
@@ -164,35 +158,33 @@ class RasterizerDummy : public Rasterizer {
Surface() {
- packed=false;
- morph_target_count=0;
- material_owned=false;
- format=0;
- morph_format=0;
+ packed = false;
+ morph_target_count = 0;
+ material_owned = false;
+ format = 0;
+ morph_format = 0;
- primitive=VS::PRIMITIVE_POINTS;
+ primitive = VS::PRIMITIVE_POINTS;
}
~Surface() {
-
}
};
-
struct Mesh {
bool active;
- Vector<Surface*> surfaces;
+ Vector<Surface *> surfaces;
int morph_target_count;
VS::MorphTargetMode morph_target_mode;
AABB custom_aabb;
mutable uint64_t last_pass;
Mesh() {
- morph_target_mode=VS::MORPH_MODE_NORMALIZED;
- morph_target_count=0;
- last_pass=0;
- active=false;
+ morph_target_mode = VS::MORPH_MODE_NORMALIZED;
+ morph_target_count = 0;
+ last_pass = 0;
+ active = false;
}
};
mutable RID_Owner<Mesh> mesh_owner;
@@ -202,7 +194,7 @@ class RasterizerDummy : public Rasterizer {
struct MultiMeshSurface : public Geometry {
Surface *surface;
- MultiMeshSurface() { type=GEOMETRY_MULTISURFACE; }
+ MultiMeshSurface() { type = GEOMETRY_MULTISURFACE; }
};
struct MultiMesh : public GeometryOwner {
@@ -221,18 +213,14 @@ class RasterizerDummy : public Rasterizer {
Vector<Element> elements;
MultiMesh() {
- visible=-1;
+ visible = -1;
}
-
-
};
-
mutable RID_Owner<MultiMesh> multimesh_owner;
struct Immediate {
-
RID material;
int empty;
};
@@ -244,8 +232,7 @@ class RasterizerDummy : public Rasterizer {
ParticleSystemSW data; // software particle system
Particles() {
- type=GEOMETRY_PARTICLES;
-
+ type = GEOMETRY_PARTICLES;
}
};
@@ -258,7 +245,7 @@ class RasterizerDummy : public Rasterizer {
ParticleSystemProcessSW particles_process;
Transform transform;
- ParticlesInstance() { }
+ ParticlesInstance() {}
};
mutable RID_Owner<ParticlesInstance> particles_instance_owner;
@@ -267,12 +254,10 @@ class RasterizerDummy : public Rasterizer {
struct Skeleton {
Vector<Transform> bones;
-
};
mutable RID_Owner<Skeleton> skeleton_owner;
-
struct Light {
VS::LightType type;
@@ -283,27 +268,24 @@ class RasterizerDummy : public Rasterizer {
bool volumetric_enabled;
Color volumetric_color;
-
Light() {
- vars[VS::LIGHT_PARAM_SPOT_ATTENUATION]=1;
- vars[VS::LIGHT_PARAM_SPOT_ANGLE]=45;
- vars[VS::LIGHT_PARAM_ATTENUATION]=1.0;
- vars[VS::LIGHT_PARAM_ENERGY]=1.0;
- vars[VS::LIGHT_PARAM_RADIUS]=1.0;
- vars[VS::LIGHT_PARAM_SHADOW_Z_OFFSET]=0.05;
+ vars[VS::LIGHT_PARAM_SPOT_ATTENUATION] = 1;
+ vars[VS::LIGHT_PARAM_SPOT_ANGLE] = 45;
+ vars[VS::LIGHT_PARAM_ATTENUATION] = 1.0;
+ vars[VS::LIGHT_PARAM_ENERGY] = 1.0;
+ vars[VS::LIGHT_PARAM_RADIUS] = 1.0;
+ vars[VS::LIGHT_PARAM_SHADOW_Z_OFFSET] = 0.05;
- colors[VS::LIGHT_COLOR_DIFFUSE]=Color(1,1,1);
- colors[VS::LIGHT_COLOR_SPECULAR]=Color(1,1,1);
- shadow_enabled=false;
- volumetric_enabled=false;
+ colors[VS::LIGHT_COLOR_DIFFUSE] = Color(1, 1, 1);
+ colors[VS::LIGHT_COLOR_SPECULAR] = Color(1, 1, 1);
+ shadow_enabled = false;
+ volumetric_enabled = false;
}
};
-
struct Environment {
-
VS::EnvironmentBG bg_mode;
Variant bg_param[VS::ENV_BG_PARAM_MAX];
bool fx_enabled[VS::ENV_FX_MAX];
@@ -311,47 +293,44 @@ class RasterizerDummy : public Rasterizer {
Environment() {
- bg_mode=VS::ENV_BG_DEFAULT_COLOR;
- bg_param[VS::ENV_BG_PARAM_COLOR]=Color(0,0,0);
- bg_param[VS::ENV_BG_PARAM_TEXTURE]=RID();
- bg_param[VS::ENV_BG_PARAM_CUBEMAP]=RID();
- bg_param[VS::ENV_BG_PARAM_ENERGY]=1.0;
-
- for(int i=0;i<VS::ENV_FX_MAX;i++)
- fx_enabled[i]=false;
-
- fx_param[VS::ENV_FX_PARAM_GLOW_BLUR_PASSES]=1;
- fx_param[VS::ENV_FX_PARAM_GLOW_BLOOM]=0.0;
- fx_param[VS::ENV_FX_PARAM_GLOW_BLOOM_TRESHOLD]=0.5;
- fx_param[VS::ENV_FX_PARAM_DOF_BLUR_PASSES]=1;
- fx_param[VS::ENV_FX_PARAM_DOF_BLUR_BEGIN]=100.0;
- fx_param[VS::ENV_FX_PARAM_DOF_BLUR_RANGE]=10.0;
- fx_param[VS::ENV_FX_PARAM_HDR_EXPOSURE]=0.4;
- fx_param[VS::ENV_FX_PARAM_HDR_WHITE]=1.0;
- fx_param[VS::ENV_FX_PARAM_HDR_GLOW_TRESHOLD]=0.95;
- fx_param[VS::ENV_FX_PARAM_HDR_GLOW_SCALE]=0.2;
- fx_param[VS::ENV_FX_PARAM_HDR_MIN_LUMINANCE]=0.4;
- fx_param[VS::ENV_FX_PARAM_HDR_MAX_LUMINANCE]=8.0;
- fx_param[VS::ENV_FX_PARAM_HDR_EXPOSURE_ADJUST_SPEED]=0.5;
- fx_param[VS::ENV_FX_PARAM_FOG_BEGIN]=100.0;
- fx_param[VS::ENV_FX_PARAM_FOG_ATTENUATION]=1.0;
- fx_param[VS::ENV_FX_PARAM_FOG_BEGIN_COLOR]=Color(0,0,0);
- fx_param[VS::ENV_FX_PARAM_FOG_END_COLOR]=Color(0,0,0);
- fx_param[VS::ENV_FX_PARAM_FOG_BG]=true;
- fx_param[VS::ENV_FX_PARAM_BCS_BRIGHTNESS]=1.0;
- fx_param[VS::ENV_FX_PARAM_BCS_CONTRAST]=1.0;
- fx_param[VS::ENV_FX_PARAM_BCS_SATURATION]=1.0;
+ bg_mode = VS::ENV_BG_DEFAULT_COLOR;
+ bg_param[VS::ENV_BG_PARAM_COLOR] = Color(0, 0, 0);
+ bg_param[VS::ENV_BG_PARAM_TEXTURE] = RID();
+ bg_param[VS::ENV_BG_PARAM_CUBEMAP] = RID();
+ bg_param[VS::ENV_BG_PARAM_ENERGY] = 1.0;
+ for (int i = 0; i < VS::ENV_FX_MAX; i++)
+ fx_enabled[i] = false;
+ fx_param[VS::ENV_FX_PARAM_GLOW_BLUR_PASSES] = 1;
+ fx_param[VS::ENV_FX_PARAM_GLOW_BLOOM] = 0.0;
+ fx_param[VS::ENV_FX_PARAM_GLOW_BLOOM_TRESHOLD] = 0.5;
+ fx_param[VS::ENV_FX_PARAM_DOF_BLUR_PASSES] = 1;
+ fx_param[VS::ENV_FX_PARAM_DOF_BLUR_BEGIN] = 100.0;
+ fx_param[VS::ENV_FX_PARAM_DOF_BLUR_RANGE] = 10.0;
+ fx_param[VS::ENV_FX_PARAM_HDR_EXPOSURE] = 0.4;
+ fx_param[VS::ENV_FX_PARAM_HDR_WHITE] = 1.0;
+ fx_param[VS::ENV_FX_PARAM_HDR_GLOW_TRESHOLD] = 0.95;
+ fx_param[VS::ENV_FX_PARAM_HDR_GLOW_SCALE] = 0.2;
+ fx_param[VS::ENV_FX_PARAM_HDR_MIN_LUMINANCE] = 0.4;
+ fx_param[VS::ENV_FX_PARAM_HDR_MAX_LUMINANCE] = 8.0;
+ fx_param[VS::ENV_FX_PARAM_HDR_EXPOSURE_ADJUST_SPEED] = 0.5;
+ fx_param[VS::ENV_FX_PARAM_FOG_BEGIN] = 100.0;
+ fx_param[VS::ENV_FX_PARAM_FOG_ATTENUATION] = 1.0;
+ fx_param[VS::ENV_FX_PARAM_FOG_BEGIN_COLOR] = Color(0, 0, 0);
+ fx_param[VS::ENV_FX_PARAM_FOG_END_COLOR] = Color(0, 0, 0);
+ fx_param[VS::ENV_FX_PARAM_FOG_BG] = true;
+ fx_param[VS::ENV_FX_PARAM_BCS_BRIGHTNESS] = 1.0;
+ fx_param[VS::ENV_FX_PARAM_BCS_CONTRAST] = 1.0;
+ fx_param[VS::ENV_FX_PARAM_BCS_SATURATION] = 1.0;
}
-
};
mutable RID_Owner<Environment> environment_owner;
struct SampledLight {
- int w,h;
+ int w, h;
};
mutable RID_Owner<SampledLight> sampled_light_owner;
@@ -380,38 +359,31 @@ class RasterizerDummy : public Rasterizer {
Vector3 spot_vector;
float linear_att;
-
- LightInstance() { linear_att=1.0; }
-
+ LightInstance() { linear_att = 1.0; }
};
mutable RID_Owner<Light> light_owner;
mutable RID_Owner<LightInstance> light_instance_owner;
-
RID default_material;
-
-
-
public:
-
/* TEXTURE API */
virtual RID texture_create();
- virtual void texture_allocate(RID p_texture,int p_width, int p_height,Image::Format p_format,uint32_t p_flags=VS::TEXTURE_FLAGS_DEFAULT);
- virtual void texture_set_data(RID p_texture,const Image& p_image,VS::CubeMapSide p_cube_side=VS::CUBEMAP_LEFT);
- virtual Image texture_get_data(RID p_texture,VS::CubeMapSide p_cube_side=VS::CUBEMAP_LEFT) const;
- virtual void texture_set_flags(RID p_texture,uint32_t p_flags);
+ virtual void texture_allocate(RID p_texture, int p_width, int p_height, Image::Format p_format, uint32_t p_flags = VS::TEXTURE_FLAGS_DEFAULT);
+ virtual void texture_set_data(RID p_texture, const Image &p_image, VS::CubeMapSide p_cube_side = VS::CUBEMAP_LEFT);
+ virtual Image texture_get_data(RID p_texture, VS::CubeMapSide p_cube_side = VS::CUBEMAP_LEFT) const;
+ virtual void texture_set_flags(RID p_texture, uint32_t p_flags);
virtual uint32_t texture_get_flags(RID p_texture) const;
virtual Image::Format texture_get_format(RID p_texture) const;
virtual uint32_t texture_get_width(RID p_texture) const;
virtual uint32_t texture_get_height(RID p_texture) const;
virtual bool texture_has_alpha(RID p_texture) const;
- virtual void texture_set_size_override(RID p_texture,int p_width, int p_height);
- virtual void texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const;
+ virtual void texture_set_size_override(RID p_texture, int p_width, int p_height);
+ virtual void texture_set_reload_hook(RID p_texture, ObjectID p_owner, const StringName &p_function) const;
- virtual void texture_set_path(RID p_texture,const String& p_path) {}
+ virtual void texture_set_path(RID p_texture, const String &p_path) {}
virtual String texture_get_path(RID p_texture) const { return String(); }
virtual void texture_debug_usage(List<VS::TextureInfo> *r_info) {}
@@ -419,23 +391,22 @@ public:
/* SHADER API */
- virtual RID shader_create(VS::ShaderMode p_mode=VS::SHADER_MATERIAL);
+ virtual RID shader_create(VS::ShaderMode p_mode = VS::SHADER_MATERIAL);
- virtual void shader_set_mode(RID p_shader,VS::ShaderMode p_mode);
+ virtual void shader_set_mode(RID p_shader, VS::ShaderMode p_mode);
virtual VS::ShaderMode shader_get_mode(RID p_shader) const;
- virtual void shader_set_code(RID p_shader, const String& p_vertex, const String& p_fragment,const String& p_light,int p_vertex_ofs=0,int p_fragment_ofs=0,int p_light_ofs=0);
+ virtual void shader_set_code(RID p_shader, const String &p_vertex, const String &p_fragment, const String &p_light, int p_vertex_ofs = 0, int p_fragment_ofs = 0, int p_light_ofs = 0);
virtual String shader_get_fragment_code(RID p_shader) const;
virtual String shader_get_vertex_code(RID p_shader) const;
virtual String shader_get_light_code(RID p_shader) const;
virtual void shader_get_param_list(RID p_shader, List<PropertyInfo> *p_param_list) const;
+ virtual void shader_set_default_texture_param(RID p_shader, const StringName &p_name, RID p_texture);
+ virtual RID shader_get_default_texture_param(RID p_shader, const StringName &p_name) const;
- virtual void shader_set_default_texture_param(RID p_shader, const StringName& p_name, RID p_texture);
- virtual RID shader_get_default_texture_param(RID p_shader, const StringName& p_name) const;
-
- virtual Variant shader_get_default_param(RID p_shader, const StringName& p_name);
+ virtual Variant shader_get_default_param(RID p_shader, const StringName &p_name);
/* COMMON MATERIAL API */
@@ -444,38 +415,37 @@ public:
virtual void material_set_shader(RID p_shader_material, RID p_shader);
virtual RID material_get_shader(RID p_shader_material) const;
- virtual void material_set_param(RID p_material, const StringName& p_param, const Variant& p_value);
- virtual Variant material_get_param(RID p_material, const StringName& p_param) const;
+ virtual void material_set_param(RID p_material, const StringName &p_param, const Variant &p_value);
+ virtual Variant material_get_param(RID p_material, const StringName &p_param) const;
- virtual void material_set_flag(RID p_material, VS::MaterialFlag p_flag,bool p_enabled);
- virtual bool material_get_flag(RID p_material,VS::MaterialFlag p_flag) const;
+ virtual void material_set_flag(RID p_material, VS::MaterialFlag p_flag, bool p_enabled);
+ virtual bool material_get_flag(RID p_material, VS::MaterialFlag p_flag) const;
virtual void material_set_depth_draw_mode(RID p_material, VS::MaterialDepthDrawMode p_mode);
virtual VS::MaterialDepthDrawMode material_get_depth_draw_mode(RID p_material) const;
- virtual void material_set_blend_mode(RID p_material,VS::MaterialBlendMode p_mode);
+ virtual void material_set_blend_mode(RID p_material, VS::MaterialBlendMode p_mode);
virtual VS::MaterialBlendMode material_get_blend_mode(RID p_material) const;
- virtual void material_set_line_width(RID p_material,float p_line_width);
+ virtual void material_set_line_width(RID p_material, float p_line_width);
virtual float material_get_line_width(RID p_material) const;
/* MESH API */
-
virtual RID mesh_create();
- virtual void mesh_add_surface(RID p_mesh,VS::PrimitiveType p_primitive,const Array& p_arrays,const Array& p_blend_shapes=Array(),bool p_alpha_sort=false);
- virtual Array mesh_get_surface_arrays(RID p_mesh,int p_surface) const;
- virtual Array mesh_get_surface_morph_arrays(RID p_mesh,int p_surface) const;
- virtual void mesh_add_custom_surface(RID p_mesh,const Variant& p_dat);
+ virtual void mesh_add_surface(RID p_mesh, VS::PrimitiveType p_primitive, const Array &p_arrays, const Array &p_blend_shapes = Array(), bool p_alpha_sort = false);
+ virtual Array mesh_get_surface_arrays(RID p_mesh, int p_surface) const;
+ virtual Array mesh_get_surface_morph_arrays(RID p_mesh, int p_surface) const;
+ virtual void mesh_add_custom_surface(RID p_mesh, const Variant &p_dat);
- virtual void mesh_set_morph_target_count(RID p_mesh,int p_amount);
+ virtual void mesh_set_morph_target_count(RID p_mesh, int p_amount);
virtual int mesh_get_morph_target_count(RID p_mesh) const;
- virtual void mesh_set_morph_target_mode(RID p_mesh,VS::MorphTargetMode p_mode);
+ virtual void mesh_set_morph_target_mode(RID p_mesh, VS::MorphTargetMode p_mode);
virtual VS::MorphTargetMode mesh_get_morph_target_mode(RID p_mesh) const;
- virtual void mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material,bool p_owned=false);
+ virtual void mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material, bool p_owned = false);
virtual RID mesh_surface_get_material(RID p_mesh, int p_surface) const;
virtual int mesh_surface_get_array_len(RID p_mesh, int p_surface) const;
@@ -483,49 +453,49 @@ public:
virtual uint32_t mesh_surface_get_format(RID p_mesh, int p_surface) const;
virtual VS::PrimitiveType mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const;
- virtual void mesh_remove_surface(RID p_mesh,int p_index);
+ virtual void mesh_remove_surface(RID p_mesh, int p_index);
virtual int mesh_get_surface_count(RID p_mesh) const;
- virtual AABB mesh_get_aabb(RID p_mesh,RID p_skeleton=RID()) const;
+ virtual AABB mesh_get_aabb(RID p_mesh, RID p_skeleton = RID()) const;
- virtual void mesh_set_custom_aabb(RID p_mesh,const AABB& p_aabb);
+ virtual void mesh_set_custom_aabb(RID p_mesh, const AABB &p_aabb);
virtual AABB mesh_get_custom_aabb(RID p_mesh) const;
-
/* MULTIMESH API */
virtual RID multimesh_create();
- virtual void multimesh_set_instance_count(RID p_multimesh,int p_count);
+ virtual void multimesh_set_instance_count(RID p_multimesh, int p_count);
virtual int multimesh_get_instance_count(RID p_multimesh) const;
- virtual void multimesh_set_mesh(RID p_multimesh,RID p_mesh);
- virtual void multimesh_set_aabb(RID p_multimesh,const AABB& p_aabb);
- virtual void multimesh_instance_set_transform(RID p_multimesh,int p_index,const Transform& p_transform);
- virtual void multimesh_instance_set_color(RID p_multimesh,int p_index,const Color& p_color);
+ virtual void multimesh_set_mesh(RID p_multimesh, RID p_mesh);
+ virtual void multimesh_set_aabb(RID p_multimesh, const AABB &p_aabb);
+ virtual void multimesh_instance_set_transform(RID p_multimesh, int p_index, const Transform &p_transform);
+ virtual void multimesh_instance_set_color(RID p_multimesh, int p_index, const Color &p_color);
virtual RID multimesh_get_mesh(RID p_multimesh) const;
- virtual AABB multimesh_get_aabb(RID p_multimesh) const;;
+ virtual AABB multimesh_get_aabb(RID p_multimesh) const;
+ ;
- virtual Transform multimesh_instance_get_transform(RID p_multimesh,int p_index) const;
- virtual Color multimesh_instance_get_color(RID p_multimesh,int p_index) const;
+ virtual Transform multimesh_instance_get_transform(RID p_multimesh, int p_index) const;
+ virtual Color multimesh_instance_get_color(RID p_multimesh, int p_index) const;
- virtual void multimesh_set_visible_instances(RID p_multimesh,int p_visible);
+ virtual void multimesh_set_visible_instances(RID p_multimesh, int p_visible);
virtual int multimesh_get_visible_instances(RID p_multimesh) const;
/* IMMEDIATE API */
virtual RID immediate_create();
- virtual void immediate_begin(RID p_immediate,VS::PrimitiveType p_rimitive,RID p_texture=RID());
- virtual void immediate_vertex(RID p_immediate,const Vector3& p_vertex);
- virtual void immediate_normal(RID p_immediate,const Vector3& p_normal);
- virtual void immediate_tangent(RID p_immediate,const Plane& p_tangent);
- virtual void immediate_color(RID p_immediate,const Color& p_color);
- virtual void immediate_uv(RID p_immediate,const Vector2& tex_uv);
- virtual void immediate_uv2(RID p_immediate,const Vector2& tex_uv);
+ virtual void immediate_begin(RID p_immediate, VS::PrimitiveType p_rimitive, RID p_texture = RID());
+ virtual void immediate_vertex(RID p_immediate, const Vector3 &p_vertex);
+ virtual void immediate_normal(RID p_immediate, const Vector3 &p_normal);
+ virtual void immediate_tangent(RID p_immediate, const Plane &p_tangent);
+ virtual void immediate_color(RID p_immediate, const Color &p_color);
+ virtual void immediate_uv(RID p_immediate, const Vector2 &tex_uv);
+ virtual void immediate_uv2(RID p_immediate, const Vector2 &tex_uv);
virtual void immediate_end(RID p_immediate);
virtual void immediate_clear(RID p_immediate);
- virtual void immediate_set_material(RID p_immediate,RID p_material);
+ virtual void immediate_set_material(RID p_immediate, RID p_material);
virtual RID immediate_get_material(RID p_immediate) const;
virtual AABB immediate_get_aabb(RID p_mesh) const;
@@ -540,25 +510,25 @@ public:
virtual void particles_set_emitting(RID p_particles, bool p_emitting);
virtual bool particles_is_emitting(RID p_particles) const;
- virtual void particles_set_visibility_aabb(RID p_particles, const AABB& p_visibility);
+ virtual void particles_set_visibility_aabb(RID p_particles, const AABB &p_visibility);
virtual AABB particles_get_visibility_aabb(RID p_particles) const;
- virtual void particles_set_emission_half_extents(RID p_particles, const Vector3& p_half_extents);
+ virtual void particles_set_emission_half_extents(RID p_particles, const Vector3 &p_half_extents);
virtual Vector3 particles_get_emission_half_extents(RID p_particles) const;
- virtual void particles_set_emission_base_velocity(RID p_particles, const Vector3& p_base_velocity);
+ virtual void particles_set_emission_base_velocity(RID p_particles, const Vector3 &p_base_velocity);
virtual Vector3 particles_get_emission_base_velocity(RID p_particles) const;
- virtual void particles_set_emission_points(RID p_particles, const DVector<Vector3>& p_points);
+ virtual void particles_set_emission_points(RID p_particles, const DVector<Vector3> &p_points);
virtual DVector<Vector3> particles_get_emission_points(RID p_particles) const;
- virtual void particles_set_gravity_normal(RID p_particles, const Vector3& p_normal);
+ virtual void particles_set_gravity_normal(RID p_particles, const Vector3 &p_normal);
virtual Vector3 particles_get_gravity_normal(RID p_particles) const;
- virtual void particles_set_variable(RID p_particles, VS::ParticleVariable p_variable,float p_value);
+ virtual void particles_set_variable(RID p_particles, VS::ParticleVariable p_variable, float p_value);
virtual float particles_get_variable(RID p_particles, VS::ParticleVariable p_variable) const;
- virtual void particles_set_randomness(RID p_particles, VS::ParticleVariable p_variable,float p_randomness);
+ virtual void particles_set_randomness(RID p_particles, VS::ParticleVariable p_variable, float p_randomness);
virtual float particles_get_randomness(RID p_particles, VS::ParticleVariable p_variable) const;
virtual void particles_set_color_phase_pos(RID p_particles, int p_phase, float p_pos);
@@ -567,19 +537,19 @@ public:
virtual void particles_set_color_phases(RID p_particles, int p_phases);
virtual int particles_get_color_phases(RID p_particles) const;
- virtual void particles_set_color_phase_color(RID p_particles, int p_phase, const Color& p_color);
+ virtual void particles_set_color_phase_color(RID p_particles, int p_phase, const Color &p_color);
virtual Color particles_get_color_phase_color(RID p_particles, int p_phase) const;
virtual void particles_set_attractors(RID p_particles, int p_attractors);
virtual int particles_get_attractors(RID p_particles) const;
- virtual void particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3& p_pos);
- virtual Vector3 particles_get_attractor_pos(RID p_particles,int p_attractor) const;
+ virtual void particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3 &p_pos);
+ virtual Vector3 particles_get_attractor_pos(RID p_particles, int p_attractor) const;
virtual void particles_set_attractor_strength(RID p_particles, int p_attractor, float p_force);
- virtual float particles_get_attractor_strength(RID p_particles,int p_attractor) const;
+ virtual float particles_get_attractor_strength(RID p_particles, int p_attractor) const;
- virtual void particles_set_material(RID p_particles, RID p_material,bool p_owned=false);
+ virtual void particles_set_material(RID p_particles, RID p_material, bool p_owned = false);
virtual RID particles_get_material(RID p_particles) const;
virtual AABB particles_get_aabb(RID p_particles) const;
@@ -593,70 +563,66 @@ public:
/* SKELETON API */
virtual RID skeleton_create();
- virtual void skeleton_resize(RID p_skeleton,int p_bones);
+ virtual void skeleton_resize(RID p_skeleton, int p_bones);
virtual int skeleton_get_bone_count(RID p_skeleton) const;
- virtual void skeleton_bone_set_transform(RID p_skeleton,int p_bone, const Transform& p_transform);
- virtual Transform skeleton_bone_get_transform(RID p_skeleton,int p_bone);
-
+ virtual void skeleton_bone_set_transform(RID p_skeleton, int p_bone, const Transform &p_transform);
+ virtual Transform skeleton_bone_get_transform(RID p_skeleton, int p_bone);
/* LIGHT API */
virtual RID light_create(VS::LightType p_type);
virtual VS::LightType light_get_type(RID p_light) const;
- virtual void light_set_color(RID p_light,VS::LightColor p_type, const Color& p_color);
- virtual Color light_get_color(RID p_light,VS::LightColor p_type) const;
+ virtual void light_set_color(RID p_light, VS::LightColor p_type, const Color &p_color);
+ virtual Color light_get_color(RID p_light, VS::LightColor p_type) const;
- virtual void light_set_shadow(RID p_light,bool p_enabled);
+ virtual void light_set_shadow(RID p_light, bool p_enabled);
virtual bool light_has_shadow(RID p_light) const;
- virtual void light_set_volumetric(RID p_light,bool p_enabled);
+ virtual void light_set_volumetric(RID p_light, bool p_enabled);
virtual bool light_is_volumetric(RID p_light) const;
- virtual void light_set_projector(RID p_light,RID p_texture);
+ virtual void light_set_projector(RID p_light, RID p_texture);
virtual RID light_get_projector(RID p_light) const;
virtual void light_set_var(RID p_light, VS::LightParam p_var, float p_value);
virtual float light_get_var(RID p_light, VS::LightParam p_var) const;
- virtual void light_set_operator(RID p_light,VS::LightOp p_op);
+ virtual void light_set_operator(RID p_light, VS::LightOp p_op);
virtual VS::LightOp light_get_operator(RID p_light) const;
- virtual void light_omni_set_shadow_mode(RID p_light,VS::LightOmniShadowMode p_mode);
+ virtual void light_omni_set_shadow_mode(RID p_light, VS::LightOmniShadowMode p_mode);
virtual VS::LightOmniShadowMode light_omni_get_shadow_mode(RID p_light) const;
-
- virtual void light_directional_set_shadow_mode(RID p_light,VS::LightDirectionalShadowMode p_mode);
+ virtual void light_directional_set_shadow_mode(RID p_light, VS::LightDirectionalShadowMode p_mode);
virtual VS::LightDirectionalShadowMode light_directional_get_shadow_mode(RID p_light) const;
- virtual void light_directional_set_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param, float p_value);
- virtual float light_directional_get_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param) const;
+ virtual void light_directional_set_shadow_param(RID p_light, VS::LightDirectionalShadowParam p_param, float p_value);
+ virtual float light_directional_get_shadow_param(RID p_light, VS::LightDirectionalShadowParam p_param) const;
virtual AABB light_get_aabb(RID p_poly) const;
-
virtual RID light_instance_create(RID p_light);
- virtual void light_instance_set_transform(RID p_light_instance,const Transform& p_transform);
+ virtual void light_instance_set_transform(RID p_light_instance, const Transform &p_transform);
virtual bool light_instance_has_shadow(RID p_light_instance) const;
virtual bool light_instance_assign_shadow(RID p_light_instance);
virtual ShadowType light_instance_get_shadow_type(RID p_light_instance) const;
virtual int light_instance_get_shadow_passes(RID p_light_instance) const;
virtual bool light_instance_get_pssm_shadow_overlap(RID p_light_instance) const;
- virtual void light_instance_set_custom_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near=0,float p_split_far=0);
- virtual int light_instance_get_shadow_size(RID p_light_instance, int p_index=0) const { return 1; }
+ virtual void light_instance_set_custom_transform(RID p_light_instance, int p_index, const CameraMatrix &p_camera, const Transform &p_transform, float p_split_near = 0, float p_split_far = 0);
+ virtual int light_instance_get_shadow_size(RID p_light_instance, int p_index = 0) const { return 1; }
- virtual ShadowType light_instance_get_shadow_type(RID p_light_instance,bool p_far=false) const;
- virtual void light_instance_set_shadow_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near=0,float p_split_far=0);
+ virtual ShadowType light_instance_get_shadow_type(RID p_light_instance, bool p_far = false) const;
+ virtual void light_instance_set_shadow_transform(RID p_light_instance, int p_index, const CameraMatrix &p_camera, const Transform &p_transform, float p_split_near = 0, float p_split_far = 0);
virtual void shadow_clear_near();
virtual bool shadow_allocate_near(RID p_light);
virtual bool shadow_allocate_far(RID p_light);
-
/* PARTICLES INSTANCE */
virtual RID particles_instance_create(RID p_particles);
- virtual void particles_instance_set_transform(RID p_particles_instance,const Transform& p_transform);
+ virtual void particles_instance_set_transform(RID p_particles_instance, const Transform &p_transform);
/* VIEWPORT */
@@ -672,24 +638,22 @@ public:
virtual void begin_frame();
- virtual void set_viewport(const VS::ViewportRect& p_viewport);
- virtual void set_render_target(RID p_render_target,bool p_transparent_bg=false,bool p_vflip=false);
- virtual void clear_viewport(const Color& p_color);
- virtual void capture_viewport(Image* r_capture);
-
-
- virtual void begin_scene(RID p_viewport_data,RID p_env,VS::ScenarioDebugMode p_debug);
- virtual void begin_shadow_map( RID p_light_instance, int p_shadow_pass );
+ virtual void set_viewport(const VS::ViewportRect &p_viewport);
+ virtual void set_render_target(RID p_render_target, bool p_transparent_bg = false, bool p_vflip = false);
+ virtual void clear_viewport(const Color &p_color);
+ virtual void capture_viewport(Image *r_capture);
- virtual void set_camera(const Transform& p_world,const CameraMatrix& p_projection,bool p_ortho_hint);
+ virtual void begin_scene(RID p_viewport_data, RID p_env, VS::ScenarioDebugMode p_debug);
+ virtual void begin_shadow_map(RID p_light_instance, int p_shadow_pass);
- virtual void add_light( RID p_light_instance ); ///< all "add_light" calls happen before add_geometry calls
+ virtual void set_camera(const Transform &p_world, const CameraMatrix &p_projection, bool p_ortho_hint);
+ virtual void add_light(RID p_light_instance); ///< all "add_light" calls happen before add_geometry calls
- virtual void add_mesh( const RID& p_mesh, const InstanceData *p_data);
- virtual void add_multimesh( const RID& p_multimesh, const InstanceData *p_data);
- virtual void add_immediate( const RID& p_immediate, const InstanceData *p_data) {}
- virtual void add_particles( const RID& p_particle_instance, const InstanceData *p_data);
+ virtual void add_mesh(const RID &p_mesh, const InstanceData *p_data);
+ virtual void add_multimesh(const RID &p_multimesh, const InstanceData *p_data);
+ virtual void add_immediate(const RID &p_immediate, const InstanceData *p_data) {}
+ virtual void add_particles(const RID &p_particle_instance, const InstanceData *p_data);
virtual void end_scene();
virtual void end_shadow_map();
@@ -703,74 +667,72 @@ public:
virtual void canvas_disable_blending();
virtual void canvas_set_opacity(float p_opacity);
virtual void canvas_set_blend_mode(VS::MaterialBlendMode p_mode);
- virtual void canvas_begin_rect(const Matrix32& p_transform);
- virtual void canvas_set_clip(bool p_clip, const Rect2& p_rect);
+ virtual void canvas_begin_rect(const Matrix32 &p_transform);
+ virtual void canvas_set_clip(bool p_clip, const Rect2 &p_rect);
virtual void canvas_end_rect();
- virtual void canvas_draw_line(const Point2& p_from, const Point2& p_to,const Color& p_color,float p_width);
- virtual void canvas_draw_rect(const Rect2& p_rect, int p_flags, const Rect2& p_source,RID p_texture,const Color& p_modulate);
- virtual void canvas_draw_style_box(const Rect2& p_rect, const Rect2& p_src_region, RID p_texture,const float *p_margins, bool p_draw_center=true,const Color& p_modulate=Color(1,1,1));
- virtual void canvas_draw_primitive(const Vector<Point2>& p_points, const Vector<Color>& p_colors,const Vector<Point2>& p_uvs, RID p_texture,float p_width);
- virtual void canvas_draw_polygon(int p_vertex_count, const int* p_indices, const Vector2* p_vertices, const Vector2* p_uvs, const Color* p_colors,const RID& p_texture,bool p_singlecolor);
- virtual void canvas_set_transform(const Matrix32& p_transform);
+ virtual void canvas_draw_line(const Point2 &p_from, const Point2 &p_to, const Color &p_color, float p_width);
+ virtual void canvas_draw_rect(const Rect2 &p_rect, int p_flags, const Rect2 &p_source, RID p_texture, const Color &p_modulate);
+ virtual void canvas_draw_style_box(const Rect2 &p_rect, const Rect2 &p_src_region, RID p_texture, const float *p_margins, bool p_draw_center = true, const Color &p_modulate = Color(1, 1, 1));
+ virtual void canvas_draw_primitive(const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs, RID p_texture, float p_width);
+ virtual void canvas_draw_polygon(int p_vertex_count, const int *p_indices, const Vector2 *p_vertices, const Vector2 *p_uvs, const Color *p_colors, const RID &p_texture, bool p_singlecolor);
+ virtual void canvas_set_transform(const Matrix32 &p_transform);
- virtual void canvas_render_items(CanvasItem *p_item_list,int p_z,const Color& p_modulate,CanvasLight *p_light);
+ virtual void canvas_render_items(CanvasItem *p_item_list, int p_z, const Color &p_modulate, CanvasLight *p_light);
virtual RID canvas_light_occluder_create();
- virtual void canvas_light_occluder_set_polylines(RID p_occluder, const DVector<Vector2>& p_lines);
+ virtual void canvas_light_occluder_set_polylines(RID p_occluder, const DVector<Vector2> &p_lines);
virtual RID canvas_light_shadow_buffer_create(int p_width);
- virtual void canvas_light_shadow_buffer_update(RID p_buffer, const Matrix32& p_light_xform, int p_light_mask,float p_near, float p_far, CanvasLightOccluderInstance* p_occluders, CameraMatrix *p_xform_cache);
+ virtual void canvas_light_shadow_buffer_update(RID p_buffer, const Matrix32 &p_light_xform, int p_light_mask, float p_near, float p_far, CanvasLightOccluderInstance *p_occluders, CameraMatrix *p_xform_cache);
- virtual void canvas_debug_viewport_shadows(CanvasLight* p_lights_with_shadow);
+ virtual void canvas_debug_viewport_shadows(CanvasLight *p_lights_with_shadow);
/* ENVIRONMENT */
virtual RID environment_create();
- virtual void environment_set_background(RID p_env,VS::EnvironmentBG p_bg);
+ virtual void environment_set_background(RID p_env, VS::EnvironmentBG p_bg);
virtual VS::EnvironmentBG environment_get_background(RID p_env) const;
- virtual void environment_set_background_param(RID p_env,VS::EnvironmentBGParam p_param, const Variant& p_value);
- virtual Variant environment_get_background_param(RID p_env,VS::EnvironmentBGParam p_param) const;
+ virtual void environment_set_background_param(RID p_env, VS::EnvironmentBGParam p_param, const Variant &p_value);
+ virtual Variant environment_get_background_param(RID p_env, VS::EnvironmentBGParam p_param) const;
- virtual void environment_set_enable_fx(RID p_env,VS::EnvironmentFx p_effect,bool p_enabled);
- virtual bool environment_is_fx_enabled(RID p_env,VS::EnvironmentFx p_effect) const;
+ virtual void environment_set_enable_fx(RID p_env, VS::EnvironmentFx p_effect, bool p_enabled);
+ virtual bool environment_is_fx_enabled(RID p_env, VS::EnvironmentFx p_effect) const;
- virtual void environment_fx_set_param(RID p_env,VS::EnvironmentFxParam p_param,const Variant& p_value);
- virtual Variant environment_fx_get_param(RID p_env,VS::EnvironmentFxParam p_param) const;
+ virtual void environment_fx_set_param(RID p_env, VS::EnvironmentFxParam p_param, const Variant &p_value);
+ virtual Variant environment_fx_get_param(RID p_env, VS::EnvironmentFxParam p_param) const;
/* SAMPLED LIGHT */
- virtual RID sampled_light_dp_create(int p_width,int p_height);
- virtual void sampled_light_dp_update(RID p_sampled_light,const Color *p_data,float p_multiplier);
-
+ virtual RID sampled_light_dp_create(int p_width, int p_height);
+ virtual void sampled_light_dp_update(RID p_sampled_light, const Color *p_data, float p_multiplier);
/*MISC*/
- virtual bool is_texture(const RID& p_rid) const;
- virtual bool is_material(const RID& p_rid) const;
- virtual bool is_mesh(const RID& p_rid) const;
- virtual bool is_immediate(const RID& p_rid) const;
- virtual bool is_multimesh(const RID& p_rid) const;
+ virtual bool is_texture(const RID &p_rid) const;
+ virtual bool is_material(const RID &p_rid) const;
+ virtual bool is_mesh(const RID &p_rid) const;
+ virtual bool is_immediate(const RID &p_rid) const;
+ virtual bool is_multimesh(const RID &p_rid) const;
virtual bool is_particles(const RID &p_beam) const;
- virtual bool is_light(const RID& p_rid) const;
- virtual bool is_light_instance(const RID& p_rid) const;
- virtual bool is_particles_instance(const RID& p_rid) const;
- virtual bool is_skeleton(const RID& p_rid) const;
- virtual bool is_environment(const RID& p_rid) const;
- virtual bool is_canvas_light_occluder(const RID& p_rid) const;
+ virtual bool is_light(const RID &p_rid) const;
+ virtual bool is_light_instance(const RID &p_rid) const;
+ virtual bool is_particles_instance(const RID &p_rid) const;
+ virtual bool is_skeleton(const RID &p_rid) const;
+ virtual bool is_environment(const RID &p_rid) const;
+ virtual bool is_canvas_light_occluder(const RID &p_rid) const;
- virtual bool is_shader(const RID& p_rid) const;
+ virtual bool is_shader(const RID &p_rid) const;
- virtual void free(const RID& p_rid);
+ virtual void free(const RID &p_rid);
virtual void custom_shade_model_set_shader(int p_model, RID p_shader);
virtual RID custom_shade_model_get_shader(int p_model) const;
- virtual void custom_shade_model_set_name(int p_model, const String& p_name);
+ virtual void custom_shade_model_set_name(int p_model, const String &p_name);
virtual String custom_shade_model_get_name(int p_model) const;
- virtual void custom_shade_model_set_param_info(int p_model, const List<PropertyInfo>& p_info);
- virtual void custom_shade_model_get_param_info(int p_model, List<PropertyInfo>* p_info) const;
-
+ virtual void custom_shade_model_set_param_info(int p_model, const List<PropertyInfo> &p_info);
+ virtual void custom_shade_model_get_param_info(int p_model, List<PropertyInfo> *p_info) const;
virtual void init();
virtual void finish();
@@ -787,5 +749,4 @@ public:
virtual ~RasterizerDummy();
};
-
#endif // RASTERIZER_DUMMY_H
diff --git a/servers/visual/shader_language.cpp b/servers/visual/shader_language.cpp
index 0c224ea71..a0a370f42 100644
--- a/servers/visual/shader_language.cpp
+++ b/servers/visual/shader_language.cpp
@@ -27,24 +27,24 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include "shader_language.h"
-#include "print_string.h"
#include "os/os.h"
+#include "print_string.h"
static bool _is_text_char(CharType c) {
- return (c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9') || c=='_';
+ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_';
}
static bool _is_number(CharType c) {
- return (c>='0' && c<='9');
+ return (c >= '0' && c <= '9');
}
static bool _is_hex(CharType c) {
- return (c>='0' && c<='9') || (c>='a' && c<='f') || (c>='A' && c<='F');
+ return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');
}
-const char * ShaderLanguage::token_names[TK_MAX]={
+const char *ShaderLanguage::token_names[TK_MAX] = {
"EMPTY",
"INDENTIFIER",
"TRUE",
@@ -97,12 +97,12 @@ const char * ShaderLanguage::token_names[TK_MAX]={
"ERROR",
};
-ShaderLanguage::Token ShaderLanguage::read_token(const CharType* p_text,int p_len,int &r_line,int &r_chars) {
+ShaderLanguage::Token ShaderLanguage::read_token(const CharType *p_text, int p_len, int &r_line, int &r_chars) {
-#define GETCHAR(m_idx) ((m_idx<p_len)?p_text[m_idx]:CharType(0))
+#define GETCHAR(m_idx) ((m_idx < p_len) ? p_text[m_idx] : CharType(0))
- r_chars=1; //by default everything eats one char
- switch(GETCHAR(0)) {
+ r_chars = 1; //by default everything eats one char
+ switch (GETCHAR(0)) {
case '\t':
case '\r':
@@ -113,18 +113,19 @@ ShaderLanguage::Token ShaderLanguage::read_token(const CharType* p_text,int p_le
return Token();
case '/': {
- switch(GETCHAR(1)) {
+ switch (GETCHAR(1)) {
case '*': { // block comment
-
- while(true) {
- if (GETCHAR(r_chars+1)==0) {
- r_chars+=1;
+ while (true) {
+ if (GETCHAR(r_chars + 1) == 0) {
+ r_chars += 1;
break;
- } if (GETCHAR(r_chars+1)=='*' && GETCHAR(r_chars+2)=='/') {
- r_chars+=3;
+ }
+ if (GETCHAR(r_chars + 1) == '*' && GETCHAR(r_chars + 2) == '/') {
+ r_chars += 3;
break;
- } if (GETCHAR(r_chars+1)=='\n') {
+ }
+ if (GETCHAR(r_chars + 1) == '\n') {
r_line++;
}
@@ -136,8 +137,8 @@ ShaderLanguage::Token ShaderLanguage::read_token(const CharType* p_text,int p_le
} break;
case '/': { // line comment skip
- while(GETCHAR(r_chars+1)!='\n' && GETCHAR(r_chars+1)!=0) {
- r_chars++;
+ while (GETCHAR(r_chars + 1) != '\n' && GETCHAR(r_chars + 1) != 0) {
+ r_chars++;
}
r_chars++;
//r_line++;
@@ -147,17 +148,16 @@ ShaderLanguage::Token ShaderLanguage::read_token(const CharType* p_text,int p_le
} break;
case '=': { // diveq
- r_chars=2;
+ r_chars = 2;
return Token(TK_OP_ASSIGN_DIV);
} break;
default:
return Token(TK_OP_DIV);
-
}
} break;
case '=': {
- if (GETCHAR(1)=='=') {
+ if (GETCHAR(1) == '=') {
r_chars++;
return Token(TK_OP_EQUAL);
}
@@ -166,7 +166,7 @@ ShaderLanguage::Token ShaderLanguage::read_token(const CharType* p_text,int p_le
} break;
case '<': {
- if (GETCHAR(1)=='=') {
+ if (GETCHAR(1) == '=') {
r_chars++;
return Token(TK_OP_LESS_EQUAL);
} /*else if (GETCHAR(1)=='<') {
@@ -183,10 +183,10 @@ ShaderLanguage::Token ShaderLanguage::read_token(const CharType* p_text,int p_le
} break;
case '>': {
- if (GETCHAR(1)=='=') {
+ if (GETCHAR(1) == '=') {
r_chars++;
return Token(TK_OP_GREATER_EQUAL);
- }/* else if (GETCHAR(1)=='<') {
+ } /* else if (GETCHAR(1)=='<') {
r_chars++;
if (GETCHAR(2)=='=') {
r_chars++;
@@ -200,7 +200,7 @@ ShaderLanguage::Token ShaderLanguage::read_token(const CharType* p_text,int p_le
} break;
case '!': {
- if (GETCHAR(1)=='=') {
+ if (GETCHAR(1) == '=') {
r_chars++;
return Token(TK_OP_NOT_EQUAL);
}
@@ -217,7 +217,7 @@ ShaderLanguage::Token ShaderLanguage::read_token(const CharType* p_text,int p_le
//case '[':
// return Token(TK_BRACKET_OPEN);
//case ']':
- // return Token(TK_BRACKET_CLOSE);
+ // return Token(TK_BRACKET_CLOSE);
case '(':
return Token(TK_PARENTHESIS_OPEN);
case ')':
@@ -233,18 +233,18 @@ ShaderLanguage::Token ShaderLanguage::read_token(const CharType* p_text,int p_le
//case '^':
// return Token(TK_OP_BIT_XOR);
//case '~':
- // return Token(TK_OP_BIT_INVERT);
+ // return Token(TK_OP_BIT_INVERT);
case '&': {
- if (GETCHAR(1)=='&') {
+ if (GETCHAR(1) == '&') {
r_chars++;
return Token(TK_OP_AND);
}
- return Token(TK_ERROR,"Unknown character");
+ return Token(TK_ERROR, "Unknown character");
-/*
+ /*
if (GETCHAR(1)=='=') {
r_chars++;
return Token(TK_OP_ASSIGN_BIT_AND);
@@ -256,13 +256,13 @@ ShaderLanguage::Token ShaderLanguage::read_token(const CharType* p_text,int p_le
} break;
case '|': {
- if (GETCHAR(1)=='|') {
+ if (GETCHAR(1) == '|') {
r_chars++;
return Token(TK_OP_OR);
}
- return Token(TK_ERROR,"Unknown character");
+ return Token(TK_ERROR, "Unknown character");
/*
if (GETCHAR(1)=='=') {
@@ -277,7 +277,7 @@ ShaderLanguage::Token ShaderLanguage::read_token(const CharType* p_text,int p_le
} break;
case '*': {
- if (GETCHAR(1)=='=') {
+ if (GETCHAR(1) == '=') {
r_chars++;
return Token(TK_OP_ASSIGN_MUL);
}
@@ -285,10 +285,10 @@ ShaderLanguage::Token ShaderLanguage::read_token(const CharType* p_text,int p_le
} break;
case '+': {
- if (GETCHAR(1)=='=') {
+ if (GETCHAR(1) == '=') {
r_chars++;
return Token(TK_OP_ASSIGN_ADD);
- } /*else if (GETCHAR(1)=='+') {
+ } /*else if (GETCHAR(1)=='+') {
r_chars++;
return Token(TK_OP_PLUS_PLUS);
@@ -298,10 +298,10 @@ ShaderLanguage::Token ShaderLanguage::read_token(const CharType* p_text,int p_le
} break;
case '-': {
- if (GETCHAR(1)=='=') {
+ if (GETCHAR(1) == '=') {
r_chars++;
return Token(TK_OP_ASSIGN_SUB);
- }/* else if (GETCHAR(1)=='-') {
+ } /* else if (GETCHAR(1)=='-') {
r_chars++;
return Token(TK_OP_MINUS_MINUS);
@@ -320,58 +320,57 @@ ShaderLanguage::Token ShaderLanguage::read_token(const CharType* p_text,int p_le
} break;*/
default: {
- if (_is_number(GETCHAR(0)) || (GETCHAR(0)=='.' && _is_number(GETCHAR(1)))) {
+ if (_is_number(GETCHAR(0)) || (GETCHAR(0) == '.' && _is_number(GETCHAR(1)))) {
// parse number
- bool period_found=false;
- bool exponent_found=false;
- bool hexa_found=false;
- bool sign_found=false;
+ bool period_found = false;
+ bool exponent_found = false;
+ bool hexa_found = false;
+ bool sign_found = false;
String str;
- int i=0;
+ int i = 0;
- while(true) {
- if (GETCHAR(i)=='.') {
+ while (true) {
+ if (GETCHAR(i) == '.') {
if (period_found || exponent_found)
- return Token(TK_ERROR,"Invalid numeric constant");
- period_found=true;
- } else if (GETCHAR(i)=='x') {
- if (hexa_found || str.length()!=1 || str[0]!='0')
- return Token(TK_ERROR,"Invalid numeric constant");
- hexa_found=true;
- } else if (GETCHAR(i)=='e') {
+ return Token(TK_ERROR, "Invalid numeric constant");
+ period_found = true;
+ } else if (GETCHAR(i) == 'x') {
+ if (hexa_found || str.length() != 1 || str[0] != '0')
+ return Token(TK_ERROR, "Invalid numeric constant");
+ hexa_found = true;
+ } else if (GETCHAR(i) == 'e') {
if (hexa_found || exponent_found)
- return Token(TK_ERROR,"Invalid numeric constant");
- exponent_found=true;
+ return Token(TK_ERROR, "Invalid numeric constant");
+ exponent_found = true;
} else if (_is_number(GETCHAR(i))) {
//all ok
} else if (hexa_found && _is_hex(GETCHAR(i))) {
- } else if ((GETCHAR(i)=='-' || GETCHAR(i)=='+') && exponent_found) {
+ } else if ((GETCHAR(i) == '-' || GETCHAR(i) == '+') && exponent_found) {
if (sign_found)
- return Token(TK_ERROR,"Invalid numeric constant");
- sign_found=true;
+ return Token(TK_ERROR, "Invalid numeric constant");
+ sign_found = true;
} else
break;
- str+=CharType(GETCHAR(i));
+ str += CharType(GETCHAR(i));
i++;
}
- if (!_is_number(str[str.length()-1]))
- return Token(TK_ERROR,"Invalid numeric constant");
+ if (!_is_number(str[str.length() - 1]))
+ return Token(TK_ERROR, "Invalid numeric constant");
- r_chars+=str.length()-1;
- return Token(TK_REAL_CONSTANT,str);
+ r_chars += str.length() - 1;
+ return Token(TK_REAL_CONSTANT, str);
/*
if (period_found)
return Token(TK_NUMBER_REAL,str);
else
return Token(TK_NUMBER_INTEGER,str);*/
-
}
- if (GETCHAR(0)=='.') {
+ if (GETCHAR(0) == '.') {
//parse period
return Token(TK_PERIOD);
}
@@ -379,43 +378,46 @@ ShaderLanguage::Token ShaderLanguage::read_token(const CharType* p_text,int p_le
if (_is_text_char(GETCHAR(0))) {
// parse identifier
String str;
- str+=CharType(GETCHAR(0));
+ str += CharType(GETCHAR(0));
- while(_is_text_char(GETCHAR(r_chars))) {
+ while (_is_text_char(GETCHAR(r_chars))) {
- str+=CharType(GETCHAR(r_chars));
+ str += CharType(GETCHAR(r_chars));
r_chars++;
}
//see if keyword
- struct _kws { TokenType token; const char *text;};
- static const _kws keyword_list[]={
- {TK_TRUE,"true"},
- {TK_FALSE,"false"},
- {TK_TYPE_VOID,"void"},
- {TK_TYPE_BOOL,"bool"},
+ struct _kws {
+ TokenType token;
+ const char *text;
+ };
+ static const _kws keyword_list[] = {
+ { TK_TRUE, "true" },
+ { TK_FALSE, "false" },
+ { TK_TYPE_VOID, "void" },
+ { TK_TYPE_BOOL, "bool" },
/*{TK_TYPE_INT,"int"},
{TK_TYPE_INT2,"int2"},
{TK_TYPE_INT3,"int3"},
{TK_TYPE_INT4,"int4"},*/
- {TK_TYPE_FLOAT,"float"},
+ { TK_TYPE_FLOAT, "float" },
/*{TK_TYPE_FLOAT2,"float2"},
{TK_TYPE_FLOAT3,"float3"},
{TK_TYPE_FLOAT4,"float4"},*/
- {TK_TYPE_VEC2,"vec2"},
- {TK_TYPE_VEC3,"vec3"},
- {TK_TYPE_VEC4,"vec4"},
- {TK_TYPE_TEXTURE,"texture"},
- {TK_TYPE_CUBEMAP,"cubemap"},
- {TK_TYPE_COLOR,"color"},
+ { TK_TYPE_VEC2, "vec2" },
+ { TK_TYPE_VEC3, "vec3" },
+ { TK_TYPE_VEC4, "vec4" },
+ { TK_TYPE_TEXTURE, "texture" },
+ { TK_TYPE_CUBEMAP, "cubemap" },
+ { TK_TYPE_COLOR, "color" },
- {TK_TYPE_MAT2,"mat2"},
+ { TK_TYPE_MAT2, "mat2" },
/*{TK_TYPE_MAT3,"mat3"},
{TK_TYPE_MAT4,"mat3"},*/
- {TK_TYPE_MAT3,"mat3"},
- {TK_TYPE_MAT4,"mat4"},
- {TK_CF_IF,"if"},
- {TK_CF_ELSE,"else"},
+ { TK_TYPE_MAT3, "mat3" },
+ { TK_TYPE_MAT4, "mat4" },
+ { TK_CF_IF, "if" },
+ { TK_CF_ELSE, "else" },
/*
{TK_CF_FOR,"for"},
{TK_CF_WHILE,"while"},
@@ -423,28 +425,27 @@ ShaderLanguage::Token ShaderLanguage::read_token(const CharType* p_text,int p_le
{TK_CF_SWITCH,"switch"},
{TK_CF_BREAK,"break"},
{TK_CF_CONTINUE,"continue"},*/
- {TK_CF_RETURN,"return"},
- {TK_UNIFORM,"uniform"},
- {TK_ERROR,NULL}
+ { TK_CF_RETURN, "return" },
+ { TK_UNIFORM, "uniform" },
+ { TK_ERROR, NULL }
};
- int idx=0;
+ int idx = 0;
- while(keyword_list[idx].text) {
+ while (keyword_list[idx].text) {
- if (str==keyword_list[idx].text)
+ if (str == keyword_list[idx].text)
return Token(keyword_list[idx].token);
idx++;
}
-
- return Token(TK_INDENTIFIER,str);
+ return Token(TK_INDENTIFIER, str);
}
- if (GETCHAR(0)>32)
- return Token(TK_ERROR,"Tokenizer: Unknown character #"+itos(GETCHAR(0))+": '"+String::chr(GETCHAR(0))+"'");
+ if (GETCHAR(0) > 32)
+ return Token(TK_ERROR, "Tokenizer: Unknown character #" + itos(GETCHAR(0)) + ": '" + String::chr(GETCHAR(0)) + "'");
else
- return Token(TK_ERROR,"Tokenizer: Unknown character #"+itos(GETCHAR(0)));
+ return Token(TK_ERROR, "Tokenizer: Unknown character #" + itos(GETCHAR(0)));
} break;
}
@@ -453,88 +454,82 @@ ShaderLanguage::Token ShaderLanguage::read_token(const CharType* p_text,int p_le
return Token();
}
-Error ShaderLanguage::tokenize(const String& p_text,Vector<Token> *p_tokens,String *r_error,int *r_err_line,int *r_err_column) {
+Error ShaderLanguage::tokenize(const String &p_text, Vector<Token> *p_tokens, String *r_error, int *r_err_line, int *r_err_column) {
+ int len = p_text.length();
+ int pos = 0;
- int len =p_text.length();
- int pos=0;
+ int line = 0;
+ int col = 0;
- int line=0;
- int col=0;
+ while (pos < len) {
- while(pos<len) {
+ int advance = 0;
+ int prev_line = line;
+ Token t = read_token(&p_text[pos], len - pos, line, advance);
+ t.line = line;
+ t.col = col;
- int advance=0;
- int prev_line=line;
- Token t = read_token(&p_text[pos],len-pos,line,advance);
- t.line=line;
- t.col=col;
-
- if (t.type==TK_ERROR) {
+ if (t.type == TK_ERROR) {
if (r_error) {
- *r_error=t.text;
- *r_err_line=line;
- *r_err_column=col;
+ *r_error = t.text;
+ *r_err_line = line;
+ *r_err_column = col;
return ERR_COMPILATION_FAILED;
}
}
- if (line==prev_line) {
- col+=advance;
+ if (line == prev_line) {
+ col += advance;
} else {
- col=0;
+ col = 0;
//p_tokens->push_back(Token(TK_LINE,itos(line)))
}
- if (t.type!=TK_EMPTY)
+ if (t.type != TK_EMPTY)
p_tokens->push_back(t);
- pos+=advance;
-
+ pos += advance;
}
return OK;
-
}
-String ShaderLanguage::lex_debug(const String& p_code) {
+String ShaderLanguage::lex_debug(const String &p_code) {
Vector<Token> tokens;
String error;
- int errline,errcol;
- if (tokenize(p_code,&tokens,&error,&errline,&errcol)!=OK)
+ int errline, errcol;
+ if (tokenize(p_code, &tokens, &error, &errline, &errcol) != OK)
return error;
String ret;
- for(int i=0;i<tokens.size();i++) {
- ret+=String(token_names[tokens[i].type])+":"+itos(tokens[i].line)+":"+itos(tokens[i].col)+":"+tokens[i].text+"\n";
+ for (int i = 0; i < tokens.size(); i++) {
+ ret += String(token_names[tokens[i].type]) + ":" + itos(tokens[i].line) + ":" + itos(tokens[i].col) + ":" + tokens[i].text + "\n";
}
return ret;
-
}
bool ShaderLanguage::is_token_datatype(TokenType p_type) {
- return
- (p_type==TK_TYPE_VOID) ||
- (p_type==TK_TYPE_BOOL) ||
- (p_type==TK_TYPE_FLOAT) ||
- (p_type==TK_TYPE_VEC2) ||
- (p_type==TK_TYPE_VEC3) ||
- (p_type==TK_TYPE_VEC4) ||
- (p_type==TK_TYPE_COLOR) ||
- (p_type==TK_TYPE_MAT2) ||
- (p_type==TK_TYPE_MAT3) ||
- (p_type==TK_TYPE_MAT4) ||
- (p_type==TK_TYPE_CUBEMAP) ||
- (p_type==TK_TYPE_TEXTURE);
-
+ return (p_type == TK_TYPE_VOID) ||
+ (p_type == TK_TYPE_BOOL) ||
+ (p_type == TK_TYPE_FLOAT) ||
+ (p_type == TK_TYPE_VEC2) ||
+ (p_type == TK_TYPE_VEC3) ||
+ (p_type == TK_TYPE_VEC4) ||
+ (p_type == TK_TYPE_COLOR) ||
+ (p_type == TK_TYPE_MAT2) ||
+ (p_type == TK_TYPE_MAT3) ||
+ (p_type == TK_TYPE_MAT4) ||
+ (p_type == TK_TYPE_CUBEMAP) ||
+ (p_type == TK_TYPE_TEXTURE);
}
ShaderLanguage::DataType ShaderLanguage::get_token_datatype(TokenType p_type) {
- switch(p_type) {
+ switch (p_type) {
case TK_TYPE_VOID: return TYPE_VOID;
case TK_TYPE_BOOL: return TYPE_BOOL;
@@ -554,10 +549,9 @@ ShaderLanguage::DataType ShaderLanguage::get_token_datatype(TokenType p_type) {
return TYPE_VOID;
}
-
String ShaderLanguage::get_datatype_name(DataType p_type) {
- switch(p_type) {
+ switch (p_type) {
case TYPE_VOID: return "void";
case TYPE_BOOL: return "bool";
@@ -576,136 +570,123 @@ String ShaderLanguage::get_datatype_name(DataType p_type) {
return "";
}
-
bool ShaderLanguage::is_token_nonvoid_datatype(TokenType p_type) {
- return
- (p_type==TK_TYPE_BOOL) ||
- (p_type==TK_TYPE_FLOAT) ||
- (p_type==TK_TYPE_VEC2) ||
- (p_type==TK_TYPE_VEC3) ||
- (p_type==TK_TYPE_VEC4) ||
- (p_type==TK_TYPE_COLOR) ||
- (p_type==TK_TYPE_MAT2) ||
- (p_type==TK_TYPE_MAT3) ||
- (p_type==TK_TYPE_MAT4) ||
- (p_type==TK_TYPE_TEXTURE) ||
- (p_type==TK_TYPE_CUBEMAP);
-
+ return (p_type == TK_TYPE_BOOL) ||
+ (p_type == TK_TYPE_FLOAT) ||
+ (p_type == TK_TYPE_VEC2) ||
+ (p_type == TK_TYPE_VEC3) ||
+ (p_type == TK_TYPE_VEC4) ||
+ (p_type == TK_TYPE_COLOR) ||
+ (p_type == TK_TYPE_MAT2) ||
+ (p_type == TK_TYPE_MAT3) ||
+ (p_type == TK_TYPE_MAT4) ||
+ (p_type == TK_TYPE_TEXTURE) ||
+ (p_type == TK_TYPE_CUBEMAP);
}
+bool ShaderLanguage::parser_is_at_function(Parser &parser) {
-bool ShaderLanguage::parser_is_at_function(Parser& parser) {
-
- return (is_token_datatype(parser.get_next_token_type(0)) && parser.get_next_token_type(1)==TK_INDENTIFIER && parser.get_next_token_type(2)==TK_PARENTHESIS_OPEN);
+ return (is_token_datatype(parser.get_next_token_type(0)) && parser.get_next_token_type(1) == TK_INDENTIFIER && parser.get_next_token_type(2) == TK_PARENTHESIS_OPEN);
}
-
-
-bool ShaderLanguage::test_existing_identifier(Node *p_node,const StringName p_identifier,bool p_func,bool p_var,bool p_builtin) {
+bool ShaderLanguage::test_existing_identifier(Node *p_node, const StringName p_identifier, bool p_func, bool p_var, bool p_builtin) {
Node *node = p_node;
- while(node) {
+ while (node) {
- if (node->type==Node::TYPE_BLOCK) {
+ if (node->type == Node::TYPE_BLOCK) {
- BlockNode *block = (BlockNode*)node;
+ BlockNode *block = (BlockNode *)node;
if (block->variables.has(p_identifier))
return true;
- } else if (node->type==Node::TYPE_PROGRAM) {
+ } else if (node->type == Node::TYPE_PROGRAM) {
- ProgramNode *program = (ProgramNode*)node;
- for(int i=0;i<program->functions.size();i++) {
+ ProgramNode *program = (ProgramNode *)node;
+ for (int i = 0; i < program->functions.size(); i++) {
- if (program->functions[i].name==p_identifier) {
+ if (program->functions[i].name == p_identifier) {
return true;
}
}
- if(program->builtin_variables.has(p_identifier)) {
+ if (program->builtin_variables.has(p_identifier)) {
return true;
}
- if(program->uniforms.has(p_identifier)) {
+ if (program->uniforms.has(p_identifier)) {
return true;
}
- } else if (node->type==Node::TYPE_FUNCTION) {
+ } else if (node->type == Node::TYPE_FUNCTION) {
- FunctionNode *func=(FunctionNode*)node;
- for(int i=0;i<func->arguments.size();i++)
- if (func->arguments[i].name==p_identifier)
+ FunctionNode *func = (FunctionNode *)node;
+ for (int i = 0; i < func->arguments.size(); i++)
+ if (func->arguments[i].name == p_identifier)
return true;
}
- node=node->parent;
+ node = node->parent;
}
// try keywords
- int idx=0;
+ int idx = 0;
//todo optimize
- while(intrinsic_func_defs[idx].name) {
+ while (intrinsic_func_defs[idx].name) {
- if (p_identifier.operator String()==intrinsic_func_defs[idx].name)
+ if (p_identifier.operator String() == intrinsic_func_defs[idx].name)
return true;
idx++;
}
-
return false;
-
}
+Error ShaderLanguage::parse_function(Parser &parser, BlockNode *p_block) {
-Error ShaderLanguage::parse_function(Parser& parser,BlockNode *p_block) {
-
- if (!p_block->parent || p_block->parent->type!=Node::TYPE_PROGRAM) {
+ if (!p_block->parent || p_block->parent->type != Node::TYPE_PROGRAM) {
parser.set_error("Misplaced function");
return ERR_PARSE_ERROR;
-
}
-
- ProgramNode *program = (ProgramNode*)p_block->parent;
+ ProgramNode *program = (ProgramNode *)p_block->parent;
StringName name = parser.get_next_token(1).text;
- if (test_existing_identifier(p_block,name)) {
+ if (test_existing_identifier(p_block, name)) {
- parser.set_error("Duplicate Identifier (existing variable/builtin/function): "+name);
+ parser.set_error("Duplicate Identifier (existing variable/builtin/function): " + name);
return ERR_PARSE_ERROR;
-
}
-
FunctionNode *function = parser.create_node<FunctionNode>(program);
function->body = parser.create_node<BlockNode>(function);
- function->name=name;
+ function->name = name;
- function->return_type=get_token_datatype(parser.get_next_token_type(0));
+ function->return_type = get_token_datatype(parser.get_next_token_type(0));
{ //add to programnode
ProgramNode::Function f;
- f.name=name;
- f.function=function;
+ f.name = name;
+ f.function = function;
program->functions.push_back(f);
}
- int ofs=3;
+ int ofs = 3;
- while(true) {
+ while (true) {
//end of arguments
- if (parser.get_next_token_type(ofs)==TK_PARENTHESIS_CLOSE) {
+ if (parser.get_next_token_type(ofs) == TK_PARENTHESIS_CLOSE) {
ofs++;
break;
}
//next argument awaits
- if (parser.get_next_token_type(ofs)==TK_COMMA) {
- if (!is_token_nonvoid_datatype(parser.get_next_token_type(ofs+1))) {
+ if (parser.get_next_token_type(ofs) == TK_COMMA) {
+ if (!is_token_nonvoid_datatype(parser.get_next_token_type(ofs + 1))) {
parser.set_error("Expected Identifier or ')' following ','");
return ERR_PARSE_ERROR;
}
@@ -713,60 +694,58 @@ Error ShaderLanguage::parse_function(Parser& parser,BlockNode *p_block) {
continue;
}
-
-
- if (!is_token_nonvoid_datatype(parser.get_next_token_type(ofs+0))) {
+ if (!is_token_nonvoid_datatype(parser.get_next_token_type(ofs + 0))) {
parser.set_error("Invalid Argument Type");
return ERR_PARSE_ERROR;
}
- DataType identtype=get_token_datatype(parser.get_next_token_type(ofs+0));
+ DataType identtype = get_token_datatype(parser.get_next_token_type(ofs + 0));
- if (parser.get_next_token_type(ofs+1)!=TK_INDENTIFIER) {
+ if (parser.get_next_token_type(ofs + 1) != TK_INDENTIFIER) {
parser.set_error("Expected Argument Identifier");
return ERR_PARSE_ERROR;
}
- StringName identname=parser.get_next_token(ofs+1).text;
+ StringName identname = parser.get_next_token(ofs + 1).text;
- if (test_existing_identifier(function,identname)) {
- parser.set_error("Duplicate Argument Identifier: "+identname);
+ if (test_existing_identifier(function, identname)) {
+ parser.set_error("Duplicate Argument Identifier: " + identname);
return ERR_DUPLICATE_SYMBOL;
}
FunctionNode::Argument arg;
- arg.name=identname;
- arg.type=identtype;
+ arg.name = identname;
+ arg.type = identtype;
//function->body->variables[arg.name]=arg.type;
function->arguments.push_back(arg);
- ofs+=2;
+ ofs += 2;
}
parser.advance(ofs);
// match {
- if (parser.get_next_token_type()!=TK_CURLY_BRACKET_OPEN) {
+ if (parser.get_next_token_type() != TK_CURLY_BRACKET_OPEN) {
parser.set_error("Expected '{'");
return ERR_PARSE_ERROR;
}
parser.advance();
- Error err = parse_block(parser,function->body);
+ Error err = parse_block(parser, function->body);
if (err)
return err;
// make sure that if the function has a return type, it does return something..
- if (function->return_type!=TYPE_VOID) {
- bool found=false;
- for(int i=0;i<function->body->statements.size();i++) {
- if (function->body->statements[i]->type==Node::TYPE_CONTROL_FLOW) {
+ if (function->return_type != TYPE_VOID) {
+ bool found = false;
+ for (int i = 0; i < function->body->statements.size(); i++) {
+ if (function->body->statements[i]->type == Node::TYPE_CONTROL_FLOW) {
- ControlFlowNode *cf = (ControlFlowNode*)function->body->statements[i];
- if (cf->flow_op==FLOW_OP_RETURN) {
+ ControlFlowNode *cf = (ControlFlowNode *)function->body->statements[i];
+ if (cf->flow_op == FLOW_OP_RETURN) {
// type of return was already checked when inserted
// no need to check here
- found=true;
+ found = true;
}
}
}
@@ -780,607 +759,606 @@ Error ShaderLanguage::parse_function(Parser& parser,BlockNode *p_block) {
return OK;
}
-
-const ShaderLanguage::IntrinsicFuncDef ShaderLanguage::intrinsic_func_defs[]={
+const ShaderLanguage::IntrinsicFuncDef ShaderLanguage::intrinsic_func_defs[] = {
//constructors
- {"bool",TYPE_BOOL,{TYPE_BOOL,TYPE_VOID}},
- {"float",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
- {"vec2",TYPE_VEC2,{TYPE_FLOAT,TYPE_VOID}},
- {"vec2",TYPE_VEC2,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
- {"vec3",TYPE_VEC3,{TYPE_FLOAT,TYPE_VOID}},
- {"vec3",TYPE_VEC3,{TYPE_FLOAT,TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
- {"vec3",TYPE_VEC3,{TYPE_VEC2,TYPE_FLOAT,TYPE_VOID}},
- {"vec3",TYPE_VEC3,{TYPE_FLOAT,TYPE_VEC2,TYPE_VOID}},
- {"vec4",TYPE_VEC4,{TYPE_FLOAT,TYPE_VOID}},
- {"vec4",TYPE_VEC4,{TYPE_FLOAT,TYPE_FLOAT,TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
- {"vec4",TYPE_VEC4,{TYPE_FLOAT,TYPE_VEC2,TYPE_FLOAT,TYPE_VOID}},
- {"vec4",TYPE_VEC4,{TYPE_VEC2,TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
- {"vec4",TYPE_VEC4,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VEC2,TYPE_VOID}},
- {"vec4",TYPE_VEC4,{TYPE_FLOAT,TYPE_VEC3,TYPE_VOID}},
- {"vec4",TYPE_VEC4,{TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
- {"vec4",TYPE_VEC4,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
- {"mat2",TYPE_MAT2,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
- {"mat3",TYPE_MAT3,{TYPE_VEC3,TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
- {"mat4",TYPE_MAT4,{TYPE_VEC4,TYPE_VEC4,TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
+ { "bool", TYPE_BOOL, { TYPE_BOOL, TYPE_VOID } },
+ { "float", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } },
+ { "vec2", TYPE_VEC2, { TYPE_FLOAT, TYPE_VOID } },
+ { "vec2", TYPE_VEC2, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } },
+ { "vec3", TYPE_VEC3, { TYPE_FLOAT, TYPE_VOID } },
+ { "vec3", TYPE_VEC3, { TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } },
+ { "vec3", TYPE_VEC3, { TYPE_VEC2, TYPE_FLOAT, TYPE_VOID } },
+ { "vec3", TYPE_VEC3, { TYPE_FLOAT, TYPE_VEC2, TYPE_VOID } },
+ { "vec4", TYPE_VEC4, { TYPE_FLOAT, TYPE_VOID } },
+ { "vec4", TYPE_VEC4, { TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } },
+ { "vec4", TYPE_VEC4, { TYPE_FLOAT, TYPE_VEC2, TYPE_FLOAT, TYPE_VOID } },
+ { "vec4", TYPE_VEC4, { TYPE_VEC2, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } },
+ { "vec4", TYPE_VEC4, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VEC2, TYPE_VOID } },
+ { "vec4", TYPE_VEC4, { TYPE_FLOAT, TYPE_VEC3, TYPE_VOID } },
+ { "vec4", TYPE_VEC4, { TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } },
+ { "vec4", TYPE_VEC4, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } },
+ { "mat2", TYPE_MAT2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } },
+ { "mat3", TYPE_MAT3, { TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID } },
+ { "mat4", TYPE_MAT4, { TYPE_VEC4, TYPE_VEC4, TYPE_VEC4, TYPE_VEC4, TYPE_VOID } },
//intrinsics - trigonometry
- {"sin",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
- {"cos",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
- {"tan",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
- {"asin",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
- {"acos",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
- {"atan",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
- {"atan2",TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
- {"sinh",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
- {"cosh",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
- {"tanh",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
+ { "sin", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } },
+ { "cos", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } },
+ { "tan", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } },
+ { "asin", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } },
+ { "acos", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } },
+ { "atan", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } },
+ { "atan2", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } },
+ { "sinh", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } },
+ { "cosh", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } },
+ { "tanh", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } },
//intrinsics - exponential
- {"pow",TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
- {"pow",TYPE_VEC2,{TYPE_VEC2,TYPE_FLOAT,TYPE_VOID}},
- {"pow",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
- {"pow",TYPE_VEC3,{TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
- {"pow",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
- {"pow",TYPE_VEC4,{TYPE_VEC4,TYPE_FLOAT,TYPE_VOID}},
- {"pow",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
- {"exp",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
- {"exp",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
- {"exp",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
- {"exp",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
- {"log",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
- {"log",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
- {"log",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
- {"log",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
- {"sqrt",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
- {"sqrt",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
- {"sqrt",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
- {"sqrt",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
+ { "pow", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } },
+ { "pow", TYPE_VEC2, { TYPE_VEC2, TYPE_FLOAT, TYPE_VOID } },
+ { "pow", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } },
+ { "pow", TYPE_VEC3, { TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } },
+ { "pow", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } },
+ { "pow", TYPE_VEC4, { TYPE_VEC4, TYPE_FLOAT, TYPE_VOID } },
+ { "pow", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } },
+ { "exp", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } },
+ { "exp", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } },
+ { "exp", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } },
+ { "exp", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } },
+ { "log", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } },
+ { "log", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } },
+ { "log", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } },
+ { "log", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } },
+ { "sqrt", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } },
+ { "sqrt", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } },
+ { "sqrt", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } },
+ { "sqrt", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } },
//intrinsics - common
- {"abs",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
- {"abs",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
- {"abs",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
- {"abs",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
- {"sign",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
- {"sign",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
- {"sign",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
- {"sign",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
- {"floor",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
- {"floor",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
- {"floor",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
- {"floor",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
- {"trunc",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
- {"trunc",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
- {"trunc",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
- {"trunc",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
- {"round",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
- {"round",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
- {"round",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
- {"round",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
- {"ceil",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
- {"ceil",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
- {"ceil",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
- {"ceil",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
- {"fract",TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
- {"fract",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
- {"fract",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
- {"fract",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
- {"mod",TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
- {"mod",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
- {"mod",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
- {"mod",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
- {"min",TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
- {"min",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
- {"min",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
- {"min",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
- {"max",TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
- {"max",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
- {"max",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
- {"max",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
- {"clamp",TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
- {"clamp",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
- {"clamp",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
- {"clamp",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
- {"clamp",TYPE_VEC2,{TYPE_VEC2,TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
- {"clamp",TYPE_VEC3,{TYPE_VEC3,TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
- {"clamp",TYPE_VEC4,{TYPE_VEC4,TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
- {"mix",TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
- {"mix",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_FLOAT,TYPE_VOID}},
- {"mix",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
- {"mix",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
- {"mix",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
- {"mix",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_FLOAT,TYPE_VOID}},
- {"mix",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
- {"step",TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
- {"step",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
- {"step",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
- {"step",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
- {"step",TYPE_VEC2,{TYPE_FLOAT,TYPE_VEC2,TYPE_VOID}},
- {"step",TYPE_VEC3,{TYPE_FLOAT,TYPE_VEC3,TYPE_VOID}},
- {"step",TYPE_VEC4,{TYPE_FLOAT,TYPE_VEC4,TYPE_VOID}},
- {"smoothstep",TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT,TYPE_FLOAT,TYPE_VOID}},
- {"smoothstep",TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
- {"smoothstep",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
- {"smoothstep",TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
- {"smoothstep",TYPE_VEC2,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VEC2,TYPE_VOID}},
- {"smoothstep",TYPE_VEC3,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VEC3,TYPE_VOID}},
- {"smoothstep",TYPE_VEC4,{TYPE_FLOAT,TYPE_FLOAT,TYPE_VEC4,TYPE_VOID}},
+ { "abs", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } },
+ { "abs", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } },
+ { "abs", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } },
+ { "abs", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } },
+ { "sign", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } },
+ { "sign", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } },
+ { "sign", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } },
+ { "sign", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } },
+ { "floor", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } },
+ { "floor", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } },
+ { "floor", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } },
+ { "floor", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } },
+ { "trunc", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } },
+ { "trunc", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } },
+ { "trunc", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } },
+ { "trunc", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } },
+ { "round", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } },
+ { "round", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } },
+ { "round", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } },
+ { "round", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } },
+ { "ceil", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } },
+ { "ceil", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } },
+ { "ceil", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } },
+ { "ceil", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } },
+ { "fract", TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } },
+ { "fract", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } },
+ { "fract", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } },
+ { "fract", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } },
+ { "mod", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } },
+ { "mod", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } },
+ { "mod", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } },
+ { "mod", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } },
+ { "min", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } },
+ { "min", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } },
+ { "min", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } },
+ { "min", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } },
+ { "max", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } },
+ { "max", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } },
+ { "max", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } },
+ { "max", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } },
+ { "clamp", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } },
+ { "clamp", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VEC2, TYPE_VOID } },
+ { "clamp", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID } },
+ { "clamp", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VEC4, TYPE_VOID } },
+ { "clamp", TYPE_VEC2, { TYPE_VEC2, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } },
+ { "clamp", TYPE_VEC3, { TYPE_VEC3, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } },
+ { "clamp", TYPE_VEC4, { TYPE_VEC4, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } },
+ { "mix", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } },
+ { "mix", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_FLOAT, TYPE_VOID } },
+ { "mix", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VEC2, TYPE_VOID } },
+ { "mix", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } },
+ { "mix", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID } },
+ { "mix", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_FLOAT, TYPE_VOID } },
+ { "mix", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VEC4, TYPE_VOID } },
+ { "step", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } },
+ { "step", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } },
+ { "step", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } },
+ { "step", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } },
+ { "step", TYPE_VEC2, { TYPE_FLOAT, TYPE_VEC2, TYPE_VOID } },
+ { "step", TYPE_VEC3, { TYPE_FLOAT, TYPE_VEC3, TYPE_VOID } },
+ { "step", TYPE_VEC4, { TYPE_FLOAT, TYPE_VEC4, TYPE_VOID } },
+ { "smoothstep", TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, TYPE_VOID } },
+ { "smoothstep", TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2, TYPE_VEC2, TYPE_VOID } },
+ { "smoothstep", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VEC3, TYPE_VOID } },
+ { "smoothstep", TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4, TYPE_VEC4, TYPE_VOID } },
+ { "smoothstep", TYPE_VEC2, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VEC2, TYPE_VOID } },
+ { "smoothstep", TYPE_VEC3, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VEC3, TYPE_VOID } },
+ { "smoothstep", TYPE_VEC4, { TYPE_FLOAT, TYPE_FLOAT, TYPE_VEC4, TYPE_VOID } },
//intrinsics - geometric
- {"length",TYPE_FLOAT,{TYPE_VEC2,TYPE_VOID}},
- {"length",TYPE_FLOAT,{TYPE_VEC3,TYPE_VOID}},
- {"length",TYPE_FLOAT,{TYPE_VEC4,TYPE_VOID}},
- {"distance",TYPE_FLOAT,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
- {"distance",TYPE_FLOAT,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
- {"distance",TYPE_FLOAT,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
- {"dot",TYPE_FLOAT,{TYPE_VEC2,TYPE_VEC2,TYPE_VOID}},
- {"dot",TYPE_FLOAT,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
- {"dot",TYPE_FLOAT,{TYPE_VEC4,TYPE_VEC4,TYPE_VOID}},
- {"cross",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
- {"normalize",TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
- {"normalize",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
- {"normalize",TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
- {"reflect",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_VOID}},
- {"refract",TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3,TYPE_FLOAT,TYPE_VOID}},
+ { "length", TYPE_FLOAT, { TYPE_VEC2, TYPE_VOID } },
+ { "length", TYPE_FLOAT, { TYPE_VEC3, TYPE_VOID } },
+ { "length", TYPE_FLOAT, { TYPE_VEC4, TYPE_VOID } },
+ { "distance", TYPE_FLOAT, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } },
+ { "distance", TYPE_FLOAT, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } },
+ { "distance", TYPE_FLOAT, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } },
+ { "dot", TYPE_FLOAT, { TYPE_VEC2, TYPE_VEC2, TYPE_VOID } },
+ { "dot", TYPE_FLOAT, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } },
+ { "dot", TYPE_FLOAT, { TYPE_VEC4, TYPE_VEC4, TYPE_VOID } },
+ { "cross", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } },
+ { "normalize", TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } },
+ { "normalize", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } },
+ { "normalize", TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } },
+ { "reflect", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_VOID } },
+ { "refract", TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3, TYPE_FLOAT, TYPE_VOID } },
//intrinsics - texture
- {"tex",TYPE_VEC4,{TYPE_TEXTURE,TYPE_VEC2,TYPE_VOID}},
- {"texcube",TYPE_VEC4,{TYPE_CUBEMAP,TYPE_VEC3,TYPE_VOID}},
- {"texscreen",TYPE_VEC3,{TYPE_VEC2,TYPE_VOID}},
- {"texpos",TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
+ { "tex", TYPE_VEC4, { TYPE_TEXTURE, TYPE_VEC2, TYPE_VOID } },
+ { "texcube", TYPE_VEC4, { TYPE_CUBEMAP, TYPE_VEC3, TYPE_VOID } },
+ { "texscreen", TYPE_VEC3, { TYPE_VEC2, TYPE_VOID } },
+ { "texpos", TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } },
- {NULL,TYPE_VOID,{TYPE_VOID}}
+ { NULL, TYPE_VOID, { TYPE_VOID } }
};
-const ShaderLanguage::OperatorDef ShaderLanguage::operator_defs[]={
+const ShaderLanguage::OperatorDef ShaderLanguage::operator_defs[] = {
- {OP_ASSIGN,TYPE_VOID,{TYPE_BOOL,TYPE_BOOL}},
- {OP_ASSIGN,TYPE_VOID,{TYPE_FLOAT,TYPE_FLOAT}},
- {OP_ASSIGN,TYPE_VOID,{TYPE_VEC2,TYPE_VEC2}},
- {OP_ASSIGN,TYPE_VOID,{TYPE_VEC3,TYPE_VEC3}},
- {OP_ASSIGN,TYPE_VOID,{TYPE_VEC4,TYPE_VEC4}},
- {OP_ASSIGN,TYPE_VOID,{TYPE_MAT2,TYPE_MAT2}},
- {OP_ASSIGN,TYPE_VOID,{TYPE_MAT3,TYPE_MAT3}},
- {OP_ASSIGN,TYPE_VOID,{TYPE_MAT4,TYPE_MAT4}},
- {OP_ADD,TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT}},
- {OP_ADD,TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2}},
- {OP_ADD,TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3}},
- {OP_ADD,TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4}},
- {OP_SUB,TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT}},
- {OP_SUB,TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2}},
- {OP_SUB,TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3}},
- {OP_SUB,TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4}},
- {OP_MUL,TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT}},
- {OP_MUL,TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2}},
- {OP_MUL,TYPE_VEC2,{TYPE_VEC2,TYPE_FLOAT}},
- {OP_MUL,TYPE_VEC2,{TYPE_FLOAT,TYPE_VEC2}},
- {OP_MUL,TYPE_VEC2,{TYPE_VEC2,TYPE_MAT3}},
- {OP_MUL,TYPE_VEC2,{TYPE_MAT2,TYPE_VEC2}},
- {OP_MUL,TYPE_VEC2,{TYPE_VEC2,TYPE_MAT2}},
- {OP_MUL,TYPE_VEC2,{TYPE_MAT3,TYPE_VEC2}},
- {OP_MUL,TYPE_VEC2,{TYPE_VEC2,TYPE_MAT4}},
- {OP_MUL,TYPE_VEC2,{TYPE_MAT4,TYPE_VEC2}},
- {OP_MUL,TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3}},
- {OP_MUL,TYPE_VEC3,{TYPE_VEC3,TYPE_FLOAT}},
- {OP_MUL,TYPE_VEC3,{TYPE_FLOAT,TYPE_VEC3}},
- {OP_MUL,TYPE_VEC3,{TYPE_MAT3,TYPE_VEC3}},
- {OP_MUL,TYPE_VEC3,{TYPE_MAT4,TYPE_VEC3}},
- {OP_MUL,TYPE_VEC3,{TYPE_VEC3,TYPE_MAT3}},
- {OP_MUL,TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4}},
- {OP_MUL,TYPE_VEC4,{TYPE_VEC4,TYPE_FLOAT}},
- {OP_MUL,TYPE_VEC4,{TYPE_FLOAT,TYPE_VEC4}},
- {OP_MUL,TYPE_VEC4,{TYPE_MAT4,TYPE_VEC4}},
- {OP_MUL,TYPE_VEC4,{TYPE_VEC4,TYPE_MAT4}},
- {OP_MUL,TYPE_MAT2,{TYPE_MAT2,TYPE_MAT2}},
- {OP_MUL,TYPE_MAT3,{TYPE_MAT3,TYPE_MAT3}},
- {OP_MUL,TYPE_MAT4,{TYPE_MAT4,TYPE_MAT4}},
- {OP_DIV,TYPE_FLOAT,{TYPE_FLOAT,TYPE_FLOAT}},
- {OP_DIV,TYPE_VEC2,{TYPE_VEC2,TYPE_VEC2}},
- {OP_DIV,TYPE_VEC2,{TYPE_VEC2,TYPE_FLOAT}},
- {OP_DIV,TYPE_VEC2,{TYPE_FLOAT,TYPE_VEC2}},
- {OP_DIV,TYPE_VEC3,{TYPE_VEC3,TYPE_VEC3}},
- {OP_DIV,TYPE_VEC3,{TYPE_VEC3,TYPE_FLOAT}},
- {OP_DIV,TYPE_VEC3,{TYPE_FLOAT,TYPE_VEC3}},
- {OP_DIV,TYPE_VEC4,{TYPE_VEC4,TYPE_VEC4}},
- {OP_DIV,TYPE_VEC4,{TYPE_VEC4,TYPE_FLOAT}},
- {OP_DIV,TYPE_VEC4,{TYPE_FLOAT,TYPE_VEC4}},
- {OP_ASSIGN_ADD,TYPE_VOID,{TYPE_FLOAT,TYPE_FLOAT}},
- {OP_ASSIGN_ADD,TYPE_VOID,{TYPE_VEC2,TYPE_VEC2}},
- {OP_ASSIGN_ADD,TYPE_VOID,{TYPE_VEC3,TYPE_VEC3}},
- {OP_ASSIGN_ADD,TYPE_VOID,{TYPE_VEC4,TYPE_VEC4}},
- {OP_ASSIGN_ADD,TYPE_VOID,{TYPE_VEC2,TYPE_FLOAT}},
- {OP_ASSIGN_ADD,TYPE_VOID,{TYPE_VEC3,TYPE_FLOAT}},
- {OP_ASSIGN_ADD,TYPE_VOID,{TYPE_VEC4,TYPE_FLOAT}},
- {OP_ASSIGN_SUB,TYPE_VOID,{TYPE_FLOAT,TYPE_FLOAT}},
- {OP_ASSIGN_SUB,TYPE_VOID,{TYPE_VEC2,TYPE_VEC2}},
- {OP_ASSIGN_SUB,TYPE_VOID,{TYPE_VEC3,TYPE_VEC3}},
- {OP_ASSIGN_SUB,TYPE_VOID,{TYPE_VEC4,TYPE_VEC4}},
- {OP_ASSIGN_SUB,TYPE_VOID,{TYPE_VEC2,TYPE_FLOAT}},
- {OP_ASSIGN_SUB,TYPE_VOID,{TYPE_VEC3,TYPE_FLOAT}},
- {OP_ASSIGN_SUB,TYPE_VOID,{TYPE_VEC4,TYPE_FLOAT}},
- {OP_ASSIGN_MUL,TYPE_VOID,{TYPE_FLOAT,TYPE_FLOAT}},
- {OP_ASSIGN_MUL,TYPE_VOID,{TYPE_VEC2,TYPE_VEC2}},
- {OP_ASSIGN_MUL,TYPE_VOID,{TYPE_VEC2,TYPE_FLOAT}},
- {OP_ASSIGN_MUL,TYPE_VOID,{TYPE_VEC2,TYPE_MAT2}},
- {OP_ASSIGN_MUL,TYPE_VOID,{TYPE_MAT2,TYPE_MAT2}},
- {OP_ASSIGN_MUL,TYPE_VOID,{TYPE_VEC3,TYPE_MAT3}},
- {OP_ASSIGN_MUL,TYPE_VOID,{TYPE_VEC3,TYPE_VEC3}},
- {OP_ASSIGN_MUL,TYPE_VOID,{TYPE_VEC3,TYPE_FLOAT}},
- {OP_ASSIGN_MUL,TYPE_VOID,{TYPE_VEC3,TYPE_MAT4}},
- {OP_ASSIGN_MUL,TYPE_VOID,{TYPE_VEC4,TYPE_VEC4}},
- {OP_ASSIGN_MUL,TYPE_VOID,{TYPE_VEC4,TYPE_FLOAT}},
- {OP_ASSIGN_MUL,TYPE_VOID,{TYPE_VEC4,TYPE_MAT4}},
- {OP_ASSIGN_MUL,TYPE_VOID,{TYPE_MAT3,TYPE_MAT3}},
- {OP_ASSIGN_MUL,TYPE_VOID,{TYPE_MAT4,TYPE_MAT4}},
- {OP_ASSIGN_DIV,TYPE_VOID,{TYPE_FLOAT,TYPE_FLOAT}},
- {OP_ASSIGN_DIV,TYPE_VOID,{TYPE_VEC2,TYPE_VEC2}},
- {OP_ASSIGN_DIV,TYPE_VOID,{TYPE_VEC2,TYPE_FLOAT}},
- {OP_ASSIGN_DIV,TYPE_VOID,{TYPE_VEC3,TYPE_VEC3}},
- {OP_ASSIGN_DIV,TYPE_VOID,{TYPE_VEC3,TYPE_FLOAT}},
- {OP_ASSIGN_DIV,TYPE_VOID,{TYPE_VEC4,TYPE_VEC4}},
- {OP_ASSIGN_DIV,TYPE_VOID,{TYPE_VEC4,TYPE_FLOAT}},
- {OP_NEG,TYPE_FLOAT,{TYPE_FLOAT,TYPE_VOID}},
- {OP_NEG,TYPE_VEC2,{TYPE_VEC2,TYPE_VOID}},
- {OP_NEG,TYPE_VEC3,{TYPE_VEC3,TYPE_VOID}},
- {OP_NEG,TYPE_VEC4,{TYPE_VEC4,TYPE_VOID}},
- {OP_NOT,TYPE_BOOL,{TYPE_BOOL,TYPE_VOID}},
- {OP_CMP_EQ,TYPE_BOOL,{TYPE_BOOL,TYPE_BOOL}},
- {OP_CMP_EQ,TYPE_BOOL,{TYPE_FLOAT,TYPE_FLOAT}},
- {OP_CMP_EQ,TYPE_BOOL,{TYPE_VEC3,TYPE_VEC2}},
- {OP_CMP_EQ,TYPE_BOOL,{TYPE_VEC3,TYPE_VEC3}},
- {OP_CMP_EQ,TYPE_BOOL,{TYPE_VEC3,TYPE_VEC4}},
+ { OP_ASSIGN, TYPE_VOID, { TYPE_BOOL, TYPE_BOOL } },
+ { OP_ASSIGN, TYPE_VOID, { TYPE_FLOAT, TYPE_FLOAT } },
+ { OP_ASSIGN, TYPE_VOID, { TYPE_VEC2, TYPE_VEC2 } },
+ { OP_ASSIGN, TYPE_VOID, { TYPE_VEC3, TYPE_VEC3 } },
+ { OP_ASSIGN, TYPE_VOID, { TYPE_VEC4, TYPE_VEC4 } },
+ { OP_ASSIGN, TYPE_VOID, { TYPE_MAT2, TYPE_MAT2 } },
+ { OP_ASSIGN, TYPE_VOID, { TYPE_MAT3, TYPE_MAT3 } },
+ { OP_ASSIGN, TYPE_VOID, { TYPE_MAT4, TYPE_MAT4 } },
+ { OP_ADD, TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT } },
+ { OP_ADD, TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2 } },
+ { OP_ADD, TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3 } },
+ { OP_ADD, TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4 } },
+ { OP_SUB, TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT } },
+ { OP_SUB, TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2 } },
+ { OP_SUB, TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3 } },
+ { OP_SUB, TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4 } },
+ { OP_MUL, TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT } },
+ { OP_MUL, TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2 } },
+ { OP_MUL, TYPE_VEC2, { TYPE_VEC2, TYPE_FLOAT } },
+ { OP_MUL, TYPE_VEC2, { TYPE_FLOAT, TYPE_VEC2 } },
+ { OP_MUL, TYPE_VEC2, { TYPE_VEC2, TYPE_MAT3 } },
+ { OP_MUL, TYPE_VEC2, { TYPE_MAT2, TYPE_VEC2 } },
+ { OP_MUL, TYPE_VEC2, { TYPE_VEC2, TYPE_MAT2 } },
+ { OP_MUL, TYPE_VEC2, { TYPE_MAT3, TYPE_VEC2 } },
+ { OP_MUL, TYPE_VEC2, { TYPE_VEC2, TYPE_MAT4 } },
+ { OP_MUL, TYPE_VEC2, { TYPE_MAT4, TYPE_VEC2 } },
+ { OP_MUL, TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3 } },
+ { OP_MUL, TYPE_VEC3, { TYPE_VEC3, TYPE_FLOAT } },
+ { OP_MUL, TYPE_VEC3, { TYPE_FLOAT, TYPE_VEC3 } },
+ { OP_MUL, TYPE_VEC3, { TYPE_MAT3, TYPE_VEC3 } },
+ { OP_MUL, TYPE_VEC3, { TYPE_MAT4, TYPE_VEC3 } },
+ { OP_MUL, TYPE_VEC3, { TYPE_VEC3, TYPE_MAT3 } },
+ { OP_MUL, TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4 } },
+ { OP_MUL, TYPE_VEC4, { TYPE_VEC4, TYPE_FLOAT } },
+ { OP_MUL, TYPE_VEC4, { TYPE_FLOAT, TYPE_VEC4 } },
+ { OP_MUL, TYPE_VEC4, { TYPE_MAT4, TYPE_VEC4 } },
+ { OP_MUL, TYPE_VEC4, { TYPE_VEC4, TYPE_MAT4 } },
+ { OP_MUL, TYPE_MAT2, { TYPE_MAT2, TYPE_MAT2 } },
+ { OP_MUL, TYPE_MAT3, { TYPE_MAT3, TYPE_MAT3 } },
+ { OP_MUL, TYPE_MAT4, { TYPE_MAT4, TYPE_MAT4 } },
+ { OP_DIV, TYPE_FLOAT, { TYPE_FLOAT, TYPE_FLOAT } },
+ { OP_DIV, TYPE_VEC2, { TYPE_VEC2, TYPE_VEC2 } },
+ { OP_DIV, TYPE_VEC2, { TYPE_VEC2, TYPE_FLOAT } },
+ { OP_DIV, TYPE_VEC2, { TYPE_FLOAT, TYPE_VEC2 } },
+ { OP_DIV, TYPE_VEC3, { TYPE_VEC3, TYPE_VEC3 } },
+ { OP_DIV, TYPE_VEC3, { TYPE_VEC3, TYPE_FLOAT } },
+ { OP_DIV, TYPE_VEC3, { TYPE_FLOAT, TYPE_VEC3 } },
+ { OP_DIV, TYPE_VEC4, { TYPE_VEC4, TYPE_VEC4 } },
+ { OP_DIV, TYPE_VEC4, { TYPE_VEC4, TYPE_FLOAT } },
+ { OP_DIV, TYPE_VEC4, { TYPE_FLOAT, TYPE_VEC4 } },
+ { OP_ASSIGN_ADD, TYPE_VOID, { TYPE_FLOAT, TYPE_FLOAT } },
+ { OP_ASSIGN_ADD, TYPE_VOID, { TYPE_VEC2, TYPE_VEC2 } },
+ { OP_ASSIGN_ADD, TYPE_VOID, { TYPE_VEC3, TYPE_VEC3 } },
+ { OP_ASSIGN_ADD, TYPE_VOID, { TYPE_VEC4, TYPE_VEC4 } },
+ { OP_ASSIGN_ADD, TYPE_VOID, { TYPE_VEC2, TYPE_FLOAT } },
+ { OP_ASSIGN_ADD, TYPE_VOID, { TYPE_VEC3, TYPE_FLOAT } },
+ { OP_ASSIGN_ADD, TYPE_VOID, { TYPE_VEC4, TYPE_FLOAT } },
+ { OP_ASSIGN_SUB, TYPE_VOID, { TYPE_FLOAT, TYPE_FLOAT } },
+ { OP_ASSIGN_SUB, TYPE_VOID, { TYPE_VEC2, TYPE_VEC2 } },
+ { OP_ASSIGN_SUB, TYPE_VOID, { TYPE_VEC3, TYPE_VEC3 } },
+ { OP_ASSIGN_SUB, TYPE_VOID, { TYPE_VEC4, TYPE_VEC4 } },
+ { OP_ASSIGN_SUB, TYPE_VOID, { TYPE_VEC2, TYPE_FLOAT } },
+ { OP_ASSIGN_SUB, TYPE_VOID, { TYPE_VEC3, TYPE_FLOAT } },
+ { OP_ASSIGN_SUB, TYPE_VOID, { TYPE_VEC4, TYPE_FLOAT } },
+ { OP_ASSIGN_MUL, TYPE_VOID, { TYPE_FLOAT, TYPE_FLOAT } },
+ { OP_ASSIGN_MUL, TYPE_VOID, { TYPE_VEC2, TYPE_VEC2 } },
+ { OP_ASSIGN_MUL, TYPE_VOID, { TYPE_VEC2, TYPE_FLOAT } },
+ { OP_ASSIGN_MUL, TYPE_VOID, { TYPE_VEC2, TYPE_MAT2 } },
+ { OP_ASSIGN_MUL, TYPE_VOID, { TYPE_MAT2, TYPE_MAT2 } },
+ { OP_ASSIGN_MUL, TYPE_VOID, { TYPE_VEC3, TYPE_MAT3 } },
+ { OP_ASSIGN_MUL, TYPE_VOID, { TYPE_VEC3, TYPE_VEC3 } },
+ { OP_ASSIGN_MUL, TYPE_VOID, { TYPE_VEC3, TYPE_FLOAT } },
+ { OP_ASSIGN_MUL, TYPE_VOID, { TYPE_VEC3, TYPE_MAT4 } },
+ { OP_ASSIGN_MUL, TYPE_VOID, { TYPE_VEC4, TYPE_VEC4 } },
+ { OP_ASSIGN_MUL, TYPE_VOID, { TYPE_VEC4, TYPE_FLOAT } },
+ { OP_ASSIGN_MUL, TYPE_VOID, { TYPE_VEC4, TYPE_MAT4 } },
+ { OP_ASSIGN_MUL, TYPE_VOID, { TYPE_MAT3, TYPE_MAT3 } },
+ { OP_ASSIGN_MUL, TYPE_VOID, { TYPE_MAT4, TYPE_MAT4 } },
+ { OP_ASSIGN_DIV, TYPE_VOID, { TYPE_FLOAT, TYPE_FLOAT } },
+ { OP_ASSIGN_DIV, TYPE_VOID, { TYPE_VEC2, TYPE_VEC2 } },
+ { OP_ASSIGN_DIV, TYPE_VOID, { TYPE_VEC2, TYPE_FLOAT } },
+ { OP_ASSIGN_DIV, TYPE_VOID, { TYPE_VEC3, TYPE_VEC3 } },
+ { OP_ASSIGN_DIV, TYPE_VOID, { TYPE_VEC3, TYPE_FLOAT } },
+ { OP_ASSIGN_DIV, TYPE_VOID, { TYPE_VEC4, TYPE_VEC4 } },
+ { OP_ASSIGN_DIV, TYPE_VOID, { TYPE_VEC4, TYPE_FLOAT } },
+ { OP_NEG, TYPE_FLOAT, { TYPE_FLOAT, TYPE_VOID } },
+ { OP_NEG, TYPE_VEC2, { TYPE_VEC2, TYPE_VOID } },
+ { OP_NEG, TYPE_VEC3, { TYPE_VEC3, TYPE_VOID } },
+ { OP_NEG, TYPE_VEC4, { TYPE_VEC4, TYPE_VOID } },
+ { OP_NOT, TYPE_BOOL, { TYPE_BOOL, TYPE_VOID } },
+ { OP_CMP_EQ, TYPE_BOOL, { TYPE_BOOL, TYPE_BOOL } },
+ { OP_CMP_EQ, TYPE_BOOL, { TYPE_FLOAT, TYPE_FLOAT } },
+ { OP_CMP_EQ, TYPE_BOOL, { TYPE_VEC3, TYPE_VEC2 } },
+ { OP_CMP_EQ, TYPE_BOOL, { TYPE_VEC3, TYPE_VEC3 } },
+ { OP_CMP_EQ, TYPE_BOOL, { TYPE_VEC3, TYPE_VEC4 } },
//{OP_CMP_EQ,TYPE_MAT3,{TYPE_MAT4,TYPE_MAT3}}, ??
//{OP_CMP_EQ,TYPE_MAT4,{TYPE_MAT4,TYPE_MAT4}}, ??
- {OP_CMP_NEQ,TYPE_BOOL,{TYPE_BOOL,TYPE_BOOL}},
- {OP_CMP_NEQ,TYPE_BOOL,{TYPE_FLOAT,TYPE_FLOAT}},
- {OP_CMP_NEQ,TYPE_BOOL,{TYPE_VEC2,TYPE_VEC2}},
- {OP_CMP_NEQ,TYPE_BOOL,{TYPE_VEC3,TYPE_VEC3}},
- {OP_CMP_NEQ,TYPE_BOOL,{TYPE_VEC4,TYPE_VEC4}},
+ { OP_CMP_NEQ, TYPE_BOOL, { TYPE_BOOL, TYPE_BOOL } },
+ { OP_CMP_NEQ, TYPE_BOOL, { TYPE_FLOAT, TYPE_FLOAT } },
+ { OP_CMP_NEQ, TYPE_BOOL, { TYPE_VEC2, TYPE_VEC2 } },
+ { OP_CMP_NEQ, TYPE_BOOL, { TYPE_VEC3, TYPE_VEC3 } },
+ { OP_CMP_NEQ, TYPE_BOOL, { TYPE_VEC4, TYPE_VEC4 } },
//{OP_CMP_NEQ,TYPE_MAT4,{TYPE_MAT4,TYPE_MAT4}}, //?
- {OP_CMP_LEQ,TYPE_BOOL,{TYPE_FLOAT,TYPE_FLOAT}},
- {OP_CMP_GEQ,TYPE_BOOL,{TYPE_FLOAT,TYPE_FLOAT}},
- {OP_CMP_LESS,TYPE_BOOL,{TYPE_FLOAT,TYPE_FLOAT}},
- {OP_CMP_GREATER,TYPE_BOOL,{TYPE_FLOAT,TYPE_FLOAT}},
- {OP_CMP_OR,TYPE_BOOL,{TYPE_BOOL,TYPE_BOOL}},
- {OP_CMP_AND,TYPE_BOOL,{TYPE_BOOL,TYPE_BOOL}},
- {OP_MAX,TYPE_VOID,{TYPE_VOID,TYPE_VOID}}
+ { OP_CMP_LEQ, TYPE_BOOL, { TYPE_FLOAT, TYPE_FLOAT } },
+ { OP_CMP_GEQ, TYPE_BOOL, { TYPE_FLOAT, TYPE_FLOAT } },
+ { OP_CMP_LESS, TYPE_BOOL, { TYPE_FLOAT, TYPE_FLOAT } },
+ { OP_CMP_GREATER, TYPE_BOOL, { TYPE_FLOAT, TYPE_FLOAT } },
+ { OP_CMP_OR, TYPE_BOOL, { TYPE_BOOL, TYPE_BOOL } },
+ { OP_CMP_AND, TYPE_BOOL, { TYPE_BOOL, TYPE_BOOL } },
+ { OP_MAX, TYPE_VOID, { TYPE_VOID, TYPE_VOID } }
};
+const ShaderLanguage::BuiltinsDef ShaderLanguage::vertex_builtins_defs[] = {
-const ShaderLanguage::BuiltinsDef ShaderLanguage::vertex_builtins_defs[]={
-
- { "SRC_VERTEX", TYPE_VEC3},
- { "SRC_NORMAL", TYPE_VEC3},
- { "SRC_TANGENT", TYPE_VEC3},
- { "SRC_BINORMALF", TYPE_FLOAT},
+ { "SRC_VERTEX", TYPE_VEC3 },
+ { "SRC_NORMAL", TYPE_VEC3 },
+ { "SRC_TANGENT", TYPE_VEC3 },
+ { "SRC_BINORMALF", TYPE_FLOAT },
{ "POSITION", TYPE_VEC4 },
- { "VERTEX", TYPE_VEC3},
- { "NORMAL", TYPE_VEC3},
- { "TANGENT", TYPE_VEC3},
- { "BINORMAL", TYPE_VEC3},
- { "UV", TYPE_VEC2},
- { "UV2", TYPE_VEC2},
- { "COLOR", TYPE_VEC4},
- { "BONES", TYPE_VEC4},
- { "WEIGHTS", TYPE_VEC4},
- { "VAR1", TYPE_VEC4},
- { "VAR2", TYPE_VEC4},
- { "SPEC_EXP", TYPE_FLOAT},
- { "POINT_SIZE", TYPE_FLOAT},
+ { "VERTEX", TYPE_VEC3 },
+ { "NORMAL", TYPE_VEC3 },
+ { "TANGENT", TYPE_VEC3 },
+ { "BINORMAL", TYPE_VEC3 },
+ { "UV", TYPE_VEC2 },
+ { "UV2", TYPE_VEC2 },
+ { "COLOR", TYPE_VEC4 },
+ { "BONES", TYPE_VEC4 },
+ { "WEIGHTS", TYPE_VEC4 },
+ { "VAR1", TYPE_VEC4 },
+ { "VAR2", TYPE_VEC4 },
+ { "SPEC_EXP", TYPE_FLOAT },
+ { "POINT_SIZE", TYPE_FLOAT },
//builtins
- { "WORLD_MATRIX", TYPE_MAT4},
- { "INV_CAMERA_MATRIX", TYPE_MAT4},
- { "PROJECTION_MATRIX", TYPE_MAT4},
- { "MODELVIEW_MATRIX", TYPE_MAT4},
- { "INSTANCE_ID", TYPE_FLOAT},
- { "TIME", TYPE_FLOAT},
- { NULL, TYPE_VOID},
+ { "WORLD_MATRIX", TYPE_MAT4 },
+ { "INV_CAMERA_MATRIX", TYPE_MAT4 },
+ { "PROJECTION_MATRIX", TYPE_MAT4 },
+ { "MODELVIEW_MATRIX", TYPE_MAT4 },
+ { "INSTANCE_ID", TYPE_FLOAT },
+ { "TIME", TYPE_FLOAT },
+ { NULL, TYPE_VOID },
};
-const ShaderLanguage::BuiltinsDef ShaderLanguage::fragment_builtins_defs[]={
+const ShaderLanguage::BuiltinsDef ShaderLanguage::fragment_builtins_defs[] = {
- { "VERTEX", TYPE_VEC3},
- { "POSITION", TYPE_VEC4},
- { "NORMAL", TYPE_VEC3},
- { "TANGENT", TYPE_VEC3},
- { "BINORMAL", TYPE_VEC3},
- { "NORMALMAP", TYPE_VEC3},
- { "NORMALMAP_DEPTH", TYPE_FLOAT},
- { "UV", TYPE_VEC2},
- { "UV2", TYPE_VEC2},
- { "COLOR", TYPE_VEC4},
- { "NORMAL", TYPE_VEC3},
- { "VAR1", TYPE_VEC4},
- { "VAR2", TYPE_VEC4},
- { "DIFFUSE", TYPE_VEC3},
- { "DIFFUSE_ALPHA", TYPE_VEC4},
- { "SPECULAR", TYPE_VEC3},
- { "EMISSION", TYPE_VEC3},
- { "SPEC_EXP", TYPE_FLOAT},
- { "GLOW", TYPE_FLOAT},
- { "SHADE_PARAM", TYPE_FLOAT},
- { "DISCARD", TYPE_BOOL},
- { "SCREEN_UV", TYPE_VEC2},
- { "POINT_COORD", TYPE_VEC2},
- { "INV_CAMERA_MATRIX", TYPE_MAT4},
+ { "VERTEX", TYPE_VEC3 },
+ { "POSITION", TYPE_VEC4 },
+ { "NORMAL", TYPE_VEC3 },
+ { "TANGENT", TYPE_VEC3 },
+ { "BINORMAL", TYPE_VEC3 },
+ { "NORMALMAP", TYPE_VEC3 },
+ { "NORMALMAP_DEPTH", TYPE_FLOAT },
+ { "UV", TYPE_VEC2 },
+ { "UV2", TYPE_VEC2 },
+ { "COLOR", TYPE_VEC4 },
+ { "NORMAL", TYPE_VEC3 },
+ { "VAR1", TYPE_VEC4 },
+ { "VAR2", TYPE_VEC4 },
+ { "DIFFUSE", TYPE_VEC3 },
+ { "DIFFUSE_ALPHA", TYPE_VEC4 },
+ { "SPECULAR", TYPE_VEC3 },
+ { "EMISSION", TYPE_VEC3 },
+ { "SPEC_EXP", TYPE_FLOAT },
+ { "GLOW", TYPE_FLOAT },
+ { "SHADE_PARAM", TYPE_FLOAT },
+ { "DISCARD", TYPE_BOOL },
+ { "SCREEN_UV", TYPE_VEC2 },
+ { "POINT_COORD", TYPE_VEC2 },
+ { "INV_CAMERA_MATRIX", TYPE_MAT4 },
-// { "SCREEN_POS", TYPE_VEC2},
-// { "SCREEN_TEXEL_SIZE", TYPE_VEC2},
- { "TIME", TYPE_FLOAT},
- { NULL, TYPE_VOID}
+ // { "SCREEN_POS", TYPE_VEC2},
+ // { "SCREEN_TEXEL_SIZE", TYPE_VEC2},
+ { "TIME", TYPE_FLOAT },
+ { NULL, TYPE_VOID }
};
-const ShaderLanguage::BuiltinsDef ShaderLanguage::light_builtins_defs[]={
+const ShaderLanguage::BuiltinsDef ShaderLanguage::light_builtins_defs[] = {
- { "NORMAL", TYPE_VEC3},
- { "LIGHT_DIR", TYPE_VEC3},
- { "LIGHT_DIFFUSE", TYPE_VEC3},
- { "LIGHT_SPECULAR", TYPE_VEC3},
- { "EYE_VEC", TYPE_VEC3},
- { "DIFFUSE", TYPE_VEC3},
- { "SPECULAR", TYPE_VEC3},
- { "SPECULAR_EXP", TYPE_FLOAT},
- { "SHADE_PARAM", TYPE_FLOAT},
- { "LIGHT", TYPE_VEC3},
+ { "NORMAL", TYPE_VEC3 },
+ { "LIGHT_DIR", TYPE_VEC3 },
+ { "LIGHT_DIFFUSE", TYPE_VEC3 },
+ { "LIGHT_SPECULAR", TYPE_VEC3 },
+ { "EYE_VEC", TYPE_VEC3 },
+ { "DIFFUSE", TYPE_VEC3 },
+ { "SPECULAR", TYPE_VEC3 },
+ { "SPECULAR_EXP", TYPE_FLOAT },
+ { "SHADE_PARAM", TYPE_FLOAT },
+ { "LIGHT", TYPE_VEC3 },
{ "SHADOW", TYPE_VEC3 },
{ "POINT_COORD", TYPE_VEC2 },
-// { "SCREEN_POS", TYPE_VEC2},
-// { "SCREEN_TEXEL_SIZE", TYPE_VEC2},
- { "TIME", TYPE_FLOAT},
- { NULL, TYPE_VOID}
+ // { "SCREEN_POS", TYPE_VEC2},
+ // { "SCREEN_TEXEL_SIZE", TYPE_VEC2},
+ { "TIME", TYPE_FLOAT },
+ { NULL, TYPE_VOID }
};
+const ShaderLanguage::BuiltinsDef ShaderLanguage::ci_vertex_builtins_defs[] = {
-
-const ShaderLanguage::BuiltinsDef ShaderLanguage::ci_vertex_builtins_defs[]={
-
- { "SRC_VERTEX", TYPE_VEC2},
- { "VERTEX", TYPE_VEC2},
- { "WORLD_VERTEX", TYPE_VEC2},
- { "UV", TYPE_VEC2},
- { "COLOR", TYPE_VEC4},
- { "VAR1", TYPE_VEC4},
- { "VAR2", TYPE_VEC4},
- { "POINT_SIZE", TYPE_FLOAT},
+ { "SRC_VERTEX", TYPE_VEC2 },
+ { "VERTEX", TYPE_VEC2 },
+ { "WORLD_VERTEX", TYPE_VEC2 },
+ { "UV", TYPE_VEC2 },
+ { "COLOR", TYPE_VEC4 },
+ { "VAR1", TYPE_VEC4 },
+ { "VAR2", TYPE_VEC4 },
+ { "POINT_SIZE", TYPE_FLOAT },
//builtins
- { "WORLD_MATRIX", TYPE_MAT4},
- { "PROJECTION_MATRIX", TYPE_MAT4},
- { "EXTRA_MATRIX", TYPE_MAT4},
- { "TIME", TYPE_FLOAT},
- { NULL, TYPE_VOID},
+ { "WORLD_MATRIX", TYPE_MAT4 },
+ { "PROJECTION_MATRIX", TYPE_MAT4 },
+ { "EXTRA_MATRIX", TYPE_MAT4 },
+ { "TIME", TYPE_FLOAT },
+ { NULL, TYPE_VOID },
};
-const ShaderLanguage::BuiltinsDef ShaderLanguage::ci_fragment_builtins_defs[]={
+const ShaderLanguage::BuiltinsDef ShaderLanguage::ci_fragment_builtins_defs[] = {
- { "SRC_COLOR", TYPE_VEC4},
- { "POSITION", TYPE_VEC2},
- { "NORMAL", TYPE_VEC3},
- { "NORMALMAP", TYPE_VEC3},
- { "NORMALMAP_DEPTH", TYPE_FLOAT},
- { "UV", TYPE_VEC2},
- { "COLOR", TYPE_VEC4},
- { "TEXTURE", TYPE_TEXTURE},
- { "TEXTURE_PIXEL_SIZE", TYPE_VEC2},
- { "VAR1", TYPE_VEC4},
- { "VAR2", TYPE_VEC4},
- { "SCREEN_UV", TYPE_VEC2},
- { "POINT_COORD", TYPE_VEC2},
+ { "SRC_COLOR", TYPE_VEC4 },
+ { "POSITION", TYPE_VEC2 },
+ { "NORMAL", TYPE_VEC3 },
+ { "NORMALMAP", TYPE_VEC3 },
+ { "NORMALMAP_DEPTH", TYPE_FLOAT },
+ { "UV", TYPE_VEC2 },
+ { "COLOR", TYPE_VEC4 },
+ { "TEXTURE", TYPE_TEXTURE },
+ { "TEXTURE_PIXEL_SIZE", TYPE_VEC2 },
+ { "VAR1", TYPE_VEC4 },
+ { "VAR2", TYPE_VEC4 },
+ { "SCREEN_UV", TYPE_VEC2 },
+ { "POINT_COORD", TYPE_VEC2 },
-// { "SCREEN_POS", TYPE_VEC2},
-// { "SCREEN_TEXEL_SIZE", TYPE_VEC2},
- { "TIME", TYPE_FLOAT},
- { NULL, TYPE_VOID}
+ // { "SCREEN_POS", TYPE_VEC2},
+ // { "SCREEN_TEXEL_SIZE", TYPE_VEC2},
+ { "TIME", TYPE_FLOAT },
+ { NULL, TYPE_VOID }
};
-const ShaderLanguage::BuiltinsDef ShaderLanguage::ci_light_builtins_defs[]={
+const ShaderLanguage::BuiltinsDef ShaderLanguage::ci_light_builtins_defs[] = {
- { "POSITION", TYPE_VEC2},
- { "NORMAL", TYPE_VEC3},
- { "UV", TYPE_VEC2},
- { "COLOR", TYPE_VEC4},
- { "TEXTURE", TYPE_TEXTURE},
- { "TEXTURE_PIXEL_SIZE", TYPE_VEC2},
- { "VAR1", TYPE_VEC4},
- { "VAR2", TYPE_VEC4},
- { "SCREEN_UV", TYPE_VEC2},
- { "LIGHT_VEC", TYPE_VEC2},
- { "LIGHT_HEIGHT", TYPE_FLOAT},
- { "LIGHT_COLOR", TYPE_VEC4},
- { "LIGHT_UV", TYPE_VEC2},
- { "LIGHT_SHADOW", TYPE_VEC4},
- { "LIGHT", TYPE_VEC4},
- { "SHADOW", TYPE_VEC4},
- { "POINT_COORD", TYPE_VEC2},
-// { "SCREEN_POS", TYPE_VEC2},
-// { "SCREEN_TEXEL_SIZE", TYPE_VEC2},
- { "TIME", TYPE_FLOAT},
- { NULL, TYPE_VOID}
+ { "POSITION", TYPE_VEC2 },
+ { "NORMAL", TYPE_VEC3 },
+ { "UV", TYPE_VEC2 },
+ { "COLOR", TYPE_VEC4 },
+ { "TEXTURE", TYPE_TEXTURE },
+ { "TEXTURE_PIXEL_SIZE", TYPE_VEC2 },
+ { "VAR1", TYPE_VEC4 },
+ { "VAR2", TYPE_VEC4 },
+ { "SCREEN_UV", TYPE_VEC2 },
+ { "LIGHT_VEC", TYPE_VEC2 },
+ { "LIGHT_HEIGHT", TYPE_FLOAT },
+ { "LIGHT_COLOR", TYPE_VEC4 },
+ { "LIGHT_UV", TYPE_VEC2 },
+ { "LIGHT_SHADOW", TYPE_VEC4 },
+ { "LIGHT", TYPE_VEC4 },
+ { "SHADOW", TYPE_VEC4 },
+ { "POINT_COORD", TYPE_VEC2 },
+ // { "SCREEN_POS", TYPE_VEC2},
+ // { "SCREEN_TEXEL_SIZE", TYPE_VEC2},
+ { "TIME", TYPE_FLOAT },
+ { NULL, TYPE_VOID }
};
-const ShaderLanguage::BuiltinsDef ShaderLanguage::postprocess_fragment_builtins_defs[]={
+const ShaderLanguage::BuiltinsDef ShaderLanguage::postprocess_fragment_builtins_defs[] = {
- { "IN_COLOR", TYPE_VEC3},
- { "IN_POSITION", TYPE_VEC3},
- { "OUT_COLOR", TYPE_VEC3},
- { "SCREEN_POS", TYPE_VEC2},
- { "SCREEN_TEXEL_SIZE", TYPE_VEC2},
- { "TIME", TYPE_FLOAT},
- { NULL, TYPE_VOID}
+ { "IN_COLOR", TYPE_VEC3 },
+ { "IN_POSITION", TYPE_VEC3 },
+ { "OUT_COLOR", TYPE_VEC3 },
+ { "SCREEN_POS", TYPE_VEC2 },
+ { "SCREEN_TEXEL_SIZE", TYPE_VEC2 },
+ { "TIME", TYPE_FLOAT },
+ { NULL, TYPE_VOID }
};
-
-
ShaderLanguage::DataType ShaderLanguage::compute_node_type(Node *p_node) {
- switch(p_node->type) {
+ switch (p_node->type) {
case Node::TYPE_PROGRAM: ERR_FAIL_V(TYPE_VOID);
- case Node::TYPE_FUNCTION: return static_cast<FunctionNode*>(p_node)->return_type;
+ case Node::TYPE_FUNCTION: return static_cast<FunctionNode *>(p_node)->return_type;
case Node::TYPE_BLOCK: ERR_FAIL_V(TYPE_VOID);
- case Node::TYPE_VARIABLE: return static_cast<VariableNode*>(p_node)->datatype_cache;
- case Node::TYPE_CONSTANT: return static_cast<ConstantNode*>(p_node)->datatype;
- case Node::TYPE_OPERATOR: return static_cast<OperatorNode*>(p_node)->return_cache;
+ case Node::TYPE_VARIABLE: return static_cast<VariableNode *>(p_node)->datatype_cache;
+ case Node::TYPE_CONSTANT: return static_cast<ConstantNode *>(p_node)->datatype;
+ case Node::TYPE_OPERATOR: return static_cast<OperatorNode *>(p_node)->return_cache;
case Node::TYPE_CONTROL_FLOW: ERR_FAIL_V(TYPE_VOID);
- case Node::TYPE_MEMBER: return static_cast<MemberNode*>(p_node)->datatype;
+ case Node::TYPE_MEMBER: return static_cast<MemberNode *>(p_node)->datatype;
}
return TYPE_VOID;
}
+ShaderLanguage::Node *ShaderLanguage::validate_function_call(Parser &parser, OperatorNode *p_func) {
-ShaderLanguage::Node* ShaderLanguage::validate_function_call(Parser&parser, OperatorNode *p_func) {
-
- ERR_FAIL_COND_V(p_func->op!=OP_CALL && p_func->op!=OP_CONSTRUCT,NULL);
-
+ ERR_FAIL_COND_V(p_func->op != OP_CALL && p_func->op != OP_CONSTRUCT, NULL);
Vector<DataType> args;
- ERR_FAIL_COND_V( p_func->arguments[0]->type!=Node::TYPE_VARIABLE, NULL );
+ ERR_FAIL_COND_V(p_func->arguments[0]->type != Node::TYPE_VARIABLE, NULL);
- String name = static_cast<VariableNode*>(p_func->arguments[0])->name.operator String();
+ String name = static_cast<VariableNode *>(p_func->arguments[0])->name.operator String();
- bool all_const=true;
- for(int i=1;i<p_func->arguments.size();i++) {
- if (p_func->arguments[i]->type!=Node::TYPE_CONSTANT)
- all_const=false;
+ bool all_const = true;
+ for (int i = 1; i < p_func->arguments.size(); i++) {
+ if (p_func->arguments[i]->type != Node::TYPE_CONSTANT)
+ all_const = false;
args.push_back(compute_node_type(p_func->arguments[i]));
}
- int argcount=args.size();
+ int argcount = args.size();
- bool found_intrinsic=false;
+ bool found_intrinsic = false;
- if (argcount<=4) {
+ if (argcount <= 4) {
// test intrinsics
- int idx=0;
+ int idx = 0;
while (intrinsic_func_defs[idx].name) {
- if (name==intrinsic_func_defs[idx].name) {
+ if (name == intrinsic_func_defs[idx].name) {
- bool fail=false;
- for(int i=0;i<argcount;i++) {
+ bool fail = false;
+ for (int i = 0; i < argcount; i++) {
- if (args[i]!=intrinsic_func_defs[idx].args[i]) {
- fail=true;
+ if (args[i] != intrinsic_func_defs[idx].args[i]) {
+ fail = true;
break;
}
}
- if (!fail && argcount<4 && intrinsic_func_defs[idx].args[argcount]!=TYPE_VOID)
- fail=true; //make sure the number of arguments matches
+ if (!fail && argcount < 4 && intrinsic_func_defs[idx].args[argcount] != TYPE_VOID)
+ fail = true; //make sure the number of arguments matches
if (!fail) {
- p_func->return_cache=intrinsic_func_defs[idx].rettype;
- found_intrinsic=true;
+ p_func->return_cache = intrinsic_func_defs[idx].rettype;
+ found_intrinsic = true;
break;
-
}
-
}
idx++;
}
}
-
if (found_intrinsic) {
- if (p_func->op==OP_CONSTRUCT && all_const) {
-
+ if (p_func->op == OP_CONSTRUCT && all_const) {
Vector<float> cdata;
- for(int i=0;i<argcount;i++) {
+ for (int i = 0; i < argcount; i++) {
- Variant v = static_cast<ConstantNode*>(p_func->arguments[i+1])->value;
- switch(v.get_type()) {
+ Variant v = static_cast<ConstantNode *>(p_func->arguments[i + 1])->value;
+ switch (v.get_type()) {
case Variant::REAL: cdata.push_back(v); break;
- case Variant::VECTOR2: { Vector2 v2=v; cdata.push_back(v2.x); cdata.push_back(v2.y); } break;
- case Variant::VECTOR3: { Vector3 v3=v; cdata.push_back(v3.x); cdata.push_back(v3.y); cdata.push_back(v3.z);} break;
- case Variant::PLANE: { Plane v4=v; cdata.push_back(v4.normal.x); cdata.push_back(v4.normal.y); cdata.push_back(v4.normal.z); cdata.push_back(v4.d); } break;
+ case Variant::VECTOR2: {
+ Vector2 v2 = v;
+ cdata.push_back(v2.x);
+ cdata.push_back(v2.y);
+ } break;
+ case Variant::VECTOR3: {
+ Vector3 v3 = v;
+ cdata.push_back(v3.x);
+ cdata.push_back(v3.y);
+ cdata.push_back(v3.z);
+ } break;
+ case Variant::PLANE: {
+ Plane v4 = v;
+ cdata.push_back(v4.normal.x);
+ cdata.push_back(v4.normal.y);
+ cdata.push_back(v4.normal.z);
+ cdata.push_back(v4.d);
+ } break;
default: ERR_FAIL_V(NULL);
-
}
-
}
ConstantNode *cn = parser.create_node<ConstantNode>(p_func->parent);
Variant data;
- switch(p_func->return_cache) {
+ switch (p_func->return_cache) {
case TYPE_FLOAT: data = cdata[0]; break;
case TYPE_VEC2:
- if (cdata.size()==1)
- data = Vector2(cdata[0],cdata[0]);
+ if (cdata.size() == 1)
+ data = Vector2(cdata[0], cdata[0]);
else
- data = Vector2(cdata[0],cdata[1]);
+ data = Vector2(cdata[0], cdata[1]);
break;
case TYPE_VEC3:
- if (cdata.size()==1)
- data = Vector3(cdata[0],cdata[0],cdata[0]);
+ if (cdata.size() == 1)
+ data = Vector3(cdata[0], cdata[0], cdata[0]);
else
- data = Vector3(cdata[0],cdata[1],cdata[2]);
+ data = Vector3(cdata[0], cdata[1], cdata[2]);
break;
case TYPE_VEC4:
- if (cdata.size()==1)
- data = Plane(cdata[0],cdata[0],cdata[0],cdata[0]);
+ if (cdata.size() == 1)
+ data = Plane(cdata[0], cdata[0], cdata[0], cdata[0]);
else
- data = Plane(cdata[0],cdata[1],cdata[2],cdata[3]);
+ data = Plane(cdata[0], cdata[1], cdata[2], cdata[3]);
break;
}
- cn->datatype=p_func->return_cache;
- cn->value=data;
+ cn->datatype = p_func->return_cache;
+ cn->value = data;
return cn;
-
}
return p_func;
}
// try existing functions..
- FunctionNode *exclude_function=NULL; //exclude current function (in case inside one)
-
+ FunctionNode *exclude_function = NULL; //exclude current function (in case inside one)
Node *node = p_func;
- while(node->parent) {
+ while (node->parent) {
- if (node->type==Node::TYPE_FUNCTION) {
+ if (node->type == Node::TYPE_FUNCTION) {
- exclude_function = (FunctionNode*)node;
+ exclude_function = (FunctionNode *)node;
}
- node=node->parent;
+ node = node->parent;
}
- ERR_FAIL_COND_V(node->type!=Node::TYPE_PROGRAM,NULL);
- ProgramNode *program = (ProgramNode*)node;
+ ERR_FAIL_COND_V(node->type != Node::TYPE_PROGRAM, NULL);
+ ProgramNode *program = (ProgramNode *)node;
- for(int i=0;i<program->functions.size();i++) {
+ for (int i = 0; i < program->functions.size(); i++) {
- if (program->functions[i].function==exclude_function)
+ if (program->functions[i].function == exclude_function)
continue;
FunctionNode *pfunc = program->functions[i].function;
- if (pfunc->arguments.size()!=args.size())
+ if (pfunc->arguments.size() != args.size())
continue;
- bool fail=false;
+ bool fail = false;
- for(int i=0;i<args.size();i++) {
- if (args[i]!=pfunc->arguments[i].type) {
- fail=true;
+ for (int i = 0; i < args.size(); i++) {
+ if (args[i] != pfunc->arguments[i].type) {
+ fail = true;
break;
}
}
if (!fail && name == program->functions[i].name) {
- p_func->return_cache=pfunc->return_type;
+ p_func->return_cache = pfunc->return_type;
return p_func;
}
}
@@ -1388,35 +1366,31 @@ ShaderLanguage::Node* ShaderLanguage::validate_function_call(Parser&parser, Oper
return NULL;
}
-
-ShaderLanguage::Node * ShaderLanguage::validate_operator(Parser& parser,OperatorNode *p_func) {
+ShaderLanguage::Node *ShaderLanguage::validate_operator(Parser &parser, OperatorNode *p_func) {
int argcount = p_func->arguments.size();
- ERR_FAIL_COND_V(argcount>2,NULL);
+ ERR_FAIL_COND_V(argcount > 2, NULL);
- DataType argtype[2]={TYPE_VOID,TYPE_VOID};
- bool all_const=true;
+ DataType argtype[2] = { TYPE_VOID, TYPE_VOID };
+ bool all_const = true;
- for(int i=0;i<argcount;i++) {
-
- argtype[i]=compute_node_type(p_func->arguments[i]);
- if (p_func->arguments[i]->type!=Node::TYPE_CONSTANT)
- all_const=false;
+ for (int i = 0; i < argcount; i++) {
+ argtype[i] = compute_node_type(p_func->arguments[i]);
+ if (p_func->arguments[i]->type != Node::TYPE_CONSTANT)
+ all_const = false;
}
- int idx=0;
-
- bool valid=false;
- while(operator_defs[idx].op!=OP_MAX) {
-
- if (p_func->op==operator_defs[idx].op) {
+ int idx = 0;
+ bool valid = false;
+ while (operator_defs[idx].op != OP_MAX) {
+ if (p_func->op == operator_defs[idx].op) {
- if (operator_defs[idx].args[0]==argtype[0] && operator_defs[idx].args[1]==argtype[1]) {
+ if (operator_defs[idx].args[0] == argtype[0] && operator_defs[idx].args[1] == argtype[1]) {
- p_func->return_cache=operator_defs[idx].rettype;
- valid=true;
+ p_func->return_cache = operator_defs[idx].rettype;
+ valid = true;
break;
}
}
@@ -1427,122 +1401,117 @@ ShaderLanguage::Node * ShaderLanguage::validate_operator(Parser& parser,Operator
if (!valid)
return NULL;
-#define _RCO2(m_op,m_vop)\
-case m_op: {\
- ConstantNode *cn = parser.create_node<ConstantNode>(p_func->parent);\
- cn->datatype=p_func->return_cache; \
- Variant::evaluate(m_vop,static_cast<ConstantNode*>(p_func->arguments[0])->value,static_cast<ConstantNode*>(p_func->arguments[1])->value,cn->value,valid);\
- if (!valid)\
- return NULL;\
- return cn;\
-} break;
+#define _RCO2(m_op, m_vop) \
+ case m_op: { \
+ ConstantNode *cn = parser.create_node<ConstantNode>(p_func->parent); \
+ cn->datatype = p_func->return_cache; \
+ Variant::evaluate(m_vop, static_cast<ConstantNode *>(p_func->arguments[0])->value, static_cast<ConstantNode *>(p_func->arguments[1])->value, cn->value, valid); \
+ if (!valid) \
+ return NULL; \
+ return cn; \
+ } break;
-#define _RCO1(m_op,m_vop)\
-case m_op: {\
- ConstantNode *cn = parser.create_node<ConstantNode>(p_func->parent);\
- cn->datatype=p_func->return_cache; \
- Variant::evaluate(m_vop,static_cast<ConstantNode*>(p_func->arguments[0])->value,Variant(),cn->value,valid);\
- if (!valid)\
- return NULL;\
- return cn;\
-} break;
+#define _RCO1(m_op, m_vop) \
+ case m_op: { \
+ ConstantNode *cn = parser.create_node<ConstantNode>(p_func->parent); \
+ cn->datatype = p_func->return_cache; \
+ Variant::evaluate(m_vop, static_cast<ConstantNode *>(p_func->arguments[0])->value, Variant(), cn->value, valid); \
+ if (!valid) \
+ return NULL; \
+ return cn; \
+ } break;
if (all_const) {
//reduce constant operator
- switch(p_func->op) {
- _RCO2(OP_ADD,Variant::OP_ADD);
- _RCO2(OP_SUB,Variant::OP_SUBSTRACT);
- _RCO2(OP_MUL,Variant::OP_MULTIPLY);
- _RCO2(OP_DIV,Variant::OP_DIVIDE);
- _RCO1(OP_NEG,Variant::OP_NEGATE);
- _RCO1(OP_NOT,Variant::OP_NOT);
- _RCO2(OP_CMP_EQ,Variant::OP_EQUAL);
- _RCO2(OP_CMP_NEQ,Variant::OP_NOT_EQUAL);
- _RCO2(OP_CMP_LEQ,Variant::OP_LESS_EQUAL);
- _RCO2(OP_CMP_GEQ,Variant::OP_GREATER_EQUAL);
- _RCO2(OP_CMP_LESS,Variant::OP_LESS);
- _RCO2(OP_CMP_GREATER,Variant::OP_GREATER);
- _RCO2(OP_CMP_OR,Variant::OP_OR);
- _RCO2(OP_CMP_AND,Variant::OP_AND);
+ switch (p_func->op) {
+ _RCO2(OP_ADD, Variant::OP_ADD);
+ _RCO2(OP_SUB, Variant::OP_SUBSTRACT);
+ _RCO2(OP_MUL, Variant::OP_MULTIPLY);
+ _RCO2(OP_DIV, Variant::OP_DIVIDE);
+ _RCO1(OP_NEG, Variant::OP_NEGATE);
+ _RCO1(OP_NOT, Variant::OP_NOT);
+ _RCO2(OP_CMP_EQ, Variant::OP_EQUAL);
+ _RCO2(OP_CMP_NEQ, Variant::OP_NOT_EQUAL);
+ _RCO2(OP_CMP_LEQ, Variant::OP_LESS_EQUAL);
+ _RCO2(OP_CMP_GEQ, Variant::OP_GREATER_EQUAL);
+ _RCO2(OP_CMP_LESS, Variant::OP_LESS);
+ _RCO2(OP_CMP_GREATER, Variant::OP_GREATER);
+ _RCO2(OP_CMP_OR, Variant::OP_OR);
+ _RCO2(OP_CMP_AND, Variant::OP_AND);
default: {}
}
}
-
return p_func;
-
}
bool ShaderLanguage::is_token_operator(TokenType p_type) {
- return (p_type==TK_OP_EQUAL) ||
- (p_type==TK_OP_NOT_EQUAL) ||
- (p_type==TK_OP_LESS) ||
- (p_type==TK_OP_LESS_EQUAL) ||
- (p_type==TK_OP_GREATER) ||
- (p_type==TK_OP_GREATER_EQUAL) ||
- (p_type==TK_OP_AND) ||
- (p_type==TK_OP_OR) ||
- (p_type==TK_OP_NOT) ||
- (p_type==TK_OP_ADD) ||
- (p_type==TK_OP_SUB) ||
- (p_type==TK_OP_MUL) ||
- (p_type==TK_OP_DIV) ||
- (p_type==TK_OP_NEG) ||
- (p_type==TK_OP_ASSIGN) ||
- (p_type==TK_OP_ASSIGN_ADD) ||
- (p_type==TK_OP_ASSIGN_SUB) ||
- (p_type==TK_OP_ASSIGN_MUL) ||
- (p_type==TK_OP_ASSIGN_DIV);
-
+ return (p_type == TK_OP_EQUAL) ||
+ (p_type == TK_OP_NOT_EQUAL) ||
+ (p_type == TK_OP_LESS) ||
+ (p_type == TK_OP_LESS_EQUAL) ||
+ (p_type == TK_OP_GREATER) ||
+ (p_type == TK_OP_GREATER_EQUAL) ||
+ (p_type == TK_OP_AND) ||
+ (p_type == TK_OP_OR) ||
+ (p_type == TK_OP_NOT) ||
+ (p_type == TK_OP_ADD) ||
+ (p_type == TK_OP_SUB) ||
+ (p_type == TK_OP_MUL) ||
+ (p_type == TK_OP_DIV) ||
+ (p_type == TK_OP_NEG) ||
+ (p_type == TK_OP_ASSIGN) ||
+ (p_type == TK_OP_ASSIGN_ADD) ||
+ (p_type == TK_OP_ASSIGN_SUB) ||
+ (p_type == TK_OP_ASSIGN_MUL) ||
+ (p_type == TK_OP_ASSIGN_DIV);
}
ShaderLanguage::Operator ShaderLanguage::get_token_operator(TokenType p_type) {
- switch(p_type) {
- case TK_OP_EQUAL: return OP_CMP_EQ ;
+ switch (p_type) {
+ case TK_OP_EQUAL: return OP_CMP_EQ;
case TK_OP_NOT_EQUAL: return OP_CMP_NEQ;
- case TK_OP_LESS: return OP_CMP_LESS ;
- case TK_OP_LESS_EQUAL: return OP_CMP_LEQ ;
- case TK_OP_GREATER: return OP_CMP_GREATER ;
- case TK_OP_GREATER_EQUAL: return OP_CMP_GEQ ;
- case TK_OP_AND: return OP_CMP_AND ;
- case TK_OP_OR: return OP_CMP_OR ;
- case TK_OP_NOT: return OP_NOT ;
- case TK_OP_ADD: return OP_ADD ;
- case TK_OP_SUB: return OP_SUB ;
- case TK_OP_MUL: return OP_MUL ;
- case TK_OP_DIV: return OP_DIV ;
- case TK_OP_NEG: return OP_NEG ;
- case TK_OP_ASSIGN: return OP_ASSIGN ;
- case TK_OP_ASSIGN_ADD: return OP_ASSIGN_ADD ;
- case TK_OP_ASSIGN_SUB: return OP_ASSIGN_SUB ;
- case TK_OP_ASSIGN_MUL: return OP_ASSIGN_MUL ;
- case TK_OP_ASSIGN_DIV: return OP_ASSIGN_DIV ;
+ case TK_OP_LESS: return OP_CMP_LESS;
+ case TK_OP_LESS_EQUAL: return OP_CMP_LEQ;
+ case TK_OP_GREATER: return OP_CMP_GREATER;
+ case TK_OP_GREATER_EQUAL: return OP_CMP_GEQ;
+ case TK_OP_AND: return OP_CMP_AND;
+ case TK_OP_OR: return OP_CMP_OR;
+ case TK_OP_NOT: return OP_NOT;
+ case TK_OP_ADD: return OP_ADD;
+ case TK_OP_SUB: return OP_SUB;
+ case TK_OP_MUL: return OP_MUL;
+ case TK_OP_DIV: return OP_DIV;
+ case TK_OP_NEG: return OP_NEG;
+ case TK_OP_ASSIGN: return OP_ASSIGN;
+ case TK_OP_ASSIGN_ADD: return OP_ASSIGN_ADD;
+ case TK_OP_ASSIGN_SUB: return OP_ASSIGN_SUB;
+ case TK_OP_ASSIGN_MUL: return OP_ASSIGN_MUL;
+ case TK_OP_ASSIGN_DIV: return OP_ASSIGN_DIV;
default: ERR_FAIL_V(OP_MAX);
}
return OP_MAX;
}
-
-Error ShaderLanguage::parse_expression(Parser& parser,Node *p_parent,Node **r_expr) {
+Error ShaderLanguage::parse_expression(Parser &parser, Node *p_parent, Node **r_expr) {
Vector<Expression> expression;
//Vector<TokenType> operators;
- while(true) {
+ while (true) {
- Node *expr=NULL;
+ Node *expr = NULL;
-
- if (parser.get_next_token_type()==TK_PARENTHESIS_OPEN) {
+ if (parser.get_next_token_type() == TK_PARENTHESIS_OPEN) {
//handle subexpression
parser.advance();
- Error err = parse_expression(parser,p_parent,&expr);
+ Error err = parse_expression(parser, p_parent, &expr);
if (err)
return err;
- if (parser.get_next_token_type()!=TK_PARENTHESIS_CLOSE) {
+ if (parser.get_next_token_type() != TK_PARENTHESIS_CLOSE) {
parser.set_error("Expected ')' in expression");
return ERR_PARSE_ERROR;
@@ -1550,64 +1519,62 @@ Error ShaderLanguage::parse_expression(Parser& parser,Node *p_parent,Node **r_ex
parser.advance();
- } else if (parser.get_next_token_type()==TK_REAL_CONSTANT) {
-
+ } else if (parser.get_next_token_type() == TK_REAL_CONSTANT) {
ConstantNode *constant = parser.create_node<ConstantNode>(p_parent);
- constant->value=parser.get_next_token().text.operator String().to_double();
- constant->datatype=TYPE_FLOAT;
- expr=constant;
+ constant->value = parser.get_next_token().text.operator String().to_double();
+ constant->datatype = TYPE_FLOAT;
+ expr = constant;
parser.advance();
- } else if (parser.get_next_token_type()==TK_TRUE) {
+ } else if (parser.get_next_token_type() == TK_TRUE) {
//print_line("found true");
//handle true constant
ConstantNode *constant = parser.create_node<ConstantNode>(p_parent);
- constant->value=true;
- constant->datatype=TYPE_BOOL;
- expr=constant;
+ constant->value = true;
+ constant->datatype = TYPE_BOOL;
+ expr = constant;
parser.advance();
- } else if (parser.get_next_token_type()==TK_FALSE) {
+ } else if (parser.get_next_token_type() == TK_FALSE) {
//handle false constant
ConstantNode *constant = parser.create_node<ConstantNode>(p_parent);
- constant->value=false;
- constant->datatype=TYPE_BOOL;
- expr=constant;
+ constant->value = false;
+ constant->datatype = TYPE_BOOL;
+ expr = constant;
parser.advance();
- } else if (parser.get_next_token_type()==TK_TYPE_VOID) {
+ } else if (parser.get_next_token_type() == TK_TYPE_VOID) {
//make sure void is not used in expression
parser.set_error("Void value not allowed in Expression");
return ERR_PARSE_ERROR;
- } else if (parser.get_next_token_type(1)==TK_PARENTHESIS_OPEN && (is_token_nonvoid_datatype(parser.get_next_token_type()) || parser.get_next_token_type()==TK_INDENTIFIER)) {
-
+ } else if (parser.get_next_token_type(1) == TK_PARENTHESIS_OPEN && (is_token_nonvoid_datatype(parser.get_next_token_type()) || parser.get_next_token_type() == TK_INDENTIFIER)) {
//function or constructor
StringName name;
- DataType constructor=TYPE_VOID;
+ DataType constructor = TYPE_VOID;
if (is_token_nonvoid_datatype(parser.get_next_token_type())) {
- constructor=get_token_datatype(parser.get_next_token_type());
- switch(get_token_datatype(parser.get_next_token_type())) {
- case TYPE_BOOL: name="bool"; break;
- case TYPE_FLOAT: name="float"; break;
- case TYPE_VEC2: name="vec2"; break;
- case TYPE_VEC3: name="vec3"; break;
- case TYPE_VEC4: name="vec4"; break;
- case TYPE_MAT2: name="mat2"; break;
- case TYPE_MAT3: name="mat3"; break;
- case TYPE_MAT4: name="mat4"; break;
- default: ERR_FAIL_V(ERR_BUG);
+ constructor = get_token_datatype(parser.get_next_token_type());
+ switch (get_token_datatype(parser.get_next_token_type())) {
+ case TYPE_BOOL: name = "bool"; break;
+ case TYPE_FLOAT: name = "float"; break;
+ case TYPE_VEC2: name = "vec2"; break;
+ case TYPE_VEC3: name = "vec3"; break;
+ case TYPE_VEC4: name = "vec4"; break;
+ case TYPE_MAT2: name = "mat2"; break;
+ case TYPE_MAT3: name = "mat3"; break;
+ case TYPE_MAT4: name = "mat4"; break;
+ default: ERR_FAIL_V(ERR_BUG);
}
} else {
- name=parser.get_next_token().text;
+ name = parser.get_next_token().text;
}
- if (!test_existing_identifier(p_parent,name)) {
+ if (!test_existing_identifier(p_parent, name)) {
- parser.set_error("Unknown identifier in expression: "+name);
+ parser.set_error("Unknown identifier in expression: " + name);
return ERR_PARSE_ERROR;
}
@@ -1615,34 +1582,33 @@ Error ShaderLanguage::parse_expression(Parser& parser,Node *p_parent,Node **r_ex
OperatorNode *func = parser.create_node<OperatorNode>(p_parent);
- func->op=constructor!=TYPE_VOID?OP_CONSTRUCT:OP_CALL;
+ func->op = constructor != TYPE_VOID ? OP_CONSTRUCT : OP_CALL;
VariableNode *funcname = parser.create_node<VariableNode>(func);
- funcname->name=name;
+ funcname->name = name;
func->arguments.push_back(funcname);
//parse parameters
- if (parser.get_next_token_type()==TK_PARENTHESIS_CLOSE) {
+ if (parser.get_next_token_type() == TK_PARENTHESIS_CLOSE) {
parser.advance();
} else {
- while(true) {
-
+ while (true) {
- Node *arg=NULL;
- Error err = parse_expression(parser,func,&arg);
+ Node *arg = NULL;
+ Error err = parse_expression(parser, func, &arg);
if (err)
return err;
func->arguments.push_back(arg);
- if (parser.get_next_token_type()==TK_PARENTHESIS_CLOSE) {
+ if (parser.get_next_token_type() == TK_PARENTHESIS_CLOSE) {
parser.advance();
break;
- } else if (parser.get_next_token_type()==TK_COMMA) {
+ } else if (parser.get_next_token_type() == TK_COMMA) {
- if (parser.get_next_token_type(1)==TK_PARENTHESIS_CLOSE) {
+ if (parser.get_next_token_type(1) == TK_PARENTHESIS_CLOSE) {
parser.set_error("Expression expected");
return ERR_PARSE_ERROR;
@@ -1654,92 +1620,86 @@ Error ShaderLanguage::parse_expression(Parser& parser,Node *p_parent,Node **r_ex
parser.set_error("Expected ',' or ')'");
return ERR_PARSE_ERROR;
}
-
}
}
- expr=validate_function_call(parser,func);
+ expr = validate_function_call(parser, func);
if (!expr) {
- parser.set_error("Invalid arguments to function/constructor: "+StringName(name));
+ parser.set_error("Invalid arguments to function/constructor: " + StringName(name));
return ERR_PARSE_ERROR;
-
}
- } else if (parser.get_next_token_type()==TK_INDENTIFIER) {
+ } else if (parser.get_next_token_type() == TK_INDENTIFIER) {
//probably variable
-
- Node *node =p_parent;
- bool existing=false;
+ Node *node = p_parent;
+ bool existing = false;
DataType datatype;
- StringName identifier=parser.get_next_token().text;
+ StringName identifier = parser.get_next_token().text;
- while(node) {
+ while (node) {
- if (node->type==Node::TYPE_BLOCK) {
+ if (node->type == Node::TYPE_BLOCK) {
- BlockNode *block = (BlockNode*)node;
+ BlockNode *block = (BlockNode *)node;
if (block->variables.has(identifier)) {
- existing=true;
- datatype=block->variables[identifier];
+ existing = true;
+ datatype = block->variables[identifier];
break;
}
}
- if (node->type==Node::TYPE_FUNCTION) {
+ if (node->type == Node::TYPE_FUNCTION) {
- FunctionNode *function=(FunctionNode*)node;
- for(int i=0;i<function->arguments.size();i++) {
- if (function->arguments[i].name==identifier) {
- existing=true;
- datatype=function->arguments[i].type;
+ FunctionNode *function = (FunctionNode *)node;
+ for (int i = 0; i < function->arguments.size(); i++) {
+ if (function->arguments[i].name == identifier) {
+ existing = true;
+ datatype = function->arguments[i].type;
break;
}
}
if (existing)
break;
-
}
- if (node->type==Node::TYPE_PROGRAM) {
+ if (node->type == Node::TYPE_PROGRAM) {
- ProgramNode *program = (ProgramNode*)node;
+ ProgramNode *program = (ProgramNode *)node;
if (program->builtin_variables.has(identifier)) {
datatype = program->builtin_variables[identifier];
- existing=true;
+ existing = true;
break;
}
if (program->uniforms.has(identifier)) {
datatype = program->uniforms[identifier].type;
- existing=true;
+ existing = true;
break;
}
-
}
- node=node->parent;
+ node = node->parent;
}
if (!existing) {
- parser.set_error("Nonexistent identifier in expression: "+identifier);
+ parser.set_error("Nonexistent identifier in expression: " + identifier);
return ERR_PARSE_ERROR;
-
}
VariableNode *varname = parser.create_node<VariableNode>(p_parent);
- varname->name=identifier;
- varname->datatype_cache=datatype;
+ varname->name = identifier;
+ varname->datatype_cache = datatype;
parser.advance();
- expr=varname;
+ expr = varname;
- } else if (parser.get_next_token_type()==TK_OP_SUB || parser.get_next_token_type()==TK_OP_NOT) {
+ } else if (parser.get_next_token_type() == TK_OP_SUB || parser.get_next_token_type() == TK_OP_NOT) {
//single prefix operators
- TokenType token_type=parser.get_next_token_type();
+ TokenType token_type = parser.get_next_token_type();
parser.advance();
//Node *subexpr=NULL;
//Error err = parse_expression(parser,p_parent,&subexpr);
@@ -1749,11 +1709,13 @@ Error ShaderLanguage::parse_expression(Parser& parser,Node *p_parent,Node **r_ex
//OperatorNode *op = parser.create_node<OperatorNode>(p_parent);
Expression e;
- e.is_op=true;
+ e.is_op = true;
- switch(token_type) {
- case TK_OP_SUB: e.op=TK_OP_NEG; break;
- case TK_OP_NOT: e.op=TK_OP_NOT; break;
+ switch (token_type) {
+ case TK_OP_SUB: e.op = TK_OP_NEG; break;
+ case TK_OP_NOT:
+ e.op = TK_OP_NOT;
+ break;
//case TK_OP_PLUS_PLUS: op->op=OP_PLUS_PLUS; break;
//case TK_OP_MINUS_MINUS: op->op=OP_MINUS_MINUS; break;
default: ERR_FAIL_V(ERR_BUG);
@@ -1763,27 +1725,24 @@ Error ShaderLanguage::parse_expression(Parser& parser,Node *p_parent,Node **r_ex
continue;
-
} else {
print_line("found bug?");
- print_line("misplaced token: "+String(token_names[parser.get_next_token_type()]));
+ print_line("misplaced token: " + String(token_names[parser.get_next_token_type()]));
- parser.set_error("Error parsing expression, misplaced: "+String(token_names[parser.get_next_token_type()]));
+ parser.set_error("Error parsing expression, misplaced: " + String(token_names[parser.get_next_token_type()]));
return ERR_PARSE_ERROR;
//nothing
}
- ERR_FAIL_COND_V(!expr,ERR_BUG);
-
+ ERR_FAIL_COND_V(!expr, ERR_BUG);
/* OK now see what's NEXT to the operator.. */
/* OK now see what's NEXT to the operator.. */
/* OK now see what's NEXT to the operator.. */
+ if (parser.get_next_token_type() == TK_PERIOD) {
- if (parser.get_next_token_type()==TK_PERIOD) {
-
- if (parser.get_next_token_type(1)!=TK_INDENTIFIER) {
+ if (parser.get_next_token_type(1) != TK_INDENTIFIER) {
parser.set_error("Expected identifier as member");
return ERR_PARSE_ERROR;
}
@@ -1791,32 +1750,32 @@ Error ShaderLanguage::parse_expression(Parser& parser,Node *p_parent,Node **r_ex
DataType dt = compute_node_type(expr);
String ident = parser.get_next_token(1).text;
- bool ok=true;
+ bool ok = true;
DataType member_type;
- switch(dt) {
+ switch (dt) {
case TYPE_VEC2: {
int l = ident.length();
- if (l==1) {
- member_type=TYPE_FLOAT;
- } else if (l==2) {
- member_type=TYPE_VEC2;
+ if (l == 1) {
+ member_type = TYPE_FLOAT;
+ } else if (l == 2) {
+ member_type = TYPE_VEC2;
} else {
- ok=false;
+ ok = false;
break;
}
- const CharType *c=ident.ptr();
- for(int i=0;i<l;i++) {
+ const CharType *c = ident.ptr();
+ for (int i = 0; i < l; i++) {
- switch(c[i]) {
+ switch (c[i]) {
case 'r':
case 'g':
case 'x':
case 'y':
break;
default:
- ok=false;
+ ok = false;
break;
}
}
@@ -1825,21 +1784,21 @@ Error ShaderLanguage::parse_expression(Parser& parser,Node *p_parent,Node **r_ex
case TYPE_VEC3: {
int l = ident.length();
- if (l==1) {
- member_type=TYPE_FLOAT;
- } else if (l==2) {
- member_type=TYPE_VEC2;
- } else if (l==3) {
- member_type=TYPE_VEC3;
+ if (l == 1) {
+ member_type = TYPE_FLOAT;
+ } else if (l == 2) {
+ member_type = TYPE_VEC2;
+ } else if (l == 3) {
+ member_type = TYPE_VEC3;
} else {
- ok=false;
+ ok = false;
break;
}
- const CharType *c=ident.ptr();
- for(int i=0;i<l;i++) {
+ const CharType *c = ident.ptr();
+ for (int i = 0; i < l; i++) {
- switch(c[i]) {
+ switch (c[i]) {
case 'r':
case 'g':
case 'b':
@@ -1848,7 +1807,7 @@ Error ShaderLanguage::parse_expression(Parser& parser,Node *p_parent,Node **r_ex
case 'z':
break;
default:
- ok=false;
+ ok = false;
break;
}
}
@@ -1857,23 +1816,23 @@ Error ShaderLanguage::parse_expression(Parser& parser,Node *p_parent,Node **r_ex
case TYPE_VEC4: {
int l = ident.length();
- if (l==1) {
- member_type=TYPE_FLOAT;
- } else if (l==2) {
- member_type=TYPE_VEC2;
- } else if (l==3) {
- member_type=TYPE_VEC3;
- } else if (l==4) {
- member_type=TYPE_VEC4;
+ if (l == 1) {
+ member_type = TYPE_FLOAT;
+ } else if (l == 2) {
+ member_type = TYPE_VEC2;
+ } else if (l == 3) {
+ member_type = TYPE_VEC3;
+ } else if (l == 4) {
+ member_type = TYPE_VEC4;
} else {
- ok=false;
+ ok = false;
break;
}
- const CharType *c=ident.ptr();
- for(int i=0;i<l;i++) {
+ const CharType *c = ident.ptr();
+ for (int i = 0; i < l; i++) {
- switch(c[i]) {
+ switch (c[i]) {
case 'r':
case 'g':
case 'b':
@@ -1884,43 +1843,50 @@ Error ShaderLanguage::parse_expression(Parser& parser,Node *p_parent,Node **r_ex
case 'w':
break;
default:
- ok=false;
+ ok = false;
break;
}
}
} break;
- case TYPE_MAT2: ok=(ident=="x" || ident=="y"); member_type=TYPE_VEC2; break;
- case TYPE_MAT3: ok=(ident=="x" || ident=="y" || ident=="z" ); member_type=TYPE_VEC3; break;
- case TYPE_MAT4: ok=(ident=="x" || ident=="y" || ident=="z" || ident=="w"); member_type=TYPE_VEC4; break;
+ case TYPE_MAT2:
+ ok = (ident == "x" || ident == "y");
+ member_type = TYPE_VEC2;
+ break;
+ case TYPE_MAT3:
+ ok = (ident == "x" || ident == "y" || ident == "z");
+ member_type = TYPE_VEC3;
+ break;
+ case TYPE_MAT4:
+ ok = (ident == "x" || ident == "y" || ident == "z" || ident == "w");
+ member_type = TYPE_VEC4;
+ break;
default: {}
}
if (!ok) {
- parser.set_error("Invalid member for expression: ."+ident);
+ parser.set_error("Invalid member for expression: ." + ident);
return ERR_PARSE_ERROR;
}
MemberNode *mn = parser.create_node<MemberNode>(p_parent);
- mn->basetype=dt;
- mn->datatype=member_type;
- mn->name=ident;
- mn->owner=expr;
- expr=mn;
+ mn->basetype = dt;
+ mn->datatype = member_type;
+ mn->name = ident;
+ mn->owner = expr;
+ expr = mn;
parser.advance(2);
//todo
//member (period) has priority over any operator
//creates a subindexing expression in place
-
- } else if (parser.get_next_token_type()==TK_BRACKET_OPEN) {
+ } else if (parser.get_next_token_type() == TK_BRACKET_OPEN) {
//todo
//subindexing has priority over any operator
//creates a subindexing expression in place
-
} /*else if (parser.get_next_token_type()==TK_OP_PLUS_PLUS || parser.get_next_token_type()==TK_OP_MINUS_MINUS) {
//todo
//inc/dec operators have priority over any operator
@@ -1930,16 +1896,15 @@ Error ShaderLanguage::parse_expression(Parser& parser,Node *p_parent,Node **r_ex
} */
Expression e;
- e.is_op=false;
- e.node=expr;
+ e.is_op = false;
+ e.node = expr;
expression.push_back(e);
-
if (is_token_operator(parser.get_next_token_type())) {
Expression o;
- o.is_op=true;
- o.op=parser.get_next_token_type();
+ o.is_op = true;
+ o.op = parser.get_next_token_type();
expression.push_back(o);
parser.advance();
} else {
@@ -1947,87 +1912,96 @@ Error ShaderLanguage::parse_expression(Parser& parser,Node *p_parent,Node **r_ex
}
}
-
-
/* Reduce the set set of expressions and place them in an operator tree, respecting precedence */
- while(expression.size()>1) {
+ while (expression.size() > 1) {
- int next_op=-1;
- int min_priority=0xFFFFF;
- bool is_unary=false;
+ int next_op = -1;
+ int min_priority = 0xFFFFF;
+ bool is_unary = false;
- for(int i=0;i<expression.size();i++) {
+ for (int i = 0; i < expression.size(); i++) {
if (!expression[i].is_op) {
continue;
}
- bool unary=false;
+ bool unary = false;
int priority;
- switch(expression[i].op) {
+ switch (expression[i].op) {
- case TK_OP_NOT: priority=0; unary=true; break;
- case TK_OP_NEG: priority=0; unary=true; break;
+ case TK_OP_NOT:
+ priority = 0;
+ unary = true;
+ break;
+ case TK_OP_NEG:
+ priority = 0;
+ unary = true;
+ break;
- case TK_OP_MUL: priority=1; break;
- case TK_OP_DIV: priority=1; break;
+ case TK_OP_MUL: priority = 1; break;
+ case TK_OP_DIV: priority = 1; break;
- case TK_OP_ADD: priority=2; break;
- case TK_OP_SUB: priority=2; break;
+ case TK_OP_ADD: priority = 2; break;
+ case TK_OP_SUB:
+ priority = 2;
+ break;
// shift left/right =2
- case TK_OP_LESS: priority=4; break;
- case TK_OP_LESS_EQUAL: priority=4; break;
- case TK_OP_GREATER: priority=4; break;
- case TK_OP_GREATER_EQUAL: priority=4; break;
+ case TK_OP_LESS: priority = 4; break;
+ case TK_OP_LESS_EQUAL: priority = 4; break;
+ case TK_OP_GREATER: priority = 4; break;
+ case TK_OP_GREATER_EQUAL: priority = 4; break;
- case TK_OP_EQUAL: priority=5; break;
- case TK_OP_NOT_EQUAL: priority=5; break;
+ case TK_OP_EQUAL: priority = 5; break;
+ case TK_OP_NOT_EQUAL:
+ priority = 5;
+ break;
//bit and =5
//bit xor =6
//bit or=7
- case TK_OP_AND: priority=8; break;
- case TK_OP_OR: priority=9; break;
+ case TK_OP_AND: priority = 8; break;
+ case TK_OP_OR:
+ priority = 9;
+ break;
// ?: = 10
- case TK_OP_ASSIGN_ADD: priority=11; break;
- case TK_OP_ASSIGN_SUB: priority=11; break;
- case TK_OP_ASSIGN_MUL: priority=11; break;
- case TK_OP_ASSIGN_DIV: priority=11; break;
- case TK_OP_ASSIGN: priority=11; break;
-
- default: ERR_FAIL_V(ERR_BUG); //unexpected operator
+ case TK_OP_ASSIGN_ADD: priority = 11; break;
+ case TK_OP_ASSIGN_SUB: priority = 11; break;
+ case TK_OP_ASSIGN_MUL: priority = 11; break;
+ case TK_OP_ASSIGN_DIV: priority = 11; break;
+ case TK_OP_ASSIGN: priority = 11; break;
+ default:
+ ERR_FAIL_V(ERR_BUG); //unexpected operator
}
- if (priority<min_priority) {
+ if (priority < min_priority) {
// < is used for left to right (default)
// <= is used for right to left
- next_op=i;
- min_priority=priority;
- is_unary=unary;
+ next_op = i;
+ min_priority = priority;
+ is_unary = unary;
}
-
}
- ERR_FAIL_COND_V(next_op==-1,ERR_BUG);
+ ERR_FAIL_COND_V(next_op == -1, ERR_BUG);
// OK! create operator..
// OK! create operator..
if (is_unary) {
- int expr_pos=next_op;
- while(expression[expr_pos].is_op) {
+ int expr_pos = next_op;
+ while (expression[expr_pos].is_op) {
expr_pos++;
- if (expr_pos==expression.size()) {
+ if (expr_pos == expression.size()) {
//can happen..
parser.set_error("Unexpected end of expression..");
return ERR_BUG;
@@ -2035,72 +2009,68 @@ Error ShaderLanguage::parse_expression(Parser& parser,Node *p_parent,Node **r_ex
}
//consecutively do unary opeators
- for(int i=expr_pos-1;i>=next_op;i--) {
+ for (int i = expr_pos - 1; i >= next_op; i--) {
OperatorNode *op = parser.create_node<OperatorNode>(p_parent);
- op->op=get_token_operator(expression[i].op);
- op->arguments.push_back(expression[i+1].node);
+ op->op = get_token_operator(expression[i].op);
+ op->arguments.push_back(expression[i + 1].node);
- expression[i].is_op=false;
- expression[i].node=validate_operator(parser,op);
+ expression[i].is_op = false;
+ expression[i].node = validate_operator(parser, op);
if (!expression[i].node) {
String at;
- for(int i=0;i<op->arguments.size();i++) {
- if (i>0)
- at+=" and ";
- at+=get_datatype_name(compute_node_type(op->arguments[i]));
-
+ for (int i = 0; i < op->arguments.size(); i++) {
+ if (i > 0)
+ at += " and ";
+ at += get_datatype_name(compute_node_type(op->arguments[i]));
}
- parser.set_error("Invalid argument to unary operator "+String(token_names[op->op])+": "+at);
+ parser.set_error("Invalid argument to unary operator " + String(token_names[op->op]) + ": " + at);
return ERR_PARSE_ERROR;
}
- expression.remove(i+1);
+ expression.remove(i + 1);
}
} else {
- if (next_op <1 || next_op>=(expression.size()-1)) {
+ if (next_op < 1 || next_op >= (expression.size() - 1)) {
parser.set_error("Parser bug..");
ERR_FAIL_V(ERR_BUG);
}
OperatorNode *op = parser.create_node<OperatorNode>(p_parent);
- op->op=get_token_operator(expression[next_op].op);
+ op->op = get_token_operator(expression[next_op].op);
- if (expression[next_op-1].is_op) {
+ if (expression[next_op - 1].is_op) {
parser.set_error("Parser bug..");
ERR_FAIL_V(ERR_BUG);
}
- if (expression[next_op+1].is_op) {
+ if (expression[next_op + 1].is_op) {
// this is not invalid and can really appear
// but it becomes invalid anyway because no binary op
// can be followed by an unary op in a valid combination,
// due to how precedence works, unaries will always dissapear first
parser.set_error("Parser bug..");
-
}
-
- op->arguments.push_back(expression[next_op-1].node); //expression goes as left
- op->arguments.push_back(expression[next_op+1].node); //next expression goes as right
+ op->arguments.push_back(expression[next_op - 1].node); //expression goes as left
+ op->arguments.push_back(expression[next_op + 1].node); //next expression goes as right
//replace all 3 nodes by this operator and make it an expression
- expression[next_op-1].node=validate_operator(parser,op);
- if (!expression[next_op-1].node) {
+ expression[next_op - 1].node = validate_operator(parser, op);
+ if (!expression[next_op - 1].node) {
String at;
- for(int i=0;i<op->arguments.size();i++) {
- if (i>0)
- at+=" and ";
- at+=get_datatype_name(compute_node_type(op->arguments[i]));
-
+ for (int i = 0; i < op->arguments.size(); i++) {
+ if (i > 0)
+ at += " and ";
+ at += get_datatype_name(compute_node_type(op->arguments[i]));
}
- static const char *op_names[OP_MAX]={"=","+","-","*","/","+=","-=","*=","/=","-","!","==","!=","<=",">=","<",">","||","&&","call","()"};
+ static const char *op_names[OP_MAX] = { "=", "+", "-", "*", "/", "+=", "-=", "*=", "/=", "-", "!", "==", "!=", "<=", ">=", "<", ">", "||", "&&", "call", "()" };
- parser.set_error("Invalid arguments to operator "+String(op_names[op->op])+": "+at);
+ parser.set_error("Invalid arguments to operator " + String(op_names[op->op]) + ": " + at);
return ERR_PARSE_ERROR;
}
expression.remove(next_op);
@@ -2132,14 +2102,13 @@ Error ShaderLanguage::parse_expression(Parser& parser,Node *p_parent,Node **r_ex
expressions.remove(next_op+1);
operators.remove(next_op);
#endif
-
}
- *r_expr=expression[0].node;
+ *r_expr = expression[0].node;
return OK;
-/*
+ /*
TokenType token_type=parser.get_next_token_type();
OperatorNode *op = parser.create_node<OperatorNode>(p_parent);
op->op=get_token_operator(parser.get_next_token_type());
@@ -2159,101 +2128,97 @@ Error ShaderLanguage::parse_expression(Parser& parser,Node *p_parent,Node **r_ex
}
*/
-
}
-Error ShaderLanguage::parse_variable_declaration(Parser& parser,BlockNode *p_block) {
+Error ShaderLanguage::parse_variable_declaration(Parser &parser, BlockNode *p_block) {
- bool uniform = parser.get_next_token(-1).type==TK_UNIFORM;
+ bool uniform = parser.get_next_token(-1).type == TK_UNIFORM;
- DataType type=get_token_datatype(parser.get_next_token_type(0));
- bool iscolor = parser.get_next_token_type(0)==TK_TYPE_COLOR;
+ DataType type = get_token_datatype(parser.get_next_token_type(0));
+ bool iscolor = parser.get_next_token_type(0) == TK_TYPE_COLOR;
- if (type==TYPE_VOID) {
+ if (type == TYPE_VOID) {
parser.set_error("Cannot Declare a 'void' Variable");
return ERR_PARSE_ERROR;
}
- if (type==TYPE_TEXTURE && !uniform) {
+ if (type == TYPE_TEXTURE && !uniform) {
parser.set_error("Cannot Declare a Non-Uniform Texture");
return ERR_PARSE_ERROR;
}
- if (type==TYPE_CUBEMAP && !uniform) {
+ if (type == TYPE_CUBEMAP && !uniform) {
parser.set_error("Cannot Declare a Non-Uniform Cubemap");
return ERR_PARSE_ERROR;
}
-
parser.advance();
- int found=0;
-
- while(true) {
+ int found = 0;
+ while (true) {
- if (found && parser.get_next_token_type()!=TK_COMMA) {
+ if (found && parser.get_next_token_type() != TK_COMMA) {
break;
}
- if (parser.get_next_token_type()!=TK_INDENTIFIER) {
+ if (parser.get_next_token_type() != TK_INDENTIFIER) {
parser.set_error("Identifier Expected");
return ERR_PARSE_ERROR;
-
}
StringName name = parser.get_next_token().text;
- if (test_existing_identifier(p_block,name)) {
- parser.set_error("Duplicate Identifier (existing variable/function): "+name);
+ if (test_existing_identifier(p_block, name)) {
+ parser.set_error("Duplicate Identifier (existing variable/function): " + name);
return ERR_PARSE_ERROR;
}
- found=true;
+ found = true;
parser.advance();
//see if declaration has an initializer
- if (parser.get_next_token_type()==TK_OP_ASSIGN) {
+ if (parser.get_next_token_type() == TK_OP_ASSIGN) {
parser.advance();
- OperatorNode * op = parser.create_node<OperatorNode>(p_block);
- VariableNode * var = parser.create_node<VariableNode>(op);
- var->name=name;
- var->datatype_cache=type;
- var->uniform=uniform;
+ OperatorNode *op = parser.create_node<OperatorNode>(p_block);
+ VariableNode *var = parser.create_node<VariableNode>(op);
+ var->name = name;
+ var->datatype_cache = type;
+ var->uniform = uniform;
Node *expr;
- Error err = parse_expression(parser,p_block,&expr);
+ Error err = parse_expression(parser, p_block, &expr);
if (err)
return err;
if (var->uniform) {
- if (expr->type!=Node::TYPE_CONSTANT) {
+ if (expr->type != Node::TYPE_CONSTANT) {
parser.set_error("Uniform can only be initialized to a constant.");
return ERR_PARSE_ERROR;
}
Uniform u;
- u.order=parser.program->uniforms.size();
- u.type=type;
- u.default_value=static_cast<ConstantNode*>(expr)->value;
- if (iscolor && u.default_value.get_type()==Variant::PLANE) {
+ u.order = parser.program->uniforms.size();
+ u.type = type;
+ u.default_value = static_cast<ConstantNode *>(expr)->value;
+ if (iscolor && u.default_value.get_type() == Variant::PLANE) {
Color c;
Plane p = u.default_value;
- c=Color(p.normal.x,p.normal.y,p.normal.z,p.d);
- u.default_value=c;
+ c = Color(p.normal.x, p.normal.y, p.normal.z, p.d);
+ u.default_value = c;
}
- parser.program->uniforms[var->name]=u;
+ parser.program->uniforms[var->name] = u;
} else {
- op->op=OP_ASSIGN;
+ op->op = OP_ASSIGN;
op->arguments.push_back(var);
op->arguments.push_back(expr);
- Node *n=validate_operator(parser,op);
+ Node *n = validate_operator(parser, op);
if (!n) {
- parser.set_error("Invalid initializer for variable: "+name);
+ parser.set_error("Invalid initializer for variable: " + name);
return ERR_PARSE_ERROR;
}
p_block->statements.push_back(n);
@@ -2262,80 +2227,76 @@ Error ShaderLanguage::parse_variable_declaration(Parser& parser,BlockNode *p_blo
} else {
//initialize it EMPTY
- OperatorNode * op = parser.create_node<OperatorNode>(p_block);
- VariableNode * var = parser.create_node<VariableNode>(op);
- ConstantNode * con = parser.create_node<ConstantNode>(op);
+ OperatorNode *op = parser.create_node<OperatorNode>(p_block);
+ VariableNode *var = parser.create_node<VariableNode>(op);
+ ConstantNode *con = parser.create_node<ConstantNode>(op);
- var->name=name;
- var->datatype_cache=type;
- var->uniform=uniform;
- con->datatype=type;
+ var->name = name;
+ var->datatype_cache = type;
+ var->uniform = uniform;
+ con->datatype = type;
- switch(type) {
- case TYPE_BOOL: con->value=false; break;
- case TYPE_FLOAT: con->value=0.0; break;
- case TYPE_VEC2: con->value=Vector2(); break;
- case TYPE_VEC3: con->value=Vector3(); break;
- case TYPE_VEC4: con->value=iscolor?Variant(Color()):Variant(Plane()); break;
- case TYPE_MAT2: con->value=Matrix32(); break;
- case TYPE_MAT3: con->value=Matrix3(); break;
- case TYPE_MAT4: con->value=Transform(); break;
+ switch (type) {
+ case TYPE_BOOL: con->value = false; break;
+ case TYPE_FLOAT: con->value = 0.0; break;
+ case TYPE_VEC2: con->value = Vector2(); break;
+ case TYPE_VEC3: con->value = Vector3(); break;
+ case TYPE_VEC4: con->value = iscolor ? Variant(Color()) : Variant(Plane()); break;
+ case TYPE_MAT2: con->value = Matrix32(); break;
+ case TYPE_MAT3: con->value = Matrix3(); break;
+ case TYPE_MAT4: con->value = Transform(); break;
case TYPE_TEXTURE:
- case TYPE_CUBEMAP: con->value=RID(); break;
+ case TYPE_CUBEMAP: con->value = RID(); break;
default: {}
}
if (uniform) {
Uniform u;
- u.type=type;
- u.default_value=con->value;
- u.order=parser.program->uniforms.size();
- parser.program->uniforms[var->name]=u;
+ u.type = type;
+ u.default_value = con->value;
+ u.order = parser.program->uniforms.size();
+ parser.program->uniforms[var->name] = u;
} else {
- op->op=OP_ASSIGN;
+ op->op = OP_ASSIGN;
op->arguments.push_back(var);
op->arguments.push_back(con);
p_block->statements.push_back(op);
}
-
}
if (!uniform)
- p_block->variables[name]=type;
-
+ p_block->variables[name] = type;
}
- if (parser.get_next_token_type()!=TK_SEMICOLON) {
+ if (parser.get_next_token_type() != TK_SEMICOLON) {
parser.set_error("Expected ';'");
return ERR_PARSE_ERROR;
}
-
return OK;
-
}
-Error ShaderLanguage::parse_flow_if(Parser& parser,Node *p_parent,Node **r_statement) {
+Error ShaderLanguage::parse_flow_if(Parser &parser, Node *p_parent, Node **r_statement) {
ControlFlowNode *cf = parser.create_node<ControlFlowNode>(p_parent);
- cf->flow_op=FLOW_OP_IF;
+ cf->flow_op = FLOW_OP_IF;
parser.advance();
- if (parser.get_next_token_type()!=TK_PARENTHESIS_OPEN) {
+ if (parser.get_next_token_type() != TK_PARENTHESIS_OPEN) {
parser.set_error("Expected '(' after 'if'");
return ERR_PARSE_ERROR;
}
parser.advance();
- Node *expression=NULL;
- Error err = parse_expression(parser,cf,&expression);
+ Node *expression = NULL;
+ Error err = parse_expression(parser, cf, &expression);
if (err)
return err;
- if (compute_node_type(expression)!=TYPE_BOOL) {
+ if (compute_node_type(expression) != TYPE_BOOL) {
parser.set_error("Expression for 'if' is not boolean");
return ERR_PARSE_ERROR;
@@ -2343,65 +2304,62 @@ Error ShaderLanguage::parse_flow_if(Parser& parser,Node *p_parent,Node **r_state
cf->statements.push_back(expression);
- if (parser.get_next_token_type()!=TK_PARENTHESIS_CLOSE) {
+ if (parser.get_next_token_type() != TK_PARENTHESIS_CLOSE) {
parser.set_error("Expected ')' after expression");
return ERR_PARSE_ERROR;
}
parser.advance();
- if (parser.get_next_token_type()!=TK_CURLY_BRACKET_OPEN) {
+ if (parser.get_next_token_type() != TK_CURLY_BRACKET_OPEN) {
parser.set_error("Expected statement block after 'if()'");
return ERR_PARSE_ERROR;
}
- Node *substatement=NULL;
- err = parse_statement(parser,cf,&substatement);
+ Node *substatement = NULL;
+ err = parse_statement(parser, cf, &substatement);
if (err)
return err;
cf->statements.push_back(substatement);
- if (parser.get_next_token_type()==TK_CF_ELSE) {
+ if (parser.get_next_token_type() == TK_CF_ELSE) {
parser.advance();
- if (parser.get_next_token_type()!=TK_CURLY_BRACKET_OPEN) {
+ if (parser.get_next_token_type() != TK_CURLY_BRACKET_OPEN) {
parser.set_error("Expected statement block after 'else'");
return ERR_PARSE_ERROR;
}
- substatement=NULL;
- err = parse_statement(parser,cf,&substatement);
+ substatement = NULL;
+ err = parse_statement(parser, cf, &substatement);
if (err)
return err;
cf->statements.push_back(substatement);
}
-
-
- *r_statement=cf;
+ *r_statement = cf;
return OK;
}
-Error ShaderLanguage::parse_flow_return(Parser& parser,Node *p_parent,Node **r_statement) {
-
+Error ShaderLanguage::parse_flow_return(Parser &parser, Node *p_parent, Node **r_statement) {
- FunctionNode *function=NULL;
+ FunctionNode *function = NULL;
- Node *parent=p_parent;
+ Node *parent = p_parent;
- while(parent) {
+ while (parent) {
- if (parent->type==Node::TYPE_FUNCTION) {
+ if (parent->type == Node::TYPE_FUNCTION) {
- function=(FunctionNode*)parent;
+ function = (FunctionNode *)parent;
break;
}
- parent=parent->parent;
+ parent = parent->parent;
}
if (!function) {
@@ -2412,29 +2370,28 @@ Error ShaderLanguage::parse_flow_return(Parser& parser,Node *p_parent,Node **r_s
ControlFlowNode *cf = parser.create_node<ControlFlowNode>(p_parent);
- cf->flow_op=FLOW_OP_RETURN;
+ cf->flow_op = FLOW_OP_RETURN;
parser.advance();
- if (function->return_type!=TYPE_VOID) {
+ if (function->return_type != TYPE_VOID) {
// should expect a return expression.
- Node *expr=NULL;
- Error err = parse_expression(parser,cf,&expr);
+ Node *expr = NULL;
+ Error err = parse_expression(parser, cf, &expr);
if (err)
return err;
- if (compute_node_type(expr)!=function->return_type) {
+ if (compute_node_type(expr) != function->return_type) {
parser.set_error("Invalid type for 'return' expression");
return ERR_PARSE_ERROR;
}
cf->statements.push_back(expr);
}
- *r_statement=cf;
+ *r_statement = cf;
-
- if (parser.get_next_token_type()!=TK_SEMICOLON) {
+ if (parser.get_next_token_type() != TK_SEMICOLON) {
parser.set_error("Expected ';'");
return ERR_PARSE_ERROR;
}
@@ -2442,50 +2399,49 @@ Error ShaderLanguage::parse_flow_return(Parser& parser,Node *p_parent,Node **r_s
return OK;
}
-Error ShaderLanguage::parse_statement(Parser& parser,Node *p_parent,Node **r_statement) {
+Error ShaderLanguage::parse_statement(Parser &parser, Node *p_parent, Node **r_statement) {
- *r_statement=NULL;
+ *r_statement = NULL;
TokenType token_type = parser.get_next_token_type();
- if (token_type==TK_CURLY_BRACKET_OPEN) {
+ if (token_type == TK_CURLY_BRACKET_OPEN) {
//sub-block
parser.advance();
BlockNode *block = parser.create_node<BlockNode>(p_parent);
- *r_statement=block;
- return parse_block(parser,block);
- } else if (token_type==TK_SEMICOLON) {
+ *r_statement = block;
+ return parse_block(parser, block);
+ } else if (token_type == TK_SEMICOLON) {
// empty ;
parser.advance();
return OK;
- } else if (token_type==TK_CF_IF) {
- return parse_flow_if(parser,p_parent,r_statement);
+ } else if (token_type == TK_CF_IF) {
+ return parse_flow_if(parser, p_parent, r_statement);
- } else if (token_type==TK_CF_RETURN) {
- return parse_flow_return(parser,p_parent,r_statement);
+ } else if (token_type == TK_CF_RETURN) {
+ return parse_flow_return(parser, p_parent, r_statement);
} else {
- Error err=parse_expression(parser,p_parent,r_statement);
+ Error err = parse_expression(parser, p_parent, r_statement);
if (err)
return err;
- if (parser.get_next_token_type()!=TK_SEMICOLON) {
+ if (parser.get_next_token_type() != TK_SEMICOLON) {
parser.set_error("Expected ';'");
return ERR_PARSE_ERROR;
}
-
}
return OK;
}
-Error ShaderLanguage::parse_block(Parser& parser,BlockNode *p_block) {
+Error ShaderLanguage::parse_block(Parser &parser, BlockNode *p_block) {
- while(true) {
+ while (true) {
if (parser.is_at_end()) {
- if (p_block->parent->type!=Node::TYPE_PROGRAM) {
+ if (p_block->parent->type != Node::TYPE_PROGRAM) {
parser.set_error("Unexpected End of File");
return ERR_PARSE_ERROR;
}
@@ -2494,33 +2450,33 @@ Error ShaderLanguage::parse_block(Parser& parser,BlockNode *p_block) {
TokenType token_type = parser.get_next_token_type();
- if (token_type==TK_CURLY_BRACKET_CLOSE) {
- if (p_block->parent->type==Node::TYPE_PROGRAM) {
+ if (token_type == TK_CURLY_BRACKET_CLOSE) {
+ if (p_block->parent->type == Node::TYPE_PROGRAM) {
parser.set_error("Unexpected '}'");
return ERR_PARSE_ERROR;
}
parser.advance();
return OK; // exit block
- } else if (token_type==TK_UNIFORM) {
+ } else if (token_type == TK_UNIFORM) {
- if (p_block!=parser.program->body) {
+ if (p_block != parser.program->body) {
parser.set_error("Uniform only allowed in main program body.");
return ERR_PARSE_ERROR;
}
parser.advance();
- Error err=parse_variable_declaration(parser,p_block);
+ Error err = parse_variable_declaration(parser, p_block);
if (err)
return err;
} else if (is_token_datatype(token_type)) {
- Error err=OK;
+ Error err = OK;
if (parser_is_at_function(parser))
- err = parse_function(parser,p_block);
+ err = parse_function(parser, p_block);
else {
- err = parse_variable_declaration(parser,p_block);
+ err = parse_variable_declaration(parser, p_block);
}
if (err)
@@ -2528,129 +2484,123 @@ Error ShaderLanguage::parse_block(Parser& parser,BlockNode *p_block) {
} else {
// must be a statement
- Node *statement=NULL;
+ Node *statement = NULL;
- Error err = parse_statement(parser,p_block,&statement);
+ Error err = parse_statement(parser, p_block, &statement);
if (err)
return err;
if (statement) {
p_block->statements.push_back(statement);
}
-
}
}
return OK;
}
-
-
-Error ShaderLanguage::parse(const Vector<Token>& p_tokens,ShaderType p_type,CompileFunc p_compile_func,void *p_userdata,String *r_error,int *r_err_line,int *r_err_column) {
-
+Error ShaderLanguage::parse(const Vector<Token> &p_tokens, ShaderType p_type, CompileFunc p_compile_func, void *p_userdata, String *r_error, int *r_err_line, int *r_err_column) {
Parser parser(p_tokens);
parser.program = parser.create_node<ProgramNode>(NULL);
parser.program->body = parser.create_node<BlockNode>(parser.program);
-
//add builtins
- switch(p_type) {
+ switch (p_type) {
case SHADER_MATERIAL_VERTEX: {
- int idx=0;
+ int idx = 0;
while (vertex_builtins_defs[idx].name) {
- parser.program->builtin_variables[vertex_builtins_defs[idx].name]=vertex_builtins_defs[idx].type;
+ parser.program->builtin_variables[vertex_builtins_defs[idx].name] = vertex_builtins_defs[idx].type;
idx++;
}
} break;
case SHADER_MATERIAL_FRAGMENT: {
- int idx=0;
+ int idx = 0;
while (fragment_builtins_defs[idx].name) {
- parser.program->builtin_variables[fragment_builtins_defs[idx].name]=fragment_builtins_defs[idx].type;
+ parser.program->builtin_variables[fragment_builtins_defs[idx].name] = fragment_builtins_defs[idx].type;
idx++;
}
} break;
case SHADER_MATERIAL_LIGHT: {
- int idx=0;
+ int idx = 0;
while (light_builtins_defs[idx].name) {
- parser.program->builtin_variables[light_builtins_defs[idx].name]=light_builtins_defs[idx].type;
+ parser.program->builtin_variables[light_builtins_defs[idx].name] = light_builtins_defs[idx].type;
idx++;
}
} break;
case SHADER_CANVAS_ITEM_VERTEX: {
- int idx=0;
+ int idx = 0;
while (ci_vertex_builtins_defs[idx].name) {
- parser.program->builtin_variables[ci_vertex_builtins_defs[idx].name]=ci_vertex_builtins_defs[idx].type;
+ parser.program->builtin_variables[ci_vertex_builtins_defs[idx].name] = ci_vertex_builtins_defs[idx].type;
idx++;
}
} break;
case SHADER_CANVAS_ITEM_FRAGMENT: {
- int idx=0;
+ int idx = 0;
while (ci_fragment_builtins_defs[idx].name) {
- parser.program->builtin_variables[ci_fragment_builtins_defs[idx].name]=ci_fragment_builtins_defs[idx].type;
+ parser.program->builtin_variables[ci_fragment_builtins_defs[idx].name] = ci_fragment_builtins_defs[idx].type;
idx++;
}
} break;
case SHADER_CANVAS_ITEM_LIGHT: {
- int idx=0;
+ int idx = 0;
while (ci_light_builtins_defs[idx].name) {
- parser.program->builtin_variables[ci_light_builtins_defs[idx].name]=ci_light_builtins_defs[idx].type;
+ parser.program->builtin_variables[ci_light_builtins_defs[idx].name] = ci_light_builtins_defs[idx].type;
idx++;
}
} break;
case SHADER_POST_PROCESS: {
- int idx=0;
+ int idx = 0;
while (postprocess_fragment_builtins_defs[idx].name) {
- parser.program->builtin_variables[postprocess_fragment_builtins_defs[idx].name]=postprocess_fragment_builtins_defs[idx].type;
+ parser.program->builtin_variables[postprocess_fragment_builtins_defs[idx].name] = postprocess_fragment_builtins_defs[idx].type;
idx++;
}
} break;
}
- Error err = parse_block(parser,parser.program->body);
+ Error err = parse_block(parser, parser.program->body);
if (err) {
- parser.get_error(r_error,r_err_line,r_err_column);
+ parser.get_error(r_error, r_err_line, r_err_column);
return err;
}
if (p_compile_func) {
- err = p_compile_func(p_userdata,parser.program);
+ err = p_compile_func(p_userdata, parser.program);
}
//clean up nodes created
- while(parser.nodegc.size()) {
+ while (parser.nodegc.size()) {
- memdelete( parser.nodegc.front()->get() );
+ memdelete(parser.nodegc.front()->get());
parser.nodegc.pop_front();
}
return err;
}
-Error ShaderLanguage::compile(const String& p_code,ShaderType p_type,CompileFunc p_compile_func,void *p_userdata,String *r_error,int *r_err_line,int *r_err_column) {
+Error ShaderLanguage::compile(const String &p_code, ShaderType p_type, CompileFunc p_compile_func, void *p_userdata, String *r_error, int *r_err_line, int *r_err_column) {
- *r_error="";
- *r_err_line=0;
- *r_err_column=0;
+ *r_error = "";
+ *r_err_line = 0;
+ *r_err_column = 0;
Vector<Token> tokens;
- Error err = tokenize(p_code,&tokens,r_error,r_err_line,r_err_column);
- if (err!=OK) {
+ Error err = tokenize(p_code, &tokens, r_error, r_err_line, r_err_column);
+ if (err != OK) {
print_line("tokenizer error!");
}
- if (err!=OK) {
+ if (err != OK) {
return err;
}
- err = parse(tokens,p_type,p_compile_func,p_userdata,r_error,r_err_line,r_err_column);
- if (err!=OK) {
+ err = parse(tokens, p_type, p_compile_func, p_userdata, r_error, r_err_line, r_err_column);
+ if (err != OK) {
return err;
}
return OK;
}
-
void ShaderLanguage::get_keyword_list(ShaderType p_type, List<String> *p_keywords) {
- int idx=0;
+ int idx = 0;
p_keywords->push_back("uniform");
p_keywords->push_back("texture");
@@ -2659,51 +2609,50 @@ void ShaderLanguage::get_keyword_list(ShaderType p_type, List<String> *p_keyword
p_keywords->push_back("if");
p_keywords->push_back("else");
- while(intrinsic_func_defs[idx].name) {
+ while (intrinsic_func_defs[idx].name) {
p_keywords->push_back(intrinsic_func_defs[idx].name);
idx++;
}
-
- switch(p_type) {
+ switch (p_type) {
case SHADER_MATERIAL_VERTEX: {
- idx=0;
+ idx = 0;
while (vertex_builtins_defs[idx].name) {
p_keywords->push_back(vertex_builtins_defs[idx].name);
idx++;
}
} break;
case SHADER_MATERIAL_FRAGMENT: {
- idx=0;
+ idx = 0;
while (fragment_builtins_defs[idx].name) {
p_keywords->push_back(fragment_builtins_defs[idx].name);
idx++;
}
} break;
case SHADER_MATERIAL_LIGHT: {
- idx=0;
+ idx = 0;
while (light_builtins_defs[idx].name) {
p_keywords->push_back(light_builtins_defs[idx].name);
idx++;
}
} break;
case SHADER_CANVAS_ITEM_VERTEX: {
- idx=0;
+ idx = 0;
while (ci_vertex_builtins_defs[idx].name) {
p_keywords->push_back(ci_vertex_builtins_defs[idx].name);
idx++;
}
} break;
case SHADER_CANVAS_ITEM_FRAGMENT: {
- idx=0;
+ idx = 0;
while (ci_fragment_builtins_defs[idx].name) {
p_keywords->push_back(ci_fragment_builtins_defs[idx].name);
idx++;
}
} break;
case SHADER_CANVAS_ITEM_LIGHT: {
- idx=0;
+ idx = 0;
while (ci_light_builtins_defs[idx].name) {
p_keywords->push_back(ci_light_builtins_defs[idx].name);
idx++;
@@ -2711,13 +2660,11 @@ void ShaderLanguage::get_keyword_list(ShaderType p_type, List<String> *p_keyword
} break;
case SHADER_POST_PROCESS: {
- idx=0;
+ idx = 0;
while (postprocess_fragment_builtins_defs[idx].name) {
p_keywords->push_back(postprocess_fragment_builtins_defs[idx].name);
idx++;
}
} break;
-
}
-
}
diff --git a/servers/visual/shader_language.h b/servers/visual/shader_language.h
index 207c3272c..10c69d822 100644
--- a/servers/visual/shader_language.h
+++ b/servers/visual/shader_language.h
@@ -29,20 +29,16 @@
#ifndef SHADER_LANGUAGE_H
#define SHADER_LANGUAGE_H
-#include "typedefs.h"
-#include "ustring.h"
#include "list.h"
-#include "string_db.h"
#include "map.h"
+#include "string_db.h"
+#include "typedefs.h"
+#include "ustring.h"
#include "variant.h"
-
-class ShaderLanguage {
-
-
+class ShaderLanguage {
public:
-
enum TokenType {
TK_EMPTY,
@@ -98,8 +94,6 @@ public:
TK_MAX
};
-
-
/* COMPILER */
enum ShaderType {
@@ -175,7 +169,7 @@ public:
TYPE_MEMBER
};
- Node * parent;
+ Node *parent;
Type type;
virtual DataType get_datatype() const { return TYPE_VOID; }
@@ -183,15 +177,17 @@ public:
virtual ~Node() {}
};
-
struct OperatorNode : public Node {
DataType return_cache;
Operator op;
- Vector<Node*> arguments;
+ Vector<Node *> arguments;
virtual DataType get_datatype() const { return return_cache; }
- OperatorNode() { type=TYPE_OPERATOR; return_cache=TYPE_VOID; }
+ OperatorNode() {
+ type = TYPE_OPERATOR;
+ return_cache = TYPE_VOID;
+ }
};
struct VariableNode : public Node {
@@ -200,7 +196,11 @@ public:
StringName name;
virtual DataType get_datatype() const { return datatype_cache; }
- VariableNode() { type=TYPE_VARIABLE; datatype_cache=TYPE_VOID; uniform=false; }
+ VariableNode() {
+ type = TYPE_VARIABLE;
+ datatype_cache = TYPE_VOID;
+ uniform = false;
+ }
};
struct ConstantNode : public Node {
@@ -209,21 +209,24 @@ public:
Variant value;
virtual DataType get_datatype() const { return datatype; }
- ConstantNode() { type=TYPE_CONSTANT; }
+ ConstantNode() { type = TYPE_CONSTANT; }
};
struct BlockNode : public Node {
- Map<StringName,DataType> variables;
- List<Node*> statements;
- BlockNode() { type=TYPE_BLOCK; }
+ Map<StringName, DataType> variables;
+ List<Node *> statements;
+ BlockNode() { type = TYPE_BLOCK; }
};
struct ControlFlowNode : public Node {
FlowOperation flow_op;
- Vector<Node*> statements;
- ControlFlowNode() { type=TYPE_CONTROL_FLOW; flow_op=FLOW_OP_IF;}
+ Vector<Node *> statements;
+ ControlFlowNode() {
+ type = TYPE_CONTROL_FLOW;
+ flow_op = FLOW_OP_IF;
+ }
};
struct MemberNode : public Node {
@@ -231,15 +234,13 @@ public:
DataType basetype;
DataType datatype;
StringName name;
- Node* owner;
+ Node *owner;
virtual DataType get_datatype() const { return datatype; }
- MemberNode() { type=TYPE_MEMBER; }
+ MemberNode() { type = TYPE_MEMBER; }
};
-
struct FunctionNode : public Node {
-
struct Argument {
StringName name;
@@ -251,8 +252,7 @@ public:
Vector<Argument> arguments;
BlockNode *body;
- FunctionNode() { type=TYPE_FUNCTION; }
-
+ FunctionNode() { type = TYPE_FUNCTION; }
};
struct Uniform {
@@ -266,20 +266,18 @@ public:
struct Function {
StringName name;
- FunctionNode*function;
+ FunctionNode *function;
};
-
- Map<StringName,DataType> builtin_variables;
- Map<StringName,Uniform> uniforms;
+ Map<StringName, DataType> builtin_variables;
+ Map<StringName, Uniform> uniforms;
Vector<Function> functions;
BlockNode *body;
- ProgramNode() { type=TYPE_PROGRAM; }
+ ProgramNode() { type = TYPE_PROGRAM; }
};
-
struct Expression {
bool is_op;
@@ -289,7 +287,7 @@ public:
};
};
- typedef Error (*CompileFunc)(void*,ProgramNode*);
+ typedef Error (*CompileFunc)(void *, ProgramNode *);
struct VarInfo {
@@ -298,73 +296,82 @@ public:
};
private:
-
-
-
- static const char * token_names[TK_MAX];
+ static const char *token_names[TK_MAX];
struct Token {
TokenType type;
StringName text;
- uint16_t line,col;
+ uint16_t line, col;
- Token(TokenType p_type=TK_EMPTY,const String& p_text=String()) { type=p_type; text=p_text; line=0; col=0; }
+ Token(TokenType p_type = TK_EMPTY, const String &p_text = String()) {
+ type = p_type;
+ text = p_text;
+ line = 0;
+ col = 0;
+ }
};
-
-
- static Token read_token(const CharType* p_text,int p_len,int &r_line,int &r_chars);
- static Error tokenize(const String& p_text,Vector<Token> *p_tokens,String *r_error,int *r_err_line,int *r_err_column);
-
-
-
+ static Token read_token(const CharType *p_text, int p_len, int &r_line, int &r_chars);
+ static Error tokenize(const String &p_text, Vector<Token> *p_tokens, String *r_error, int *r_err_line, int *r_err_column);
class Parser {
Vector<Token> tokens;
int pos;
String error;
- public:
-
- void set_error(const String& p_error) { error=p_error; }
+ public:
+ void set_error(const String &p_error) { error = p_error; }
void get_error(String *r_error, int *r_line, int *r_column) {
- *r_error=error;
- *r_line=get_next_token(0).line;
- *r_column=get_next_token(0).col;
+ *r_error = error;
+ *r_line = get_next_token(0).line;
+ *r_column = get_next_token(0).col;
}
-
-
- Token get_next_token(int ofs=0) const { int idx=pos+ofs; if (idx<0 || idx>=tokens.size()) return Token(TK_ERROR); return tokens[idx]; }
- TokenType get_next_token_type(int ofs=0) const { int idx=pos+ofs; if (idx<0 || idx>=tokens.size()) return TK_ERROR; return tokens[idx].type; }
- void advance(int p_amount=1) { pos+=p_amount; }
- bool is_at_end() const { return pos>=tokens.size(); }
+ Token get_next_token(int ofs = 0) const {
+ int idx = pos + ofs;
+ if (idx < 0 || idx >= tokens.size()) return Token(TK_ERROR);
+ return tokens[idx];
+ }
+ TokenType get_next_token_type(int ofs = 0) const {
+ int idx = pos + ofs;
+ if (idx < 0 || idx >= tokens.size()) return TK_ERROR;
+ return tokens[idx].type;
+ }
+ void advance(int p_amount = 1) { pos += p_amount; }
+ bool is_at_end() const { return pos >= tokens.size(); }
ProgramNode *program;
- template<class T>
- T* create_node(Node *p_parent) { T*n=memnew( T ); nodegc.push_back(n); n->parent=p_parent; return n; }
- List<Node*> nodegc;
+ template <class T>
+ T *create_node(Node *p_parent) {
+ T *n = memnew(T);
+ nodegc.push_back(n);
+ n->parent = p_parent;
+ return n;
+ }
+ List<Node *> nodegc;
- Parser(const Vector<Token>& p_tokens) { tokens=p_tokens; pos=0;}
+ Parser(const Vector<Token> &p_tokens) {
+ tokens = p_tokens;
+ pos = 0;
+ }
};
struct IntrinsicFuncDef {
- enum { MAX_ARGS=5 };
- const char* name;
+ enum { MAX_ARGS = 5 };
+ const char *name;
DataType rettype;
const DataType args[MAX_ARGS];
-
};
static const IntrinsicFuncDef intrinsic_func_defs[];
struct OperatorDef {
- enum { MAX_ARGS=2 };
+ enum { MAX_ARGS = 2 };
Operator op;
DataType rettype;
const DataType args[MAX_ARGS];
@@ -374,7 +381,7 @@ private:
struct BuiltinsDef {
- const char* name;
+ const char *name;
DataType type;
};
@@ -386,7 +393,6 @@ private:
static const BuiltinsDef ci_fragment_builtins_defs[];
static const BuiltinsDef ci_light_builtins_defs[];
-
static const BuiltinsDef postprocess_fragment_builtins_defs[];
static DataType get_token_datatype(TokenType p_type);
@@ -394,37 +400,34 @@ private:
static bool is_token_datatype(TokenType p_type);
static bool is_token_nonvoid_datatype(TokenType p_type);
- static bool test_existing_identifier(Node *p_node,const StringName p_identifier,bool p_func=true,bool p_var=true,bool p_builtin=true);
+ static bool test_existing_identifier(Node *p_node, const StringName p_identifier, bool p_func = true, bool p_var = true, bool p_builtin = true);
- static bool parser_is_at_function(Parser& parser);
+ static bool parser_is_at_function(Parser &parser);
static DataType compute_node_type(Node *p_node);
- static Node* validate_function_call(Parser&parser, OperatorNode *p_func);
- static Node* validate_operator(Parser& parser,OperatorNode *p_func);
+ static Node *validate_function_call(Parser &parser, OperatorNode *p_func);
+ static Node *validate_operator(Parser &parser, OperatorNode *p_func);
static bool is_token_operator(TokenType p_type);
static Operator get_token_operator(TokenType p_type);
- static Error parse_expression(Parser& parser,Node *p_parent,Node **r_expr);
+ static Error parse_expression(Parser &parser, Node *p_parent, Node **r_expr);
- static Error parse_variable_declaration(Parser& parser,BlockNode *p_block);
- static Error parse_function(Parser& parser,BlockNode *p_block);
- static Error parse_flow_if(Parser& parser,Node *p_parent,Node **r_statement);
- static Error parse_flow_return(Parser& parser,Node *p_parent,Node **r_statement);
- static Error parse_statement(Parser& parser,Node *p_parent,Node **r_statement);
- static Error parse_block(Parser& parser,BlockNode *p_block);
+ static Error parse_variable_declaration(Parser &parser, BlockNode *p_block);
+ static Error parse_function(Parser &parser, BlockNode *p_block);
+ static Error parse_flow_if(Parser &parser, Node *p_parent, Node **r_statement);
+ static Error parse_flow_return(Parser &parser, Node *p_parent, Node **r_statement);
+ static Error parse_statement(Parser &parser, Node *p_parent, Node **r_statement);
+ static Error parse_block(Parser &parser, BlockNode *p_block);
+ static Error parse(const Vector<Token> &p_tokens, ShaderType p_type, CompileFunc p_compile_func, void *p_userdata, String *r_error, int *r_err_line, int *r_err_column);
- static Error parse(const Vector<Token> &p_tokens,ShaderType p_type,CompileFunc p_compile_func,void *p_userdata,String *r_error,int *r_err_line,int *r_err_column);
+ ;
-;
public:
+ static void get_keyword_list(ShaderType p_type, List<String> *p_keywords);
- static void get_keyword_list(ShaderType p_type,List<String> *p_keywords);
-
- static Error compile(const String& p_code,ShaderType p_type, CompileFunc p_compile_func,void *p_userdata,String *r_error,int *r_err_line,int *r_err_column);
- static String lex_debug(const String& p_code);
-
+ static Error compile(const String &p_code, ShaderType p_type, CompileFunc p_compile_func, void *p_userdata, String *r_error, int *r_err_line, int *r_err_column);
+ static String lex_debug(const String &p_code);
};
-
#endif // SHADER_LANGUAGE_H
diff --git a/servers/visual/visual_server_raster.cpp b/servers/visual/visual_server_raster.cpp
index f77f17317..568e81b9f 100644
--- a/servers/visual/visual_server_raster.cpp
+++ b/servers/visual/visual_server_raster.cpp
@@ -27,65 +27,54 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include "visual_server_raster.h"
-#include "os/os.h"
-#include "globals.h"
#include "default_mouse_cursor.xpm"
-#include "sort.h"
+#include "globals.h"
#include "io/marshalls.h"
+#include "os/os.h"
+#include "sort.h"
// careful, these may run in different threads than the visual server
-BalloonAllocator<> *VisualServerRaster::OctreeAllocator::allocator=NULL;
+BalloonAllocator<> *VisualServerRaster::OctreeAllocator::allocator = NULL;
-#define VS_CHANGED\
- changes++;\
+#define VS_CHANGED \
+ changes++;
// print_line(__FUNCTION__);
-
-
-
RID VisualServerRaster::texture_create() {
return rasterizer->texture_create();
}
+void VisualServerRaster::texture_allocate(RID p_texture, int p_width, int p_height, Image::Format p_format, uint32_t p_flags) {
-void VisualServerRaster::texture_allocate(RID p_texture, int p_width, int p_height,Image::Format p_format,uint32_t p_flags) {
-
- rasterizer->texture_allocate(p_texture,p_width,p_height,p_format,p_flags);
+ rasterizer->texture_allocate(p_texture, p_width, p_height, p_format, p_flags);
}
-void VisualServerRaster::texture_set_flags(RID p_texture,uint32_t p_flags) {
+void VisualServerRaster::texture_set_flags(RID p_texture, uint32_t p_flags) {
VS_CHANGED;
- rasterizer->texture_set_flags(p_texture,p_flags);
+ rasterizer->texture_set_flags(p_texture, p_flags);
}
-
-void VisualServerRaster::texture_set_data(RID p_texture,const Image& p_image,CubeMapSide p_cube_side) {
+void VisualServerRaster::texture_set_data(RID p_texture, const Image &p_image, CubeMapSide p_cube_side) {
VS_CHANGED;
- rasterizer->texture_set_data(p_texture,p_image,p_cube_side);
-
-
+ rasterizer->texture_set_data(p_texture, p_image, p_cube_side);
}
-Image VisualServerRaster::texture_get_data(RID p_texture,CubeMapSide p_cube_side) const {
-
+Image VisualServerRaster::texture_get_data(RID p_texture, CubeMapSide p_cube_side) const {
- return rasterizer->texture_get_data(p_texture,p_cube_side);
+ return rasterizer->texture_get_data(p_texture, p_cube_side);
}
-
uint32_t VisualServerRaster::texture_get_flags(RID p_texture) const {
return rasterizer->texture_get_flags(p_texture);
-
}
Image::Format VisualServerRaster::texture_get_format(RID p_texture) const {
return rasterizer->texture_get_format(p_texture);
-
}
uint32_t VisualServerRaster::texture_get_width(RID p_texture) const {
@@ -97,9 +86,9 @@ uint32_t VisualServerRaster::texture_get_height(RID p_texture) const {
return rasterizer->texture_get_height(p_texture);
}
-void VisualServerRaster::texture_set_size_override(RID p_texture,int p_width, int p_height) {
+void VisualServerRaster::texture_set_size_override(RID p_texture, int p_width, int p_height) {
- rasterizer->texture_set_size_override(p_texture,p_width,p_height);
+ rasterizer->texture_set_size_override(p_texture, p_width, p_height);
}
bool VisualServerRaster::texture_can_stream(RID p_texture) const {
@@ -107,22 +96,22 @@ bool VisualServerRaster::texture_can_stream(RID p_texture) const {
return false;
}
-void VisualServerRaster::texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const {
+void VisualServerRaster::texture_set_reload_hook(RID p_texture, ObjectID p_owner, const StringName &p_function) const {
- rasterizer->texture_set_reload_hook(p_texture,p_owner,p_function);
+ rasterizer->texture_set_reload_hook(p_texture, p_owner, p_function);
}
-void VisualServerRaster::texture_set_path(RID p_texture,const String& p_path) {
+void VisualServerRaster::texture_set_path(RID p_texture, const String &p_path) {
- rasterizer->texture_set_path(p_texture,p_path);
+ rasterizer->texture_set_path(p_texture, p_path);
}
-String VisualServerRaster::texture_get_path(RID p_texture) const{
+String VisualServerRaster::texture_get_path(RID p_texture) const {
return rasterizer->texture_get_path(p_texture);
}
-void VisualServerRaster::texture_debug_usage(List<TextureInfo> *r_info){
+void VisualServerRaster::texture_debug_usage(List<TextureInfo> *r_info) {
rasterizer->texture_debug_usage(r_info);
}
@@ -139,55 +128,52 @@ RID VisualServerRaster::shader_create(ShaderMode p_mode) {
return rasterizer->shader_create(p_mode);
}
-void VisualServerRaster::shader_set_mode(RID p_shader,ShaderMode p_mode){
+void VisualServerRaster::shader_set_mode(RID p_shader, ShaderMode p_mode) {
VS_CHANGED;
- rasterizer->shader_set_mode(p_shader,p_mode);
+ rasterizer->shader_set_mode(p_shader, p_mode);
}
-VisualServer::ShaderMode VisualServerRaster::shader_get_mode(RID p_shader) const{
+VisualServer::ShaderMode VisualServerRaster::shader_get_mode(RID p_shader) const {
return rasterizer->shader_get_mode(p_shader);
}
-
-void VisualServerRaster::shader_set_code(RID p_shader, const String& p_vertex, const String& p_fragment,const String& p_light,int p_vertex_ofs,int p_fragment_ofs,int p_light_ofs) {
+void VisualServerRaster::shader_set_code(RID p_shader, const String &p_vertex, const String &p_fragment, const String &p_light, int p_vertex_ofs, int p_fragment_ofs, int p_light_ofs) {
VS_CHANGED;
- rasterizer->shader_set_code(p_shader,p_vertex,p_fragment,p_light,p_vertex_ofs,p_fragment_ofs,p_light_ofs);
+ rasterizer->shader_set_code(p_shader, p_vertex, p_fragment, p_light, p_vertex_ofs, p_fragment_ofs, p_light_ofs);
}
-String VisualServerRaster::shader_get_vertex_code(RID p_shader) const{
+String VisualServerRaster::shader_get_vertex_code(RID p_shader) const {
return rasterizer->shader_get_vertex_code(p_shader);
}
-String VisualServerRaster::shader_get_fragment_code(RID p_shader) const{
+String VisualServerRaster::shader_get_fragment_code(RID p_shader) const {
return rasterizer->shader_get_fragment_code(p_shader);
}
-String VisualServerRaster::shader_get_light_code(RID p_shader) const{
+String VisualServerRaster::shader_get_light_code(RID p_shader) const {
return rasterizer->shader_get_light_code(p_shader);
}
void VisualServerRaster::shader_get_param_list(RID p_shader, List<PropertyInfo> *p_param_list) const {
- return rasterizer->shader_get_param_list(p_shader,p_param_list);
+ return rasterizer->shader_get_param_list(p_shader, p_param_list);
}
+void VisualServerRaster::shader_set_default_texture_param(RID p_shader, const StringName &p_name, RID p_texture) {
-void VisualServerRaster::shader_set_default_texture_param(RID p_shader, const StringName& p_name, RID p_texture) {
-
- rasterizer->shader_set_default_texture_param(p_shader,p_name,p_texture);
+ rasterizer->shader_set_default_texture_param(p_shader, p_name, p_texture);
}
-RID VisualServerRaster::shader_get_default_texture_param(RID p_shader, const StringName& p_name) const{
+RID VisualServerRaster::shader_get_default_texture_param(RID p_shader, const StringName &p_name) const {
- return rasterizer->shader_get_default_texture_param(p_shader,p_name);
+ return rasterizer->shader_get_default_texture_param(p_shader, p_name);
}
-
/* Material */
RID VisualServerRaster::material_create() {
@@ -198,7 +184,7 @@ RID VisualServerRaster::material_create() {
void VisualServerRaster::material_set_shader(RID p_material, RID p_shader) {
VS_CHANGED;
- rasterizer->material_set_shader(p_material, p_shader );
+ rasterizer->material_set_shader(p_material, p_shader);
}
RID VisualServerRaster::material_get_shader(RID p_material) const {
@@ -206,27 +192,26 @@ RID VisualServerRaster::material_get_shader(RID p_material) const {
return rasterizer->material_get_shader(p_material);
}
-void VisualServerRaster::material_set_param(RID p_material, const StringName& p_param, const Variant& p_value) {
+void VisualServerRaster::material_set_param(RID p_material, const StringName &p_param, const Variant &p_value) {
VS_CHANGED;
- rasterizer->material_set_param(p_material, p_param,p_value );
+ rasterizer->material_set_param(p_material, p_param, p_value);
}
-Variant VisualServerRaster::material_get_param(RID p_material, const StringName& p_param) const {
+Variant VisualServerRaster::material_get_param(RID p_material, const StringName &p_param) const {
- return rasterizer->material_get_param(p_material,p_param);
+ return rasterizer->material_get_param(p_material, p_param);
}
-void VisualServerRaster::material_set_flag(RID p_material, MaterialFlag p_flag,bool p_enabled) {
+void VisualServerRaster::material_set_flag(RID p_material, MaterialFlag p_flag, bool p_enabled) {
VS_CHANGED;
- rasterizer->material_set_flag(p_material,p_flag,p_enabled);
+ rasterizer->material_set_flag(p_material, p_flag, p_enabled);
}
void VisualServerRaster::material_set_depth_draw_mode(RID p_material, MaterialDepthDrawMode p_mode) {
VS_CHANGED;
- rasterizer->material_set_depth_draw_mode(p_material,p_mode);
-
+ rasterizer->material_set_depth_draw_mode(p_material, p_mode);
}
VS::MaterialDepthDrawMode VisualServerRaster::material_get_depth_draw_mode(RID p_material) const {
@@ -234,24 +219,23 @@ VS::MaterialDepthDrawMode VisualServerRaster::material_get_depth_draw_mode(RID p
return rasterizer->material_get_depth_draw_mode(p_material);
}
+bool VisualServerRaster::material_get_flag(RID p_material, MaterialFlag p_flag) const {
-bool VisualServerRaster::material_get_flag(RID p_material,MaterialFlag p_flag) const {
-
- return rasterizer->material_get_flag(p_material,p_flag);
+ return rasterizer->material_get_flag(p_material, p_flag);
}
-void VisualServerRaster::material_set_blend_mode(RID p_material,MaterialBlendMode p_mode) {
+void VisualServerRaster::material_set_blend_mode(RID p_material, MaterialBlendMode p_mode) {
VS_CHANGED;
- rasterizer->material_set_blend_mode(p_material,p_mode);
+ rasterizer->material_set_blend_mode(p_material, p_mode);
}
VS::MaterialBlendMode VisualServerRaster::material_get_blend_mode(RID p_material) const {
return rasterizer->material_get_blend_mode(p_material);
}
-void VisualServerRaster::material_set_line_width(RID p_material,float p_line_width) {
+void VisualServerRaster::material_set_line_width(RID p_material, float p_line_width) {
VS_CHANGED;
- rasterizer->material_set_line_width(p_material,p_line_width);
+ rasterizer->material_set_line_width(p_material, p_line_width);
}
float VisualServerRaster::material_get_line_width(RID p_material) const {
@@ -267,63 +251,58 @@ RID VisualServerRaster::fixed_material_create() {
void VisualServerRaster::fixed_material_set_flag(RID p_material, FixedMaterialFlags p_flag, bool p_enabled) {
- rasterizer->fixed_material_set_flag(p_material,p_flag,p_enabled);
+ rasterizer->fixed_material_set_flag(p_material, p_flag, p_enabled);
}
bool VisualServerRaster::fixed_material_get_flag(RID p_material, FixedMaterialFlags p_flag) const {
- return rasterizer->fixed_material_get_flag(p_material,p_flag);
+ return rasterizer->fixed_material_get_flag(p_material, p_flag);
}
-void VisualServerRaster::fixed_material_set_param(RID p_material, FixedMaterialParam p_parameter, const Variant& p_value) {
+void VisualServerRaster::fixed_material_set_param(RID p_material, FixedMaterialParam p_parameter, const Variant &p_value) {
VS_CHANGED;
- rasterizer->fixed_material_set_parameter(p_material,p_parameter,p_value);
+ rasterizer->fixed_material_set_parameter(p_material, p_parameter, p_value);
}
-Variant VisualServerRaster::fixed_material_get_param(RID p_material,FixedMaterialParam p_parameter) const {
+Variant VisualServerRaster::fixed_material_get_param(RID p_material, FixedMaterialParam p_parameter) const {
- return rasterizer->fixed_material_get_parameter(p_material,p_parameter);
+ return rasterizer->fixed_material_get_parameter(p_material, p_parameter);
}
-
-void VisualServerRaster::fixed_material_set_texture(RID p_material,FixedMaterialParam p_parameter, RID p_texture) {
+void VisualServerRaster::fixed_material_set_texture(RID p_material, FixedMaterialParam p_parameter, RID p_texture) {
VS_CHANGED;
- rasterizer->fixed_material_set_texture(p_material,p_parameter,p_texture);
+ rasterizer->fixed_material_set_texture(p_material, p_parameter, p_texture);
}
-RID VisualServerRaster::fixed_material_get_texture(RID p_material,FixedMaterialParam p_parameter) const {
+RID VisualServerRaster::fixed_material_get_texture(RID p_material, FixedMaterialParam p_parameter) const {
- return rasterizer->fixed_material_get_texture(p_material,p_parameter);
+ return rasterizer->fixed_material_get_texture(p_material, p_parameter);
}
-
-
-
-void VisualServerRaster::fixed_material_set_texcoord_mode(RID p_material,FixedMaterialParam p_parameter, FixedMaterialTexCoordMode p_mode) {
+void VisualServerRaster::fixed_material_set_texcoord_mode(RID p_material, FixedMaterialParam p_parameter, FixedMaterialTexCoordMode p_mode) {
VS_CHANGED;
- rasterizer->fixed_material_set_texcoord_mode(p_material,p_parameter,p_mode);
+ rasterizer->fixed_material_set_texcoord_mode(p_material, p_parameter, p_mode);
}
-VS::FixedMaterialTexCoordMode VisualServerRaster::fixed_material_get_texcoord_mode(RID p_material,FixedMaterialParam p_parameter) const {
+VS::FixedMaterialTexCoordMode VisualServerRaster::fixed_material_get_texcoord_mode(RID p_material, FixedMaterialParam p_parameter) const {
- return rasterizer->fixed_material_get_texcoord_mode(p_material,p_parameter);
+ return rasterizer->fixed_material_get_texcoord_mode(p_material, p_parameter);
}
-void VisualServerRaster::fixed_material_set_point_size(RID p_material,float p_size) {
+void VisualServerRaster::fixed_material_set_point_size(RID p_material, float p_size) {
VS_CHANGED
- rasterizer->fixed_material_set_point_size(p_material,p_size);
+ rasterizer->fixed_material_set_point_size(p_material, p_size);
}
-float VisualServerRaster::fixed_material_get_point_size(RID p_material) const{
+float VisualServerRaster::fixed_material_get_point_size(RID p_material) const {
return rasterizer->fixed_material_get_point_size(p_material);
}
-
-void VisualServerRaster::fixed_material_set_uv_transform(RID p_material,const Transform& p_transform) {
+void VisualServerRaster::fixed_material_set_uv_transform(RID p_material, const Transform &p_transform) {
VS_CHANGED;
- rasterizer->fixed_material_set_uv_transform(p_material,p_transform);
+ rasterizer->fixed_material_set_uv_transform(p_material, p_transform);
}
Transform VisualServerRaster::fixed_material_get_uv_transform(RID p_material) const {
@@ -331,20 +310,17 @@ Transform VisualServerRaster::fixed_material_get_uv_transform(RID p_material) co
return rasterizer->fixed_material_get_uv_transform(p_material);
}
-void VisualServerRaster::fixed_material_set_light_shader(RID p_material,FixedMaterialLightShader p_shader) {
+void VisualServerRaster::fixed_material_set_light_shader(RID p_material, FixedMaterialLightShader p_shader) {
VS_CHANGED;
- rasterizer->fixed_material_set_light_shader(p_material,p_shader);
-
+ rasterizer->fixed_material_set_light_shader(p_material, p_shader);
}
-VisualServerRaster::FixedMaterialLightShader VisualServerRaster::fixed_material_get_light_shader(RID p_material) const{
+VisualServerRaster::FixedMaterialLightShader VisualServerRaster::fixed_material_get_light_shader(RID p_material) const {
return rasterizer->fixed_material_get_light_shader(p_material);
}
-
-
/* MESH API */
RID VisualServerRaster::mesh_create() {
@@ -352,23 +328,21 @@ RID VisualServerRaster::mesh_create() {
return rasterizer->mesh_create();
}
-void VisualServerRaster::mesh_set_morph_target_count(RID p_mesh,int p_amount) {
+void VisualServerRaster::mesh_set_morph_target_count(RID p_mesh, int p_amount) {
- rasterizer->mesh_set_morph_target_count(p_mesh,p_amount);
+ rasterizer->mesh_set_morph_target_count(p_mesh, p_amount);
int amount = rasterizer->mesh_get_morph_target_count(p_mesh);
-
- Map< RID, Set<RID> >::Element * E = instance_dependency_map.find( p_mesh );
+ Map<RID, Set<RID> >::Element *E = instance_dependency_map.find(p_mesh);
if (!E)
return;
-
Set<RID>::Element *I = E->get().front();
- while(I) {
+ while (I) {
- Instance *ins = instance_owner.get( I->get() );
+ Instance *ins = instance_owner.get(I->get());
ins->data.morph_values.resize(amount);
I = I->next();
}
@@ -379,95 +353,81 @@ int VisualServerRaster::mesh_get_morph_target_count(RID p_mesh) const {
return rasterizer->mesh_get_morph_target_count(p_mesh);
}
-void VisualServerRaster::mesh_set_morph_target_mode(RID p_mesh,MorphTargetMode p_mode) {
+void VisualServerRaster::mesh_set_morph_target_mode(RID p_mesh, MorphTargetMode p_mode) {
- rasterizer->mesh_set_morph_target_mode(p_mesh,p_mode);
+ rasterizer->mesh_set_morph_target_mode(p_mesh, p_mode);
}
-VisualServer::MorphTargetMode VisualServerRaster::mesh_get_morph_target_mode(RID p_mesh) const{
+VisualServer::MorphTargetMode VisualServerRaster::mesh_get_morph_target_mode(RID p_mesh) const {
return rasterizer->mesh_get_morph_target_mode(p_mesh);
}
-void VisualServerRaster::mesh_add_custom_surface(RID p_mesh,const Variant& p_dat) {
-
-
+void VisualServerRaster::mesh_add_custom_surface(RID p_mesh, const Variant &p_dat) {
}
-
-void VisualServerRaster::mesh_add_surface(RID p_mesh,PrimitiveType p_primitive,const Array& p_arrays,const Array& p_blend_shapes,bool p_alpha_sort) {
+void VisualServerRaster::mesh_add_surface(RID p_mesh, PrimitiveType p_primitive, const Array &p_arrays, const Array &p_blend_shapes, bool p_alpha_sort) {
VS_CHANGED;
- _dependency_queue_update(p_mesh,true,true);
- rasterizer->mesh_add_surface(p_mesh,p_primitive,p_arrays,p_blend_shapes,p_alpha_sort);
-
+ _dependency_queue_update(p_mesh, true, true);
+ rasterizer->mesh_add_surface(p_mesh, p_primitive, p_arrays, p_blend_shapes, p_alpha_sort);
}
-Array VisualServerRaster::mesh_get_surface_arrays(RID p_mesh,int p_surface) const {
+Array VisualServerRaster::mesh_get_surface_arrays(RID p_mesh, int p_surface) const {
- return rasterizer->mesh_get_surface_arrays(p_mesh,p_surface);
+ return rasterizer->mesh_get_surface_arrays(p_mesh, p_surface);
}
-Array VisualServerRaster::mesh_get_surface_morph_arrays(RID p_mesh,int p_surface) const {
+Array VisualServerRaster::mesh_get_surface_morph_arrays(RID p_mesh, int p_surface) const {
- return rasterizer->mesh_get_surface_morph_arrays(p_mesh,p_surface);
+ return rasterizer->mesh_get_surface_morph_arrays(p_mesh, p_surface);
}
-
-
-
-void VisualServerRaster::mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material,bool p_owned){
+void VisualServerRaster::mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material, bool p_owned) {
VS_CHANGED;
- rasterizer->mesh_surface_set_material(p_mesh,p_surface,p_material,p_owned);
+ rasterizer->mesh_surface_set_material(p_mesh, p_surface, p_material, p_owned);
}
-RID VisualServerRaster::mesh_surface_get_material(RID p_mesh,int p_surface) const {
-
- return rasterizer->mesh_surface_get_material(p_mesh,p_surface);
+RID VisualServerRaster::mesh_surface_get_material(RID p_mesh, int p_surface) const {
+ return rasterizer->mesh_surface_get_material(p_mesh, p_surface);
}
+int VisualServerRaster::mesh_surface_get_array_len(RID p_mesh, int p_surface) const {
-int VisualServerRaster::mesh_surface_get_array_len(RID p_mesh, int p_surface) const{
-
- return rasterizer->mesh_surface_get_array_len(p_mesh,p_surface);
+ return rasterizer->mesh_surface_get_array_len(p_mesh, p_surface);
}
-int VisualServerRaster::mesh_surface_get_array_index_len(RID p_mesh, int p_surface) const{
-
+int VisualServerRaster::mesh_surface_get_array_index_len(RID p_mesh, int p_surface) const {
- return rasterizer->mesh_surface_get_array_index_len(p_mesh,p_surface);
+ return rasterizer->mesh_surface_get_array_index_len(p_mesh, p_surface);
}
-uint32_t VisualServerRaster::mesh_surface_get_format(RID p_mesh, int p_surface) const{
+uint32_t VisualServerRaster::mesh_surface_get_format(RID p_mesh, int p_surface) const {
- return rasterizer->mesh_surface_get_format(p_mesh,p_surface);
+ return rasterizer->mesh_surface_get_format(p_mesh, p_surface);
}
-VisualServer::PrimitiveType VisualServerRaster::mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const{
+VisualServer::PrimitiveType VisualServerRaster::mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const {
- return rasterizer->mesh_surface_get_primitive_type(p_mesh,p_surface);
+ return rasterizer->mesh_surface_get_primitive_type(p_mesh, p_surface);
}
+void VisualServerRaster::mesh_remove_surface(RID p_mesh, int p_surface) {
-void VisualServerRaster::mesh_remove_surface(RID p_mesh,int p_surface){
-
- rasterizer->mesh_remove_surface(p_mesh,p_surface);
- _dependency_queue_update(p_mesh,true,true);
+ rasterizer->mesh_remove_surface(p_mesh, p_surface);
+ _dependency_queue_update(p_mesh, true, true);
}
-int VisualServerRaster::mesh_get_surface_count(RID p_mesh) const{
+int VisualServerRaster::mesh_get_surface_count(RID p_mesh) const {
return rasterizer->mesh_get_surface_count(p_mesh);
-
}
-
-void VisualServerRaster::mesh_set_custom_aabb(RID p_mesh,const AABB& p_aabb) {
+void VisualServerRaster::mesh_set_custom_aabb(RID p_mesh, const AABB &p_aabb) {
VS_CHANGED;
- _dependency_queue_update(p_mesh,true);
- rasterizer->mesh_set_custom_aabb(p_mesh,p_aabb);
-
+ _dependency_queue_update(p_mesh, true);
+ rasterizer->mesh_set_custom_aabb(p_mesh, p_aabb);
}
AABB VisualServerRaster::mesh_get_custom_aabb(RID p_mesh) const {
@@ -478,14 +438,13 @@ AABB VisualServerRaster::mesh_get_custom_aabb(RID p_mesh) const {
void VisualServerRaster::mesh_clear(RID p_mesh) {
ERR_FAIL_COND(!rasterizer->is_mesh(p_mesh));
- while(rasterizer->mesh_get_surface_count(p_mesh)) {
- rasterizer->mesh_remove_surface(p_mesh,0);
+ while (rasterizer->mesh_get_surface_count(p_mesh)) {
+ rasterizer->mesh_remove_surface(p_mesh, 0);
}
- _dependency_queue_update(p_mesh,true,true);
+ _dependency_queue_update(p_mesh, true, true);
}
-
/* MULTIMESH */
RID VisualServerRaster::multimesh_create() {
@@ -493,9 +452,9 @@ RID VisualServerRaster::multimesh_create() {
return rasterizer->multimesh_create();
}
-void VisualServerRaster::multimesh_set_instance_count(RID p_multimesh,int p_count) {
+void VisualServerRaster::multimesh_set_instance_count(RID p_multimesh, int p_count) {
VS_CHANGED;
- rasterizer->multimesh_set_instance_count(p_multimesh,p_count);
+ rasterizer->multimesh_set_instance_count(p_multimesh, p_count);
}
int VisualServerRaster::multimesh_get_instance_count(RID p_multimesh) const {
@@ -503,51 +462,45 @@ int VisualServerRaster::multimesh_get_instance_count(RID p_multimesh) const {
return rasterizer->multimesh_get_instance_count(p_multimesh);
}
-void VisualServerRaster::multimesh_set_mesh(RID p_multimesh,RID p_mesh) {
+void VisualServerRaster::multimesh_set_mesh(RID p_multimesh, RID p_mesh) {
VS_CHANGED;
- rasterizer->multimesh_set_mesh(p_multimesh,p_mesh);
-
+ rasterizer->multimesh_set_mesh(p_multimesh, p_mesh);
}
-void VisualServerRaster::multimesh_set_aabb(RID p_multimesh,const AABB& p_aabb) {
+void VisualServerRaster::multimesh_set_aabb(RID p_multimesh, const AABB &p_aabb) {
VS_CHANGED;
- rasterizer->multimesh_set_aabb(p_multimesh,p_aabb);
- _dependency_queue_update(p_multimesh,true);
-
+ rasterizer->multimesh_set_aabb(p_multimesh, p_aabb);
+ _dependency_queue_update(p_multimesh, true);
}
-void VisualServerRaster::multimesh_instance_set_transform(RID p_multimesh,int p_index,const Transform& p_transform) {
+void VisualServerRaster::multimesh_instance_set_transform(RID p_multimesh, int p_index, const Transform &p_transform) {
VS_CHANGED;
- rasterizer->multimesh_instance_set_transform(p_multimesh,p_index,p_transform);
-
+ rasterizer->multimesh_instance_set_transform(p_multimesh, p_index, p_transform);
}
-void VisualServerRaster::multimesh_instance_set_color(RID p_multimesh,int p_index,const Color& p_color) {
+void VisualServerRaster::multimesh_instance_set_color(RID p_multimesh, int p_index, const Color &p_color) {
VS_CHANGED;
- rasterizer->multimesh_instance_set_color(p_multimesh,p_index,p_color);
-
+ rasterizer->multimesh_instance_set_color(p_multimesh, p_index, p_color);
}
RID VisualServerRaster::multimesh_get_mesh(RID p_multimesh) const {
return rasterizer->multimesh_get_mesh(p_multimesh);
}
-AABB VisualServerRaster::multimesh_get_aabb(RID p_multimesh,const AABB& p_aabb) const {
-
+AABB VisualServerRaster::multimesh_get_aabb(RID p_multimesh, const AABB &p_aabb) const {
return rasterizer->multimesh_get_aabb(p_multimesh);
}
-Transform VisualServerRaster::multimesh_instance_get_transform(RID p_multimesh,int p_index) const {
+Transform VisualServerRaster::multimesh_instance_get_transform(RID p_multimesh, int p_index) const {
- return rasterizer->multimesh_instance_get_transform(p_multimesh,p_index);
+ return rasterizer->multimesh_instance_get_transform(p_multimesh, p_index);
}
-Color VisualServerRaster::multimesh_instance_get_color(RID p_multimesh,int p_index) const {
+Color VisualServerRaster::multimesh_instance_get_color(RID p_multimesh, int p_index) const {
- return rasterizer->multimesh_instance_get_color(p_multimesh,p_index);
+ return rasterizer->multimesh_instance_get_color(p_multimesh, p_index);
}
-void VisualServerRaster::multimesh_set_visible_instances(RID p_multimesh,int p_visible) {
-
- rasterizer->multimesh_set_visible_instances(p_multimesh,p_visible);
+void VisualServerRaster::multimesh_set_visible_instances(RID p_multimesh, int p_visible) {
+ rasterizer->multimesh_set_visible_instances(p_multimesh, p_visible);
}
int VisualServerRaster::multimesh_get_visible_instances(RID p_multimesh) const {
@@ -555,67 +508,57 @@ int VisualServerRaster::multimesh_get_visible_instances(RID p_multimesh) const {
return rasterizer->multimesh_get_visible_instances(p_multimesh);
}
-
/* IMMEDIATE API */
-
RID VisualServerRaster::immediate_create() {
return rasterizer->immediate_create();
}
-void VisualServerRaster::immediate_begin(RID p_immediate,PrimitiveType p_primitive,RID p_texture){
+void VisualServerRaster::immediate_begin(RID p_immediate, PrimitiveType p_primitive, RID p_texture) {
- rasterizer->immediate_begin(p_immediate,p_primitive,p_texture);
+ rasterizer->immediate_begin(p_immediate, p_primitive, p_texture);
}
-void VisualServerRaster::immediate_vertex(RID p_immediate,const Vector3& p_vertex){
-
- rasterizer->immediate_vertex(p_immediate,p_vertex);
+void VisualServerRaster::immediate_vertex(RID p_immediate, const Vector3 &p_vertex) {
+ rasterizer->immediate_vertex(p_immediate, p_vertex);
}
-void VisualServerRaster::immediate_normal(RID p_immediate,const Vector3& p_normal){
-
- rasterizer->immediate_normal(p_immediate,p_normal);
+void VisualServerRaster::immediate_normal(RID p_immediate, const Vector3 &p_normal) {
+ rasterizer->immediate_normal(p_immediate, p_normal);
}
-void VisualServerRaster::immediate_tangent(RID p_immediate,const Plane& p_tangent){
-
- rasterizer->immediate_tangent(p_immediate,p_tangent);
+void VisualServerRaster::immediate_tangent(RID p_immediate, const Plane &p_tangent) {
+ rasterizer->immediate_tangent(p_immediate, p_tangent);
}
-void VisualServerRaster::immediate_color(RID p_immediate,const Color& p_color){
-
- rasterizer->immediate_color(p_immediate,p_color);
+void VisualServerRaster::immediate_color(RID p_immediate, const Color &p_color) {
+ rasterizer->immediate_color(p_immediate, p_color);
}
-void VisualServerRaster::immediate_uv(RID p_immediate,const Vector2& p_uv){
-
- rasterizer->immediate_uv(p_immediate,p_uv);
+void VisualServerRaster::immediate_uv(RID p_immediate, const Vector2 &p_uv) {
+ rasterizer->immediate_uv(p_immediate, p_uv);
}
-void VisualServerRaster::immediate_uv2(RID p_immediate,const Vector2& p_uv2){
-
- rasterizer->immediate_uv2(p_immediate,p_uv2);
+void VisualServerRaster::immediate_uv2(RID p_immediate, const Vector2 &p_uv2) {
+ rasterizer->immediate_uv2(p_immediate, p_uv2);
}
-void VisualServerRaster::immediate_end(RID p_immediate){
+void VisualServerRaster::immediate_end(RID p_immediate) {
VS_CHANGED;
- _dependency_queue_update(p_immediate,true);
+ _dependency_queue_update(p_immediate, true);
rasterizer->immediate_end(p_immediate);
-
}
-void VisualServerRaster::immediate_clear(RID p_immediate){
+void VisualServerRaster::immediate_clear(RID p_immediate) {
VS_CHANGED;
- _dependency_queue_update(p_immediate,true);
+ _dependency_queue_update(p_immediate, true);
rasterizer->immediate_clear(p_immediate);
-
}
-void VisualServerRaster::immediate_set_material(RID p_immediate,RID p_material) {
+void VisualServerRaster::immediate_set_material(RID p_immediate, RID p_material) {
- rasterizer->immediate_set_material(p_immediate,p_material);
+ rasterizer->immediate_set_material(p_immediate, p_material);
}
RID VisualServerRaster::immediate_get_material(RID p_immediate) const {
@@ -623,7 +566,6 @@ RID VisualServerRaster::immediate_get_material(RID p_immediate) const {
return rasterizer->immediate_get_material(p_immediate);
}
-
/* PARTICLES API */
RID VisualServerRaster::particles_create() {
@@ -633,7 +575,7 @@ RID VisualServerRaster::particles_create() {
void VisualServerRaster::particles_set_amount(RID p_particles, int p_amount) {
VS_CHANGED;
- rasterizer->particles_set_amount(p_particles,p_amount);
+ rasterizer->particles_set_amount(p_particles, p_amount);
}
int VisualServerRaster::particles_get_amount(RID p_particles) const {
@@ -643,14 +585,14 @@ int VisualServerRaster::particles_get_amount(RID p_particles) const {
void VisualServerRaster::particles_set_emitting(RID p_particles, bool p_emitting) {
VS_CHANGED;
- rasterizer->particles_set_emitting(p_particles,p_emitting);
+ rasterizer->particles_set_emitting(p_particles, p_emitting);
}
bool VisualServerRaster::particles_is_emitting(RID p_particles) const {
return rasterizer->particles_is_emitting(p_particles);
}
-void VisualServerRaster::particles_set_visibility_aabb(RID p_particles, const AABB& p_visibility) {
+void VisualServerRaster::particles_set_visibility_aabb(RID p_particles, const AABB &p_visibility) {
VS_CHANGED;
rasterizer->particles_set_visibility_aabb(p_particles, p_visibility);
}
@@ -659,28 +601,28 @@ AABB VisualServerRaster::particles_get_visibility_aabb(RID p_particles) const {
return rasterizer->particles_get_visibility_aabb(p_particles);
}
-void VisualServerRaster::particles_set_emission_half_extents(RID p_particles, const Vector3& p_half_extents) {
+void VisualServerRaster::particles_set_emission_half_extents(RID p_particles, const Vector3 &p_half_extents) {
VS_CHANGED;
- rasterizer->particles_set_emission_half_extents(p_particles,p_half_extents);
+ rasterizer->particles_set_emission_half_extents(p_particles, p_half_extents);
}
Vector3 VisualServerRaster::particles_get_emission_half_extents(RID p_particles) const {
return rasterizer->particles_get_emission_half_extents(p_particles);
}
-void VisualServerRaster::particles_set_emission_base_velocity(RID p_particles, const Vector3& p_base_velocity) {
+void VisualServerRaster::particles_set_emission_base_velocity(RID p_particles, const Vector3 &p_base_velocity) {
VS_CHANGED;
- rasterizer->particles_set_emission_base_velocity(p_particles,p_base_velocity);
+ rasterizer->particles_set_emission_base_velocity(p_particles, p_base_velocity);
}
Vector3 VisualServerRaster::particles_get_emission_base_velocity(RID p_particles) const {
return rasterizer->particles_get_emission_base_velocity(p_particles);
}
-void VisualServerRaster::particles_set_emission_points(RID p_particles, const DVector<Vector3>& p_points) {
+void VisualServerRaster::particles_set_emission_points(RID p_particles, const DVector<Vector3> &p_points) {
VS_CHANGED;
- rasterizer->particles_set_emission_points(p_particles,p_points);
+ rasterizer->particles_set_emission_points(p_particles, p_points);
}
DVector<Vector3> VisualServerRaster::particles_get_emission_points(RID p_particles) const {
@@ -688,36 +630,36 @@ DVector<Vector3> VisualServerRaster::particles_get_emission_points(RID p_particl
return rasterizer->particles_get_emission_points(p_particles);
}
-void VisualServerRaster::particles_set_gravity_normal(RID p_particles, const Vector3& p_normal) {
+void VisualServerRaster::particles_set_gravity_normal(RID p_particles, const Vector3 &p_normal) {
VS_CHANGED;
- rasterizer->particles_set_gravity_normal(p_particles,p_normal);
+ rasterizer->particles_set_gravity_normal(p_particles, p_normal);
}
Vector3 VisualServerRaster::particles_get_gravity_normal(RID p_particles) const {
return rasterizer->particles_get_gravity_normal(p_particles);
}
-void VisualServerRaster::particles_set_variable(RID p_particles, ParticleVariable p_variable,float p_value) {
+void VisualServerRaster::particles_set_variable(RID p_particles, ParticleVariable p_variable, float p_value) {
VS_CHANGED;
- rasterizer->particles_set_variable(p_particles,p_variable,p_value);
+ rasterizer->particles_set_variable(p_particles, p_variable, p_value);
}
float VisualServerRaster::particles_get_variable(RID p_particles, ParticleVariable p_variable) const {
- return rasterizer->particles_get_variable(p_particles,p_variable);
+ return rasterizer->particles_get_variable(p_particles, p_variable);
}
-void VisualServerRaster::particles_set_randomness(RID p_particles, ParticleVariable p_variable,float p_randomness) {
+void VisualServerRaster::particles_set_randomness(RID p_particles, ParticleVariable p_variable, float p_randomness) {
VS_CHANGED;
- rasterizer->particles_set_randomness(p_particles,p_variable,p_randomness);
+ rasterizer->particles_set_randomness(p_particles, p_variable, p_randomness);
}
float VisualServerRaster::particles_get_randomness(RID p_particles, ParticleVariable p_variable) const {
- return rasterizer->particles_get_randomness(p_particles,p_variable);
+ return rasterizer->particles_get_randomness(p_particles, p_variable);
}
void VisualServerRaster::particles_set_color_phases(RID p_particles, int p_phases) {
VS_CHANGED;
- rasterizer->particles_set_color_phases(p_particles,p_phases);
+ rasterizer->particles_set_color_phases(p_particles, p_phases);
}
int VisualServerRaster::particles_get_color_phases(RID p_particles) const {
@@ -726,65 +668,63 @@ int VisualServerRaster::particles_get_color_phases(RID p_particles) const {
void VisualServerRaster::particles_set_color_phase_pos(RID p_particles, int p_phase, float p_pos) {
VS_CHANGED;
- rasterizer->particles_set_color_phase_pos(p_particles,p_phase,p_pos);
+ rasterizer->particles_set_color_phase_pos(p_particles, p_phase, p_pos);
}
float VisualServerRaster::particles_get_color_phase_pos(RID p_particles, int p_phase) const {
- return rasterizer->particles_get_color_phase_pos(p_particles,p_phase);
+ return rasterizer->particles_get_color_phase_pos(p_particles, p_phase);
}
void VisualServerRaster::particles_set_attractors(RID p_particles, int p_attractors) {
VS_CHANGED;
- rasterizer->particles_set_attractors(p_particles,p_attractors);
+ rasterizer->particles_set_attractors(p_particles, p_attractors);
}
int VisualServerRaster::particles_get_attractors(RID p_particles) const {
return rasterizer->particles_get_attractors(p_particles);
}
-void VisualServerRaster::particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3& p_pos) {
+void VisualServerRaster::particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3 &p_pos) {
VS_CHANGED;
- rasterizer->particles_set_attractor_pos(p_particles,p_attractor,p_pos);
+ rasterizer->particles_set_attractor_pos(p_particles, p_attractor, p_pos);
}
-Vector3 VisualServerRaster::particles_get_attractor_pos(RID p_particles,int p_attractor) const {
+Vector3 VisualServerRaster::particles_get_attractor_pos(RID p_particles, int p_attractor) const {
- return rasterizer->particles_get_attractor_pos(p_particles,p_attractor);
+ return rasterizer->particles_get_attractor_pos(p_particles, p_attractor);
}
void VisualServerRaster::particles_set_attractor_strength(RID p_particles, int p_attractor, float p_force) {
VS_CHANGED;
- rasterizer->particles_set_attractor_strength(p_particles,p_attractor,p_force);
+ rasterizer->particles_set_attractor_strength(p_particles, p_attractor, p_force);
}
-float VisualServerRaster::particles_get_attractor_strength(RID p_particles,int p_attractor) const {
+float VisualServerRaster::particles_get_attractor_strength(RID p_particles, int p_attractor) const {
- return rasterizer->particles_get_attractor_strength(p_particles,p_attractor);
+ return rasterizer->particles_get_attractor_strength(p_particles, p_attractor);
}
-void VisualServerRaster::particles_set_color_phase_color(RID p_particles, int p_phase, const Color& p_color) {
+void VisualServerRaster::particles_set_color_phase_color(RID p_particles, int p_phase, const Color &p_color) {
VS_CHANGED;
- rasterizer->particles_set_color_phase_color(p_particles,p_phase,p_color);
+ rasterizer->particles_set_color_phase_color(p_particles, p_phase, p_color);
}
Color VisualServerRaster::particles_get_color_phase_color(RID p_particles, int p_phase) const {
- return rasterizer->particles_get_color_phase_color(p_particles,p_phase);
+ return rasterizer->particles_get_color_phase_color(p_particles, p_phase);
}
-void VisualServerRaster::particles_set_material(RID p_particles, RID p_material,bool p_owned) {
+void VisualServerRaster::particles_set_material(RID p_particles, RID p_material, bool p_owned) {
VS_CHANGED;
- rasterizer->particles_set_material(p_particles,p_material,p_owned);
+ rasterizer->particles_set_material(p_particles, p_material, p_owned);
}
RID VisualServerRaster::particles_get_material(RID p_particles) const {
return rasterizer->particles_get_material(p_particles);
}
-
void VisualServerRaster::particles_set_height_from_velocity(RID p_particles, bool p_enable) {
VS_CHANGED;
- rasterizer->particles_set_height_from_velocity(p_particles,p_enable);
-
+ rasterizer->particles_set_height_from_velocity(p_particles, p_enable);
}
bool VisualServerRaster::particles_has_height_from_velocity(RID p_particles) const {
@@ -794,7 +734,7 @@ bool VisualServerRaster::particles_has_height_from_velocity(RID p_particles) con
void VisualServerRaster::particles_set_use_local_coordinates(RID p_particles, bool p_enable) {
- rasterizer->particles_set_use_local_coordinates(p_particles,p_enable);
+ rasterizer->particles_set_use_local_coordinates(p_particles, p_enable);
}
bool VisualServerRaster::particles_is_using_local_coordinates(RID p_particles) const {
@@ -802,7 +742,6 @@ bool VisualServerRaster::particles_is_using_local_coordinates(RID p_particles) c
return rasterizer->particles_is_using_local_coordinates(p_particles);
}
-
/* Light API */
RID VisualServerRaster::light_create(LightType p_type) {
@@ -814,21 +753,18 @@ VisualServer::LightType VisualServerRaster::light_get_type(RID p_light) const {
return rasterizer->light_get_type(p_light);
}
-void VisualServerRaster::light_set_color(RID p_light,LightColor p_type, const Color& p_color) {
+void VisualServerRaster::light_set_color(RID p_light, LightColor p_type, const Color &p_color) {
VS_CHANGED;
- rasterizer->light_set_color(p_light,p_type,p_color);
-
+ rasterizer->light_set_color(p_light, p_type, p_color);
}
-Color VisualServerRaster::light_get_color(RID p_light,LightColor p_type) const {
-
- return rasterizer->light_get_color(p_light,p_type);
+Color VisualServerRaster::light_get_color(RID p_light, LightColor p_type) const {
+ return rasterizer->light_get_color(p_light, p_type);
}
-
-void VisualServerRaster::light_set_shadow(RID p_light,bool p_enabled) {
+void VisualServerRaster::light_set_shadow(RID p_light, bool p_enabled) {
VS_CHANGED;
- rasterizer->light_set_shadow(p_light,p_enabled);
+ rasterizer->light_set_shadow(p_light, p_enabled);
}
bool VisualServerRaster::light_has_shadow(RID p_light) const {
@@ -836,11 +772,9 @@ bool VisualServerRaster::light_has_shadow(RID p_light) const {
return rasterizer->light_has_shadow(p_light);
}
-
-
-void VisualServerRaster::light_set_volumetric(RID p_light,bool p_enabled) {
+void VisualServerRaster::light_set_volumetric(RID p_light, bool p_enabled) {
VS_CHANGED;
- rasterizer->light_set_volumetric(p_light,p_enabled);
+ rasterizer->light_set_volumetric(p_light, p_enabled);
}
bool VisualServerRaster::light_is_volumetric(RID p_light) const {
@@ -848,9 +782,9 @@ bool VisualServerRaster::light_is_volumetric(RID p_light) const {
return rasterizer->light_is_volumetric(p_light);
}
-void VisualServerRaster::light_set_projector(RID p_light,RID p_texture) {
+void VisualServerRaster::light_set_projector(RID p_light, RID p_texture) {
VS_CHANGED;
- rasterizer->light_set_projector(p_light,p_texture);
+ rasterizer->light_set_projector(p_light, p_texture);
}
RID VisualServerRaster::light_get_projector(RID p_light) const {
@@ -860,20 +794,18 @@ RID VisualServerRaster::light_get_projector(RID p_light) const {
void VisualServerRaster::light_set_param(RID p_light, LightParam p_var, float p_value) {
VS_CHANGED;
- rasterizer->light_set_var(p_light,p_var,p_value);
- _dependency_queue_update(p_light,true);
-
+ rasterizer->light_set_var(p_light, p_var, p_value);
+ _dependency_queue_update(p_light, true);
}
float VisualServerRaster::light_get_param(RID p_light, LightParam p_var) const {
-
- return rasterizer->light_get_var(p_light,p_var);
+ return rasterizer->light_get_var(p_light, p_var);
}
-void VisualServerRaster::light_set_operator(RID p_light,LightOp p_op) {
+void VisualServerRaster::light_set_operator(RID p_light, LightOp p_op) {
VS_CHANGED;
- rasterizer->light_set_operator(p_light,p_op);
+ rasterizer->light_set_operator(p_light, p_op);
}
VisualServerRaster::LightOp VisualServerRaster::light_get_operator(RID p_light) const {
@@ -881,9 +813,9 @@ VisualServerRaster::LightOp VisualServerRaster::light_get_operator(RID p_light)
return rasterizer->light_get_operator(p_light);
}
-void VisualServerRaster::light_omni_set_shadow_mode(RID p_light,LightOmniShadowMode p_mode) {
+void VisualServerRaster::light_omni_set_shadow_mode(RID p_light, LightOmniShadowMode p_mode) {
VS_CHANGED;
- rasterizer->light_omni_set_shadow_mode(p_light,p_mode);
+ rasterizer->light_omni_set_shadow_mode(p_light, p_mode);
}
VisualServerRaster::LightOmniShadowMode VisualServerRaster::light_omni_get_shadow_mode(RID p_light) const {
@@ -891,35 +823,34 @@ VisualServerRaster::LightOmniShadowMode VisualServerRaster::light_omni_get_shado
return rasterizer->light_omni_get_shadow_mode(p_light);
}
-void VisualServerRaster::light_directional_set_shadow_mode(RID p_light,LightDirectionalShadowMode p_mode){
+void VisualServerRaster::light_directional_set_shadow_mode(RID p_light, LightDirectionalShadowMode p_mode) {
VS_CHANGED;
- rasterizer->light_directional_set_shadow_mode(p_light,p_mode);
+ rasterizer->light_directional_set_shadow_mode(p_light, p_mode);
}
-VS::LightDirectionalShadowMode VisualServerRaster::light_directional_get_shadow_mode(RID p_light) const{
+VS::LightDirectionalShadowMode VisualServerRaster::light_directional_get_shadow_mode(RID p_light) const {
return rasterizer->light_directional_get_shadow_mode(p_light);
}
-void VisualServerRaster::light_directional_set_shadow_param(RID p_light,LightDirectionalShadowParam p_param, float p_value) {
+void VisualServerRaster::light_directional_set_shadow_param(RID p_light, LightDirectionalShadowParam p_param, float p_value) {
VS_CHANGED;
- rasterizer->light_directional_set_shadow_param(p_light,p_param,p_value);
+ rasterizer->light_directional_set_shadow_param(p_light, p_param, p_value);
}
-float VisualServerRaster::light_directional_get_shadow_param(RID p_light,LightDirectionalShadowParam p_param) const {
+float VisualServerRaster::light_directional_get_shadow_param(RID p_light, LightDirectionalShadowParam p_param) const {
- return rasterizer->light_directional_get_shadow_param(p_light,p_param);
+ return rasterizer->light_directional_get_shadow_param(p_light, p_param);
}
-
RID VisualServerRaster::skeleton_create() {
return rasterizer->skeleton_create();
}
-void VisualServerRaster::skeleton_resize(RID p_skeleton,int p_bones) {
+void VisualServerRaster::skeleton_resize(RID p_skeleton, int p_bones) {
VS_CHANGED;
- rasterizer->skeleton_resize(p_skeleton,p_bones);
+ rasterizer->skeleton_resize(p_skeleton, p_bones);
}
int VisualServerRaster::skeleton_get_bone_count(RID p_skeleton) const {
@@ -927,48 +858,43 @@ int VisualServerRaster::skeleton_get_bone_count(RID p_skeleton) const {
return rasterizer->skeleton_get_bone_count(p_skeleton);
}
-void VisualServerRaster::skeleton_bone_set_transform(RID p_skeleton,int p_bone, const Transform& p_transform) {
+void VisualServerRaster::skeleton_bone_set_transform(RID p_skeleton, int p_bone, const Transform &p_transform) {
VS_CHANGED;
- rasterizer->skeleton_bone_set_transform(p_skeleton,p_bone,p_transform);
+ rasterizer->skeleton_bone_set_transform(p_skeleton, p_bone, p_transform);
- Map< RID, Set<Instance*> >::Element *E=skeleton_dependency_map.find(p_skeleton);
+ Map<RID, Set<Instance *> >::Element *E = skeleton_dependency_map.find(p_skeleton);
if (E) {
//detach skeletons
- for (Set<Instance*>::Element *F=E->get().front();F;F=F->next()) {
+ for (Set<Instance *>::Element *F = E->get().front(); F; F = F->next()) {
- _instance_queue_update( F->get() , true);
+ _instance_queue_update(F->get(), true);
}
}
}
-Transform VisualServerRaster::skeleton_bone_get_transform(RID p_skeleton,int p_bone) {
-
-
- return rasterizer->skeleton_bone_get_transform(p_skeleton,p_bone);
+Transform VisualServerRaster::skeleton_bone_get_transform(RID p_skeleton, int p_bone) {
+ return rasterizer->skeleton_bone_get_transform(p_skeleton, p_bone);
}
-
/* VISIBILITY API */
/* ROOM API */
RID VisualServerRaster::room_create() {
- Room *room = memnew( Room );
- ERR_FAIL_COND_V(!room,RID());
- return room_owner.make_rid( room );
-
+ Room *room = memnew(Room);
+ ERR_FAIL_COND_V(!room, RID());
+ return room_owner.make_rid(room);
}
-void VisualServerRaster::room_set_bounds(RID p_room, const BSP_Tree& p_bounds) {
+void VisualServerRaster::room_set_bounds(RID p_room, const BSP_Tree &p_bounds) {
VS_CHANGED;
Room *room = room_owner.get(p_room);
ERR_FAIL_COND(!room);
- room->bounds=p_bounds;
- _dependency_queue_update(p_room,true);
-
+ room->bounds = p_bounds;
+ _dependency_queue_update(p_room, true);
}
BSP_Tree VisualServerRaster::room_get_bounds(RID p_room) const {
@@ -976,56 +902,48 @@ BSP_Tree VisualServerRaster::room_get_bounds(RID p_room) const {
Room *room = room_owner.get(p_room);
ERR_FAIL_COND_V(!room, BSP_Tree());
return room->bounds;
-
}
/* PORTAL API */
RID VisualServerRaster::portal_create() {
VS_CHANGED;
- Portal *portal = memnew( Portal );
- ERR_FAIL_COND_V(!portal,RID());
- return portal_owner.make_rid( portal );
-
-
+ Portal *portal = memnew(Portal);
+ ERR_FAIL_COND_V(!portal, RID());
+ return portal_owner.make_rid(portal);
}
-
-void VisualServerRaster::portal_set_shape(RID p_portal, const Vector<Point2>& p_shape) {
+void VisualServerRaster::portal_set_shape(RID p_portal, const Vector<Point2> &p_shape) {
VS_CHANGED;
Portal *portal = portal_owner.get(p_portal);
ERR_FAIL_COND(!portal);
- portal->shape=p_shape;
+ portal->shape = p_shape;
- portal->bounds=Rect2();
+ portal->bounds = Rect2();
- for(int i=0;i<p_shape.size();i++) {
+ for (int i = 0; i < p_shape.size(); i++) {
- if (i==0)
- portal->bounds.pos=p_shape[i];
+ if (i == 0)
+ portal->bounds.pos = p_shape[i];
else
portal->bounds.expand_to(p_shape[i]);
}
- _dependency_queue_update(p_portal,true);
+ _dependency_queue_update(p_portal, true);
}
-
Vector<Point2> VisualServerRaster::portal_get_shape(RID p_portal) const {
Portal *portal = portal_owner.get(p_portal);
ERR_FAIL_COND_V(!portal, Vector<Point2>());
return portal->shape;
-
-
}
void VisualServerRaster::portal_set_enabled(RID p_portal, bool p_enabled) {
VS_CHANGED;
Portal *portal = portal_owner.get(p_portal);
ERR_FAIL_COND(!portal);
- portal->enabled=p_enabled;
-
+ portal->enabled = p_enabled;
}
bool VisualServerRaster::portal_is_enabled(RID p_portal) const {
@@ -1033,28 +951,24 @@ bool VisualServerRaster::portal_is_enabled(RID p_portal) const {
Portal *portal = portal_owner.get(p_portal);
ERR_FAIL_COND_V(!portal, false);
return portal->enabled;
-
}
void VisualServerRaster::portal_set_disable_distance(RID p_portal, float p_distance) {
VS_CHANGED;
Portal *portal = portal_owner.get(p_portal);
ERR_FAIL_COND(!portal);
- portal->disable_distance=p_distance;
-
+ portal->disable_distance = p_distance;
}
float VisualServerRaster::portal_get_disable_distance(RID p_portal) const {
Portal *portal = portal_owner.get(p_portal);
ERR_FAIL_COND_V(!portal, -1);
return portal->disable_distance;
-
}
-void VisualServerRaster::portal_set_disabled_color(RID p_portal, const Color& p_color) {
+void VisualServerRaster::portal_set_disabled_color(RID p_portal, const Color &p_color) {
VS_CHANGED;
Portal *portal = portal_owner.get(p_portal);
ERR_FAIL_COND(!portal);
- portal->disable_color=p_color;
-
+ portal->disable_color = p_color;
}
Color VisualServerRaster::portal_get_disabled_color(RID p_portal) const {
@@ -1067,88 +981,80 @@ void VisualServerRaster::portal_set_connect_range(RID p_portal, float p_range) {
VS_CHANGED;
Portal *portal = portal_owner.get(p_portal);
ERR_FAIL_COND(!portal);
- portal->connect_range=p_range;
- _dependency_queue_update(p_portal,true);
+ portal->connect_range = p_range;
+ _dependency_queue_update(p_portal, true);
}
float VisualServerRaster::portal_get_connect_range(RID p_portal) const {
Portal *portal = portal_owner.get(p_portal);
- ERR_FAIL_COND_V(!portal,0);
+ ERR_FAIL_COND_V(!portal, 0);
return portal->connect_range;
}
-
RID VisualServerRaster::baked_light_create() {
- BakedLight *baked_light = memnew( BakedLight );
- ERR_FAIL_COND_V(!baked_light,RID());
- baked_light->data.mode=BAKED_LIGHT_OCTREE;
+ BakedLight *baked_light = memnew(BakedLight);
+ ERR_FAIL_COND_V(!baked_light, RID());
+ baked_light->data.mode = BAKED_LIGHT_OCTREE;
- baked_light->data.octree_lattice_size=0;
- baked_light->data.octree_lattice_divide=0;
- baked_light->data.octree_steps=1;
- baked_light->data.lightmap_multiplier=1.0;
- baked_light->data.realtime_color_enabled=false;
- baked_light->data.realtime_color=Color(1.0, 1.0, 1.0);
+ baked_light->data.octree_lattice_size = 0;
+ baked_light->data.octree_lattice_divide = 0;
+ baked_light->data.octree_steps = 1;
+ baked_light->data.lightmap_multiplier = 1.0;
+ baked_light->data.realtime_color_enabled = false;
+ baked_light->data.realtime_color = Color(1.0, 1.0, 1.0);
baked_light->data.realtime_energy = 1.0;
- return baked_light_owner.make_rid( baked_light );
-
+ return baked_light_owner.make_rid(baked_light);
}
-void VisualServerRaster::baked_light_set_mode(RID p_baked_light,BakedLightMode p_mode){
+void VisualServerRaster::baked_light_set_mode(RID p_baked_light, BakedLightMode p_mode) {
VS_CHANGED;
BakedLight *baked_light = baked_light_owner.get(p_baked_light);
ERR_FAIL_COND(!baked_light);
- baked_light->data.mode=p_mode;
- baked_light->data.color_multiplier=1.0;
- _dependency_queue_update(p_baked_light,true);
-
-
+ baked_light->data.mode = p_mode;
+ baked_light->data.color_multiplier = 1.0;
+ _dependency_queue_update(p_baked_light, true);
}
-VisualServer::BakedLightMode VisualServerRaster::baked_light_get_mode(RID p_baked_light) const{
+VisualServer::BakedLightMode VisualServerRaster::baked_light_get_mode(RID p_baked_light) const {
const BakedLight *baked_light = baked_light_owner.get(p_baked_light);
- ERR_FAIL_COND_V(!baked_light,BAKED_LIGHT_OCTREE);
+ ERR_FAIL_COND_V(!baked_light, BAKED_LIGHT_OCTREE);
return baked_light->data.mode;
-
}
-void VisualServerRaster::baked_light_set_lightmap_multiplier(RID p_baked_light,float p_multiplier) {
+void VisualServerRaster::baked_light_set_lightmap_multiplier(RID p_baked_light, float p_multiplier) {
VS_CHANGED;
BakedLight *baked_light = baked_light_owner.get(p_baked_light);
ERR_FAIL_COND(!baked_light);
- baked_light->data.lightmap_multiplier=p_multiplier;
-
+ baked_light->data.lightmap_multiplier = p_multiplier;
}
-float VisualServerRaster::baked_light_get_lightmap_multiplier(RID p_baked_light) const{
+float VisualServerRaster::baked_light_get_lightmap_multiplier(RID p_baked_light) const {
const BakedLight *baked_light = baked_light_owner.get(p_baked_light);
- ERR_FAIL_COND_V(!baked_light,0);
+ ERR_FAIL_COND_V(!baked_light, 0);
return baked_light->data.lightmap_multiplier;
-
}
-
-void VisualServerRaster::baked_light_set_octree(RID p_baked_light,const DVector<uint8_t> p_octree){
+void VisualServerRaster::baked_light_set_octree(RID p_baked_light, const DVector<uint8_t> p_octree) {
VS_CHANGED;
BakedLight *baked_light = baked_light_owner.get(p_baked_light);
ERR_FAIL_COND(!baked_light);
- if (p_octree.size()==0) {
+ if (p_octree.size() == 0) {
if (baked_light->data.octree_texture.is_valid())
rasterizer->free(baked_light->data.octree_texture);
- baked_light->data.octree_texture=RID();
- baked_light->octree_aabb=AABB();
- baked_light->octree_tex_size=Size2();
+ baked_light->data.octree_texture = RID();
+ baked_light->octree_aabb = AABB();
+ baked_light->octree_tex_size = Size2();
} else {
int tex_w;
@@ -1156,99 +1062,88 @@ void VisualServerRaster::baked_light_set_octree(RID p_baked_light,const DVector<
int light_tex_w;
int light_tex_h;
bool is16;
- bool has_light_tex=false;
+ bool has_light_tex = false;
{
- DVector<uint8_t>::Read r=p_octree.read();
+ DVector<uint8_t>::Read r = p_octree.read();
tex_w = decode_uint32(&r[0]);
tex_h = decode_uint32(&r[4]);
- print_line("TEX W: "+itos(tex_w)+" TEX H:"+itos(tex_h)+" LEN: "+itos(p_octree.size()));
- is16=decode_uint32(&r[8]);
- baked_light->data.octree_lattice_size=decode_float(&r[12]);
- baked_light->data.octree_lattice_divide=tex_w/4.0;
- print_line("LATTICE SIZE: "+rtos(baked_light->data.octree_lattice_size));
- print_line("LATTICE DIVIDE: "+rtos(baked_light->data.octree_lattice_divide));
- baked_light->data.octree_steps=decode_uint32(&r[16]);
- baked_light->data.octree_tex_pixel_size.x=1.0/tex_w;
- baked_light->data.octree_tex_pixel_size.y=1.0/tex_h;
+ print_line("TEX W: " + itos(tex_w) + " TEX H:" + itos(tex_h) + " LEN: " + itos(p_octree.size()));
+ is16 = decode_uint32(&r[8]);
+ baked_light->data.octree_lattice_size = decode_float(&r[12]);
+ baked_light->data.octree_lattice_divide = tex_w / 4.0;
+ print_line("LATTICE SIZE: " + rtos(baked_light->data.octree_lattice_size));
+ print_line("LATTICE DIVIDE: " + rtos(baked_light->data.octree_lattice_divide));
+ baked_light->data.octree_steps = decode_uint32(&r[16]);
+ baked_light->data.octree_tex_pixel_size.x = 1.0 / tex_w;
+ baked_light->data.octree_tex_pixel_size.y = 1.0 / tex_h;
- baked_light->data.texture_multiplier=decode_uint32(&r[20]);
- light_tex_w=decode_uint16(&r[24]);
- light_tex_h=decode_uint16(&r[26]);
- print_line("ltexw "+itos(light_tex_w));
- print_line("ltexh "+itos(light_tex_h));
+ baked_light->data.texture_multiplier = decode_uint32(&r[20]);
+ light_tex_w = decode_uint16(&r[24]);
+ light_tex_h = decode_uint16(&r[26]);
+ print_line("ltexw " + itos(light_tex_w));
+ print_line("ltexh " + itos(light_tex_h));
- if (light_tex_w>0 && light_tex_h>0) {
- baked_light->data.light_tex_pixel_size.x=1.0/light_tex_w;
- baked_light->data.light_tex_pixel_size.y=1.0/light_tex_h;
- has_light_tex=true;
+ if (light_tex_w > 0 && light_tex_h > 0) {
+ baked_light->data.light_tex_pixel_size.x = 1.0 / light_tex_w;
+ baked_light->data.light_tex_pixel_size.y = 1.0 / light_tex_h;
+ has_light_tex = true;
} else {
- baked_light->data.light_tex_pixel_size=baked_light->data.octree_tex_pixel_size;
-
+ baked_light->data.light_tex_pixel_size = baked_light->data.octree_tex_pixel_size;
}
-
-
- baked_light->octree_aabb.pos.x=decode_float(&r[32]);
- baked_light->octree_aabb.pos.y=decode_float(&r[36]);
- baked_light->octree_aabb.pos.z=decode_float(&r[40]);
- baked_light->octree_aabb.size.x=decode_float(&r[44]);
- baked_light->octree_aabb.size.y=decode_float(&r[48]);
- baked_light->octree_aabb.size.z=decode_float(&r[52]);
-
-
+ baked_light->octree_aabb.pos.x = decode_float(&r[32]);
+ baked_light->octree_aabb.pos.y = decode_float(&r[36]);
+ baked_light->octree_aabb.pos.z = decode_float(&r[40]);
+ baked_light->octree_aabb.size.x = decode_float(&r[44]);
+ baked_light->octree_aabb.size.y = decode_float(&r[48]);
+ baked_light->octree_aabb.size.z = decode_float(&r[52]);
}
if (baked_light->data.octree_texture.is_valid()) {
- if (tex_w!=baked_light->octree_tex_size.x || tex_h!=baked_light->octree_tex_size.y) {
+ if (tex_w != baked_light->octree_tex_size.x || tex_h != baked_light->octree_tex_size.y) {
rasterizer->free(baked_light->data.octree_texture);
- baked_light->data.octree_texture=RID();
- baked_light->octree_tex_size.x=0;
- baked_light->octree_tex_size.y=0;
+ baked_light->data.octree_texture = RID();
+ baked_light->octree_tex_size.x = 0;
+ baked_light->octree_tex_size.y = 0;
}
}
if (baked_light->data.light_texture.is_valid()) {
- if (!has_light_tex || light_tex_w!=baked_light->light_tex_size.x || light_tex_h!=baked_light->light_tex_size.y) {
+ if (!has_light_tex || light_tex_w != baked_light->light_tex_size.x || light_tex_h != baked_light->light_tex_size.y) {
rasterizer->free(baked_light->data.light_texture);
- baked_light->data.light_texture=RID();
- baked_light->light_tex_size.x=0;
- baked_light->light_tex_size.y=0;
+ baked_light->data.light_texture = RID();
+ baked_light->light_tex_size.x = 0;
+ baked_light->light_tex_size.y = 0;
}
}
if (!baked_light->data.octree_texture.is_valid()) {
- baked_light->data.octree_texture=rasterizer->texture_create();
- rasterizer->texture_allocate(baked_light->data.octree_texture,tex_w,tex_h,Image::FORMAT_RGBA,TEXTURE_FLAG_FILTER);
- baked_light->octree_tex_size.x=tex_w;
- baked_light->octree_tex_size.y=tex_h;
+ baked_light->data.octree_texture = rasterizer->texture_create();
+ rasterizer->texture_allocate(baked_light->data.octree_texture, tex_w, tex_h, Image::FORMAT_RGBA, TEXTURE_FLAG_FILTER);
+ baked_light->octree_tex_size.x = tex_w;
+ baked_light->octree_tex_size.y = tex_h;
}
if (!baked_light->data.light_texture.is_valid() && has_light_tex) {
- baked_light->data.light_texture=rasterizer->texture_create();
- rasterizer->texture_allocate(baked_light->data.light_texture,light_tex_w,light_tex_h,Image::FORMAT_RGBA,TEXTURE_FLAG_FILTER);
- baked_light->light_tex_size.x=light_tex_w;
- baked_light->light_tex_size.y=light_tex_h;
-
+ baked_light->data.light_texture = rasterizer->texture_create();
+ rasterizer->texture_allocate(baked_light->data.light_texture, light_tex_w, light_tex_h, Image::FORMAT_RGBA, TEXTURE_FLAG_FILTER);
+ baked_light->light_tex_size.x = light_tex_w;
+ baked_light->light_tex_size.y = light_tex_h;
}
- Image img(tex_w,tex_h,0,Image::FORMAT_RGBA,p_octree);
- rasterizer->texture_set_data(baked_light->data.octree_texture,img);
-
+ Image img(tex_w, tex_h, 0, Image::FORMAT_RGBA, p_octree);
+ rasterizer->texture_set_data(baked_light->data.octree_texture, img);
}
-
- _dependency_queue_update(p_baked_light,true);
-
+ _dependency_queue_update(p_baked_light, true);
}
-
-DVector<uint8_t> VisualServerRaster::baked_light_get_octree(RID p_baked_light) const{
-
+DVector<uint8_t> VisualServerRaster::baked_light_get_octree(RID p_baked_light) const {
BakedLight *baked_light = baked_light_owner.get(p_baked_light);
- ERR_FAIL_COND_V(!baked_light,DVector<uint8_t>());
+ ERR_FAIL_COND_V(!baked_light, DVector<uint8_t>());
if (rasterizer->is_texture(baked_light->data.octree_texture)) {
@@ -1259,34 +1154,29 @@ DVector<uint8_t> VisualServerRaster::baked_light_get_octree(RID p_baked_light) c
}
}
-void VisualServerRaster::baked_light_set_light(RID p_baked_light,const DVector<uint8_t> p_light) {
+void VisualServerRaster::baked_light_set_light(RID p_baked_light, const DVector<uint8_t> p_light) {
VS_CHANGED;
BakedLight *baked_light = baked_light_owner.get(p_baked_light);
ERR_FAIL_COND(!baked_light);
- ERR_FAIL_COND(p_light.size()==0);
+ ERR_FAIL_COND(p_light.size() == 0);
- int tex_w=baked_light->light_tex_size.x;
- int tex_h=baked_light->light_tex_size.y;
+ int tex_w = baked_light->light_tex_size.x;
+ int tex_h = baked_light->light_tex_size.y;
- ERR_FAIL_COND(tex_w==0 && tex_h==0);
+ ERR_FAIL_COND(tex_w == 0 && tex_h == 0);
ERR_FAIL_COND(!baked_light->data.light_texture.is_valid());
+ print_line("w: " + itos(tex_w) + " h: " + itos(tex_h) + " lightsize: " + itos(p_light.size()));
-
- print_line("w: "+itos(tex_w)+" h: "+itos(tex_h)+" lightsize: "+itos(p_light.size()));
-
- Image img(tex_w,tex_h,0,Image::FORMAT_RGBA,p_light);
- rasterizer->texture_set_data(baked_light->data.light_texture,img);
-
-
-
+ Image img(tex_w, tex_h, 0, Image::FORMAT_RGBA, p_light);
+ rasterizer->texture_set_data(baked_light->data.light_texture, img);
}
-DVector<uint8_t> VisualServerRaster::baked_light_get_light(RID p_baked_light) const{
+DVector<uint8_t> VisualServerRaster::baked_light_get_light(RID p_baked_light) const {
BakedLight *baked_light = baked_light_owner.get(p_baked_light);
- ERR_FAIL_COND_V(!baked_light,DVector<uint8_t>());
+ ERR_FAIL_COND_V(!baked_light, DVector<uint8_t>());
if (rasterizer->is_texture(baked_light->data.light_texture)) {
@@ -1297,44 +1187,35 @@ DVector<uint8_t> VisualServerRaster::baked_light_get_light(RID p_baked_light) co
}
}
-
-
void VisualServerRaster::baked_light_set_sampler_octree(RID p_baked_light, const DVector<int> &p_sampler) {
BakedLight *baked_light = baked_light_owner.get(p_baked_light);
ERR_FAIL_COND(!baked_light);
- baked_light->sampler=p_sampler;
-
-
-
+ baked_light->sampler = p_sampler;
}
DVector<int> VisualServerRaster::baked_light_get_sampler_octree(RID p_baked_light) const {
BakedLight *baked_light = baked_light_owner.get(p_baked_light);
- ERR_FAIL_COND_V(!baked_light,DVector<int>());
+ ERR_FAIL_COND_V(!baked_light, DVector<int>());
return baked_light->sampler;
-
}
-
-void VisualServerRaster::baked_light_add_lightmap(RID p_baked_light,const RID p_texture,int p_id){
+void VisualServerRaster::baked_light_add_lightmap(RID p_baked_light, const RID p_texture, int p_id) {
VS_CHANGED;
BakedLight *baked_light = baked_light_owner.get(p_baked_light);
ERR_FAIL_COND(!baked_light);
- baked_light->data.lightmaps.insert(p_id,p_texture);
-
+ baked_light->data.lightmaps.insert(p_id, p_texture);
}
-void VisualServerRaster::baked_light_clear_lightmaps(RID p_baked_light){
+void VisualServerRaster::baked_light_clear_lightmaps(RID p_baked_light) {
VS_CHANGED;
BakedLight *baked_light = baked_light_owner.get(p_baked_light);
ERR_FAIL_COND(!baked_light);
baked_light->data.lightmaps.clear();
-
}
void VisualServerRaster::baked_light_set_realtime_color_enabled(RID p_baked_light, const bool p_enabled) {
@@ -1344,35 +1225,31 @@ void VisualServerRaster::baked_light_set_realtime_color_enabled(RID p_baked_ligh
ERR_FAIL_COND(!baked_light);
baked_light->data.realtime_color_enabled = p_enabled;
-
}
-bool VisualServerRaster::baked_light_get_realtime_color_enabled(RID p_baked_light) const{
+bool VisualServerRaster::baked_light_get_realtime_color_enabled(RID p_baked_light) const {
const BakedLight *baked_light = baked_light_owner.get(p_baked_light);
ERR_FAIL_COND_V(!baked_light, false);
return baked_light->data.realtime_color_enabled;
-
}
-void VisualServerRaster::baked_light_set_realtime_color(RID p_baked_light, const Color& p_color) {
+void VisualServerRaster::baked_light_set_realtime_color(RID p_baked_light, const Color &p_color) {
VS_CHANGED;
BakedLight *baked_light = baked_light_owner.get(p_baked_light);
ERR_FAIL_COND(!baked_light);
baked_light->data.realtime_color = p_color;
-
}
-Color VisualServerRaster::baked_light_get_realtime_color(RID p_baked_light) const{
+Color VisualServerRaster::baked_light_get_realtime_color(RID p_baked_light) const {
const BakedLight *baked_light = baked_light_owner.get(p_baked_light);
ERR_FAIL_COND_V(!baked_light, Color(1.0, 1.0, 1.0));
return baked_light->data.realtime_color;
-
}
void VisualServerRaster::baked_light_set_realtime_energy(RID p_baked_light, const float p_energy) {
@@ -1382,94 +1259,87 @@ void VisualServerRaster::baked_light_set_realtime_energy(RID p_baked_light, cons
ERR_FAIL_COND(!baked_light);
baked_light->data.realtime_energy = p_energy;
-
}
-float VisualServerRaster::baked_light_get_realtime_energy(RID p_baked_light) const{
+float VisualServerRaster::baked_light_get_realtime_energy(RID p_baked_light) const {
const BakedLight *baked_light = baked_light_owner.get(p_baked_light);
ERR_FAIL_COND_V(!baked_light, 1.0f);
return baked_light->data.realtime_energy;
-
}
-
/* BAKED LIGHT SAMPLER */
RID VisualServerRaster::baked_light_sampler_create() {
- BakedLightSampler * blsamp = memnew( BakedLightSampler );
+ BakedLightSampler *blsamp = memnew(BakedLightSampler);
RID rid = baked_light_sampler_owner.make_rid(blsamp);
_update_baked_light_sampler_dp_cache(blsamp);
return rid;
}
-void VisualServerRaster::baked_light_sampler_set_param(RID p_baked_light_sampler,BakedLightSamplerParam p_param,float p_value){
+void VisualServerRaster::baked_light_sampler_set_param(RID p_baked_light_sampler, BakedLightSamplerParam p_param, float p_value) {
VS_CHANGED;
- BakedLightSampler * blsamp = baked_light_sampler_owner.get(p_baked_light_sampler);
+ BakedLightSampler *blsamp = baked_light_sampler_owner.get(p_baked_light_sampler);
ERR_FAIL_COND(!blsamp);
- ERR_FAIL_INDEX(p_param,BAKED_LIGHT_SAMPLER_MAX);
- blsamp->params[p_param]=p_value;
- _dependency_queue_update(p_baked_light_sampler,true);
+ ERR_FAIL_INDEX(p_param, BAKED_LIGHT_SAMPLER_MAX);
+ blsamp->params[p_param] = p_value;
+ _dependency_queue_update(p_baked_light_sampler, true);
}
-float VisualServerRaster::baked_light_sampler_get_param(RID p_baked_light_sampler,BakedLightSamplerParam p_param) const{
-
+float VisualServerRaster::baked_light_sampler_get_param(RID p_baked_light_sampler, BakedLightSamplerParam p_param) const {
- BakedLightSampler * blsamp = baked_light_sampler_owner.get(p_baked_light_sampler);
- ERR_FAIL_COND_V(!blsamp,0);
- ERR_FAIL_INDEX_V(p_param,BAKED_LIGHT_SAMPLER_MAX,0);
+ BakedLightSampler *blsamp = baked_light_sampler_owner.get(p_baked_light_sampler);
+ ERR_FAIL_COND_V(!blsamp, 0);
+ ERR_FAIL_INDEX_V(p_param, BAKED_LIGHT_SAMPLER_MAX, 0);
return blsamp->params[p_param];
}
-void VisualServerRaster::_update_baked_light_sampler_dp_cache(BakedLightSampler * blsamp) {
+void VisualServerRaster::_update_baked_light_sampler_dp_cache(BakedLightSampler *blsamp) {
int res = blsamp->resolution;
- blsamp->dp_cache.resize(res*res*2);
- Vector3 *dp_normals=blsamp->dp_cache.ptr();
+ blsamp->dp_cache.resize(res * res * 2);
+ Vector3 *dp_normals = blsamp->dp_cache.ptr();
- for(int p=0;p<2;p++) {
- float sign = p==0?1:-1;
- int ofs = res*res*p;
- for(int i=0;i<res;i++) {
- for(int j=0;j<res;j++) {
+ for (int p = 0; p < 2; p++) {
+ float sign = p == 0 ? 1 : -1;
+ int ofs = res * res * p;
+ for (int i = 0; i < res; i++) {
+ for (int j = 0; j < res; j++) {
Vector2 v(
- (i/float(res))*2.0-1.0,
- (j/float(res))*2.0-1.0
- );
+ (i / float(res)) * 2.0 - 1.0,
+ (j / float(res)) * 2.0 - 1.0);
- float l=v.length();
- if (l>1.0) {
- v/=l;
- l=1.0; //clamp to avoid imaginary
+ float l = v.length();
+ if (l > 1.0) {
+ v /= l;
+ l = 1.0; //clamp to avoid imaginary
}
- v*=(2*l)/(l*l+1); //inverse of the dual paraboloid function
- Vector3 n = Vector3(v.x,v.y,sign*sqrtf(MAX(1 - v.dot(v),0))); //reconstruction of z
- n.y*=sign;
- dp_normals[j*res+i+ofs]=n;
+ v *= (2 * l) / (l * l + 1); //inverse of the dual paraboloid function
+ Vector3 n = Vector3(v.x, v.y, sign * sqrtf(MAX(1 - v.dot(v), 0))); //reconstruction of z
+ n.y *= sign;
+ dp_normals[j * res + i + ofs] = n;
}
}
}
-
}
-void VisualServerRaster::baked_light_sampler_set_resolution(RID p_baked_light_sampler,int p_resolution){
+void VisualServerRaster::baked_light_sampler_set_resolution(RID p_baked_light_sampler, int p_resolution) {
- ERR_FAIL_COND(p_resolution<4 || p_resolution>64);
+ ERR_FAIL_COND(p_resolution < 4 || p_resolution > 64);
VS_CHANGED;
- BakedLightSampler * blsamp = baked_light_sampler_owner.get(p_baked_light_sampler);
+ BakedLightSampler *blsamp = baked_light_sampler_owner.get(p_baked_light_sampler);
ERR_FAIL_COND(!blsamp);
- blsamp->resolution=p_resolution;
+ blsamp->resolution = p_resolution;
_update_baked_light_sampler_dp_cache(blsamp);
-
}
-int VisualServerRaster::baked_light_sampler_get_resolution(RID p_baked_light_sampler) const{
+int VisualServerRaster::baked_light_sampler_get_resolution(RID p_baked_light_sampler) const {
- BakedLightSampler * blsamp = baked_light_sampler_owner.get(p_baked_light_sampler);
- ERR_FAIL_COND_V(!blsamp,0);
+ BakedLightSampler *blsamp = baked_light_sampler_owner.get(p_baked_light_sampler);
+ ERR_FAIL_COND_V(!blsamp, 0);
return blsamp->resolution;
}
@@ -1477,623 +1347,568 @@ int VisualServerRaster::baked_light_sampler_get_resolution(RID p_baked_light_sam
RID VisualServerRaster::camera_create() {
- Camera * camera = memnew( Camera );
- return camera_owner.make_rid( camera );
-
+ Camera *camera = memnew(Camera);
+ return camera_owner.make_rid(camera);
}
-void VisualServerRaster::camera_set_perspective(RID p_camera,float p_fovy_degrees, float p_z_near, float p_z_far) {
+void VisualServerRaster::camera_set_perspective(RID p_camera, float p_fovy_degrees, float p_z_near, float p_z_far) {
VS_CHANGED
- Camera *camera = camera_owner.get( p_camera );
+ Camera *camera = camera_owner.get(p_camera);
ERR_FAIL_COND(!camera);
- camera->type=Camera::PERSPECTIVE;
- camera->fov=p_fovy_degrees;
- camera->znear=p_z_near;
- camera->zfar=p_z_far;
-
+ camera->type = Camera::PERSPECTIVE;
+ camera->fov = p_fovy_degrees;
+ camera->znear = p_z_near;
+ camera->zfar = p_z_far;
}
-void VisualServerRaster::camera_set_orthogonal(RID p_camera,float p_size, float p_z_near, float p_z_far) {
+void VisualServerRaster::camera_set_orthogonal(RID p_camera, float p_size, float p_z_near, float p_z_far) {
VS_CHANGED;
- Camera *camera = camera_owner.get( p_camera );
+ Camera *camera = camera_owner.get(p_camera);
ERR_FAIL_COND(!camera);
- camera->type=Camera::ORTHOGONAL;
- camera->size=p_size;
- camera->znear=p_z_near;
- camera->zfar=p_z_far;
+ camera->type = Camera::ORTHOGONAL;
+ camera->size = p_size;
+ camera->znear = p_z_near;
+ camera->zfar = p_z_far;
}
-void VisualServerRaster::camera_set_transform(RID p_camera,const Transform& p_transform) {
+void VisualServerRaster::camera_set_transform(RID p_camera, const Transform &p_transform) {
VS_CHANGED;
- Camera *camera = camera_owner.get( p_camera );
+ Camera *camera = camera_owner.get(p_camera);
ERR_FAIL_COND(!camera);
- camera->transform=p_transform.orthonormalized();
-
-
+ camera->transform = p_transform.orthonormalized();
}
-void VisualServerRaster::camera_set_visible_layers(RID p_camera,uint32_t p_layers) {
+void VisualServerRaster::camera_set_visible_layers(RID p_camera, uint32_t p_layers) {
VS_CHANGED;
- Camera *camera = camera_owner.get( p_camera );
+ Camera *camera = camera_owner.get(p_camera);
ERR_FAIL_COND(!camera);
- camera->visible_layers=p_layers;
-
+ camera->visible_layers = p_layers;
}
-uint32_t VisualServerRaster::camera_get_visible_layers(RID p_camera) const{
+uint32_t VisualServerRaster::camera_get_visible_layers(RID p_camera) const {
- const Camera *camera = camera_owner.get( p_camera );
- ERR_FAIL_COND_V(!camera,0);
+ const Camera *camera = camera_owner.get(p_camera);
+ ERR_FAIL_COND_V(!camera, 0);
return camera->visible_layers;
}
-void VisualServerRaster::camera_set_environment(RID p_camera,RID p_env) {
+void VisualServerRaster::camera_set_environment(RID p_camera, RID p_env) {
- Camera *camera = camera_owner.get( p_camera );
+ Camera *camera = camera_owner.get(p_camera);
ERR_FAIL_COND(!camera);
- camera->env=p_env;
-
+ camera->env = p_env;
}
RID VisualServerRaster::camera_get_environment(RID p_camera) const {
- const Camera *camera = camera_owner.get( p_camera );
- ERR_FAIL_COND_V(!camera,RID());
+ const Camera *camera = camera_owner.get(p_camera);
+ ERR_FAIL_COND_V(!camera, RID());
return camera->env;
-
}
-void VisualServerRaster::camera_set_use_vertical_aspect(RID p_camera,bool p_enable) {
+void VisualServerRaster::camera_set_use_vertical_aspect(RID p_camera, bool p_enable) {
- Camera *camera = camera_owner.get( p_camera );
+ Camera *camera = camera_owner.get(p_camera);
ERR_FAIL_COND(!camera);
- camera->vaspect=p_enable;
-
+ camera->vaspect = p_enable;
}
-bool VisualServerRaster::camera_is_using_vertical_aspect(RID p_camera,bool p_enable) const{
+bool VisualServerRaster::camera_is_using_vertical_aspect(RID p_camera, bool p_enable) const {
- const Camera *camera = camera_owner.get( p_camera );
- ERR_FAIL_COND_V(!camera,false);
+ const Camera *camera = camera_owner.get(p_camera);
+ ERR_FAIL_COND_V(!camera, false);
return camera->vaspect;
-
}
-
/* VIEWPORT API */
-
RID VisualServerRaster::viewport_create() {
- Viewport *viewport = memnew( Viewport );
- RID rid = viewport_owner.make_rid( viewport );
- ERR_FAIL_COND_V( !rid.is_valid(), rid );
+ Viewport *viewport = memnew(Viewport);
+ RID rid = viewport_owner.make_rid(viewport);
+ ERR_FAIL_COND_V(!rid.is_valid(), rid);
- viewport->self=rid;
- viewport->hide_scenario=false;
- viewport->hide_canvas=false;
- viewport->viewport_data=rasterizer->viewport_data_create();
+ viewport->self = rid;
+ viewport->hide_scenario = false;
+ viewport->hide_canvas = false;
+ viewport->viewport_data = rasterizer->viewport_data_create();
return rid;
}
-void VisualServerRaster::viewport_attach_to_screen(RID p_viewport,int p_screen) {
+void VisualServerRaster::viewport_attach_to_screen(RID p_viewport, int p_screen) {
VS_CHANGED;
- Viewport *viewport = viewport_owner.get( p_viewport );
+ Viewport *viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND(!viewport);
-
- screen_viewports[p_viewport]=p_screen;
+ screen_viewports[p_viewport] = p_screen;
}
void VisualServerRaster::viewport_detach(RID p_viewport) {
VS_CHANGED;
- Viewport *viewport = viewport_owner.get( p_viewport );
+ Viewport *viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND(!viewport);
ERR_FAIL_COND(!screen_viewports.has(p_viewport));
screen_viewports.erase(p_viewport);
-
}
-void VisualServerRaster::viewport_set_as_render_target(RID p_viewport,bool p_enable) {
+void VisualServerRaster::viewport_set_as_render_target(RID p_viewport, bool p_enable) {
VS_CHANGED;
- Viewport *viewport = viewport_owner.get( p_viewport );
+ Viewport *viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND(!viewport);
- if (viewport->render_target.is_valid()==p_enable)
+ if (viewport->render_target.is_valid() == p_enable)
return;
if (!p_enable) {
rasterizer->free(viewport->render_target);
- viewport->render_target=RID();
- viewport->render_target_texture=RID();
+ viewport->render_target = RID();
+ viewport->render_target_texture = RID();
if (viewport->update_list.in_list())
viewport_update_list.remove(&viewport->update_list);
} else {
- viewport->render_target=rasterizer->render_target_create();
- rasterizer->render_target_set_size(viewport->render_target,viewport->rect.width,viewport->rect.height);
- viewport->render_target_texture=rasterizer->render_target_get_texture(viewport->render_target);
- if (viewport->render_target_update_mode!=RENDER_TARGET_UPDATE_DISABLED)
+ viewport->render_target = rasterizer->render_target_create();
+ rasterizer->render_target_set_size(viewport->render_target, viewport->rect.width, viewport->rect.height);
+ viewport->render_target_texture = rasterizer->render_target_get_texture(viewport->render_target);
+ if (viewport->render_target_update_mode != RENDER_TARGET_UPDATE_DISABLED)
viewport_update_list.add(&viewport->update_list);
}
-
}
-void VisualServerRaster::viewport_set_render_target_update_mode(RID p_viewport,RenderTargetUpdateMode p_mode){
+void VisualServerRaster::viewport_set_render_target_update_mode(RID p_viewport, RenderTargetUpdateMode p_mode) {
VS_CHANGED;
- Viewport *viewport = viewport_owner.get( p_viewport );
+ Viewport *viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND(!viewport);
if (viewport->render_target.is_valid() && viewport->update_list.in_list())
viewport_update_list.remove(&viewport->update_list);
- viewport->render_target_update_mode=p_mode;
+ viewport->render_target_update_mode = p_mode;
- if (viewport->render_target.is_valid() &&viewport->render_target_update_mode!=RENDER_TARGET_UPDATE_DISABLED)
+ if (viewport->render_target.is_valid() && viewport->render_target_update_mode != RENDER_TARGET_UPDATE_DISABLED)
viewport_update_list.add(&viewport->update_list);
-
}
-VisualServer::RenderTargetUpdateMode VisualServerRaster::viewport_get_render_target_update_mode(RID p_viewport) const{
+VisualServer::RenderTargetUpdateMode VisualServerRaster::viewport_get_render_target_update_mode(RID p_viewport) const {
- const Viewport *viewport = viewport_owner.get( p_viewport );
- ERR_FAIL_COND_V(!viewport,RENDER_TARGET_UPDATE_DISABLED);
+ const Viewport *viewport = viewport_owner.get(p_viewport);
+ ERR_FAIL_COND_V(!viewport, RENDER_TARGET_UPDATE_DISABLED);
return viewport->render_target_update_mode;
}
-RID VisualServerRaster::viewport_get_render_target_texture(RID p_viewport) const{
+RID VisualServerRaster::viewport_get_render_target_texture(RID p_viewport) const {
- Viewport *viewport = viewport_owner.get( p_viewport );
- ERR_FAIL_COND_V(!viewport,RID());
+ Viewport *viewport = viewport_owner.get(p_viewport);
+ ERR_FAIL_COND_V(!viewport, RID());
return viewport->render_target_texture;
-
}
-void VisualServerRaster::viewport_set_render_target_vflip(RID p_viewport,bool p_enable) {
+void VisualServerRaster::viewport_set_render_target_vflip(RID p_viewport, bool p_enable) {
- Viewport *viewport = viewport_owner.get( p_viewport );
+ Viewport *viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND(!viewport);
- viewport->render_target_vflip=p_enable;
-
+ viewport->render_target_vflip = p_enable;
}
-void VisualServerRaster::viewport_set_render_target_clear_on_new_frame(RID p_viewport,bool p_enable) {
+void VisualServerRaster::viewport_set_render_target_clear_on_new_frame(RID p_viewport, bool p_enable) {
- Viewport *viewport = viewport_owner.get( p_viewport );
+ Viewport *viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND(!viewport);
- viewport->render_target_clear_on_new_frame=p_enable;
-
+ viewport->render_target_clear_on_new_frame = p_enable;
}
-void VisualServerRaster::viewport_set_render_target_to_screen_rect(RID p_viewport,const Rect2& p_rect) {
+void VisualServerRaster::viewport_set_render_target_to_screen_rect(RID p_viewport, const Rect2 &p_rect) {
- Viewport *viewport = viewport_owner.get( p_viewport );
+ Viewport *viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND(!viewport);
- viewport->rt_to_screen_rect=p_rect;
-
+ viewport->rt_to_screen_rect = p_rect;
}
-bool VisualServerRaster::viewport_get_render_target_vflip(RID p_viewport) const{
+bool VisualServerRaster::viewport_get_render_target_vflip(RID p_viewport) const {
- const Viewport *viewport = viewport_owner.get( p_viewport );
- ERR_FAIL_COND_V(!viewport,false);
+ const Viewport *viewport = viewport_owner.get(p_viewport);
+ ERR_FAIL_COND_V(!viewport, false);
return viewport->render_target_vflip;
-
}
-bool VisualServerRaster::viewport_get_render_target_clear_on_new_frame(RID p_viewport) const{
+bool VisualServerRaster::viewport_get_render_target_clear_on_new_frame(RID p_viewport) const {
- const Viewport *viewport = viewport_owner.get( p_viewport );
- ERR_FAIL_COND_V(!viewport,false);
+ const Viewport *viewport = viewport_owner.get(p_viewport);
+ ERR_FAIL_COND_V(!viewport, false);
return viewport->render_target_clear_on_new_frame;
-
}
void VisualServerRaster::viewport_render_target_clear(RID p_viewport) {
- Viewport *viewport = viewport_owner.get( p_viewport );
+ Viewport *viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND(!viewport);
- viewport->render_target_clear=true;
-
+ viewport->render_target_clear = true;
}
void VisualServerRaster::viewport_queue_screen_capture(RID p_viewport) {
VS_CHANGED;
- Viewport *viewport = viewport_owner.get( p_viewport );
+ Viewport *viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND(!viewport);
- viewport->queue_capture=true;
-
+ viewport->queue_capture = true;
}
Image VisualServerRaster::viewport_get_screen_capture(RID p_viewport) const {
- Viewport *viewport = (Viewport*)viewport_owner.get( p_viewport );
- ERR_FAIL_COND_V(!viewport,Image());
+ Viewport *viewport = (Viewport *)viewport_owner.get(p_viewport);
+ ERR_FAIL_COND_V(!viewport, Image());
Image ret = viewport->capture;
- viewport->capture=Image();
+ viewport->capture = Image();
return ret;
}
-void VisualServerRaster::viewport_set_rect(RID p_viewport,const ViewportRect& p_rect) {
+void VisualServerRaster::viewport_set_rect(RID p_viewport, const ViewportRect &p_rect) {
VS_CHANGED;
- Viewport *viewport=NULL;
+ Viewport *viewport = NULL;
- viewport = viewport_owner.get( p_viewport );
+ viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND(!viewport);
- viewport->rect=p_rect;
+ viewport->rect = p_rect;
if (viewport->render_target.is_valid()) {
- rasterizer->render_target_set_size(viewport->render_target,viewport->rect.width,viewport->rect.height);
+ rasterizer->render_target_set_size(viewport->render_target, viewport->rect.width, viewport->rect.height);
}
}
-
VisualServer::ViewportRect VisualServerRaster::viewport_get_rect(RID p_viewport) const {
- const Viewport *viewport=NULL;
+ const Viewport *viewport = NULL;
- viewport = viewport_owner.get( p_viewport );
+ viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND_V(!viewport, ViewportRect());
return viewport->rect;
}
-void VisualServerRaster::viewport_set_hide_scenario(RID p_viewport,bool p_hide) {
+void VisualServerRaster::viewport_set_hide_scenario(RID p_viewport, bool p_hide) {
VS_CHANGED;
- Viewport *viewport=NULL;
+ Viewport *viewport = NULL;
- viewport = viewport_owner.get( p_viewport );
+ viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND(!viewport);
- viewport->hide_scenario=p_hide;
-
-
+ viewport->hide_scenario = p_hide;
}
-void VisualServerRaster::viewport_set_hide_canvas(RID p_viewport,bool p_hide) {
+void VisualServerRaster::viewport_set_hide_canvas(RID p_viewport, bool p_hide) {
VS_CHANGED;
- Viewport *viewport=NULL;
+ Viewport *viewport = NULL;
- viewport = viewport_owner.get( p_viewport );
+ viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND(!viewport);
- viewport->hide_canvas=p_hide;
-
-
+ viewport->hide_canvas = p_hide;
}
-void VisualServerRaster::viewport_set_disable_environment(RID p_viewport,bool p_disable) {
+void VisualServerRaster::viewport_set_disable_environment(RID p_viewport, bool p_disable) {
VS_CHANGED;
- Viewport *viewport=NULL;
- viewport = viewport_owner.get( p_viewport );
+ Viewport *viewport = NULL;
+ viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND(!viewport);
- viewport->disable_environment=p_disable;
-
+ viewport->disable_environment = p_disable;
}
-void VisualServerRaster::viewport_attach_camera(RID p_viewport,RID p_camera) {
+void VisualServerRaster::viewport_attach_camera(RID p_viewport, RID p_camera) {
VS_CHANGED;
- Viewport *viewport=NULL;
- viewport = viewport_owner.get( p_viewport );
+ Viewport *viewport = NULL;
+ viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND(!viewport);
-
-
-
if (p_camera.is_valid()) {
ERR_FAIL_COND(!camera_owner.owns(p_camera));
// a camera
- viewport->camera=p_camera;
+ viewport->camera = p_camera;
} else {
- viewport->camera=RID();
+ viewport->camera = RID();
}
-
}
-void VisualServerRaster::viewport_set_scenario(RID p_viewport,RID p_scenario) {
+void VisualServerRaster::viewport_set_scenario(RID p_viewport, RID p_scenario) {
VS_CHANGED;
- Viewport *viewport=NULL;
- viewport = viewport_owner.get( p_viewport );
+ Viewport *viewport = NULL;
+ viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND(!viewport);
if (p_scenario.is_valid()) {
ERR_FAIL_COND(!scenario_owner.owns(p_scenario));
// a camera
- viewport->scenario=p_scenario;
+ viewport->scenario = p_scenario;
} else {
- viewport->scenario=RID();
+ viewport->scenario = RID();
}
-
}
RID VisualServerRaster::viewport_get_attached_camera(RID p_viewport) const {
- const Viewport *viewport=NULL;
+ const Viewport *viewport = NULL;
- viewport = viewport_owner.get( p_viewport );
+ viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND_V(!viewport, RID());
return viewport->camera;
}
-void VisualServerRaster::viewport_attach_canvas(RID p_viewport,RID p_canvas) {
+void VisualServerRaster::viewport_attach_canvas(RID p_viewport, RID p_canvas) {
VS_CHANGED;
- Viewport *viewport=NULL;
+ Viewport *viewport = NULL;
- viewport = viewport_owner.get( p_viewport );
+ viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND(!viewport);
- Canvas *canvas = canvas_owner.get( p_canvas );
+ Canvas *canvas = canvas_owner.get(p_canvas);
ERR_FAIL_COND(!canvas);
ERR_EXPLAIN("Canvas already attached.");
ERR_FAIL_COND(viewport->canvas_map.has(p_canvas));
-
Viewport::CanvasData cd;
- cd.canvas=canvas;
- cd.layer=0;
+ cd.canvas = canvas;
+ cd.layer = 0;
- viewport->canvas_map[p_canvas]=cd;
+ viewport->canvas_map[p_canvas] = cd;
canvas->viewports.insert(p_viewport);
-
}
-
-void VisualServerRaster::viewport_set_canvas_transform(RID p_viewport,RID p_canvas,const Matrix32& p_transform) {
+void VisualServerRaster::viewport_set_canvas_transform(RID p_viewport, RID p_canvas, const Matrix32 &p_transform) {
VS_CHANGED;
- Viewport *viewport=NULL;
- viewport = viewport_owner.get( p_viewport );
+ Viewport *viewport = NULL;
+ viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND(!viewport);
- Map<RID,Viewport::CanvasData>::Element *E=viewport->canvas_map.find(p_canvas);
+ Map<RID, Viewport::CanvasData>::Element *E = viewport->canvas_map.find(p_canvas);
if (!E) {
ERR_EXPLAIN("Viewport does not contain the canvas");
ERR_FAIL_COND(!E);
}
- E->get().transform=p_transform;
-
+ E->get().transform = p_transform;
}
-Matrix32 VisualServerRaster::viewport_get_canvas_transform(RID p_viewport,RID p_canvas) const {
+Matrix32 VisualServerRaster::viewport_get_canvas_transform(RID p_viewport, RID p_canvas) const {
- Viewport *viewport=NULL;
- viewport = viewport_owner.get( p_viewport );
- ERR_FAIL_COND_V(!viewport,Matrix32());
+ Viewport *viewport = NULL;
+ viewport = viewport_owner.get(p_viewport);
+ ERR_FAIL_COND_V(!viewport, Matrix32());
- Map<RID,Viewport::CanvasData>::Element *E=viewport->canvas_map.find(p_canvas);
+ Map<RID, Viewport::CanvasData>::Element *E = viewport->canvas_map.find(p_canvas);
if (!E) {
ERR_EXPLAIN("Viewport does not contain the canvas");
- ERR_FAIL_COND_V(!E,Matrix32());
+ ERR_FAIL_COND_V(!E, Matrix32());
}
-
return E->get().transform;
}
-
-void VisualServerRaster::viewport_set_global_canvas_transform(RID p_viewport,const Matrix32& p_transform) {
+void VisualServerRaster::viewport_set_global_canvas_transform(RID p_viewport, const Matrix32 &p_transform) {
VS_CHANGED
- Viewport *viewport=NULL;
- viewport = viewport_owner.get( p_viewport );
+ Viewport *viewport = NULL;
+ viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND(!viewport);
- viewport->global_transform=p_transform;
-
+ viewport->global_transform = p_transform;
}
-Matrix32 VisualServerRaster::viewport_get_global_canvas_transform(RID p_viewport) const{
+Matrix32 VisualServerRaster::viewport_get_global_canvas_transform(RID p_viewport) const {
- Viewport *viewport=NULL;
- viewport = viewport_owner.get( p_viewport );
- ERR_FAIL_COND_V(!viewport,Matrix32());
+ Viewport *viewport = NULL;
+ viewport = viewport_owner.get(p_viewport);
+ ERR_FAIL_COND_V(!viewport, Matrix32());
return viewport->global_transform;
}
-void VisualServerRaster::viewport_remove_canvas(RID p_viewport,RID p_canvas) {
+void VisualServerRaster::viewport_remove_canvas(RID p_viewport, RID p_canvas) {
VS_CHANGED;
- Viewport *viewport=NULL;
+ Viewport *viewport = NULL;
- viewport = viewport_owner.get( p_viewport );
+ viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND(!viewport);
- Canvas *canvas = canvas_owner.get( p_canvas );
+ Canvas *canvas = canvas_owner.get(p_canvas);
ERR_FAIL_COND(!canvas);
-
- Map<RID,Viewport::CanvasData>::Element *E=viewport->canvas_map.find(p_canvas);
+ Map<RID, Viewport::CanvasData>::Element *E = viewport->canvas_map.find(p_canvas);
if (!E) {
ERR_EXPLAIN("Viewport does not contain the canvas");
ERR_FAIL_COND(!E);
}
-
canvas->viewports.erase(p_viewport);
viewport->canvas_map.erase(E);
-
}
-
-void VisualServerRaster::viewport_set_canvas_layer(RID p_viewport,RID p_canvas,int p_layer) {
+void VisualServerRaster::viewport_set_canvas_layer(RID p_viewport, RID p_canvas, int p_layer) {
VS_CHANGED;
- Viewport *viewport=NULL;
+ Viewport *viewport = NULL;
- viewport = viewport_owner.get( p_viewport );
+ viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND(!viewport);
- Map<RID,Viewport::CanvasData>::Element *E=viewport->canvas_map.find(p_canvas);
+ Map<RID, Viewport::CanvasData>::Element *E = viewport->canvas_map.find(p_canvas);
if (!E) {
ERR_EXPLAIN("Viewport does not contain the canvas");
ERR_FAIL_COND(!E);
}
- E->get().layer=p_layer;
-
+ E->get().layer = p_layer;
}
-void VisualServerRaster::viewport_set_transparent_background(RID p_viewport,bool p_enabled) {
+void VisualServerRaster::viewport_set_transparent_background(RID p_viewport, bool p_enabled) {
VS_CHANGED;
- Viewport *viewport=viewport_owner.get( p_viewport );
+ Viewport *viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND(!viewport);
- viewport->transparent_bg=p_enabled;
+ viewport->transparent_bg = p_enabled;
}
bool VisualServerRaster::viewport_has_transparent_background(RID p_viewport) const {
- Viewport *viewport=viewport_owner.get( p_viewport );
+ Viewport *viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND_V(!viewport, false);
return viewport->transparent_bg;
}
+RID VisualServerRaster::viewport_get_scenario(RID p_viewport) const {
-RID VisualServerRaster::viewport_get_scenario(RID p_viewport) const {
-
- const Viewport *viewport=NULL;
+ const Viewport *viewport = NULL;
- viewport = viewport_owner.get( p_viewport );
+ viewport = viewport_owner.get(p_viewport);
ERR_FAIL_COND_V(!viewport, RID());
return viewport->scenario;
}
-
RID VisualServerRaster::environment_create() {
return rasterizer->environment_create();
}
-void VisualServerRaster::environment_set_background(RID p_env,EnvironmentBG p_bg){
+void VisualServerRaster::environment_set_background(RID p_env, EnvironmentBG p_bg) {
- rasterizer->environment_set_background(p_env,p_bg);
+ rasterizer->environment_set_background(p_env, p_bg);
}
-VisualServer::EnvironmentBG VisualServerRaster::environment_get_background(RID p_env) const{
+VisualServer::EnvironmentBG VisualServerRaster::environment_get_background(RID p_env) const {
return rasterizer->environment_get_background(p_env);
}
-void VisualServerRaster::environment_set_background_param(RID p_env,EnvironmentBGParam p_param, const Variant& p_value){
+void VisualServerRaster::environment_set_background_param(RID p_env, EnvironmentBGParam p_param, const Variant &p_value) {
-
- rasterizer->environment_set_background_param(p_env,p_param,p_value);
+ rasterizer->environment_set_background_param(p_env, p_param, p_value);
}
-Variant VisualServerRaster::environment_get_background_param(RID p_env,EnvironmentBGParam p_param) const{
+Variant VisualServerRaster::environment_get_background_param(RID p_env, EnvironmentBGParam p_param) const {
- return rasterizer->environment_get_background_param(p_env,p_param);
+ return rasterizer->environment_get_background_param(p_env, p_param);
}
-void VisualServerRaster::environment_set_enable_fx(RID p_env,EnvironmentFx p_effect,bool p_enabled){
+void VisualServerRaster::environment_set_enable_fx(RID p_env, EnvironmentFx p_effect, bool p_enabled) {
- rasterizer->environment_set_enable_fx(p_env,p_effect,p_enabled);
+ rasterizer->environment_set_enable_fx(p_env, p_effect, p_enabled);
}
-bool VisualServerRaster::environment_is_fx_enabled(RID p_env,EnvironmentFx p_effect) const{
+bool VisualServerRaster::environment_is_fx_enabled(RID p_env, EnvironmentFx p_effect) const {
- return rasterizer->environment_is_fx_enabled(p_env,p_effect);
+ return rasterizer->environment_is_fx_enabled(p_env, p_effect);
}
+void VisualServerRaster::environment_fx_set_param(RID p_env, EnvironmentFxParam p_param, const Variant &p_value) {
-void VisualServerRaster::environment_fx_set_param(RID p_env,EnvironmentFxParam p_param,const Variant& p_value){
-
- rasterizer->environment_fx_set_param(p_env,p_param,p_value);
+ rasterizer->environment_fx_set_param(p_env, p_param, p_value);
}
-Variant VisualServerRaster::environment_fx_get_param(RID p_env,EnvironmentFxParam p_param) const {
+Variant VisualServerRaster::environment_fx_get_param(RID p_env, EnvironmentFxParam p_param) const {
- return environment_fx_get_param(p_env,p_param);
+ return environment_fx_get_param(p_env, p_param);
}
-
-
/* SCENARIO API */
-void VisualServerRaster::_dependency_queue_update(RID p_rid,bool p_update_aabb,bool p_update_materials) {
+void VisualServerRaster::_dependency_queue_update(RID p_rid, bool p_update_aabb, bool p_update_materials) {
- Map< RID, Set<RID> >::Element * E = instance_dependency_map.find( p_rid );
+ Map<RID, Set<RID> >::Element *E = instance_dependency_map.find(p_rid);
if (!E)
return;
-
Set<RID>::Element *I = E->get().front();
- while(I) {
+ while (I) {
- Instance *ins = instance_owner.get( I->get() );
- _instance_queue_update( ins , p_update_aabb, p_update_materials );
+ Instance *ins = instance_owner.get(I->get());
+ _instance_queue_update(ins, p_update_aabb, p_update_materials);
I = I->next();
}
-
}
-void VisualServerRaster::_instance_queue_update(Instance *p_instance,bool p_update_aabb,bool p_update_materials) {
+void VisualServerRaster::_instance_queue_update(Instance *p_instance, bool p_update_aabb, bool p_update_materials) {
if (p_update_aabb)
- p_instance->update_aabb=true;
+ p_instance->update_aabb = true;
if (p_update_materials)
- p_instance->update_materials=true;
+ p_instance->update_materials = true;
if (p_instance->update)
return;
- p_instance->update_next=instance_update_list;
- instance_update_list=p_instance;
- p_instance->update=true;
-
+ p_instance->update_next = instance_update_list;
+ instance_update_list = p_instance;
+ p_instance->update = true;
}
RID VisualServerRaster::scenario_create() {
- Scenario *scenario = memnew( Scenario );
- ERR_FAIL_COND_V(!scenario,RID());
- RID scenario_rid = scenario_owner.make_rid( scenario );
- scenario->self=scenario_rid;
- scenario->octree.set_pair_callback(instance_pair,this);
- scenario->octree.set_unpair_callback(instance_unpair,this);
+ Scenario *scenario = memnew(Scenario);
+ ERR_FAIL_COND_V(!scenario, RID());
+ RID scenario_rid = scenario_owner.make_rid(scenario);
+ scenario->self = scenario_rid;
+ scenario->octree.set_pair_callback(instance_pair, this);
+ scenario->octree.set_unpair_callback(instance_unpair, this);
return scenario_rid;
}
-void VisualServerRaster::scenario_set_debug(RID p_scenario,ScenarioDebugMode p_debug_mode) {
+void VisualServerRaster::scenario_set_debug(RID p_scenario, ScenarioDebugMode p_debug_mode) {
VS_CHANGED;
Scenario *scenario = scenario_owner.get(p_scenario);
ERR_FAIL_COND(!scenario);
- scenario->debug=p_debug_mode;
+ scenario->debug = p_debug_mode;
}
void VisualServerRaster::scenario_set_environment(RID p_scenario, RID p_environment) {
@@ -2102,8 +1917,7 @@ void VisualServerRaster::scenario_set_environment(RID p_scenario, RID p_environm
Scenario *scenario = scenario_owner.get(p_scenario);
ERR_FAIL_COND(!scenario);
- scenario->environment=p_environment;
-
+ scenario->environment = p_environment;
}
void VisualServerRaster::scenario_set_fallback_environment(RID p_scenario, RID p_environment) {
@@ -2112,32 +1926,27 @@ void VisualServerRaster::scenario_set_fallback_environment(RID p_scenario, RID p
Scenario *scenario = scenario_owner.get(p_scenario);
ERR_FAIL_COND(!scenario);
- scenario->fallback_environment=p_environment;
-
-
+ scenario->fallback_environment = p_environment;
}
-RID VisualServerRaster::scenario_get_environment(RID p_scenario, RID p_environment) const{
+RID VisualServerRaster::scenario_get_environment(RID p_scenario, RID p_environment) const {
const Scenario *scenario = scenario_owner.get(p_scenario);
- ERR_FAIL_COND_V(!scenario,RID());
+ ERR_FAIL_COND_V(!scenario, RID());
return scenario->environment;
-
}
-
/* INSTANCING API */
-
RID VisualServerRaster::instance_create() {
- Instance *instance = memnew( Instance );
- ERR_FAIL_COND_V(!instance,RID());
+ Instance *instance = memnew(Instance);
+ ERR_FAIL_COND_V(!instance, RID());
RID instance_rid = instance_owner.make_rid(instance);
- instance->self=instance_rid;
- instance->base_type=INSTANCE_NONE;
- instance->scenario=NULL;
+ instance->self = instance_rid;
+ instance->base_type = INSTANCE_NONE;
+ instance->scenario = NULL;
return instance_rid;
}
@@ -2145,26 +1954,26 @@ RID VisualServerRaster::instance_create() {
void VisualServerRaster::instance_set_base(RID p_instance, RID p_base) {
VS_CHANGED;
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND( !instance );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND(!instance);
- if (instance->base_type!=INSTANCE_NONE) {
+ if (instance->base_type != INSTANCE_NONE) {
//free anything related to that base
- Map< RID, Set<RID> >::Element * E = instance_dependency_map.find( instance->base_rid );
+ Map<RID, Set<RID> >::Element *E = instance_dependency_map.find(instance->base_rid);
if (E) {
// wtf, no E?
- E->get().erase( instance->self );
+ E->get().erase(instance->self);
} else {
ERR_PRINT("no base E? Bug?");
}
- if ( instance->room ) {
+ if (instance->room) {
- instance_set_room(p_instance,RID());
+ instance_set_room(p_instance, RID());
/*
if((1<<instance->base_type)&INSTANCE_GEOMETRY_MASK)
instance->room->room_info->owned_geometry_instances.erase(instance->RE);
@@ -2179,161 +1988,147 @@ void VisualServerRaster::instance_set_base(RID p_instance, RID p_base) {
instance->RE=NULL;*/
}
-
-
-
-
if (instance->light_info) {
if (instance->scenario && instance->light_info->D)
- instance->scenario->directional_lights.erase( instance->light_info->D );
+ instance->scenario->directional_lights.erase(instance->light_info->D);
rasterizer->free(instance->light_info->instance);
memdelete(instance->light_info);
- instance->light_info=NULL;
+ instance->light_info = NULL;
}
-
if (instance->portal_info) {
- _portal_disconnect(instance,true);
+ _portal_disconnect(instance, true);
memdelete(instance->portal_info);
- instance->portal_info=NULL;
-
+ instance->portal_info = NULL;
}
if (instance->baked_light_info) {
- while(instance->baked_light_info->owned_instances.size()) {
+ while (instance->baked_light_info->owned_instances.size()) {
- Instance *owned=instance->baked_light_info->owned_instances.front()->get();
- owned->baked_light=NULL;
- owned->data.baked_light=NULL;
- owned->data.baked_light_octree_xform=NULL;
- owned->BLE=NULL;
+ Instance *owned = instance->baked_light_info->owned_instances.front()->get();
+ owned->baked_light = NULL;
+ owned->data.baked_light = NULL;
+ owned->data.baked_light_octree_xform = NULL;
+ owned->BLE = NULL;
instance->baked_light_info->owned_instances.pop_front();
}
memdelete(instance->baked_light_info);
- instance->baked_light_info=NULL;
-
+ instance->baked_light_info = NULL;
}
if (instance->scenario && instance->octree_id) {
- instance->scenario->octree.erase( instance->octree_id );
- instance->octree_id=0;
+ instance->scenario->octree.erase(instance->octree_id);
+ instance->octree_id = 0;
}
-
if (instance->room_info) {
- for(List<Instance*>::Element *E=instance->room_info->owned_geometry_instances.front();E;E=E->next()) {
+ for (List<Instance *>::Element *E = instance->room_info->owned_geometry_instances.front(); E; E = E->next()) {
Instance *owned = E->get();
- owned->room=NULL;
- owned->RE=NULL;
+ owned->room = NULL;
+ owned->RE = NULL;
}
- for(List<Instance*>::Element *E=instance->room_info->owned_portal_instances.front();E;E=E->next()) {
+ for (List<Instance *>::Element *E = instance->room_info->owned_portal_instances.front(); E; E = E->next()) {
- _portal_disconnect(E->get(),true);
+ _portal_disconnect(E->get(), true);
Instance *owned = E->get();
- owned->room=NULL;
- owned->RE=NULL;
+ owned->room = NULL;
+ owned->RE = NULL;
}
- for(List<Instance*>::Element *E=instance->room_info->owned_room_instances.front();E;E=E->next()) {
+ for (List<Instance *>::Element *E = instance->room_info->owned_room_instances.front(); E; E = E->next()) {
Instance *owned = E->get();
- owned->room=NULL;
- owned->RE=NULL;
+ owned->room = NULL;
+ owned->RE = NULL;
}
if (instance->room_info->disconnected_child_portals.size()) {
ERR_PRINT("BUG: Disconnected portals remain!");
}
memdelete(instance->room_info);
- instance->room_info=NULL;
-
+ instance->room_info = NULL;
}
if (instance->particles_info) {
- rasterizer->free( instance->particles_info->instance );
+ rasterizer->free(instance->particles_info->instance);
memdelete(instance->particles_info);
- instance->particles_info=NULL;
-
+ instance->particles_info = NULL;
}
if (instance->baked_light_sampler_info) {
while (instance->baked_light_sampler_info->owned_instances.size()) {
- instance_geometry_set_baked_light_sampler(instance->baked_light_sampler_info->owned_instances.front()->get()->self,RID());
+ instance_geometry_set_baked_light_sampler(instance->baked_light_sampler_info->owned_instances.front()->get()->self, RID());
}
if (instance->baked_light_sampler_info->sampled_light.is_valid()) {
rasterizer->free(instance->baked_light_sampler_info->sampled_light);
}
- memdelete( instance->baked_light_sampler_info );
- instance->baked_light_sampler_info=NULL;
+ memdelete(instance->baked_light_sampler_info);
+ instance->baked_light_sampler_info = NULL;
}
instance->data.morph_values.clear();
instance->data.materials.clear();
-
}
-
- instance->base_type=INSTANCE_NONE;
- instance->base_rid=RID();
-
+ instance->base_type = INSTANCE_NONE;
+ instance->base_rid = RID();
if (p_base.is_valid()) {
if (rasterizer->is_mesh(p_base)) {
- instance->base_type=INSTANCE_MESH;
- instance->data.morph_values.resize( rasterizer->mesh_get_morph_target_count(p_base));
- instance->data.materials.resize( rasterizer->mesh_get_surface_count(p_base));
+ instance->base_type = INSTANCE_MESH;
+ instance->data.morph_values.resize(rasterizer->mesh_get_morph_target_count(p_base));
+ instance->data.materials.resize(rasterizer->mesh_get_surface_count(p_base));
} else if (rasterizer->is_multimesh(p_base)) {
- instance->base_type=INSTANCE_MULTIMESH;
+ instance->base_type = INSTANCE_MULTIMESH;
} else if (rasterizer->is_immediate(p_base)) {
- instance->base_type=INSTANCE_IMMEDIATE;
+ instance->base_type = INSTANCE_IMMEDIATE;
} else if (rasterizer->is_particles(p_base)) {
- instance->base_type=INSTANCE_PARTICLES;
- instance->particles_info=memnew( Instance::ParticlesInfo );
- instance->particles_info->instance = rasterizer->particles_instance_create( p_base );
+ instance->base_type = INSTANCE_PARTICLES;
+ instance->particles_info = memnew(Instance::ParticlesInfo);
+ instance->particles_info->instance = rasterizer->particles_instance_create(p_base);
} else if (rasterizer->is_light(p_base)) {
- instance->base_type=INSTANCE_LIGHT;
- instance->light_info = memnew( Instance::LightInfo );
+ instance->base_type = INSTANCE_LIGHT;
+ instance->light_info = memnew(Instance::LightInfo);
instance->light_info->instance = rasterizer->light_instance_create(p_base);
- if (instance->scenario && rasterizer->light_get_type(p_base)==LIGHT_DIRECTIONAL) {
+ if (instance->scenario && rasterizer->light_get_type(p_base) == LIGHT_DIRECTIONAL) {
instance->light_info->D = instance->scenario->directional_lights.push_back(instance->self);
}
} else if (room_owner.owns(p_base)) {
- instance->base_type=INSTANCE_ROOM;
- instance->room_info = memnew( Instance::RoomInfo );
- instance->room_info->room=room_owner.get(p_base);
+ instance->base_type = INSTANCE_ROOM;
+ instance->room_info = memnew(Instance::RoomInfo);
+ instance->room_info->room = room_owner.get(p_base);
} else if (portal_owner.owns(p_base)) {
- instance->base_type=INSTANCE_PORTAL;
+ instance->base_type = INSTANCE_PORTAL;
instance->portal_info = memnew(Instance::PortalInfo);
- instance->portal_info->portal=portal_owner.get(p_base);
+ instance->portal_info->portal = portal_owner.get(p_base);
} else if (baked_light_owner.owns(p_base)) {
- instance->base_type=INSTANCE_BAKED_LIGHT;
- instance->baked_light_info=memnew(Instance::BakedLightInfo);
- instance->baked_light_info->baked_light=baked_light_owner.get(p_base);
+ instance->base_type = INSTANCE_BAKED_LIGHT;
+ instance->baked_light_info = memnew(Instance::BakedLightInfo);
+ instance->baked_light_info->baked_light = baked_light_owner.get(p_base);
//instance->portal_info = memnew(Instance::PortalInfo);
//instance->portal_info->portal=portal_owner.get(p_base);
} else if (baked_light_sampler_owner.owns(p_base)) {
-
- instance->base_type=INSTANCE_BAKED_LIGHT_SAMPLER;
- instance->baked_light_sampler_info=memnew( Instance::BakedLightSamplerInfo);
- instance->baked_light_sampler_info->sampler=baked_light_sampler_owner.get(p_base);
+ instance->base_type = INSTANCE_BAKED_LIGHT_SAMPLER;
+ instance->baked_light_sampler_info = memnew(Instance::BakedLightSamplerInfo);
+ instance->baked_light_sampler_info->sampler = baked_light_sampler_owner.get(p_base);
//instance->portal_info = memnew(Instance::PortalInfo);
//instance->portal_info->portal=portal_owner.get(p_base);
@@ -2343,38 +2138,36 @@ void VisualServerRaster::instance_set_base(RID p_instance, RID p_base) {
ERR_FAIL();
}
- instance_dependency_map[ p_base ].insert( instance->self );
+ instance_dependency_map[p_base].insert(instance->self);
- instance->base_rid=p_base;
+ instance->base_rid = p_base;
if (instance->scenario)
- _instance_queue_update(instance,true);
+ _instance_queue_update(instance, true);
}
-
}
RID VisualServerRaster::instance_get_base(RID p_instance) const {
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND_V( !instance, RID() );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND_V(!instance, RID());
return instance->base_rid;
-
}
void VisualServerRaster::instance_set_scenario(RID p_instance, RID p_scenario) {
VS_CHANGED;
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND( !instance );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND(!instance);
if (instance->scenario) {
- Map< RID, Set<RID> >::Element *E = instance_dependency_map.find( instance->scenario->self );
+ Map<RID, Set<RID> >::Element *E = instance_dependency_map.find(instance->scenario->self);
if (E) {
// wtf, no E?
- E->get().erase( instance->self );
+ E->get().erase(instance->self);
} else {
@@ -2384,310 +2177,286 @@ void VisualServerRaster::instance_set_scenario(RID p_instance, RID p_scenario) {
if (instance->light_info) {
if (instance->light_info->D)
- instance->scenario->directional_lights.erase( instance->light_info->D );
+ instance->scenario->directional_lights.erase(instance->light_info->D);
}
if (instance->portal_info) {
- _portal_disconnect(instance,true);
+ _portal_disconnect(instance, true);
}
if (instance->octree_id) {
- instance->scenario->octree.erase( instance->octree_id );
- instance->octree_id=0;
+ instance->scenario->octree.erase(instance->octree_id);
+ instance->octree_id = 0;
}
- instance->scenario=NULL;
+ instance->scenario = NULL;
}
-
if (p_scenario.is_valid()) {
- Scenario *scenario = scenario_owner.get( p_scenario );
+ Scenario *scenario = scenario_owner.get(p_scenario);
ERR_FAIL_COND(!scenario);
- instance->scenario=scenario;
+ instance->scenario = scenario;
- instance_dependency_map[ p_scenario ].insert( instance->self );
- instance->scenario=scenario;
+ instance_dependency_map[p_scenario].insert(instance->self);
+ instance->scenario = scenario;
- if (instance->base_type==INSTANCE_LIGHT && rasterizer->light_get_type(instance->base_rid)==LIGHT_DIRECTIONAL) {
+ if (instance->base_type == INSTANCE_LIGHT && rasterizer->light_get_type(instance->base_rid) == LIGHT_DIRECTIONAL) {
instance->light_info->D = instance->scenario->directional_lights.push_back(instance->self);
}
- _instance_queue_update(instance,true);
+ _instance_queue_update(instance, true);
}
-
}
RID VisualServerRaster::instance_get_scenario(RID p_instance) const {
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND_V( !instance, RID() );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND_V(!instance, RID());
if (instance->scenario)
return instance->scenario->self;
else
return RID();
-
-
}
-
void VisualServerRaster::instance_set_layer_mask(RID p_instance, uint32_t p_mask) {
VS_CHANGED;
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND( !instance );
-
- instance->layer_mask=p_mask;
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND(!instance);
+ instance->layer_mask = p_mask;
}
-uint32_t VisualServerRaster::instance_get_layer_mask(RID p_instance) const{
+uint32_t VisualServerRaster::instance_get_layer_mask(RID p_instance) const {
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND_V( !instance, 0 );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND_V(!instance, 0);
return instance->layer_mask;
}
-
AABB VisualServerRaster::instance_get_base_aabb(RID p_instance) const {
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND_V( !instance, AABB() );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND_V(!instance, AABB());
return instance->aabb;
-
}
-void VisualServerRaster::instance_attach_object_instance_ID(RID p_instance,uint32_t p_ID) {
+void VisualServerRaster::instance_attach_object_instance_ID(RID p_instance, uint32_t p_ID) {
VS_CHANGED;
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND( !instance );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND(!instance);
- instance->object_ID=p_ID;
+ instance->object_ID = p_ID;
}
uint32_t VisualServerRaster::instance_get_object_instance_ID(RID p_instance) const {
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND_V( !instance, 0 );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND_V(!instance, 0);
return instance->object_ID;
-
}
-void VisualServerRaster::instance_attach_skeleton(RID p_instance,RID p_skeleton) {
+void VisualServerRaster::instance_attach_skeleton(RID p_instance, RID p_skeleton) {
VS_CHANGED;
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND( !instance );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND(!instance);
if (instance->data.skeleton.is_valid()) {
skeleton_dependency_map[instance->data.skeleton].erase(instance);
}
- instance->data.skeleton=p_skeleton;
+ instance->data.skeleton = p_skeleton;
if (instance->data.skeleton.is_valid()) {
skeleton_dependency_map[instance->data.skeleton].insert(instance);
}
-
}
RID VisualServerRaster::instance_get_skeleton(RID p_instance) const {
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND_V( !instance, RID() );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND_V(!instance, RID());
return instance->data.skeleton;
-
}
-void VisualServerRaster::instance_set_morph_target_weight(RID p_instance,int p_shape, float p_weight) {
+void VisualServerRaster::instance_set_morph_target_weight(RID p_instance, int p_shape, float p_weight) {
VS_CHANGED;
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND( !instance );
- ERR_FAIL_INDEX( p_shape, instance->data.morph_values.size() );
- instance->data.morph_values[p_shape]=p_weight;
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND(!instance);
+ ERR_FAIL_INDEX(p_shape, instance->data.morph_values.size());
+ instance->data.morph_values[p_shape] = p_weight;
}
-float VisualServerRaster::instance_get_morph_target_weight(RID p_instance,int p_shape) const {
+float VisualServerRaster::instance_get_morph_target_weight(RID p_instance, int p_shape) const {
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND_V( !instance, 0 );
- ERR_FAIL_INDEX_V( p_shape, instance->data.morph_values.size(), 0 );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND_V(!instance, 0);
+ ERR_FAIL_INDEX_V(p_shape, instance->data.morph_values.size(), 0);
return instance->data.morph_values[p_shape];
}
-void VisualServerRaster::instance_set_surface_material(RID p_instance,int p_surface, RID p_material) {
+void VisualServerRaster::instance_set_surface_material(RID p_instance, int p_surface, RID p_material) {
VS_CHANGED;
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND( !instance);
- ERR_FAIL_INDEX( p_surface, instance->data.materials.size() );
- instance->data.materials[p_surface]=p_material;
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND(!instance);
+ ERR_FAIL_INDEX(p_surface, instance->data.materials.size());
+ instance->data.materials[p_surface] = p_material;
}
-
-void VisualServerRaster::instance_set_transform(RID p_instance, const Transform& p_transform) {
+void VisualServerRaster::instance_set_transform(RID p_instance, const Transform &p_transform) {
VS_CHANGED;
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND( !instance );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND(!instance);
- if (p_transform==instance->data.transform) // must improve somehow
+ if (p_transform == instance->data.transform) // must improve somehow
return;
- instance->data.transform=p_transform;
- if (instance->base_type==INSTANCE_LIGHT)
+ instance->data.transform = p_transform;
+ if (instance->base_type == INSTANCE_LIGHT)
instance->data.transform.orthonormalize();
_instance_queue_update(instance);
-
}
Transform VisualServerRaster::instance_get_transform(RID p_instance) const {
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND_V( !instance, Transform() );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND_V(!instance, Transform());
return instance->data.transform;
-
}
-void VisualServerRaster::instance_set_exterior( RID p_instance, bool p_enabled ) {
+void VisualServerRaster::instance_set_exterior(RID p_instance, bool p_enabled) {
VS_CHANGED;
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND( !instance );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND(!instance);
ERR_EXPLAIN("Portals can't be assigned to be exterior");
- ERR_FAIL_COND( instance->base_type == INSTANCE_PORTAL );
- if (instance->exterior==p_enabled)
+ ERR_FAIL_COND(instance->base_type == INSTANCE_PORTAL);
+ if (instance->exterior == p_enabled)
return;
- instance->exterior=p_enabled;
- _instance_queue_update( instance );
-
-
+ instance->exterior = p_enabled;
+ _instance_queue_update(instance);
}
-bool VisualServerRaster::instance_is_exterior( RID p_instance) const {
+bool VisualServerRaster::instance_is_exterior(RID p_instance) const {
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND_V( !instance, false );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND_V(!instance, false);
return instance->exterior;
}
-
-void VisualServerRaster::instance_set_room( RID p_instance, RID p_room ) {
+void VisualServerRaster::instance_set_room(RID p_instance, RID p_room) {
VS_CHANGED;
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND( !instance );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND(!instance);
if (instance->room && instance->RE) {
//instance already havs a room, remove it from there
- if ( (1<<instance->base_type) & INSTANCE_GEOMETRY_MASK ) {
+ if ((1 << instance->base_type) & INSTANCE_GEOMETRY_MASK) {
instance->room->room_info->owned_geometry_instances.erase(instance->RE);
if (!p_room.is_valid() && instance->octree_id) {
//remove from the octree, so it's re-added with different flags
- instance->scenario->octree.erase( instance->octree_id );
- instance->octree_id=0;
- _instance_queue_update( instance,true );
+ instance->scenario->octree.erase(instance->octree_id);
+ instance->octree_id = 0;
+ _instance_queue_update(instance, true);
}
-
- } else if ( instance->base_type==INSTANCE_ROOM ) {
+ } else if (instance->base_type == INSTANCE_ROOM) {
instance->room->room_info->owned_room_instances.erase(instance->RE);
- for(List<Instance*>::Element *E=instance->room_info->owned_portal_instances.front();E;E=E->next()) {
+ for (List<Instance *>::Element *E = instance->room_info->owned_portal_instances.front(); E; E = E->next()) {
_portal_disconnect(E->get());
- _instance_queue_update( E->get(),false );
+ _instance_queue_update(E->get(), false);
}
- } else if ( instance->base_type==INSTANCE_PORTAL ) {
+ } else if (instance->base_type == INSTANCE_PORTAL) {
- _portal_disconnect(instance,true);
+ _portal_disconnect(instance, true);
bool ss = instance->room->room_info->owned_portal_instances.erase(instance->RE);
- } else if ( instance->base_type==INSTANCE_LIGHT ) {
+ } else if (instance->base_type == INSTANCE_LIGHT) {
instance->room->room_info->owned_light_instances.erase(instance->RE);
} else {
ERR_FAIL();
-
}
- instance->RE=NULL;
- instance->room=NULL;
-
+ instance->RE = NULL;
+ instance->room = NULL;
} else {
if (p_room.is_valid() && instance->octree_id) {
//remove from the octree, so it's re-added with different flags
- instance->scenario->octree.erase( instance->octree_id );
- instance->octree_id=0;
- _instance_queue_update( instance,true );
+ instance->scenario->octree.erase(instance->octree_id);
+ instance->octree_id = 0;
+ _instance_queue_update(instance, true);
}
-
}
if (!p_room.is_valid())
return; // just clearning the room
- Instance *room = instance_owner.get( p_room );
-
- ERR_FAIL_COND( !room );
- ERR_FAIL_COND( room->base_type!=INSTANCE_ROOM );
+ Instance *room = instance_owner.get(p_room);
+ ERR_FAIL_COND(!room);
+ ERR_FAIL_COND(room->base_type != INSTANCE_ROOM);
- if (instance->base_type==INSTANCE_ROOM) {
+ if (instance->base_type == INSTANCE_ROOM) {
//perform cycle test
Instance *parent = instance;
- while(parent) {
+ while (parent) {
ERR_EXPLAIN("Cycle in room assignment");
- ERR_FAIL_COND( parent == room );
- parent=parent->room;
+ ERR_FAIL_COND(parent == room);
+ parent = parent->room;
}
}
- if ( (1<<instance->base_type) & INSTANCE_GEOMETRY_MASK ) {
+ if ((1 << instance->base_type) & INSTANCE_GEOMETRY_MASK) {
instance->RE = room->room_info->owned_geometry_instances.push_back(instance);
- } else if ( instance->base_type==INSTANCE_ROOM ) {
+ } else if (instance->base_type == INSTANCE_ROOM) {
instance->RE = room->room_info->owned_room_instances.push_back(instance);
- for(List<Instance*>::Element *E=instance->room_info->owned_portal_instances.front();E;E=E->next())
- _instance_queue_update( E->get(),false );
-
+ for (List<Instance *>::Element *E = instance->room_info->owned_portal_instances.front(); E; E = E->next())
+ _instance_queue_update(E->get(), false);
- } else if ( instance->base_type==INSTANCE_PORTAL ) {
+ } else if (instance->base_type == INSTANCE_PORTAL) {
instance->RE = room->room_info->owned_portal_instances.push_back(instance);
- } else if ( instance->base_type==INSTANCE_LIGHT ) {
+ } else if (instance->base_type == INSTANCE_LIGHT) {
instance->RE = room->room_info->owned_light_instances.push_back(instance);
} else {
ERR_FAIL();
-
}
- instance->room=room;
+ instance->room = room;
}
-RID VisualServerRaster::instance_get_room( RID p_instance ) const {
+RID VisualServerRaster::instance_get_room(RID p_instance) const {
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND_V( !instance, RID() );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND_V(!instance, RID());
if (instance->room)
return instance->room->self;
@@ -2695,152 +2464,142 @@ RID VisualServerRaster::instance_get_room( RID p_instance ) const {
return RID();
}
-void VisualServerRaster::instance_set_extra_visibility_margin( RID p_instance, real_t p_margin ) {
+void VisualServerRaster::instance_set_extra_visibility_margin(RID p_instance, real_t p_margin) {
VS_CHANGED;
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND( !instance );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND(!instance);
- instance->extra_margin=p_margin;
+ instance->extra_margin = p_margin;
}
-real_t VisualServerRaster::instance_get_extra_visibility_margin( RID p_instance ) const{
-
+real_t VisualServerRaster::instance_get_extra_visibility_margin(RID p_instance) const {
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND_V( !instance, 0 );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND_V(!instance, 0);
return instance->extra_margin;
}
-
-Vector<RID> VisualServerRaster::instances_cull_aabb(const AABB& p_aabb, RID p_scenario) const {
-
+Vector<RID> VisualServerRaster::instances_cull_aabb(const AABB &p_aabb, RID p_scenario) const {
Vector<RID> instances;
- Scenario *scenario=scenario_owner.get(p_scenario);
- ERR_FAIL_COND_V(!scenario,instances);
+ Scenario *scenario = scenario_owner.get(p_scenario);
+ ERR_FAIL_COND_V(!scenario, instances);
- const_cast<VisualServerRaster*>(this)->_update_instances(); // check dirty instances before culling
+ const_cast<VisualServerRaster *>(this)->_update_instances(); // check dirty instances before culling
- int culled=0;
+ int culled = 0;
Instance *cull[1024];
- culled=scenario->octree.cull_AABB(p_aabb,cull,1024);
+ culled = scenario->octree.cull_AABB(p_aabb, cull, 1024);
- for (int i=0;i<culled;i++) {
+ for (int i = 0; i < culled; i++) {
- Instance *instance=cull[i];
+ Instance *instance = cull[i];
ERR_CONTINUE(!instance);
instances.push_back(instance->self);
}
return instances;
}
-Vector<RID> VisualServerRaster::instances_cull_ray(const Vector3& p_from, const Vector3& p_to, RID p_scenario) const{
+Vector<RID> VisualServerRaster::instances_cull_ray(const Vector3 &p_from, const Vector3 &p_to, RID p_scenario) const {
Vector<RID> instances;
- Scenario *scenario=scenario_owner.get(p_scenario);
- ERR_FAIL_COND_V(!scenario,instances);
- const_cast<VisualServerRaster*>(this)->_update_instances(); // check dirty instances before culling
+ Scenario *scenario = scenario_owner.get(p_scenario);
+ ERR_FAIL_COND_V(!scenario, instances);
+ const_cast<VisualServerRaster *>(this)->_update_instances(); // check dirty instances before culling
- int culled=0;
+ int culled = 0;
Instance *cull[1024];
- culled=scenario->octree.cull_segment(p_from,p_to*10000,cull,1024);
+ culled = scenario->octree.cull_segment(p_from, p_to * 10000, cull, 1024);
+ for (int i = 0; i < culled; i++) {
- for (int i=0;i<culled;i++) {
-
- Instance *instance=cull[i];
+ Instance *instance = cull[i];
ERR_CONTINUE(!instance);
instances.push_back(instance->self);
}
return instances;
-
}
-Vector<RID> VisualServerRaster::instances_cull_convex(const Vector<Plane>& p_convex, RID p_scenario) const{
+Vector<RID> VisualServerRaster::instances_cull_convex(const Vector<Plane> &p_convex, RID p_scenario) const {
Vector<RID> instances;
- Scenario *scenario=scenario_owner.get(p_scenario);
- ERR_FAIL_COND_V(!scenario,instances);
- const_cast<VisualServerRaster*>(this)->_update_instances(); // check dirty instances before culling
+ Scenario *scenario = scenario_owner.get(p_scenario);
+ ERR_FAIL_COND_V(!scenario, instances);
+ const_cast<VisualServerRaster *>(this)->_update_instances(); // check dirty instances before culling
- int culled=0;
+ int culled = 0;
Instance *cull[1024];
+ culled = scenario->octree.cull_convex(p_convex, cull, 1024);
- culled=scenario->octree.cull_convex(p_convex,cull,1024);
-
- for (int i=0;i<culled;i++) {
+ for (int i = 0; i < culled; i++) {
- Instance *instance=cull[i];
+ Instance *instance = cull[i];
ERR_CONTINUE(!instance);
instances.push_back(instance->self);
}
return instances;
-
}
-void VisualServerRaster::instance_geometry_set_flag(RID p_instance,InstanceFlags p_flags,bool p_enabled) {
+void VisualServerRaster::instance_geometry_set_flag(RID p_instance, InstanceFlags p_flags, bool p_enabled) {
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND( !instance );
-// ERR_FAIL_COND( ! ( (1<<instance->base_type) & INSTANCE_GEOMETRY_MASK) );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND(!instance);
+ // ERR_FAIL_COND( ! ( (1<<instance->base_type) & INSTANCE_GEOMETRY_MASK) );
- switch(p_flags) {
+ switch (p_flags) {
case INSTANCE_FLAG_VISIBLE: {
- instance->visible=p_enabled;
+ instance->visible = p_enabled;
} break;
case INSTANCE_FLAG_BILLBOARD: {
- instance->data.billboard=p_enabled;
+ instance->data.billboard = p_enabled;
} break;
case INSTANCE_FLAG_BILLBOARD_FIX_Y: {
- instance->data.billboard_y=p_enabled;
+ instance->data.billboard_y = p_enabled;
} break;
case INSTANCE_FLAG_CAST_SHADOW: {
if (p_enabled == true) {
instance->data.cast_shadows = SHADOW_CASTING_SETTING_ON;
- }
- else {
+ } else {
instance->data.cast_shadows = SHADOW_CASTING_SETTING_OFF;
}
} break;
case INSTANCE_FLAG_RECEIVE_SHADOWS: {
- instance->data.receive_shadows=p_enabled;
+ instance->data.receive_shadows = p_enabled;
} break;
case INSTANCE_FLAG_DEPH_SCALE: {
- instance->data.depth_scale=p_enabled;
+ instance->data.depth_scale = p_enabled;
} break;
case INSTANCE_FLAG_VISIBLE_IN_ALL_ROOMS: {
- instance->visible_in_all_rooms=p_enabled;
+ instance->visible_in_all_rooms = p_enabled;
} break;
-
}
-
}
-bool VisualServerRaster::instance_geometry_get_flag(RID p_instance,InstanceFlags p_flags) const{
+bool VisualServerRaster::instance_geometry_get_flag(RID p_instance, InstanceFlags p_flags) const {
- const Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND_V( !instance, false );
-// ERR_FAIL_COND_V( ! ( (1<<instance->base_type) & INSTANCE_GEOMETRY_MASK), false );
+ const Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND_V(!instance, false);
+ // ERR_FAIL_COND_V( ! ( (1<<instance->base_type) & INSTANCE_GEOMETRY_MASK), false );
- switch(p_flags) {
+ switch (p_flags) {
case INSTANCE_FLAG_VISIBLE: {
@@ -2858,10 +2617,9 @@ bool VisualServerRaster::instance_geometry_get_flag(RID p_instance,InstanceFlags
} break;
case INSTANCE_FLAG_CAST_SHADOW: {
- if(instance->data.cast_shadows == SHADOW_CASTING_SETTING_OFF) {
+ if (instance->data.cast_shadows == SHADOW_CASTING_SETTING_OFF) {
return false;
- }
- else {
+ } else {
return true;
}
@@ -2881,7 +2639,6 @@ bool VisualServerRaster::instance_geometry_get_flag(RID p_instance,InstanceFlags
return instance->visible_in_all_rooms;
} break;
-
}
return false;
@@ -2889,238 +2646,210 @@ bool VisualServerRaster::instance_geometry_get_flag(RID p_instance,InstanceFlags
void VisualServerRaster::instance_geometry_set_cast_shadows_setting(RID p_instance, VS::ShadowCastingSetting p_shadow_casting_setting) {
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND( !instance );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND(!instance);
instance->data.cast_shadows = p_shadow_casting_setting;
}
-VS::ShadowCastingSetting VisualServerRaster::instance_geometry_get_cast_shadows_setting(RID p_instance) const{
+VS::ShadowCastingSetting VisualServerRaster::instance_geometry_get_cast_shadows_setting(RID p_instance) const {
- const Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND_V( !instance, SHADOW_CASTING_SETTING_OFF );
+ const Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND_V(!instance, SHADOW_CASTING_SETTING_OFF);
return instance->data.cast_shadows;
}
-
void VisualServerRaster::instance_geometry_set_material_override(RID p_instance, RID p_material) {
VS_CHANGED;
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND( !instance );
- instance->data.material_override=p_material;
-
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND(!instance);
+ instance->data.material_override = p_material;
}
-RID VisualServerRaster::instance_geometry_get_material_override(RID p_instance) const{
+RID VisualServerRaster::instance_geometry_get_material_override(RID p_instance) const {
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND_V( !instance, RID() );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND_V(!instance, RID());
return instance->data.material_override;
-
}
-void VisualServerRaster::instance_geometry_set_draw_range(RID p_instance,float p_min,float p_max){
+void VisualServerRaster::instance_geometry_set_draw_range(RID p_instance, float p_min, float p_max) {
VS_CHANGED;
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND( !instance );
-
- instance->draw_range_begin=p_min;
- instance->draw_range_end=p_max;
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND(!instance);
+ instance->draw_range_begin = p_min;
+ instance->draw_range_end = p_max;
}
-float VisualServerRaster::instance_geometry_get_draw_range_min(RID p_instance) const{
+float VisualServerRaster::instance_geometry_get_draw_range_min(RID p_instance) const {
- const Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND_V( !instance,0 );
+ const Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND_V(!instance, 0);
return instance->draw_range_begin;
-
-
}
-float VisualServerRaster::instance_geometry_get_draw_range_max(RID p_instance) const{
+float VisualServerRaster::instance_geometry_get_draw_range_max(RID p_instance) const {
- const Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND_V( !instance,0 );
+ const Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND_V(!instance, 0);
return instance->draw_range_end;
-
-
}
-
-void VisualServerRaster::instance_geometry_set_baked_light(RID p_instance,RID p_baked_light) {
+void VisualServerRaster::instance_geometry_set_baked_light(RID p_instance, RID p_baked_light) {
VS_CHANGED;
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND( !instance );
-
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND(!instance);
if (instance->baked_light) {
-
instance->baked_light->baked_light_info->owned_instances.erase(instance->BLE);
- instance->BLE=NULL;
- instance->baked_light=NULL;
- instance->data.baked_light=NULL;
- instance->data.baked_light_octree_xform=NULL;
-
+ instance->BLE = NULL;
+ instance->baked_light = NULL;
+ instance->data.baked_light = NULL;
+ instance->data.baked_light_octree_xform = NULL;
}
if (!p_baked_light.is_valid())
return;
- Instance *bl_instance = instance_owner.get( p_baked_light );
- ERR_FAIL_COND( !bl_instance );
- ERR_FAIL_COND( bl_instance->base_type!=INSTANCE_BAKED_LIGHT );
-
- instance->baked_light=bl_instance;
- instance->BLE=bl_instance->baked_light_info->owned_instances.push_back(instance);
- instance->data.baked_light=&bl_instance->baked_light_info->baked_light->data;
- instance->data.baked_light_octree_xform=&bl_instance->baked_light_info->affine_inverse;
+ Instance *bl_instance = instance_owner.get(p_baked_light);
+ ERR_FAIL_COND(!bl_instance);
+ ERR_FAIL_COND(bl_instance->base_type != INSTANCE_BAKED_LIGHT);
+ instance->baked_light = bl_instance;
+ instance->BLE = bl_instance->baked_light_info->owned_instances.push_back(instance);
+ instance->data.baked_light = &bl_instance->baked_light_info->baked_light->data;
+ instance->data.baked_light_octree_xform = &bl_instance->baked_light_info->affine_inverse;
}
-RID VisualServerRaster::instance_geometry_get_baked_light(RID p_instance) const{
+RID VisualServerRaster::instance_geometry_get_baked_light(RID p_instance) const {
- const Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND_V( !instance,RID() );
+ const Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND_V(!instance, RID());
if (instance->baked_light)
return instance->baked_light->self;
return RID();
-
}
-
-void VisualServerRaster::instance_geometry_set_baked_light_sampler(RID p_instance,RID p_baked_light_sampler) {
+void VisualServerRaster::instance_geometry_set_baked_light_sampler(RID p_instance, RID p_baked_light_sampler) {
VS_CHANGED;
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND( !instance );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND(!instance);
if (instance->sampled_light) {
instance->sampled_light->baked_light_sampler_info->owned_instances.erase(instance);
- instance->data.sampled_light=RID();
+ instance->data.sampled_light = RID();
}
- if(p_baked_light_sampler.is_valid()) {
- Instance *sampler_instance = instance_owner.get( p_baked_light_sampler );
- ERR_FAIL_COND( !sampler_instance );
- ERR_FAIL_COND( sampler_instance->base_type!=INSTANCE_BAKED_LIGHT_SAMPLER );
- instance->sampled_light=sampler_instance;
+ if (p_baked_light_sampler.is_valid()) {
+ Instance *sampler_instance = instance_owner.get(p_baked_light_sampler);
+ ERR_FAIL_COND(!sampler_instance);
+ ERR_FAIL_COND(sampler_instance->base_type != INSTANCE_BAKED_LIGHT_SAMPLER);
+ instance->sampled_light = sampler_instance;
instance->sampled_light->baked_light_sampler_info->owned_instances.insert(instance);
} else {
- instance->sampled_light=NULL;
+ instance->sampled_light = NULL;
}
- instance->data.sampled_light=RID();
-
+ instance->data.sampled_light = RID();
}
RID VisualServerRaster::instance_geometry_get_baked_light_sampler(RID p_instance) const {
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND_V( !instance,RID() );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND_V(!instance, RID());
if (instance->sampled_light)
return instance->sampled_light->self;
else
return RID();
-
}
-
-void VisualServerRaster::instance_geometry_set_baked_light_texture_index(RID p_instance,int p_tex_id){
+void VisualServerRaster::instance_geometry_set_baked_light_texture_index(RID p_instance, int p_tex_id) {
VS_CHANGED;
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND( !instance );
-
- instance->data.baked_lightmap_id=p_tex_id;
-
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND(!instance);
+ instance->data.baked_lightmap_id = p_tex_id;
}
-int VisualServerRaster::instance_geometry_get_baked_light_texture_index(RID p_instance) const{
+int VisualServerRaster::instance_geometry_get_baked_light_texture_index(RID p_instance) const {
- const Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND_V( !instance,0 );
+ const Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND_V(!instance, 0);
return instance->data.baked_lightmap_id;
-
}
-
void VisualServerRaster::_update_instance(Instance *p_instance) {
p_instance->version++;
if (p_instance->base_type == INSTANCE_LIGHT) {
- rasterizer->light_instance_set_transform( p_instance->light_info->instance, p_instance->data.transform );
-
+ rasterizer->light_instance_set_transform(p_instance->light_info->instance, p_instance->data.transform);
}
-
if (p_instance->aabb.has_no_surface())
return;
-
if (p_instance->base_type == INSTANCE_PARTICLES) {
- rasterizer->particles_instance_set_transform( p_instance->particles_info->instance, p_instance->data.transform );
+ rasterizer->particles_instance_set_transform(p_instance->particles_info->instance, p_instance->data.transform);
}
-
- if ((1<<p_instance->base_type)&INSTANCE_GEOMETRY_MASK) {
+ if ((1 << p_instance->base_type) & INSTANCE_GEOMETRY_MASK) {
//make sure lights are updated
- InstanceSet::Element *E=p_instance->lights.front();
- while(E) {
+ InstanceSet::Element *E = p_instance->lights.front();
+ while (E) {
E->get()->version++;
- E=E->next();
+ E = E->next();
}
} else if (p_instance->base_type == INSTANCE_ROOM) {
- p_instance->room_info->affine_inverse=p_instance->data.transform.affine_inverse();
+ p_instance->room_info->affine_inverse = p_instance->data.transform.affine_inverse();
} else if (p_instance->base_type == INSTANCE_BAKED_LIGHT) {
Transform scale;
scale.basis.scale(p_instance->baked_light_info->baked_light->octree_aabb.size);
- scale.origin=p_instance->baked_light_info->baked_light->octree_aabb.pos;
+ scale.origin = p_instance->baked_light_info->baked_light->octree_aabb.pos;
//print_line("scale: "+scale);
- p_instance->baked_light_info->affine_inverse=(p_instance->data.transform*scale).affine_inverse();
+ p_instance->baked_light_info->affine_inverse = (p_instance->data.transform * scale).affine_inverse();
}
-
-
p_instance->data.mirror = p_instance->data.transform.basis.determinant() < 0.0;
AABB new_aabb;
- if (p_instance->base_type==INSTANCE_PORTAL) {
+ if (p_instance->base_type == INSTANCE_PORTAL) {
//portals need to be transformed in a special way, so they don't become too wide if they have scale..
Transform portal_xform = p_instance->data.transform;
- portal_xform.basis.set_axis(2,portal_xform.basis.get_axis(2).normalized());
+ portal_xform.basis.set_axis(2, portal_xform.basis.get_axis(2).normalized());
- p_instance->portal_info->plane_cache=Plane( p_instance->data.transform.origin, portal_xform.basis.get_axis(2));
- int point_count=p_instance->portal_info->portal->shape.size();
+ p_instance->portal_info->plane_cache = Plane(p_instance->data.transform.origin, portal_xform.basis.get_axis(2));
+ int point_count = p_instance->portal_info->portal->shape.size();
p_instance->portal_info->transformed_point_cache.resize(point_count);
AABB portal_aabb;
- for(int i=0;i<point_count;i++) {
+ for (int i = 0; i < point_count; i++) {
Point2 src = p_instance->portal_info->portal->shape[i];
- Vector3 point = portal_xform.xform(Vector3(src.x,src.y,0));
- p_instance->portal_info->transformed_point_cache[i]=point;
- if (i==0)
- portal_aabb.pos=point;
+ Vector3 point = portal_xform.xform(Vector3(src.x, src.y, 0));
+ p_instance->portal_info->transformed_point_cache[i] = point;
+ if (i == 0)
+ portal_aabb.pos = point;
else
portal_aabb.expand_to(point);
}
@@ -3134,104 +2863,95 @@ void VisualServerRaster::_update_instance(Instance *p_instance) {
new_aabb = p_instance->data.transform.xform(p_instance->aabb);
}
-
- for(InstanceSet::Element *E=p_instance->lights.front();E;E=E->next()) {
+ for (InstanceSet::Element *E = p_instance->lights.front(); E; E = E->next()) {
Instance *light = E->get();
light->version++;
}
-
- p_instance->transformed_aabb=new_aabb;
+ p_instance->transformed_aabb = new_aabb;
if (!p_instance->scenario) {
-
return;
}
+ if (p_instance->octree_id == 0) {
-
- if (p_instance->octree_id==0) {
-
- uint32_t base_type = 1<<p_instance->base_type;
- uint32_t pairable_mask=0;
- bool pairable=false;
+ uint32_t base_type = 1 << p_instance->base_type;
+ uint32_t pairable_mask = 0;
+ bool pairable = false;
if (p_instance->base_type == INSTANCE_LIGHT) {
- pairable_mask=p_instance->light_info->enabled?INSTANCE_GEOMETRY_MASK:0;
- pairable=true;
+ pairable_mask = p_instance->light_info->enabled ? INSTANCE_GEOMETRY_MASK : 0;
+ pairable = true;
}
if (p_instance->base_type == INSTANCE_PORTAL) {
- pairable_mask=(1<<INSTANCE_PORTAL);
- pairable=true;
+ pairable_mask = (1 << INSTANCE_PORTAL);
+ pairable = true;
}
if (p_instance->base_type == INSTANCE_BAKED_LIGHT_SAMPLER) {
- pairable_mask=(1<<INSTANCE_BAKED_LIGHT);
- pairable=true;
+ pairable_mask = (1 << INSTANCE_BAKED_LIGHT);
+ pairable = true;
}
+ if (!p_instance->room && (1 << p_instance->base_type) & INSTANCE_GEOMETRY_MASK) {
- if (!p_instance->room && (1<<p_instance->base_type)&INSTANCE_GEOMETRY_MASK) {
-
- base_type|=INSTANCE_ROOMLESS_MASK;
+ base_type |= INSTANCE_ROOMLESS_MASK;
}
if (p_instance->base_type == INSTANCE_ROOM) {
- pairable_mask=INSTANCE_ROOMLESS_MASK;
- pairable=true;
+ pairable_mask = INSTANCE_ROOMLESS_MASK;
+ pairable = true;
}
-
// not inside octree
- p_instance->octree_id = p_instance->scenario->octree.create(p_instance,new_aabb,0,pairable,base_type,pairable_mask);
+ p_instance->octree_id = p_instance->scenario->octree.create(p_instance, new_aabb, 0, pairable, base_type, pairable_mask);
} else {
- // if (new_aabb==p_instance->data.transformed_aabb)
- // return;
+ // if (new_aabb==p_instance->data.transformed_aabb)
+ // return;
- p_instance->scenario->octree.move(p_instance->octree_id,new_aabb);
+ p_instance->scenario->octree.move(p_instance->octree_id, new_aabb);
}
- if (p_instance->base_type==INSTANCE_PORTAL) {
+ if (p_instance->base_type == INSTANCE_PORTAL) {
_portal_attempt_connect(p_instance);
}
- if (!p_instance->room && (1<<p_instance->base_type)&INSTANCE_GEOMETRY_MASK) {
+ if (!p_instance->room && (1 << p_instance->base_type) & INSTANCE_GEOMETRY_MASK) {
_instance_validate_autorooms(p_instance);
}
if (p_instance->base_type == INSTANCE_ROOM) {
- for(Set<Instance*>::Element *E=p_instance->room_info->owned_autoroom_geometry.front();E;E=E->next())
+ for (Set<Instance *>::Element *E = p_instance->room_info->owned_autoroom_geometry.front(); E; E = E->next())
_instance_validate_autorooms(E->get());
}
-
-
}
void VisualServerRaster::_update_instance_aabb(Instance *p_instance) {
AABB new_aabb;
- ERR_FAIL_COND(p_instance->base_type!=INSTANCE_NONE && !p_instance->base_rid.is_valid());
+ ERR_FAIL_COND(p_instance->base_type != INSTANCE_NONE && !p_instance->base_rid.is_valid());
- switch(p_instance->base_type) {
+ switch (p_instance->base_type) {
case VisualServer::INSTANCE_NONE: {
// do nothing
} break;
case VisualServer::INSTANCE_MESH: {
- new_aabb = rasterizer->mesh_get_aabb(p_instance->base_rid,p_instance->data.skeleton);
+ new_aabb = rasterizer->mesh_get_aabb(p_instance->base_rid, p_instance->data.skeleton);
} break;
case VisualServer::INSTANCE_MULTIMESH: {
@@ -3243,13 +2963,11 @@ void VisualServerRaster::_update_instance_aabb(Instance *p_instance) {
new_aabb = rasterizer->immediate_get_aabb(p_instance->base_rid);
-
} break;
case VisualServer::INSTANCE_PARTICLES: {
new_aabb = rasterizer->particles_get_aabb(p_instance->base_rid);
-
} break;
case VisualServer::INSTANCE_LIGHT: {
@@ -3258,22 +2976,22 @@ void VisualServerRaster::_update_instance_aabb(Instance *p_instance) {
} break;
case VisualServer::INSTANCE_ROOM: {
- Room *room = room_owner.get( p_instance->base_rid );
+ Room *room = room_owner.get(p_instance->base_rid);
ERR_FAIL_COND(!room);
- new_aabb=room->bounds.get_aabb();
+ new_aabb = room->bounds.get_aabb();
} break;
case VisualServer::INSTANCE_PORTAL: {
- Portal *portal = portal_owner.get( p_instance->base_rid );
+ Portal *portal = portal_owner.get(p_instance->base_rid);
ERR_FAIL_COND(!portal);
- for (int i=0;i<portal->shape.size();i++) {
+ for (int i = 0; i < portal->shape.size(); i++) {
- Vector3 point( portal->shape[i].x, portal->shape[i].y, 0 );
- if (i==0) {
+ Vector3 point(portal->shape[i].x, portal->shape[i].y, 0);
+ if (i == 0) {
- new_aabb.pos=point;
- new_aabb.size.z=0.01; // make it not flat for octree
+ new_aabb.pos = point;
+ new_aabb.size.z = 0.01; // make it not flat for octree
} else {
new_aabb.expand_to(point);
@@ -3283,18 +3001,18 @@ void VisualServerRaster::_update_instance_aabb(Instance *p_instance) {
} break;
case VisualServer::INSTANCE_BAKED_LIGHT: {
- BakedLight *baked_light = baked_light_owner.get( p_instance->base_rid );
+ BakedLight *baked_light = baked_light_owner.get(p_instance->base_rid);
ERR_FAIL_COND(!baked_light);
- new_aabb=baked_light->octree_aabb;
+ new_aabb = baked_light->octree_aabb;
} break;
case VisualServer::INSTANCE_BAKED_LIGHT_SAMPLER: {
- BakedLightSampler *baked_light_sampler = baked_light_sampler_owner.get( p_instance->base_rid );
+ BakedLightSampler *baked_light_sampler = baked_light_sampler_owner.get(p_instance->base_rid);
ERR_FAIL_COND(!baked_light_sampler);
float radius = baked_light_sampler->params[VS::BAKED_LIGHT_SAMPLER_RADIUS];
- new_aabb=AABB(Vector3(-radius,-radius,-radius),Vector3(radius*2,radius*2,radius*2));
+ new_aabb = AABB(Vector3(-radius, -radius, -radius), Vector3(radius * 2, radius * 2, radius * 2));
} break;
@@ -3304,59 +3022,57 @@ void VisualServerRaster::_update_instance_aabb(Instance *p_instance) {
if (p_instance->extra_margin)
new_aabb.grow_by(p_instance->extra_margin);
- p_instance->aabb=new_aabb;
-
+ p_instance->aabb = new_aabb;
}
void VisualServerRaster::_update_instances() {
- while(instance_update_list) {
+ while (instance_update_list) {
- Instance *instance=instance_update_list;
+ Instance *instance = instance_update_list;
- instance_update_list=instance_update_list->update_next;
+ instance_update_list = instance_update_list->update_next;
if (instance->update_aabb)
_update_instance_aabb(instance);
if (instance->update_materials) {
- if (instance->base_type==INSTANCE_MESH) {
+ if (instance->base_type == INSTANCE_MESH) {
instance->data.materials.resize(rasterizer->mesh_get_surface_count(instance->base_rid));
}
}
_update_instance(instance);
- instance->update=false;
- instance->update_aabb=false;
- instance->update_materials=false;
- instance->update_next=0;
+ instance->update = false;
+ instance->update_aabb = false;
+ instance->update_materials = false;
+ instance->update_next = 0;
}
}
-void VisualServerRaster::instance_light_set_enabled(RID p_instance,bool p_enabled) {
+void VisualServerRaster::instance_light_set_enabled(RID p_instance, bool p_enabled) {
VS_CHANGED;
- Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND( !instance );
- ERR_FAIL_COND( instance->base_type!=INSTANCE_LIGHT );
+ Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND(!instance);
+ ERR_FAIL_COND(instance->base_type != INSTANCE_LIGHT);
- if (p_enabled==instance->light_info->enabled)
+ if (p_enabled == instance->light_info->enabled)
return;
- instance->light_info->enabled=p_enabled;
- if (light_get_type(instance->base_rid)!=VS::LIGHT_DIRECTIONAL && instance->octree_id && instance->scenario)
- instance->scenario->octree.set_pairable(instance->octree_id,p_enabled,1<<INSTANCE_LIGHT,p_enabled?INSTANCE_GEOMETRY_MASK:0);
+ instance->light_info->enabled = p_enabled;
+ if (light_get_type(instance->base_rid) != VS::LIGHT_DIRECTIONAL && instance->octree_id && instance->scenario)
+ instance->scenario->octree.set_pairable(instance->octree_id, p_enabled, 1 << INSTANCE_LIGHT, p_enabled ? INSTANCE_GEOMETRY_MASK : 0);
//_instance_queue_update( instance , true );
-
}
bool VisualServerRaster::instance_light_is_enabled(RID p_instance) const {
- const Instance *instance = instance_owner.get( p_instance );
- ERR_FAIL_COND_V( !instance,false );
- ERR_FAIL_COND_V( instance->base_type!=INSTANCE_LIGHT,false );
+ const Instance *instance = instance_owner.get(p_instance);
+ ERR_FAIL_COND_V(!instance, false);
+ ERR_FAIL_COND_V(instance->base_type != INSTANCE_LIGHT, false);
return instance->light_info->enabled;
}
@@ -3364,60 +3080,56 @@ bool VisualServerRaster::instance_light_is_enabled(RID p_instance) const {
/****** CANVAS *********/
RID VisualServerRaster::canvas_create() {
- Canvas * canvas = memnew( Canvas );
- ERR_FAIL_COND_V(!canvas,RID());
- RID rid = canvas_owner.make_rid( canvas );
+ Canvas *canvas = memnew(Canvas);
+ ERR_FAIL_COND_V(!canvas, RID());
+ RID rid = canvas_owner.make_rid(canvas);
return rid;
}
+void VisualServerRaster::canvas_set_item_mirroring(RID p_canvas, RID p_item, const Point2 &p_mirroring) {
-void VisualServerRaster::canvas_set_item_mirroring(RID p_canvas,RID p_item,const Point2& p_mirroring) {
-
- Canvas * canvas = canvas_owner.get(p_canvas);
+ Canvas *canvas = canvas_owner.get(p_canvas);
ERR_FAIL_COND(!canvas);
CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
int idx = canvas->find_item(canvas_item);
- ERR_FAIL_COND(idx==-1);
- canvas->child_items[idx].mirror=p_mirroring;
-
+ ERR_FAIL_COND(idx == -1);
+ canvas->child_items[idx].mirror = p_mirroring;
}
-Point2 VisualServerRaster::canvas_get_item_mirroring(RID p_canvas,RID p_item) const {
+Point2 VisualServerRaster::canvas_get_item_mirroring(RID p_canvas, RID p_item) const {
- Canvas * canvas = canvas_owner.get(p_canvas);
- ERR_FAIL_COND_V(!canvas,Point2());
- CanvasItem *canvas_item = memnew( CanvasItem );
- ERR_FAIL_COND_V(!canvas_item,Point2());
+ Canvas *canvas = canvas_owner.get(p_canvas);
+ ERR_FAIL_COND_V(!canvas, Point2());
+ CanvasItem *canvas_item = memnew(CanvasItem);
+ ERR_FAIL_COND_V(!canvas_item, Point2());
int idx = canvas->find_item(canvas_item);
- ERR_FAIL_COND_V(idx==-1,Point2());
+ ERR_FAIL_COND_V(idx == -1, Point2());
return canvas->child_items[idx].mirror;
}
-void VisualServerRaster::canvas_set_modulate(RID p_canvas,const Color& p_color) {
+void VisualServerRaster::canvas_set_modulate(RID p_canvas, const Color &p_color) {
- Canvas * canvas = canvas_owner.get(p_canvas);
+ Canvas *canvas = canvas_owner.get(p_canvas);
ERR_FAIL_COND(!canvas);
- canvas->modulate=p_color;
+ canvas->modulate = p_color;
}
-
-
RID VisualServerRaster::canvas_item_create() {
- CanvasItem *canvas_item = memnew( CanvasItem );
- ERR_FAIL_COND_V(!canvas_item,RID());
+ CanvasItem *canvas_item = memnew(CanvasItem);
+ ERR_FAIL_COND_V(!canvas_item, RID());
- return canvas_item_owner.make_rid( canvas_item );
+ return canvas_item_owner.make_rid(canvas_item);
}
-void VisualServerRaster::canvas_item_set_parent(RID p_item,RID p_parent) {
+void VisualServerRaster::canvas_item_set_parent(RID p_item, RID p_parent) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
if (canvas_item->parent.is_valid()) {
@@ -3432,16 +3144,15 @@ void VisualServerRaster::canvas_item_set_parent(RID p_item,RID p_parent) {
item_owner->child_items.erase(canvas_item);
}
- canvas_item->parent=RID();
+ canvas_item->parent = RID();
}
-
if (p_parent.is_valid()) {
if (canvas_owner.owns(p_parent)) {
Canvas *canvas = canvas_owner.get(p_parent);
Canvas::ChildItem ci;
- ci.item=canvas_item;
+ ci.item = canvas_item;
canvas->child_items.push_back(ci);
} else if (canvas_item_owner.owns(p_parent)) {
@@ -3453,86 +3164,75 @@ void VisualServerRaster::canvas_item_set_parent(RID p_item,RID p_parent) {
ERR_EXPLAIN("Invalid parent");
ERR_FAIL();
}
-
-
}
- canvas_item->parent=p_parent;
-
-
+ canvas_item->parent = p_parent;
}
RID VisualServerRaster::canvas_item_get_parent(RID p_canvas_item) const {
- CanvasItem *canvas_item = canvas_item_owner.get( p_canvas_item );
- ERR_FAIL_COND_V(!canvas_item,RID());
+ CanvasItem *canvas_item = canvas_item_owner.get(p_canvas_item);
+ ERR_FAIL_COND_V(!canvas_item, RID());
return canvas_item->parent;
}
-void VisualServerRaster::canvas_item_set_visible(RID p_item,bool p_visible) {
+void VisualServerRaster::canvas_item_set_visible(RID p_item, bool p_visible) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- canvas_item->visible=p_visible;
+ canvas_item->visible = p_visible;
}
-
bool VisualServerRaster::canvas_item_is_visible(RID p_item) const {
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
- ERR_FAIL_COND_V(!canvas_item,RID());
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
+ ERR_FAIL_COND_V(!canvas_item, RID());
return canvas_item->visible;
-
}
-void VisualServerRaster::canvas_item_set_light_mask(RID p_canvas_item,int p_mask) {
+void VisualServerRaster::canvas_item_set_light_mask(RID p_canvas_item, int p_mask) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_canvas_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_canvas_item);
ERR_FAIL_COND(!canvas_item);
- if (canvas_item->light_mask==p_mask)
+ if (canvas_item->light_mask == p_mask)
return;
VS_CHANGED;
- canvas_item->light_mask=p_mask;
-
+ canvas_item->light_mask = p_mask;
}
-
-void VisualServerRaster::canvas_item_set_blend_mode(RID p_canvas_item,MaterialBlendMode p_blend) {
+void VisualServerRaster::canvas_item_set_blend_mode(RID p_canvas_item, MaterialBlendMode p_blend) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_canvas_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_canvas_item);
ERR_FAIL_COND(!canvas_item);
- if (canvas_item->blend_mode==p_blend)
+ if (canvas_item->blend_mode == p_blend)
return;
VS_CHANGED;
- canvas_item->blend_mode=p_blend;
-
+ canvas_item->blend_mode = p_blend;
}
void VisualServerRaster::canvas_item_attach_viewport(RID p_canvas_item, RID p_viewport) {
- CanvasItem *canvas_item = canvas_item_owner.get( p_canvas_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_canvas_item);
ERR_FAIL_COND(!canvas_item);
VS_CHANGED;
- canvas_item->viewport=p_viewport;
-
+ canvas_item->viewport = p_viewport;
}
-
/*
void VisualServerRaster::canvas_item_set_rect(RID p_item, const Rect2& p_rect) {
VS_CHANGED;
@@ -3544,257 +3244,242 @@ void VisualServerRaster::canvas_item_set_rect(RID p_item, const Rect2& p_rect) {
void VisualServerRaster::canvas_item_set_clip(RID p_item, bool p_clip) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- canvas_item->clip=p_clip;
+ canvas_item->clip = p_clip;
}
void VisualServerRaster::canvas_item_set_distance_field_mode(RID p_item, bool p_distance_field) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- canvas_item->distance_field=p_distance_field;
+ canvas_item->distance_field = p_distance_field;
}
-
-void VisualServerRaster::canvas_item_set_transform(RID p_item, const Matrix32& p_transform) {
+void VisualServerRaster::canvas_item_set_transform(RID p_item, const Matrix32 &p_transform) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- canvas_item->xform=p_transform;
-
+ canvas_item->xform = p_transform;
}
-
-void VisualServerRaster::canvas_item_set_custom_rect(RID p_item, bool p_custom_rect,const Rect2& p_rect) {
+void VisualServerRaster::canvas_item_set_custom_rect(RID p_item, bool p_custom_rect, const Rect2 &p_rect) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- canvas_item->custom_rect=p_custom_rect;
+ canvas_item->custom_rect = p_custom_rect;
if (p_custom_rect)
- canvas_item->rect=p_rect;
-
+ canvas_item->rect = p_rect;
}
void VisualServerRaster::canvas_item_set_opacity(RID p_item, float p_opacity) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- canvas_item->opacity=p_opacity;
-
+ canvas_item->opacity = p_opacity;
}
float VisualServerRaster::canvas_item_get_opacity(RID p_item, float p_opacity) const {
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
- ERR_FAIL_COND_V(!canvas_item,-1);
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
+ ERR_FAIL_COND_V(!canvas_item, -1);
return canvas_item->opacity;
-
}
void VisualServerRaster::canvas_item_set_on_top(RID p_item, bool p_on_top) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- canvas_item->ontop=p_on_top;
-
+ canvas_item->ontop = p_on_top;
}
-bool VisualServerRaster::canvas_item_is_on_top(RID p_item) const{
- const CanvasItem *canvas_item = canvas_item_owner.get( p_item );
- ERR_FAIL_COND_V(!canvas_item,false);
+bool VisualServerRaster::canvas_item_is_on_top(RID p_item) const {
+ const CanvasItem *canvas_item = canvas_item_owner.get(p_item);
+ ERR_FAIL_COND_V(!canvas_item, false);
return canvas_item->ontop;
-
}
-
void VisualServerRaster::canvas_item_set_self_opacity(RID p_item, float p_self_opacity) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- canvas_item->self_opacity=p_self_opacity;
-
+ canvas_item->self_opacity = p_self_opacity;
}
float VisualServerRaster::canvas_item_get_self_opacity(RID p_item, float p_self_opacity) const {
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
- ERR_FAIL_COND_V(!canvas_item,-1);
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
+ ERR_FAIL_COND_V(!canvas_item, -1);
return canvas_item->self_opacity;
-
}
-
-void VisualServerRaster::canvas_item_add_line(RID p_item, const Point2& p_from, const Point2& p_to,const Color& p_color,float p_width) {
+void VisualServerRaster::canvas_item_add_line(RID p_item, const Point2 &p_from, const Point2 &p_to, const Color &p_color, float p_width) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- CanvasItem::CommandLine * line = memnew( CanvasItem::CommandLine );
+ CanvasItem::CommandLine *line = memnew(CanvasItem::CommandLine);
ERR_FAIL_COND(!line);
- line->color=p_color;
- line->from=p_from;
- line->to=p_to;
- line->width=p_width;
- canvas_item->rect_dirty=true;
-
+ line->color = p_color;
+ line->from = p_from;
+ line->to = p_to;
+ line->width = p_width;
+ canvas_item->rect_dirty = true;
canvas_item->commands.push_back(line);
}
-void VisualServerRaster::canvas_item_add_rect(RID p_item, const Rect2& p_rect, const Color& p_color) {
+void VisualServerRaster::canvas_item_add_rect(RID p_item, const Rect2 &p_rect, const Color &p_color) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- CanvasItem::CommandRect * rect = memnew( CanvasItem::CommandRect );
+ CanvasItem::CommandRect *rect = memnew(CanvasItem::CommandRect);
ERR_FAIL_COND(!rect);
- rect->modulate=p_color;
- rect->rect=p_rect;
- canvas_item->rect_dirty=true;
+ rect->modulate = p_color;
+ rect->rect = p_rect;
+ canvas_item->rect_dirty = true;
canvas_item->commands.push_back(rect);
}
-void VisualServerRaster::canvas_item_add_circle(RID p_item, const Point2& p_pos, float p_radius,const Color& p_color) {
+void VisualServerRaster::canvas_item_add_circle(RID p_item, const Point2 &p_pos, float p_radius, const Color &p_color) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- CanvasItem::CommandCircle * circle = memnew( CanvasItem::CommandCircle );
+ CanvasItem::CommandCircle *circle = memnew(CanvasItem::CommandCircle);
ERR_FAIL_COND(!circle);
- circle->color=p_color;
- circle->pos=p_pos;
- circle->radius=p_radius;
+ circle->color = p_color;
+ circle->pos = p_pos;
+ circle->radius = p_radius;
canvas_item->commands.push_back(circle);
-
}
-void VisualServerRaster::canvas_item_add_texture_rect(RID p_item, const Rect2& p_rect, RID p_texture,bool p_tile,const Color& p_modulate,bool p_transpose) {
+void VisualServerRaster::canvas_item_add_texture_rect(RID p_item, const Rect2 &p_rect, RID p_texture, bool p_tile, const Color &p_modulate, bool p_transpose) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- CanvasItem::CommandRect * rect = memnew( CanvasItem::CommandRect );
+ CanvasItem::CommandRect *rect = memnew(CanvasItem::CommandRect);
ERR_FAIL_COND(!rect);
- rect->modulate=p_modulate;
- rect->rect=p_rect;
- rect->flags=0;
+ rect->modulate = p_modulate;
+ rect->rect = p_rect;
+ rect->flags = 0;
if (p_tile) {
- rect->flags|=Rasterizer::CANVAS_RECT_TILE;
- rect->flags|=Rasterizer::CANVAS_RECT_REGION;
- rect->source=Rect2(0,0,p_rect.size.width,p_rect.size.height);
+ rect->flags |= Rasterizer::CANVAS_RECT_TILE;
+ rect->flags |= Rasterizer::CANVAS_RECT_REGION;
+ rect->source = Rect2(0, 0, p_rect.size.width, p_rect.size.height);
}
- if (p_rect.size.x<0) {
+ if (p_rect.size.x < 0) {
- rect->flags|=Rasterizer::CANVAS_RECT_FLIP_H;
+ rect->flags |= Rasterizer::CANVAS_RECT_FLIP_H;
rect->rect.size.x = -rect->rect.size.x;
}
- if (p_rect.size.y<0) {
+ if (p_rect.size.y < 0) {
- rect->flags|=Rasterizer::CANVAS_RECT_FLIP_V;
+ rect->flags |= Rasterizer::CANVAS_RECT_FLIP_V;
rect->rect.size.y = -rect->rect.size.y;
}
if (p_transpose) {
- rect->flags|=Rasterizer::CANVAS_RECT_TRANSPOSE;
+ rect->flags |= Rasterizer::CANVAS_RECT_TRANSPOSE;
SWAP(rect->rect.size.x, rect->rect.size.y);
}
- rect->texture=p_texture;
- canvas_item->rect_dirty=true;
+ rect->texture = p_texture;
+ canvas_item->rect_dirty = true;
canvas_item->commands.push_back(rect);
}
-void VisualServerRaster::canvas_item_add_texture_rect_region(RID p_item, const Rect2& p_rect, RID p_texture,const Rect2& p_src_rect,const Color& p_modulate,bool p_transpose) {
+void VisualServerRaster::canvas_item_add_texture_rect_region(RID p_item, const Rect2 &p_rect, RID p_texture, const Rect2 &p_src_rect, const Color &p_modulate, bool p_transpose) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- CanvasItem::CommandRect * rect = memnew( CanvasItem::CommandRect );
+ CanvasItem::CommandRect *rect = memnew(CanvasItem::CommandRect);
ERR_FAIL_COND(!rect);
- rect->modulate=p_modulate;
- rect->rect=p_rect;
- rect->texture=p_texture;
- rect->source=p_src_rect;
- rect->flags=Rasterizer::CANVAS_RECT_REGION;
+ rect->modulate = p_modulate;
+ rect->rect = p_rect;
+ rect->texture = p_texture;
+ rect->source = p_src_rect;
+ rect->flags = Rasterizer::CANVAS_RECT_REGION;
- if (p_rect.size.x<0) {
+ if (p_rect.size.x < 0) {
- rect->flags|=Rasterizer::CANVAS_RECT_FLIP_H;
+ rect->flags |= Rasterizer::CANVAS_RECT_FLIP_H;
rect->rect.size.x = -rect->rect.size.x;
}
- if (p_rect.size.y<0) {
+ if (p_rect.size.y < 0) {
- rect->flags|=Rasterizer::CANVAS_RECT_FLIP_V;
+ rect->flags |= Rasterizer::CANVAS_RECT_FLIP_V;
rect->rect.size.y = -rect->rect.size.y;
}
if (p_transpose) {
- rect->flags|=Rasterizer::CANVAS_RECT_TRANSPOSE;
+ rect->flags |= Rasterizer::CANVAS_RECT_TRANSPOSE;
SWAP(rect->rect.size.x, rect->rect.size.y);
}
- canvas_item->rect_dirty=true;
+ canvas_item->rect_dirty = true;
canvas_item->commands.push_back(rect);
-
}
-void VisualServerRaster::canvas_item_add_style_box(RID p_item, const Rect2& p_rect, const Rect2& p_source, RID p_texture, const Vector2& p_topleft, const Vector2& p_bottomright, bool p_draw_center,const Color& p_modulate) {
+void VisualServerRaster::canvas_item_add_style_box(RID p_item, const Rect2 &p_rect, const Rect2 &p_source, RID p_texture, const Vector2 &p_topleft, const Vector2 &p_bottomright, bool p_draw_center, const Color &p_modulate) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- CanvasItem::CommandStyle * style = memnew( CanvasItem::CommandStyle );
+ CanvasItem::CommandStyle *style = memnew(CanvasItem::CommandStyle);
ERR_FAIL_COND(!style);
- style->texture=p_texture;
- style->rect=p_rect;
- style->source=p_source;
- style->draw_center=p_draw_center;
- style->color=p_modulate;
- style->margin[MARGIN_LEFT]=p_topleft.x;
- style->margin[MARGIN_TOP]=p_topleft.y;
- style->margin[MARGIN_RIGHT]=p_bottomright.x;
- style->margin[MARGIN_BOTTOM]=p_bottomright.y;
- canvas_item->rect_dirty=true;
+ style->texture = p_texture;
+ style->rect = p_rect;
+ style->source = p_source;
+ style->draw_center = p_draw_center;
+ style->color = p_modulate;
+ style->margin[MARGIN_LEFT] = p_topleft.x;
+ style->margin[MARGIN_TOP] = p_topleft.y;
+ style->margin[MARGIN_RIGHT] = p_bottomright.x;
+ style->margin[MARGIN_BOTTOM] = p_bottomright.y;
+ canvas_item->rect_dirty = true;
canvas_item->commands.push_back(style);
}
-void VisualServerRaster::canvas_item_add_primitive(RID p_item,const Vector<Point2>& p_points, const Vector<Color>& p_colors,const Vector<Point2>& p_uvs, RID p_texture,float p_width) {
+void VisualServerRaster::canvas_item_add_primitive(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs, RID p_texture, float p_width) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- CanvasItem::CommandPrimitive * prim = memnew( CanvasItem::CommandPrimitive );
+ CanvasItem::CommandPrimitive *prim = memnew(CanvasItem::CommandPrimitive);
ERR_FAIL_COND(!prim);
- prim->texture=p_texture;
- prim->points=p_points;
- prim->uvs=p_uvs;
- prim->colors=p_colors;
- prim->width=p_width;
- canvas_item->rect_dirty=true;
+ prim->texture = p_texture;
+ prim->points = p_points;
+ prim->uvs = p_uvs;
+ prim->colors = p_colors;
+ prim->width = p_width;
+ canvas_item->rect_dirty = true;
canvas_item->commands.push_back(prim);
}
-void VisualServerRaster::canvas_item_add_polygon(RID p_item, const Vector<Point2>& p_points, const Vector<Color>& p_colors,const Vector<Point2>& p_uvs, RID p_texture) {
+void VisualServerRaster::canvas_item_add_polygon(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs, RID p_texture) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
#ifdef DEBUG_ENABLED
int pointcount = p_points.size();
- ERR_FAIL_COND(pointcount<3);
- int color_size=p_colors.size();
- int uv_size=p_uvs.size();
- ERR_FAIL_COND(color_size!=0 && color_size!=1 && color_size!=pointcount);
- ERR_FAIL_COND(uv_size!=0 && (uv_size!=pointcount || !p_texture.is_valid()));
+ ERR_FAIL_COND(pointcount < 3);
+ int color_size = p_colors.size();
+ int uv_size = p_uvs.size();
+ ERR_FAIL_COND(color_size != 0 && color_size != 1 && color_size != pointcount);
+ ERR_FAIL_COND(uv_size != 0 && (uv_size != pointcount || !p_texture.is_valid()));
#endif
Vector<int> indices = Geometry::triangulate_polygon(p_points);
@@ -3804,52 +3489,51 @@ void VisualServerRaster::canvas_item_add_polygon(RID p_item, const Vector<Point2
ERR_FAIL_V();
}
- CanvasItem::CommandPolygon * polygon = memnew( CanvasItem::CommandPolygon );
+ CanvasItem::CommandPolygon *polygon = memnew(CanvasItem::CommandPolygon);
ERR_FAIL_COND(!polygon);
- polygon->texture=p_texture;
- polygon->points=p_points;
- polygon->uvs=p_uvs;
- polygon->colors=p_colors;
- polygon->indices=indices;
- polygon->count=indices.size();
- canvas_item->rect_dirty=true;
+ polygon->texture = p_texture;
+ polygon->points = p_points;
+ polygon->uvs = p_uvs;
+ polygon->colors = p_colors;
+ polygon->indices = indices;
+ polygon->count = indices.size();
+ canvas_item->rect_dirty = true;
canvas_item->commands.push_back(polygon);
-
}
-void VisualServerRaster::canvas_item_add_triangle_array_ptr(RID p_item, int p_count, const int* p_indices, const Point2* p_points, const Color* p_colors,const Point2* p_uvs, RID p_texture) {
+void VisualServerRaster::canvas_item_add_triangle_array_ptr(RID p_item, int p_count, const int *p_indices, const Point2 *p_points, const Color *p_colors, const Point2 *p_uvs, RID p_texture) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
ERR_FAIL_COND(p_count <= 0);
ERR_FAIL_COND(p_points == NULL);
- CanvasItem::CommandPolygonPtr * polygon = memnew( CanvasItem::CommandPolygonPtr );
+ CanvasItem::CommandPolygonPtr *polygon = memnew(CanvasItem::CommandPolygonPtr);
ERR_FAIL_COND(!polygon);
- polygon->texture=p_texture;
- polygon->points=p_points;
- polygon->uvs=p_uvs;
- polygon->colors=p_colors;
- polygon->indices=p_indices;
+ polygon->texture = p_texture;
+ polygon->points = p_points;
+ polygon->uvs = p_uvs;
+ polygon->colors = p_colors;
+ polygon->indices = p_indices;
polygon->count = p_count * 3;
- canvas_item->rect_dirty=true;
+ canvas_item->rect_dirty = true;
canvas_item->commands.push_back(polygon);
};
-void VisualServerRaster::canvas_item_add_triangle_array(RID p_item, const Vector<int>& p_indices, const Vector<Point2>& p_points, const Vector<Color>& p_colors,const Vector<Point2>& p_uvs, RID p_texture, int p_count) {
+void VisualServerRaster::canvas_item_add_triangle_array(RID p_item, const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs, RID p_texture, int p_count) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
int ps = p_points.size();
- ERR_FAIL_COND(!p_colors.empty() && p_colors.size()!=ps && p_colors.size()!=1);
- ERR_FAIL_COND(!p_uvs.empty() && p_uvs.size()!=ps);
+ ERR_FAIL_COND(!p_colors.empty() && p_colors.size() != ps && p_colors.size() != 1);
+ ERR_FAIL_COND(!p_uvs.empty() && p_uvs.size() != ps);
Vector<int> indices = p_indices;
@@ -3857,51 +3541,49 @@ void VisualServerRaster::canvas_item_add_triangle_array(RID p_item, const Vector
if (indices.empty()) {
- ERR_FAIL_COND( ps % 3 != 0 );
+ ERR_FAIL_COND(ps % 3 != 0);
if (p_count == -1)
count = ps;
} else {
- ERR_FAIL_COND( indices.size() % 3 != 0 );
+ ERR_FAIL_COND(indices.size() % 3 != 0);
if (p_count == -1)
count = indices.size();
}
- CanvasItem::CommandPolygon * polygon = memnew( CanvasItem::CommandPolygon );
+ CanvasItem::CommandPolygon *polygon = memnew(CanvasItem::CommandPolygon);
ERR_FAIL_COND(!polygon);
- polygon->texture=p_texture;
- polygon->points=p_points;
- polygon->uvs=p_uvs;
- polygon->colors=p_colors;
- polygon->indices=indices;
+ polygon->texture = p_texture;
+ polygon->points = p_points;
+ polygon->uvs = p_uvs;
+ polygon->colors = p_colors;
+ polygon->indices = indices;
polygon->count = count;
- canvas_item->rect_dirty=true;
+ canvas_item->rect_dirty = true;
canvas_item->commands.push_back(polygon);
}
-
-void VisualServerRaster::canvas_item_add_set_transform(RID p_item,const Matrix32& p_transform) {
+void VisualServerRaster::canvas_item_add_set_transform(RID p_item, const Matrix32 &p_transform) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- CanvasItem::CommandTransform * tr = memnew( CanvasItem::CommandTransform );
+ CanvasItem::CommandTransform *tr = memnew(CanvasItem::CommandTransform);
ERR_FAIL_COND(!tr);
- tr->xform=p_transform;
+ tr->xform = p_transform;
canvas_item->commands.push_back(tr);
-
}
void VisualServerRaster::canvas_item_add_set_blend_mode(RID p_item, MaterialBlendMode p_blend) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- CanvasItem::CommandBlendMode * bm = memnew( CanvasItem::CommandBlendMode );
+ CanvasItem::CommandBlendMode *bm = memnew(CanvasItem::CommandBlendMode);
ERR_FAIL_COND(!bm);
bm->blend_mode = p_blend;
@@ -3910,66 +3592,62 @@ void VisualServerRaster::canvas_item_add_set_blend_mode(RID p_item, MaterialBlen
void VisualServerRaster::canvas_item_set_z(RID p_item, int p_z) {
- ERR_FAIL_COND(p_z<CANVAS_ITEM_Z_MIN || p_z>CANVAS_ITEM_Z_MAX);
+ ERR_FAIL_COND(p_z < CANVAS_ITEM_Z_MIN || p_z > CANVAS_ITEM_Z_MAX);
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- canvas_item->z=p_z;
-
+ canvas_item->z = p_z;
}
void VisualServerRaster::canvas_item_set_z_as_relative_to_parent(RID p_item, bool p_enable) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- canvas_item->z_relative=p_enable;
-
+ canvas_item->z_relative = p_enable;
}
-void VisualServerRaster::canvas_item_set_copy_to_backbuffer(RID p_item, bool p_enable, const Rect2& p_rect) {
+void VisualServerRaster::canvas_item_set_copy_to_backbuffer(RID p_item, bool p_enable, const Rect2 &p_rect) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- if (bool(canvas_item->copy_back_buffer!=NULL) !=p_enable) {
+ if (bool(canvas_item->copy_back_buffer != NULL) != p_enable) {
if (p_enable) {
- canvas_item->copy_back_buffer = memnew( Rasterizer::CanvasItem::CopyBackBuffer );
+ canvas_item->copy_back_buffer = memnew(Rasterizer::CanvasItem::CopyBackBuffer);
} else {
memdelete(canvas_item->copy_back_buffer);
- canvas_item->copy_back_buffer=NULL;
+ canvas_item->copy_back_buffer = NULL;
}
}
if (p_enable) {
- canvas_item->copy_back_buffer->rect=p_rect;
- canvas_item->copy_back_buffer->full=p_rect==Rect2();
+ canvas_item->copy_back_buffer->rect = p_rect;
+ canvas_item->copy_back_buffer->full = p_rect == Rect2();
}
-
}
void VisualServerRaster::canvas_item_set_use_parent_material(RID p_item, bool p_enable) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- canvas_item->use_parent_material=p_enable;
-
+ canvas_item->use_parent_material = p_enable;
}
void VisualServerRaster::canvas_item_set_material(RID p_item, RID p_material) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
if (canvas_item->material)
canvas_item->material->owners.erase(canvas_item);
- canvas_item->material=NULL;
+ canvas_item->material = NULL;
if (canvas_item_material_owner.owns(p_material)) {
- canvas_item->material=canvas_item_material_owner.get(p_material);
+ canvas_item->material = canvas_item_material_owner.get(p_material);
canvas_item->material->owners.insert(canvas_item);
}
}
@@ -3977,39 +3655,35 @@ void VisualServerRaster::canvas_item_set_material(RID p_item, RID p_material) {
void VisualServerRaster::canvas_item_set_sort_children_by_y(RID p_item, bool p_enable) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- canvas_item->sort_y=p_enable;
+ canvas_item->sort_y = p_enable;
}
-
void VisualServerRaster::canvas_item_add_clip_ignore(RID p_item, bool p_ignore) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
- CanvasItem::CommandClipIgnore * ci = memnew( CanvasItem::CommandClipIgnore);
+ CanvasItem::CommandClipIgnore *ci = memnew(CanvasItem::CommandClipIgnore);
ERR_FAIL_COND(!ci);
- ci->ignore=p_ignore;
+ ci->ignore = p_ignore;
canvas_item->commands.push_back(ci);
-
}
void VisualServerRaster::canvas_item_clear(RID p_item) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
-
canvas_item->clear();
-
}
void VisualServerRaster::canvas_item_raise(RID p_item) {
VS_CHANGED;
- CanvasItem *canvas_item = canvas_item_owner.get( p_item );
+ CanvasItem *canvas_item = canvas_item_owner.get(p_item);
ERR_FAIL_COND(!canvas_item);
if (canvas_item->parent.is_valid()) {
@@ -4018,7 +3692,7 @@ void VisualServerRaster::canvas_item_raise(RID p_item) {
Canvas *canvas = canvas_owner.get(canvas_item->parent);
int idx = canvas->find_item(canvas_item);
- ERR_FAIL_COND(idx<0);
+ ERR_FAIL_COND(idx < 0);
Canvas::ChildItem ci = canvas->child_items[idx];
canvas->child_items.remove(idx);
canvas->child_items.push_back(ci);
@@ -4027,24 +3701,22 @@ void VisualServerRaster::canvas_item_raise(RID p_item) {
CanvasItem *item_owner = canvas_item_owner.get(canvas_item->parent);
int idx = item_owner->child_items.find(canvas_item);
- ERR_FAIL_COND(idx<0);
+ ERR_FAIL_COND(idx < 0);
item_owner->child_items.remove(idx);
item_owner->child_items.push_back(canvas_item);
-
}
}
-
}
/***** CANVAS LIGHT *******/
RID VisualServerRaster::canvas_light_create() {
- Rasterizer::CanvasLight *clight = memnew( Rasterizer::CanvasLight );
+ Rasterizer::CanvasLight *clight = memnew(Rasterizer::CanvasLight);
return canvas_light_owner.make_rid(clight);
}
-void VisualServerRaster::canvas_light_attach_to_canvas(RID p_light,RID p_canvas){
+void VisualServerRaster::canvas_light_attach_to_canvas(RID p_light, RID p_canvas) {
Rasterizer::CanvasLight *clight = canvas_light_owner.get(p_light);
ERR_FAIL_COND(!clight);
@@ -4056,184 +3728,156 @@ void VisualServerRaster::canvas_light_attach_to_canvas(RID p_light,RID p_canvas)
}
if (!canvas_owner.owns(p_canvas))
- p_canvas=RID();
- clight->canvas=p_canvas;
+ p_canvas = RID();
+ clight->canvas = p_canvas;
if (clight->canvas.is_valid()) {
Canvas *canvas = canvas_owner.get(clight->canvas);
canvas->lights.insert(clight);
}
-
-
-
}
-void VisualServerRaster::canvas_light_set_enabled(RID p_light, bool p_enabled){
+void VisualServerRaster::canvas_light_set_enabled(RID p_light, bool p_enabled) {
Rasterizer::CanvasLight *clight = canvas_light_owner.get(p_light);
ERR_FAIL_COND(!clight);
- clight->enabled=p_enabled;
-
+ clight->enabled = p_enabled;
}
-void VisualServerRaster::canvas_light_set_transform(RID p_light, const Matrix32& p_transform){
+void VisualServerRaster::canvas_light_set_transform(RID p_light, const Matrix32 &p_transform) {
Rasterizer::CanvasLight *clight = canvas_light_owner.get(p_light);
ERR_FAIL_COND(!clight);
- clight->xform=p_transform;
-
+ clight->xform = p_transform;
}
void VisualServerRaster::canvas_light_set_scale(RID p_light, float p_scale) {
Rasterizer::CanvasLight *clight = canvas_light_owner.get(p_light);
ERR_FAIL_COND(!clight);
- clight->scale=p_scale;
-
+ clight->scale = p_scale;
}
-
-void VisualServerRaster::canvas_light_set_texture(RID p_light, RID p_texture){
+void VisualServerRaster::canvas_light_set_texture(RID p_light, RID p_texture) {
Rasterizer::CanvasLight *clight = canvas_light_owner.get(p_light);
ERR_FAIL_COND(!clight);
- clight->texture=p_texture;
-
+ clight->texture = p_texture;
}
-void VisualServerRaster::canvas_light_set_texture_offset(RID p_light, const Vector2& p_offset){
+void VisualServerRaster::canvas_light_set_texture_offset(RID p_light, const Vector2 &p_offset) {
Rasterizer::CanvasLight *clight = canvas_light_owner.get(p_light);
ERR_FAIL_COND(!clight);
- clight->texture_offset=p_offset;
-
+ clight->texture_offset = p_offset;
}
-void VisualServerRaster::canvas_light_set_color(RID p_light, const Color& p_color){
+void VisualServerRaster::canvas_light_set_color(RID p_light, const Color &p_color) {
Rasterizer::CanvasLight *clight = canvas_light_owner.get(p_light);
ERR_FAIL_COND(!clight);
- clight->color=p_color;
-
-
+ clight->color = p_color;
}
-void VisualServerRaster::canvas_light_set_height(RID p_light, float p_height){
+void VisualServerRaster::canvas_light_set_height(RID p_light, float p_height) {
Rasterizer::CanvasLight *clight = canvas_light_owner.get(p_light);
ERR_FAIL_COND(!clight);
- clight->height=p_height;
-
+ clight->height = p_height;
}
-void VisualServerRaster::canvas_light_set_energy(RID p_light, float p_energy){
+void VisualServerRaster::canvas_light_set_energy(RID p_light, float p_energy) {
Rasterizer::CanvasLight *clight = canvas_light_owner.get(p_light);
ERR_FAIL_COND(!clight);
- clight->energy=p_energy;
-
+ clight->energy = p_energy;
}
-void VisualServerRaster::canvas_light_set_z_range(RID p_light, int p_min_z,int p_max_z){
+void VisualServerRaster::canvas_light_set_z_range(RID p_light, int p_min_z, int p_max_z) {
Rasterizer::CanvasLight *clight = canvas_light_owner.get(p_light);
ERR_FAIL_COND(!clight);
- clight->z_min=p_min_z;
- clight->z_max=p_max_z;
-
+ clight->z_min = p_min_z;
+ clight->z_max = p_max_z;
}
-void VisualServerRaster::canvas_light_set_layer_range(RID p_light, int p_min_layer,int p_max_layer) {
+void VisualServerRaster::canvas_light_set_layer_range(RID p_light, int p_min_layer, int p_max_layer) {
Rasterizer::CanvasLight *clight = canvas_light_owner.get(p_light);
ERR_FAIL_COND(!clight);
- clight->layer_min=p_min_layer;
- clight->layer_max=p_max_layer;
-
+ clight->layer_min = p_min_layer;
+ clight->layer_max = p_max_layer;
}
-void VisualServerRaster::canvas_light_set_item_mask(RID p_light, int p_mask){
+void VisualServerRaster::canvas_light_set_item_mask(RID p_light, int p_mask) {
Rasterizer::CanvasLight *clight = canvas_light_owner.get(p_light);
ERR_FAIL_COND(!clight);
- clight->item_mask=p_mask;
-
+ clight->item_mask = p_mask;
}
-void VisualServerRaster::canvas_light_set_item_shadow_mask(RID p_light, int p_mask){
+void VisualServerRaster::canvas_light_set_item_shadow_mask(RID p_light, int p_mask) {
Rasterizer::CanvasLight *clight = canvas_light_owner.get(p_light);
ERR_FAIL_COND(!clight);
- clight->item_shadow_mask=p_mask;
-
+ clight->item_shadow_mask = p_mask;
}
-
void VisualServerRaster::canvas_light_set_mode(RID p_light, CanvasLightMode p_mode) {
-
Rasterizer::CanvasLight *clight = canvas_light_owner.get(p_light);
ERR_FAIL_COND(!clight);
- clight->mode=p_mode;
-
+ clight->mode = p_mode;
}
-void VisualServerRaster::canvas_light_set_shadow_enabled(RID p_light, bool p_enabled){
+void VisualServerRaster::canvas_light_set_shadow_enabled(RID p_light, bool p_enabled) {
Rasterizer::CanvasLight *clight = canvas_light_owner.get(p_light);
ERR_FAIL_COND(!clight);
- if (clight->shadow_buffer.is_valid()==p_enabled)
+ if (clight->shadow_buffer.is_valid() == p_enabled)
return;
if (p_enabled) {
- clight->shadow_buffer=rasterizer->canvas_light_shadow_buffer_create(clight->shadow_buffer_size);
+ clight->shadow_buffer = rasterizer->canvas_light_shadow_buffer_create(clight->shadow_buffer_size);
} else {
rasterizer->free(clight->shadow_buffer);
- clight->shadow_buffer=RID();
-
+ clight->shadow_buffer = RID();
}
-
}
-void VisualServerRaster::canvas_light_set_shadow_buffer_size(RID p_light, int p_size){
+void VisualServerRaster::canvas_light_set_shadow_buffer_size(RID p_light, int p_size) {
Rasterizer::CanvasLight *clight = canvas_light_owner.get(p_light);
ERR_FAIL_COND(!clight);
- ERR_FAIL_COND(p_size<32 || p_size>16384);
-
- clight->shadow_buffer_size=nearest_power_of_2(p_size);
+ ERR_FAIL_COND(p_size < 32 || p_size > 16384);
+ clight->shadow_buffer_size = nearest_power_of_2(p_size);
if (clight->shadow_buffer.is_valid()) {
rasterizer->free(clight->shadow_buffer);
- clight->shadow_buffer=rasterizer->canvas_light_shadow_buffer_create(clight->shadow_buffer_size);
+ clight->shadow_buffer = rasterizer->canvas_light_shadow_buffer_create(clight->shadow_buffer_size);
}
-
}
void VisualServerRaster::canvas_light_set_shadow_esm_multiplier(RID p_light, float p_multiplier) {
Rasterizer::CanvasLight *clight = canvas_light_owner.get(p_light);
ERR_FAIL_COND(!clight);
- clight->shadow_esm_mult=p_multiplier;
-
+ clight->shadow_esm_mult = p_multiplier;
}
-void VisualServerRaster::canvas_light_set_shadow_color(RID p_light, const Color& p_color) {
+void VisualServerRaster::canvas_light_set_shadow_color(RID p_light, const Color &p_color) {
Rasterizer::CanvasLight *clight = canvas_light_owner.get(p_light);
ERR_FAIL_COND(!clight);
- clight->shadow_color=p_color;
-
+ clight->shadow_color = p_color;
}
-
/****** CANVAS LIGHT OCCLUDER ******/
RID VisualServerRaster::canvas_light_occluder_create() {
- Rasterizer::CanvasLightOccluderInstance *occluder = memnew( Rasterizer::CanvasLightOccluderInstance );
-
- return canvas_light_occluder_owner.make_rid( occluder );
+ Rasterizer::CanvasLightOccluderInstance *occluder = memnew(Rasterizer::CanvasLightOccluderInstance);
+ return canvas_light_occluder_owner.make_rid(occluder);
}
-void VisualServerRaster::canvas_light_occluder_attach_to_canvas(RID p_occluder,RID p_canvas) {
+void VisualServerRaster::canvas_light_occluder_attach_to_canvas(RID p_occluder, RID p_canvas) {
Rasterizer::CanvasLightOccluderInstance *occluder = canvas_light_occluder_owner.get(p_occluder);
ERR_FAIL_COND(!occluder);
@@ -4245,9 +3889,9 @@ void VisualServerRaster::canvas_light_occluder_attach_to_canvas(RID p_occluder,R
}
if (!canvas_owner.owns(p_canvas))
- p_canvas=RID();
+ p_canvas = RID();
- occluder->canvas=p_canvas;
+ occluder->canvas = p_canvas;
if (occluder->canvas.is_valid()) {
@@ -4256,16 +3900,15 @@ void VisualServerRaster::canvas_light_occluder_attach_to_canvas(RID p_occluder,R
}
}
-void VisualServerRaster::canvas_light_occluder_set_enabled(RID p_occluder,bool p_enabled){
+void VisualServerRaster::canvas_light_occluder_set_enabled(RID p_occluder, bool p_enabled) {
Rasterizer::CanvasLightOccluderInstance *occluder = canvas_light_occluder_owner.get(p_occluder);
ERR_FAIL_COND(!occluder);
- occluder->enabled=p_enabled;
-
+ occluder->enabled = p_enabled;
}
-void VisualServerRaster::canvas_light_occluder_set_polygon(RID p_occluder,RID p_polygon) {
+void VisualServerRaster::canvas_light_occluder_set_polygon(RID p_occluder, RID p_polygon) {
Rasterizer::CanvasLightOccluderInstance *occluder = canvas_light_occluder_owner.get(p_occluder);
ERR_FAIL_COND(!occluder);
@@ -4277,152 +3920,138 @@ void VisualServerRaster::canvas_light_occluder_set_polygon(RID p_occluder,RID p_
}
}
- occluder->polygon=p_polygon;
- occluder->polygon_buffer=RID();
+ occluder->polygon = p_polygon;
+ occluder->polygon_buffer = RID();
if (occluder->polygon.is_valid()) {
CanvasLightOccluderPolygon *occluder_poly = canvas_light_occluder_polygon_owner.get(p_polygon);
if (!occluder_poly)
- occluder->polygon=RID();
+ occluder->polygon = RID();
ERR_FAIL_COND(!occluder_poly);
occluder_poly->owners.insert(occluder);
- occluder->polygon_buffer=occluder_poly->occluder;
- occluder->aabb_cache=occluder_poly->aabb;
- occluder->cull_cache=occluder_poly->cull_mode;
+ occluder->polygon_buffer = occluder_poly->occluder;
+ occluder->aabb_cache = occluder_poly->aabb;
+ occluder->cull_cache = occluder_poly->cull_mode;
}
-
}
-
-
-
-void VisualServerRaster::canvas_light_occluder_set_transform(RID p_occluder,const Matrix32& p_xform) {
+void VisualServerRaster::canvas_light_occluder_set_transform(RID p_occluder, const Matrix32 &p_xform) {
Rasterizer::CanvasLightOccluderInstance *occluder = canvas_light_occluder_owner.get(p_occluder);
ERR_FAIL_COND(!occluder);
- occluder->xform=p_xform;
-
+ occluder->xform = p_xform;
}
-void VisualServerRaster::canvas_light_occluder_set_light_mask(RID p_occluder,int p_mask) {
+void VisualServerRaster::canvas_light_occluder_set_light_mask(RID p_occluder, int p_mask) {
Rasterizer::CanvasLightOccluderInstance *occluder = canvas_light_occluder_owner.get(p_occluder);
ERR_FAIL_COND(!occluder);
- occluder->light_mask=p_mask;
-
+ occluder->light_mask = p_mask;
}
-
RID VisualServerRaster::canvas_occluder_polygon_create() {
- CanvasLightOccluderPolygon * occluder_poly = memnew( CanvasLightOccluderPolygon );
- occluder_poly->occluder=rasterizer->canvas_light_occluder_create();
+ CanvasLightOccluderPolygon *occluder_poly = memnew(CanvasLightOccluderPolygon);
+ occluder_poly->occluder = rasterizer->canvas_light_occluder_create();
return canvas_light_occluder_polygon_owner.make_rid(occluder_poly);
-
}
-void VisualServerRaster::canvas_occluder_polygon_set_shape(RID p_occluder_polygon, const DVector<Vector2>& p_shape, bool p_close){
+void VisualServerRaster::canvas_occluder_polygon_set_shape(RID p_occluder_polygon, const DVector<Vector2> &p_shape, bool p_close) {
- if (p_shape.size()<3) {
- canvas_occluder_polygon_set_shape_as_lines(p_occluder_polygon,p_shape);
+ if (p_shape.size() < 3) {
+ canvas_occluder_polygon_set_shape_as_lines(p_occluder_polygon, p_shape);
return;
}
DVector<Vector2> lines;
- int lc = p_shape.size()*2;
+ int lc = p_shape.size() * 2;
- lines.resize(lc-(p_close?0:2));
+ lines.resize(lc - (p_close ? 0 : 2));
{
DVector<Vector2>::Write w = lines.write();
DVector<Vector2>::Read r = p_shape.read();
- int max=lc/2;
+ int max = lc / 2;
if (!p_close) {
max--;
}
- for(int i=0;i<max;i++) {
+ for (int i = 0; i < max; i++) {
Vector2 a = r[i];
- Vector2 b = r[(i+1)%(lc/2)];
- w[i*2+0]=a;
- w[i*2+1]=b;
+ Vector2 b = r[(i + 1) % (lc / 2)];
+ w[i * 2 + 0] = a;
+ w[i * 2 + 1] = b;
}
-
}
- canvas_occluder_polygon_set_shape_as_lines(p_occluder_polygon,lines);
+ canvas_occluder_polygon_set_shape_as_lines(p_occluder_polygon, lines);
}
-void VisualServerRaster::canvas_occluder_polygon_set_shape_as_lines(RID p_occluder_polygon,const DVector<Vector2>& p_shape) {
+void VisualServerRaster::canvas_occluder_polygon_set_shape_as_lines(RID p_occluder_polygon, const DVector<Vector2> &p_shape) {
- CanvasLightOccluderPolygon * occluder_poly = canvas_light_occluder_polygon_owner.get(p_occluder_polygon);
+ CanvasLightOccluderPolygon *occluder_poly = canvas_light_occluder_polygon_owner.get(p_occluder_polygon);
ERR_FAIL_COND(!occluder_poly);
- ERR_FAIL_COND(p_shape.size()&1);
+ ERR_FAIL_COND(p_shape.size() & 1);
int lc = p_shape.size();
- occluder_poly->aabb=Rect2();
+ occluder_poly->aabb = Rect2();
{
DVector<Vector2>::Read r = p_shape.read();
- for(int i=0;i<lc;i++) {
- if (i==0)
- occluder_poly->aabb.pos=r[i];
+ for (int i = 0; i < lc; i++) {
+ if (i == 0)
+ occluder_poly->aabb.pos = r[i];
else
occluder_poly->aabb.expand_to(r[i]);
}
}
- rasterizer->canvas_light_occluder_set_polylines(occluder_poly->occluder,p_shape);
- for( Set<Rasterizer::CanvasLightOccluderInstance*>::Element *E=occluder_poly->owners.front();E;E=E->next()) {
- E->get()->aabb_cache=occluder_poly->aabb;
+ rasterizer->canvas_light_occluder_set_polylines(occluder_poly->occluder, p_shape);
+ for (Set<Rasterizer::CanvasLightOccluderInstance *>::Element *E = occluder_poly->owners.front(); E; E = E->next()) {
+ E->get()->aabb_cache = occluder_poly->aabb;
}
}
-void VisualServerRaster::canvas_occluder_polygon_set_cull_mode(RID p_occluder_polygon,CanvasOccluderPolygonCullMode p_mode) {
+void VisualServerRaster::canvas_occluder_polygon_set_cull_mode(RID p_occluder_polygon, CanvasOccluderPolygonCullMode p_mode) {
- CanvasLightOccluderPolygon * occluder_poly = canvas_light_occluder_polygon_owner.get(p_occluder_polygon);
+ CanvasLightOccluderPolygon *occluder_poly = canvas_light_occluder_polygon_owner.get(p_occluder_polygon);
ERR_FAIL_COND(!occluder_poly);
- occluder_poly->cull_mode=p_mode;
- for( Set<Rasterizer::CanvasLightOccluderInstance*>::Element *E=occluder_poly->owners.front();E;E=E->next()) {
- E->get()->cull_cache=p_mode;
+ occluder_poly->cull_mode = p_mode;
+ for (Set<Rasterizer::CanvasLightOccluderInstance *>::Element *E = occluder_poly->owners.front(); E; E = E->next()) {
+ E->get()->cull_cache = p_mode;
}
-
}
RID VisualServerRaster::canvas_item_material_create() {
- Rasterizer::CanvasItemMaterial *material = memnew( Rasterizer::CanvasItemMaterial );
+ Rasterizer::CanvasItemMaterial *material = memnew(Rasterizer::CanvasItemMaterial);
return canvas_item_material_owner.make_rid(material);
-
}
-void VisualServerRaster::canvas_item_material_set_shader(RID p_material, RID p_shader){
+void VisualServerRaster::canvas_item_material_set_shader(RID p_material, RID p_shader) {
VS_CHANGED;
- Rasterizer::CanvasItemMaterial *material = canvas_item_material_owner.get( p_material );
+ Rasterizer::CanvasItemMaterial *material = canvas_item_material_owner.get(p_material);
ERR_FAIL_COND(!material);
- material->shader=p_shader;
-
+ material->shader = p_shader;
}
-void VisualServerRaster::canvas_item_material_set_shader_param(RID p_material, const StringName& p_param, const Variant& p_value){
+void VisualServerRaster::canvas_item_material_set_shader_param(RID p_material, const StringName &p_param, const Variant &p_value) {
VS_CHANGED;
- Rasterizer::CanvasItemMaterial *material = canvas_item_material_owner.get( p_material );
+ Rasterizer::CanvasItemMaterial *material = canvas_item_material_owner.get(p_material);
ERR_FAIL_COND(!material);
- if (p_value.get_type()==Variant::NIL)
+ if (p_value.get_type() == Variant::NIL)
material->shader_param.erase(p_param);
else
- material->shader_param[p_param]=p_value;
-
-
+ material->shader_param[p_param] = p_value;
}
-Variant VisualServerRaster::canvas_item_material_get_shader_param(RID p_material, const StringName& p_param) const{
- Rasterizer::CanvasItemMaterial *material = canvas_item_material_owner.get( p_material );
- ERR_FAIL_COND_V(!material,Variant());
+Variant VisualServerRaster::canvas_item_material_get_shader_param(RID p_material, const StringName &p_param) const {
+ Rasterizer::CanvasItemMaterial *material = canvas_item_material_owner.get(p_material);
+ ERR_FAIL_COND_V(!material, Variant());
if (!material->shader_param.has(p_param)) {
- ERR_FAIL_COND_V(!material->shader.is_valid(),Variant());
- return rasterizer->shader_get_default_param(material->shader,p_param);
+ ERR_FAIL_COND_V(!material->shader.is_valid(), Variant());
+ return rasterizer->shader_get_default_param(material->shader, p_param);
}
return material->shader_param[p_param];
@@ -4431,16 +4060,13 @@ Variant VisualServerRaster::canvas_item_material_get_shader_param(RID p_material
void VisualServerRaster::canvas_item_material_set_shading_mode(RID p_material, CanvasItemShadingMode p_mode) {
VS_CHANGED;
- Rasterizer::CanvasItemMaterial *material = canvas_item_material_owner.get( p_material );
+ Rasterizer::CanvasItemMaterial *material = canvas_item_material_owner.get(p_material);
ERR_FAIL_COND(!material);
- material->shading_mode=p_mode;
-
+ material->shading_mode = p_mode;
}
-
/******** CANVAS *********/
-
void VisualServerRaster::cursor_set_rotation(float p_rotation, int p_cursor) {
VS_CHANGED;
ERR_FAIL_INDEX(p_cursor, MAX_CURSORS);
@@ -4464,100 +4090,95 @@ void VisualServerRaster::cursor_set_visible(bool p_visible, int p_cursor) {
cursors[p_cursor].visible = p_visible;
};
-void VisualServerRaster::cursor_set_pos(const Point2& p_pos, int p_cursor) {
+void VisualServerRaster::cursor_set_pos(const Point2 &p_pos, int p_cursor) {
ERR_FAIL_INDEX(p_cursor, MAX_CURSORS);
- if (cursors[p_cursor].pos==p_pos)
+ if (cursors[p_cursor].pos == p_pos)
return;
VS_CHANGED;
cursors[p_cursor].pos = p_pos;
};
-
void VisualServerRaster::black_bars_set_margins(int p_left, int p_top, int p_right, int p_bottom) {
- black_margin[MARGIN_LEFT]=p_left;
- black_margin[MARGIN_TOP]=p_top;
- black_margin[MARGIN_RIGHT]=p_right;
- black_margin[MARGIN_BOTTOM]=p_bottom;
+ black_margin[MARGIN_LEFT] = p_left;
+ black_margin[MARGIN_TOP] = p_top;
+ black_margin[MARGIN_RIGHT] = p_right;
+ black_margin[MARGIN_BOTTOM] = p_bottom;
}
void VisualServerRaster::black_bars_set_images(RID p_left, RID p_top, RID p_right, RID p_bottom) {
- black_image[MARGIN_LEFT]=p_left;
- black_image[MARGIN_TOP]=p_top;
- black_image[MARGIN_RIGHT]=p_right;
- black_image[MARGIN_BOTTOM]=p_bottom;
+ black_image[MARGIN_LEFT] = p_left;
+ black_image[MARGIN_TOP] = p_top;
+ black_image[MARGIN_RIGHT] = p_right;
+ black_image[MARGIN_BOTTOM] = p_bottom;
}
-void VisualServerRaster::_free_attached_instances(RID p_rid,bool p_free_scenario) {
+void VisualServerRaster::_free_attached_instances(RID p_rid, bool p_free_scenario) {
- Map< RID, Set<RID> >::Element * E = instance_dependency_map.find( p_rid );
+ Map<RID, Set<RID> >::Element *E = instance_dependency_map.find(p_rid);
if (E) {
// has instances
- while( E->get().size() ) {
+ while (E->get().size()) {
// erase all attached instances
if (p_free_scenario)
- instance_set_scenario( E->get().front()->get(), RID() );
+ instance_set_scenario(E->get().front()->get(), RID());
else
- instance_set_base( E->get().front()->get(), RID() );
-
+ instance_set_base(E->get().front()->get(), RID());
}
}
instance_dependency_map.erase(p_rid);
-
}
void VisualServerRaster::custom_shade_model_set_shader(int p_model, RID p_shader) {
VS_CHANGED;
-// rasterizer->custom_shade_model_set_shader(p_model,p_shader);
+ // rasterizer->custom_shade_model_set_shader(p_model,p_shader);
}
RID VisualServerRaster::custom_shade_model_get_shader(int p_model) const {
//return rasterizer->custom_shade_model_get_shader(p_model);
return RID();
-
}
-void VisualServerRaster::custom_shade_model_set_name(int p_model, const String& p_name) {
+void VisualServerRaster::custom_shade_model_set_name(int p_model, const String &p_name) {
//rasterizer->custom_shade_model_set_name(p_model,p_name);
-
}
String VisualServerRaster::custom_shade_model_get_name(int p_model) const {
//return rasterizer->custom_shade_model_get_name(p_model);
return "";
}
-void VisualServerRaster::custom_shade_model_set_param_info(int p_model, const List<PropertyInfo>& p_info) {
+void VisualServerRaster::custom_shade_model_set_param_info(int p_model, const List<PropertyInfo> &p_info) {
VS_CHANGED;
//rasterizer->custom_shade_model_set_param_info(p_model,p_info);
}
-void VisualServerRaster::custom_shade_model_get_param_info(int p_model, List<PropertyInfo>* p_info) const {
+void VisualServerRaster::custom_shade_model_get_param_info(int p_model, List<PropertyInfo> *p_info) const {
//rasterizer->custom_shade_model_get_param_info(p_model,p_info);
}
-void VisualServerRaster::free( RID p_rid ) {
+void VisualServerRaster::free(RID p_rid) {
VS_CHANGED;
- if (rasterizer->is_texture(p_rid) || rasterizer->is_material(p_rid) || rasterizer->is_shader(p_rid) || rasterizer->is_environment(p_rid)) {
+ if (rasterizer->is_texture(p_rid) || rasterizer->is_material(p_rid) || rasterizer->is_shader(p_rid) || rasterizer->is_environment(p_rid)) {
rasterizer->free(p_rid);
} else if (rasterizer->is_skeleton(p_rid)) {
- Map< RID, Set<Instance*> >::Element *E=skeleton_dependency_map.find(p_rid);
+ Map<RID, Set<Instance *> >::Element *E = skeleton_dependency_map.find(p_rid);
if (E) {
//detach skeletons
- for (Set<Instance*>::Element *F=E->get().front();F;F=F->next()) {
+ for (Set<Instance *>::Element *F = E->get().front(); F; F = F->next()) {
- F->get()->data.skeleton=RID();
+ F->get()->data.skeleton = RID();
}
skeleton_dependency_map.erase(E);
}
@@ -4576,7 +4197,6 @@ void VisualServerRaster::free( RID p_rid ) {
room_owner.free(p_rid);
memdelete(room);
-
} else if (portal_owner.owns(p_rid)) {
_free_attached_instances(p_rid);
@@ -4614,16 +4234,16 @@ void VisualServerRaster::free( RID p_rid ) {
Camera *camera = camera_owner.get(p_rid);
ERR_FAIL_COND(!camera);
- camera_owner.free( p_rid );
+ camera_owner.free(p_rid);
memdelete(camera);
} else if (viewport_owner.owns(p_rid)) {
// delete the viewport
- Viewport *viewport = viewport_owner.get( p_rid );
+ Viewport *viewport = viewport_owner.get(p_rid);
ERR_FAIL_COND(!viewport);
-// Viewport *parent=NULL;
+ // Viewport *parent=NULL;
rasterizer->free(viewport->viewport_data);
if (viewport->render_target.is_valid()) {
@@ -4636,7 +4256,7 @@ void VisualServerRaster::free( RID p_rid ) {
if (screen_viewports.has(p_rid))
screen_viewports.erase(p_rid);
- while(viewport->canvas_map.size()) {
+ while (viewport->canvas_map.size()) {
Canvas *c = viewport->canvas_map.front()->get().canvas;
c->viewports.erase(p_rid);
@@ -4644,7 +4264,6 @@ void VisualServerRaster::free( RID p_rid ) {
viewport->canvas_map.erase(viewport->canvas_map.front());
}
-
viewport_owner.free(p_rid);
memdelete(viewport);
@@ -4656,14 +4275,14 @@ void VisualServerRaster::free( RID p_rid ) {
Instance *instance = instance_owner.get(p_rid);
ERR_FAIL_COND(!instance);
- instance_set_room(p_rid,RID());
- instance_set_scenario(p_rid,RID());
- instance_geometry_set_baked_light(p_rid,RID());
- instance_geometry_set_baked_light_sampler(p_rid,RID());
- instance_set_base(p_rid,RID());
+ instance_set_room(p_rid, RID());
+ instance_set_scenario(p_rid, RID());
+ instance_geometry_set_baked_light(p_rid, RID());
+ instance_geometry_set_baked_light_sampler(p_rid, RID());
+ instance_set_base(p_rid, RID());
if (instance->data.skeleton.is_valid())
- instance_attach_skeleton(p_rid,RID());
+ instance_attach_skeleton(p_rid, RID());
instance_owner.free(p_rid);
memdelete(instance);
@@ -4673,36 +4292,36 @@ void VisualServerRaster::free( RID p_rid ) {
Canvas *canvas = canvas_owner.get(p_rid);
ERR_FAIL_COND(!canvas);
- while(canvas->viewports.size()) {
+ while (canvas->viewports.size()) {
Viewport *vp = viewport_owner.get(canvas->viewports.front()->get());
ERR_FAIL_COND(!vp);
- Map<RID,Viewport::CanvasData>::Element *E=vp->canvas_map.find(p_rid);
+ Map<RID, Viewport::CanvasData>::Element *E = vp->canvas_map.find(p_rid);
ERR_FAIL_COND(!E);
vp->canvas_map.erase(p_rid);
- canvas->viewports.erase( canvas->viewports.front() );
+ canvas->viewports.erase(canvas->viewports.front());
}
- for (int i=0;i<canvas->child_items.size();i++) {
+ for (int i = 0; i < canvas->child_items.size(); i++) {
- canvas->child_items[i].item->parent=RID();
+ canvas->child_items[i].item->parent = RID();
}
- for (Set<Rasterizer::CanvasLight*>::Element *E=canvas->lights.front();E;E=E->next()) {
+ for (Set<Rasterizer::CanvasLight *>::Element *E = canvas->lights.front(); E; E = E->next()) {
- E->get()->canvas=RID();
+ E->get()->canvas = RID();
}
- for (Set<Rasterizer::CanvasLightOccluderInstance*>::Element *E=canvas->occluders.front();E;E=E->next()) {
+ for (Set<Rasterizer::CanvasLightOccluderInstance *>::Element *E = canvas->occluders.front(); E; E = E->next()) {
- E->get()->canvas=RID();
+ E->get()->canvas = RID();
}
- canvas_owner.free( p_rid );
+ canvas_owner.free(p_rid);
- memdelete( canvas );
+ memdelete(canvas);
} else if (canvas_item_owner.owns(p_rid)) {
@@ -4719,30 +4338,29 @@ void VisualServerRaster::free( RID p_rid ) {
CanvasItem *item_owner = canvas_item_owner.get(canvas_item->parent);
item_owner->child_items.erase(canvas_item);
-
}
}
- for (int i=0;i<canvas_item->child_items.size();i++) {
+ for (int i = 0; i < canvas_item->child_items.size(); i++) {
- canvas_item->child_items[i]->parent=RID();
+ canvas_item->child_items[i]->parent = RID();
}
if (canvas_item->material) {
canvas_item->material->owners.erase(canvas_item);
}
- canvas_item_owner.free( p_rid );
+ canvas_item_owner.free(p_rid);
- memdelete( canvas_item );
+ memdelete(canvas_item);
} else if (canvas_item_material_owner.owns(p_rid)) {
Rasterizer::CanvasItemMaterial *material = canvas_item_material_owner.get(p_rid);
ERR_FAIL_COND(!material);
- for(Set<Rasterizer::CanvasItem*>::Element *E=material->owners.front();E;E=E->next()) {
+ for (Set<Rasterizer::CanvasItem *>::Element *E = material->owners.front(); E; E = E->next()) {
- E->get()->material=NULL;
+ E->get()->material = NULL;
}
canvas_item_material_owner.free(p_rid);
@@ -4754,7 +4372,7 @@ void VisualServerRaster::free( RID p_rid ) {
ERR_FAIL_COND(!canvas_light);
if (canvas_light->canvas.is_valid()) {
- Canvas* canvas = canvas_owner.get(canvas_light->canvas);
+ Canvas *canvas = canvas_owner.get(canvas_light->canvas);
if (canvas)
canvas->lights.erase(canvas_light);
}
@@ -4762,8 +4380,8 @@ void VisualServerRaster::free( RID p_rid ) {
if (canvas_light->shadow_buffer.is_valid())
rasterizer->free(canvas_light->shadow_buffer);
- canvas_light_owner.free( p_rid );
- memdelete( canvas_light );
+ canvas_light_owner.free(p_rid);
+ memdelete(canvas_light);
} else if (canvas_light_occluder_owner.owns(p_rid)) {
@@ -4776,17 +4394,15 @@ void VisualServerRaster::free( RID p_rid ) {
if (occluder_poly) {
occluder_poly->owners.erase(occluder);
}
-
}
if (occluder->canvas.is_valid() && canvas_owner.owns(occluder->canvas)) {
Canvas *canvas = canvas_owner.get(occluder->canvas);
canvas->occluders.erase(occluder);
-
}
- canvas_light_occluder_owner.free( p_rid );
+ canvas_light_occluder_owner.free(p_rid);
memdelete(occluder);
} else if (canvas_light_occluder_polygon_owner.owns(p_rid)) {
@@ -4795,22 +4411,22 @@ void VisualServerRaster::free( RID p_rid ) {
ERR_FAIL_COND(!occluder_poly);
rasterizer->free(occluder_poly->occluder);
- while(occluder_poly->owners.size()) {
+ while (occluder_poly->owners.size()) {
- occluder_poly->owners.front()->get()->polygon=RID();
- occluder_poly->owners.erase( occluder_poly->owners.front() );
+ occluder_poly->owners.front()->get()->polygon = RID();
+ occluder_poly->owners.erase(occluder_poly->owners.front());
}
- canvas_light_occluder_polygon_owner.free( p_rid );
+ canvas_light_occluder_polygon_owner.free(p_rid);
memdelete(occluder_poly);
} else if (scenario_owner.owns(p_rid)) {
- Scenario *scenario=scenario_owner.get(p_rid);
+ Scenario *scenario = scenario_owner.get(p_rid);
ERR_FAIL_COND(!scenario);
_update_instances(); // be sure
- _free_attached_instances(p_rid,true);
+ _free_attached_instances(p_rid, true);
//rasterizer->free( scenario->environment );
scenario_owner.free(p_rid);
@@ -4820,28 +4436,24 @@ void VisualServerRaster::free( RID p_rid ) {
ERR_FAIL();
}
-
}
-
-
void VisualServerRaster::_instance_draw(Instance *p_instance) {
if (p_instance->light_cache_dirty) {
- int l=0;
+ int l = 0;
//add positional lights
- InstanceSet::Element *LE=p_instance->lights.front();
+ InstanceSet::Element *LE = p_instance->lights.front();
p_instance->data.light_instances.resize(p_instance->lights.size());
- while(LE) {
+ while (LE) {
- p_instance->data.light_instances[l++]=LE->get()->light_info->instance;
- LE=LE->next();
+ p_instance->data.light_instances[l++] = LE->get()->light_info->instance;
+ LE = LE->next();
}
- p_instance->light_cache_dirty=false;
+ p_instance->light_cache_dirty = false;
}
-
- switch(p_instance->base_type) {
+ switch (p_instance->base_type) {
case INSTANCE_MESH: {
rasterizer->add_mesh(p_instance->base_rid, &p_instance->data);
@@ -4859,27 +4471,25 @@ void VisualServerRaster::_instance_draw(Instance *p_instance) {
}
}
-
-Vector<Vector3> VisualServerRaster::_camera_generate_endpoints(Instance *p_light,Camera *p_camera,float p_range_min, float p_range_max) {
+Vector<Vector3> VisualServerRaster::_camera_generate_endpoints(Instance *p_light, Camera *p_camera, float p_range_min, float p_range_max) {
// setup a camera matrix for that range!
CameraMatrix camera_matrix;
- switch(p_camera->type) {
+ switch (p_camera->type) {
case Camera::ORTHOGONAL: {
- camera_matrix.set_orthogonal(p_camera->size,viewport_rect.width / (float)viewport_rect.height,p_range_min,p_range_max,p_camera->vaspect);
+ camera_matrix.set_orthogonal(p_camera->size, viewport_rect.width / (float)viewport_rect.height, p_range_min, p_range_max, p_camera->vaspect);
} break;
case Camera::PERSPECTIVE: {
camera_matrix.set_perspective(
- p_camera->fov,
- viewport_rect.width / (float)viewport_rect.height,
- p_range_min,
- p_range_max,
- p_camera->vaspect
- );
+ p_camera->fov,
+ viewport_rect.width / (float)viewport_rect.height,
+ p_range_min,
+ p_range_max,
+ p_camera->vaspect);
} break;
}
@@ -4888,49 +4498,47 @@ Vector<Vector3> VisualServerRaster::_camera_generate_endpoints(Instance *p_light
Vector<Vector3> endpoints;
endpoints.resize(8);
- bool res = camera_matrix.get_endpoints(p_camera->transform,&endpoints[0]);
- ERR_FAIL_COND_V(!res,Vector<Vector3>());
+ bool res = camera_matrix.get_endpoints(p_camera->transform, &endpoints[0]);
+ ERR_FAIL_COND_V(!res, Vector<Vector3>());
return endpoints;
}
-Vector<Plane> VisualServerRaster::_camera_generate_orthogonal_planes(Instance *p_light,Camera *p_camera,float p_range_min, float p_range_max) {
+Vector<Plane> VisualServerRaster::_camera_generate_orthogonal_planes(Instance *p_light, Camera *p_camera, float p_range_min, float p_range_max) {
- Vector<Vector3> endpoints=_camera_generate_endpoints(p_light,p_camera,p_range_min,p_range_max); // frustum plane endpoints
- ERR_FAIL_COND_V(endpoints.empty(),Vector<Plane>());
+ Vector<Vector3> endpoints = _camera_generate_endpoints(p_light, p_camera, p_range_min, p_range_max); // frustum plane endpoints
+ ERR_FAIL_COND_V(endpoints.empty(), Vector<Plane>());
// obtain the light frustm ranges (given endpoints)
- Vector3 x_vec=p_light->data.transform.basis.get_axis( Vector3::AXIS_X ).normalized();
- Vector3 y_vec=p_light->data.transform.basis.get_axis( Vector3::AXIS_Y ).normalized();
- Vector3 z_vec=p_light->data.transform.basis.get_axis( Vector3::AXIS_Z ).normalized();
+ Vector3 x_vec = p_light->data.transform.basis.get_axis(Vector3::AXIS_X).normalized();
+ Vector3 y_vec = p_light->data.transform.basis.get_axis(Vector3::AXIS_Y).normalized();
+ Vector3 z_vec = p_light->data.transform.basis.get_axis(Vector3::AXIS_Z).normalized();
- float x_min,x_max;
- float y_min,y_max;
- float z_min,z_max;
+ float x_min, x_max;
+ float y_min, y_max;
+ float z_min, z_max;
- for(int j=0;j<8;j++) {
+ for (int j = 0; j < 8; j++) {
- float d_x=x_vec.dot(endpoints[j]);
- float d_y=y_vec.dot(endpoints[j]);
- float d_z=z_vec.dot(endpoints[j]);
+ float d_x = x_vec.dot(endpoints[j]);
+ float d_y = y_vec.dot(endpoints[j]);
+ float d_z = z_vec.dot(endpoints[j]);
- if (j==0 || d_x<x_min)
- x_min=d_x;
- if (j==0 || d_x>x_max)
- x_max=d_x;
-
- if (j==0 || d_y<y_min)
- y_min=d_y;
- if (j==0 || d_y>y_max)
- y_max=d_y;
-
- if (j==0 || d_z<z_min)
- z_min=d_z;
- if (j==0 || d_z>z_max)
- z_max=d_z;
+ if (j == 0 || d_x < x_min)
+ x_min = d_x;
+ if (j == 0 || d_x > x_max)
+ x_max = d_x;
+ if (j == 0 || d_y < y_min)
+ y_min = d_y;
+ if (j == 0 || d_y > y_max)
+ y_max = d_y;
+ if (j == 0 || d_z < z_min)
+ z_min = d_z;
+ if (j == 0 || d_z > z_max)
+ z_max = d_z;
}
//now that we now all ranges, we can proceed to make the light frustum planes, for culling octree
@@ -4938,82 +4546,77 @@ Vector<Plane> VisualServerRaster::_camera_generate_orthogonal_planes(Instance *p
light_frustum_planes.resize(6);
//right/left
- light_frustum_planes[0]=Plane( x_vec, x_max );
- light_frustum_planes[1]=Plane( -x_vec, -x_min );
+ light_frustum_planes[0] = Plane(x_vec, x_max);
+ light_frustum_planes[1] = Plane(-x_vec, -x_min);
//top/bottom
- light_frustum_planes[2]=Plane( y_vec, y_max );
- light_frustum_planes[3]=Plane( -y_vec, -y_min );
+ light_frustum_planes[2] = Plane(y_vec, y_max);
+ light_frustum_planes[3] = Plane(-y_vec, -y_min);
//near/far
- light_frustum_planes[4]=Plane( z_vec, z_max+1e6 );
- light_frustum_planes[5]=Plane( -z_vec, -z_min ); // z_min is ok, since casters further than far-light plane are not needed
+ light_frustum_planes[4] = Plane(z_vec, z_max + 1e6);
+ light_frustum_planes[5] = Plane(-z_vec, -z_min); // z_min is ok, since casters further than far-light plane are not needed
//TODO@ add more actual frustum planes to minimize get
return light_frustum_planes;
-
}
-void VisualServerRaster::_light_instance_update_pssm_shadow(Instance *p_light,Scenario *p_scenario,Camera *p_camera,const CullRange& p_cull_range) {
+void VisualServerRaster::_light_instance_update_pssm_shadow(Instance *p_light, Scenario *p_scenario, Camera *p_camera, const CullRange &p_cull_range) {
- int splits = rasterizer->light_instance_get_shadow_passes( p_light->light_info->instance );
-
- float split_weight=rasterizer->light_directional_get_shadow_param(p_light->base_rid,LIGHT_DIRECTIONAL_SHADOW_PARAM_PSSM_SPLIT_WEIGHT);
+ int splits = rasterizer->light_instance_get_shadow_passes(p_light->light_info->instance);
+ float split_weight = rasterizer->light_directional_get_shadow_param(p_light->base_rid, LIGHT_DIRECTIONAL_SHADOW_PARAM_PSSM_SPLIT_WEIGHT);
float distances[5];
- float texsize=rasterizer->light_instance_get_shadow_size( p_light->light_info->instance );
+ float texsize = rasterizer->light_instance_get_shadow_size(p_light->light_info->instance);
-// float cull_min=p_cull_range.min;
+ // float cull_min=p_cull_range.min;
//float cull_max=p_cull_range.max;
+ bool overlap = rasterizer->light_instance_get_pssm_shadow_overlap(p_light->light_info->instance);
- bool overlap = rasterizer->light_instance_get_pssm_shadow_overlap(p_light->light_info->instance);
-
- float cull_min=p_camera->znear;
- float cull_max=p_camera->zfar;
- float max_dist = rasterizer->light_directional_get_shadow_param(p_light->base_rid,VS::LIGHT_DIRECTIONAL_SHADOW_PARAM_MAX_DISTANCE);
- if (max_dist>0.0)
- cull_max=MIN(cull_max,max_dist);
+ float cull_min = p_camera->znear;
+ float cull_max = p_camera->zfar;
+ float max_dist = rasterizer->light_directional_get_shadow_param(p_light->base_rid, VS::LIGHT_DIRECTIONAL_SHADOW_PARAM_MAX_DISTANCE);
+ if (max_dist > 0.0)
+ cull_max = MIN(cull_max, max_dist);
- for(int i = 0; i < splits; i++) {
+ for (int i = 0; i < splits; i++) {
float idm = i / (float)splits;
- float lg = cull_min * Math::pow(cull_max/cull_min, idm);
+ float lg = cull_min * Math::pow(cull_max / cull_min, idm);
float uniform = cull_min + (cull_max - cull_min) * idm;
distances[i] = lg * split_weight + uniform * (1.0 - split_weight);
-
}
- distances[0]=cull_min;
- distances[splits]=cull_max;
+ distances[0] = cull_min;
+ distances[splits] = cull_max;
- for (int i=0;i<splits;i++) {
+ for (int i = 0; i < splits; i++) {
// setup a camera matrix for that range!
CameraMatrix camera_matrix;
- switch(p_camera->type) {
+ switch (p_camera->type) {
case Camera::ORTHOGONAL: {
camera_matrix.set_orthogonal(
- p_camera->size,
- viewport_rect.width / (float)viewport_rect.height,
- distances[(i==0 || !overlap )?i:i-1],
- distances[i+1],
- p_camera->vaspect
+ p_camera->size,
+ viewport_rect.width / (float)viewport_rect.height,
+ distances[(i == 0 || !overlap) ? i : i - 1],
+ distances[i + 1],
+ p_camera->vaspect
- );
+ );
} break;
case Camera::PERSPECTIVE: {
-
camera_matrix.set_perspective(
- p_camera->fov,
- viewport_rect.width / (float)viewport_rect.height,
- distances[(i==0 || !overlap )?i:i-1],
- distances[i+1],
- p_camera->vaspect
+ p_camera->fov,
+ viewport_rect.width / (float)viewport_rect.height,
+ distances[(i == 0 || !overlap) ? i : i - 1],
+ distances[i + 1],
+ p_camera->vaspect
- );
+ );
} break;
}
@@ -5021,96 +4624,86 @@ void VisualServerRaster::_light_instance_update_pssm_shadow(Instance *p_light,Sc
//obtain the frustum endpoints
Vector3 endpoints[8]; // frustum plane endpoints
- bool res = camera_matrix.get_endpoints(p_camera->transform,endpoints);
+ bool res = camera_matrix.get_endpoints(p_camera->transform, endpoints);
ERR_CONTINUE(!res);
// obtain the light frustm ranges (given endpoints)
- Vector3 x_vec=p_light->data.transform.basis.get_axis( Vector3::AXIS_X ).normalized();
- Vector3 y_vec=p_light->data.transform.basis.get_axis( Vector3::AXIS_Y ).normalized();
- Vector3 z_vec=p_light->data.transform.basis.get_axis( Vector3::AXIS_Z ).normalized();
+ Vector3 x_vec = p_light->data.transform.basis.get_axis(Vector3::AXIS_X).normalized();
+ Vector3 y_vec = p_light->data.transform.basis.get_axis(Vector3::AXIS_Y).normalized();
+ Vector3 z_vec = p_light->data.transform.basis.get_axis(Vector3::AXIS_Z).normalized();
//z_vec points agsint the camera, like in default opengl
- float x_min,x_max;
- float y_min,y_max;
- float z_min,z_max;
-
- float x_min_cam,x_max_cam;
- float y_min_cam,y_max_cam;
- float z_min_cam,z_max_cam;
+ float x_min, x_max;
+ float y_min, y_max;
+ float z_min, z_max;
+ float x_min_cam, x_max_cam;
+ float y_min_cam, y_max_cam;
+ float z_min_cam, z_max_cam;
//used for culling
- for(int j=0;j<8;j++) {
+ for (int j = 0; j < 8; j++) {
- float d_x=x_vec.dot(endpoints[j]);
- float d_y=y_vec.dot(endpoints[j]);
- float d_z=z_vec.dot(endpoints[j]);
+ float d_x = x_vec.dot(endpoints[j]);
+ float d_y = y_vec.dot(endpoints[j]);
+ float d_z = z_vec.dot(endpoints[j]);
- if (j==0 || d_x<x_min)
- x_min=d_x;
- if (j==0 || d_x>x_max)
- x_max=d_x;
-
- if (j==0 || d_y<y_min)
- y_min=d_y;
- if (j==0 || d_y>y_max)
- y_max=d_y;
-
- if (j==0 || d_z<z_min)
- z_min=d_z;
- if (j==0 || d_z>z_max)
- z_max=d_z;
+ if (j == 0 || d_x < x_min)
+ x_min = d_x;
+ if (j == 0 || d_x > x_max)
+ x_max = d_x;
+ if (j == 0 || d_y < y_min)
+ y_min = d_y;
+ if (j == 0 || d_y > y_max)
+ y_max = d_y;
+ if (j == 0 || d_z < z_min)
+ z_min = d_z;
+ if (j == 0 || d_z > z_max)
+ z_max = d_z;
}
-
-
-
-
{
//camera viewport stuff
//this trick here is what stabilizes the shadow (make potential jaggies to not move)
//at the cost of some wasted resolution. Still the quality increase is very well worth it
-
Vector3 center;
- for(int j=0;j<8;j++) {
+ for (int j = 0; j < 8; j++) {
- center+=endpoints[j];
+ center += endpoints[j];
}
- center/=8.0;
+ center /= 8.0;
//center=x_vec*(x_max-x_min)*0.5 + y_vec*(y_max-y_min)*0.5 + z_vec*(z_max-z_min)*0.5;
- float radius=0;
+ float radius = 0;
- for(int j=0;j<8;j++) {
+ for (int j = 0; j < 8; j++) {
float d = center.distance_to(endpoints[j]);
- if (d>radius)
- radius=d;
+ if (d > radius)
+ radius = d;
}
+ radius *= texsize / (texsize - 2.0); //add a texel by each side, so stepified texture will always fit
- radius *= texsize/(texsize-2.0); //add a texel by each side, so stepified texture will always fit
-
- x_max_cam=x_vec.dot(center)+radius;
- x_min_cam=x_vec.dot(center)-radius;
- y_max_cam=y_vec.dot(center)+radius;
- y_min_cam=y_vec.dot(center)-radius;
- z_max_cam=z_vec.dot(center)+radius;
- z_min_cam=z_vec.dot(center)-radius;
+ x_max_cam = x_vec.dot(center) + radius;
+ x_min_cam = x_vec.dot(center) - radius;
+ y_max_cam = y_vec.dot(center) + radius;
+ y_min_cam = y_vec.dot(center) - radius;
+ z_max_cam = z_vec.dot(center) + radius;
+ z_min_cam = z_vec.dot(center) - radius;
- float unit = radius*2.0/texsize;
-
- x_max_cam=Math::stepify(x_max_cam,unit);
- x_min_cam=Math::stepify(x_min_cam,unit);
- y_max_cam=Math::stepify(y_max_cam,unit);
- y_min_cam=Math::stepify(y_min_cam,unit);
+ float unit = radius * 2.0 / texsize;
+ x_max_cam = Math::stepify(x_max_cam, unit);
+ x_min_cam = Math::stepify(x_min_cam, unit);
+ y_max_cam = Math::stepify(y_max_cam, unit);
+ y_min_cam = Math::stepify(y_min_cam, unit);
}
//now that we now all ranges, we can proceed to make the light frustum planes, for culling octree
@@ -5119,91 +4712,85 @@ void VisualServerRaster::_light_instance_update_pssm_shadow(Instance *p_light,Sc
light_frustum_planes.resize(6);
//right/left
- light_frustum_planes[0]=Plane( x_vec, x_max );
- light_frustum_planes[1]=Plane( -x_vec, -x_min );
+ light_frustum_planes[0] = Plane(x_vec, x_max);
+ light_frustum_planes[1] = Plane(-x_vec, -x_min);
//top/bottom
- light_frustum_planes[2]=Plane( y_vec, y_max );
- light_frustum_planes[3]=Plane( -y_vec, -y_min );
+ light_frustum_planes[2] = Plane(y_vec, y_max);
+ light_frustum_planes[3] = Plane(-y_vec, -y_min);
//near/far
- light_frustum_planes[4]=Plane( z_vec, z_max+1e6 );
- light_frustum_planes[5]=Plane( -z_vec, -z_min ); // z_min is ok, since casters further than far-light plane are not needed
+ light_frustum_planes[4] = Plane(z_vec, z_max + 1e6);
+ light_frustum_planes[5] = Plane(-z_vec, -z_min); // z_min is ok, since casters further than far-light plane are not needed
- int caster_cull_count = p_scenario->octree.cull_convex(light_frustum_planes,instance_shadow_cull_result,MAX_INSTANCE_CULL,INSTANCE_GEOMETRY_MASK);
+ int caster_cull_count = p_scenario->octree.cull_convex(light_frustum_planes, instance_shadow_cull_result, MAX_INSTANCE_CULL, INSTANCE_GEOMETRY_MASK);
// a pre pass will need to be needed to determine the actual z-near to be used
- for(int j=0;j<caster_cull_count;j++) {
+ for (int j = 0; j < caster_cull_count; j++) {
- float min,max;
- Instance *ins=instance_shadow_cull_result[j];
+ float min, max;
+ Instance *ins = instance_shadow_cull_result[j];
if (!ins->visible || ins->data.cast_shadows == VS::SHADOW_CASTING_SETTING_OFF)
continue;
- ins->transformed_aabb.project_range_in_plane(Plane(z_vec,0),min,max);
+ ins->transformed_aabb.project_range_in_plane(Plane(z_vec, 0), min, max);
- if (max>z_max)
- z_max=max;
+ if (max > z_max)
+ z_max = max;
}
{
CameraMatrix ortho_camera;
- real_t half_x = (x_max_cam-x_min_cam) * 0.5;
- real_t half_y = (y_max_cam-y_min_cam) * 0.5;
-
+ real_t half_x = (x_max_cam - x_min_cam) * 0.5;
+ real_t half_y = (y_max_cam - y_min_cam) * 0.5;
- ortho_camera.set_orthogonal( -half_x, half_x,-half_y,half_y, 0, (z_max-z_min_cam) );
+ ortho_camera.set_orthogonal(-half_x, half_x, -half_y, half_y, 0, (z_max - z_min_cam));
Transform ortho_transform;
- ortho_transform.basis=p_light->data.transform.basis;
- ortho_transform.origin=x_vec*(x_min_cam+half_x)+y_vec*(y_min_cam+half_y)+z_vec*z_max;
+ ortho_transform.basis = p_light->data.transform.basis;
+ ortho_transform.origin = x_vec * (x_min_cam + half_x) + y_vec * (y_min_cam + half_y) + z_vec * z_max;
- rasterizer->light_instance_set_shadow_transform(p_light->light_info->instance, i, ortho_camera, ortho_transform,distances[i],distances[i+1] );
+ rasterizer->light_instance_set_shadow_transform(p_light->light_info->instance, i, ortho_camera, ortho_transform, distances[i], distances[i + 1]);
}
- rasterizer->begin_shadow_map( p_light->light_info->instance, i );
+ rasterizer->begin_shadow_map(p_light->light_info->instance, i);
- for (int j=0;j<caster_cull_count;j++) {
+ for (int j = 0; j < caster_cull_count; j++) {
Instance *instance = instance_shadow_cull_result[j];
- if (!instance->visible || instance->data.cast_shadows==VS::SHADOW_CASTING_SETTING_OFF)
+ if (!instance->visible || instance->data.cast_shadows == VS::SHADOW_CASTING_SETTING_OFF)
continue;
_instance_draw(instance);
}
rasterizer->end_shadow_map();
-
-
}
-
-
}
-
-CameraMatrix _lispm_look( const Vector3 pos, const Vector3 dir, const Vector3 up) {
+CameraMatrix _lispm_look(const Vector3 pos, const Vector3 dir, const Vector3 up) {
Vector3 dirN;
Vector3 upN;
Vector3 lftN;
- lftN=dir.cross(up);
+ lftN = dir.cross(up);
lftN.normalize();
- upN=lftN.cross(dir);
+ upN = lftN.cross(dir);
upN.normalize();
- dirN=dir.normalized();
+ dirN = dir.normalized();
CameraMatrix cmout;
- float *output=&cmout.matrix[0][0];
- output[ 0] = lftN[0];
- output[ 1] = upN[0];
- output[ 2] = -dirN[0];
- output[ 3] = 0.0;
+ float *output = &cmout.matrix[0][0];
+ output[0] = lftN[0];
+ output[1] = upN[0];
+ output[2] = -dirN[0];
+ output[3] = 0.0;
- output[ 4] = lftN[1];
- output[ 5] = upN[1];
- output[ 6] = -dirN[1];
- output[ 7] = 0.0;
+ output[4] = lftN[1];
+ output[5] = upN[1];
+ output[6] = -dirN[1];
+ output[7] = 0.0;
- output[ 8] = lftN[2];
- output[ 9] = upN[2];
+ output[8] = lftN[2];
+ output[9] = upN[2];
output[10] = -dirN[2];
output[11] = 0.0;
@@ -5215,121 +4802,112 @@ CameraMatrix _lispm_look( const Vector3 pos, const Vector3 dir, const Vector3 up
return cmout;
}
-
-
#if 1
-void VisualServerRaster::_light_instance_update_lispsm_shadow(Instance *p_light,Scenario *p_scenario,Camera *p_camera,const CullRange& p_cull_range) {
+void VisualServerRaster::_light_instance_update_lispsm_shadow(Instance *p_light, Scenario *p_scenario, Camera *p_camera, const CullRange &p_cull_range) {
Vector3 light_vec = -p_light->data.transform.basis.get_axis(2);
Vector3 view_vec = -p_camera->transform.basis.get_axis(2);
- float near_dist=1;
+ float near_dist = 1;
- Vector<Plane> light_frustum_planes = _camera_generate_orthogonal_planes(p_light,p_camera,p_cull_range.min,p_cull_range.max);
- int caster_count = p_scenario->octree.cull_convex(light_frustum_planes,instance_shadow_cull_result,MAX_INSTANCE_CULL,INSTANCE_GEOMETRY_MASK);
+ Vector<Plane> light_frustum_planes = _camera_generate_orthogonal_planes(p_light, p_camera, p_cull_range.min, p_cull_range.max);
+ int caster_count = p_scenario->octree.cull_convex(light_frustum_planes, instance_shadow_cull_result, MAX_INSTANCE_CULL, INSTANCE_GEOMETRY_MASK);
// this could be faster by just getting supports from the AABBs..
// but, safer to do as the original implementation explains for now..
Vector<Vector3> caster_pointcloud;
- caster_pointcloud.resize(caster_count*8);
- int caster_pointcloud_size=0;
+ caster_pointcloud.resize(caster_count * 8);
+ int caster_pointcloud_size = 0;
{
//fill pointcloud
- Vector3* caster_pointcloud_ptr=&caster_pointcloud[0];
+ Vector3 *caster_pointcloud_ptr = &caster_pointcloud[0];
- for(int i=0;i<caster_count;i++) {
+ for (int i = 0; i < caster_count; i++) {
Instance *ins = instance_shadow_cull_result[i];
if (!ins->visible || ins->data.cast_shadows == VS::SHADOW_CASTING_SETTING_OFF)
continue;
- for(int j=0;j<8;j++) {
+ for (int j = 0; j < 8; j++) {
Vector3 v = ins->aabb.get_endpoint(j);
v = ins->data.transform.xform(v);
- caster_pointcloud_ptr[caster_pointcloud_size+j]=v;
+ caster_pointcloud_ptr[caster_pointcloud_size + j] = v;
}
- caster_pointcloud_size+=8;
-
+ caster_pointcloud_size += 8;
}
}
// now generate a pointcloud that contains the maximum bound (camera extruded by light)
- Vector<Vector3> camera_pointcloud = _camera_generate_endpoints(p_light,p_camera,p_cull_range.min,p_cull_range.max);
- int cpcsize=camera_pointcloud.size();
- camera_pointcloud.resize( cpcsize*2 );
+ Vector<Vector3> camera_pointcloud = _camera_generate_endpoints(p_light, p_camera, p_cull_range.min, p_cull_range.max);
+ int cpcsize = camera_pointcloud.size();
+ camera_pointcloud.resize(cpcsize * 2);
- for(int i=0;i<cpcsize;i++) {
+ for (int i = 0; i < cpcsize; i++) {
- camera_pointcloud[i+cpcsize]=camera_pointcloud[i]-light_vec*1000;
+ camera_pointcloud[i + cpcsize] = camera_pointcloud[i] - light_vec * 1000;
}
-
-
// Vector<Vector3> frustum_points=_camera_generate_endpoints(p_light,p_camera,p_cull_range.min,p_cull_range.max);
-
// compute the "light-space" basis, using the algorithm described in the paper
// note: since bodyB is defined in eye space, all of these vectors should also be defined in eye space
-
Vector3 eye = p_camera->transform.origin;
Vector3 up = light_vec.cross(view_vec).cross(light_vec).normalized();
-
- CameraMatrix light_space_basis = _lispm_look(eye,light_vec,up);
+ CameraMatrix light_space_basis = _lispm_look(eye, light_vec, up);
AABB light_space_aabb;
-
{ //create an optimal AABB from both the camera pointcloud and the objects pointcloud
AABB light_space_pointcloud_aabb;
AABB light_space_camera_aabb;
//xform pointcloud
- const Vector3* caster_pointcloud_ptr=&caster_pointcloud[0];
+ const Vector3 *caster_pointcloud_ptr = &caster_pointcloud[0];
- for(int i=0;i<caster_pointcloud_size;i++) {
+ for (int i = 0; i < caster_pointcloud_size; i++) {
Vector3 p = light_space_basis.xform(caster_pointcloud_ptr[i]);
- if (i==0) {
- light_space_pointcloud_aabb.pos=p;
+ if (i == 0) {
+ light_space_pointcloud_aabb.pos = p;
} else {
light_space_pointcloud_aabb.expand_to(p);
}
}
- for(int i=0;i<camera_pointcloud.size();i++) {
+ for (int i = 0; i < camera_pointcloud.size(); i++) {
Vector3 p = light_space_basis.xform(camera_pointcloud[i]);
- if (i==0) {
- light_space_camera_aabb.pos=p;
+ if (i == 0) {
+ light_space_camera_aabb.pos = p;
} else {
light_space_camera_aabb.expand_to(p);
}
}
- light_space_aabb=light_space_pointcloud_aabb.intersection(light_space_camera_aabb);
+ light_space_aabb = light_space_pointcloud_aabb.intersection(light_space_camera_aabb);
}
float lvdp = light_vec.dot(view_vec);
- float sin_gamma = Math::sqrt(1.0-lvdp*lvdp);
+ float sin_gamma = Math::sqrt(1.0 - lvdp * lvdp);
//use the formulas of the paper to get n (and f)
- float factor = 1.0/sin_gamma;
- float z_n = factor*near_dist; //often 1
+ float factor = 1.0 / sin_gamma;
+ float z_n = factor * near_dist; //often 1
float d = Math::abs(light_space_aabb.size.y); //perspective transform depth //light space y extents
- float z_f = z_n + d*sin_gamma;
- float n = (z_n+Math::sqrt(z_f*z_n))/sin_gamma;
- float f = n+d;
+ float z_f = z_n + d * sin_gamma;
+ float n = (z_n + Math::sqrt(z_f * z_n)) / sin_gamma;
+ float f = n + d;
- Vector3 pos = eye - up*(n-near_dist);
+ Vector3 pos = eye - up * (n - near_dist);
- CameraMatrix light_space_basis2 = _lispm_look(pos,light_vec,up);
+ CameraMatrix light_space_basis2 = _lispm_look(pos, light_vec, up);
//Transform light_space_basis2;
//light_space_basis2.set_look_at(pos,light_vec-pos,up);
//light_space_basis2.affine_invert();
@@ -5338,15 +4916,14 @@ void VisualServerRaster::_light_instance_update_lispsm_shadow(Instance *p_light,
//with the two parameters n(near) and f(far) in y direction
CameraMatrix lisp_matrix;
- lisp_matrix.matrix[1][1]=(f+n)/(f-n);
- lisp_matrix.matrix[3][1]=-2*f*n/(f-n);
- lisp_matrix.matrix[1][3]=1;
- lisp_matrix.matrix[3][3]=0;
+ lisp_matrix.matrix[1][1] = (f + n) / (f - n);
+ lisp_matrix.matrix[3][1] = -2 * f * n / (f - n);
+ lisp_matrix.matrix[1][3] = 1;
+ lisp_matrix.matrix[3][3] = 0;
CameraMatrix projection = lisp_matrix * light_space_basis2;
//CameraMatrix projection = light_space_basis2 * lisp_matrix;
-
AABB proj_space_aabb;
{
@@ -5354,44 +4931,44 @@ void VisualServerRaster::_light_instance_update_lispsm_shadow(Instance *p_light,
AABB proj_space_pointcloud_aabb;
AABB proj_space_camera_aabb;
//xform pointcloud
- Vector3* caster_pointcloud_ptr=&caster_pointcloud[0];
- for(int i=0;i<caster_pointcloud_size;i++) {
+ Vector3 *caster_pointcloud_ptr = &caster_pointcloud[0];
+ for (int i = 0; i < caster_pointcloud_size; i++) {
Vector3 p = projection.xform(caster_pointcloud_ptr[i]);
- if (i==0) {
- proj_space_pointcloud_aabb.pos=p;
+ if (i == 0) {
+ proj_space_pointcloud_aabb.pos = p;
} else {
proj_space_pointcloud_aabb.expand_to(p);
}
}
- for(int i=0;i<camera_pointcloud.size();i++) {
+ for (int i = 0; i < camera_pointcloud.size(); i++) {
Vector3 p = projection.xform(camera_pointcloud[i]);
- if (i==0) {
- proj_space_camera_aabb.pos=p;
+ if (i == 0) {
+ proj_space_camera_aabb.pos = p;
} else {
proj_space_camera_aabb.expand_to(p);
}
}
//proj_space_aabb=proj_space_pointcloud_aabb.intersection_with(proj_space_camera_aabb);
- proj_space_aabb=proj_space_pointcloud_aabb;
+ proj_space_aabb = proj_space_pointcloud_aabb;
}
projection.scale_translate_to_fit(proj_space_aabb);
- projection=projection * lisp_matrix;
+ projection = projection * lisp_matrix;
CameraMatrix scale;
- scale.make_scale(Vector3(1.0,1.0,-1.0)); // transform to left handed
+ scale.make_scale(Vector3(1.0, 1.0, -1.0)); // transform to left handed
- projection=scale * projection;
+ projection = scale * projection;
- rasterizer->light_instance_set_shadow_transform(p_light->light_info->instance,0, projection , light_space_basis2.inverse() );
+ rasterizer->light_instance_set_shadow_transform(p_light->light_info->instance, 0, projection, light_space_basis2.inverse());
- rasterizer->begin_shadow_map( p_light->light_info->instance, 0 );
+ rasterizer->begin_shadow_map(p_light->light_info->instance, 0);
- for(int i=0;i<caster_count;i++) {
+ for (int i = 0; i < caster_count; i++) {
Instance *instance = instance_shadow_cull_result[i];
@@ -5401,19 +4978,14 @@ void VisualServerRaster::_light_instance_update_lispsm_shadow(Instance *p_light,
}
rasterizer->end_shadow_map();
-
-
}
#else
-
-void VisualServerRaster::_light_instance_update_lispsm_shadow(Instance *p_light,Scenario *p_scenario,Camera *p_camera,const CullRange& p_cull_range) {
+void VisualServerRaster::_light_instance_update_lispsm_shadow(Instance *p_light, Scenario *p_scenario, Camera *p_camera, const CullRange &p_cull_range) {
/* STEP 1: GENERATE LIGHT TRANSFORM */
-
-
Vector3 light_vec = -p_light->data.transform.basis.get_axis(2);
Vector3 view_vec = -p_camera->transform.basis.get_axis(2);
float viewdot = Math::absf(light_vec.dot(view_vec));
@@ -5421,48 +4993,44 @@ void VisualServerRaster::_light_instance_update_lispsm_shadow(Instance *p_light,
Vector3 up = light_vec.cross(view_vec).cross(light_vec).normalized();
Transform light_transform;
- light_transform.set_look_at(Vector3(),light_vec,up);
-
+ light_transform.set_look_at(Vector3(), light_vec, up);
/* STEP 2: GENERATE WORDLSPACE PLANES AND VECTORS*/
- float range_min=0.01; //p_cull_range.min
- float range_max=20;//p_cull_range.max;
+ float range_min = 0.01; //p_cull_range.min
+ float range_max = 20; //p_cull_range.max;
- Vector<Vector3> camera_endpoints=_camera_generate_endpoints(p_light,p_camera,range_min,range_max); // frustum plane endpoints
+ Vector<Vector3> camera_endpoints = _camera_generate_endpoints(p_light, p_camera, range_min, range_max); // frustum plane endpoints
ERR_FAIL_COND(camera_endpoints.empty());
// obtain the light frustm ranges (given endpoints)
-
- Vector3 light_x_vec=light_transform.basis.get_axis( Vector3::AXIS_X ).normalized();
- Vector3 light_y_vec=light_transform.basis.get_axis( Vector3::AXIS_Y ).normalized();
- Vector3 light_z_vec=light_transform.basis.get_axis( Vector3::AXIS_Z ).normalized();
+ Vector3 light_x_vec = light_transform.basis.get_axis(Vector3::AXIS_X).normalized();
+ Vector3 light_y_vec = light_transform.basis.get_axis(Vector3::AXIS_Y).normalized();
+ Vector3 light_z_vec = light_transform.basis.get_axis(Vector3::AXIS_Z).normalized();
Vector3 light_axis_max;
Vector3 light_axis_min;
- for(int j=0;j<8;j++) {
-
- float d_x=light_x_vec.dot(camera_endpoints[j]);
- float d_y=light_y_vec.dot(camera_endpoints[j]);
- float d_z=light_z_vec.dot(camera_endpoints[j]);
+ for (int j = 0; j < 8; j++) {
- if (j==0 || d_x<light_axis_min.x)
- light_axis_min.x=d_x;
- if (j==0 || d_x>light_axis_max.x)
- light_axis_max.x=d_x;
+ float d_x = light_x_vec.dot(camera_endpoints[j]);
+ float d_y = light_y_vec.dot(camera_endpoints[j]);
+ float d_z = light_z_vec.dot(camera_endpoints[j]);
- if (j==0 || d_y<light_axis_min.y)
- light_axis_min.y=d_y;
- if (j==0 || d_y>light_axis_max.y)
- light_axis_max.y=d_y;
-
- if (j==0 || d_z<light_axis_min.z)
- light_axis_min.z=d_z;
- if (j==0 || d_z>light_axis_max.z)
- light_axis_max.z=d_z;
+ if (j == 0 || d_x < light_axis_min.x)
+ light_axis_min.x = d_x;
+ if (j == 0 || d_x > light_axis_max.x)
+ light_axis_max.x = d_x;
+ if (j == 0 || d_y < light_axis_min.y)
+ light_axis_min.y = d_y;
+ if (j == 0 || d_y > light_axis_max.y)
+ light_axis_max.y = d_y;
+ if (j == 0 || d_z < light_axis_min.z)
+ light_axis_min.z = d_z;
+ if (j == 0 || d_z > light_axis_max.z)
+ light_axis_max.z = d_z;
}
//now that we now all ranges, we can proceed to make the light frustum planes, for culling octree
@@ -5470,164 +5038,151 @@ void VisualServerRaster::_light_instance_update_lispsm_shadow(Instance *p_light,
Vector<Plane> light_cull_planes;
light_cull_planes.resize(6);
-
//right/left
- light_cull_planes[0]=Plane( light_x_vec, light_axis_max.x );
- light_cull_planes[1]=Plane( -light_x_vec, -light_axis_min.x );
+ light_cull_planes[0] = Plane(light_x_vec, light_axis_max.x);
+ light_cull_planes[1] = Plane(-light_x_vec, -light_axis_min.x);
//top/bottom
- light_cull_planes[2]=Plane( light_y_vec, light_axis_max.y );
- light_cull_planes[3]=Plane( -light_y_vec, -light_axis_min.y );
+ light_cull_planes[2] = Plane(light_y_vec, light_axis_max.y);
+ light_cull_planes[3] = Plane(-light_y_vec, -light_axis_min.y);
//near/far
- light_cull_planes[4]=Plane( light_z_vec, light_axis_max.z+1e6 );
- light_cull_planes[5]=Plane( -light_z_vec, -light_axis_min.z ); // z_min is ok, since casters further than far-light plane are not needed
-
+ light_cull_planes[4] = Plane(light_z_vec, light_axis_max.z + 1e6);
+ light_cull_planes[5] = Plane(-light_z_vec, -light_axis_min.z); // z_min is ok, since casters further than far-light plane are not needed
/* STEP 3: CULL CASTERS */
- int caster_count = p_scenario->octree.cull_convex(light_cull_planes,instance_shadow_cull_result,MAX_INSTANCE_CULL,INSTANCE_GEOMETRY_MASK);
+ int caster_count = p_scenario->octree.cull_convex(light_cull_planes, instance_shadow_cull_result, MAX_INSTANCE_CULL, INSTANCE_GEOMETRY_MASK);
/* STEP 4: ADJUST FAR Z PLANE */
- float caster_max_z=1e-1;
- for(int i=0;i<caster_count;i++) {
+ float caster_max_z = 1e-1;
+ for (int i = 0; i < caster_count; i++) {
- Instance *ins=instance_shadow_cull_result[i];
- if (!ins->visible || ins->cast_shadows==VS::SHADOW_CASTING_SETTING_OFF)
+ Instance *ins = instance_shadow_cull_result[i];
+ if (!ins->visible || ins->cast_shadows == VS::SHADOW_CASTING_SETTING_OFF)
continue;
//@TODO optimize using support mapping
- for(int j=0;j<8;j++) {
+ for (int j = 0; j < 8; j++) {
- Vector3 v=ins->data.transform.xform(ins->aabb.get_endpoint(j));
+ Vector3 v = ins->data.transform.xform(ins->aabb.get_endpoint(j));
float d = light_z_vec.dot(v);
- if (d>caster_max_z)
- caster_max_z=d;
-
+ if (d > caster_max_z)
+ caster_max_z = d;
}
-
}
- float expand = caster_max_z-light_axis_max.z;
- if (expand<0)
- expand=0;
- light_axis_max.z=MAX(caster_max_z,light_axis_max.z);
+ float expand = caster_max_z - light_axis_max.z;
+ if (expand < 0)
+ expand = 0;
+ light_axis_max.z = MAX(caster_max_z, light_axis_max.z);
/* STEP 5: CREATE ORTHOGONAL PROJECTION */
CameraMatrix light_projection;
- real_t half_x = (light_axis_max.x-light_axis_min.x) * 0.5;
- real_t half_y = (light_axis_max.y-light_axis_min.y) * 0.5;
- light_projection.set_orthogonal( -half_x, half_x,half_y, -half_y, 0, (light_axis_max.z-light_axis_min.z) );
- light_transform.origin=light_x_vec*(light_axis_min.x+half_x)+light_y_vec*(light_axis_min.y+half_y)+light_z_vec*light_axis_max.z;
-
+ real_t half_x = (light_axis_max.x - light_axis_min.x) * 0.5;
+ real_t half_y = (light_axis_max.y - light_axis_min.y) * 0.5;
+ light_projection.set_orthogonal(-half_x, half_x, half_y, -half_y, 0, (light_axis_max.z - light_axis_min.z));
+ light_transform.origin = light_x_vec * (light_axis_min.x + half_x) + light_y_vec * (light_axis_min.y + half_y) + light_z_vec * light_axis_max.z;
- if (/*false &&*/ viewdot<0.96) {
+ if (/*false &&*/ viewdot < 0.96) {
float lvdp = light_vec.dot(view_vec);
- float near_dist=1.0;
- float sin_gamma = Math::sqrt(1.0-lvdp*lvdp);
+ float near_dist = 1.0;
+ float sin_gamma = Math::sqrt(1.0 - lvdp * lvdp);
//use the formulas of the paper to get n (and f)
- float factor = 1.0/sin_gamma;
- float z_n = factor*near_dist; //often 1
- float d = Math::abs(light_axis_max.y-light_axis_min.y); //perspective transform depth //light space y extents
- float z_f = z_n + d*sin_gamma;
- float n = (z_n+Math::sqrt(z_f*z_n))/sin_gamma;
- float f = n+d;
+ float factor = 1.0 / sin_gamma;
+ float z_n = factor * near_dist; //often 1
+ float d = Math::abs(light_axis_max.y - light_axis_min.y); //perspective transform depth //light space y extents
+ float z_f = z_n + d * sin_gamma;
+ float n = (z_n + Math::sqrt(z_f * z_n)) / sin_gamma;
+ float f = n + d;
CameraMatrix lisp_matrix;
- lisp_matrix.matrix[1][1]=(f+n)/(f-n);
- lisp_matrix.matrix[3][1]=-2*f*n/(f-n);
- lisp_matrix.matrix[1][3]=1;
- lisp_matrix.matrix[3][3]=0;
+ lisp_matrix.matrix[1][1] = (f + n) / (f - n);
+ lisp_matrix.matrix[3][1] = -2 * f * n / (f - n);
+ lisp_matrix.matrix[1][3] = 1;
+ lisp_matrix.matrix[3][3] = 0;
- Vector3 pos = p_camera->transform.origin - up*(n-near_dist);
+ Vector3 pos = p_camera->transform.origin - up * (n - near_dist);
- CameraMatrix world2light = _lispm_look(pos,light_vec,up);
+ CameraMatrix world2light = _lispm_look(pos, light_vec, up);
CameraMatrix projection = lisp_matrix * world2light;
AABB projection_bounds;
- for(int i=0;i<camera_endpoints.size();i++) {
+ for (int i = 0; i < camera_endpoints.size(); i++) {
- Vector3 p=camera_endpoints[i];
- if (i==0)
- projection_bounds.pos=projection.xform(p);
+ Vector3 p = camera_endpoints[i];
+ if (i == 0)
+ projection_bounds.pos = projection.xform(p);
else
projection_bounds.expand_to(projection.xform(p));
- projection_bounds.expand_to(projection.xform(p+light_vec*-expand));
+ projection_bounds.expand_to(projection.xform(p + light_vec * -expand));
}
CameraMatrix scaletrans;
scaletrans.scale_translate_to_fit(projection_bounds);
- projection=scaletrans * lisp_matrix;
+ projection = scaletrans * lisp_matrix;
CameraMatrix scale;
- scale.make_scale(Vector3(1.0,1.0,-1.0)); // transform to left handed
+ scale.make_scale(Vector3(1.0, 1.0, -1.0)); // transform to left handed
- projection=scale * projection;
+ projection = scale * projection;
-
- rasterizer->light_instance_set_shadow_transform(p_light->light_info->instance,0, projection, world2light.inverse(), viewdot);
+ rasterizer->light_instance_set_shadow_transform(p_light->light_info->instance, 0, projection, world2light.inverse(), viewdot);
} else {
//orthogonal
- rasterizer->light_instance_set_shadow_transform(p_light->light_info->instance,0, light_projection , light_transform, viewdot);
+ rasterizer->light_instance_set_shadow_transform(p_light->light_info->instance, 0, light_projection, light_transform, viewdot);
}
- rasterizer->begin_shadow_map( p_light->light_info->instance, 0 );
+ rasterizer->begin_shadow_map(p_light->light_info->instance, 0);
- for(int i=0;i<caster_count;i++) {
+ for (int i = 0; i < caster_count; i++) {
Instance *instance = instance_shadow_cull_result[i];
- if (!instance->visible || instance->cast_shadows==VS::SHADOW_CASTING_SETTING_OFF)
+ if (!instance->visible || instance->cast_shadows == VS::SHADOW_CASTING_SETTING_OFF)
continue;
_instance_draw(instance);
}
rasterizer->end_shadow_map();
-
}
#endif
+void VisualServerRaster::_light_instance_update_shadow(Instance *p_light, Scenario *p_scenario, Camera *p_camera, const CullRange &p_cull_range) {
-void VisualServerRaster::_light_instance_update_shadow(Instance *p_light,Scenario *p_scenario,Camera *p_camera,const CullRange& p_cull_range) {
-
-
-
- if (!rasterizer->shadow_allocate_near( p_light->light_info->instance ))
+ if (!rasterizer->shadow_allocate_near(p_light->light_info->instance))
return; // shadow could not be updated
-
/* VisualServerRaster supports for many shadow techniques, using the one the rasterizer requests */
Rasterizer::ShadowType shadow_type = rasterizer->light_instance_get_shadow_type(p_light->light_info->instance);
- switch(shadow_type) {
+ switch (shadow_type) {
case Rasterizer::SHADOW_SIMPLE: {
/* SPOT SHADOW */
-
- rasterizer->begin_shadow_map( p_light->light_info->instance, 0 );
+ rasterizer->begin_shadow_map(p_light->light_info->instance, 0);
//using this one ensures that raster deferred will have it
- float far = rasterizer->light_get_var( p_light->base_rid, VS::LIGHT_PARAM_RADIUS);
+ float far = rasterizer->light_get_var(p_light->base_rid, VS::LIGHT_PARAM_RADIUS);
- float angle = rasterizer->light_get_var( p_light->base_rid, VS::LIGHT_PARAM_SPOT_ANGLE );
+ float angle = rasterizer->light_get_var(p_light->base_rid, VS::LIGHT_PARAM_SPOT_ANGLE);
CameraMatrix cm;
- cm.set_perspective( angle*2.0, 1.0, 0.001, far );
+ cm.set_perspective(angle * 2.0, 1.0, 0.001, far);
Vector<Plane> planes = cm.get_projection_planes(p_light->data.transform);
- int cull_count = p_scenario->octree.cull_convex(planes,instance_shadow_cull_result,MAX_INSTANCE_CULL,INSTANCE_GEOMETRY_MASK);
-
+ int cull_count = p_scenario->octree.cull_convex(planes, instance_shadow_cull_result, MAX_INSTANCE_CULL, INSTANCE_GEOMETRY_MASK);
- for (int i=0;i<cull_count;i++) {
+ for (int i = 0; i < cull_count; i++) {
Instance *instance = instance_shadow_cull_result[i];
if (!instance->visible || instance->data.cast_shadows == VS::SHADOW_CASTING_SETTING_OFF)
@@ -5642,33 +5197,30 @@ void VisualServerRaster::_light_instance_update_shadow(Instance *p_light,Scenari
/* OMNI SHADOW */
- int passes = rasterizer->light_instance_get_shadow_passes( p_light->light_info->instance );
+ int passes = rasterizer->light_instance_get_shadow_passes(p_light->light_info->instance);
- if (passes==2) {
+ if (passes == 2) {
- for(int i=0;i<2;i++) {
-
- rasterizer->begin_shadow_map( p_light->light_info->instance, i );
+ for (int i = 0; i < 2; i++) {
+ rasterizer->begin_shadow_map(p_light->light_info->instance, i);
//using this one ensures that raster deferred will have it
- float radius = rasterizer->light_get_var( p_light->base_rid, VS::LIGHT_PARAM_RADIUS);
+ float radius = rasterizer->light_get_var(p_light->base_rid, VS::LIGHT_PARAM_RADIUS);
- float z =i==0?-1:1;
+ float z = i == 0 ? -1 : 1;
Vector<Plane> planes;
planes.resize(5);
- planes[0]=p_light->data.transform.xform(Plane(Vector3(0,0,z),radius));
- planes[1]=p_light->data.transform.xform(Plane(Vector3(1,0,z).normalized(),radius));
- planes[2]=p_light->data.transform.xform(Plane(Vector3(-1,0,z).normalized(),radius));
- planes[3]=p_light->data.transform.xform(Plane(Vector3(0,1,z).normalized(),radius));
- planes[4]=p_light->data.transform.xform(Plane(Vector3(0,-1,z).normalized(),radius));
-
-
- int cull_count = p_scenario->octree.cull_convex(planes,instance_shadow_cull_result,MAX_INSTANCE_CULL,INSTANCE_GEOMETRY_MASK);
+ planes[0] = p_light->data.transform.xform(Plane(Vector3(0, 0, z), radius));
+ planes[1] = p_light->data.transform.xform(Plane(Vector3(1, 0, z).normalized(), radius));
+ planes[2] = p_light->data.transform.xform(Plane(Vector3(-1, 0, z).normalized(), radius));
+ planes[3] = p_light->data.transform.xform(Plane(Vector3(0, 1, z).normalized(), radius));
+ planes[4] = p_light->data.transform.xform(Plane(Vector3(0, -1, z).normalized(), radius));
+ int cull_count = p_scenario->octree.cull_convex(planes, instance_shadow_cull_result, MAX_INSTANCE_CULL, INSTANCE_GEOMETRY_MASK);
- for (int j=0;j<cull_count;j++) {
+ for (int j = 0; j < cull_count; j++) {
Instance *instance = instance_shadow_cull_result[j];
if (!instance->visible || instance->data.cast_shadows == VS::SHADOW_CASTING_SETTING_OFF)
@@ -5679,11 +5231,8 @@ void VisualServerRaster::_light_instance_update_shadow(Instance *p_light,Scenari
rasterizer->end_shadow_map();
}
- } else if (passes==1) {
+ } else if (passes == 1) {
//one go
-
-
-
}
} break;
@@ -5693,30 +5242,28 @@ void VisualServerRaster::_light_instance_update_shadow(Instance *p_light,Scenari
} break;
case Rasterizer::SHADOW_ORTHOGONAL: {
- _light_instance_update_pssm_shadow(p_light,p_scenario,p_camera,p_cull_range);
+ _light_instance_update_pssm_shadow(p_light, p_scenario, p_camera, p_cull_range);
} break;
case Rasterizer::SHADOW_PSSM: {
- _light_instance_update_pssm_shadow(p_light,p_scenario,p_camera,p_cull_range);
+ _light_instance_update_pssm_shadow(p_light, p_scenario, p_camera, p_cull_range);
} break;
case Rasterizer::SHADOW_PSM: {
- _light_instance_update_lispsm_shadow(p_light,p_scenario,p_camera,p_cull_range);
- // todo
+ _light_instance_update_lispsm_shadow(p_light, p_scenario, p_camera, p_cull_range);
+ // todo
} break;
default: {}
}
-
}
-void VisualServerRaster::_portal_disconnect(Instance *p_portal,bool p_cleanup) {
+void VisualServerRaster::_portal_disconnect(Instance *p_portal, bool p_cleanup) {
if (p_portal->portal_info->connected) {
//disconnect first
- p_portal->portal_info->connected->portal_info->connected=NULL;
- p_portal->portal_info->connected=NULL;
-
+ p_portal->portal_info->connected->portal_info->connected = NULL;
+ p_portal->portal_info->connected = NULL;
}
if (p_portal->room && p_portal->room->room) {
@@ -5729,57 +5276,55 @@ void VisualServerRaster::_portal_disconnect(Instance *p_portal,bool p_cleanup) {
p_portal->room->room->room_info->disconnected_child_portals.insert(p_portal);
}
}
-
}
void VisualServerRaster::_instance_validate_autorooms(Instance *p_geometry) {
- if (p_geometry->auto_rooms.size()==0)
+ if (p_geometry->auto_rooms.size() == 0)
return;
p_geometry->valid_auto_rooms.clear();
int point_count = aabb_random_points.size();
- const Vector3 * src_points = &aabb_random_points[0];
+ const Vector3 *src_points = &aabb_random_points[0];
- for(Set<Instance*>::Element *E=p_geometry->valid_auto_rooms.front();E;E=E->next()) {
+ for (Set<Instance *>::Element *E = p_geometry->valid_auto_rooms.front(); E; E = E->next()) {
Instance *room = E->get();
- Vector3 *dst_points=&transformed_aabb_random_points[0];
+ Vector3 *dst_points = &transformed_aabb_random_points[0];
//generate points
- for(int i=0;i<point_count;i++) {
+ for (int i = 0; i < point_count; i++) {
- dst_points[i] = room->room_info->affine_inverse.xform(p_geometry->data.transform.xform((src_points[i]*p_geometry->transformed_aabb.size)+p_geometry->transformed_aabb.pos));
+ dst_points[i] = room->room_info->affine_inverse.xform(p_geometry->data.transform.xform((src_points[i] * p_geometry->transformed_aabb.size) + p_geometry->transformed_aabb.pos));
}
- int pass = room->room_info->room->bounds.get_points_inside(dst_points,point_count);
+ int pass = room->room_info->room->bounds.get_points_inside(dst_points, point_count);
float ratio = pass;
- if( point_count != 0 ) {
+ if (point_count != 0) {
ratio /= (float)point_count;
}
- if (ratio>0.5) // should make some constant
+ if (ratio > 0.5) // should make some constant
p_geometry->valid_auto_rooms.insert(room);
}
}
void VisualServerRaster::_portal_attempt_connect(Instance *p_portal) {
-
_portal_disconnect(p_portal);
Vector3 A_norm = p_portal->data.transform.basis.get_axis(Vector3::AXIS_Z).normalized();
- Plane A_plane( p_portal->data.transform.origin, A_norm );
+ Plane A_plane(p_portal->data.transform.origin, A_norm);
float A_surface = p_portal->portal_info->portal->bounds.get_area();
- if (A_surface==0)
+ if (A_surface == 0)
return; //wtf
- Instance *found=NULL;
+ Instance *found = NULL;
Transform affine_inverse = p_portal->data.transform.affine_inverse();
- for(Set<Instance*>::Element *E=p_portal->portal_info->candidate_set.front();E;E=E->next()) {
+ for (Set<Instance *>::Element *E = p_portal->portal_info->candidate_set.front(); E; E = E->next()) {
Instance *B = E->get();
@@ -5791,65 +5336,57 @@ void VisualServerRaster::_portal_attempt_connect(Instance *p_portal) {
// check that they are in front of another
float dot = A_norm.dot(-B_norm);
- if (dot<0.707) // 45 degrees, TODO unharcode this
+ if (dot < 0.707) // 45 degrees, TODO unharcode this
continue;
// check the max distance to the other portal
- bool valid=true;
+ bool valid = true;
Rect2 local_bounds;
- for(int i=0;i<B->portal_info->portal->shape.size();i++) {
+ for (int i = 0; i < B->portal_info->portal->shape.size(); i++) {
Point2 point2 = B->portal_info->portal->shape[i];
- Vector3 point = B->data.transform.xform( Vector3( point2.x, point2.y, 0 ) );
+ Vector3 point = B->data.transform.xform(Vector3(point2.x, point2.y, 0));
float dist = Math::abs(A_plane.distance_to(point));
if (
- dist>p_portal->portal_info->portal->connect_range ||
- dist>B->portal_info->portal->connect_range ) {
- valid=false;
- break;
- }
-
+ dist > p_portal->portal_info->portal->connect_range ||
+ dist > B->portal_info->portal->connect_range) {
+ valid = false;
+ break;
+ }
Vector3 point_local = affine_inverse.xform(A_plane.project(point));
- point2 = Point2(point_local.x,point_local.y);
+ point2 = Point2(point_local.x, point_local.y);
- if (i==0)
- local_bounds.pos=point2;
+ if (i == 0)
+ local_bounds.pos = point2;
else
local_bounds.expand_to(point2);
-
-
}
if (!valid)
continue;
float B_surface = B->portal_info->portal->bounds.get_area();
- if (B_surface==0)
+ if (B_surface == 0)
continue; //wtf
float clip_area = p_portal->portal_info->portal->bounds.clip(local_bounds).get_area();
-
//check that most of the area is shared
- if ( (clip_area/A_surface) < 0.5 || (clip_area/B_surface) < 0.5) // TODO change for something else
+ if ((clip_area / A_surface) < 0.5 || (clip_area / B_surface) < 0.5) // TODO change for something else
continue;
- found=B;
+ found = B;
break;
-
-
-
}
-
if (!found) {
if (p_portal->room && p_portal->room->room) {
@@ -5860,21 +5397,19 @@ void VisualServerRaster::_portal_attempt_connect(Instance *p_portal) {
return;
}
- p_portal->portal_info->connected=found;
- found->portal_info->connected=p_portal;
-
-
+ p_portal->portal_info->connected = found;
+ found->portal_info->connected = p_portal;
}
-void* VisualServerRaster::instance_pair(void *p_self, OctreeElementID, Instance *p_A,int, OctreeElementID, Instance *p_B,int) {
+void *VisualServerRaster::instance_pair(void *p_self, OctreeElementID, Instance *p_A, int, OctreeElementID, Instance *p_B, int) {
- VisualServerRaster *self = (VisualServerRaster*)p_self;
+ VisualServerRaster *self = (VisualServerRaster *)p_self;
Instance *A = p_A;
Instance *B = p_B;
- if (A->base_type==INSTANCE_PORTAL) {
+ if (A->base_type == INSTANCE_PORTAL) {
- ERR_FAIL_COND_V( B->base_type!=INSTANCE_PORTAL,NULL );
+ ERR_FAIL_COND_V(B->base_type != INSTANCE_PORTAL, NULL);
A->portal_info->candidate_set.insert(B);
B->portal_info->candidate_set.insert(A);
@@ -5883,56 +5418,52 @@ void* VisualServerRaster::instance_pair(void *p_self, OctreeElementID, Instance
//attempt to conncet portal A (will go through B anyway)
//this is a little hackish, but works fine in practice
- } else if (A->base_type==INSTANCE_BAKED_LIGHT || B->base_type==INSTANCE_BAKED_LIGHT) {
+ } else if (A->base_type == INSTANCE_BAKED_LIGHT || B->base_type == INSTANCE_BAKED_LIGHT) {
- if (B->base_type==INSTANCE_BAKED_LIGHT) {
- SWAP(A,B);
+ if (B->base_type == INSTANCE_BAKED_LIGHT) {
+ SWAP(A, B);
}
- ERR_FAIL_COND_V(B->base_type!=INSTANCE_BAKED_LIGHT_SAMPLER,NULL);
+ ERR_FAIL_COND_V(B->base_type != INSTANCE_BAKED_LIGHT_SAMPLER, NULL);
B->baked_light_sampler_info->baked_lights.insert(A);
- } else if (A->base_type==INSTANCE_ROOM || B->base_type==INSTANCE_ROOM) {
+ } else if (A->base_type == INSTANCE_ROOM || B->base_type == INSTANCE_ROOM) {
- if (B->base_type==INSTANCE_ROOM)
- SWAP(A,B);
+ if (B->base_type == INSTANCE_ROOM)
+ SWAP(A, B);
- ERR_FAIL_COND_V(! ((1<<B->base_type)&INSTANCE_GEOMETRY_MASK ),NULL);
+ ERR_FAIL_COND_V(!((1 << B->base_type) & INSTANCE_GEOMETRY_MASK), NULL);
B->auto_rooms.insert(A);
A->room_info->owned_autoroom_geometry.insert(B);
self->_instance_validate_autorooms(B);
-
} else {
- if (B->base_type==INSTANCE_LIGHT) {
+ if (B->base_type == INSTANCE_LIGHT) {
- SWAP(A,B);
- } else if (A->base_type!=INSTANCE_LIGHT) {
+ SWAP(A, B);
+ } else if (A->base_type != INSTANCE_LIGHT) {
return NULL;
}
-
A->light_info->affected.insert(B);
B->lights.insert(A);
- B->light_cache_dirty=true;
+ B->light_cache_dirty = true;
}
return NULL;
-
}
-void VisualServerRaster::instance_unpair(void *p_self, OctreeElementID, Instance *p_A,int, OctreeElementID, Instance *p_B,int,void*) {
+void VisualServerRaster::instance_unpair(void *p_self, OctreeElementID, Instance *p_A, int, OctreeElementID, Instance *p_B, int, void *) {
- VisualServerRaster *self = (VisualServerRaster*)p_self;
+ VisualServerRaster *self = (VisualServerRaster *)p_self;
Instance *A = p_A;
Instance *B = p_B;
- if (A->base_type==INSTANCE_PORTAL) {
-
- ERR_FAIL_COND( B->base_type!=INSTANCE_PORTAL );
+ if (A->base_type == INSTANCE_PORTAL) {
+ ERR_FAIL_COND(B->base_type != INSTANCE_PORTAL);
A->portal_info->candidate_set.erase(B);
B->portal_info->candidate_set.erase(A);
@@ -5941,90 +5472,84 @@ void VisualServerRaster::instance_unpair(void *p_self, OctreeElementID, Instance
self->_portal_attempt_connect(A);
self->_portal_attempt_connect(B);
- } else if (A->base_type==INSTANCE_BAKED_LIGHT || B->base_type==INSTANCE_BAKED_LIGHT) {
+ } else if (A->base_type == INSTANCE_BAKED_LIGHT || B->base_type == INSTANCE_BAKED_LIGHT) {
- if (B->base_type==INSTANCE_BAKED_LIGHT) {
- SWAP(A,B);
+ if (B->base_type == INSTANCE_BAKED_LIGHT) {
+ SWAP(A, B);
}
- ERR_FAIL_COND(B->base_type!=INSTANCE_BAKED_LIGHT_SAMPLER);
+ ERR_FAIL_COND(B->base_type != INSTANCE_BAKED_LIGHT_SAMPLER);
B->baked_light_sampler_info->baked_lights.erase(A);
- } else if (A->base_type==INSTANCE_ROOM || B->base_type==INSTANCE_ROOM) {
+ } else if (A->base_type == INSTANCE_ROOM || B->base_type == INSTANCE_ROOM) {
- if (B->base_type==INSTANCE_ROOM)
- SWAP(A,B);
+ if (B->base_type == INSTANCE_ROOM)
+ SWAP(A, B);
- ERR_FAIL_COND(! ((1<<B->base_type)&INSTANCE_GEOMETRY_MASK ));
+ ERR_FAIL_COND(!((1 << B->base_type) & INSTANCE_GEOMETRY_MASK));
B->auto_rooms.erase(A);
B->valid_auto_rooms.erase(A);
A->room_info->owned_autoroom_geometry.erase(B);
- }else {
-
+ } else {
- if (B->base_type==INSTANCE_LIGHT) {
+ if (B->base_type == INSTANCE_LIGHT) {
- SWAP(A,B);
- } else if (A->base_type!=INSTANCE_LIGHT) {
+ SWAP(A, B);
+ } else if (A->base_type != INSTANCE_LIGHT) {
return;
}
-
A->light_info->affected.erase(B);
B->lights.erase(A);
- B->light_cache_dirty=true;
+ B->light_cache_dirty = true;
}
}
bool VisualServerRaster::_test_portal_cull(Camera *p_camera, Instance *p_from_portal, Instance *p_to_portal) {
+ int src_point_count = p_from_portal->portal_info->transformed_point_cache.size();
+ int dst_point_count = p_to_portal->portal_info->transformed_point_cache.size();
- int src_point_count=p_from_portal->portal_info->transformed_point_cache.size();
- int dst_point_count=p_to_portal->portal_info->transformed_point_cache.size();
-
- if (src_point_count<2 || dst_point_count<2)
+ if (src_point_count < 2 || dst_point_count < 2)
return false;
- const Vector3 *src_points=&p_from_portal->portal_info->transformed_point_cache[0];
- const Vector3 *dst_points=&p_to_portal->portal_info->transformed_point_cache[0];
+ const Vector3 *src_points = &p_from_portal->portal_info->transformed_point_cache[0];
+ const Vector3 *dst_points = &p_to_portal->portal_info->transformed_point_cache[0];
- bool outside=false;
+ bool outside = false;
bool clockwise = !p_from_portal->portal_info->plane_cache.is_point_over(p_camera->transform.origin);
- for(int i=0;i<src_point_count;i++) {
+ for (int i = 0; i < src_point_count; i++) {
- const Vector3& point_prev = src_points[i?(i-1):(src_point_count-1)];
- const Vector3& point = src_points[i];
+ const Vector3 &point_prev = src_points[i ? (i - 1) : (src_point_count - 1)];
+ const Vector3 &point = src_points[i];
- Plane p = clockwise?Plane(p_camera->transform.origin,point,point_prev):Plane(p_camera->transform.origin,point_prev,point);
+ Plane p = clockwise ? Plane(p_camera->transform.origin, point, point_prev) : Plane(p_camera->transform.origin, point_prev, point);
- bool all_over=true;
+ bool all_over = true;
- for(int j=0;j<dst_point_count;j++) {
+ for (int j = 0; j < dst_point_count; j++) {
if (!p.is_point_over(dst_points[j])) {
- all_over=false;
+ all_over = false;
break;
}
-
}
if (all_over) {
- outside=true;
+ outside = true;
break;
}
-
}
return !outside;
-
}
-void VisualServerRaster::_cull_portal(Camera *p_camera, Instance *p_portal,Instance *p_from_portal) {
+void VisualServerRaster::_cull_portal(Camera *p_camera, Instance *p_portal, Instance *p_from_portal) {
ERR_FAIL_COND(!p_portal->scenario); //scenario outside
@@ -6033,13 +5558,13 @@ void VisualServerRaster::_cull_portal(Camera *p_camera, Instance *p_portal,Insta
if (!portal->room) {
return; //portals need all to belong to a room, it may be unconfigured yet
- } else if (portal->last_render_pass!=render_pass) {
+ } else if (portal->last_render_pass != render_pass) {
return; //invalid portal, ignore
- } else if (portal->portal_info->last_visited_pass==render_pass) {
+ } else if (portal->portal_info->last_visited_pass == render_pass) {
return; //portal already visited
- } else if (portal==p_from_portal) {
+ } else if (portal == p_from_portal) {
return; // came from this portal, don't even bother testing
}
@@ -6058,7 +5583,6 @@ void VisualServerRaster::_cull_portal(Camera *p_camera, Instance *p_portal,Insta
/* TEST PORTAL NOT FACING OPTIMIZATION */
-
if (p_portal->portal_info->connected) {
//connected portal means, it must face against the camera to be seen
if (p_portal->portal_info->plane_cache.is_point_over(p_camera->transform.origin)) { //portal facing against camera (exterior)
@@ -6077,7 +5601,7 @@ void VisualServerRaster::_cull_portal(Camera *p_camera, Instance *p_portal,Insta
return; // portal not visible (culled)
}
- portal->portal_info->last_visited_pass=render_pass;
+ portal->portal_info->last_visited_pass = render_pass;
if (portal->portal_info->connected) {
@@ -6096,94 +5620,80 @@ void VisualServerRaster::_cull_portal(Camera *p_camera, Instance *p_portal,Insta
_cull_room(p_camera, parent_room, portal);
}
-
}
-void VisualServerRaster::_cull_room(Camera *p_camera, Instance *p_room,Instance *p_from_portal) {
+void VisualServerRaster::_cull_room(Camera *p_camera, Instance *p_room, Instance *p_from_portal) {
- if (p_room==NULL) {
+ if (p_room == NULL) {
//exterior
- exterior_visited=true;
+ exterior_visited = true;
- for(int i=0;i<exterior_portal_cull_count;i++) {
+ for (int i = 0; i < exterior_portal_cull_count; i++) {
- _cull_portal(p_camera, exterior_portal_cull_result[i],p_from_portal);
+ _cull_portal(p_camera, exterior_portal_cull_result[i], p_from_portal);
}
} else {
ERR_FAIL_COND(!p_room->scenario);
- if (p_room->last_render_pass!=render_pass)
+ if (p_room->last_render_pass != render_pass)
return; //this room is invalid
//interior
//first of all, validate the room
- p_room->room_info->last_visited_pass=render_pass;
+ p_room->room_info->last_visited_pass = render_pass;
//see about going around portals
if (!p_room->room_info->room->occlude_exterior)
- exterior_visited=true;
-
- for(List<Instance*>::Element * E=p_room->room_info->owned_portal_instances.front();E;E=E->next()) {
+ exterior_visited = true;
- _cull_portal(p_camera, E->get(),p_from_portal);
+ for (List<Instance *>::Element *E = p_room->room_info->owned_portal_instances.front(); E; E = E->next()) {
+ _cull_portal(p_camera, E->get(), p_from_portal);
}
- for(Set<Instance*>::Element * E=p_room->room_info->disconnected_child_portals.front();E;E=E->next()) {
-
- _cull_portal(p_camera, E->get(),p_from_portal);
+ for (Set<Instance *>::Element *E = p_room->room_info->disconnected_child_portals.front(); E; E = E->next()) {
+ _cull_portal(p_camera, E->get(), p_from_portal);
}
-
-
}
-
}
-void VisualServerRaster::_process_sampled_light(const Transform& p_camera,Instance *p_sampled_light,bool p_linear_colorspace) {
-
+void VisualServerRaster::_process_sampled_light(const Transform &p_camera, Instance *p_sampled_light, bool p_linear_colorspace) {
BakedLightSampler *sampler_opts = p_sampled_light->baked_light_sampler_info->sampler;
int res = sampler_opts->resolution;
- int dp_size = res*res*2;
- Color * dp_map = (Color*)alloca( sizeof(Color)*dp_size); //allocate the dual parabolloid colors
- Vector3 * dp_normals = (Vector3*)alloca( sizeof(Vector3)*dp_size); //allocate the dual parabolloid normals
- const Vector3 * dp_src_normals = p_sampled_light->baked_light_sampler_info->sampler->dp_cache.ptr();
-
+ int dp_size = res * res * 2;
+ Color *dp_map = (Color *)alloca(sizeof(Color) * dp_size); //allocate the dual parabolloid colors
+ Vector3 *dp_normals = (Vector3 *)alloca(sizeof(Vector3) * dp_size); //allocate the dual parabolloid normals
+ const Vector3 *dp_src_normals = p_sampled_light->baked_light_sampler_info->sampler->dp_cache.ptr();
- if (!p_sampled_light->baked_light_sampler_info->sampled_light.is_valid() || p_sampled_light->baked_light_sampler_info->resolution!=sampler_opts->resolution) {
+ if (!p_sampled_light->baked_light_sampler_info->sampled_light.is_valid() || p_sampled_light->baked_light_sampler_info->resolution != sampler_opts->resolution) {
if (p_sampled_light->baked_light_sampler_info->sampled_light.is_valid()) {
rasterizer->free(p_sampled_light->baked_light_sampler_info->sampled_light);
}
- p_sampled_light->baked_light_sampler_info->resolution=sampler_opts->resolution;
- p_sampled_light->baked_light_sampler_info->sampled_light=rasterizer->sampled_light_dp_create(sampler_opts->resolution,sampler_opts->resolution*2);
-
-
+ p_sampled_light->baked_light_sampler_info->resolution = sampler_opts->resolution;
+ p_sampled_light->baked_light_sampler_info->sampled_light = rasterizer->sampled_light_dp_create(sampler_opts->resolution, sampler_opts->resolution * 2);
}
+ zeromem(dp_map, sizeof(Color) * dp_size);
+ bool valid = false;
+ int samples = 0;
- zeromem(dp_map,sizeof(Color)*dp_size);
- bool valid=false;
- int samples=0;
-
-
- for(Set<Instance*>::Element *E=p_sampled_light->baked_light_sampler_info->baked_lights.front();E;E=E->next()) {
+ for (Set<Instance *>::Element *E = p_sampled_light->baked_light_sampler_info->baked_lights.front(); E; E = E->next()) {
Instance *bl = E->get();
- if (bl->baked_light_info->baked_light->sampler.size()==0)
+ if (bl->baked_light_info->baked_light->sampler.size() == 0)
continue; //not usable
-
- Matrix3 norm_xform = bl->baked_light_info->affine_inverse.basis;//.inverse();
- for(int i=0;i<dp_size;i++) {
- dp_normals[i]=norm_xform.xform(dp_src_normals[i]).normalized();
+ Matrix3 norm_xform = bl->baked_light_info->affine_inverse.basis; //.inverse();
+ for (int i = 0; i < dp_size; i++) {
+ dp_normals[i] = norm_xform.xform(dp_src_normals[i]).normalized();
}
//normals in place
-
//sample octree
float r = sampler_opts->params[VS::BAKED_LIGHT_SAMPLER_RADIUS];
@@ -6191,8 +5701,8 @@ void VisualServerRaster::_process_sampled_light(const Transform& p_camera,Instan
float str = sampler_opts->params[VS::BAKED_LIGHT_SAMPLER_STRENGTH];
Vector3 s = p_sampled_light->data.transform.basis.get_scale();
- r*=MAX(MAX(s.x,s.y),s.z);
- AABB sample_aabb= bl->data.transform.affine_inverse().xform(AABB(Vector3(-r,-r,-r)+p_sampled_light->data.transform.origin,Vector3(r*2,r*2,r*2)));
+ r *= MAX(MAX(s.x, s.y), s.z);
+ AABB sample_aabb = bl->data.transform.affine_inverse().xform(AABB(Vector3(-r, -r, -r) + p_sampled_light->data.transform.origin, Vector3(r * 2, r * 2, r * 2)));
//ok got octree local AABB
DVector<int>::Read rp = bl->baked_light_info->baked_light->sampler.read();
@@ -6200,230 +5710,209 @@ void VisualServerRaster::_process_sampled_light(const Transform& p_camera,Instan
int first = rptr[1];
int depth = rptr[2];
- bool islinear = rptr[3]&1;
- depth+=1;
+ bool islinear = rptr[3] & 1;
+ depth += 1;
AABB aabb;
- aabb.pos.x=decode_float((const uint8_t*)&rptr[4]);
- aabb.pos.y=decode_float((const uint8_t*)&rptr[5]);
- aabb.pos.z=decode_float((const uint8_t*)&rptr[6]);
- aabb.size.x=decode_float((const uint8_t*)&rptr[7]);
- aabb.size.y=decode_float((const uint8_t*)&rptr[8]);
- aabb.size.z=decode_float((const uint8_t*)&rptr[9]);
+ aabb.pos.x = decode_float((const uint8_t *)&rptr[4]);
+ aabb.pos.y = decode_float((const uint8_t *)&rptr[5]);
+ aabb.pos.z = decode_float((const uint8_t *)&rptr[6]);
+ aabb.size.x = decode_float((const uint8_t *)&rptr[7]);
+ aabb.size.y = decode_float((const uint8_t *)&rptr[8]);
+ aabb.size.z = decode_float((const uint8_t *)&rptr[9]);
- uint32_t *stack=(uint32_t*)alloca(depth*sizeof(uint32_t));
- int *stack_ptr=(int*)alloca(depth*sizeof(int));
- AABB *aabb_stack=(AABB*)alloca(depth*sizeof(AABB));
+ uint32_t *stack = (uint32_t *)alloca(depth * sizeof(uint32_t));
+ int *stack_ptr = (int *)alloca(depth * sizeof(int));
+ AABB *aabb_stack = (AABB *)alloca(depth * sizeof(AABB));
- stack[0]=0;
- stack_ptr[0]=first;
- aabb_stack[0]=aabb;
+ stack[0] = 0;
+ stack_ptr[0] = first;
+ aabb_stack[0] = aabb;
Vector3 center = sample_aabb.pos + sample_aabb.size * 0.5;
-
- int stack_pos=0;
+ int stack_pos = 0;
Color max_col;
//int reso = sampler_opts->params[VS::BAKED_LIGHT_SAMPLER_DETAIL_RATIO];
int lalimit = sample_aabb.get_longest_axis_index();
- float limit = sampler_opts->params[VS::BAKED_LIGHT_SAMPLER_DETAIL_RATIO]*sample_aabb.size[lalimit];
-
+ float limit = sampler_opts->params[VS::BAKED_LIGHT_SAMPLER_DETAIL_RATIO] * sample_aabb.size[lalimit];
- while(true) {
+ while (true) {
+ bool leaf = (rptr[stack_ptr[stack_pos]] >> 16) == 0;
- bool leaf = (rptr[ stack_ptr[stack_pos] ]>>16)==0;
-
- if (aabb_stack[stack_pos].size[lalimit]<limit) {
- leaf=true;
+ if (aabb_stack[stack_pos].size[lalimit] < limit) {
+ leaf = true;
}
-
if (leaf) {
Vector3 from = aabb_stack[stack_pos].pos + aabb_stack[stack_pos].size * 0.5;
- Vector3 norm = (from-center).normalized();
-
+ Vector3 norm = (from - center).normalized();
Color col;
- col.r = ((rptr[ stack_ptr[stack_pos] ]&0xFFFF)/256.0);
- col.g = ((rptr[ stack_ptr[stack_pos]+1 ]>>16)/256.0);
- col.b = ((rptr[ stack_ptr[stack_pos]+1 ]&0xFFFF)/256.0);
+ col.r = ((rptr[stack_ptr[stack_pos]] & 0xFFFF) / 256.0);
+ col.g = ((rptr[stack_ptr[stack_pos] + 1] >> 16) / 256.0);
+ col.b = ((rptr[stack_ptr[stack_pos] + 1] & 0xFFFF) / 256.0);
-
- max_col.r = MAX(max_col.r,col.r);
- max_col.g = MAX(max_col.g,col.g);
- max_col.b = MAX(max_col.b,col.b);
+ max_col.r = MAX(max_col.r, col.r);
+ max_col.g = MAX(max_col.g, col.g);
+ max_col.b = MAX(max_col.b, col.b);
if (!islinear && p_linear_colorspace) {
- col=col.to_linear();
+ col = col.to_linear();
}
float distance;
if (aabb_stack[stack_pos].has_point(center)) {
- distance=0;
+ distance = 0;
} else {
Vector3 support = aabb_stack[stack_pos].get_support(norm);
- distance = Math::absf(norm.dot(support)-norm.dot(center));
-
+ distance = Math::absf(norm.dot(support) - norm.dot(center));
}
- if (distance>r)
- distance=r;
-
- float mult = Math::pow(1.0-distance/r,att)*str;
- if (mult>0) {
- col.r*=mult;
- col.g*=mult;
- col.b*=mult;
+ if (distance > r)
+ distance = r;
+ float mult = Math::pow(1.0 - distance / r, att) * str;
+ if (mult > 0) {
+ col.r *= mult;
+ col.g *= mult;
+ col.b *= mult;
-
- for(int i=0;i<dp_size;i++) {
+ for (int i = 0; i < dp_size; i++) {
float mult2 = norm.dot(dp_normals[i]);
- if (mult2<0)
- mult2=0;
- Color col2(col.r*mult2,col.g*mult2,col.b*mult2,1.0);
- dp_map[i].r=MAX(dp_map[i].r,col2.r);
- dp_map[i].g=MAX(dp_map[i].g,col2.g);
- dp_map[i].b=MAX(dp_map[i].b,col2.b);
+ if (mult2 < 0)
+ mult2 = 0;
+ Color col2(col.r * mult2, col.g * mult2, col.b * mult2, 1.0);
+ dp_map[i].r = MAX(dp_map[i].r, col2.r);
+ dp_map[i].g = MAX(dp_map[i].g, col2.g);
+ dp_map[i].b = MAX(dp_map[i].b, col2.b);
}
-
}
samples++;
//nothing is valid unless you hit a leaf
- valid=true;
+ valid = true;
stack_pos--;
- } else if ((stack[stack_pos]&0xFF)<8) {
+ } else if ((stack[stack_pos] & 0xFF) < 8) {
- int i = stack[stack_pos]&0xFF;
- int base = (stack[stack_pos]>>8);
+ int i = stack[stack_pos] & 0xFF;
+ int base = (stack[stack_pos] >> 8);
- if (!((rptr[ stack_ptr[stack_pos] ]>>16)&(1<<i))) {
+ if (!((rptr[stack_ptr[stack_pos]] >> 16) & (1 << i))) {
//no bit, no test
- stack[stack_pos]=(base<<8)+(i+1);
+ stack[stack_pos] = (base << 8) + (i + 1);
continue;
}
- stack[stack_pos]=((base+1)<<8)+(i+1);
+ stack[stack_pos] = ((base + 1) << 8) + (i + 1);
AABB child_aabb = aabb_stack[stack_pos];
- child_aabb.size*=0.5;
- if (i&1)
- child_aabb.pos.x+=child_aabb.size.x;
- if (i&2)
- child_aabb.pos.y+=child_aabb.size.y;
- if (i&4)
- child_aabb.pos.z+=child_aabb.size.z;
+ child_aabb.size *= 0.5;
+ if (i & 1)
+ child_aabb.pos.x += child_aabb.size.x;
+ if (i & 2)
+ child_aabb.pos.y += child_aabb.size.y;
+ if (i & 4)
+ child_aabb.pos.z += child_aabb.size.z;
if (!child_aabb.intersects(sample_aabb)) {
continue;
}
if (child_aabb.encloses(sample_aabb)) {
- stack[stack_pos]=(base<<8)|8; //don't test the rest
+ stack[stack_pos] = (base << 8) | 8; //don't test the rest
}
stack_pos++;
- ERR_FAIL_COND(stack_pos>=depth);
+ ERR_FAIL_COND(stack_pos >= depth);
- stack[stack_pos]=0;
- stack_ptr[stack_pos]=rptr[ stack_ptr[stack_pos-1]+2+base ];
- aabb_stack[stack_pos]=child_aabb;
+ stack[stack_pos] = 0;
+ stack_ptr[stack_pos] = rptr[stack_ptr[stack_pos - 1] + 2 + base];
+ aabb_stack[stack_pos] = child_aabb;
} else {
stack_pos--;
- if (stack_pos<0)
+ if (stack_pos < 0)
break;
}
}
-
-
}
//print_line("samples "+itos(samples) );
if (valid) {
- for(int i=0;i<res;i++) {
+ for (int i = 0; i < res; i++) {
//average seams to avoid aliasing
{
//top
int ofs1 = i;
- int ofs2 = dp_size-res+i;
+ int ofs2 = dp_size - res + i;
Color avg(
- (dp_map[ofs1].r+dp_map[ofs2].r)*0.5,
- (dp_map[ofs1].g+dp_map[ofs2].g)*0.5,
- (dp_map[ofs1].b+dp_map[ofs2].b)*0.5,
- 1.0
- );
- dp_map[ofs1]=avg;
- dp_map[ofs2]=avg;
+ (dp_map[ofs1].r + dp_map[ofs2].r) * 0.5,
+ (dp_map[ofs1].g + dp_map[ofs2].g) * 0.5,
+ (dp_map[ofs1].b + dp_map[ofs2].b) * 0.5,
+ 1.0);
+ dp_map[ofs1] = avg;
+ dp_map[ofs2] = avg;
}
{
//bottom
- int ofs1 = res*res-res+i;
- int ofs2 = res*res+i;
+ int ofs1 = res * res - res + i;
+ int ofs2 = res * res + i;
Color avg(
- (dp_map[ofs1].r+dp_map[ofs2].r)*0.5,
- (dp_map[ofs1].g+dp_map[ofs2].g)*0.5,
- (dp_map[ofs1].b+dp_map[ofs2].b)*0.5,
- 1.0
- );
- dp_map[ofs1]=avg;
- dp_map[ofs2]=avg;
+ (dp_map[ofs1].r + dp_map[ofs2].r) * 0.5,
+ (dp_map[ofs1].g + dp_map[ofs2].g) * 0.5,
+ (dp_map[ofs1].b + dp_map[ofs2].b) * 0.5,
+ 1.0);
+ dp_map[ofs1] = avg;
+ dp_map[ofs2] = avg;
}
{
//left
- int ofs1 = i*res;
- int ofs2 = res*res+(res-i-1)*res;
+ int ofs1 = i * res;
+ int ofs2 = res * res + (res - i - 1) * res;
Color avg(
- (dp_map[ofs1].r+dp_map[ofs2].r)*0.5,
- (dp_map[ofs1].g+dp_map[ofs2].g)*0.5,
- (dp_map[ofs1].b+dp_map[ofs2].b)*0.5,
- 1.0
- );
- dp_map[ofs1]=avg;
- dp_map[ofs2]=avg;
+ (dp_map[ofs1].r + dp_map[ofs2].r) * 0.5,
+ (dp_map[ofs1].g + dp_map[ofs2].g) * 0.5,
+ (dp_map[ofs1].b + dp_map[ofs2].b) * 0.5,
+ 1.0);
+ dp_map[ofs1] = avg;
+ dp_map[ofs2] = avg;
}
{
//right
- int ofs1 = i*res+(res-1);
- int ofs2 = res*res+(res-i-1)*res+(res-1);
+ int ofs1 = i * res + (res - 1);
+ int ofs2 = res * res + (res - i - 1) * res + (res - 1);
Color avg(
- (dp_map[ofs1].r+dp_map[ofs2].r)*0.5,
- (dp_map[ofs1].g+dp_map[ofs2].g)*0.5,
- (dp_map[ofs1].b+dp_map[ofs2].b)*0.5,
- 1.0
- );
- dp_map[ofs1]=avg;
- dp_map[ofs2]=avg;
+ (dp_map[ofs1].r + dp_map[ofs2].r) * 0.5,
+ (dp_map[ofs1].g + dp_map[ofs2].g) * 0.5,
+ (dp_map[ofs1].b + dp_map[ofs2].b) * 0.5,
+ 1.0);
+ dp_map[ofs1] = avg;
+ dp_map[ofs2] = avg;
}
-
}
- rasterizer->sampled_light_dp_update(p_sampled_light->baked_light_sampler_info->sampled_light,dp_map,1.0);
- for(Set<Instance*>::Element *F=p_sampled_light->baked_light_sampler_info->owned_instances.front();F;F=F->next()) {
+ rasterizer->sampled_light_dp_update(p_sampled_light->baked_light_sampler_info->sampled_light, dp_map, 1.0);
+ for (Set<Instance *>::Element *F = p_sampled_light->baked_light_sampler_info->owned_instances.front(); F; F = F->next()) {
- F->get()->data.sampled_light=p_sampled_light->baked_light_sampler_info->sampled_light;
+ F->get()->data.sampled_light = p_sampled_light->baked_light_sampler_info->sampled_light;
}
-
} else {
- for(Set<Instance*>::Element *F=p_sampled_light->baked_light_sampler_info->owned_instances.front();F;F=F->next()) {
+ for (Set<Instance *>::Element *F = p_sampled_light->baked_light_sampler_info->owned_instances.front(); F; F = F->next()) {
- F->get()->data.sampled_light=RID(); //do not use because nothing close
+ F->get()->data.sampled_light = RID(); //do not use because nothing close
}
}
-
-
-
-/*
+ /*
highp vec3 vtx = vertex_interp;
vtx.z*=dual_paraboloid.y; //side to affect
vtx.z+=0.01;
@@ -6436,83 +5925,75 @@ void VisualServerRaster::_process_sampled_light(const Transform& p_camera,Instan
vtx.z = vtx.z * 2.0 - 1.0; // fit to clipspace
vertex_interp=vtx;
*/
-
-
-
-
}
-
-void VisualServerRaster::_render_no_camera(Viewport *p_viewport,Camera *p_camera, Scenario *p_scenario) {
+void VisualServerRaster::_render_no_camera(Viewport *p_viewport, Camera *p_camera, Scenario *p_scenario) {
RID environment;
if (p_scenario->environment.is_valid())
- environment=p_scenario->environment;
+ environment = p_scenario->environment;
else
- environment=p_scenario->fallback_environment;
+ environment = p_scenario->fallback_environment;
- rasterizer->set_camera(Transform(),CameraMatrix(),false);
- rasterizer->begin_scene(p_viewport->viewport_data,environment,p_scenario->debug);
+ rasterizer->set_camera(Transform(), CameraMatrix(), false);
+ rasterizer->begin_scene(p_viewport->viewport_data, environment, p_scenario->debug);
rasterizer->set_viewport(viewport_rect);
rasterizer->end_scene();
}
-
-void VisualServerRaster::_render_camera(Viewport *p_viewport,Camera *p_camera, Scenario *p_scenario) {
-
+void VisualServerRaster::_render_camera(Viewport *p_viewport, Camera *p_camera, Scenario *p_scenario) {
render_pass++;
- uint32_t camera_layer_mask=p_camera->visible_layers;
+ uint32_t camera_layer_mask = p_camera->visible_layers;
/* STEP 1 - SETUP CAMERA */
CameraMatrix camera_matrix;
- bool ortho=false;
+ bool ortho = false;
- switch(p_camera->type) {
+ switch (p_camera->type) {
case Camera::ORTHOGONAL: {
camera_matrix.set_orthogonal(
- p_camera->size,
- viewport_rect.width / (float)viewport_rect.height,
- p_camera->znear,
- p_camera->zfar,
- p_camera->vaspect
+ p_camera->size,
+ viewport_rect.width / (float)viewport_rect.height,
+ p_camera->znear,
+ p_camera->zfar,
+ p_camera->vaspect
- );
- ortho=true;
+ );
+ ortho = true;
} break;
case Camera::PERSPECTIVE: {
camera_matrix.set_perspective(
- p_camera->fov,
- viewport_rect.width / (float)viewport_rect.height,
- p_camera->znear,
- p_camera->zfar,
- p_camera->vaspect
+ p_camera->fov,
+ viewport_rect.width / (float)viewport_rect.height,
+ p_camera->znear,
+ p_camera->zfar,
+ p_camera->vaspect
- );
- ortho=false;
+ );
+ ortho = false;
} break;
}
-
- rasterizer->set_camera(p_camera->transform, camera_matrix,ortho);
+ rasterizer->set_camera(p_camera->transform, camera_matrix, ortho);
Vector<Plane> planes = camera_matrix.get_projection_planes(p_camera->transform);
CullRange cull_range; // cull range is used for PSSM, and having an idea of the rendering depth
- cull_range.nearp=Plane(p_camera->transform.origin,-p_camera->transform.basis.get_axis(2).normalized());
- cull_range.z_near=camera_matrix.get_z_near();
- cull_range.z_far=camera_matrix.get_z_far();
- cull_range.min=cull_range.z_far;
- cull_range.max=cull_range.z_near;
+ cull_range.nearp = Plane(p_camera->transform.origin, -p_camera->transform.basis.get_axis(2).normalized());
+ cull_range.z_near = camera_matrix.get_z_near();
+ cull_range.z_far = camera_matrix.get_z_far();
+ cull_range.min = cull_range.z_far;
+ cull_range.max = cull_range.z_near;
/* STEP 2 - CULL */
- int cull_count = p_scenario->octree.cull_convex(planes,instance_cull_result,MAX_INSTANCE_CULL);
- light_cull_count=0;
- light_samplers_culled=0;
+ int cull_count = p_scenario->octree.cull_convex(planes, instance_cull_result, MAX_INSTANCE_CULL);
+ light_cull_count = 0;
+ light_samplers_culled = 0;
-/* print_line("OT: "+rtos( (OS::get_singleton()->get_ticks_usec()-t)/1000.0));
+ /* print_line("OT: "+rtos( (OS::get_singleton()->get_ticks_usec()-t)/1000.0));
print_line("OTO: "+itos(p_scenario->octree.get_octant_count()));
// print_line("OTE: "+itos(p_scenario->octree.get_elem_count()));
print_line("OTP: "+itos(p_scenario->octree.get_pair_count()));
@@ -6520,58 +6001,55 @@ void VisualServerRaster::_render_camera(Viewport *p_viewport,Camera *p_camera, S
/* STEP 3 - PROCESS PORTALS, VALIDATE ROOMS */
-
// compute portals
- exterior_visited=false;
- exterior_portal_cull_count=0;
+ exterior_visited = false;
+ exterior_portal_cull_count = 0;
if (room_cull_enabled) {
- for(int i=0;i<cull_count;i++) {
+ for (int i = 0; i < cull_count; i++) {
Instance *ins = instance_cull_result[i];
- ins->last_render_pass=render_pass;
+ ins->last_render_pass = render_pass;
- if (ins->base_type!=INSTANCE_PORTAL)
+ if (ins->base_type != INSTANCE_PORTAL)
continue;
if (ins->room)
continue;
- ERR_CONTINUE(exterior_portal_cull_count>=MAX_EXTERIOR_PORTALS);
- exterior_portal_cull_result[exterior_portal_cull_count++]=ins;
-
+ ERR_CONTINUE(exterior_portal_cull_count >= MAX_EXTERIOR_PORTALS);
+ exterior_portal_cull_result[exterior_portal_cull_count++] = ins;
}
- room_cull_count = p_scenario->octree.cull_point(p_camera->transform.origin,room_cull_result,MAX_ROOM_CULL,NULL,(1<<INSTANCE_ROOM)|(1<<INSTANCE_PORTAL));
-
+ room_cull_count = p_scenario->octree.cull_point(p_camera->transform.origin, room_cull_result, MAX_ROOM_CULL, NULL, (1 << INSTANCE_ROOM) | (1 << INSTANCE_PORTAL));
- Set<Instance*> current_rooms;
- Set<Instance*> portal_rooms;
+ Set<Instance *> current_rooms;
+ Set<Instance *> portal_rooms;
//add to set
- for(int i=0;i<room_cull_count;i++) {
+ for (int i = 0; i < room_cull_count; i++) {
- if (room_cull_result[i]->base_type==INSTANCE_ROOM) {
+ if (room_cull_result[i]->base_type == INSTANCE_ROOM) {
current_rooms.insert(room_cull_result[i]);
}
- if (room_cull_result[i]->base_type==INSTANCE_PORTAL) {
+ if (room_cull_result[i]->base_type == INSTANCE_PORTAL) {
//assume inside that room if also inside the portal..
if (room_cull_result[i]->room) {
portal_rooms.insert(room_cull_result[i]->room);
}
- SWAP(room_cull_result[i],room_cull_result[room_cull_count-1]);
+ SWAP(room_cull_result[i], room_cull_result[room_cull_count - 1]);
room_cull_count--;
i--;
}
}
//remove from set if it has a parent room or BSP doesn't contain
- for(int i=0;i<room_cull_count;i++) {
+ for (int i = 0; i < room_cull_count; i++) {
Instance *r = room_cull_result[i];
//check inside BSP
- Vector3 room_local_point = r->room_info->affine_inverse.xform( p_camera->transform.origin );
+ Vector3 room_local_point = r->room_info->affine_inverse.xform(p_camera->transform.origin);
if (!portal_rooms.has(r) && !r->room_info->room->bounds.point_is_inside(room_local_point)) {
@@ -6580,66 +6058,60 @@ void VisualServerRaster::_render_camera(Viewport *p_viewport,Camera *p_camera, S
}
//check parent
- while (r->room) {// has parent room
+ while (r->room) { // has parent room
current_rooms.erase(r);
- r=r->room;
+ r = r->room;
}
-
}
if (current_rooms.size()) {
//camera is inside a room
// go through rooms
- for(Set<Instance*>::Element *E=current_rooms.front();E;E=E->next()) {
- _cull_room(p_camera,E->get());
+ for (Set<Instance *>::Element *E = current_rooms.front(); E; E = E->next()) {
+ _cull_room(p_camera, E->get());
}
} else {
//start from exterior
- _cull_room(p_camera,NULL);
-
+ _cull_room(p_camera, NULL);
}
}
/* STEP 4 - REMOVE FURTHER CULLED OBJECTS, ADD LIGHTS */
- for(int i=0;i<cull_count;i++) {
+ for (int i = 0; i < cull_count; i++) {
Instance *ins = instance_cull_result[i];
- bool keep=false;
-
+ bool keep = false;
- if ((camera_layer_mask&ins->layer_mask)==0) {
+ if ((camera_layer_mask & ins->layer_mask) == 0) {
//failure
- } else if (ins->base_type==INSTANCE_LIGHT) {
+ } else if (ins->base_type == INSTANCE_LIGHT) {
- if (light_cull_count<MAX_LIGHTS_CULLED) {
- light_cull_result[light_cull_count++]=ins;
-// rasterizer->light_instance_set_active_hint(ins->light_info->instance);
+ if (light_cull_count < MAX_LIGHTS_CULLED) {
+ light_cull_result[light_cull_count++] = ins;
+ // rasterizer->light_instance_set_active_hint(ins->light_info->instance);
{
//compute distance to camera using aabb support
Vector3 n = ins->data.transform.basis.xform_inv(cull_range.nearp.normal).normalized();
Vector3 s = ins->data.transform.xform(ins->aabb.get_support(n));
- ins->light_info->dtc=cull_range.nearp.distance_to(s);
+ ins->light_info->dtc = cull_range.nearp.distance_to(s);
}
}
- } else if ((1<<ins->base_type)&INSTANCE_GEOMETRY_MASK && ins->visible && ins->data.cast_shadows!=VS::SHADOW_CASTING_SETTING_SHADOWS_ONLY) {
-
+ } else if ((1 << ins->base_type) & INSTANCE_GEOMETRY_MASK && ins->visible && ins->data.cast_shadows != VS::SHADOW_CASTING_SETTING_SHADOWS_ONLY) {
- bool discarded=false;
+ bool discarded = false;
- if (ins->draw_range_end>0) {
+ if (ins->draw_range_end > 0) {
float d = cull_range.nearp.distance_to(ins->data.transform.origin);
- if (d<0)
- d=0;
- discarded=(d<ins->draw_range_begin || d>=ins->draw_range_end);
-
-
+ if (d < 0)
+ d = 0;
+ discarded = (d < ins->draw_range_begin || d >= ins->draw_range_end);
}
if (!discarded) {
@@ -6648,70 +6120,64 @@ void VisualServerRaster::_render_camera(Viewport *p_viewport,Camera *p_camera, S
if (room_cull_enabled) {
-
if (ins->visible_in_all_rooms) {
- keep=true;
+ keep = true;
} else if (ins->room) {
- if (ins->room->room_info->last_visited_pass==render_pass)
- keep=true;
+ if (ins->room->room_info->last_visited_pass == render_pass)
+ keep = true;
} else if (ins->auto_rooms.size()) {
+ for (Set<Instance *>::Element *E = ins->auto_rooms.front(); E; E = E->next()) {
- for(Set<Instance*>::Element *E=ins->auto_rooms.front();E;E=E->next()) {
-
- if (E->get()->room_info->last_visited_pass==render_pass) {
- keep=true;
+ if (E->get()->room_info->last_visited_pass == render_pass) {
+ keep = true;
break;
}
}
- } else if(exterior_visited)
- keep=true;
+ } else if (exterior_visited)
+ keep = true;
} else {
- keep=true;
+ keep = true;
}
-
-
}
-
if (keep) {
// update cull range
- float min,max;
- ins->transformed_aabb.project_range_in_plane(cull_range.nearp,min,max);
+ float min, max;
+ ins->transformed_aabb.project_range_in_plane(cull_range.nearp, min, max);
- if (min<cull_range.min)
- cull_range.min=min;
- if (max>cull_range.max)
- cull_range.max=max;
+ if (min < cull_range.min)
+ cull_range.min = min;
+ if (max > cull_range.max)
+ cull_range.max = max;
- if (ins->sampled_light && ins->sampled_light->baked_light_sampler_info->last_pass!=render_pass) {
- if (light_samplers_culled<MAX_LIGHT_SAMPLERS) {
- light_sampler_cull_result[light_samplers_culled++]=ins->sampled_light;
- ins->sampled_light->baked_light_sampler_info->last_pass=render_pass;
+ if (ins->sampled_light && ins->sampled_light->baked_light_sampler_info->last_pass != render_pass) {
+ if (light_samplers_culled < MAX_LIGHT_SAMPLERS) {
+ light_sampler_cull_result[light_samplers_culled++] = ins->sampled_light;
+ ins->sampled_light->baked_light_sampler_info->last_pass = render_pass;
}
}
}
-
}
if (!keep) {
// remove, no reason to keep
cull_count--;
- SWAP( instance_cull_result[i], instance_cull_result[ cull_count ] );
+ SWAP(instance_cull_result[i], instance_cull_result[cull_count]);
i--;
- ins->last_render_pass=0; // make invalid
+ ins->last_render_pass = 0; // make invalid
} else {
- ins->last_render_pass=render_pass;
+ ins->last_render_pass = render_pass;
}
}
- if (cull_range.max > cull_range.z_far )
- cull_range.max=cull_range.z_far;
- if (cull_range.min < cull_range.z_near )
- cull_range.min=cull_range.z_near;
+ if (cull_range.max > cull_range.z_far)
+ cull_range.max = cull_range.z_far;
+ if (cull_range.min < cull_range.z_near)
+ cull_range.min = cull_range.z_near;
/* STEP 5 - PROCESS LIGHTS */
@@ -6719,26 +6185,24 @@ void VisualServerRaster::_render_camera(Viewport *p_viewport,Camera *p_camera, S
// directional lights
{
- List<RID>::Element *E=p_scenario->directional_lights.front();
+ List<RID>::Element *E = p_scenario->directional_lights.front();
+ while (E) {
- while(E) {
-
- Instance *light = E->get().is_valid()?instance_owner.get(E->get()):NULL;
+ Instance *light = E->get().is_valid() ? instance_owner.get(E->get()) : NULL;
if (light && light->light_info->enabled && rasterizer->light_has_shadow(light->base_rid)) {
//rasterizer->light_instance_set_active_hint(light->light_info->instance);
- _light_instance_update_shadow(light,p_scenario,p_camera,cull_range);
+ _light_instance_update_shadow(light, p_scenario, p_camera, cull_range);
}
- E=E->next();
+ E = E->next();
}
}
-
//discard lights not affecting anything (useful for deferred rendering, shadowmaps, etc)
- for (int i=0;i<light_cull_count;i++) {
+ for (int i = 0; i < light_cull_count; i++) {
Instance *ins = light_cull_result[i];
@@ -6749,33 +6213,31 @@ void VisualServerRaster::_render_camera(Viewport *p_viewport,Camera *p_camera, S
//because of early out condition. It will only go through everything
//if it's being discarded.
- bool valid=false;
- InstanceSet::Element *E =ins->light_info->affected.front();
- while(E) {
+ bool valid = false;
+ InstanceSet::Element *E = ins->light_info->affected.front();
+ while (E) {
- if (E->get()->last_render_pass==render_pass) {
+ if (E->get()->last_render_pass == render_pass) {
- valid=true; // early out.
+ valid = true; // early out.
break;
}
- E=E->next();
+ E = E->next();
}
if (!valid) {
light_cull_count--;
- SWAP( light_cull_result[i], light_cull_result[ light_cull_count ] );
+ SWAP(light_cull_result[i], light_cull_result[light_cull_count]);
i--;
-
}
}
-
}
{ //this should eventually change to
//assign shadows by distance to camera
- SortArray<Instance*,_InstanceLightsort> sorter;
- sorter.sort(light_cull_result,light_cull_count);
- for (int i=0;i<light_cull_count;i++) {
+ SortArray<Instance *, _InstanceLightsort> sorter;
+ sorter.sort(light_cull_result, light_cull_count);
+ for (int i = 0; i < light_cull_count; i++) {
Instance *ins = light_cull_result[i];
@@ -6787,8 +6249,8 @@ void VisualServerRaster::_render_camera(Viewport *p_viewport,Camera *p_camera, S
continue; // didn't change
*/
- _light_instance_update_shadow(ins,p_scenario,p_camera,cull_range);
- ins->light_info->last_version=ins->version;
+ _light_instance_update_shadow(ins, p_scenario, p_camera, cull_range);
+ ins->light_info->last_version = ins->version;
}
}
@@ -6796,62 +6258,59 @@ void VisualServerRaster::_render_camera(Viewport *p_viewport,Camera *p_camera, S
RID environment;
if (p_camera->env.is_valid()) //camera has more environment priority
- environment=p_camera->env;
+ environment = p_camera->env;
else if (p_scenario->environment.is_valid())
- environment=p_scenario->environment;
+ environment = p_scenario->environment;
else
- environment=p_scenario->fallback_environment;
-
+ environment = p_scenario->fallback_environment;
/* STEP 6 - SAMPLE BAKED LIGHT */
- bool islinear =false;
+ bool islinear = false;
if (environment.is_valid()) {
- islinear = rasterizer->environment_is_fx_enabled(environment,VS::ENV_FX_SRGB);
+ islinear = rasterizer->environment_is_fx_enabled(environment, VS::ENV_FX_SRGB);
}
- for(int i=0;i<light_samplers_culled;i++) {
+ for (int i = 0; i < light_samplers_culled; i++) {
- _process_sampled_light(p_camera->transform,light_sampler_cull_result[i],islinear);
+ _process_sampled_light(p_camera->transform, light_sampler_cull_result[i], islinear);
}
/* STEP 7 - PROCESS GEOMETRY AND DRAW SCENE*/
-
- rasterizer->begin_scene(p_viewport->viewport_data,environment,p_scenario->debug);
+ rasterizer->begin_scene(p_viewport->viewport_data, environment, p_scenario->debug);
rasterizer->set_viewport(viewport_rect);
// add lights
{
- List<RID>::Element *E=p_scenario->directional_lights.front();
+ List<RID>::Element *E = p_scenario->directional_lights.front();
-
- for(;E;E=E->next()) {
- Instance *light = E->get().is_valid()?instance_owner.get(E->get()):NULL;
+ for (; E; E = E->next()) {
+ Instance *light = E->get().is_valid() ? instance_owner.get(E->get()) : NULL;
ERR_CONTINUE(!light);
if (!light->light_info->enabled)
continue;
rasterizer->add_light(light->light_info->instance);
- light->light_info->last_add_pass=render_pass;
+ light->light_info->last_add_pass = render_pass;
}
- for (int i=0;i<light_cull_count;i++) {
+ for (int i = 0; i < light_cull_count; i++) {
Instance *ins = light_cull_result[i];
rasterizer->add_light(ins->light_info->instance);
- ins->light_info->last_add_pass=render_pass;
+ ins->light_info->last_add_pass = render_pass;
}
}
- // add geometry
+ // add geometry
- for(int i=0;i<cull_count;i++) {
+ for (int i = 0; i < cull_count; i++) {
Instance *ins = instance_cull_result[i];
- ERR_CONTINUE(!((1<<ins->base_type)&INSTANCE_GEOMETRY_MASK));
+ ERR_CONTINUE(!((1 << ins->base_type) & INSTANCE_GEOMETRY_MASK));
_instance_draw(ins);
}
@@ -6859,75 +6318,66 @@ void VisualServerRaster::_render_camera(Viewport *p_viewport,Camera *p_camera, S
rasterizer->end_scene();
}
+void VisualServerRaster::_render_canvas_item_tree(CanvasItem *p_canvas_item, const Matrix32 &p_transform, const Rect2 &p_clip_rect, const Color &p_modulate, Rasterizer::CanvasLight *p_lights) {
-void VisualServerRaster::_render_canvas_item_tree(CanvasItem *p_canvas_item, const Matrix32& p_transform, const Rect2& p_clip_rect, const Color& p_modulate, Rasterizer::CanvasLight *p_lights) {
-
-
- static const int z_range = CANVAS_ITEM_Z_MAX-CANVAS_ITEM_Z_MIN+1;
+ static const int z_range = CANVAS_ITEM_Z_MAX - CANVAS_ITEM_Z_MIN + 1;
Rasterizer::CanvasItem *z_list[z_range];
Rasterizer::CanvasItem *z_last_list[z_range];
- for(int i=0;i<z_range;i++) {
- z_list[i]=NULL;
- z_last_list[i]=NULL;
+ for (int i = 0; i < z_range; i++) {
+ z_list[i] = NULL;
+ z_last_list[i] = NULL;
}
+ _render_canvas_item(p_canvas_item, p_transform, p_clip_rect, 1.0, 0, z_list, z_last_list, NULL, NULL);
- _render_canvas_item(p_canvas_item,p_transform,p_clip_rect,1.0,0,z_list,z_last_list,NULL,NULL);
-
- for(int i=0;i<z_range;i++) {
+ for (int i = 0; i < z_range; i++) {
if (!z_list[i])
continue;
- rasterizer->canvas_render_items(z_list[i],CANVAS_ITEM_Z_MIN+i,p_modulate,p_lights);
+ rasterizer->canvas_render_items(z_list[i], CANVAS_ITEM_Z_MIN + i, p_modulate, p_lights);
}
-
}
+void VisualServerRaster::_render_canvas_item_viewport(VisualServer *p_self, void *p_vp, const Rect2 &p_rect) {
-void VisualServerRaster::_render_canvas_item_viewport(VisualServer* p_self,void *p_vp,const Rect2& p_rect) {
-
- VisualServerRaster *self=(VisualServerRaster*)(p_self);
- Viewport *vp=(Viewport*)p_vp;
- self->_draw_viewport(vp,p_rect.pos.x,p_rect.pos.y,p_rect.size.x,p_rect.size.y);
+ VisualServerRaster *self = (VisualServerRaster *)(p_self);
+ Viewport *vp = (Viewport *)p_vp;
+ self->_draw_viewport(vp, p_rect.pos.x, p_rect.pos.y, p_rect.size.x, p_rect.size.y);
self->rasterizer->canvas_begin();
-
}
-
-void VisualServerRaster::_render_canvas_item(CanvasItem *p_canvas_item,const Matrix32& p_transform,const Rect2& p_clip_rect, float p_opacity,int p_z,Rasterizer::CanvasItem **z_list,Rasterizer::CanvasItem **z_last_list,CanvasItem *p_canvas_clip,CanvasItem *p_material_owner) {
+void VisualServerRaster::_render_canvas_item(CanvasItem *p_canvas_item, const Matrix32 &p_transform, const Rect2 &p_clip_rect, float p_opacity, int p_z, Rasterizer::CanvasItem **z_list, Rasterizer::CanvasItem **z_last_list, CanvasItem *p_canvas_clip, CanvasItem *p_material_owner) {
CanvasItem *ci = p_canvas_item;
if (!ci->visible)
return;
- if (p_opacity<0.007)
+ if (p_opacity < 0.007)
return;
-
Rect2 rect = ci->get_rect();
Matrix32 xform = p_transform * ci->xform;
Rect2 global_rect = xform.xform(rect);
- global_rect.pos+=p_clip_rect.pos;
-
+ global_rect.pos += p_clip_rect.pos;
if (global_rect.intersects(p_clip_rect) && ci->viewport.is_valid() && viewport_owner.owns(ci->viewport)) {
Viewport *vp = viewport_owner.get(ci->viewport);
- Point2i from = xform.get_origin() + Point2(viewport_rect.x,viewport_rect.y);
+ Point2i from = xform.get_origin() + Point2(viewport_rect.x, viewport_rect.y);
Point2i size = rect.size;
size.x *= xform[0].length();
size.y *= xform[1].length();
- ci->vp_render = memnew( Rasterizer::CanvasItem::ViewportRender );
- ci->vp_render->owner=this;
- ci->vp_render->udata=vp;
- ci->vp_render->rect=Rect2(from.x,
- from.y,
- size.x,
- size.y);
-/*
+ ci->vp_render = memnew(Rasterizer::CanvasItem::ViewportRender);
+ ci->vp_render->owner = this;
+ ci->vp_render->udata = vp;
+ ci->vp_render->rect = Rect2(from.x,
+ from.y,
+ size.x,
+ size.y);
+ /*
_draw_viewport(vp,
from.x,
from.y,
@@ -6936,52 +6386,50 @@ void VisualServerRaster::_render_canvas_item(CanvasItem *p_canvas_item,const Mat
*/
//rasterizer->canvas_begin();
} else {
- ci->vp_render=NULL;
+ ci->vp_render = NULL;
}
if (ci->use_parent_material && p_material_owner)
- ci->material_owner=p_material_owner;
+ ci->material_owner = p_material_owner;
else {
- p_material_owner=ci;
- ci->material_owner=NULL;
+ p_material_owner = ci;
+ ci->material_owner = NULL;
}
-
float opacity = ci->opacity * p_opacity;
-
- int child_item_count=ci->child_items.size();
- CanvasItem **child_items=(CanvasItem**)alloca(child_item_count*sizeof(CanvasItem*));
- copymem(child_items,ci->child_items.ptr(),child_item_count*sizeof(CanvasItem*));
+ int child_item_count = ci->child_items.size();
+ CanvasItem **child_items = (CanvasItem **)alloca(child_item_count * sizeof(CanvasItem *));
+ copymem(child_items, ci->child_items.ptr(), child_item_count * sizeof(CanvasItem *));
if (ci->clip) {
if (p_canvas_clip != NULL) {
- ci->final_clip_rect=p_canvas_clip->final_clip_rect.clip(global_rect);
+ ci->final_clip_rect = p_canvas_clip->final_clip_rect.clip(global_rect);
} else {
- ci->final_clip_rect=global_rect;
+ ci->final_clip_rect = global_rect;
}
- ci->final_clip_owner=ci;
+ ci->final_clip_owner = ci;
} else {
- ci->final_clip_owner=p_canvas_clip;
+ ci->final_clip_owner = p_canvas_clip;
}
if (ci->sort_y) {
- SortArray<CanvasItem*,CanvasItemPtrSort> sorter;
- sorter.sort(child_items,child_item_count);
+ SortArray<CanvasItem *, CanvasItemPtrSort> sorter;
+ sorter.sort(child_items, child_item_count);
}
if (ci->z_relative)
- p_z=CLAMP(p_z+ci->z,CANVAS_ITEM_Z_MIN,CANVAS_ITEM_Z_MAX);
+ p_z = CLAMP(p_z + ci->z, CANVAS_ITEM_Z_MIN, CANVAS_ITEM_Z_MAX);
else
- p_z=ci->z;
+ p_z = ci->z;
- for(int i=0;i<child_item_count;i++) {
+ for (int i = 0; i < child_item_count; i++) {
if (child_items[i]->ontop)
continue;
- _render_canvas_item(child_items[i],xform,p_clip_rect,opacity,p_z,z_list,z_last_list,(CanvasItem*)ci->final_clip_owner,p_material_owner);
+ _render_canvas_item(child_items[i], xform, p_clip_rect, opacity, p_z, z_list, z_last_list, (CanvasItem *)ci->final_clip_owner, p_material_owner);
}
if (ci->copy_back_buffer) {
@@ -6991,202 +6439,185 @@ void VisualServerRaster::_render_canvas_item(CanvasItem *p_canvas_item,const Mat
if ((!ci->commands.empty() && p_clip_rect.intersects(global_rect)) || ci->vp_render || ci->copy_back_buffer) {
//something to draw?
- ci->final_transform=xform;
- ci->final_opacity=opacity * ci->self_opacity;
- ci->global_rect_cache=global_rect;
- ci->global_rect_cache.pos-=p_clip_rect.pos;
- ci->light_masked=false;
+ ci->final_transform = xform;
+ ci->final_opacity = opacity * ci->self_opacity;
+ ci->global_rect_cache = global_rect;
+ ci->global_rect_cache.pos -= p_clip_rect.pos;
+ ci->light_masked = false;
- int zidx = p_z-CANVAS_ITEM_Z_MIN;
+ int zidx = p_z - CANVAS_ITEM_Z_MIN;
if (z_last_list[zidx]) {
- z_last_list[zidx]->next=ci;
- z_last_list[zidx]=ci;
+ z_last_list[zidx]->next = ci;
+ z_last_list[zidx] = ci;
} else {
- z_list[zidx]=ci;
- z_last_list[zidx]=ci;
+ z_list[zidx] = ci;
+ z_last_list[zidx] = ci;
}
-
-
- ci->next=NULL;
-
+ ci->next = NULL;
}
- for(int i=0;i<child_item_count;i++) {
+ for (int i = 0; i < child_item_count; i++) {
if (!child_items[i]->ontop)
continue;
- _render_canvas_item(child_items[i],xform,p_clip_rect,opacity,p_z,z_list,z_last_list,(CanvasItem*)ci->final_clip_owner,p_material_owner);
+ _render_canvas_item(child_items[i], xform, p_clip_rect, opacity, p_z, z_list, z_last_list, (CanvasItem *)ci->final_clip_owner, p_material_owner);
}
-
}
-void VisualServerRaster::_light_mask_canvas_items(int p_z,Rasterizer::CanvasItem *p_canvas_item,Rasterizer::CanvasLight *p_masked_lights) {
+void VisualServerRaster::_light_mask_canvas_items(int p_z, Rasterizer::CanvasItem *p_canvas_item, Rasterizer::CanvasLight *p_masked_lights) {
if (!p_masked_lights)
return;
- Rasterizer::CanvasItem *ci=p_canvas_item;
+ Rasterizer::CanvasItem *ci = p_canvas_item;
- while(ci) {
+ while (ci) {
- Rasterizer::CanvasLight *light=p_masked_lights;
- while(light) {
+ Rasterizer::CanvasLight *light = p_masked_lights;
+ while (light) {
- if (ci->light_mask&light->item_mask && p_z>=light->z_min && p_z<=light->z_max && ci->global_rect_cache.intersects_transformed(light->xform_cache,light->rect_cache)) {
- ci->light_masked=true;
+ if (ci->light_mask & light->item_mask && p_z >= light->z_min && p_z <= light->z_max && ci->global_rect_cache.intersects_transformed(light->xform_cache, light->rect_cache)) {
+ ci->light_masked = true;
}
- light=light->mask_next_ptr;
+ light = light->mask_next_ptr;
}
- ci=ci->next;
+ ci = ci->next;
}
-
-
-
-
}
-void VisualServerRaster::_render_canvas(Canvas *p_canvas,const Matrix32 &p_transform,Rasterizer::CanvasLight *p_lights,Rasterizer::CanvasLight *p_masked_lights) {
+void VisualServerRaster::_render_canvas(Canvas *p_canvas, const Matrix32 &p_transform, Rasterizer::CanvasLight *p_lights, Rasterizer::CanvasLight *p_masked_lights) {
rasterizer->canvas_begin();
int l = p_canvas->child_items.size();
- Canvas::ChildItem *ci=p_canvas->child_items.ptr();
+ Canvas::ChildItem *ci = p_canvas->child_items.ptr();
- bool has_mirror=false;
- for(int i=0;i<l;i++) {
+ bool has_mirror = false;
+ for (int i = 0; i < l; i++) {
if (ci[i].mirror.x || ci[i].mirror.y) {
- has_mirror=true;
+ has_mirror = true;
break;
}
}
- Rect2 clip_rect(viewport_rect.x,viewport_rect.y,viewport_rect.width,viewport_rect.height);
+ Rect2 clip_rect(viewport_rect.x, viewport_rect.y, viewport_rect.width, viewport_rect.height);
if (!has_mirror) {
- static const int z_range = CANVAS_ITEM_Z_MAX-CANVAS_ITEM_Z_MIN+1;
+ static const int z_range = CANVAS_ITEM_Z_MAX - CANVAS_ITEM_Z_MIN + 1;
Rasterizer::CanvasItem *z_list[z_range];
Rasterizer::CanvasItem *z_last_list[z_range];
- for(int i=0;i<z_range;i++) {
- z_list[i]=NULL;
- z_last_list[i]=NULL;
+ for (int i = 0; i < z_range; i++) {
+ z_list[i] = NULL;
+ z_last_list[i] = NULL;
}
- for(int i=0;i<l;i++) {
- _render_canvas_item(ci[i].item,p_transform,clip_rect,1.0,0,z_list,z_last_list,NULL,NULL);
+ for (int i = 0; i < l; i++) {
+ _render_canvas_item(ci[i].item, p_transform, clip_rect, 1.0, 0, z_list, z_last_list, NULL, NULL);
}
- for(int i=0;i<z_range;i++) {
+ for (int i = 0; i < z_range; i++) {
if (!z_list[i])
continue;
if (p_masked_lights) {
- _light_mask_canvas_items(CANVAS_ITEM_Z_MIN+i,z_list[i],p_masked_lights);
+ _light_mask_canvas_items(CANVAS_ITEM_Z_MIN + i, z_list[i], p_masked_lights);
}
- rasterizer->canvas_render_items(z_list[i],CANVAS_ITEM_Z_MIN+i,p_canvas->modulate,p_lights);
+ rasterizer->canvas_render_items(z_list[i], CANVAS_ITEM_Z_MIN + i, p_canvas->modulate, p_lights);
}
} else {
- for(int i=0;i<l;i++) {
+ for (int i = 0; i < l; i++) {
- Canvas::ChildItem& ci=p_canvas->child_items[i];
- _render_canvas_item_tree(ci.item,p_transform,clip_rect,p_canvas->modulate,p_lights);
+ Canvas::ChildItem &ci = p_canvas->child_items[i];
+ _render_canvas_item_tree(ci.item, p_transform, clip_rect, p_canvas->modulate, p_lights);
//mirroring (useful for scrolling backgrounds)
- if (ci.mirror.x!=0) {
+ if (ci.mirror.x != 0) {
- Matrix32 xform2 = p_transform * Matrix32(0,Vector2(ci.mirror.x,0));
- _render_canvas_item_tree(ci.item,xform2,clip_rect,p_canvas->modulate,p_lights);
+ Matrix32 xform2 = p_transform * Matrix32(0, Vector2(ci.mirror.x, 0));
+ _render_canvas_item_tree(ci.item, xform2, clip_rect, p_canvas->modulate, p_lights);
}
- if (ci.mirror.y!=0) {
+ if (ci.mirror.y != 0) {
- Matrix32 xform2 = p_transform * Matrix32(0,Vector2(0,ci.mirror.y));
- _render_canvas_item_tree(ci.item,xform2,clip_rect,p_canvas->modulate,p_lights);
+ Matrix32 xform2 = p_transform * Matrix32(0, Vector2(0, ci.mirror.y));
+ _render_canvas_item_tree(ci.item, xform2, clip_rect, p_canvas->modulate, p_lights);
}
- if (ci.mirror.y!=0 && ci.mirror.x!=0) {
+ if (ci.mirror.y != 0 && ci.mirror.x != 0) {
- Matrix32 xform2 = p_transform * Matrix32(0,ci.mirror);
- _render_canvas_item_tree(ci.item,xform2,clip_rect,p_canvas->modulate,p_lights);
+ Matrix32 xform2 = p_transform * Matrix32(0, ci.mirror);
+ _render_canvas_item_tree(ci.item, xform2, clip_rect, p_canvas->modulate, p_lights);
}
-
}
}
-
}
+void VisualServerRaster::_draw_viewport_camera(Viewport *p_viewport, bool p_ignore_camera) {
-void VisualServerRaster::_draw_viewport_camera(Viewport *p_viewport,bool p_ignore_camera) {
-
-
- Camera *camera=NULL;
- if (camera_owner.owns( p_viewport->camera ))
- camera=camera_owner.get( p_viewport->camera );
- Scenario *scenario = scenario_owner.get( p_viewport->scenario );
+ Camera *camera = NULL;
+ if (camera_owner.owns(p_viewport->camera))
+ camera = camera_owner.get(p_viewport->camera);
+ Scenario *scenario = scenario_owner.get(p_viewport->scenario);
_update_instances(); // check dirty instances before rendering
if (p_ignore_camera)
- _render_no_camera(p_viewport, camera,scenario );
+ _render_no_camera(p_viewport, camera, scenario);
else
- _render_camera(p_viewport, camera,scenario );
-
+ _render_camera(p_viewport, camera, scenario);
}
-void VisualServerRaster::_draw_viewport(Viewport *p_viewport,int p_ofs_x, int p_ofs_y,int p_parent_w,int p_parent_h) {
+void VisualServerRaster::_draw_viewport(Viewport *p_viewport, int p_ofs_x, int p_ofs_y, int p_parent_w, int p_parent_h) {
- ViewportRect desired_rect=p_viewport->rect;
+ ViewportRect desired_rect = p_viewport->rect;
ViewportRect old_rect = viewport_rect;
-// bool vpchanged=false;
+ // bool vpchanged=false;
// convert default expanding viewports to actual size
//if (desired_rect.x==0 && desired_rect.y==0 && desired_rect.width==0 && desired_rect.height==0) {
if (p_parent_w != 0 && p_parent_h != 0) {
- desired_rect.width=p_parent_w;
- desired_rect.height=p_parent_h;
+ desired_rect.width = p_parent_w;
+ desired_rect.height = p_parent_h;
}
- ERR_FAIL_COND(desired_rect.width<=0 || desired_rect.height<=0);
-
- desired_rect.x+=p_ofs_x;
- desired_rect.y+=p_ofs_y;
+ ERR_FAIL_COND(desired_rect.width <= 0 || desired_rect.height <= 0);
+ desired_rect.x += p_ofs_x;
+ desired_rect.y += p_ofs_y;
// if the viewport is different than the actual one, change it
- if ( p_viewport->render_target.is_valid() || viewport_rect.x != desired_rect.x ||
- viewport_rect.y != desired_rect.y ||
- viewport_rect.width != desired_rect.width ||
- viewport_rect.height != desired_rect.height ) {
-
+ if (p_viewport->render_target.is_valid() || viewport_rect.x != desired_rect.x ||
+ viewport_rect.y != desired_rect.y ||
+ viewport_rect.width != desired_rect.width ||
+ viewport_rect.height != desired_rect.height) {
- viewport_rect=desired_rect;
+ viewport_rect = desired_rect;
rasterizer->set_viewport(viewport_rect);
-
}
/* Camera should always be BEFORE any other 3D */
- bool scenario_draw_canvas_bg=false;
- int scenario_canvas_max_layer=0;
+ bool scenario_draw_canvas_bg = false;
+ int scenario_canvas_max_layer = 0;
if (!p_viewport->hide_canvas && !p_viewport->disable_environment && scenario_owner.owns(p_viewport->scenario)) {
- Scenario *scenario=scenario_owner.get(p_viewport->scenario);
+ Scenario *scenario = scenario_owner.get(p_viewport->scenario);
if (scenario->environment.is_valid()) {
if (rasterizer->is_environment(scenario->environment)) {
- scenario_draw_canvas_bg=rasterizer->environment_get_background(scenario->environment)==VS::ENV_BG_CANVAS;
- scenario_canvas_max_layer=rasterizer->environment_get_background_param(scenario->environment,VS::ENV_BG_PARAM_CANVAS_MAX_LAYER);
+ scenario_draw_canvas_bg = rasterizer->environment_get_background(scenario->environment) == VS::ENV_BG_CANVAS;
+ scenario_canvas_max_layer = rasterizer->environment_get_background_param(scenario->environment, VS::ENV_BG_PARAM_CANVAS_MAX_LAYER);
}
}
}
- bool can_draw_3d=!p_viewport->hide_scenario && camera_owner.owns(p_viewport->camera) && scenario_owner.owns(p_viewport->scenario);
-
+ bool can_draw_3d = !p_viewport->hide_scenario && camera_owner.owns(p_viewport->camera) && scenario_owner.owns(p_viewport->scenario);
if (scenario_draw_canvas_bg) {
@@ -7195,177 +6626,161 @@ void VisualServerRaster::_draw_viewport(Viewport *p_viewport,int p_ofs_x, int p_
if (!scenario_draw_canvas_bg && can_draw_3d) {
- _draw_viewport_camera(p_viewport,false);
+ _draw_viewport_camera(p_viewport, false);
- } else if (true /*|| !p_viewport->canvas_list.empty()*/){
+ } else if (true /*|| !p_viewport->canvas_list.empty()*/) {
//clear the viewport black because of no camera? i seriously should..
if (p_viewport->render_target_clear_on_new_frame || p_viewport->render_target_clear) {
if (p_viewport->transparent_bg) {
- rasterizer->clear_viewport(Color(0,0,0,0));
- }
- else {
- Color cc=clear_color;
+ rasterizer->clear_viewport(Color(0, 0, 0, 0));
+ } else {
+ Color cc = clear_color;
if (scenario_draw_canvas_bg)
- cc.a=0;
+ cc.a = 0;
rasterizer->clear_viewport(cc);
}
- p_viewport->render_target_clear=false;
+ p_viewport->render_target_clear = false;
}
}
if (!p_viewport->hide_canvas) {
- int i=0;
+ int i = 0;
- Map<Viewport::CanvasKey,Viewport::CanvasData*> canvas_map;
+ Map<Viewport::CanvasKey, Viewport::CanvasData *> canvas_map;
- Rect2 clip_rect(0,0,viewport_rect.width,viewport_rect.height);
- Rasterizer::CanvasLight *lights=NULL;
- Rasterizer::CanvasLight *lights_with_shadow=NULL;
- Rasterizer::CanvasLight *lights_with_mask=NULL;
+ Rect2 clip_rect(0, 0, viewport_rect.width, viewport_rect.height);
+ Rasterizer::CanvasLight *lights = NULL;
+ Rasterizer::CanvasLight *lights_with_shadow = NULL;
+ Rasterizer::CanvasLight *lights_with_mask = NULL;
Rect2 shadow_rect;
- int light_count=0;
+ int light_count = 0;
- for (Map<RID,Viewport::CanvasData>::Element *E=p_viewport->canvas_map.front();E;E=E->next()) {
+ for (Map<RID, Viewport::CanvasData>::Element *E = p_viewport->canvas_map.front(); E; E = E->next()) {
Matrix32 xf = p_viewport->global_transform * E->get().transform;
//find lights in canvas
+ for (Set<Rasterizer::CanvasLight *>::Element *F = E->get().canvas->lights.front(); F; F = F->next()) {
- for(Set<Rasterizer::CanvasLight*>::Element *F=E->get().canvas->lights.front();F;F=F->next()) {
-
-
- Rasterizer::CanvasLight* cl=F->get();
+ Rasterizer::CanvasLight *cl = F->get();
if (cl->enabled && cl->texture.is_valid()) {
//not super efficient..
- Size2 tsize(rasterizer->texture_get_width(cl->texture),rasterizer->texture_get_height(cl->texture));
- tsize*=cl->scale;
+ Size2 tsize(rasterizer->texture_get_width(cl->texture), rasterizer->texture_get_height(cl->texture));
+ tsize *= cl->scale;
- Vector2 offset=tsize/2.0;
- cl->rect_cache=Rect2(-offset+cl->texture_offset,tsize);
- cl->xform_cache=xf * cl->xform;
+ Vector2 offset = tsize / 2.0;
+ cl->rect_cache = Rect2(-offset + cl->texture_offset, tsize);
+ cl->xform_cache = xf * cl->xform;
+ if (clip_rect.intersects_transformed(cl->xform_cache, cl->rect_cache)) {
- if (clip_rect.intersects_transformed(cl->xform_cache,cl->rect_cache)) {
-
- cl->filter_next_ptr=lights;
- lights=cl;
- cl->texture_cache=NULL;
+ cl->filter_next_ptr = lights;
+ lights = cl;
+ cl->texture_cache = NULL;
Matrix32 scale;
scale.scale(cl->rect_cache.size);
- scale.elements[2]=cl->rect_cache.pos;
+ scale.elements[2] = cl->rect_cache.pos;
cl->light_shader_xform = (cl->xform_cache * scale).affine_inverse();
- cl->light_shader_pos=cl->xform_cache[2];
+ cl->light_shader_pos = cl->xform_cache[2];
if (cl->shadow_buffer.is_valid()) {
- cl->shadows_next_ptr=lights_with_shadow;
- if (lights_with_shadow==NULL) {
+ cl->shadows_next_ptr = lights_with_shadow;
+ if (lights_with_shadow == NULL) {
shadow_rect = cl->xform_cache.xform(cl->rect_cache);
} else {
- shadow_rect=shadow_rect.merge( cl->xform_cache.xform(cl->rect_cache) );
+ shadow_rect = shadow_rect.merge(cl->xform_cache.xform(cl->rect_cache));
}
- lights_with_shadow=cl;
- cl->radius_cache=cl->rect_cache.size.length();
-
+ lights_with_shadow = cl;
+ cl->radius_cache = cl->rect_cache.size.length();
}
- if (cl->mode==CANVAS_LIGHT_MODE_MASK) {
- cl->mask_next_ptr=lights_with_mask;
- lights_with_mask=cl;
+ if (cl->mode == CANVAS_LIGHT_MODE_MASK) {
+ cl->mask_next_ptr = lights_with_mask;
+ lights_with_mask = cl;
}
light_count++;
}
-
}
}
//print_line("lights: "+itos(light_count));
- canvas_map[ Viewport::CanvasKey( E->key(), E->get().layer) ]=&E->get();
-
+ canvas_map[Viewport::CanvasKey(E->key(), E->get().layer)] = &E->get();
}
if (lights_with_shadow) {
//update shadows if any
- Rasterizer::CanvasLightOccluderInstance * occluders=NULL;
+ Rasterizer::CanvasLightOccluderInstance *occluders = NULL;
//make list of occluders
- for (Map<RID,Viewport::CanvasData>::Element *E=p_viewport->canvas_map.front();E;E=E->next()) {
+ for (Map<RID, Viewport::CanvasData>::Element *E = p_viewport->canvas_map.front(); E; E = E->next()) {
Matrix32 xf = p_viewport->global_transform * E->get().transform;
- for(Set<Rasterizer::CanvasLightOccluderInstance*>::Element *F=E->get().canvas->occluders.front();F;F=F->next()) {
+ for (Set<Rasterizer::CanvasLightOccluderInstance *>::Element *F = E->get().canvas->occluders.front(); F; F = F->next()) {
if (!F->get()->enabled)
continue;
F->get()->xform_cache = xf * F->get()->xform;
- if (shadow_rect.intersects_transformed(F->get()->xform_cache,F->get()->aabb_cache)) {
-
- F->get()->next=occluders;
- occluders=F->get();
+ if (shadow_rect.intersects_transformed(F->get()->xform_cache, F->get()->aabb_cache)) {
+ F->get()->next = occluders;
+ occluders = F->get();
}
}
}
//update the light shadowmaps with them
- Rasterizer::CanvasLight *light=lights_with_shadow;
- while(light) {
+ Rasterizer::CanvasLight *light = lights_with_shadow;
+ while (light) {
- rasterizer->canvas_light_shadow_buffer_update(light->shadow_buffer,light->xform_cache.affine_inverse(),light->item_mask,light->radius_cache/1000.0,light->radius_cache*1.1,occluders,&light->shadow_matrix_cache);
- light=light->shadows_next_ptr;
+ rasterizer->canvas_light_shadow_buffer_update(light->shadow_buffer, light->xform_cache.affine_inverse(), light->item_mask, light->radius_cache / 1000.0, light->radius_cache * 1.1, occluders, &light->shadow_matrix_cache);
+ light = light->shadows_next_ptr;
}
rasterizer->set_viewport(viewport_rect); //must reset viewport afterwards
}
+ if (scenario_draw_canvas_bg && canvas_map.front() && canvas_map.front()->key().layer > scenario_canvas_max_layer) {
-
-
- if (scenario_draw_canvas_bg && canvas_map.front() && canvas_map.front()->key().layer>scenario_canvas_max_layer) {
-
- _draw_viewport_camera(p_viewport,!can_draw_3d);
- scenario_draw_canvas_bg=false;
-
+ _draw_viewport_camera(p_viewport, !can_draw_3d);
+ scenario_draw_canvas_bg = false;
}
- for (Map<Viewport::CanvasKey,Viewport::CanvasData*>::Element *E=canvas_map.front();E;E=E->next()) {
-
+ for (Map<Viewport::CanvasKey, Viewport::CanvasData *>::Element *E = canvas_map.front(); E; E = E->next()) {
- // print_line("canvas "+itos(i)+" size: "+itos(I->get()->canvas->child_items.size()));
+ // print_line("canvas "+itos(i)+" size: "+itos(I->get()->canvas->child_items.size()));
//print_line("GT "+p_viewport->global_transform+". CT: "+E->get()->transform);
Matrix32 xform = p_viewport->global_transform * E->get()->transform;
- Rasterizer::CanvasLight *canvas_lights=NULL;
+ Rasterizer::CanvasLight *canvas_lights = NULL;
- Rasterizer::CanvasLight *ptr=lights;
- while(ptr) {
- if (E->get()->layer>=ptr->layer_min && E->get()->layer<=ptr->layer_max) {
- ptr->next_ptr=canvas_lights;
- canvas_lights=ptr;
+ Rasterizer::CanvasLight *ptr = lights;
+ while (ptr) {
+ if (E->get()->layer >= ptr->layer_min && E->get()->layer <= ptr->layer_max) {
+ ptr->next_ptr = canvas_lights;
+ canvas_lights = ptr;
}
- ptr=ptr->filter_next_ptr;
+ ptr = ptr->filter_next_ptr;
}
- _render_canvas( E->get()->canvas,xform,canvas_lights,lights_with_mask );
+ _render_canvas(E->get()->canvas, xform, canvas_lights, lights_with_mask);
i++;
- if (scenario_draw_canvas_bg && E->key().layer>=scenario_canvas_max_layer) {
- _draw_viewport_camera(p_viewport,!can_draw_3d);
- scenario_draw_canvas_bg=false;
+ if (scenario_draw_canvas_bg && E->key().layer >= scenario_canvas_max_layer) {
+ _draw_viewport_camera(p_viewport, !can_draw_3d);
+ scenario_draw_canvas_bg = false;
}
-
-
}
if (scenario_draw_canvas_bg) {
- _draw_viewport_camera(p_viewport,!can_draw_3d);
- scenario_draw_canvas_bg=false;
+ _draw_viewport_camera(p_viewport, !can_draw_3d);
+ scenario_draw_canvas_bg = false;
}
-
-// rasterizer->canvas_debug_viewport_shadows(lights_with_shadow);
+ // rasterizer->canvas_debug_viewport_shadows(lights_with_shadow);
}
//capture
@@ -7377,64 +6792,59 @@ void VisualServerRaster::_draw_viewport(Viewport *p_viewport,int p_ofs_x, int p_
}
//restore
- if ( viewport_rect.x != old_rect.x ||
- viewport_rect.y != old_rect.y ||
- viewport_rect.width != old_rect.width ||
- viewport_rect.height != old_rect.height ) {
+ if (viewport_rect.x != old_rect.x ||
+ viewport_rect.y != old_rect.y ||
+ viewport_rect.width != old_rect.width ||
+ viewport_rect.height != old_rect.height) {
- viewport_rect=old_rect;
+ viewport_rect = old_rect;
rasterizer->set_viewport(viewport_rect);
}
-
-
}
void VisualServerRaster::_draw_viewports() {
//draw viewports for render targets
- List<Viewport*> to_blit;
- List<Viewport*> to_disable;
- for(SelfList<Viewport> *E=viewport_update_list.first();E;E=E->next()) {
+ List<Viewport *> to_blit;
+ List<Viewport *> to_disable;
+ for (SelfList<Viewport> *E = viewport_update_list.first(); E; E = E->next()) {
Viewport *vp = E->self();
ERR_CONTINUE(!vp);
if (
- vp->render_target_update_mode==RENDER_TARGET_UPDATE_WHEN_VISIBLE &&
- !vp->rendered_in_prev_frame &&
- !vp->queue_capture
- ) {
+ vp->render_target_update_mode == RENDER_TARGET_UPDATE_WHEN_VISIBLE &&
+ !vp->rendered_in_prev_frame &&
+ !vp->queue_capture) {
continue;
}
- if (vp->rt_to_screen_rect!=Rect2())
+ if (vp->rt_to_screen_rect != Rect2())
to_blit.push_back(vp);
- rasterizer->set_render_target(vp->render_target,vp->transparent_bg,vp->render_target_vflip);
- _draw_viewport(vp,0,0,vp->rect.width,vp->rect.height);
+ rasterizer->set_render_target(vp->render_target, vp->transparent_bg, vp->render_target_vflip);
+ _draw_viewport(vp, 0, 0, vp->rect.width, vp->rect.height);
- if ( (vp->queue_capture && vp->render_target_update_mode==RENDER_TARGET_UPDATE_DISABLED) || vp->render_target_update_mode==RENDER_TARGET_UPDATE_ONCE) {
+ if ((vp->queue_capture && vp->render_target_update_mode == RENDER_TARGET_UPDATE_DISABLED) || vp->render_target_update_mode == RENDER_TARGET_UPDATE_ONCE) {
//was only enabled for capture
to_disable.push_back(vp);
- vp->render_target_update_mode=RENDER_TARGET_UPDATE_DISABLED;
+ vp->render_target_update_mode = RENDER_TARGET_UPDATE_DISABLED;
}
-
}
rasterizer->set_render_target(RID());
- while(to_disable.size()) {
+ while (to_disable.size()) {
//disable again because it was only for capture
viewport_update_list.remove(&to_disable.front()->get()->update_list);
to_disable.pop_front();
}
-
//draw RTs directly to screen when requested
- for (List<Viewport*>::Element *E=to_blit.front();E;E=E->next()) {
+ for (List<Viewport *>::Element *E = to_blit.front(); E; E = E->next()) {
int window_w = OS::get_singleton()->get_video_mode().width;
int window_h = OS::get_singleton()->get_video_mode().height;
@@ -7444,12 +6854,12 @@ void VisualServerRaster::_draw_viewports() {
desired_rect.width = window_w;
desired_rect.height = window_h;
- if ( viewport_rect.x != desired_rect.x ||
- viewport_rect.y != desired_rect.y ||
- viewport_rect.width != desired_rect.width ||
- viewport_rect.height != desired_rect.height ) {
+ if (viewport_rect.x != desired_rect.x ||
+ viewport_rect.y != desired_rect.y ||
+ viewport_rect.width != desired_rect.width ||
+ viewport_rect.height != desired_rect.height) {
- viewport_rect=desired_rect;
+ viewport_rect = desired_rect;
rasterizer->set_viewport(viewport_rect);
}
@@ -7457,15 +6867,12 @@ void VisualServerRaster::_draw_viewports() {
rasterizer->canvas_begin();
rasterizer->canvas_disable_blending();
rasterizer->canvas_begin_rect(Matrix32());
- rasterizer->canvas_draw_rect(E->get()->rt_to_screen_rect,0,Rect2(Point2(),E->get()->rt_to_screen_rect.size),E->get()->render_target_texture,Color(1,1,1));
-
+ rasterizer->canvas_draw_rect(E->get()->rt_to_screen_rect, 0, Rect2(Point2(), E->get()->rt_to_screen_rect.size), E->get()->render_target_texture, Color(1, 1, 1));
}
-
-
//draw viewports attached to screen
- for(Map<RID,int>::Element *E=screen_viewports.front();E;E=E->next()) {
+ for (Map<RID, int>::Element *E = screen_viewports.front(); E; E = E->next()) {
Viewport *vp = viewport_owner.get(E->key());
ERR_CONTINUE(!vp);
@@ -7473,32 +6880,27 @@ void VisualServerRaster::_draw_viewports() {
int window_w = OS::get_singleton()->get_video_mode(E->get()).width;
int window_h = OS::get_singleton()->get_video_mode(E->get()).height;
- Rect2 r(0,0,vp->rect.width,vp->rect.height);
- if (r.size.width==0)
- r.size.width=window_w;
- if (r.size.height==0)
- r.size.height=window_h;
+ Rect2 r(0, 0, vp->rect.width, vp->rect.height);
+ if (r.size.width == 0)
+ r.size.width = window_w;
+ if (r.size.height == 0)
+ r.size.height = window_h;
-
- _draw_viewport(vp,r.pos.x,r.pos.y,r.size.width,r.size.height);
+ _draw_viewport(vp, r.pos.x, r.pos.y, r.size.width, r.size.height);
}
-
//check when a viewport associated to a render target was drawn
- for(SelfList<Viewport> *E=viewport_update_list.first();E;E=E->next()) {
+ for (SelfList<Viewport> *E = viewport_update_list.first(); E; E = E->next()) {
Viewport *vp = E->self();
ERR_CONTINUE(!vp);
- if (vp->render_target_update_mode!=RENDER_TARGET_UPDATE_WHEN_VISIBLE)
+ if (vp->render_target_update_mode != RENDER_TARGET_UPDATE_WHEN_VISIBLE)
continue;
- vp->rendered_in_prev_frame=rasterizer->render_target_renedered_in_frame(vp->render_target);
+ vp->rendered_in_prev_frame = rasterizer->render_target_renedered_in_frame(vp->render_target);
}
-
}
-
-
void VisualServerRaster::_draw_cursors_and_margins() {
int window_w = OS::get_singleton()->get_video_mode().width;
@@ -7509,12 +6911,12 @@ void VisualServerRaster::_draw_cursors_and_margins() {
desired_rect.width = window_w;
desired_rect.height = window_h;
- if ( viewport_rect.x != desired_rect.x ||
- viewport_rect.y != desired_rect.y ||
- viewport_rect.width != desired_rect.width ||
- viewport_rect.height != desired_rect.height ) {
+ if (viewport_rect.x != desired_rect.x ||
+ viewport_rect.y != desired_rect.y ||
+ viewport_rect.width != desired_rect.width ||
+ viewport_rect.height != desired_rect.height) {
- viewport_rect=desired_rect;
+ viewport_rect = desired_rect;
rasterizer->set_viewport(viewport_rect);
}
@@ -7522,52 +6924,50 @@ void VisualServerRaster::_draw_cursors_and_margins() {
rasterizer->canvas_begin();
rasterizer->canvas_begin_rect(Matrix32());
- for (int i=0; i<MAX_CURSORS; i++) {
+ for (int i = 0; i < MAX_CURSORS; i++) {
if (!cursors[i].visible) {
continue;
};
- RID tex = cursors[i].texture?cursors[i].texture:default_cursor_texture;
- ERR_CONTINUE( !tex );
+ RID tex = cursors[i].texture ? cursors[i].texture : default_cursor_texture;
+ ERR_CONTINUE(!tex);
if (cursors[i].region.has_no_area()) {
Point2 size(texture_get_width(tex), texture_get_height(tex));
- rasterizer->canvas_draw_rect(Rect2(cursors[i].pos-cursors[i].center, size), 0, Rect2(), tex, Color(1, 1, 1, 1));
+ rasterizer->canvas_draw_rect(Rect2(cursors[i].pos - cursors[i].center, size), 0, Rect2(), tex, Color(1, 1, 1, 1));
} else {
Point2 size = cursors[i].region.size;
- rasterizer->canvas_draw_rect(Rect2(cursors[i].pos-cursors[i].center, size), Rasterizer::CANVAS_RECT_REGION, cursors[i].region, tex, Color(1, 1, 1, 1));
+ rasterizer->canvas_draw_rect(Rect2(cursors[i].pos - cursors[i].center, size), Rasterizer::CANVAS_RECT_REGION, cursors[i].region, tex, Color(1, 1, 1, 1));
}
};
-
-
if (black_image[MARGIN_LEFT].is_valid()) {
- Size2 sz(rasterizer->texture_get_width(black_image[MARGIN_LEFT]),rasterizer->texture_get_height(black_image[MARGIN_LEFT]));
- rasterizer->canvas_draw_rect(Rect2(0,0,black_margin[MARGIN_LEFT],window_h),0,Rect2(0,0,sz.x,sz.y),black_image[MARGIN_LEFT],Color(1,1,1));
+ Size2 sz(rasterizer->texture_get_width(black_image[MARGIN_LEFT]), rasterizer->texture_get_height(black_image[MARGIN_LEFT]));
+ rasterizer->canvas_draw_rect(Rect2(0, 0, black_margin[MARGIN_LEFT], window_h), 0, Rect2(0, 0, sz.x, sz.y), black_image[MARGIN_LEFT], Color(1, 1, 1));
} else if (black_margin[MARGIN_LEFT])
- rasterizer->canvas_draw_rect(Rect2(0,0,black_margin[MARGIN_LEFT],window_h),0,Rect2(0,0,1,1),RID(),Color(0,0,0));
+ rasterizer->canvas_draw_rect(Rect2(0, 0, black_margin[MARGIN_LEFT], window_h), 0, Rect2(0, 0, 1, 1), RID(), Color(0, 0, 0));
if (black_image[MARGIN_RIGHT].is_valid()) {
- Size2 sz(rasterizer->texture_get_width(black_image[MARGIN_RIGHT]),rasterizer->texture_get_height(black_image[MARGIN_RIGHT]));
- rasterizer->canvas_draw_rect(Rect2(window_w-black_margin[MARGIN_RIGHT],0,black_margin[MARGIN_RIGHT],window_h),0,Rect2(0,0,sz.x,sz.y),black_image[MARGIN_RIGHT],Color(1,1,1));
+ Size2 sz(rasterizer->texture_get_width(black_image[MARGIN_RIGHT]), rasterizer->texture_get_height(black_image[MARGIN_RIGHT]));
+ rasterizer->canvas_draw_rect(Rect2(window_w - black_margin[MARGIN_RIGHT], 0, black_margin[MARGIN_RIGHT], window_h), 0, Rect2(0, 0, sz.x, sz.y), black_image[MARGIN_RIGHT], Color(1, 1, 1));
} else if (black_margin[MARGIN_RIGHT])
- rasterizer->canvas_draw_rect(Rect2(window_w-black_margin[MARGIN_RIGHT],0,black_margin[MARGIN_RIGHT],window_h),0,Rect2(0,0,1,1),RID(),Color(0,0,0));
+ rasterizer->canvas_draw_rect(Rect2(window_w - black_margin[MARGIN_RIGHT], 0, black_margin[MARGIN_RIGHT], window_h), 0, Rect2(0, 0, 1, 1), RID(), Color(0, 0, 0));
if (black_image[MARGIN_TOP].is_valid()) {
- Size2 sz(rasterizer->texture_get_width(black_image[MARGIN_TOP]),rasterizer->texture_get_height(black_image[MARGIN_TOP]));
- rasterizer->canvas_draw_rect(Rect2(0,0,window_w,black_margin[MARGIN_TOP]),0,Rect2(0,0,sz.x,sz.y),black_image[MARGIN_TOP],Color(1,1,1));
+ Size2 sz(rasterizer->texture_get_width(black_image[MARGIN_TOP]), rasterizer->texture_get_height(black_image[MARGIN_TOP]));
+ rasterizer->canvas_draw_rect(Rect2(0, 0, window_w, black_margin[MARGIN_TOP]), 0, Rect2(0, 0, sz.x, sz.y), black_image[MARGIN_TOP], Color(1, 1, 1));
} else if (black_margin[MARGIN_TOP]) {
- rasterizer->canvas_draw_rect(Rect2(0,0,window_w,black_margin[MARGIN_TOP]),0,Rect2(0,0,1,1),RID(),Color(0,0,0));
+ rasterizer->canvas_draw_rect(Rect2(0, 0, window_w, black_margin[MARGIN_TOP]), 0, Rect2(0, 0, 1, 1), RID(), Color(0, 0, 0));
}
if (black_image[MARGIN_BOTTOM].is_valid()) {
- Size2 sz(rasterizer->texture_get_width(black_image[MARGIN_BOTTOM]),rasterizer->texture_get_height(black_image[MARGIN_BOTTOM]));
- rasterizer->canvas_draw_rect(Rect2(0,window_h-black_margin[MARGIN_BOTTOM],window_w,black_margin[MARGIN_BOTTOM]),0,Rect2(0,0,sz.x,sz.y),black_image[MARGIN_BOTTOM],Color(1,1,1));
+ Size2 sz(rasterizer->texture_get_width(black_image[MARGIN_BOTTOM]), rasterizer->texture_get_height(black_image[MARGIN_BOTTOM]));
+ rasterizer->canvas_draw_rect(Rect2(0, window_h - black_margin[MARGIN_BOTTOM], window_w, black_margin[MARGIN_BOTTOM]), 0, Rect2(0, 0, sz.x, sz.y), black_image[MARGIN_BOTTOM], Color(1, 1, 1));
} else if (black_margin[MARGIN_BOTTOM]) {
- rasterizer->canvas_draw_rect(Rect2(0,window_h-black_margin[MARGIN_BOTTOM],window_w,black_margin[MARGIN_BOTTOM]),0,Rect2(0,0,1,1),RID(),Color(0,0,0));
+ rasterizer->canvas_draw_rect(Rect2(0, window_h - black_margin[MARGIN_BOTTOM], window_w, black_margin[MARGIN_BOTTOM]), 0, Rect2(0, 0, 1, 1), RID(), Color(0, 0, 0));
}
rasterizer->canvas_end_rect();
@@ -7580,20 +6980,20 @@ void VisualServerRaster::sync() {
void VisualServerRaster::draw() {
//if (changes)
// print_line("changes: "+itos(changes));
- changes=0;
- shadows_enabled=GLOBAL_DEF("render/shadows_enabled",true);
- room_cull_enabled = GLOBAL_DEF("render/room_cull_enabled",true);
- light_discard_enabled = GLOBAL_DEF("render/light_discard_enabled",true);
+ changes = 0;
+ shadows_enabled = GLOBAL_DEF("render/shadows_enabled", true);
+ room_cull_enabled = GLOBAL_DEF("render/room_cull_enabled", true);
+ light_discard_enabled = GLOBAL_DEF("render/light_discard_enabled", true);
rasterizer->begin_frame();
_draw_viewports();
_draw_cursors_and_margins();
rasterizer->end_frame();
- draw_extra_frame=rasterizer->needs_to_draw_next_frame();
+ draw_extra_frame = rasterizer->needs_to_draw_next_frame();
}
bool VisualServerRaster::has_changed() const {
- return changes>0 || draw_extra_frame;
+ return changes > 0 || draw_extra_frame;
}
int VisualServerRaster::get_render_info(RenderInfo p_info) {
@@ -7606,9 +7006,9 @@ bool VisualServerRaster::has_feature(Features p_feature) const {
return rasterizer->has_feature(p_feature); // lies for now
}
-void VisualServerRaster::set_default_clear_color(const Color& p_color) {
+void VisualServerRaster::set_default_clear_color(const Color &p_color) {
- clear_color=p_color;
+ clear_color = p_color;
}
Color VisualServerRaster::get_default_clear_color() const {
@@ -7616,7 +7016,7 @@ Color VisualServerRaster::get_default_clear_color() const {
return clear_color;
}
-void VisualServerRaster::set_boot_image(const Image& p_image, const Color& p_color,bool p_scale) {
+void VisualServerRaster::set_boot_image(const Image &p_image, const Color &p_color, bool p_scale) {
if (p_image.empty())
return;
@@ -7628,18 +7028,18 @@ void VisualServerRaster::set_boot_image(const Image& p_image, const Color& p_col
int window_w = OS::get_singleton()->get_video_mode(0).width;
int window_h = OS::get_singleton()->get_video_mode(0).height;
ViewportRect vr;
- vr.x=0;
- vr.y=0;
- vr.width=OS::get_singleton()->get_video_mode(0).width;
- vr.height=OS::get_singleton()->get_video_mode(0).height;
+ vr.x = 0;
+ vr.y = 0;
+ vr.width = OS::get_singleton()->get_video_mode(0).width;
+ vr.height = OS::get_singleton()->get_video_mode(0).height;
rasterizer->set_viewport(vr);
rasterizer->clear_viewport(p_color);
rasterizer->canvas_begin();
RID texture = texture_create();
- texture_allocate(texture,p_image.get_width(),p_image.get_height(),p_image.get_format(),TEXTURE_FLAG_FILTER);
- texture_set_data(texture,p_image);
+ texture_allocate(texture, p_image.get_width(), p_image.get_height(), p_image.get_format(), TEXTURE_FLAG_FILTER);
+ texture_set_data(texture, p_image);
rasterizer->canvas_begin_rect(Matrix32());
- Rect2 imgrect(0,0,p_image.get_width(),p_image.get_height());
+ Rect2 imgrect(0, 0, p_image.get_width(), p_image.get_height());
Rect2 screenrect;
if (p_scale) {
@@ -7647,59 +7047,57 @@ void VisualServerRaster::set_boot_image(const Image& p_image, const Color& p_col
//scale horizontally
screenrect.size.y = window_h;
screenrect.size.x = imgrect.size.x * window_h / imgrect.size.y;
- screenrect.pos.x = (window_w - screenrect.size.x)/2;
+ screenrect.pos.x = (window_w - screenrect.size.x) / 2;
} else {
//scale vertically
screenrect.size.x = window_w;
screenrect.size.y = imgrect.size.y * window_w / imgrect.size.x;
- screenrect.pos.y = (window_h - screenrect.size.y)/2;
+ screenrect.pos.y = (window_h - screenrect.size.y) / 2;
}
} else {
- screenrect=imgrect;
- screenrect.pos+=((Size2(vr.width,vr.height)-screenrect.size)/2.0).floor();
-
+ screenrect = imgrect;
+ screenrect.pos += ((Size2(vr.width, vr.height) - screenrect.size) / 2.0).floor();
}
- rasterizer->canvas_draw_rect(screenrect,0,imgrect,texture,Color(1,1,1,1));
+ rasterizer->canvas_draw_rect(screenrect, 0, imgrect, texture, Color(1, 1, 1, 1));
rasterizer->canvas_end_rect();
rasterizer->end_frame();
rasterizer->flush_frame();
free(texture); // free since it's only one frame that stays there
-
}
void VisualServerRaster::init() {
rasterizer->init();
- shadows_enabled=GLOBAL_DEF("render/shadows_enabled",true);
+ shadows_enabled = GLOBAL_DEF("render/shadows_enabled", true);
//default_scenario = scenario_create();
//default_viewport = viewport_create();
- for(int i=0;i<4;i++)
- black_margin[i]=0;
+ for (int i = 0; i < 4; i++)
+ black_margin[i] = 0;
Image img;
img.create(default_mouse_cursor_xpm);
//img.convert(Image::FORMAT_RGB);
default_cursor_texture = texture_create_from_image(img, 0);
- aabb_random_points.resize( GLOBAL_DEF("render/aabb_random_points",16) );
- for(int i=0;i<aabb_random_points.size();i++)
- aabb_random_points[i]=Vector3(Math::random(0,1),Math::random(0,1),Math::random(0,1));
+ aabb_random_points.resize(GLOBAL_DEF("render/aabb_random_points", 16));
+ for (int i = 0; i < aabb_random_points.size(); i++)
+ aabb_random_points[i] = Vector3(Math::random(0, 1), Math::random(0, 1), Math::random(0, 1));
transformed_aabb_random_points.resize(aabb_random_points.size());
- changes=0;
+ changes = 0;
}
-void VisualServerRaster::_clean_up_owner(RID_OwnerBase *p_owner,String p_type) {
+void VisualServerRaster::_clean_up_owner(RID_OwnerBase *p_owner, String p_type) {
List<RID> rids;
p_owner->get_owned_list(&rids);
- int lost=0;
- for(List<RID>::Element *I=rids.front();I;I=I->next()) {
+ int lost = 0;
+ for (List<RID>::Element *I = rids.front(); I; I = I->next()) {
if (OS::get_singleton()->is_stdout_verbose()) {
lost++;
}
@@ -7707,66 +7105,57 @@ void VisualServerRaster::_clean_up_owner(RID_OwnerBase *p_owner,String p_type) {
}
if (lost)
- print_line("VisualServerRaster: WARNING: Lost "+itos(lost)+" RIDs of type "+p_type);
-
+ print_line("VisualServerRaster: WARNING: Lost " + itos(lost) + " RIDs of type " + p_type);
}
void VisualServerRaster::finish() {
-
free(default_cursor_texture);
if (test_cube.is_valid())
free(test_cube);
_free_internal_rids();
- _clean_up_owner( &room_owner,"Room" );
- _clean_up_owner( &portal_owner,"Portal" );
+ _clean_up_owner(&room_owner, "Room");
+ _clean_up_owner(&portal_owner, "Portal");
- _clean_up_owner( &camera_owner,"Camera" );
- _clean_up_owner( &viewport_owner,"Viewport" );
+ _clean_up_owner(&camera_owner, "Camera");
+ _clean_up_owner(&viewport_owner, "Viewport");
- _clean_up_owner( &scenario_owner,"Scenario" );
- _clean_up_owner( &instance_owner,"Instance" );
+ _clean_up_owner(&scenario_owner, "Scenario");
+ _clean_up_owner(&instance_owner, "Instance");
- _clean_up_owner( &canvas_owner,"Canvas" );
- _clean_up_owner( &canvas_item_owner,"CanvasItem" );
+ _clean_up_owner(&canvas_owner, "Canvas");
+ _clean_up_owner(&canvas_item_owner, "CanvasItem");
rasterizer->finish();
octree_allocator.clear();
if (instance_dependency_map.size()) {
- print_line("Base resources missing amount: "+itos(instance_dependency_map.size()));
+ print_line("Base resources missing amount: " + itos(instance_dependency_map.size()));
}
- ERR_FAIL_COND( instance_dependency_map.size() );
+ ERR_FAIL_COND(instance_dependency_map.size());
}
-
-RID VisualServerRaster::get_test_cube() {
+RID VisualServerRaster::get_test_cube() {
if (test_cube.is_valid())
return test_cube;
- test_cube=_make_test_cube();
+ test_cube = _make_test_cube();
return test_cube;
-
}
-
-
VisualServerRaster::VisualServerRaster(Rasterizer *p_rasterizer) {
- rasterizer=p_rasterizer;
- rasterizer->draw_viewport_func=_render_canvas_item_viewport;
- instance_update_list=NULL;
- render_pass=0;
- clear_color=Color(0.3,0.3,0.3,1.0);
- OctreeAllocator::allocator=&octree_allocator;
- draw_extra_frame=false;
-
+ rasterizer = p_rasterizer;
+ rasterizer->draw_viewport_func = _render_canvas_item_viewport;
+ instance_update_list = NULL;
+ render_pass = 0;
+ clear_color = Color(0.3, 0.3, 0.3, 1.0);
+ OctreeAllocator::allocator = &octree_allocator;
+ draw_extra_frame = false;
}
-
-VisualServerRaster::~VisualServerRaster()
-{
+VisualServerRaster::~VisualServerRaster() {
}
diff --git a/servers/visual/visual_server_raster.h b/servers/visual/visual_server_raster.h
index 13564f3dc..e06aad2be 100644
--- a/servers/visual/visual_server_raster.h
+++ b/servers/visual/visual_server_raster.h
@@ -29,31 +29,27 @@
#ifndef VISUAL_SERVER_RASTER_H
#define VISUAL_SERVER_RASTER_H
-
-#include "servers/visual_server.h"
-#include "servers/visual/rasterizer.h"
#include "allocators.h"
#include "octree.h"
+#include "servers/visual/rasterizer.h"
+#include "servers/visual_server.h"
/**
@author Juan Linietsky <reduzio@gmail.com>
*/
-
class VisualServerRaster : public VisualServer {
-
enum {
- MAX_INSTANCE_CULL=8192,
- MAX_INSTANCE_LIGHTS=4,
- LIGHT_CACHE_DIRTY=-1,
- MAX_LIGHTS_CULLED=256,
- MAX_ROOM_CULL=32,
- MAX_EXTERIOR_PORTALS=128,
- MAX_LIGHT_SAMPLERS=256,
- INSTANCE_ROOMLESS_MASK=(1<<20)
-
+ MAX_INSTANCE_CULL = 8192,
+ MAX_INSTANCE_LIGHTS = 4,
+ LIGHT_CACHE_DIRTY = -1,
+ MAX_LIGHTS_CULLED = 256,
+ MAX_ROOM_CULL = 32,
+ MAX_EXTERIOR_PORTALS = 128,
+ MAX_LIGHT_SAMPLERS = 256,
+ INSTANCE_ROOMLESS_MASK = (1 << 20)
};
@@ -61,10 +57,9 @@ class VisualServerRaster : public VisualServer {
bool occlude_exterior;
BSP_Tree bounds;
- Room() { occlude_exterior=true; }
+ Room() { occlude_exterior = true; }
};
-
BalloonAllocator<> octree_allocator;
struct OctreeAllocator {
@@ -73,7 +68,6 @@ class VisualServerRaster : public VisualServer {
_FORCE_INLINE_ static void *alloc(size_t p_size) { return allocator->alloc(p_size); }
_FORCE_INLINE_ static void free(void *p_ptr) { return allocator->free(p_ptr); }
-
};
struct Portal {
@@ -85,8 +79,12 @@ class VisualServerRaster : public VisualServer {
Vector<Point2> shape;
Rect2 bounds;
-
- Portal() { enabled=true; disable_distance=50; disable_color=Color(); connect_range=0.8; }
+ Portal() {
+ enabled = true;
+ disable_distance = 50;
+ disable_color = Color();
+ connect_range = 0.8;
+ }
};
struct BakedLight {
@@ -96,7 +94,6 @@ class VisualServerRaster : public VisualServer {
AABB octree_aabb;
Size2i octree_tex_size;
Size2i light_tex_size;
-
};
struct BakedLightSampler {
@@ -106,16 +103,16 @@ class VisualServerRaster : public VisualServer {
Vector<Vector3> dp_cache;
BakedLightSampler() {
- params[BAKED_LIGHT_SAMPLER_STRENGTH]=1.0;
- params[BAKED_LIGHT_SAMPLER_ATTENUATION]=1.0;
- params[BAKED_LIGHT_SAMPLER_RADIUS]=1.0;
- params[BAKED_LIGHT_SAMPLER_DETAIL_RATIO]=0.1;
- resolution=16;
+ params[BAKED_LIGHT_SAMPLER_STRENGTH] = 1.0;
+ params[BAKED_LIGHT_SAMPLER_ATTENUATION] = 1.0;
+ params[BAKED_LIGHT_SAMPLER_RADIUS] = 1.0;
+ params[BAKED_LIGHT_SAMPLER_DETAIL_RATIO] = 0.1;
+ resolution = 16;
}
};
- void _update_baked_light_sampler_dp_cache(BakedLightSampler * blsamp);
- struct Camera {
+ void _update_baked_light_sampler_dp_cache(BakedLightSampler *blsamp);
+ struct Camera {
enum Type {
PERSPECTIVE,
@@ -123,7 +120,7 @@ class VisualServerRaster : public VisualServer {
};
Type type;
float fov;
- float znear,zfar;
+ float znear, zfar;
float size;
uint32_t visible_layers;
bool vaspect;
@@ -131,28 +128,27 @@ class VisualServerRaster : public VisualServer {
Transform transform;
- Camera() {
-
- visible_layers=0xFFFFFFFF;
- fov=60;
- type=PERSPECTIVE;
- znear=0.1; zfar=100;
- size=1.0;
- vaspect=false;
-
- }
- };
+ Camera() {
+ visible_layers = 0xFFFFFFFF;
+ fov = 60;
+ type = PERSPECTIVE;
+ znear = 0.1;
+ zfar = 100;
+ size = 1.0;
+ vaspect = false;
+ }
+ };
struct Instance;
- typedef Set<Instance*,Comparator<Instance*>,OctreeAllocator> InstanceSet;
+ typedef Set<Instance *, Comparator<Instance *>, OctreeAllocator> InstanceSet;
struct Scenario;
struct Instance {
enum {
- MAX_LIGHTS=4
+ MAX_LIGHTS = 4
};
RID self;
@@ -176,17 +172,14 @@ class VisualServerRaster : public VisualServer {
float draw_range_end;
float extra_margin;
-
-
Rasterizer::InstanceData data;
-
- Set<Instance*> auto_rooms;
- Set<Instance*> valid_auto_rooms;
+ Set<Instance *> auto_rooms;
+ Set<Instance *> valid_auto_rooms;
Instance *room;
- List<Instance*>::Element *RE;
+ List<Instance *>::Element *RE;
Instance *baked_light;
- List<Instance*>::Element *BLE;
+ List<Instance *>::Element *BLE;
Instance *sampled_light;
bool exterior;
@@ -198,35 +191,34 @@ class VisualServerRaster : public VisualServer {
InstanceSet lights;
bool light_cache_dirty;
-
-
struct RoomInfo {
Transform affine_inverse;
Room *room;
- List<Instance*> owned_geometry_instances;
- List<Instance*> owned_portal_instances;
- List<Instance*> owned_room_instances;
- List<Instance*> owned_light_instances; //not used, but just for the sake of it
- Set<Instance*> disconnected_child_portals;
- Set<Instance*> owned_autoroom_geometry;
+ List<Instance *> owned_geometry_instances;
+ List<Instance *> owned_portal_instances;
+ List<Instance *> owned_room_instances;
+ List<Instance *> owned_light_instances; //not used, but just for the sake of it
+ Set<Instance *> disconnected_child_portals;
+ Set<Instance *> owned_autoroom_geometry;
uint64_t last_visited_pass;
- RoomInfo() { last_visited_pass=0; }
-
+ RoomInfo() { last_visited_pass = 0; }
};
struct PortalInfo {
Portal *portal;
- Set<Instance*> candidate_set;
+ Set<Instance *> candidate_set;
Instance *connected;
uint64_t last_visited_pass;
Plane plane_cache;
Vector<Vector3> transformed_point_cache;
-
- PortalInfo() { connected=NULL; last_visited_pass=0;}
+ PortalInfo() {
+ connected = NULL;
+ last_visited_pass = 0;
+ }
};
struct LightInfo {
@@ -240,13 +232,12 @@ class VisualServerRaster : public VisualServer {
bool enabled;
float dtc; //distance to camera, used for sorting
-
LightInfo() {
- D=NULL;
- light_set_index=-1;
- last_add_pass=0;
- enabled=true;
+ D = NULL;
+ light_set_index = -1;
+ last_add_pass = 0;
+ enabled = true;
}
};
@@ -254,13 +245,13 @@ class VisualServerRaster : public VisualServer {
BakedLight *baked_light;
Transform affine_inverse;
- List<Instance*> owned_instances;
+ List<Instance *> owned_instances;
};
struct BakedLightSamplerInfo {
- Set<Instance*> baked_lights;
- Set<Instance*> owned_instances;
+ Set<Instance *> baked_lights;
+ Set<Instance *> owned_instances;
BakedLightSampler *sampler;
int resolution;
Vector<Color> light_bufer;
@@ -268,9 +259,9 @@ class VisualServerRaster : public VisualServer {
uint64_t last_pass;
Transform xform; // viewspace normal to lightspace, might not use one.
BakedLightSamplerInfo() {
- sampler=NULL;
- last_pass=0;
- resolution=0;
+ sampler = NULL;
+ last_pass = 0;
+ resolution = 0;
}
};
@@ -279,56 +270,53 @@ class VisualServerRaster : public VisualServer {
RID instance;
};
-
RoomInfo *room_info;
LightInfo *light_info;
ParticlesInfo *particles_info;
- PortalInfo * portal_info;
- BakedLightInfo * baked_light_info;
- BakedLightSamplerInfo * baked_light_sampler_info;
-
+ PortalInfo *portal_info;
+ BakedLightInfo *baked_light_info;
+ BakedLightSamplerInfo *baked_light_sampler_info;
Instance() {
- octree_id=0;
- update_next=0;
- object_ID=0;
- last_render_pass=0;
- last_frame_pass=0;
- light_info=0;
- particles_info=0;
- update_next=NULL;
- update=false;
- visible=true;
- data.cast_shadows=SHADOW_CASTING_SETTING_ON;
- data.receive_shadows=true;
- data.depth_scale=false;
- data.billboard=false;
- data.billboard_y=false;
- data.baked_light=NULL;
- data.baked_light_octree_xform=NULL;
- data.baked_lightmap_id=-1;
- version=1;
- room_info=NULL;
- room=NULL;
- RE=NULL;
- portal_info=NULL;
- exterior=false;
- layer_mask=1;
- draw_range_begin=0;
- draw_range_end=0;
- extra_margin=0;
- visible_in_all_rooms=false;
- update_aabb=false;
- update_materials=false;
+ octree_id = 0;
+ update_next = 0;
+ object_ID = 0;
+ last_render_pass = 0;
+ last_frame_pass = 0;
+ light_info = 0;
+ particles_info = 0;
+ update_next = NULL;
+ update = false;
+ visible = true;
+ data.cast_shadows = SHADOW_CASTING_SETTING_ON;
+ data.receive_shadows = true;
+ data.depth_scale = false;
+ data.billboard = false;
+ data.billboard_y = false;
+ data.baked_light = NULL;
+ data.baked_light_octree_xform = NULL;
+ data.baked_lightmap_id = -1;
+ version = 1;
+ room_info = NULL;
+ room = NULL;
+ RE = NULL;
+ portal_info = NULL;
+ exterior = false;
+ layer_mask = 1;
+ draw_range_begin = 0;
+ draw_range_end = 0;
+ extra_margin = 0;
+ visible_in_all_rooms = false;
+ update_aabb = false;
+ update_materials = false;
- baked_light=NULL;
- baked_light_info=NULL;
- baked_light_sampler_info=NULL;
- sampled_light=NULL;
- BLE=NULL;
-
- light_cache_dirty=true;
+ baked_light = NULL;
+ baked_light_info = NULL;
+ baked_light_sampler_info = NULL;
+ sampled_light = NULL;
+ BLE = NULL;
+ light_cache_dirty = true;
}
~Instance() {
@@ -348,16 +336,15 @@ class VisualServerRaster : public VisualServer {
struct _InstanceLightsort {
- bool operator()(const Instance* p_A, const Instance* p_B) const { return p_A->light_info->dtc < p_B->light_info->dtc; }
+ bool operator()(const Instance *p_A, const Instance *p_B) const { return p_A->light_info->dtc < p_B->light_info->dtc; }
};
struct Scenario {
-
ScenarioDebugMode debug;
RID self;
// well wtf, balloon allocator is slower?
- typedef ::Octree<Instance,true> Octree;
+ typedef ::Octree<Instance, true> Octree;
Octree octree;
@@ -367,18 +354,18 @@ class VisualServerRaster : public VisualServer {
Instance *dirty_instances;
- Scenario() { dirty_instances=NULL; debug=SCENARIO_DEBUG_DISABLED; }
+ Scenario() {
+ dirty_instances = NULL;
+ debug = SCENARIO_DEBUG_DISABLED;
+ }
};
-
-
mutable RID_Owner<Rasterizer::CanvasItemMaterial> canvas_item_material_owner;
struct CanvasItem : public Rasterizer::CanvasItem {
-
RID parent; // canvas it belongs to
- List<CanvasItem*>::Element *E;
+ List<CanvasItem *>::Element *E;
RID viewport;
int z;
bool z_relative;
@@ -387,27 +374,24 @@ class VisualServerRaster : public VisualServer {
float self_opacity;
bool use_parent_material;
-
- Vector<CanvasItem*> child_items;
-
+ Vector<CanvasItem *> child_items;
CanvasItem() {
- E=NULL;
- z=0;
- opacity=1;
- self_opacity=1;
- sort_y=false;
- use_parent_material=false;
- z_relative=true;
+ E = NULL;
+ z = 0;
+ opacity = 1;
+ self_opacity = 1;
+ sort_y = false;
+ use_parent_material = false;
+ z_relative = true;
}
};
-
struct CanvasItemPtrSort {
- _FORCE_INLINE_ bool operator()(const CanvasItem* p_left,const CanvasItem* p_right) const {
+ _FORCE_INLINE_ bool operator()(const CanvasItem *p_left, const CanvasItem *p_right) const {
- if(Math::abs(p_left->xform.elements[2].y - p_right->xform.elements[2].y) < CMP_EPSILON )
+ if (Math::abs(p_left->xform.elements[2].y - p_right->xform.elements[2].y) < CMP_EPSILON)
return p_left->xform.elements[2].x < p_right->xform.elements[2].x;
else
return p_left->xform.elements[2].y < p_right->xform.elements[2].y;
@@ -422,12 +406,14 @@ class VisualServerRaster : public VisualServer {
Rect2 aabb;
CanvasOccluderPolygonCullMode cull_mode;
RID occluder;
- Set<Rasterizer::CanvasLightOccluderInstance*> owners;
+ Set<Rasterizer::CanvasLightOccluderInstance *> owners;
- CanvasLightOccluderPolygon() { active=false; cull_mode=CANVAS_OCCLUDER_POLYGON_CULL_DISABLED; }
+ CanvasLightOccluderPolygon() {
+ active = false;
+ cull_mode = CANVAS_OCCLUDER_POLYGON_CULL_DISABLED;
+ }
};
-
RID_Owner<CanvasLightOccluderPolygon> canvas_light_occluder_polygon_owner;
RID_Owner<Rasterizer::CanvasLightOccluderInstance> canvas_light_occluder_owner;
@@ -443,33 +429,30 @@ class VisualServerRaster : public VisualServer {
CanvasItem *item;
};
- Set<Rasterizer::CanvasLight*> lights;
- Set<Rasterizer::CanvasLightOccluderInstance*> occluders;
+ Set<Rasterizer::CanvasLight *> lights;
+ Set<Rasterizer::CanvasLightOccluderInstance *> occluders;
Vector<ChildItem> child_items;
Color modulate;
int find_item(CanvasItem *p_item) {
- for(int i=0;i<child_items.size();i++) {
- if (child_items[i].item==p_item)
+ for (int i = 0; i < child_items.size(); i++) {
+ if (child_items[i].item == p_item)
return i;
}
return -1;
}
void erase_item(CanvasItem *p_item) {
- int idx=find_item(p_item);
- if (idx>=0)
+ int idx = find_item(p_item);
+ if (idx >= 0)
child_items.remove(idx);
}
- Canvas() { modulate=Color(1,1,1,1); }
-
+ Canvas() { modulate = Color(1, 1, 1, 1); }
};
-
RID_Owner<Rasterizer::CanvasLight> canvas_light_owner;
-
struct Viewport {
RID self;
@@ -503,9 +486,15 @@ class VisualServerRaster : public VisualServer {
int layer;
RID canvas;
- bool operator<(const CanvasKey& p_canvas) const { if (layer==p_canvas.layer) return canvas < p_canvas.canvas; return layer<p_canvas.layer; }
- CanvasKey() { layer=0; }
- CanvasKey(const RID& p_canvas, int p_layer) { canvas=p_canvas; layer=p_layer; }
+ bool operator<(const CanvasKey &p_canvas) const {
+ if (layer == p_canvas.layer) return canvas < p_canvas.canvas;
+ return layer < p_canvas.layer;
+ }
+ CanvasKey() { layer = 0; }
+ CanvasKey(const RID &p_canvas, int p_layer) {
+ canvas = p_canvas;
+ layer = p_layer;
+ }
};
struct CanvasData {
@@ -517,26 +506,34 @@ class VisualServerRaster : public VisualServer {
Matrix32 global_transform;
- Map<RID,CanvasData> canvas_map;
+ Map<RID, CanvasData> canvas_map;
SelfList<Viewport> update_list;
- Viewport() : update_list(this) { transparent_bg=false; render_target_update_mode=RENDER_TARGET_UPDATE_WHEN_VISIBLE; queue_capture=false; rendered_in_prev_frame=false; render_target_vflip=false; render_target_clear_on_new_frame=true; render_target_clear=true; disable_environment=false; }
+ Viewport()
+ : update_list(this) {
+ transparent_bg = false;
+ render_target_update_mode = RENDER_TARGET_UPDATE_WHEN_VISIBLE;
+ queue_capture = false;
+ rendered_in_prev_frame = false;
+ render_target_vflip = false;
+ render_target_clear_on_new_frame = true;
+ render_target_clear = true;
+ disable_environment = false;
+ }
};
SelfList<Viewport>::List viewport_update_list;
- Map<RID,int> screen_viewports;
+ Map<RID, int> screen_viewports;
struct CullRange {
Plane nearp;
- float min,max;
- float z_near,z_far;
-
- void add_aabb(const AABB& p_aabb) {
-
+ float min, max;
+ float z_near, z_far;
+ void add_aabb(const AABB &p_aabb) {
}
};
@@ -561,8 +558,8 @@ class VisualServerRaster : public VisualServer {
Cursor cursors[MAX_CURSORS];
RID default_cursor_texture;
- static void* instance_pair(void *p_self, OctreeElementID,Instance *p_A,int, OctreeElementID,Instance *p_B,int);
- static void instance_unpair(void *p_self, OctreeElementID,Instance *p_A,int, OctreeElementID,Instance *p_B,int,void*);
+ static void *instance_pair(void *p_self, OctreeElementID, Instance *p_A, int, OctreeElementID, Instance *p_B, int);
+ static void instance_unpair(void *p_self, OctreeElementID, Instance *p_A, int, OctreeElementID, Instance *p_B, int, void *);
Instance *instance_cull_result[MAX_INSTANCE_CULL];
Instance *instance_shadow_cull_result[MAX_INSTANCE_CULL]; //used for generating shadowmaps
@@ -589,15 +586,15 @@ class VisualServerRaster : public VisualServer {
void _instance_validate_autorooms(Instance *p_geometry);
- void _portal_disconnect(Instance *p_portal,bool p_cleanup=false);
+ void _portal_disconnect(Instance *p_portal, bool p_cleanup = false);
void _portal_attempt_connect(Instance *p_portal);
- void _dependency_queue_update(RID p_rid, bool p_update_aabb=false, bool p_update_materials=false);
- _FORCE_INLINE_ void _instance_queue_update(Instance *p_instance,bool p_update_aabb=false,bool p_update_materials=false);
+ void _dependency_queue_update(RID p_rid, bool p_update_aabb = false, bool p_update_materials = false);
+ _FORCE_INLINE_ void _instance_queue_update(Instance *p_instance, bool p_update_aabb = false, bool p_update_materials = false);
void _update_instances();
void _update_instance_aabb(Instance *p_instance);
void _update_instance(Instance *p_instance);
- void _free_attached_instances(RID p_rid,bool p_free_scenario=false);
- void _clean_up_owner(RID_OwnerBase *p_owner,String p_type);
+ void _free_attached_instances(RID p_rid, bool p_free_scenario = false);
+ void _clean_up_owner(RID_OwnerBase *p_owner, String p_type);
Instance *instance_update_list;
@@ -606,7 +603,6 @@ class VisualServerRaster : public VisualServer {
RID test_cube;
-
mutable RID_Owner<Room> room_owner;
mutable RID_Owner<Portal> portal_owner;
@@ -622,85 +618,81 @@ class VisualServerRaster : public VisualServer {
mutable RID_Owner<Canvas> canvas_owner;
mutable RID_Owner<CanvasItem> canvas_item_owner;
- Map< RID, Set<RID> > instance_dependency_map;
- Map< RID, Set<Instance*> > skeleton_dependency_map;
-
+ Map<RID, Set<RID> > instance_dependency_map;
+ Map<RID, Set<Instance *> > skeleton_dependency_map;
ViewportRect viewport_rect;
_FORCE_INLINE_ void _instance_draw(Instance *p_instance);
bool _test_portal_cull(Camera *p_camera, Instance *p_portal_from, Instance *p_portal_to);
- void _cull_portal(Camera *p_camera, Instance *p_portal,Instance *p_from_portal);
- void _cull_room(Camera *p_camera, Instance *p_room,Instance *p_from_portal=NULL);
+ void _cull_portal(Camera *p_camera, Instance *p_portal, Instance *p_from_portal);
+ void _cull_room(Camera *p_camera, Instance *p_room, Instance *p_from_portal = NULL);
void _process_sampled_light(const Transform &p_camera, Instance *p_sampled_light, bool p_linear_colorspace);
- void _render_no_camera(Viewport *p_viewport,Camera *p_camera, Scenario *p_scenario);
- void _render_camera(Viewport *p_viewport,Camera *p_camera, Scenario *p_scenario);
- static void _render_canvas_item_viewport(VisualServer* p_self,void *p_vp,const Rect2& p_rect);
- void _render_canvas_item_tree(CanvasItem *p_canvas_item, const Matrix32& p_transform, const Rect2& p_clip_rect, const Color &p_modulate, Rasterizer::CanvasLight *p_lights);
- void _render_canvas_item(CanvasItem *p_canvas_item, const Matrix32& p_transform, const Rect2& p_clip_rect, float p_opacity, int p_z, Rasterizer::CanvasItem **z_list, Rasterizer::CanvasItem **z_last_list, CanvasItem *p_canvas_clip, CanvasItem *p_material_owner);
+ void _render_no_camera(Viewport *p_viewport, Camera *p_camera, Scenario *p_scenario);
+ void _render_camera(Viewport *p_viewport, Camera *p_camera, Scenario *p_scenario);
+ static void _render_canvas_item_viewport(VisualServer *p_self, void *p_vp, const Rect2 &p_rect);
+ void _render_canvas_item_tree(CanvasItem *p_canvas_item, const Matrix32 &p_transform, const Rect2 &p_clip_rect, const Color &p_modulate, Rasterizer::CanvasLight *p_lights);
+ void _render_canvas_item(CanvasItem *p_canvas_item, const Matrix32 &p_transform, const Rect2 &p_clip_rect, float p_opacity, int p_z, Rasterizer::CanvasItem **z_list, Rasterizer::CanvasItem **z_last_list, CanvasItem *p_canvas_clip, CanvasItem *p_material_owner);
void _render_canvas(Canvas *p_canvas, const Matrix32 &p_transform, Rasterizer::CanvasLight *p_lights, Rasterizer::CanvasLight *p_masked_lights);
- void _light_mask_canvas_items(int p_z,Rasterizer::CanvasItem *p_canvas_item,Rasterizer::CanvasLight *p_masked_lights);
+ void _light_mask_canvas_items(int p_z, Rasterizer::CanvasItem *p_canvas_item, Rasterizer::CanvasLight *p_masked_lights);
- Vector<Vector3> _camera_generate_endpoints(Instance *p_light,Camera *p_camera,float p_range_min, float p_range_max);
- Vector<Plane> _camera_generate_orthogonal_planes(Instance *p_light,Camera *p_camera,float p_range_min, float p_range_max);
+ Vector<Vector3> _camera_generate_endpoints(Instance *p_light, Camera *p_camera, float p_range_min, float p_range_max);
+ Vector<Plane> _camera_generate_orthogonal_planes(Instance *p_light, Camera *p_camera, float p_range_min, float p_range_max);
- void _light_instance_update_lispsm_shadow(Instance *p_light,Scenario *p_scenario,Camera *p_camera,const CullRange& p_cull_range);
- void _light_instance_update_pssm_shadow(Instance *p_light,Scenario *p_scenario,Camera *p_camera,const CullRange& p_cull_range);
+ void _light_instance_update_lispsm_shadow(Instance *p_light, Scenario *p_scenario, Camera *p_camera, const CullRange &p_cull_range);
+ void _light_instance_update_pssm_shadow(Instance *p_light, Scenario *p_scenario, Camera *p_camera, const CullRange &p_cull_range);
- void _light_instance_update_shadow(Instance *p_light,Scenario *p_scenario,Camera *p_camera,const CullRange& p_cull_range);
+ void _light_instance_update_shadow(Instance *p_light, Scenario *p_scenario, Camera *p_camera, const CullRange &p_cull_range);
uint64_t render_pass;
int changes;
bool draw_extra_frame;
void _draw_viewport_camera(Viewport *p_viewport, bool p_ignore_camera);
- void _draw_viewport(Viewport *p_viewport,int p_ofs_x, int p_ofs_y,int p_parent_w,int p_parent_h);
+ void _draw_viewport(Viewport *p_viewport, int p_ofs_x, int p_ofs_y, int p_parent_w, int p_parent_h);
void _draw_viewports();
void _draw_cursors_and_margins();
-
Rasterizer *rasterizer;
-public:
+public:
virtual RID texture_create();
- virtual void texture_allocate(RID p_texture,int p_width, int p_height,Image::Format p_format,uint32_t p_flags=TEXTURE_FLAGS_DEFAULT);
- virtual void texture_set_data(RID p_texture,const Image& p_image,CubeMapSide p_cube_side=CUBEMAP_LEFT);
- virtual Image texture_get_data(RID p_texture,CubeMapSide p_cube_side=CUBEMAP_LEFT) const;
- virtual void texture_set_flags(RID p_texture,uint32_t p_flags) ;
+ virtual void texture_allocate(RID p_texture, int p_width, int p_height, Image::Format p_format, uint32_t p_flags = TEXTURE_FLAGS_DEFAULT);
+ virtual void texture_set_data(RID p_texture, const Image &p_image, CubeMapSide p_cube_side = CUBEMAP_LEFT);
+ virtual Image texture_get_data(RID p_texture, CubeMapSide p_cube_side = CUBEMAP_LEFT) const;
+ virtual void texture_set_flags(RID p_texture, uint32_t p_flags);
virtual uint32_t texture_get_flags(RID p_texture) const;
virtual Image::Format texture_get_format(RID p_texture) const;
virtual uint32_t texture_get_width(RID p_texture) const;
virtual uint32_t texture_get_height(RID p_texture) const;
- virtual void texture_set_size_override(RID p_texture,int p_width, int p_height);
+ virtual void texture_set_size_override(RID p_texture, int p_width, int p_height);
virtual bool texture_can_stream(RID p_texture) const;
- virtual void texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const;
+ virtual void texture_set_reload_hook(RID p_texture, ObjectID p_owner, const StringName &p_function) const;
- virtual void texture_set_path(RID p_texture,const String& p_path);
+ virtual void texture_set_path(RID p_texture, const String &p_path);
virtual String texture_get_path(RID p_texture) const;
virtual void texture_debug_usage(List<TextureInfo> *r_info);
virtual void texture_set_shrink_all_x2_on_set_data(bool p_enable);
-
/* SHADER API */
- virtual RID shader_create(ShaderMode p_mode=SHADER_MATERIAL);
+ virtual RID shader_create(ShaderMode p_mode = SHADER_MATERIAL);
- virtual void shader_set_mode(RID p_shader,ShaderMode p_mode);
+ virtual void shader_set_mode(RID p_shader, ShaderMode p_mode);
virtual ShaderMode shader_get_mode(RID p_shader) const;
- virtual void shader_set_code(RID p_shader, const String& p_vertex, const String& p_fragment,const String& p_light,int p_vertex_ofs=0,int p_fragment_ofs=0,int p_light_ofs=0);
+ virtual void shader_set_code(RID p_shader, const String &p_vertex, const String &p_fragment, const String &p_light, int p_vertex_ofs = 0, int p_fragment_ofs = 0, int p_light_ofs = 0);
virtual String shader_get_vertex_code(RID p_shader) const;
virtual String shader_get_fragment_code(RID p_shader) const;
virtual String shader_get_light_code(RID p_shader) const;
virtual void shader_get_param_list(RID p_shader, List<PropertyInfo> *p_param_list) const;
- virtual void shader_set_default_texture_param(RID p_shader, const StringName& p_name, RID p_texture);
- virtual RID shader_get_default_texture_param(RID p_shader, const StringName& p_name) const;
-
+ virtual void shader_set_default_texture_param(RID p_shader, const StringName &p_name, RID p_texture);
+ virtual RID shader_get_default_texture_param(RID p_shader, const StringName &p_name) const;
/* COMMON MATERIAL API */
@@ -709,64 +701,62 @@ public:
virtual void material_set_shader(RID p_shader_material, RID p_shader);
virtual RID material_get_shader(RID p_shader_material) const;
- virtual void material_set_param(RID p_material, const StringName& p_param, const Variant& p_value);
- virtual Variant material_get_param(RID p_material, const StringName& p_param) const;
+ virtual void material_set_param(RID p_material, const StringName &p_param, const Variant &p_value);
+ virtual Variant material_get_param(RID p_material, const StringName &p_param) const;
- virtual void material_set_flag(RID p_material, MaterialFlag p_flag,bool p_enabled);
- virtual bool material_get_flag(RID p_material,MaterialFlag p_flag) const;
+ virtual void material_set_flag(RID p_material, MaterialFlag p_flag, bool p_enabled);
+ virtual bool material_get_flag(RID p_material, MaterialFlag p_flag) const;
virtual void material_set_depth_draw_mode(RID p_material, MaterialDepthDrawMode p_mode);
virtual MaterialDepthDrawMode material_get_depth_draw_mode(RID p_material) const;
- virtual void material_set_blend_mode(RID p_material,MaterialBlendMode p_mode);
+ virtual void material_set_blend_mode(RID p_material, MaterialBlendMode p_mode);
virtual MaterialBlendMode material_get_blend_mode(RID p_material) const;
- virtual void material_set_line_width(RID p_material,float p_line_width);
+ virtual void material_set_line_width(RID p_material, float p_line_width);
virtual float material_get_line_width(RID p_material) const;
/* FIXED MATERIAL */
-
virtual RID fixed_material_create();
virtual void fixed_material_set_flag(RID p_material, FixedMaterialFlags p_flag, bool p_enabled);
virtual bool fixed_material_get_flag(RID p_material, FixedMaterialFlags p_flag) const;
- virtual void fixed_material_set_param(RID p_material, FixedMaterialParam p_parameter, const Variant& p_value);
- virtual Variant fixed_material_get_param(RID p_material,FixedMaterialParam p_parameter) const;
-
- virtual void fixed_material_set_texture(RID p_material,FixedMaterialParam p_parameter, RID p_texture);
- virtual RID fixed_material_get_texture(RID p_material,FixedMaterialParam p_parameter) const;
+ virtual void fixed_material_set_param(RID p_material, FixedMaterialParam p_parameter, const Variant &p_value);
+ virtual Variant fixed_material_get_param(RID p_material, FixedMaterialParam p_parameter) const;
- virtual void fixed_material_set_texcoord_mode(RID p_material,FixedMaterialParam p_parameter, FixedMaterialTexCoordMode p_mode);
- virtual FixedMaterialTexCoordMode fixed_material_get_texcoord_mode(RID p_material,FixedMaterialParam p_parameter) const;
+ virtual void fixed_material_set_texture(RID p_material, FixedMaterialParam p_parameter, RID p_texture);
+ virtual RID fixed_material_get_texture(RID p_material, FixedMaterialParam p_parameter) const;
+ virtual void fixed_material_set_texcoord_mode(RID p_material, FixedMaterialParam p_parameter, FixedMaterialTexCoordMode p_mode);
+ virtual FixedMaterialTexCoordMode fixed_material_get_texcoord_mode(RID p_material, FixedMaterialParam p_parameter) const;
- virtual void fixed_material_set_uv_transform(RID p_material,const Transform& p_transform);
+ virtual void fixed_material_set_uv_transform(RID p_material, const Transform &p_transform);
virtual Transform fixed_material_get_uv_transform(RID p_material) const;
- virtual void fixed_material_set_light_shader(RID p_material,FixedMaterialLightShader p_shader);
+ virtual void fixed_material_set_light_shader(RID p_material, FixedMaterialLightShader p_shader);
virtual FixedMaterialLightShader fixed_material_get_light_shader(RID p_material) const;
- virtual void fixed_material_set_point_size(RID p_material,float p_size);
+ virtual void fixed_material_set_point_size(RID p_material, float p_size);
virtual float fixed_material_get_point_size(RID p_material) const;
/* SURFACE API */
virtual RID mesh_create();
- virtual void mesh_set_morph_target_count(RID p_mesh,int p_amount);
+ virtual void mesh_set_morph_target_count(RID p_mesh, int p_amount);
virtual int mesh_get_morph_target_count(RID p_mesh) const;
- virtual void mesh_set_morph_target_mode(RID p_mesh,MorphTargetMode p_mode);
+ virtual void mesh_set_morph_target_mode(RID p_mesh, MorphTargetMode p_mode);
virtual MorphTargetMode mesh_get_morph_target_mode(RID p_mesh) const;
- virtual void mesh_add_custom_surface(RID p_mesh,const Variant& p_dat); //this is used by each platform in a different way
+ virtual void mesh_add_custom_surface(RID p_mesh, const Variant &p_dat); //this is used by each platform in a different way
- virtual void mesh_add_surface(RID p_mesh,PrimitiveType p_primitive,const Array& p_arrays,const Array& p_blend_shapes=Array(),bool p_alpha_sort=false);
- virtual Array mesh_get_surface_arrays(RID p_mesh,int p_surface) const;
- virtual Array mesh_get_surface_morph_arrays(RID p_mesh,int p_surface) const;
+ virtual void mesh_add_surface(RID p_mesh, PrimitiveType p_primitive, const Array &p_arrays, const Array &p_blend_shapes = Array(), bool p_alpha_sort = false);
+ virtual Array mesh_get_surface_arrays(RID p_mesh, int p_surface) const;
+ virtual Array mesh_get_surface_morph_arrays(RID p_mesh, int p_surface) const;
- virtual void mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material,bool p_owned=false);
+ virtual void mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material, bool p_owned = false);
virtual RID mesh_surface_get_material(RID p_mesh, int p_surface) const;
virtual int mesh_surface_get_array_len(RID p_mesh, int p_surface) const;
@@ -774,10 +764,10 @@ public:
virtual uint32_t mesh_surface_get_format(RID p_mesh, int p_surface) const;
virtual PrimitiveType mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const;
- virtual void mesh_remove_surface(RID p_mesh,int p_index);
+ virtual void mesh_remove_surface(RID p_mesh, int p_index);
virtual int mesh_get_surface_count(RID p_mesh) const;
- virtual void mesh_set_custom_aabb(RID p_mesh,const AABB& p_aabb);
+ virtual void mesh_set_custom_aabb(RID p_mesh, const AABB &p_aabb);
virtual AABB mesh_get_custom_aabb(RID p_mesh) const;
virtual void mesh_clear(RID p_mesh);
@@ -785,38 +775,37 @@ public:
/* MULTIMESH API */
virtual RID multimesh_create();
- virtual void multimesh_set_instance_count(RID p_multimesh,int p_count);
+ virtual void multimesh_set_instance_count(RID p_multimesh, int p_count);
virtual int multimesh_get_instance_count(RID p_multimesh) const;
- virtual void multimesh_set_mesh(RID p_multimesh,RID p_mesh);
- virtual void multimesh_set_aabb(RID p_multimesh,const AABB& p_aabb);
- virtual void multimesh_instance_set_transform(RID p_multimesh,int p_index,const Transform& p_transform);
- virtual void multimesh_instance_set_color(RID p_multimesh,int p_index,const Color& p_color);
+ virtual void multimesh_set_mesh(RID p_multimesh, RID p_mesh);
+ virtual void multimesh_set_aabb(RID p_multimesh, const AABB &p_aabb);
+ virtual void multimesh_instance_set_transform(RID p_multimesh, int p_index, const Transform &p_transform);
+ virtual void multimesh_instance_set_color(RID p_multimesh, int p_index, const Color &p_color);
virtual RID multimesh_get_mesh(RID p_multimesh) const;
- virtual AABB multimesh_get_aabb(RID p_multimesh,const AABB& p_aabb) const;
- virtual Transform multimesh_instance_get_transform(RID p_multimesh,int p_index) const;
- virtual Color multimesh_instance_get_color(RID p_multimesh,int p_index) const;
+ virtual AABB multimesh_get_aabb(RID p_multimesh, const AABB &p_aabb) const;
+ virtual Transform multimesh_instance_get_transform(RID p_multimesh, int p_index) const;
+ virtual Color multimesh_instance_get_color(RID p_multimesh, int p_index) const;
- virtual void multimesh_set_visible_instances(RID p_multimesh,int p_visible);
+ virtual void multimesh_set_visible_instances(RID p_multimesh, int p_visible);
virtual int multimesh_get_visible_instances(RID p_multimesh) const;
/* IMMEDIATE API */
virtual RID immediate_create();
- virtual void immediate_begin(RID p_immediate,PrimitiveType p_rimitive,RID p_texture=RID());
- virtual void immediate_vertex(RID p_immediate,const Vector3& p_vertex);
- virtual void immediate_normal(RID p_immediate,const Vector3& p_normal);
- virtual void immediate_tangent(RID p_immediate,const Plane& p_tangent);
- virtual void immediate_color(RID p_immediate,const Color& p_color);
- virtual void immediate_uv(RID p_immediate, const Vector2& p_uv);
- virtual void immediate_uv2(RID p_immediate,const Vector2& tex_uv);
+ virtual void immediate_begin(RID p_immediate, PrimitiveType p_rimitive, RID p_texture = RID());
+ virtual void immediate_vertex(RID p_immediate, const Vector3 &p_vertex);
+ virtual void immediate_normal(RID p_immediate, const Vector3 &p_normal);
+ virtual void immediate_tangent(RID p_immediate, const Plane &p_tangent);
+ virtual void immediate_color(RID p_immediate, const Color &p_color);
+ virtual void immediate_uv(RID p_immediate, const Vector2 &p_uv);
+ virtual void immediate_uv2(RID p_immediate, const Vector2 &tex_uv);
virtual void immediate_end(RID p_immediate);
virtual void immediate_clear(RID p_immediate);
- virtual void immediate_set_material(RID p_immediate,RID p_material);
+ virtual void immediate_set_material(RID p_immediate, RID p_material);
virtual RID immediate_get_material(RID p_immediate) const;
-
/* PARTICLES API */
virtual RID particles_create();
@@ -827,25 +816,25 @@ public:
virtual void particles_set_emitting(RID p_particles, bool p_emitting);
virtual bool particles_is_emitting(RID p_particles) const;
- virtual void particles_set_visibility_aabb(RID p_particles, const AABB& p_visibility);
+ virtual void particles_set_visibility_aabb(RID p_particles, const AABB &p_visibility);
virtual AABB particles_get_visibility_aabb(RID p_particles) const;
- virtual void particles_set_emission_half_extents(RID p_particles, const Vector3& p_half_extents);
+ virtual void particles_set_emission_half_extents(RID p_particles, const Vector3 &p_half_extents);
virtual Vector3 particles_get_emission_half_extents(RID p_particles) const;
- virtual void particles_set_emission_base_velocity(RID p_particles, const Vector3& p_base_velocity);
+ virtual void particles_set_emission_base_velocity(RID p_particles, const Vector3 &p_base_velocity);
virtual Vector3 particles_get_emission_base_velocity(RID p_particles) const;
- virtual void particles_set_emission_points(RID p_particles, const DVector<Vector3>& p_points);
+ virtual void particles_set_emission_points(RID p_particles, const DVector<Vector3> &p_points);
virtual DVector<Vector3> particles_get_emission_points(RID p_particles) const;
- virtual void particles_set_gravity_normal(RID p_particles, const Vector3& p_normal);
+ virtual void particles_set_gravity_normal(RID p_particles, const Vector3 &p_normal);
virtual Vector3 particles_get_gravity_normal(RID p_particles) const;
- virtual void particles_set_variable(RID p_particles, ParticleVariable p_variable,float p_value);
+ virtual void particles_set_variable(RID p_particles, ParticleVariable p_variable, float p_value);
virtual float particles_get_variable(RID p_particles, ParticleVariable p_variable) const;
- virtual void particles_set_randomness(RID p_particles, ParticleVariable p_variable,float p_randomness);
+ virtual void particles_set_randomness(RID p_particles, ParticleVariable p_variable, float p_randomness);
virtual float particles_get_randomness(RID p_particles, ParticleVariable p_variable) const;
virtual void particles_set_color_phase_pos(RID p_particles, int p_phase, float p_pos);
@@ -854,19 +843,19 @@ public:
virtual void particles_set_color_phases(RID p_particles, int p_phases);
virtual int particles_get_color_phases(RID p_particles) const;
- virtual void particles_set_color_phase_color(RID p_particles, int p_phase, const Color& p_color);
+ virtual void particles_set_color_phase_color(RID p_particles, int p_phase, const Color &p_color);
virtual Color particles_get_color_phase_color(RID p_particles, int p_phase) const;
virtual void particles_set_attractors(RID p_particles, int p_attractors);
virtual int particles_get_attractors(RID p_particles) const;
- virtual void particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3& p_pos);
- virtual Vector3 particles_get_attractor_pos(RID p_particles,int p_attractor) const;
+ virtual void particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3 &p_pos);
+ virtual Vector3 particles_get_attractor_pos(RID p_particles, int p_attractor) const;
virtual void particles_set_attractor_strength(RID p_particles, int p_attractor, float p_force);
- virtual float particles_get_attractor_strength(RID p_particles,int p_attractor) const;
+ virtual float particles_get_attractor_strength(RID p_particles, int p_attractor) const;
- virtual void particles_set_material(RID p_particles, RID p_material,bool p_owned=false);
+ virtual void particles_set_material(RID p_particles, RID p_material, bool p_owned = false);
virtual RID particles_get_material(RID p_particles) const;
virtual void particles_set_height_from_velocity(RID p_particles, bool p_enable);
@@ -875,64 +864,61 @@ public:
virtual void particles_set_use_local_coordinates(RID p_particles, bool p_enable);
virtual bool particles_is_using_local_coordinates(RID p_particles) const;
-
/* Light API */
virtual RID light_create(LightType p_type);
virtual LightType light_get_type(RID p_light) const;
- virtual void light_set_color(RID p_light,LightColor p_type, const Color& p_color);
- virtual Color light_get_color(RID p_light,LightColor p_type) const;
-
+ virtual void light_set_color(RID p_light, LightColor p_type, const Color &p_color);
+ virtual Color light_get_color(RID p_light, LightColor p_type) const;
- virtual void light_set_shadow(RID p_light,bool p_enabled);
+ virtual void light_set_shadow(RID p_light, bool p_enabled);
virtual bool light_has_shadow(RID p_light) const;
- virtual void light_set_volumetric(RID p_light,bool p_enabled);
+ virtual void light_set_volumetric(RID p_light, bool p_enabled);
virtual bool light_is_volumetric(RID p_light) const;
- virtual void light_set_projector(RID p_light,RID p_texture);
+ virtual void light_set_projector(RID p_light, RID p_texture);
virtual RID light_get_projector(RID p_light) const;
virtual void light_set_param(RID p_light, LightParam p_var, float p_value);
virtual float light_get_param(RID p_light, LightParam p_var) const;
- virtual void light_set_operator(RID p_light,LightOp p_op);
+ virtual void light_set_operator(RID p_light, LightOp p_op);
virtual LightOp light_get_operator(RID p_light) const;
- virtual void light_omni_set_shadow_mode(RID p_light,LightOmniShadowMode p_mode);
+ virtual void light_omni_set_shadow_mode(RID p_light, LightOmniShadowMode p_mode);
virtual LightOmniShadowMode light_omni_get_shadow_mode(RID p_light) const;
- virtual void light_directional_set_shadow_mode(RID p_light,LightDirectionalShadowMode p_mode);
+ virtual void light_directional_set_shadow_mode(RID p_light, LightDirectionalShadowMode p_mode);
virtual LightDirectionalShadowMode light_directional_get_shadow_mode(RID p_light) const;
- virtual void light_directional_set_shadow_param(RID p_light,LightDirectionalShadowParam p_param, float p_value);
- virtual float light_directional_get_shadow_param(RID p_light,LightDirectionalShadowParam p_param) const;
-
+ virtual void light_directional_set_shadow_param(RID p_light, LightDirectionalShadowParam p_param, float p_value);
+ virtual float light_directional_get_shadow_param(RID p_light, LightDirectionalShadowParam p_param) const;
/* SKELETON API */
virtual RID skeleton_create();
- virtual void skeleton_resize(RID p_skeleton,int p_bones);
+ virtual void skeleton_resize(RID p_skeleton, int p_bones);
virtual int skeleton_get_bone_count(RID p_skeleton) const;
- virtual void skeleton_bone_set_transform(RID p_skeleton,int p_bone, const Transform& p_transform);
- virtual Transform skeleton_bone_get_transform(RID p_skeleton,int p_bone);
+ virtual void skeleton_bone_set_transform(RID p_skeleton, int p_bone, const Transform &p_transform);
+ virtual Transform skeleton_bone_get_transform(RID p_skeleton, int p_bone);
/* ROOM API */
virtual RID room_create();
- virtual void room_set_bounds(RID p_room, const BSP_Tree& p_bounds);
+ virtual void room_set_bounds(RID p_room, const BSP_Tree &p_bounds);
virtual BSP_Tree room_get_bounds(RID p_room) const;
/* PORTAL API */
virtual RID portal_create();
- virtual void portal_set_shape(RID p_portal, const Vector<Point2>& p_shape);
+ virtual void portal_set_shape(RID p_portal, const Vector<Point2> &p_shape);
virtual Vector<Point2> portal_get_shape(RID p_portal) const;
virtual void portal_set_enabled(RID p_portal, bool p_enabled);
virtual bool portal_is_enabled(RID p_portal) const;
virtual void portal_set_disable_distance(RID p_portal, float p_distance);
virtual float portal_get_disable_distance(RID p_portal) const;
- virtual void portal_set_disabled_color(RID p_portal, const Color& p_color);
+ virtual void portal_set_disabled_color(RID p_portal, const Color &p_color);
virtual Color portal_get_disabled_color(RID p_portal) const;
virtual void portal_set_connect_range(RID p_portal, float p_range);
virtual float portal_get_connect_range(RID p_portal) const;
@@ -941,28 +927,28 @@ public:
virtual RID baked_light_create();
- virtual void baked_light_set_mode(RID p_baked_light,BakedLightMode p_mode);
+ virtual void baked_light_set_mode(RID p_baked_light, BakedLightMode p_mode);
virtual BakedLightMode baked_light_get_mode(RID p_baked_light) const;
- virtual void baked_light_set_octree(RID p_baked_light,const DVector<uint8_t> p_octree);
+ virtual void baked_light_set_octree(RID p_baked_light, const DVector<uint8_t> p_octree);
virtual DVector<uint8_t> baked_light_get_octree(RID p_baked_light) const;
- virtual void baked_light_set_light(RID p_baked_light,const DVector<uint8_t> p_light);
+ virtual void baked_light_set_light(RID p_baked_light, const DVector<uint8_t> p_light);
virtual DVector<uint8_t> baked_light_get_light(RID p_baked_light) const;
- virtual void baked_light_set_sampler_octree(RID p_baked_light,const DVector<int> &p_sampler);
+ virtual void baked_light_set_sampler_octree(RID p_baked_light, const DVector<int> &p_sampler);
virtual DVector<int> baked_light_get_sampler_octree(RID p_baked_light) const;
- virtual void baked_light_set_lightmap_multiplier(RID p_baked_light,float p_multiplier);
+ virtual void baked_light_set_lightmap_multiplier(RID p_baked_light, float p_multiplier);
virtual float baked_light_get_lightmap_multiplier(RID p_baked_light) const;
- virtual void baked_light_add_lightmap(RID p_baked_light,const RID p_texture,int p_id);
+ virtual void baked_light_add_lightmap(RID p_baked_light, const RID p_texture, int p_id);
virtual void baked_light_clear_lightmaps(RID p_baked_light);
virtual void baked_light_set_realtime_color_enabled(RID p_baked_light, const bool p_enabled);
virtual bool baked_light_get_realtime_color_enabled(RID p_baked_light) const;
- virtual void baked_light_set_realtime_color(RID p_baked_light, const Color& p_color);
+ virtual void baked_light_set_realtime_color(RID p_baked_light, const Color &p_color);
virtual Color baked_light_get_realtime_color(RID p_baked_light) const;
virtual void baked_light_set_realtime_energy(RID p_baked_light, const float p_energy);
@@ -972,101 +958,95 @@ public:
virtual RID baked_light_sampler_create();
- virtual void baked_light_sampler_set_param(RID p_baked_light_sampler,BakedLightSamplerParam p_param,float p_value);
- virtual float baked_light_sampler_get_param(RID p_baked_light_sampler,BakedLightSamplerParam p_param) const;
+ virtual void baked_light_sampler_set_param(RID p_baked_light_sampler, BakedLightSamplerParam p_param, float p_value);
+ virtual float baked_light_sampler_get_param(RID p_baked_light_sampler, BakedLightSamplerParam p_param) const;
- virtual void baked_light_sampler_set_resolution(RID p_baked_light_sampler,int p_resolution);
+ virtual void baked_light_sampler_set_resolution(RID p_baked_light_sampler, int p_resolution);
virtual int baked_light_sampler_get_resolution(RID p_baked_light_sampler) const;
/* CAMERA API */
virtual RID camera_create();
- virtual void camera_set_perspective(RID p_camera,float p_fovy_degrees, float p_z_near, float p_z_far);
- virtual void camera_set_orthogonal(RID p_camera,float p_size, float p_z_near, float p_z_far);
- virtual void camera_set_transform(RID p_camera,const Transform& p_transform);
+ virtual void camera_set_perspective(RID p_camera, float p_fovy_degrees, float p_z_near, float p_z_far);
+ virtual void camera_set_orthogonal(RID p_camera, float p_size, float p_z_near, float p_z_far);
+ virtual void camera_set_transform(RID p_camera, const Transform &p_transform);
- virtual void camera_set_visible_layers(RID p_camera,uint32_t p_layers);
+ virtual void camera_set_visible_layers(RID p_camera, uint32_t p_layers);
virtual uint32_t camera_get_visible_layers(RID p_camera) const;
- virtual void camera_set_environment(RID p_camera,RID p_env);
+ virtual void camera_set_environment(RID p_camera, RID p_env);
virtual RID camera_get_environment(RID p_camera) const;
- virtual void camera_set_use_vertical_aspect(RID p_camera,bool p_enable);
- virtual bool camera_is_using_vertical_aspect(RID p_camera,bool p_enable) const;
+ virtual void camera_set_use_vertical_aspect(RID p_camera, bool p_enable);
+ virtual bool camera_is_using_vertical_aspect(RID p_camera, bool p_enable) const;
/* VIEWPORT API */
virtual RID viewport_create();
- virtual void viewport_attach_to_screen(RID p_viewport,int p_screen=0);
+ virtual void viewport_attach_to_screen(RID p_viewport, int p_screen = 0);
virtual void viewport_detach(RID p_viewport);
- virtual void viewport_set_as_render_target(RID p_viewport,bool p_enable);
- virtual void viewport_set_render_target_update_mode(RID p_viewport,RenderTargetUpdateMode p_mode);
+ virtual void viewport_set_as_render_target(RID p_viewport, bool p_enable);
+ virtual void viewport_set_render_target_update_mode(RID p_viewport, RenderTargetUpdateMode p_mode);
virtual RenderTargetUpdateMode viewport_get_render_target_update_mode(RID p_viewport) const;
virtual RID viewport_get_render_target_texture(RID p_viewport) const;
- virtual void viewport_set_render_target_vflip(RID p_viewport,bool p_enable);
+ virtual void viewport_set_render_target_vflip(RID p_viewport, bool p_enable);
virtual bool viewport_get_render_target_vflip(RID p_viewport) const;
- virtual void viewport_set_render_target_clear_on_new_frame(RID p_viewport,bool p_enable);
+ virtual void viewport_set_render_target_clear_on_new_frame(RID p_viewport, bool p_enable);
virtual bool viewport_get_render_target_clear_on_new_frame(RID p_viewport) const;
virtual void viewport_render_target_clear(RID p_viewport);
- virtual void viewport_set_render_target_to_screen_rect(RID p_viewport,const Rect2& p_rect);
-
+ virtual void viewport_set_render_target_to_screen_rect(RID p_viewport, const Rect2 &p_rect);
virtual void viewport_queue_screen_capture(RID p_viewport);
virtual Image viewport_get_screen_capture(RID p_viewport) const;
- virtual void viewport_set_rect(RID p_viewport,const ViewportRect& p_rect);
+ virtual void viewport_set_rect(RID p_viewport, const ViewportRect &p_rect);
virtual ViewportRect viewport_get_rect(RID p_viewport) const;
- virtual void viewport_set_hide_scenario(RID p_viewport,bool p_hide);
- virtual void viewport_set_hide_canvas(RID p_viewport,bool p_hide);
- virtual void viewport_set_disable_environment(RID p_viewport,bool p_disable);
- virtual void viewport_attach_camera(RID p_viewport,RID p_camera);
- virtual void viewport_set_scenario(RID p_viewport,RID p_scenario);
+ virtual void viewport_set_hide_scenario(RID p_viewport, bool p_hide);
+ virtual void viewport_set_hide_canvas(RID p_viewport, bool p_hide);
+ virtual void viewport_set_disable_environment(RID p_viewport, bool p_disable);
+ virtual void viewport_attach_camera(RID p_viewport, RID p_camera);
+ virtual void viewport_set_scenario(RID p_viewport, RID p_scenario);
- virtual RID viewport_get_attached_camera(RID p_viewport) const;
- virtual RID viewport_get_scenario(RID p_viewport) const;
- virtual void viewport_attach_canvas(RID p_viewport,RID p_canvas);
- virtual void viewport_remove_canvas(RID p_viewport,RID p_canvas);
- virtual void viewport_set_canvas_transform(RID p_viewport,RID p_canvas,const Matrix32& p_offset);
- virtual Matrix32 viewport_get_canvas_transform(RID p_viewport,RID p_canvas) const;
- virtual void viewport_set_global_canvas_transform(RID p_viewport,const Matrix32& p_transform);
+ virtual RID viewport_get_attached_camera(RID p_viewport) const;
+ virtual RID viewport_get_scenario(RID p_viewport) const;
+ virtual void viewport_attach_canvas(RID p_viewport, RID p_canvas);
+ virtual void viewport_remove_canvas(RID p_viewport, RID p_canvas);
+ virtual void viewport_set_canvas_transform(RID p_viewport, RID p_canvas, const Matrix32 &p_offset);
+ virtual Matrix32 viewport_get_canvas_transform(RID p_viewport, RID p_canvas) const;
+ virtual void viewport_set_global_canvas_transform(RID p_viewport, const Matrix32 &p_transform);
virtual Matrix32 viewport_get_global_canvas_transform(RID p_viewport) const;
- virtual void viewport_set_canvas_layer(RID p_viewport,RID p_canvas,int p_layer);
- virtual void viewport_set_transparent_background(RID p_viewport,bool p_enabled);
+ virtual void viewport_set_canvas_layer(RID p_viewport, RID p_canvas, int p_layer);
+ virtual void viewport_set_transparent_background(RID p_viewport, bool p_enabled);
virtual bool viewport_has_transparent_background(RID p_viewport) const;
-
/* ENVIRONMENT API */
virtual RID environment_create();
- virtual void environment_set_background(RID p_env,EnvironmentBG p_bg);
+ virtual void environment_set_background(RID p_env, EnvironmentBG p_bg);
virtual EnvironmentBG environment_get_background(RID p_env) const;
- virtual void environment_set_background_param(RID p_env,EnvironmentBGParam p_param, const Variant& p_value);
- virtual Variant environment_get_background_param(RID p_env,EnvironmentBGParam p_param) const;
-
- virtual void environment_set_enable_fx(RID p_env,EnvironmentFx p_effect,bool p_enabled);
- virtual bool environment_is_fx_enabled(RID p_env,EnvironmentFx p_effect) const;
-
+ virtual void environment_set_background_param(RID p_env, EnvironmentBGParam p_param, const Variant &p_value);
+ virtual Variant environment_get_background_param(RID p_env, EnvironmentBGParam p_param) const;
- virtual void environment_fx_set_param(RID p_env,EnvironmentFxParam p_effect,const Variant& p_param);
- virtual Variant environment_fx_get_param(RID p_env,EnvironmentFxParam p_effect) const;
+ virtual void environment_set_enable_fx(RID p_env, EnvironmentFx p_effect, bool p_enabled);
+ virtual bool environment_is_fx_enabled(RID p_env, EnvironmentFx p_effect) const;
+ virtual void environment_fx_set_param(RID p_env, EnvironmentFxParam p_effect, const Variant &p_param);
+ virtual Variant environment_fx_get_param(RID p_env, EnvironmentFxParam p_effect) const;
/* SCENARIO API */
virtual RID scenario_create();
- virtual void scenario_set_debug(RID p_scenario,ScenarioDebugMode p_debug_mode);
+ virtual void scenario_set_debug(RID p_scenario, ScenarioDebugMode p_debug_mode);
virtual void scenario_set_environment(RID p_scenario, RID p_environment);
virtual RID scenario_get_environment(RID p_scenario, RID p_environment) const;
virtual void scenario_set_fallback_environment(RID p_scenario, RID p_environment);
-
-
/* INSTANCING API */
virtual RID instance_create();
@@ -1082,36 +1062,35 @@ public:
virtual AABB instance_get_base_aabb(RID p_instance) const;
- virtual void instance_attach_object_instance_ID(RID p_instance,uint32_t p_ID);
+ virtual void instance_attach_object_instance_ID(RID p_instance, uint32_t p_ID);
virtual uint32_t instance_get_object_instance_ID(RID p_instance) const;
- virtual void instance_attach_skeleton(RID p_instance,RID p_skeleton);
+ virtual void instance_attach_skeleton(RID p_instance, RID p_skeleton);
virtual RID instance_get_skeleton(RID p_instance) const;
- virtual void instance_set_morph_target_weight(RID p_instance,int p_shape, float p_weight);
- virtual float instance_get_morph_target_weight(RID p_instance,int p_shape) const;
-
- virtual void instance_set_surface_material(RID p_instance,int p_surface, RID p_material);
+ virtual void instance_set_morph_target_weight(RID p_instance, int p_shape, float p_weight);
+ virtual float instance_get_morph_target_weight(RID p_instance, int p_shape) const;
+ virtual void instance_set_surface_material(RID p_instance, int p_surface, RID p_material);
- virtual void instance_set_transform(RID p_instance, const Transform& p_transform);
+ virtual void instance_set_transform(RID p_instance, const Transform &p_transform);
virtual Transform instance_get_transform(RID p_instance) const;
- virtual void instance_set_exterior( RID p_instance, bool p_enabled );
- virtual bool instance_is_exterior( RID p_instance) const;
+ virtual void instance_set_exterior(RID p_instance, bool p_enabled);
+ virtual bool instance_is_exterior(RID p_instance) const;
- virtual void instance_set_room( RID p_instance, RID p_room );
- virtual RID instance_get_room( RID p_instance ) const ;
+ virtual void instance_set_room(RID p_instance, RID p_room);
+ virtual RID instance_get_room(RID p_instance) const;
- virtual void instance_set_extra_visibility_margin( RID p_instance, real_t p_margin );
- virtual real_t instance_get_extra_visibility_margin( RID p_instance ) const;
+ virtual void instance_set_extra_visibility_margin(RID p_instance, real_t p_margin);
+ virtual real_t instance_get_extra_visibility_margin(RID p_instance) const;
- virtual Vector<RID> instances_cull_aabb(const AABB& p_aabb, RID p_scenario=RID()) const;
- virtual Vector<RID> instances_cull_ray(const Vector3& p_from, const Vector3& p_to, RID p_scenario=RID()) const;
- virtual Vector<RID> instances_cull_convex(const Vector<Plane>& p_convex, RID p_scenario=RID()) const;
+ virtual Vector<RID> instances_cull_aabb(const AABB &p_aabb, RID p_scenario = RID()) const;
+ virtual Vector<RID> instances_cull_ray(const Vector3 &p_from, const Vector3 &p_to, RID p_scenario = RID()) const;
+ virtual Vector<RID> instances_cull_convex(const Vector<Plane> &p_convex, RID p_scenario = RID()) const;
- virtual void instance_geometry_set_flag(RID p_instance,InstanceFlags p_flags,bool p_enabled);
- virtual bool instance_geometry_get_flag(RID p_instance,InstanceFlags p_flags) const;
+ virtual void instance_geometry_set_flag(RID p_instance, InstanceFlags p_flags, bool p_enabled);
+ virtual bool instance_geometry_get_flag(RID p_instance, InstanceFlags p_flags) const;
virtual void instance_geometry_set_cast_shadows_setting(RID p_instance, VS::ShadowCastingSetting p_shadow_casting_setting);
virtual VS::ShadowCastingSetting instance_geometry_get_cast_shadows_setting(RID p_instance) const;
@@ -1119,48 +1098,45 @@ public:
virtual void instance_geometry_set_material_override(RID p_instance, RID p_material);
virtual RID instance_geometry_get_material_override(RID p_instance) const;
- virtual void instance_geometry_set_draw_range(RID p_instance,float p_min,float p_max);
+ virtual void instance_geometry_set_draw_range(RID p_instance, float p_min, float p_max);
virtual float instance_geometry_get_draw_range_max(RID p_instance) const;
virtual float instance_geometry_get_draw_range_min(RID p_instance) const;
- virtual void instance_geometry_set_baked_light(RID p_instance,RID p_baked_light);
+ virtual void instance_geometry_set_baked_light(RID p_instance, RID p_baked_light);
virtual RID instance_geometry_get_baked_light(RID p_instance) const;
- virtual void instance_geometry_set_baked_light_sampler(RID p_instance,RID p_baked_light_sampler);
+ virtual void instance_geometry_set_baked_light_sampler(RID p_instance, RID p_baked_light_sampler);
virtual RID instance_geometry_get_baked_light_sampler(RID p_instance) const;
- virtual void instance_geometry_set_baked_light_texture_index(RID p_instance,int p_tex_id);
+ virtual void instance_geometry_set_baked_light_texture_index(RID p_instance, int p_tex_id);
virtual int instance_geometry_get_baked_light_texture_index(RID p_instance) const;
- virtual void instance_light_set_enabled(RID p_instance,bool p_enabled);
+ virtual void instance_light_set_enabled(RID p_instance, bool p_enabled);
virtual bool instance_light_is_enabled(RID p_instance) const;
/* CANVAS (2D) */
virtual RID canvas_create();
- virtual void canvas_set_item_mirroring(RID p_canvas,RID p_item,const Point2& p_mirroring);
- virtual Point2 canvas_get_item_mirroring(RID p_canvas,RID p_item) const;
- virtual void canvas_set_modulate(RID p_canvas,const Color& p_color);
-
+ virtual void canvas_set_item_mirroring(RID p_canvas, RID p_item, const Point2 &p_mirroring);
+ virtual Point2 canvas_get_item_mirroring(RID p_canvas, RID p_item) const;
+ virtual void canvas_set_modulate(RID p_canvas, const Color &p_color);
virtual RID canvas_item_create();
- virtual void canvas_item_set_parent(RID p_item,RID p_parent_item);
+ virtual void canvas_item_set_parent(RID p_item, RID p_parent_item);
virtual RID canvas_item_get_parent(RID p_canvas_item) const;
- virtual void canvas_item_set_visible(RID p_item,bool p_visible);
+ virtual void canvas_item_set_visible(RID p_item, bool p_visible);
virtual bool canvas_item_is_visible(RID p_item) const;
- virtual void canvas_item_set_blend_mode(RID p_canvas_item,MaterialBlendMode p_blend);
- virtual void canvas_item_set_light_mask(RID p_canvas_item,int p_mask);
-
-
+ virtual void canvas_item_set_blend_mode(RID p_canvas_item, MaterialBlendMode p_blend);
+ virtual void canvas_item_set_light_mask(RID p_canvas_item, int p_mask);
//virtual void canvas_item_set_rect(RID p_item, const Rect2& p_rect);
- virtual void canvas_item_set_transform(RID p_item, const Matrix32& p_transform);
+ virtual void canvas_item_set_transform(RID p_item, const Matrix32 &p_transform);
virtual void canvas_item_set_clip(RID p_item, bool p_clip);
virtual void canvas_item_set_distance_field_mode(RID p_item, bool p_enable);
- virtual void canvas_item_set_custom_rect(RID p_item, bool p_custom_rect,const Rect2& p_rect=Rect2());
+ virtual void canvas_item_set_custom_rect(RID p_item, bool p_custom_rect, const Rect2 &p_rect = Rect2());
virtual void canvas_item_set_opacity(RID p_item, float p_opacity);
virtual float canvas_item_get_opacity(RID p_item, float p_opacity) const;
virtual void canvas_item_set_on_top(RID p_item, bool p_on_top);
@@ -1171,39 +1147,39 @@ public:
virtual void canvas_item_attach_viewport(RID p_item, RID p_viewport);
- virtual void canvas_item_add_line(RID p_item, const Point2& p_from, const Point2& p_to,const Color& p_color,float p_width=1.0);
- virtual void canvas_item_add_rect(RID p_item, const Rect2& p_rect, const Color& p_color);
- virtual void canvas_item_add_circle(RID p_item, const Point2& p_pos, float p_radius,const Color& p_color);
- virtual void canvas_item_add_texture_rect(RID p_item, const Rect2& p_rect, RID p_texture,bool p_tile=false,const Color& p_modulate=Color(1,1,1),bool p_transpose=false);
- virtual void canvas_item_add_texture_rect_region(RID p_item, const Rect2& p_rect, RID p_texture,const Rect2& p_src_rect,const Color& p_modulate=Color(1,1,1),bool p_transpose=false);
- virtual void canvas_item_add_style_box(RID p_item, const Rect2& p_rect, const Rect2& p_source, RID p_texture,const Vector2& p_topleft, const Vector2& p_bottomright, bool p_draw_center=true,const Color& p_modulate=Color(1,1,1));
- virtual void canvas_item_add_primitive(RID p_item, const Vector<Point2>& p_points, const Vector<Color>& p_colors,const Vector<Point2>& p_uvs, RID p_texture,float p_width=1.0);
- virtual void canvas_item_add_polygon(RID p_item, const Vector<Point2>& p_points, const Vector<Color>& p_colors,const Vector<Point2>& p_uvs=Vector<Point2>(), RID p_texture=RID());
- virtual void canvas_item_add_triangle_array(RID p_item, const Vector<int>& p_indices, const Vector<Point2>& p_points, const Vector<Color>& p_colors,const Vector<Point2>& p_uvs=Vector<Point2>(), RID p_texture=RID(), int p_count=-1);
- virtual void canvas_item_add_triangle_array_ptr(RID p_item, int p_count, const int* p_indices, const Point2* p_points, const Color* p_colors,const Point2* p_uvs=NULL, RID p_texture=RID());
- virtual void canvas_item_add_set_transform(RID p_item,const Matrix32& p_transform);
+ virtual void canvas_item_add_line(RID p_item, const Point2 &p_from, const Point2 &p_to, const Color &p_color, float p_width = 1.0);
+ virtual void canvas_item_add_rect(RID p_item, const Rect2 &p_rect, const Color &p_color);
+ virtual void canvas_item_add_circle(RID p_item, const Point2 &p_pos, float p_radius, const Color &p_color);
+ virtual void canvas_item_add_texture_rect(RID p_item, const Rect2 &p_rect, RID p_texture, bool p_tile = false, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false);
+ virtual void canvas_item_add_texture_rect_region(RID p_item, const Rect2 &p_rect, RID p_texture, const Rect2 &p_src_rect, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false);
+ virtual void canvas_item_add_style_box(RID p_item, const Rect2 &p_rect, const Rect2 &p_source, RID p_texture, const Vector2 &p_topleft, const Vector2 &p_bottomright, bool p_draw_center = true, const Color &p_modulate = Color(1, 1, 1));
+ virtual void canvas_item_add_primitive(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs, RID p_texture, float p_width = 1.0);
+ virtual void canvas_item_add_polygon(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs = Vector<Point2>(), RID p_texture = RID());
+ virtual void canvas_item_add_triangle_array(RID p_item, const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs = Vector<Point2>(), RID p_texture = RID(), int p_count = -1);
+ virtual void canvas_item_add_triangle_array_ptr(RID p_item, int p_count, const int *p_indices, const Point2 *p_points, const Color *p_colors, const Point2 *p_uvs = NULL, RID p_texture = RID());
+ virtual void canvas_item_add_set_transform(RID p_item, const Matrix32 &p_transform);
virtual void canvas_item_add_set_blend_mode(RID p_item, MaterialBlendMode p_blend);
virtual void canvas_item_add_clip_ignore(RID p_item, bool p_ignore);
virtual void canvas_item_set_sort_children_by_y(RID p_item, bool p_enable);
virtual void canvas_item_set_z(RID p_item, int p_z);
virtual void canvas_item_set_z_as_relative_to_parent(RID p_item, bool p_enable);
- virtual void canvas_item_set_copy_to_backbuffer(RID p_item, bool p_enable,const Rect2& p_rect);
+ virtual void canvas_item_set_copy_to_backbuffer(RID p_item, bool p_enable, const Rect2 &p_rect);
virtual void canvas_item_set_material(RID p_item, RID p_material);
virtual void canvas_item_set_use_parent_material(RID p_item, bool p_enable);
virtual RID canvas_light_create();
- virtual void canvas_light_attach_to_canvas(RID p_light,RID p_canvas);
+ virtual void canvas_light_attach_to_canvas(RID p_light, RID p_canvas);
virtual void canvas_light_set_enabled(RID p_light, bool p_enabled);
- virtual void canvas_light_set_transform(RID p_light, const Matrix32& p_transform);
+ virtual void canvas_light_set_transform(RID p_light, const Matrix32 &p_transform);
virtual void canvas_light_set_scale(RID p_light, float p_scale);
virtual void canvas_light_set_texture(RID p_light, RID p_texture);
- virtual void canvas_light_set_texture_offset(RID p_light, const Vector2& p_offset);
- virtual void canvas_light_set_color(RID p_light, const Color& p_color);
+ virtual void canvas_light_set_texture_offset(RID p_light, const Vector2 &p_offset);
+ virtual void canvas_light_set_color(RID p_light, const Color &p_color);
virtual void canvas_light_set_height(RID p_light, float p_height);
virtual void canvas_light_set_energy(RID p_light, float p_energy);
- virtual void canvas_light_set_z_range(RID p_light, int p_min_z,int p_max_z);
- virtual void canvas_light_set_layer_range(RID p_light, int p_min_layer,int p_max_layer);
+ virtual void canvas_light_set_z_range(RID p_light, int p_min_z, int p_max_z);
+ virtual void canvas_light_set_layer_range(RID p_light, int p_min_layer, int p_max_layer);
virtual void canvas_light_set_item_mask(RID p_light, int p_mask);
virtual void canvas_light_set_item_shadow_mask(RID p_light, int p_mask);
@@ -1211,24 +1187,19 @@ public:
virtual void canvas_light_set_shadow_enabled(RID p_light, bool p_enabled);
virtual void canvas_light_set_shadow_buffer_size(RID p_light, int p_size);
virtual void canvas_light_set_shadow_esm_multiplier(RID p_light, float p_multiplier);
- virtual void canvas_light_set_shadow_color(RID p_light, const Color& p_color);
-
-
+ virtual void canvas_light_set_shadow_color(RID p_light, const Color &p_color);
virtual RID canvas_light_occluder_create();
- virtual void canvas_light_occluder_attach_to_canvas(RID p_occluder,RID p_canvas);
- virtual void canvas_light_occluder_set_enabled(RID p_occluder,bool p_enabled);
- virtual void canvas_light_occluder_set_polygon(RID p_occluder,RID p_polygon);
- virtual void canvas_light_occluder_set_transform(RID p_occluder,const Matrix32& p_xform);
- virtual void canvas_light_occluder_set_light_mask(RID p_occluder,int p_mask);
-
+ virtual void canvas_light_occluder_attach_to_canvas(RID p_occluder, RID p_canvas);
+ virtual void canvas_light_occluder_set_enabled(RID p_occluder, bool p_enabled);
+ virtual void canvas_light_occluder_set_polygon(RID p_occluder, RID p_polygon);
+ virtual void canvas_light_occluder_set_transform(RID p_occluder, const Matrix32 &p_xform);
+ virtual void canvas_light_occluder_set_light_mask(RID p_occluder, int p_mask);
virtual RID canvas_occluder_polygon_create();
- virtual void canvas_occluder_polygon_set_shape(RID p_occluder_polygon,const DVector<Vector2>& p_shape,bool p_close);
- virtual void canvas_occluder_polygon_set_shape_as_lines(RID p_occluder_polygon,const DVector<Vector2>& p_shape);
- virtual void canvas_occluder_polygon_set_cull_mode(RID p_occluder_polygon,CanvasOccluderPolygonCullMode p_mode);
-
-
+ virtual void canvas_occluder_polygon_set_shape(RID p_occluder_polygon, const DVector<Vector2> &p_shape, bool p_close);
+ virtual void canvas_occluder_polygon_set_shape_as_lines(RID p_occluder_polygon, const DVector<Vector2> &p_shape);
+ virtual void canvas_occluder_polygon_set_cull_mode(RID p_occluder_polygon, CanvasOccluderPolygonCullMode p_mode);
virtual void canvas_item_clear(RID p_item);
virtual void canvas_item_raise(RID p_item);
@@ -1237,17 +1208,15 @@ public:
virtual RID canvas_item_material_create();
virtual void canvas_item_material_set_shader(RID p_material, RID p_shader);
- virtual void canvas_item_material_set_shader_param(RID p_material, const StringName& p_param, const Variant& p_value);
- virtual Variant canvas_item_material_get_shader_param(RID p_material, const StringName& p_param) const;
+ virtual void canvas_item_material_set_shader_param(RID p_material, const StringName &p_param, const Variant &p_value);
+ virtual Variant canvas_item_material_get_shader_param(RID p_material, const StringName &p_param) const;
virtual void canvas_item_material_set_shading_mode(RID p_material, CanvasItemShadingMode p_mode);
-
-
/* CURSOR */
virtual void cursor_set_rotation(float p_rotation, int p_cursor = 0); // radians
- virtual void cursor_set_texture(RID p_texture, const Point2 &p_center_offset, int p_cursor=0, const Rect2 &p_region=Rect2());
+ virtual void cursor_set_texture(RID p_texture, const Point2 &p_center_offset, int p_cursor = 0, const Rect2 &p_region = Rect2());
virtual void cursor_set_visible(bool p_visible, int p_cursor = 0);
- virtual void cursor_set_pos(const Point2& p_pos, int p_cursor = 0);
+ virtual void cursor_set_pos(const Point2 &p_pos, int p_cursor = 0);
/* BLACK BARS */
@@ -1256,16 +1225,16 @@ public:
/* FREE */
- virtual void free( RID p_rid );
+ virtual void free(RID p_rid);
/* CUSTOM SHADE MODEL */
virtual void custom_shade_model_set_shader(int p_model, RID p_shader);
virtual RID custom_shade_model_get_shader(int p_model) const;
- virtual void custom_shade_model_set_name(int p_model, const String& p_name);
+ virtual void custom_shade_model_set_name(int p_model, const String &p_name);
virtual String custom_shade_model_get_name(int p_model) const;
- virtual void custom_shade_model_set_param_info(int p_model, const List<PropertyInfo>& p_info);
- virtual void custom_shade_model_get_param_info(int p_model, List<PropertyInfo>* p_info) const;
+ virtual void custom_shade_model_set_param_info(int p_model, const List<PropertyInfo> &p_info);
+ virtual void custom_shade_model_get_param_info(int p_model, List<PropertyInfo> *p_info) const;
/* EVENT QUEUING */
@@ -1284,13 +1253,12 @@ public:
RID get_test_cube();
- virtual void set_boot_image(const Image& p_image, const Color& p_color, bool p_scale);
- virtual void set_default_clear_color(const Color& p_color);
+ virtual void set_boot_image(const Image &p_image, const Color &p_color, bool p_scale);
+ virtual void set_default_clear_color(const Color &p_color);
virtual Color get_default_clear_color() const;
VisualServerRaster(Rasterizer *p_rasterizer);
~VisualServerRaster();
-
};
#endif
diff --git a/servers/visual/visual_server_wrap_mt.cpp b/servers/visual/visual_server_wrap_mt.cpp
index e673158ba..87ccce0fc 100644
--- a/servers/visual/visual_server_wrap_mt.cpp
+++ b/servers/visual/visual_server_wrap_mt.cpp
@@ -27,20 +27,19 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include "visual_server_wrap_mt.h"
-#include "os/os.h"
#include "globals.h"
+#include "os/os.h"
void VisualServerWrapMT::thread_exit() {
- exit=true;
+ exit = true;
}
void VisualServerWrapMT::thread_draw() {
-
draw_mutex->lock();
draw_pending--;
- bool draw=(draw_pending==0);// only draw when no more flushes are pending
+ bool draw = (draw_pending == 0); // only draw when no more flushes are pending
draw_mutex->unlock();
@@ -48,41 +47,35 @@ void VisualServerWrapMT::thread_draw() {
visual_server->draw();
}
-
}
void VisualServerWrapMT::thread_flush() {
-
draw_mutex->lock();
draw_pending--;
draw_mutex->unlock();
-
}
-
-
void VisualServerWrapMT::_thread_callback(void *_instance) {
- VisualServerWrapMT *vsmt = reinterpret_cast<VisualServerWrapMT*>(_instance);
-
+ VisualServerWrapMT *vsmt = reinterpret_cast<VisualServerWrapMT *>(_instance);
vsmt->thread_loop();
}
void VisualServerWrapMT::thread_loop() {
- server_thread=Thread::get_caller_ID();
+ server_thread = Thread::get_caller_ID();
OS::get_singleton()->make_rendering_thread();
visual_server->init();
- exit=false;
- draw_thread_up=true;
- while(!exit) {
+ exit = false;
+ draw_thread_up = true;
+ while (!exit) {
// flush commands one by one, until exit is requested
command_queue.wait_and_flush_one();
}
@@ -90,10 +83,8 @@ void VisualServerWrapMT::thread_loop() {
command_queue.flush_all(); // flush all
visual_server->finish();
-
}
-
/* EVENT QUEUING */
void VisualServerWrapMT::sync() {
@@ -113,12 +104,10 @@ void VisualServerWrapMT::sync() {
command_queue.flush_all(); //flush all pending from other threads
}
-
}
void VisualServerWrapMT::draw() {
-
if (create_thread) {
/* TODO: Make it draw
@@ -135,7 +124,6 @@ void VisualServerWrapMT::draw() {
}
}
-
void VisualServerWrapMT::init() {
if (create_thread) {
@@ -144,10 +132,10 @@ void VisualServerWrapMT::init() {
print_line("CREATING RENDER THREAD");
OS::get_singleton()->release_rendering_thread();
if (create_thread) {
- thread = Thread::create( _thread_callback, this );
+ thread = Thread::create(_thread_callback, this);
print_line("STARTING RENDER THREAD");
}
- while(!draw_thread_up) {
+ while (!draw_thread_up) {
OS::get_singleton()->delay_usec(1000);
}
print_line("DONE RENDER THREAD");
@@ -155,58 +143,50 @@ void VisualServerWrapMT::init() {
visual_server->init();
}
-
}
void VisualServerWrapMT::finish() {
-
if (thread) {
- command_queue.push( this, &VisualServerWrapMT::thread_exit);
- Thread::wait_to_finish( thread );
+ command_queue.push(this, &VisualServerWrapMT::thread_exit);
+ Thread::wait_to_finish(thread);
memdelete(thread);
-
texture_free_cached_ids();
mesh_free_cached_ids();
- thread=NULL;
+ thread = NULL;
} else {
visual_server->finish();
}
if (draw_mutex)
memdelete(draw_mutex);
-
}
+VisualServerWrapMT::VisualServerWrapMT(VisualServer *p_contained, bool p_create_thread)
+ : command_queue(p_create_thread) {
-VisualServerWrapMT::VisualServerWrapMT(VisualServer* p_contained,bool p_create_thread) : command_queue(p_create_thread) {
-
- visual_server=p_contained;
- create_thread=p_create_thread;
- thread=NULL;
- draw_mutex=NULL;
- draw_pending=0;
- draw_thread_up=false;
- alloc_mutex=Mutex::create();
- texture_pool_max_size=GLOBAL_DEF("render/thread_textures_prealloc",5);
- mesh_pool_max_size=GLOBAL_DEF("core/rid_pool_prealloc",20);
+ visual_server = p_contained;
+ create_thread = p_create_thread;
+ thread = NULL;
+ draw_mutex = NULL;
+ draw_pending = 0;
+ draw_thread_up = false;
+ alloc_mutex = Mutex::create();
+ texture_pool_max_size = GLOBAL_DEF("render/thread_textures_prealloc", 5);
+ mesh_pool_max_size = GLOBAL_DEF("core/rid_pool_prealloc", 20);
if (!p_create_thread) {
- server_thread=Thread::get_caller_ID();
+ server_thread = Thread::get_caller_ID();
} else {
- server_thread=0;
+ server_thread = 0;
}
}
-
VisualServerWrapMT::~VisualServerWrapMT() {
memdelete(visual_server);
memdelete(alloc_mutex);
//finish();
-
}
-
-
diff --git a/servers/visual/visual_server_wrap_mt.h b/servers/visual/visual_server_wrap_mt.h
index e30f5aa12..965f7e670 100644
--- a/servers/visual/visual_server_wrap_mt.h
+++ b/servers/visual/visual_server_wrap_mt.h
@@ -29,10 +29,9 @@
#ifndef VISUAL_SERVER_WRAP_MT_H
#define VISUAL_SERVER_WRAP_MT_H
-
-#include "servers/visual_server.h"
#include "command_queue_mt.h"
#include "os/thread.h"
+#include "servers/visual_server.h"
/**
@author Juan Linietsky <reduzio@gmail.com>
@@ -60,8 +59,7 @@ class VisualServerWrapMT : public VisualServer {
void thread_exit();
- Mutex*alloc_mutex;
-
+ Mutex *alloc_mutex;
int texture_pool_max_size;
List<RID> texture_id_pool;
@@ -72,13 +70,12 @@ class VisualServerWrapMT : public VisualServer {
//#define DEBUG_SYNC
#ifdef DEBUG_SYNC
-#define SYNC_DEBUG print_line("sync on: "+String(__FUNCTION__));
+#define SYNC_DEBUG print_line("sync on: " + String(__FUNCTION__));
#else
#define SYNC_DEBUG
#endif
public:
-
#define ServerName VisualServer
#define ServerNameWrapMT VisualServerWrapMT
#define server_name visual_server
@@ -86,43 +83,41 @@ public:
//FUNC0R(RID,texture_create);
FUNCRID(texture);
- FUNC5(texture_allocate,RID,int,int,Image::Format,uint32_t);
- FUNC3(texture_set_data,RID,const Image&,CubeMapSide);
- FUNC2RC(Image,texture_get_data,RID,CubeMapSide);
- FUNC2(texture_set_flags,RID,uint32_t);
- FUNC1RC(Image::Format,texture_get_format,RID);
- FUNC1RC(uint32_t,texture_get_flags,RID);
- FUNC1RC(uint32_t,texture_get_width,RID);
- FUNC1RC(uint32_t,texture_get_height,RID);
- FUNC3(texture_set_size_override,RID,int,int);
- FUNC1RC(bool,texture_can_stream,RID);
- FUNC3C(texture_set_reload_hook,RID,ObjectID,const StringName&);
+ FUNC5(texture_allocate, RID, int, int, Image::Format, uint32_t);
+ FUNC3(texture_set_data, RID, const Image &, CubeMapSide);
+ FUNC2RC(Image, texture_get_data, RID, CubeMapSide);
+ FUNC2(texture_set_flags, RID, uint32_t);
+ FUNC1RC(Image::Format, texture_get_format, RID);
+ FUNC1RC(uint32_t, texture_get_flags, RID);
+ FUNC1RC(uint32_t, texture_get_width, RID);
+ FUNC1RC(uint32_t, texture_get_height, RID);
+ FUNC3(texture_set_size_override, RID, int, int);
+ FUNC1RC(bool, texture_can_stream, RID);
+ FUNC3C(texture_set_reload_hook, RID, ObjectID, const StringName &);
- FUNC2(texture_set_path,RID,const String&);
- FUNC1RC(String,texture_get_path,RID);
+ FUNC2(texture_set_path, RID, const String &);
+ FUNC1RC(String, texture_get_path, RID);
- FUNC1(texture_set_shrink_all_x2_on_set_data,bool);
+ FUNC1(texture_set_shrink_all_x2_on_set_data, bool);
virtual void texture_debug_usage(List<TextureInfo> *r_info) {
//pass directly, should lock the server anyway
visual_server->texture_debug_usage(r_info);
}
-
/* SHADER API */
- FUNC1R(RID,shader_create,ShaderMode);
- FUNC2(shader_set_mode,RID,ShaderMode);
- FUNC1RC(ShaderMode,shader_get_mode,RID);
- FUNC7(shader_set_code,RID,const String&,const String&,const String&,int,int,int);
- FUNC1RC(String,shader_get_vertex_code,RID);
- FUNC1RC(String,shader_get_fragment_code,RID);
- FUNC1RC(String,shader_get_light_code,RID);
- FUNC2SC(shader_get_param_list,RID,List<PropertyInfo>*);
-
- FUNC3(shader_set_default_texture_param,RID,const StringName&,RID);
- FUNC2RC(RID,shader_get_default_texture_param,RID,const StringName&);
+ FUNC1R(RID, shader_create, ShaderMode);
+ FUNC2(shader_set_mode, RID, ShaderMode);
+ FUNC1RC(ShaderMode, shader_get_mode, RID);
+ FUNC7(shader_set_code, RID, const String &, const String &, const String &, int, int, int);
+ FUNC1RC(String, shader_get_vertex_code, RID);
+ FUNC1RC(String, shader_get_fragment_code, RID);
+ FUNC1RC(String, shader_get_light_code, RID);
+ FUNC2SC(shader_get_param_list, RID, List<PropertyInfo> *);
+ FUNC3(shader_set_default_texture_param, RID, const StringName &, RID);
+ FUNC2RC(RID, shader_get_default_texture_param, RID, const StringName &);
/*virtual void shader_get_param_list(RID p_shader, List<PropertyInfo> *p_param_list) {
if (Thread::get_caller_ID()!=server_thread) {
@@ -132,604 +127,576 @@ public:
}
}*/
-// virtual void shader_get_param_list(RID p_shader, List<PropertyInfo> *p_param_list);
-
+ // virtual void shader_get_param_list(RID p_shader, List<PropertyInfo> *p_param_list);
/* COMMON MATERIAL API */
- FUNC0R(RID,material_create);
- FUNC2(material_set_shader,RID,RID);
- FUNC1RC(RID,material_get_shader,RID);
+ FUNC0R(RID, material_create);
+ FUNC2(material_set_shader, RID, RID);
+ FUNC1RC(RID, material_get_shader, RID);
- FUNC3(material_set_param,RID,const StringName&,const Variant&);
- FUNC2RC(Variant,material_get_param,RID,const StringName&);
+ FUNC3(material_set_param, RID, const StringName &, const Variant &);
+ FUNC2RC(Variant, material_get_param, RID, const StringName &);
- FUNC3(material_set_flag,RID,MaterialFlag,bool);
- FUNC2RC(bool,material_get_flag,RID,MaterialFlag);
+ FUNC3(material_set_flag, RID, MaterialFlag, bool);
+ FUNC2RC(bool, material_get_flag, RID, MaterialFlag);
- FUNC2(material_set_depth_draw_mode,RID,MaterialDepthDrawMode);
- FUNC1RC(MaterialDepthDrawMode,material_get_depth_draw_mode,RID);
+ FUNC2(material_set_depth_draw_mode, RID, MaterialDepthDrawMode);
+ FUNC1RC(MaterialDepthDrawMode, material_get_depth_draw_mode, RID);
- FUNC2(material_set_blend_mode,RID,MaterialBlendMode);
- FUNC1RC(MaterialBlendMode,material_get_blend_mode,RID);
+ FUNC2(material_set_blend_mode, RID, MaterialBlendMode);
+ FUNC1RC(MaterialBlendMode, material_get_blend_mode, RID);
- FUNC2(material_set_line_width,RID,float);
- FUNC1RC(float,material_get_line_width,RID);
+ FUNC2(material_set_line_width, RID, float);
+ FUNC1RC(float, material_get_line_width, RID);
/* FIXED MATERIAL */
+ FUNC0R(RID, fixed_material_create);
- FUNC0R(RID,fixed_material_create);
-
- FUNC3(fixed_material_set_flag,RID, FixedMaterialFlags , bool );
- FUNC2RC(bool, fixed_material_get_flag,RID, FixedMaterialFlags);
+ FUNC3(fixed_material_set_flag, RID, FixedMaterialFlags, bool);
+ FUNC2RC(bool, fixed_material_get_flag, RID, FixedMaterialFlags);
- FUNC3(fixed_material_set_param,RID, FixedMaterialParam, const Variant& );
- FUNC2RC(Variant, fixed_material_get_param,RID ,FixedMaterialParam);
+ FUNC3(fixed_material_set_param, RID, FixedMaterialParam, const Variant &);
+ FUNC2RC(Variant, fixed_material_get_param, RID, FixedMaterialParam);
- FUNC3(fixed_material_set_texture,RID ,FixedMaterialParam, RID );
- FUNC2RC(RID, fixed_material_get_texture,RID,FixedMaterialParam);
+ FUNC3(fixed_material_set_texture, RID, FixedMaterialParam, RID);
+ FUNC2RC(RID, fixed_material_get_texture, RID, FixedMaterialParam);
+ FUNC3(fixed_material_set_texcoord_mode, RID, FixedMaterialParam, FixedMaterialTexCoordMode);
+ FUNC2RC(FixedMaterialTexCoordMode, fixed_material_get_texcoord_mode, RID, FixedMaterialParam);
+ FUNC2(fixed_material_set_light_shader, RID, FixedMaterialLightShader);
+ FUNC1RC(FixedMaterialLightShader, fixed_material_get_light_shader, RID);
- FUNC3(fixed_material_set_texcoord_mode,RID,FixedMaterialParam, FixedMaterialTexCoordMode );
- FUNC2RC(FixedMaterialTexCoordMode, fixed_material_get_texcoord_mode,RID,FixedMaterialParam);
+ FUNC2(fixed_material_set_uv_transform, RID, const Transform &);
+ FUNC1RC(Transform, fixed_material_get_uv_transform, RID);
- FUNC2(fixed_material_set_light_shader,RID,FixedMaterialLightShader);
- FUNC1RC(FixedMaterialLightShader, fixed_material_get_light_shader,RID);
-
- FUNC2(fixed_material_set_uv_transform,RID,const Transform&);
- FUNC1RC(Transform, fixed_material_get_uv_transform,RID);
-
- FUNC2(fixed_material_set_point_size,RID ,float);
- FUNC1RC(float,fixed_material_get_point_size,RID);
+ FUNC2(fixed_material_set_point_size, RID, float);
+ FUNC1RC(float, fixed_material_get_point_size, RID);
/* SURFACE API */
FUNCRID(mesh);
- FUNC2(mesh_set_morph_target_count,RID,int);
- FUNC1RC(int,mesh_get_morph_target_count,RID);
-
-
- FUNC2(mesh_set_morph_target_mode,RID,MorphTargetMode);
- FUNC1RC(MorphTargetMode,mesh_get_morph_target_mode,RID);
-
- FUNC2(mesh_add_custom_surface,RID,const Variant&); //this is used by each platform in a different way
+ FUNC2(mesh_set_morph_target_count, RID, int);
+ FUNC1RC(int, mesh_get_morph_target_count, RID);
- FUNC5(mesh_add_surface,RID,PrimitiveType,const Array&,const Array&,bool);
- FUNC2RC(Array,mesh_get_surface_arrays,RID,int);
- FUNC2RC(Array,mesh_get_surface_morph_arrays,RID,int);
+ FUNC2(mesh_set_morph_target_mode, RID, MorphTargetMode);
+ FUNC1RC(MorphTargetMode, mesh_get_morph_target_mode, RID);
- FUNC4(mesh_surface_set_material,RID, int, RID,bool);
- FUNC2RC(RID,mesh_surface_get_material,RID, int);
+ FUNC2(mesh_add_custom_surface, RID, const Variant &); //this is used by each platform in a different way
- FUNC2RC(int,mesh_surface_get_array_len,RID, int);
- FUNC2RC(int,mesh_surface_get_array_index_len,RID, int);
- FUNC2RC(uint32_t,mesh_surface_get_format,RID, int);
- FUNC2RC(PrimitiveType,mesh_surface_get_primitive_type,RID, int);
+ FUNC5(mesh_add_surface, RID, PrimitiveType, const Array &, const Array &, bool);
+ FUNC2RC(Array, mesh_get_surface_arrays, RID, int);
+ FUNC2RC(Array, mesh_get_surface_morph_arrays, RID, int);
- FUNC2(mesh_remove_surface,RID,int);
- FUNC1RC(int,mesh_get_surface_count,RID);
- FUNC1(mesh_clear,RID);
+ FUNC4(mesh_surface_set_material, RID, int, RID, bool);
+ FUNC2RC(RID, mesh_surface_get_material, RID, int);
+ FUNC2RC(int, mesh_surface_get_array_len, RID, int);
+ FUNC2RC(int, mesh_surface_get_array_index_len, RID, int);
+ FUNC2RC(uint32_t, mesh_surface_get_format, RID, int);
+ FUNC2RC(PrimitiveType, mesh_surface_get_primitive_type, RID, int);
- FUNC2(mesh_set_custom_aabb,RID,const AABB&);
- FUNC1RC(AABB,mesh_get_custom_aabb,RID);
+ FUNC2(mesh_remove_surface, RID, int);
+ FUNC1RC(int, mesh_get_surface_count, RID);
+ FUNC1(mesh_clear, RID);
+ FUNC2(mesh_set_custom_aabb, RID, const AABB &);
+ FUNC1RC(AABB, mesh_get_custom_aabb, RID);
/* MULTIMESH API */
- FUNC0R(RID,multimesh_create);
- FUNC2(multimesh_set_instance_count,RID,int);
- FUNC1RC(int,multimesh_get_instance_count,RID);
+ FUNC0R(RID, multimesh_create);
+ FUNC2(multimesh_set_instance_count, RID, int);
+ FUNC1RC(int, multimesh_get_instance_count, RID);
- FUNC2(multimesh_set_mesh,RID,RID);
- FUNC2(multimesh_set_aabb,RID,const AABB&);
- FUNC3(multimesh_instance_set_transform,RID,int,const Transform&);
- FUNC3(multimesh_instance_set_color,RID,int,const Color&);
+ FUNC2(multimesh_set_mesh, RID, RID);
+ FUNC2(multimesh_set_aabb, RID, const AABB &);
+ FUNC3(multimesh_instance_set_transform, RID, int, const Transform &);
+ FUNC3(multimesh_instance_set_color, RID, int, const Color &);
- FUNC1RC(RID,multimesh_get_mesh,RID);
- FUNC2RC(AABB,multimesh_get_aabb,RID,const AABB&);
- FUNC2RC(Transform,multimesh_instance_get_transform,RID,int);
- FUNC2RC(Color,multimesh_instance_get_color,RID,int);
+ FUNC1RC(RID, multimesh_get_mesh, RID);
+ FUNC2RC(AABB, multimesh_get_aabb, RID, const AABB &);
+ FUNC2RC(Transform, multimesh_instance_get_transform, RID, int);
+ FUNC2RC(Color, multimesh_instance_get_color, RID, int);
- FUNC2(multimesh_set_visible_instances,RID,int);
- FUNC1RC(int,multimesh_get_visible_instances,RID);
+ FUNC2(multimesh_set_visible_instances, RID, int);
+ FUNC1RC(int, multimesh_get_visible_instances, RID);
/* IMMEDIATE API */
-
- FUNC0R(RID,immediate_create);
- FUNC3(immediate_begin,RID,PrimitiveType,RID);
- FUNC2(immediate_vertex,RID,const Vector3&);
- FUNC2(immediate_normal,RID,const Vector3&);
- FUNC2(immediate_tangent,RID,const Plane&);
- FUNC2(immediate_color,RID,const Color&);
- FUNC2(immediate_uv,RID,const Vector2&);
- FUNC2(immediate_uv2,RID,const Vector2&);
- FUNC1(immediate_end,RID);
- FUNC1(immediate_clear,RID);
- FUNC2(immediate_set_material,RID,RID);
- FUNC1RC(RID,immediate_get_material,RID);
-
+ FUNC0R(RID, immediate_create);
+ FUNC3(immediate_begin, RID, PrimitiveType, RID);
+ FUNC2(immediate_vertex, RID, const Vector3 &);
+ FUNC2(immediate_normal, RID, const Vector3 &);
+ FUNC2(immediate_tangent, RID, const Plane &);
+ FUNC2(immediate_color, RID, const Color &);
+ FUNC2(immediate_uv, RID, const Vector2 &);
+ FUNC2(immediate_uv2, RID, const Vector2 &);
+ FUNC1(immediate_end, RID);
+ FUNC1(immediate_clear, RID);
+ FUNC2(immediate_set_material, RID, RID);
+ FUNC1RC(RID, immediate_get_material, RID);
/* PARTICLES API */
- FUNC0R(RID,particles_create);
+ FUNC0R(RID, particles_create);
- FUNC2(particles_set_amount,RID, int );
- FUNC1RC(int,particles_get_amount,RID);
+ FUNC2(particles_set_amount, RID, int);
+ FUNC1RC(int, particles_get_amount, RID);
- FUNC2(particles_set_emitting,RID, bool );
- FUNC1RC(bool,particles_is_emitting,RID);
+ FUNC2(particles_set_emitting, RID, bool);
+ FUNC1RC(bool, particles_is_emitting, RID);
- FUNC2(particles_set_visibility_aabb,RID, const AABB&);
- FUNC1RC(AABB,particles_get_visibility_aabb,RID);
+ FUNC2(particles_set_visibility_aabb, RID, const AABB &);
+ FUNC1RC(AABB, particles_get_visibility_aabb, RID);
- FUNC2(particles_set_emission_half_extents,RID, const Vector3&);
- FUNC1RC(Vector3,particles_get_emission_half_extents,RID);
+ FUNC2(particles_set_emission_half_extents, RID, const Vector3 &);
+ FUNC1RC(Vector3, particles_get_emission_half_extents, RID);
- FUNC2(particles_set_emission_base_velocity,RID, const Vector3&);
- FUNC1RC(Vector3,particles_get_emission_base_velocity,RID);
+ FUNC2(particles_set_emission_base_velocity, RID, const Vector3 &);
+ FUNC1RC(Vector3, particles_get_emission_base_velocity, RID);
- FUNC2(particles_set_emission_points,RID, const DVector<Vector3>& );
- FUNC1RC(DVector<Vector3>,particles_get_emission_points,RID);
+ FUNC2(particles_set_emission_points, RID, const DVector<Vector3> &);
+ FUNC1RC(DVector<Vector3>, particles_get_emission_points, RID);
- FUNC2(particles_set_gravity_normal,RID, const Vector3& );
- FUNC1RC(Vector3,particles_get_gravity_normal,RID);
+ FUNC2(particles_set_gravity_normal, RID, const Vector3 &);
+ FUNC1RC(Vector3, particles_get_gravity_normal, RID);
- FUNC3(particles_set_variable,RID, ParticleVariable ,float);
- FUNC2RC(float,particles_get_variable,RID, ParticleVariable );
+ FUNC3(particles_set_variable, RID, ParticleVariable, float);
+ FUNC2RC(float, particles_get_variable, RID, ParticleVariable);
- FUNC3(particles_set_randomness,RID, ParticleVariable ,float);
- FUNC2RC(float,particles_get_randomness,RID, ParticleVariable );
+ FUNC3(particles_set_randomness, RID, ParticleVariable, float);
+ FUNC2RC(float, particles_get_randomness, RID, ParticleVariable);
- FUNC3(particles_set_color_phase_pos,RID, int , float);
- FUNC2RC(float,particles_get_color_phase_pos,RID, int );
+ FUNC3(particles_set_color_phase_pos, RID, int, float);
+ FUNC2RC(float, particles_get_color_phase_pos, RID, int);
- FUNC2(particles_set_color_phases,RID, int );
- FUNC1RC(int,particles_get_color_phases,RID);
+ FUNC2(particles_set_color_phases, RID, int);
+ FUNC1RC(int, particles_get_color_phases, RID);
- FUNC3(particles_set_color_phase_color,RID, int , const Color& );
- FUNC2RC(Color,particles_get_color_phase_color,RID, int );
+ FUNC3(particles_set_color_phase_color, RID, int, const Color &);
+ FUNC2RC(Color, particles_get_color_phase_color, RID, int);
- FUNC2(particles_set_attractors,RID, int);
- FUNC1RC(int,particles_get_attractors,RID);
+ FUNC2(particles_set_attractors, RID, int);
+ FUNC1RC(int, particles_get_attractors, RID);
- FUNC3(particles_set_attractor_pos,RID, int, const Vector3&);
- FUNC2RC(Vector3,particles_get_attractor_pos,RID,int);
+ FUNC3(particles_set_attractor_pos, RID, int, const Vector3 &);
+ FUNC2RC(Vector3, particles_get_attractor_pos, RID, int);
- FUNC3(particles_set_attractor_strength,RID, int, float);
- FUNC2RC(float,particles_get_attractor_strength,RID,int);
+ FUNC3(particles_set_attractor_strength, RID, int, float);
+ FUNC2RC(float, particles_get_attractor_strength, RID, int);
- FUNC3(particles_set_material,RID, RID,bool);
- FUNC1RC(RID,particles_get_material,RID);
+ FUNC3(particles_set_material, RID, RID, bool);
+ FUNC1RC(RID, particles_get_material, RID);
- FUNC2(particles_set_height_from_velocity,RID, bool);
- FUNC1RC(bool,particles_has_height_from_velocity,RID);
-
- FUNC2(particles_set_use_local_coordinates,RID, bool);
- FUNC1RC(bool,particles_is_using_local_coordinates,RID);
+ FUNC2(particles_set_height_from_velocity, RID, bool);
+ FUNC1RC(bool, particles_has_height_from_velocity, RID);
+ FUNC2(particles_set_use_local_coordinates, RID, bool);
+ FUNC1RC(bool, particles_is_using_local_coordinates, RID);
/* Light API */
- FUNC1R(RID,light_create,LightType);
- FUNC1RC(LightType,light_get_type,RID);
-
- FUNC3(light_set_color,RID,LightColor , const Color& );
- FUNC2RC(Color,light_get_color,RID,LightColor );
+ FUNC1R(RID, light_create, LightType);
+ FUNC1RC(LightType, light_get_type, RID);
+ FUNC3(light_set_color, RID, LightColor, const Color &);
+ FUNC2RC(Color, light_get_color, RID, LightColor);
- FUNC2(light_set_shadow,RID,bool );
- FUNC1RC(bool,light_has_shadow,RID);
+ FUNC2(light_set_shadow, RID, bool);
+ FUNC1RC(bool, light_has_shadow, RID);
- FUNC2(light_set_volumetric,RID,bool );
- FUNC1RC(bool,light_is_volumetric,RID);
+ FUNC2(light_set_volumetric, RID, bool);
+ FUNC1RC(bool, light_is_volumetric, RID);
- FUNC2(light_set_projector,RID,RID );
- FUNC1RC(RID,light_get_projector,RID);
+ FUNC2(light_set_projector, RID, RID);
+ FUNC1RC(RID, light_get_projector, RID);
- FUNC3(light_set_param,RID, LightParam , float );
- FUNC2RC(float,light_get_param,RID, LightParam );
+ FUNC3(light_set_param, RID, LightParam, float);
+ FUNC2RC(float, light_get_param, RID, LightParam);
- FUNC2(light_set_operator,RID,LightOp);
- FUNC1RC(LightOp,light_get_operator,RID);
+ FUNC2(light_set_operator, RID, LightOp);
+ FUNC1RC(LightOp, light_get_operator, RID);
- FUNC2(light_omni_set_shadow_mode,RID,LightOmniShadowMode);
- FUNC1RC(LightOmniShadowMode,light_omni_get_shadow_mode,RID);
-
- FUNC2(light_directional_set_shadow_mode,RID,LightDirectionalShadowMode);
- FUNC1RC(LightDirectionalShadowMode,light_directional_get_shadow_mode,RID);
- FUNC3(light_directional_set_shadow_param,RID,LightDirectionalShadowParam, float );
- FUNC2RC(float,light_directional_get_shadow_param,RID,LightDirectionalShadowParam );
+ FUNC2(light_omni_set_shadow_mode, RID, LightOmniShadowMode);
+ FUNC1RC(LightOmniShadowMode, light_omni_get_shadow_mode, RID);
+ FUNC2(light_directional_set_shadow_mode, RID, LightDirectionalShadowMode);
+ FUNC1RC(LightDirectionalShadowMode, light_directional_get_shadow_mode, RID);
+ FUNC3(light_directional_set_shadow_param, RID, LightDirectionalShadowParam, float);
+ FUNC2RC(float, light_directional_get_shadow_param, RID, LightDirectionalShadowParam);
/* SKELETON API */
- FUNC0R(RID,skeleton_create);
- FUNC2(skeleton_resize,RID,int );
- FUNC1RC(int,skeleton_get_bone_count,RID) ;
- FUNC3(skeleton_bone_set_transform,RID,int, const Transform&);
- FUNC2R(Transform,skeleton_bone_get_transform,RID,int );
+ FUNC0R(RID, skeleton_create);
+ FUNC2(skeleton_resize, RID, int);
+ FUNC1RC(int, skeleton_get_bone_count, RID);
+ FUNC3(skeleton_bone_set_transform, RID, int, const Transform &);
+ FUNC2R(Transform, skeleton_bone_get_transform, RID, int);
/* ROOM API */
- FUNC0R(RID,room_create);
- FUNC2(room_set_bounds,RID, const BSP_Tree&);
- FUNC1RC(BSP_Tree,room_get_bounds,RID);
+ FUNC0R(RID, room_create);
+ FUNC2(room_set_bounds, RID, const BSP_Tree &);
+ FUNC1RC(BSP_Tree, room_get_bounds, RID);
/* PORTAL API */
- FUNC0R(RID,portal_create);
- FUNC2(portal_set_shape,RID,const Vector<Point2>&);
- FUNC1RC(Vector<Point2>,portal_get_shape,RID);
- FUNC2(portal_set_enabled,RID, bool);
- FUNC1RC(bool,portal_is_enabled,RID);
- FUNC2(portal_set_disable_distance,RID, float);
- FUNC1RC(float,portal_get_disable_distance,RID);
- FUNC2(portal_set_disabled_color,RID, const Color&);
- FUNC1RC(Color,portal_get_disabled_color,RID);
- FUNC2(portal_set_connect_range,RID, float);
- FUNC1RC(float,portal_get_connect_range,RID);
-
+ FUNC0R(RID, portal_create);
+ FUNC2(portal_set_shape, RID, const Vector<Point2> &);
+ FUNC1RC(Vector<Point2>, portal_get_shape, RID);
+ FUNC2(portal_set_enabled, RID, bool);
+ FUNC1RC(bool, portal_is_enabled, RID);
+ FUNC2(portal_set_disable_distance, RID, float);
+ FUNC1RC(float, portal_get_disable_distance, RID);
+ FUNC2(portal_set_disabled_color, RID, const Color &);
+ FUNC1RC(Color, portal_get_disabled_color, RID);
+ FUNC2(portal_set_connect_range, RID, float);
+ FUNC1RC(float, portal_get_connect_range, RID);
- FUNC0R(RID,baked_light_create);
- FUNC2(baked_light_set_mode,RID,BakedLightMode);
- FUNC1RC(BakedLightMode,baked_light_get_mode,RID);
+ FUNC0R(RID, baked_light_create);
+ FUNC2(baked_light_set_mode, RID, BakedLightMode);
+ FUNC1RC(BakedLightMode, baked_light_get_mode, RID);
- FUNC2(baked_light_set_octree,RID,DVector<uint8_t>);
- FUNC1RC(DVector<uint8_t>,baked_light_get_octree,RID);
+ FUNC2(baked_light_set_octree, RID, DVector<uint8_t>);
+ FUNC1RC(DVector<uint8_t>, baked_light_get_octree, RID);
- FUNC2(baked_light_set_light,RID,DVector<uint8_t>);
- FUNC1RC(DVector<uint8_t>,baked_light_get_light,RID);
+ FUNC2(baked_light_set_light, RID, DVector<uint8_t>);
+ FUNC1RC(DVector<uint8_t>, baked_light_get_light, RID);
- FUNC2(baked_light_set_sampler_octree,RID,const DVector<int>&);
- FUNC1RC(DVector<int>,baked_light_get_sampler_octree,RID);
+ FUNC2(baked_light_set_sampler_octree, RID, const DVector<int> &);
+ FUNC1RC(DVector<int>, baked_light_get_sampler_octree, RID);
- FUNC2(baked_light_set_lightmap_multiplier,RID,float);
- FUNC1RC(float,baked_light_get_lightmap_multiplier,RID);
+ FUNC2(baked_light_set_lightmap_multiplier, RID, float);
+ FUNC1RC(float, baked_light_get_lightmap_multiplier, RID);
- FUNC3(baked_light_add_lightmap,RID,RID,int);
- FUNC1(baked_light_clear_lightmaps,RID);
+ FUNC3(baked_light_add_lightmap, RID, RID, int);
+ FUNC1(baked_light_clear_lightmaps, RID);
FUNC2(baked_light_set_realtime_color_enabled, RID, const bool);
FUNC1RC(bool, baked_light_get_realtime_color_enabled, RID);
- FUNC2(baked_light_set_realtime_color, RID, const Color&);
+ FUNC2(baked_light_set_realtime_color, RID, const Color &);
FUNC1RC(Color, baked_light_get_realtime_color, RID);
FUNC2(baked_light_set_realtime_energy, RID, const float);
FUNC1RC(float, baked_light_get_realtime_energy, RID);
- FUNC0R(RID,baked_light_sampler_create);
+ FUNC0R(RID, baked_light_sampler_create);
- FUNC3(baked_light_sampler_set_param,RID, BakedLightSamplerParam , float );
- FUNC2RC(float,baked_light_sampler_get_param,RID, BakedLightSamplerParam );
+ FUNC3(baked_light_sampler_set_param, RID, BakedLightSamplerParam, float);
+ FUNC2RC(float, baked_light_sampler_get_param, RID, BakedLightSamplerParam);
- FUNC2(baked_light_sampler_set_resolution,RID,int);
- FUNC1RC(int,baked_light_sampler_get_resolution,RID);
+ FUNC2(baked_light_sampler_set_resolution, RID, int);
+ FUNC1RC(int, baked_light_sampler_get_resolution, RID);
/* CAMERA API */
- FUNC0R(RID,camera_create);
- FUNC4(camera_set_perspective,RID,float , float , float );
- FUNC4(camera_set_orthogonal,RID,float, float , float );
- FUNC2(camera_set_transform,RID,const Transform& );
-
- FUNC2(camera_set_visible_layers,RID,uint32_t);
- FUNC1RC(uint32_t,camera_get_visible_layers,RID);
+ FUNC0R(RID, camera_create);
+ FUNC4(camera_set_perspective, RID, float, float, float);
+ FUNC4(camera_set_orthogonal, RID, float, float, float);
+ FUNC2(camera_set_transform, RID, const Transform &);
- FUNC2(camera_set_environment,RID,RID);
- FUNC1RC(RID,camera_get_environment,RID);
+ FUNC2(camera_set_visible_layers, RID, uint32_t);
+ FUNC1RC(uint32_t, camera_get_visible_layers, RID);
+ FUNC2(camera_set_environment, RID, RID);
+ FUNC1RC(RID, camera_get_environment, RID);
- FUNC2(camera_set_use_vertical_aspect,RID,bool);
- FUNC2RC(bool,camera_is_using_vertical_aspect,RID,bool);
-
+ FUNC2(camera_set_use_vertical_aspect, RID, bool);
+ FUNC2RC(bool, camera_is_using_vertical_aspect, RID, bool);
/* VIEWPORT API */
- FUNC0R(RID,viewport_create);
-
- FUNC2(viewport_attach_to_screen,RID,int );
- FUNC1(viewport_detach,RID);
+ FUNC0R(RID, viewport_create);
- FUNC2(viewport_set_as_render_target,RID,bool);
- FUNC2(viewport_set_render_target_update_mode,RID,RenderTargetUpdateMode);
- FUNC1RC(RenderTargetUpdateMode,viewport_get_render_target_update_mode,RID);
- FUNC1RC(RID,viewport_get_render_target_texture,RID);
+ FUNC2(viewport_attach_to_screen, RID, int);
+ FUNC1(viewport_detach, RID);
- FUNC2(viewport_set_render_target_vflip,RID,bool);
- FUNC1RC(bool,viewport_get_render_target_vflip,RID);
- FUNC2(viewport_set_render_target_to_screen_rect,RID,const Rect2&);
+ FUNC2(viewport_set_as_render_target, RID, bool);
+ FUNC2(viewport_set_render_target_update_mode, RID, RenderTargetUpdateMode);
+ FUNC1RC(RenderTargetUpdateMode, viewport_get_render_target_update_mode, RID);
+ FUNC1RC(RID, viewport_get_render_target_texture, RID);
- FUNC2(viewport_set_render_target_clear_on_new_frame,RID,bool);
- FUNC1RC(bool,viewport_get_render_target_clear_on_new_frame,RID);
- FUNC1(viewport_render_target_clear,RID);
+ FUNC2(viewport_set_render_target_vflip, RID, bool);
+ FUNC1RC(bool, viewport_get_render_target_vflip, RID);
+ FUNC2(viewport_set_render_target_to_screen_rect, RID, const Rect2 &);
- FUNC1(viewport_queue_screen_capture,RID);
- FUNC1RC(Image,viewport_get_screen_capture,RID);
+ FUNC2(viewport_set_render_target_clear_on_new_frame, RID, bool);
+ FUNC1RC(bool, viewport_get_render_target_clear_on_new_frame, RID);
+ FUNC1(viewport_render_target_clear, RID);
- FUNC2(viewport_set_rect,RID,const ViewportRect&);
- FUNC1RC(ViewportRect,viewport_get_rect,RID);
+ FUNC1(viewport_queue_screen_capture, RID);
+ FUNC1RC(Image, viewport_get_screen_capture, RID);
- FUNC2(viewport_set_hide_scenario,RID,bool );
- FUNC2(viewport_set_hide_canvas,RID,bool );
- FUNC2(viewport_attach_camera,RID,RID );
- FUNC2(viewport_set_scenario,RID,RID );
- FUNC2(viewport_set_disable_environment,RID,bool );
+ FUNC2(viewport_set_rect, RID, const ViewportRect &);
+ FUNC1RC(ViewportRect, viewport_get_rect, RID);
- FUNC1RC(RID,viewport_get_attached_camera,RID);
- FUNC1RC(RID,viewport_get_scenario,RID );
- FUNC2(viewport_attach_canvas,RID,RID);
- FUNC2(viewport_remove_canvas,RID,RID);
- FUNC3(viewport_set_canvas_transform,RID,RID,const Matrix32&);
- FUNC2RC(Matrix32,viewport_get_canvas_transform,RID,RID);
- FUNC2(viewport_set_global_canvas_transform,RID,const Matrix32&);
- FUNC1RC(Matrix32,viewport_get_global_canvas_transform,RID);
- FUNC3(viewport_set_canvas_layer,RID,RID ,int);
- FUNC2(viewport_set_transparent_background,RID,bool);
- FUNC1RC(bool,viewport_has_transparent_background,RID);
+ FUNC2(viewport_set_hide_scenario, RID, bool);
+ FUNC2(viewport_set_hide_canvas, RID, bool);
+ FUNC2(viewport_attach_camera, RID, RID);
+ FUNC2(viewport_set_scenario, RID, RID);
+ FUNC2(viewport_set_disable_environment, RID, bool);
+ FUNC1RC(RID, viewport_get_attached_camera, RID);
+ FUNC1RC(RID, viewport_get_scenario, RID);
+ FUNC2(viewport_attach_canvas, RID, RID);
+ FUNC2(viewport_remove_canvas, RID, RID);
+ FUNC3(viewport_set_canvas_transform, RID, RID, const Matrix32 &);
+ FUNC2RC(Matrix32, viewport_get_canvas_transform, RID, RID);
+ FUNC2(viewport_set_global_canvas_transform, RID, const Matrix32 &);
+ FUNC1RC(Matrix32, viewport_get_global_canvas_transform, RID);
+ FUNC3(viewport_set_canvas_layer, RID, RID, int);
+ FUNC2(viewport_set_transparent_background, RID, bool);
+ FUNC1RC(bool, viewport_has_transparent_background, RID);
/* ENVIRONMENT API */
- FUNC0R(RID,environment_create);
+ FUNC0R(RID, environment_create);
- FUNC2(environment_set_background,RID,EnvironmentBG);
- FUNC1RC(EnvironmentBG,environment_get_background,RID);
+ FUNC2(environment_set_background, RID, EnvironmentBG);
+ FUNC1RC(EnvironmentBG, environment_get_background, RID);
- FUNC3(environment_set_background_param,RID,EnvironmentBGParam, const Variant&);
- FUNC2RC(Variant,environment_get_background_param,RID,EnvironmentBGParam );
+ FUNC3(environment_set_background_param, RID, EnvironmentBGParam, const Variant &);
+ FUNC2RC(Variant, environment_get_background_param, RID, EnvironmentBGParam);
- FUNC3(environment_set_enable_fx,RID,EnvironmentFx,bool);
- FUNC2RC(bool,environment_is_fx_enabled,RID,EnvironmentFx);
-
-
- FUNC3(environment_fx_set_param,RID,EnvironmentFxParam,const Variant&);
- FUNC2RC(Variant,environment_fx_get_param,RID,EnvironmentFxParam);
+ FUNC3(environment_set_enable_fx, RID, EnvironmentFx, bool);
+ FUNC2RC(bool, environment_is_fx_enabled, RID, EnvironmentFx);
+ FUNC3(environment_fx_set_param, RID, EnvironmentFxParam, const Variant &);
+ FUNC2RC(Variant, environment_fx_get_param, RID, EnvironmentFxParam);
/* SCENARIO API */
- FUNC0R(RID,scenario_create);
-
- FUNC2(scenario_set_debug,RID,ScenarioDebugMode);
- FUNC2(scenario_set_environment,RID, RID);
- FUNC2RC(RID,scenario_get_environment,RID, RID);
- FUNC2(scenario_set_fallback_environment,RID, RID);
+ FUNC0R(RID, scenario_create);
+ FUNC2(scenario_set_debug, RID, ScenarioDebugMode);
+ FUNC2(scenario_set_environment, RID, RID);
+ FUNC2RC(RID, scenario_get_environment, RID, RID);
+ FUNC2(scenario_set_fallback_environment, RID, RID);
/* INSTANCING API */
- FUNC0R(RID,instance_create);
+ FUNC0R(RID, instance_create);
- FUNC2(instance_set_base,RID, RID);
- FUNC1RC(RID,instance_get_base,RID);
+ FUNC2(instance_set_base, RID, RID);
+ FUNC1RC(RID, instance_get_base, RID);
- FUNC2(instance_set_scenario,RID, RID);
- FUNC1RC(RID,instance_get_scenario,RID);
+ FUNC2(instance_set_scenario, RID, RID);
+ FUNC1RC(RID, instance_get_scenario, RID);
- FUNC2(instance_set_layer_mask,RID, uint32_t);
- FUNC1RC(uint32_t,instance_get_layer_mask,RID);
+ FUNC2(instance_set_layer_mask, RID, uint32_t);
+ FUNC1RC(uint32_t, instance_get_layer_mask, RID);
- FUNC1RC(AABB,instance_get_base_aabb,RID);
+ FUNC1RC(AABB, instance_get_base_aabb, RID);
- FUNC2(instance_attach_object_instance_ID,RID,uint32_t);
- FUNC1RC(uint32_t,instance_get_object_instance_ID,RID);
+ FUNC2(instance_attach_object_instance_ID, RID, uint32_t);
+ FUNC1RC(uint32_t, instance_get_object_instance_ID, RID);
- FUNC2(instance_attach_skeleton,RID,RID);
- FUNC1RC(RID,instance_get_skeleton,RID);
+ FUNC2(instance_attach_skeleton, RID, RID);
+ FUNC1RC(RID, instance_get_skeleton, RID);
- FUNC3(instance_set_morph_target_weight,RID,int, float);
- FUNC2RC(float,instance_get_morph_target_weight,RID,int);
+ FUNC3(instance_set_morph_target_weight, RID, int, float);
+ FUNC2RC(float, instance_get_morph_target_weight, RID, int);
- FUNC3(instance_set_surface_material,RID,int, RID);
+ FUNC3(instance_set_surface_material, RID, int, RID);
- FUNC2(instance_set_transform,RID, const Transform&);
- FUNC1RC(Transform,instance_get_transform,RID);
+ FUNC2(instance_set_transform, RID, const Transform &);
+ FUNC1RC(Transform, instance_get_transform, RID);
- FUNC2(instance_set_exterior,RID, bool );
- FUNC1RC(bool,instance_is_exterior,RID);
+ FUNC2(instance_set_exterior, RID, bool);
+ FUNC1RC(bool, instance_is_exterior, RID);
- FUNC2(instance_set_room,RID, RID );
- FUNC1RC(RID,instance_get_room,RID ) ;
+ FUNC2(instance_set_room, RID, RID);
+ FUNC1RC(RID, instance_get_room, RID);
- FUNC2(instance_set_extra_visibility_margin,RID, real_t );
- FUNC1RC(real_t,instance_get_extra_visibility_margin,RID );
+ FUNC2(instance_set_extra_visibility_margin, RID, real_t);
+ FUNC1RC(real_t, instance_get_extra_visibility_margin, RID);
- FUNC2RC(Vector<RID>,instances_cull_aabb,const AABB& , RID );
- FUNC3RC(Vector<RID>,instances_cull_ray,const Vector3& ,const Vector3&, RID );
- FUNC2RC(Vector<RID>,instances_cull_convex,const Vector<Plane>& , RID );
+ FUNC2RC(Vector<RID>, instances_cull_aabb, const AABB &, RID);
+ FUNC3RC(Vector<RID>, instances_cull_ray, const Vector3 &, const Vector3 &, RID);
+ FUNC2RC(Vector<RID>, instances_cull_convex, const Vector<Plane> &, RID);
- FUNC3(instance_geometry_set_flag,RID,InstanceFlags ,bool );
- FUNC2RC(bool,instance_geometry_get_flag,RID,InstanceFlags );
+ FUNC3(instance_geometry_set_flag, RID, InstanceFlags, bool);
+ FUNC2RC(bool, instance_geometry_get_flag, RID, InstanceFlags);
FUNC2(instance_geometry_set_cast_shadows_setting, RID, ShadowCastingSetting);
FUNC1RC(ShadowCastingSetting, instance_geometry_get_cast_shadows_setting, RID);
- FUNC2(instance_geometry_set_material_override,RID, RID );
- FUNC1RC(RID,instance_geometry_get_material_override,RID);
+ FUNC2(instance_geometry_set_material_override, RID, RID);
+ FUNC1RC(RID, instance_geometry_get_material_override, RID);
- FUNC3(instance_geometry_set_draw_range,RID,float ,float);
- FUNC1RC(float,instance_geometry_get_draw_range_max,RID);
- FUNC1RC(float,instance_geometry_get_draw_range_min,RID);
+ FUNC3(instance_geometry_set_draw_range, RID, float, float);
+ FUNC1RC(float, instance_geometry_get_draw_range_max, RID);
+ FUNC1RC(float, instance_geometry_get_draw_range_min, RID);
- FUNC2(instance_geometry_set_baked_light,RID, RID );
- FUNC1RC(RID,instance_geometry_get_baked_light,RID);
+ FUNC2(instance_geometry_set_baked_light, RID, RID);
+ FUNC1RC(RID, instance_geometry_get_baked_light, RID);
- FUNC2(instance_geometry_set_baked_light_sampler,RID, RID );
- FUNC1RC(RID,instance_geometry_get_baked_light_sampler,RID);
+ FUNC2(instance_geometry_set_baked_light_sampler, RID, RID);
+ FUNC1RC(RID, instance_geometry_get_baked_light_sampler, RID);
- FUNC2(instance_geometry_set_baked_light_texture_index,RID, int);
- FUNC1RC(int,instance_geometry_get_baked_light_texture_index,RID);
+ FUNC2(instance_geometry_set_baked_light_texture_index, RID, int);
+ FUNC1RC(int, instance_geometry_get_baked_light_texture_index, RID);
- FUNC2(instance_light_set_enabled,RID,bool);
- FUNC1RC(bool,instance_light_is_enabled,RID);
+ FUNC2(instance_light_set_enabled, RID, bool);
+ FUNC1RC(bool, instance_light_is_enabled, RID);
/* CANVAS (2D) */
- FUNC0R(RID,canvas_create);
- FUNC3(canvas_set_item_mirroring,RID,RID,const Point2&);
- FUNC2RC(Point2,canvas_get_item_mirroring,RID,RID);
- FUNC2(canvas_set_modulate,RID,const Color&);
-
+ FUNC0R(RID, canvas_create);
+ FUNC3(canvas_set_item_mirroring, RID, RID, const Point2 &);
+ FUNC2RC(Point2, canvas_get_item_mirroring, RID, RID);
+ FUNC2(canvas_set_modulate, RID, const Color &);
- FUNC0R(RID,canvas_item_create);
+ FUNC0R(RID, canvas_item_create);
- FUNC2(canvas_item_set_parent,RID,RID );
- FUNC1RC(RID,canvas_item_get_parent,RID);
+ FUNC2(canvas_item_set_parent, RID, RID);
+ FUNC1RC(RID, canvas_item_get_parent, RID);
- FUNC2(canvas_item_set_visible,RID,bool );
- FUNC1RC(bool,canvas_item_is_visible,RID);
+ FUNC2(canvas_item_set_visible, RID, bool);
+ FUNC1RC(bool, canvas_item_is_visible, RID);
- FUNC2(canvas_item_set_blend_mode,RID,MaterialBlendMode );
- FUNC2(canvas_item_set_light_mask,RID,int );
+ FUNC2(canvas_item_set_blend_mode, RID, MaterialBlendMode);
+ FUNC2(canvas_item_set_light_mask, RID, int);
//FUNC(canvas_item_set_rect,RID, const Rect2& p_rect);
- FUNC2(canvas_item_set_transform,RID, const Matrix32& );
- FUNC2(canvas_item_set_clip,RID, bool );
- FUNC2(canvas_item_set_distance_field_mode,RID, bool );
- FUNC3(canvas_item_set_custom_rect,RID, bool ,const Rect2&);
- FUNC2(canvas_item_set_opacity,RID, float );
- FUNC2RC(float,canvas_item_get_opacity,RID, float );
- FUNC2(canvas_item_set_on_top,RID, bool );
- FUNC1RC(bool,canvas_item_is_on_top,RID);
+ FUNC2(canvas_item_set_transform, RID, const Matrix32 &);
+ FUNC2(canvas_item_set_clip, RID, bool);
+ FUNC2(canvas_item_set_distance_field_mode, RID, bool);
+ FUNC3(canvas_item_set_custom_rect, RID, bool, const Rect2 &);
+ FUNC2(canvas_item_set_opacity, RID, float);
+ FUNC2RC(float, canvas_item_get_opacity, RID, float);
+ FUNC2(canvas_item_set_on_top, RID, bool);
+ FUNC1RC(bool, canvas_item_is_on_top, RID);
- FUNC2(canvas_item_set_self_opacity,RID, float );
- FUNC2RC(float,canvas_item_get_self_opacity,RID, float );
+ FUNC2(canvas_item_set_self_opacity, RID, float);
+ FUNC2RC(float, canvas_item_get_self_opacity, RID, float);
- FUNC2(canvas_item_attach_viewport,RID, RID );
+ FUNC2(canvas_item_attach_viewport, RID, RID);
- FUNC5(canvas_item_add_line,RID, const Point2& , const Point2& ,const Color& ,float );
- FUNC3(canvas_item_add_rect,RID, const Rect2& , const Color& );
- FUNC4(canvas_item_add_circle,RID, const Point2& , float ,const Color& );
- FUNC6(canvas_item_add_texture_rect,RID, const Rect2& , RID ,bool ,const Color&,bool );
- FUNC6(canvas_item_add_texture_rect_region,RID, const Rect2& , RID ,const Rect2& ,const Color&,bool );
- FUNC8(canvas_item_add_style_box,RID, const Rect2& , const Rect2&, RID ,const Vector2& ,const Vector2&, bool ,const Color& );
- FUNC6(canvas_item_add_primitive,RID, const Vector<Point2>& , const Vector<Color>& ,const Vector<Point2>& , RID ,float );
- FUNC5(canvas_item_add_polygon,RID, const Vector<Point2>& , const Vector<Color>& ,const Vector<Point2>& , RID );
- FUNC7(canvas_item_add_triangle_array,RID, const Vector<int>& , const Vector<Point2>& , const Vector<Color>& ,const Vector<Point2>& , RID , int );
- FUNC7(canvas_item_add_triangle_array_ptr,RID, int , const int* , const Point2* , const Color* ,const Point2* , RID );
+ FUNC5(canvas_item_add_line, RID, const Point2 &, const Point2 &, const Color &, float);
+ FUNC3(canvas_item_add_rect, RID, const Rect2 &, const Color &);
+ FUNC4(canvas_item_add_circle, RID, const Point2 &, float, const Color &);
+ FUNC6(canvas_item_add_texture_rect, RID, const Rect2 &, RID, bool, const Color &, bool);
+ FUNC6(canvas_item_add_texture_rect_region, RID, const Rect2 &, RID, const Rect2 &, const Color &, bool);
+ FUNC8(canvas_item_add_style_box, RID, const Rect2 &, const Rect2 &, RID, const Vector2 &, const Vector2 &, bool, const Color &);
+ FUNC6(canvas_item_add_primitive, RID, const Vector<Point2> &, const Vector<Color> &, const Vector<Point2> &, RID, float);
+ FUNC5(canvas_item_add_polygon, RID, const Vector<Point2> &, const Vector<Color> &, const Vector<Point2> &, RID);
+ FUNC7(canvas_item_add_triangle_array, RID, const Vector<int> &, const Vector<Point2> &, const Vector<Color> &, const Vector<Point2> &, RID, int);
+ FUNC7(canvas_item_add_triangle_array_ptr, RID, int, const int *, const Point2 *, const Color *, const Point2 *, RID);
+ FUNC2(canvas_item_add_set_transform, RID, const Matrix32 &);
+ FUNC2(canvas_item_add_set_blend_mode, RID, MaterialBlendMode);
+ FUNC2(canvas_item_add_clip_ignore, RID, bool);
- FUNC2(canvas_item_add_set_transform,RID,const Matrix32& );
- FUNC2(canvas_item_add_set_blend_mode,RID, MaterialBlendMode );
- FUNC2(canvas_item_add_clip_ignore,RID, bool );
+ FUNC2(canvas_item_set_sort_children_by_y, RID, bool);
+ FUNC2(canvas_item_set_z, RID, int);
+ FUNC2(canvas_item_set_z_as_relative_to_parent, RID, bool);
+ FUNC3(canvas_item_set_copy_to_backbuffer, RID, bool, const Rect2 &);
- FUNC2(canvas_item_set_sort_children_by_y,RID,bool);
- FUNC2(canvas_item_set_z,RID,int);
- FUNC2(canvas_item_set_z_as_relative_to_parent,RID,bool);
- FUNC3(canvas_item_set_copy_to_backbuffer,RID,bool,const Rect2&);
+ FUNC2(canvas_item_set_material, RID, RID);
+ FUNC2(canvas_item_set_use_parent_material, RID, bool);
- FUNC2(canvas_item_set_material,RID, RID );
-
- FUNC2(canvas_item_set_use_parent_material,RID, bool );
-
- FUNC1(canvas_item_clear,RID);
- FUNC1(canvas_item_raise,RID);
+ FUNC1(canvas_item_clear, RID);
+ FUNC1(canvas_item_raise, RID);
/* CANVAS LIGHT */
- FUNC0R(RID,canvas_light_create);
- FUNC2(canvas_light_attach_to_canvas,RID,RID);
- FUNC2(canvas_light_set_enabled,RID,bool);
- FUNC2(canvas_light_set_transform,RID,const Matrix32&);
- FUNC2(canvas_light_set_scale,RID,float);
- FUNC2(canvas_light_set_texture,RID,RID);
- FUNC2(canvas_light_set_texture_offset,RID,const Vector2&);
- FUNC2(canvas_light_set_color,RID,const Color&);
- FUNC2(canvas_light_set_height,RID,float);
- FUNC2(canvas_light_set_energy,RID,float);
- FUNC3(canvas_light_set_layer_range,RID,int,int);
- FUNC3(canvas_light_set_z_range,RID,int,int);
- FUNC2(canvas_light_set_item_mask,RID,int);
- FUNC2(canvas_light_set_item_shadow_mask,RID,int);
-
- FUNC2(canvas_light_set_mode,RID,CanvasLightMode);
- FUNC2(canvas_light_set_shadow_enabled,RID,bool);
- FUNC2(canvas_light_set_shadow_buffer_size,RID,int);
- FUNC2(canvas_light_set_shadow_esm_multiplier,RID,float);
- FUNC2(canvas_light_set_shadow_color,RID,const Color&);
-
+ FUNC0R(RID, canvas_light_create);
+ FUNC2(canvas_light_attach_to_canvas, RID, RID);
+ FUNC2(canvas_light_set_enabled, RID, bool);
+ FUNC2(canvas_light_set_transform, RID, const Matrix32 &);
+ FUNC2(canvas_light_set_scale, RID, float);
+ FUNC2(canvas_light_set_texture, RID, RID);
+ FUNC2(canvas_light_set_texture_offset, RID, const Vector2 &);
+ FUNC2(canvas_light_set_color, RID, const Color &);
+ FUNC2(canvas_light_set_height, RID, float);
+ FUNC2(canvas_light_set_energy, RID, float);
+ FUNC3(canvas_light_set_layer_range, RID, int, int);
+ FUNC3(canvas_light_set_z_range, RID, int, int);
+ FUNC2(canvas_light_set_item_mask, RID, int);
+ FUNC2(canvas_light_set_item_shadow_mask, RID, int);
+ FUNC2(canvas_light_set_mode, RID, CanvasLightMode);
+ FUNC2(canvas_light_set_shadow_enabled, RID, bool);
+ FUNC2(canvas_light_set_shadow_buffer_size, RID, int);
+ FUNC2(canvas_light_set_shadow_esm_multiplier, RID, float);
+ FUNC2(canvas_light_set_shadow_color, RID, const Color &);
/* CANVAS OCCLUDER */
- FUNC0R(RID,canvas_light_occluder_create);
- FUNC2(canvas_light_occluder_attach_to_canvas,RID,RID);
- FUNC2(canvas_light_occluder_set_enabled,RID,bool);
- FUNC2(canvas_light_occluder_set_polygon,RID,RID);
- FUNC2(canvas_light_occluder_set_transform,RID,const Matrix32&);
- FUNC2(canvas_light_occluder_set_light_mask,RID,int);
+ FUNC0R(RID, canvas_light_occluder_create);
+ FUNC2(canvas_light_occluder_attach_to_canvas, RID, RID);
+ FUNC2(canvas_light_occluder_set_enabled, RID, bool);
+ FUNC2(canvas_light_occluder_set_polygon, RID, RID);
+ FUNC2(canvas_light_occluder_set_transform, RID, const Matrix32 &);
+ FUNC2(canvas_light_occluder_set_light_mask, RID, int);
-
- FUNC0R(RID,canvas_occluder_polygon_create);
- FUNC3(canvas_occluder_polygon_set_shape,RID,const DVector<Vector2>&,bool);
- FUNC2(canvas_occluder_polygon_set_shape_as_lines,RID,const DVector<Vector2>&);
- FUNC2(canvas_occluder_polygon_set_cull_mode,RID,CanvasOccluderPolygonCullMode);
+ FUNC0R(RID, canvas_occluder_polygon_create);
+ FUNC3(canvas_occluder_polygon_set_shape, RID, const DVector<Vector2> &, bool);
+ FUNC2(canvas_occluder_polygon_set_shape_as_lines, RID, const DVector<Vector2> &);
+ FUNC2(canvas_occluder_polygon_set_cull_mode, RID, CanvasOccluderPolygonCullMode);
/* CANVAS MATERIAL */
- FUNC0R(RID,canvas_item_material_create);
- FUNC2(canvas_item_material_set_shader,RID,RID);
- FUNC3(canvas_item_material_set_shader_param,RID,const StringName&,const Variant&);
- FUNC2RC(Variant,canvas_item_material_get_shader_param,RID,const StringName&);
- FUNC2(canvas_item_material_set_shading_mode,RID,CanvasItemShadingMode);
+ FUNC0R(RID, canvas_item_material_create);
+ FUNC2(canvas_item_material_set_shader, RID, RID);
+ FUNC3(canvas_item_material_set_shader_param, RID, const StringName &, const Variant &);
+ FUNC2RC(Variant, canvas_item_material_get_shader_param, RID, const StringName &);
+ FUNC2(canvas_item_material_set_shading_mode, RID, CanvasItemShadingMode);
/* CURSOR */
- FUNC2(cursor_set_rotation,float , int ); // radians
- FUNC4(cursor_set_texture,RID , const Point2 &, int, const Rect2 &);
- FUNC2(cursor_set_visible,bool , int );
- FUNC2(cursor_set_pos,const Point2& , int );
+ FUNC2(cursor_set_rotation, float, int); // radians
+ FUNC4(cursor_set_texture, RID, const Point2 &, int, const Rect2 &);
+ FUNC2(cursor_set_visible, bool, int);
+ FUNC2(cursor_set_pos, const Point2 &, int);
/* BLACK BARS */
- FUNC4(black_bars_set_margins,int , int , int , int );
- FUNC4(black_bars_set_images,RID , RID , RID , RID );
+ FUNC4(black_bars_set_margins, int, int, int, int);
+ FUNC4(black_bars_set_images, RID, RID, RID, RID);
/* FREE */
- FUNC1(free,RID);
+ FUNC1(free, RID);
/* CUSTOM SHADE MODEL */
- FUNC2(custom_shade_model_set_shader,int , RID );
- FUNC1RC(RID,custom_shade_model_get_shader,int );
- FUNC2(custom_shade_model_set_name,int , const String& );
- FUNC1RC(String,custom_shade_model_get_name,int );
- FUNC2(custom_shade_model_set_param_info,int , const List<PropertyInfo>& );
- FUNC2SC(custom_shade_model_get_param_info,int , List<PropertyInfo>* );
+ FUNC2(custom_shade_model_set_shader, int, RID);
+ FUNC1RC(RID, custom_shade_model_get_shader, int);
+ FUNC2(custom_shade_model_set_name, int, const String &);
+ FUNC1RC(String, custom_shade_model_get_name, int);
+ FUNC2(custom_shade_model_set_param_info, int, const List<PropertyInfo> &);
+ FUNC2SC(custom_shade_model_get_param_info, int, List<PropertyInfo> *);
/* EVENT QUEUING */
-
virtual void init();
virtual void finish();
virtual void draw();
virtual void sync();
- FUNC0RC(bool,has_changed);
+ FUNC0RC(bool, has_changed);
/* RENDER INFO */
- FUNC1R(int,get_render_info,RenderInfo );
+ FUNC1R(int, get_render_info, RenderInfo);
virtual bool has_feature(Features p_feature) const { return visual_server->has_feature(p_feature); }
- FUNC3(set_boot_image,const Image& , const Color&,bool );
- FUNC1(set_default_clear_color,const Color& );
- FUNC0RC(Color,get_default_clear_color );
+ FUNC3(set_boot_image, const Image &, const Color &, bool);
+ FUNC1(set_default_clear_color, const Color &);
+ FUNC0RC(Color, get_default_clear_color);
- FUNC0R(RID,get_test_cube );
+ FUNC0R(RID, get_test_cube);
-
- VisualServerWrapMT(VisualServer* p_contained,bool p_create_thread);
+ VisualServerWrapMT(VisualServer *p_contained, bool p_create_thread);
~VisualServerWrapMT();
#undef ServerName
#undef ServerNameWrapMT
#undef server_name
-
};
#ifdef DEBUG_SYNC
diff --git a/servers/visual_server.cpp b/servers/visual_server.cpp
index 938c33026..b3dac724c 100644
--- a/servers/visual_server.cpp
+++ b/servers/visual_server.cpp
@@ -30,18 +30,17 @@
#include "globals.h"
#include "method_bind_ext.inc"
-VisualServer *VisualServer::singleton=NULL;
-VisualServer* (*VisualServer::create_func)()=NULL;
+VisualServer *VisualServer::singleton = NULL;
+VisualServer *(*VisualServer::create_func)() = NULL;
VisualServer *VisualServer::get_singleton() {
return singleton;
}
-
void VisualServer::set_mipmap_policy(MipMapPolicy p_policy) {
- mm_policy=p_policy;
+ mm_policy = p_policy;
}
VisualServer::MipMapPolicy VisualServer::get_mipmap_policy() const {
@@ -49,14 +48,12 @@ VisualServer::MipMapPolicy VisualServer::get_mipmap_policy() const {
return (VisualServer::MipMapPolicy)mm_policy;
}
-
DVector<String> VisualServer::_shader_get_param_list(RID p_shader) const {
-//remove at some point
+ //remove at some point
DVector<String> pl;
-
#if 0
List<StringName> params;
shader_get_param_list(p_shader,&params);
@@ -72,7 +69,7 @@ DVector<String> VisualServer::_shader_get_param_list(RID p_shader) const {
VisualServer *VisualServer::create() {
- ERR_FAIL_COND_V(singleton,NULL);
+ ERR_FAIL_COND_V(singleton, NULL);
if (create_func)
return create_func();
@@ -80,13 +77,13 @@ VisualServer *VisualServer::create() {
return NULL;
}
-RID VisualServer::texture_create_from_image(const Image& p_image,uint32_t p_flags) {
+RID VisualServer::texture_create_from_image(const Image &p_image, uint32_t p_flags) {
RID texture = texture_create();
- texture_allocate(texture,p_image.get_width(), p_image.get_height(), p_image.get_format(), p_flags); //if it has mipmaps, use, else generate
- ERR_FAIL_COND_V(!texture.is_valid(),texture);
+ texture_allocate(texture, p_image.get_width(), p_image.get_height(), p_image.get_format(), p_flags); //if it has mipmaps, use, else generate
+ ERR_FAIL_COND_V(!texture.is_valid(), texture);
- texture_set_data(texture, p_image );
+ texture_set_data(texture, p_image);
return texture;
}
@@ -99,26 +96,26 @@ RID VisualServer::get_test_texture() {
#define TEST_TEXTURE_SIZE 256
- Image data(TEST_TEXTURE_SIZE,TEST_TEXTURE_SIZE,0,Image::FORMAT_RGB);
+ Image data(TEST_TEXTURE_SIZE, TEST_TEXTURE_SIZE, 0, Image::FORMAT_RGB);
- for (int x=0;x<TEST_TEXTURE_SIZE;x++) {
+ for (int x = 0; x < TEST_TEXTURE_SIZE; x++) {
- for (int y=0;y<TEST_TEXTURE_SIZE;y++) {
+ for (int y = 0; y < TEST_TEXTURE_SIZE; y++) {
Color c;
- int r=255-(x+y)/2;
+ int r = 255 - (x + y) / 2;
- if ((x%(TEST_TEXTURE_SIZE/8))<2 ||(y%(TEST_TEXTURE_SIZE/8))<2) {
+ if ((x % (TEST_TEXTURE_SIZE / 8)) < 2 || (y % (TEST_TEXTURE_SIZE / 8)) < 2) {
- c.r=y;
- c.g=r;
- c.b=x;
+ c.r = y;
+ c.g = r;
+ c.b = x;
} else {
- c.r=r;
- c.g=x;
- c.b=y;
+ c.r = r;
+ c.g = x;
+ c.b = y;
}
data.put_pixel(x, y, c);
@@ -139,13 +136,10 @@ void VisualServer::_free_internal_rids() {
if (test_material.is_valid())
free(test_material);
- for(int i=0;i<16;i++) {
+ for (int i = 0; i < 16; i++) {
if (material_2d[i].is_valid())
free(material_2d[i]);
}
-
-
-
}
RID VisualServer::_make_test_cube() {
@@ -155,122 +149,116 @@ RID VisualServer::_make_test_cube() {
DVector<float> tangents;
DVector<Vector3> uvs;
- int vtx_idx=0;
-#define ADD_VTX(m_idx) \
- vertices.push_back( face_points[m_idx] );\
- normals.push_back( normal_points[m_idx] );\
- tangents.push_back( normal_points[m_idx][1] );\
- tangents.push_back( normal_points[m_idx][2] );\
- tangents.push_back( normal_points[m_idx][0] );\
- tangents.push_back( 1.0 );\
- uvs.push_back( Vector3(uv_points[m_idx*2+0],uv_points[m_idx*2+1],0) );\
- vtx_idx++;\
-
- for (int i=0;i<6;i++) {
+ int vtx_idx = 0;
+#define ADD_VTX(m_idx) \
+ vertices.push_back(face_points[m_idx]); \
+ normals.push_back(normal_points[m_idx]); \
+ tangents.push_back(normal_points[m_idx][1]); \
+ tangents.push_back(normal_points[m_idx][2]); \
+ tangents.push_back(normal_points[m_idx][0]); \
+ tangents.push_back(1.0); \
+ uvs.push_back(Vector3(uv_points[m_idx * 2 + 0], uv_points[m_idx * 2 + 1], 0)); \
+ vtx_idx++;
+ for (int i = 0; i < 6; i++) {
Vector3 face_points[4];
Vector3 normal_points[4];
- float uv_points[8]={0,0,0,1,1,1,1,0};
+ float uv_points[8] = { 0, 0, 0, 1, 1, 1, 1, 0 };
- for (int j=0;j<4;j++) {
+ for (int j = 0; j < 4; j++) {
float v[3];
- v[0]=1.0;
- v[1]=1-2*((j>>1)&1);
- v[2]=v[1]*(1-2*(j&1));
+ v[0] = 1.0;
+ v[1] = 1 - 2 * ((j >> 1) & 1);
+ v[2] = v[1] * (1 - 2 * (j & 1));
- for (int k=0;k<3;k++) {
+ for (int k = 0; k < 3; k++) {
- if (i<3)
- face_points[j][(i+k)%3]=v[k]*(i>=3?-1:1);
+ if (i < 3)
+ face_points[j][(i + k) % 3] = v[k] * (i >= 3 ? -1 : 1);
else
- face_points[3-j][(i+k)%3]=v[k]*(i>=3?-1:1);
+ face_points[3 - j][(i + k) % 3] = v[k] * (i >= 3 ? -1 : 1);
}
- normal_points[j]=Vector3();
- normal_points[j][i%3]=(i>=3?-1:1);
+ normal_points[j] = Vector3();
+ normal_points[j][i % 3] = (i >= 3 ? -1 : 1);
}
- //tri 1
+ //tri 1
ADD_VTX(0);
ADD_VTX(1);
ADD_VTX(2);
- //tri 2
+ //tri 2
ADD_VTX(2);
ADD_VTX(3);
ADD_VTX(0);
-
}
RID test_cube = mesh_create();
Array d;
d.resize(VS::ARRAY_MAX);
- d[VisualServer::ARRAY_NORMAL]= normals ;
- d[VisualServer::ARRAY_TANGENT]= tangents ;
- d[VisualServer::ARRAY_TEX_UV]= uvs ;
- d[VisualServer::ARRAY_VERTEX]= vertices ;
+ d[VisualServer::ARRAY_NORMAL] = normals;
+ d[VisualServer::ARRAY_TANGENT] = tangents;
+ d[VisualServer::ARRAY_TEX_UV] = uvs;
+ d[VisualServer::ARRAY_VERTEX] = vertices;
DVector<int> indices;
indices.resize(vertices.size());
- for(int i=0;i<vertices.size();i++)
- indices.set(i,i);
- d[VisualServer::ARRAY_INDEX]=indices;
-
- mesh_add_surface( test_cube, PRIMITIVE_TRIANGLES,d );
-
+ for (int i = 0; i < vertices.size(); i++)
+ indices.set(i, i);
+ d[VisualServer::ARRAY_INDEX] = indices;
+ mesh_add_surface(test_cube, PRIMITIVE_TRIANGLES, d);
test_material = fixed_material_create();
//material_set_flag(material, MATERIAL_FLAG_BILLBOARD_TOGGLE,true);
- fixed_material_set_texture( test_material, FIXED_MATERIAL_PARAM_DIFFUSE, get_test_texture() );
- fixed_material_set_param( test_material, FIXED_MATERIAL_PARAM_SPECULAR_EXP, 70 );
- fixed_material_set_param( test_material, FIXED_MATERIAL_PARAM_EMISSION, Color(0.2,0.2,0.2) );
+ fixed_material_set_texture(test_material, FIXED_MATERIAL_PARAM_DIFFUSE, get_test_texture());
+ fixed_material_set_param(test_material, FIXED_MATERIAL_PARAM_SPECULAR_EXP, 70);
+ fixed_material_set_param(test_material, FIXED_MATERIAL_PARAM_EMISSION, Color(0.2, 0.2, 0.2));
- fixed_material_set_param( test_material, FIXED_MATERIAL_PARAM_DIFFUSE, Color(1, 1, 1) );
- fixed_material_set_param( test_material, FIXED_MATERIAL_PARAM_SPECULAR, Color(1,1,1) );
+ fixed_material_set_param(test_material, FIXED_MATERIAL_PARAM_DIFFUSE, Color(1, 1, 1));
+ fixed_material_set_param(test_material, FIXED_MATERIAL_PARAM_SPECULAR, Color(1, 1, 1));
- mesh_surface_set_material(test_cube, 0, test_material );
+ mesh_surface_set_material(test_cube, 0, test_material);
return test_cube;
}
-
-RID VisualServer::make_sphere_mesh(int p_lats,int p_lons,float p_radius) {
+RID VisualServer::make_sphere_mesh(int p_lats, int p_lons, float p_radius) {
DVector<Vector3> vertices;
DVector<Vector3> normals;
- for(int i = 1; i <= p_lats; i++) {
- double lat0 = Math_PI * (-0.5 + (double) (i - 1) / p_lats);
- double z0 = Math::sin(lat0);
- double zr0 = Math::cos(lat0);
+ for (int i = 1; i <= p_lats; i++) {
+ double lat0 = Math_PI * (-0.5 + (double)(i - 1) / p_lats);
+ double z0 = Math::sin(lat0);
+ double zr0 = Math::cos(lat0);
- double lat1 = Math_PI * (-0.5 + (double) i / p_lats);
+ double lat1 = Math_PI * (-0.5 + (double)i / p_lats);
double z1 = Math::sin(lat1);
double zr1 = Math::cos(lat1);
- for(int j = p_lons; j >= 1; j--) {
+ for (int j = p_lons; j >= 1; j--) {
- double lng0 = 2 * Math_PI * (double) (j - 1) / p_lons;
+ double lng0 = 2 * Math_PI * (double)(j - 1) / p_lons;
double x0 = Math::cos(lng0);
double y0 = Math::sin(lng0);
- double lng1 = 2 * Math_PI * (double) (j) / p_lons;
+ double lng1 = 2 * Math_PI * (double)(j) / p_lons;
double x1 = Math::cos(lng1);
double y1 = Math::sin(lng1);
-
- Vector3 v[4]={
- Vector3(x1 * zr0, z0, y1 *zr0),
- Vector3(x1 * zr1, z1, y1 *zr1),
- Vector3(x0 * zr1, z1, y0 *zr1),
- Vector3(x0 * zr0, z0, y0 *zr0)
+ Vector3 v[4] = {
+ Vector3(x1 * zr0, z0, y1 * zr0),
+ Vector3(x1 * zr1, z1, y1 * zr1),
+ Vector3(x0 * zr1, z1, y0 * zr1),
+ Vector3(x0 * zr0, z0, y0 * zr0)
};
-#define ADD_POINT(m_idx)\
- normals.push_back(v[m_idx]); \
- vertices.push_back(v[m_idx]*p_radius);\
+#define ADD_POINT(m_idx) \
+ normals.push_back(v[m_idx]); \
+ vertices.push_back(v[m_idx] * p_radius);
ADD_POINT(0);
ADD_POINT(1);
@@ -286,39 +274,38 @@ RID VisualServer::make_sphere_mesh(int p_lats,int p_lons,float p_radius) {
Array d;
d.resize(VS::ARRAY_MAX);
- d[ARRAY_VERTEX]=vertices;
- d[ARRAY_NORMAL]=normals;
+ d[ARRAY_VERTEX] = vertices;
+ d[ARRAY_NORMAL] = normals;
- mesh_add_surface(mesh,PRIMITIVE_TRIANGLES,d);
+ mesh_add_surface(mesh, PRIMITIVE_TRIANGLES, d);
return mesh;
}
-
RID VisualServer::material_2d_get(bool p_shaded, bool p_transparent, bool p_cut_alpha, bool p_opaque_prepass) {
- int version=0;
+ int version = 0;
if (p_shaded)
- version=1;
+ version = 1;
if (p_transparent)
- version|=2;
+ version |= 2;
if (p_cut_alpha)
- version|=4;
+ version |= 4;
if (p_opaque_prepass)
- version|=8;
+ version |= 8;
if (material_2d[version].is_valid())
return material_2d[version];
//not valid, make
- material_2d[version]=fixed_material_create();
- fixed_material_set_flag(material_2d[version],FIXED_MATERIAL_FLAG_USE_ALPHA,p_transparent);
- fixed_material_set_flag(material_2d[version],FIXED_MATERIAL_FLAG_USE_COLOR_ARRAY,true);
- 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_DOUBLE_SIDED,true);
- 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());
+ material_2d[version] = fixed_material_create();
+ fixed_material_set_flag(material_2d[version], FIXED_MATERIAL_FLAG_USE_ALPHA, p_transparent);
+ fixed_material_set_flag(material_2d[version], FIXED_MATERIAL_FLAG_USE_COLOR_ARRAY, true);
+ 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_DOUBLE_SIDED, true);
+ 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());
//material cut alpha?
return material_2d[version];
}
@@ -329,497 +316,455 @@ RID VisualServer::get_white_texture() {
return white_texture;
DVector<uint8_t> wt;
- wt.resize(16*3);
+ wt.resize(16 * 3);
{
- DVector<uint8_t>::Write w =wt.write();
- for(int i=0;i<16*3;i++)
- w[i]=255;
+ DVector<uint8_t>::Write w = wt.write();
+ for (int i = 0; i < 16 * 3; i++)
+ w[i] = 255;
}
- Image white(4,4,0,Image::FORMAT_RGB,wt);
- white_texture=texture_create();
- texture_allocate(white_texture,4,4,Image::FORMAT_RGB);
- texture_set_data(white_texture,white);
+ Image white(4, 4, 0, Image::FORMAT_RGB, wt);
+ white_texture = texture_create();
+ texture_allocate(white_texture, 4, 4, Image::FORMAT_RGB);
+ texture_set_data(white_texture, white);
return white_texture;
-
}
void VisualServer::_bind_methods() {
-
- ObjectTypeDB::bind_method(_MD("texture_create"),&VisualServer::texture_create);
- ObjectTypeDB::bind_method(_MD("texture_create_from_image"),&VisualServer::texture_create_from_image,DEFVAL( TEXTURE_FLAGS_DEFAULT ) );
+ ObjectTypeDB::bind_method(_MD("texture_create"), &VisualServer::texture_create);
+ ObjectTypeDB::bind_method(_MD("texture_create_from_image"), &VisualServer::texture_create_from_image, DEFVAL(TEXTURE_FLAGS_DEFAULT));
//ObjectTypeDB::bind_method(_MD("texture_allocate"),&VisualServer::texture_allocate,DEFVAL( TEXTURE_FLAGS_DEFAULT ) );
//ObjectTypeDB::bind_method(_MD("texture_set_data"),&VisualServer::texture_blit_rect,DEFVAL( CUBEMAP_LEFT ) );
//ObjectTypeDB::bind_method(_MD("texture_get_rect"),&VisualServer::texture_get_rect );
- ObjectTypeDB::bind_method(_MD("texture_set_flags"),&VisualServer::texture_set_flags );
- ObjectTypeDB::bind_method(_MD("texture_get_flags"),&VisualServer::texture_get_flags );
- ObjectTypeDB::bind_method(_MD("texture_get_width"),&VisualServer::texture_get_width );
- ObjectTypeDB::bind_method(_MD("texture_get_height"),&VisualServer::texture_get_height );
+ ObjectTypeDB::bind_method(_MD("texture_set_flags"), &VisualServer::texture_set_flags);
+ ObjectTypeDB::bind_method(_MD("texture_get_flags"), &VisualServer::texture_get_flags);
+ ObjectTypeDB::bind_method(_MD("texture_get_width"), &VisualServer::texture_get_width);
+ ObjectTypeDB::bind_method(_MD("texture_get_height"), &VisualServer::texture_get_height);
- ObjectTypeDB::bind_method(_MD("texture_set_shrink_all_x2_on_set_data","shrink"),&VisualServer::texture_set_shrink_all_x2_on_set_data );
+ ObjectTypeDB::bind_method(_MD("texture_set_shrink_all_x2_on_set_data", "shrink"), &VisualServer::texture_set_shrink_all_x2_on_set_data);
#ifndef _3D_DISABLED
+ ObjectTypeDB::bind_method(_MD("shader_create", "mode"), &VisualServer::shader_create, DEFVAL(SHADER_MATERIAL));
+ ObjectTypeDB::bind_method(_MD("shader_set_mode", "shader", "mode"), &VisualServer::shader_set_mode);
- ObjectTypeDB::bind_method(_MD("shader_create","mode"),&VisualServer::shader_create,DEFVAL(SHADER_MATERIAL));
- ObjectTypeDB::bind_method(_MD("shader_set_mode","shader","mode"),&VisualServer::shader_set_mode);
-
-
-
- ObjectTypeDB::bind_method(_MD("material_create"),&VisualServer::material_create);
-
- ObjectTypeDB::bind_method(_MD("material_set_shader","shader"),&VisualServer::material_set_shader);
- ObjectTypeDB::bind_method(_MD("material_get_shader"),&VisualServer::material_get_shader);
-
- ObjectTypeDB::bind_method(_MD("material_set_param"),&VisualServer::material_set_param);
- ObjectTypeDB::bind_method(_MD("material_get_param"),&VisualServer::material_get_param);
- ObjectTypeDB::bind_method(_MD("material_set_flag"),&VisualServer::material_set_flag);
- ObjectTypeDB::bind_method(_MD("material_get_flag"),&VisualServer::material_get_flag);
- ObjectTypeDB::bind_method(_MD("material_set_blend_mode"),&VisualServer::material_set_blend_mode);
- ObjectTypeDB::bind_method(_MD("material_get_blend_mode"),&VisualServer::material_get_blend_mode);
- ObjectTypeDB::bind_method(_MD("material_set_line_width"),&VisualServer::material_set_line_width);
- ObjectTypeDB::bind_method(_MD("material_get_line_width"),&VisualServer::material_get_line_width);
-
-
- ObjectTypeDB::bind_method(_MD("mesh_create"),&VisualServer::mesh_create);
- ObjectTypeDB::bind_method(_MD("mesh_add_surface"),&VisualServer::mesh_add_surface, DEFVAL(Array()), DEFVAL(false));
- ObjectTypeDB::bind_method(_MD("mesh_surface_set_material"),&VisualServer::mesh_surface_set_material,DEFVAL(false));
- ObjectTypeDB::bind_method(_MD("mesh_surface_get_material"),&VisualServer::mesh_surface_get_material);
-
- ObjectTypeDB::bind_method(_MD("mesh_surface_get_array_len"),&VisualServer::mesh_surface_get_array_len);
- ObjectTypeDB::bind_method(_MD("mesh_surface_get_array_index_len"),&VisualServer::mesh_surface_get_array_index_len);
- ObjectTypeDB::bind_method(_MD("mesh_surface_get_format"),&VisualServer::mesh_surface_get_format);
- ObjectTypeDB::bind_method(_MD("mesh_surface_get_primitive_type"),&VisualServer::mesh_surface_get_primitive_type);
-
- ObjectTypeDB::bind_method(_MD("mesh_remove_surface"),&VisualServer::mesh_remove_surface);
- ObjectTypeDB::bind_method(_MD("mesh_get_surface_count"),&VisualServer::mesh_get_surface_count);
-
-
- ObjectTypeDB::bind_method(_MD("multimesh_create"),&VisualServer::multimesh_create);
- ObjectTypeDB::bind_method(_MD("multimesh_set_mesh"),&VisualServer::multimesh_set_mesh);
- ObjectTypeDB::bind_method(_MD("multimesh_set_aabb"),&VisualServer::multimesh_set_aabb);
- ObjectTypeDB::bind_method(_MD("multimesh_instance_set_transform"),&VisualServer::multimesh_instance_set_transform);
- ObjectTypeDB::bind_method(_MD("multimesh_instance_set_color"),&VisualServer::multimesh_instance_set_color);
- ObjectTypeDB::bind_method(_MD("multimesh_get_mesh"),&VisualServer::multimesh_get_mesh);
- ObjectTypeDB::bind_method(_MD("multimesh_get_aabb"),&VisualServer::multimesh_get_aabb);
- ObjectTypeDB::bind_method(_MD("multimesh_instance_get_transform"),&VisualServer::multimesh_instance_get_transform);
- ObjectTypeDB::bind_method(_MD("multimesh_instance_get_color"),&VisualServer::multimesh_instance_get_color);
-
-
+ ObjectTypeDB::bind_method(_MD("material_create"), &VisualServer::material_create);
- ObjectTypeDB::bind_method(_MD("particles_create"),&VisualServer::particles_create);
- ObjectTypeDB::bind_method(_MD("particles_set_amount"),&VisualServer::particles_set_amount);
- ObjectTypeDB::bind_method(_MD("particles_get_amount"),&VisualServer::particles_get_amount);
- ObjectTypeDB::bind_method(_MD("particles_set_emitting"),&VisualServer::particles_set_emitting);
- ObjectTypeDB::bind_method(_MD("particles_is_emitting"),&VisualServer::particles_is_emitting);
- ObjectTypeDB::bind_method(_MD("particles_set_visibility_aabb"),&VisualServer::particles_set_visibility_aabb);
- ObjectTypeDB::bind_method(_MD("particles_get_visibility_aabb"),&VisualServer::particles_get_visibility_aabb);
- ObjectTypeDB::bind_method(_MD("particles_set_variable"),&VisualServer::particles_set_variable);
- ObjectTypeDB::bind_method(_MD("particles_get_variable"),&VisualServer::particles_get_variable);
- ObjectTypeDB::bind_method(_MD("particles_set_randomness"),&VisualServer::particles_set_randomness);
- ObjectTypeDB::bind_method(_MD("particles_get_randomness"),&VisualServer::particles_get_randomness);
- ObjectTypeDB::bind_method(_MD("particles_set_color_phases"),&VisualServer::particles_set_color_phases);
- ObjectTypeDB::bind_method(_MD("particles_get_color_phases"),&VisualServer::particles_get_color_phases);
- ObjectTypeDB::bind_method(_MD("particles_set_color_phase_pos"),&VisualServer::particles_set_color_phase_pos);
- ObjectTypeDB::bind_method(_MD("particles_get_color_phase_pos"),&VisualServer::particles_get_color_phase_pos);
- ObjectTypeDB::bind_method(_MD("particles_set_color_phase_color"),&VisualServer::particles_set_color_phase_color);
- ObjectTypeDB::bind_method(_MD("particles_get_color_phase_color"),&VisualServer::particles_get_color_phase_color);
- ObjectTypeDB::bind_method(_MD("particles_set_attractors"),&VisualServer::particles_set_attractors);
- ObjectTypeDB::bind_method(_MD("particles_get_attractors"),&VisualServer::particles_get_attractors);
- ObjectTypeDB::bind_method(_MD("particles_set_attractor_pos"),&VisualServer::particles_set_attractor_pos);
- ObjectTypeDB::bind_method(_MD("particles_get_attractor_pos"),&VisualServer::particles_get_attractor_pos);
- ObjectTypeDB::bind_method(_MD("particles_set_attractor_strength"),&VisualServer::particles_set_attractor_strength);
- ObjectTypeDB::bind_method(_MD("particles_get_attractor_strength"),&VisualServer::particles_get_attractor_strength);
- ObjectTypeDB::bind_method(_MD("particles_set_material"),&VisualServer::particles_set_material,DEFVAL(false));
- ObjectTypeDB::bind_method(_MD("particles_set_height_from_velocity"),&VisualServer::particles_set_height_from_velocity);
- ObjectTypeDB::bind_method(_MD("particles_has_height_from_velocity"),&VisualServer::particles_has_height_from_velocity);
+ ObjectTypeDB::bind_method(_MD("material_set_shader", "shader"), &VisualServer::material_set_shader);
+ ObjectTypeDB::bind_method(_MD("material_get_shader"), &VisualServer::material_get_shader);
+ ObjectTypeDB::bind_method(_MD("material_set_param"), &VisualServer::material_set_param);
+ ObjectTypeDB::bind_method(_MD("material_get_param"), &VisualServer::material_get_param);
+ ObjectTypeDB::bind_method(_MD("material_set_flag"), &VisualServer::material_set_flag);
+ ObjectTypeDB::bind_method(_MD("material_get_flag"), &VisualServer::material_get_flag);
+ ObjectTypeDB::bind_method(_MD("material_set_blend_mode"), &VisualServer::material_set_blend_mode);
+ ObjectTypeDB::bind_method(_MD("material_get_blend_mode"), &VisualServer::material_get_blend_mode);
+ ObjectTypeDB::bind_method(_MD("material_set_line_width"), &VisualServer::material_set_line_width);
+ ObjectTypeDB::bind_method(_MD("material_get_line_width"), &VisualServer::material_get_line_width);
+ ObjectTypeDB::bind_method(_MD("mesh_create"), &VisualServer::mesh_create);
+ ObjectTypeDB::bind_method(_MD("mesh_add_surface"), &VisualServer::mesh_add_surface, DEFVAL(Array()), DEFVAL(false));
+ ObjectTypeDB::bind_method(_MD("mesh_surface_set_material"), &VisualServer::mesh_surface_set_material, DEFVAL(false));
+ ObjectTypeDB::bind_method(_MD("mesh_surface_get_material"), &VisualServer::mesh_surface_get_material);
- ObjectTypeDB::bind_method(_MD("light_create"),&VisualServer::light_create);
- ObjectTypeDB::bind_method(_MD("light_get_type"),&VisualServer::light_get_type);
- ObjectTypeDB::bind_method(_MD("light_set_color"),&VisualServer::light_set_color);
- ObjectTypeDB::bind_method(_MD("light_get_color"),&VisualServer::light_get_color);
- ObjectTypeDB::bind_method(_MD("light_set_shadow"),&VisualServer::light_set_shadow);
- ObjectTypeDB::bind_method(_MD("light_has_shadow"),&VisualServer::light_has_shadow);
- ObjectTypeDB::bind_method(_MD("light_set_volumetric"),&VisualServer::light_set_volumetric);
- ObjectTypeDB::bind_method(_MD("light_is_volumetric"),&VisualServer::light_is_volumetric);
- ObjectTypeDB::bind_method(_MD("light_set_projector"),&VisualServer::light_set_projector);
- ObjectTypeDB::bind_method(_MD("light_get_projector"),&VisualServer::light_get_projector);
- ObjectTypeDB::bind_method(_MD("light_set_var"),&VisualServer::light_set_param);
- ObjectTypeDB::bind_method(_MD("light_get_var"),&VisualServer::light_get_param);
+ ObjectTypeDB::bind_method(_MD("mesh_surface_get_array_len"), &VisualServer::mesh_surface_get_array_len);
+ ObjectTypeDB::bind_method(_MD("mesh_surface_get_array_index_len"), &VisualServer::mesh_surface_get_array_index_len);
+ ObjectTypeDB::bind_method(_MD("mesh_surface_get_format"), &VisualServer::mesh_surface_get_format);
+ ObjectTypeDB::bind_method(_MD("mesh_surface_get_primitive_type"), &VisualServer::mesh_surface_get_primitive_type);
- ObjectTypeDB::bind_method(_MD("skeleton_create"),&VisualServer::skeleton_create);
- ObjectTypeDB::bind_method(_MD("skeleton_resize"),&VisualServer::skeleton_resize);
- ObjectTypeDB::bind_method(_MD("skeleton_get_bone_count"),&VisualServer::skeleton_get_bone_count);
- ObjectTypeDB::bind_method(_MD("skeleton_bone_set_transform"),&VisualServer::skeleton_bone_set_transform);
- ObjectTypeDB::bind_method(_MD("skeleton_bone_get_transform"),&VisualServer::skeleton_bone_get_transform);
+ ObjectTypeDB::bind_method(_MD("mesh_remove_surface"), &VisualServer::mesh_remove_surface);
+ ObjectTypeDB::bind_method(_MD("mesh_get_surface_count"), &VisualServer::mesh_get_surface_count);
+ ObjectTypeDB::bind_method(_MD("multimesh_create"), &VisualServer::multimesh_create);
+ ObjectTypeDB::bind_method(_MD("multimesh_set_mesh"), &VisualServer::multimesh_set_mesh);
+ ObjectTypeDB::bind_method(_MD("multimesh_set_aabb"), &VisualServer::multimesh_set_aabb);
+ ObjectTypeDB::bind_method(_MD("multimesh_instance_set_transform"), &VisualServer::multimesh_instance_set_transform);
+ ObjectTypeDB::bind_method(_MD("multimesh_instance_set_color"), &VisualServer::multimesh_instance_set_color);
+ ObjectTypeDB::bind_method(_MD("multimesh_get_mesh"), &VisualServer::multimesh_get_mesh);
+ ObjectTypeDB::bind_method(_MD("multimesh_get_aabb"), &VisualServer::multimesh_get_aabb);
+ ObjectTypeDB::bind_method(_MD("multimesh_instance_get_transform"), &VisualServer::multimesh_instance_get_transform);
+ ObjectTypeDB::bind_method(_MD("multimesh_instance_get_color"), &VisualServer::multimesh_instance_get_color);
+ ObjectTypeDB::bind_method(_MD("particles_create"), &VisualServer::particles_create);
+ ObjectTypeDB::bind_method(_MD("particles_set_amount"), &VisualServer::particles_set_amount);
+ ObjectTypeDB::bind_method(_MD("particles_get_amount"), &VisualServer::particles_get_amount);
+ ObjectTypeDB::bind_method(_MD("particles_set_emitting"), &VisualServer::particles_set_emitting);
+ ObjectTypeDB::bind_method(_MD("particles_is_emitting"), &VisualServer::particles_is_emitting);
+ ObjectTypeDB::bind_method(_MD("particles_set_visibility_aabb"), &VisualServer::particles_set_visibility_aabb);
+ ObjectTypeDB::bind_method(_MD("particles_get_visibility_aabb"), &VisualServer::particles_get_visibility_aabb);
+ ObjectTypeDB::bind_method(_MD("particles_set_variable"), &VisualServer::particles_set_variable);
+ ObjectTypeDB::bind_method(_MD("particles_get_variable"), &VisualServer::particles_get_variable);
+ ObjectTypeDB::bind_method(_MD("particles_set_randomness"), &VisualServer::particles_set_randomness);
+ ObjectTypeDB::bind_method(_MD("particles_get_randomness"), &VisualServer::particles_get_randomness);
+ ObjectTypeDB::bind_method(_MD("particles_set_color_phases"), &VisualServer::particles_set_color_phases);
+ ObjectTypeDB::bind_method(_MD("particles_get_color_phases"), &VisualServer::particles_get_color_phases);
+ ObjectTypeDB::bind_method(_MD("particles_set_color_phase_pos"), &VisualServer::particles_set_color_phase_pos);
+ ObjectTypeDB::bind_method(_MD("particles_get_color_phase_pos"), &VisualServer::particles_get_color_phase_pos);
+ ObjectTypeDB::bind_method(_MD("particles_set_color_phase_color"), &VisualServer::particles_set_color_phase_color);
+ ObjectTypeDB::bind_method(_MD("particles_get_color_phase_color"), &VisualServer::particles_get_color_phase_color);
+ ObjectTypeDB::bind_method(_MD("particles_set_attractors"), &VisualServer::particles_set_attractors);
+ ObjectTypeDB::bind_method(_MD("particles_get_attractors"), &VisualServer::particles_get_attractors);
+ ObjectTypeDB::bind_method(_MD("particles_set_attractor_pos"), &VisualServer::particles_set_attractor_pos);
+ ObjectTypeDB::bind_method(_MD("particles_get_attractor_pos"), &VisualServer::particles_get_attractor_pos);
+ ObjectTypeDB::bind_method(_MD("particles_set_attractor_strength"), &VisualServer::particles_set_attractor_strength);
+ ObjectTypeDB::bind_method(_MD("particles_get_attractor_strength"), &VisualServer::particles_get_attractor_strength);
+ ObjectTypeDB::bind_method(_MD("particles_set_material"), &VisualServer::particles_set_material, DEFVAL(false));
+ ObjectTypeDB::bind_method(_MD("particles_set_height_from_velocity"), &VisualServer::particles_set_height_from_velocity);
+ ObjectTypeDB::bind_method(_MD("particles_has_height_from_velocity"), &VisualServer::particles_has_height_from_velocity);
- ObjectTypeDB::bind_method(_MD("room_create"),&VisualServer::room_create);
- ObjectTypeDB::bind_method(_MD("room_set_bounds"),&VisualServer::room_set_bounds);
- ObjectTypeDB::bind_method(_MD("room_get_bounds"),&VisualServer::room_get_bounds);
+ ObjectTypeDB::bind_method(_MD("light_create"), &VisualServer::light_create);
+ ObjectTypeDB::bind_method(_MD("light_get_type"), &VisualServer::light_get_type);
+ ObjectTypeDB::bind_method(_MD("light_set_color"), &VisualServer::light_set_color);
+ ObjectTypeDB::bind_method(_MD("light_get_color"), &VisualServer::light_get_color);
+ ObjectTypeDB::bind_method(_MD("light_set_shadow"), &VisualServer::light_set_shadow);
+ ObjectTypeDB::bind_method(_MD("light_has_shadow"), &VisualServer::light_has_shadow);
+ ObjectTypeDB::bind_method(_MD("light_set_volumetric"), &VisualServer::light_set_volumetric);
+ ObjectTypeDB::bind_method(_MD("light_is_volumetric"), &VisualServer::light_is_volumetric);
+ ObjectTypeDB::bind_method(_MD("light_set_projector"), &VisualServer::light_set_projector);
+ ObjectTypeDB::bind_method(_MD("light_get_projector"), &VisualServer::light_get_projector);
+ ObjectTypeDB::bind_method(_MD("light_set_var"), &VisualServer::light_set_param);
+ ObjectTypeDB::bind_method(_MD("light_get_var"), &VisualServer::light_get_param);
- ObjectTypeDB::bind_method(_MD("portal_create"),&VisualServer::portal_create);
- ObjectTypeDB::bind_method(_MD("portal_set_shape"),&VisualServer::portal_set_shape);
- ObjectTypeDB::bind_method(_MD("portal_get_shape"),&VisualServer::portal_get_shape);
- ObjectTypeDB::bind_method(_MD("portal_set_enabled"),&VisualServer::portal_set_enabled);
- ObjectTypeDB::bind_method(_MD("portal_is_enabled"),&VisualServer::portal_is_enabled);
- ObjectTypeDB::bind_method(_MD("portal_set_disable_distance"),&VisualServer::portal_set_disable_distance);
- ObjectTypeDB::bind_method(_MD("portal_get_disable_distance"),&VisualServer::portal_get_disable_distance);
- ObjectTypeDB::bind_method(_MD("portal_set_disabled_color"),&VisualServer::portal_set_disabled_color);
- ObjectTypeDB::bind_method(_MD("portal_get_disabled_color"),&VisualServer::portal_get_disabled_color);
+ ObjectTypeDB::bind_method(_MD("skeleton_create"), &VisualServer::skeleton_create);
+ ObjectTypeDB::bind_method(_MD("skeleton_resize"), &VisualServer::skeleton_resize);
+ ObjectTypeDB::bind_method(_MD("skeleton_get_bone_count"), &VisualServer::skeleton_get_bone_count);
+ ObjectTypeDB::bind_method(_MD("skeleton_bone_set_transform"), &VisualServer::skeleton_bone_set_transform);
+ ObjectTypeDB::bind_method(_MD("skeleton_bone_get_transform"), &VisualServer::skeleton_bone_get_transform);
+ ObjectTypeDB::bind_method(_MD("room_create"), &VisualServer::room_create);
+ ObjectTypeDB::bind_method(_MD("room_set_bounds"), &VisualServer::room_set_bounds);
+ ObjectTypeDB::bind_method(_MD("room_get_bounds"), &VisualServer::room_get_bounds);
- ObjectTypeDB::bind_method(_MD("camera_create"),&VisualServer::camera_create);
- ObjectTypeDB::bind_method(_MD("camera_set_perspective"),&VisualServer::camera_set_perspective);
- ObjectTypeDB::bind_method(_MD("camera_set_orthogonal"),&VisualServer::_camera_set_orthogonal);
- ObjectTypeDB::bind_method(_MD("camera_set_transform"),&VisualServer::camera_set_transform);
+ ObjectTypeDB::bind_method(_MD("portal_create"), &VisualServer::portal_create);
+ ObjectTypeDB::bind_method(_MD("portal_set_shape"), &VisualServer::portal_set_shape);
+ ObjectTypeDB::bind_method(_MD("portal_get_shape"), &VisualServer::portal_get_shape);
+ ObjectTypeDB::bind_method(_MD("portal_set_enabled"), &VisualServer::portal_set_enabled);
+ ObjectTypeDB::bind_method(_MD("portal_is_enabled"), &VisualServer::portal_is_enabled);
+ ObjectTypeDB::bind_method(_MD("portal_set_disable_distance"), &VisualServer::portal_set_disable_distance);
+ ObjectTypeDB::bind_method(_MD("portal_get_disable_distance"), &VisualServer::portal_get_disable_distance);
+ ObjectTypeDB::bind_method(_MD("portal_set_disabled_color"), &VisualServer::portal_set_disabled_color);
+ ObjectTypeDB::bind_method(_MD("portal_get_disabled_color"), &VisualServer::portal_get_disabled_color);
+ ObjectTypeDB::bind_method(_MD("camera_create"), &VisualServer::camera_create);
+ ObjectTypeDB::bind_method(_MD("camera_set_perspective"), &VisualServer::camera_set_perspective);
+ ObjectTypeDB::bind_method(_MD("camera_set_orthogonal"), &VisualServer::_camera_set_orthogonal);
+ ObjectTypeDB::bind_method(_MD("camera_set_transform"), &VisualServer::camera_set_transform);
- ObjectTypeDB::bind_method(_MD("viewport_create"),&VisualServer::viewport_create);
- ObjectTypeDB::bind_method(_MD("viewport_set_rect"),&VisualServer::_viewport_set_rect);
- ObjectTypeDB::bind_method(_MD("viewport_get_rect"),&VisualServer::_viewport_get_rect);
- ObjectTypeDB::bind_method(_MD("viewport_attach_camera"),&VisualServer::viewport_attach_camera,DEFVAL(RID()));
- ObjectTypeDB::bind_method(_MD("viewport_get_attached_camera"),&VisualServer::viewport_get_attached_camera);
- ObjectTypeDB::bind_method(_MD("viewport_get_scenario"),&VisualServer::viewport_get_scenario);
- ObjectTypeDB::bind_method(_MD("viewport_attach_canvas"),&VisualServer::viewport_attach_canvas);
- ObjectTypeDB::bind_method(_MD("viewport_remove_canvas"),&VisualServer::viewport_remove_canvas);
- ObjectTypeDB::bind_method(_MD("viewport_set_global_canvas_transform"),&VisualServer::viewport_set_global_canvas_transform);
+ ObjectTypeDB::bind_method(_MD("viewport_create"), &VisualServer::viewport_create);
+ ObjectTypeDB::bind_method(_MD("viewport_set_rect"), &VisualServer::_viewport_set_rect);
+ ObjectTypeDB::bind_method(_MD("viewport_get_rect"), &VisualServer::_viewport_get_rect);
+ ObjectTypeDB::bind_method(_MD("viewport_attach_camera"), &VisualServer::viewport_attach_camera, DEFVAL(RID()));
+ ObjectTypeDB::bind_method(_MD("viewport_get_attached_camera"), &VisualServer::viewport_get_attached_camera);
+ ObjectTypeDB::bind_method(_MD("viewport_get_scenario"), &VisualServer::viewport_get_scenario);
+ ObjectTypeDB::bind_method(_MD("viewport_attach_canvas"), &VisualServer::viewport_attach_canvas);
+ ObjectTypeDB::bind_method(_MD("viewport_remove_canvas"), &VisualServer::viewport_remove_canvas);
+ ObjectTypeDB::bind_method(_MD("viewport_set_global_canvas_transform"), &VisualServer::viewport_set_global_canvas_transform);
- ObjectTypeDB::bind_method(_MD("scenario_create"),&VisualServer::scenario_create);
- ObjectTypeDB::bind_method(_MD("scenario_set_debug"),&VisualServer::scenario_set_debug);
+ ObjectTypeDB::bind_method(_MD("scenario_create"), &VisualServer::scenario_create);
+ ObjectTypeDB::bind_method(_MD("scenario_set_debug"), &VisualServer::scenario_set_debug);
+ ObjectTypeDB::bind_method(_MD("instance_create"), &VisualServer::instance_create, DEFVAL(RID()));
+ ObjectTypeDB::bind_method(_MD("instance_get_base"), &VisualServer::instance_get_base);
+ ObjectTypeDB::bind_method(_MD("instance_get_base_aabb"), &VisualServer::instance_get_base);
+ ObjectTypeDB::bind_method(_MD("instance_set_transform"), &VisualServer::instance_set_transform);
+ ObjectTypeDB::bind_method(_MD("instance_get_transform"), &VisualServer::instance_get_transform);
+ ObjectTypeDB::bind_method(_MD("instance_attach_object_instance_ID"), &VisualServer::instance_attach_object_instance_ID);
+ ObjectTypeDB::bind_method(_MD("instance_get_object_instance_ID"), &VisualServer::instance_get_object_instance_ID);
+ ObjectTypeDB::bind_method(_MD("instance_attach_skeleton"), &VisualServer::instance_attach_skeleton);
+ ObjectTypeDB::bind_method(_MD("instance_get_skeleton"), &VisualServer::instance_get_skeleton);
+ ObjectTypeDB::bind_method(_MD("instance_set_room"), &VisualServer::instance_set_room);
+ ObjectTypeDB::bind_method(_MD("instance_get_room"), &VisualServer::instance_get_room);
- ObjectTypeDB::bind_method(_MD("instance_create"),&VisualServer::instance_create,DEFVAL(RID()));
- ObjectTypeDB::bind_method(_MD("instance_get_base"),&VisualServer::instance_get_base);
- ObjectTypeDB::bind_method(_MD("instance_get_base_aabb"),&VisualServer::instance_get_base);
- ObjectTypeDB::bind_method(_MD("instance_set_transform"),&VisualServer::instance_set_transform);
- ObjectTypeDB::bind_method(_MD("instance_get_transform"),&VisualServer::instance_get_transform);
- ObjectTypeDB::bind_method(_MD("instance_attach_object_instance_ID"),&VisualServer::instance_attach_object_instance_ID);
- ObjectTypeDB::bind_method(_MD("instance_get_object_instance_ID"),&VisualServer::instance_get_object_instance_ID);
- ObjectTypeDB::bind_method(_MD("instance_attach_skeleton"),&VisualServer::instance_attach_skeleton);
- ObjectTypeDB::bind_method(_MD("instance_get_skeleton"),&VisualServer::instance_get_skeleton);
- ObjectTypeDB::bind_method(_MD("instance_set_room"),&VisualServer::instance_set_room);
- ObjectTypeDB::bind_method(_MD("instance_get_room"),&VisualServer::instance_get_room);
+ ObjectTypeDB::bind_method(_MD("instance_set_exterior"), &VisualServer::instance_set_exterior);
+ ObjectTypeDB::bind_method(_MD("instance_is_exterior"), &VisualServer::instance_is_exterior);
- ObjectTypeDB::bind_method(_MD("instance_set_exterior"),&VisualServer::instance_set_exterior);
- ObjectTypeDB::bind_method(_MD("instance_is_exterior"),&VisualServer::instance_is_exterior);
+ ObjectTypeDB::bind_method(_MD("instances_cull_aabb"), &VisualServer::instances_cull_aabb);
+ ObjectTypeDB::bind_method(_MD("instances_cull_ray"), &VisualServer::instances_cull_ray);
+ ObjectTypeDB::bind_method(_MD("instances_cull_convex"), &VisualServer::instances_cull_convex);
- ObjectTypeDB::bind_method(_MD("instances_cull_aabb"),&VisualServer::instances_cull_aabb);
- ObjectTypeDB::bind_method(_MD("instances_cull_ray"),&VisualServer::instances_cull_ray);
- ObjectTypeDB::bind_method(_MD("instances_cull_convex"),&VisualServer::instances_cull_convex);
+ ObjectTypeDB::bind_method(_MD("instance_geometry_override_material_param"), &VisualServer::instance_get_room);
+ ObjectTypeDB::bind_method(_MD("instance_geometry_get_material_param"), &VisualServer::instance_get_room);
-
-
- ObjectTypeDB::bind_method(_MD("instance_geometry_override_material_param"),&VisualServer::instance_get_room);
- ObjectTypeDB::bind_method(_MD("instance_geometry_get_material_param"),&VisualServer::instance_get_room);
-
- ObjectTypeDB::bind_method(_MD("get_test_cube"),&VisualServer::get_test_cube);
+ ObjectTypeDB::bind_method(_MD("get_test_cube"), &VisualServer::get_test_cube);
#endif
- ObjectTypeDB::bind_method(_MD("canvas_create"),&VisualServer::canvas_create);
- ObjectTypeDB::bind_method(_MD("canvas_item_create"),&VisualServer::canvas_item_create);
- ObjectTypeDB::bind_method(_MD("canvas_item_set_parent"),&VisualServer::canvas_item_set_parent);
- ObjectTypeDB::bind_method(_MD("canvas_item_get_parent"),&VisualServer::canvas_item_get_parent);
- ObjectTypeDB::bind_method(_MD("canvas_item_set_transform"),&VisualServer::canvas_item_set_transform);
- ObjectTypeDB::bind_method(_MD("canvas_item_set_custom_rect"),&VisualServer::canvas_item_set_custom_rect);
- ObjectTypeDB::bind_method(_MD("canvas_item_set_clip"),&VisualServer::canvas_item_set_clip);
- ObjectTypeDB::bind_method(_MD("canvas_item_set_opacity"),&VisualServer::canvas_item_set_opacity);
- ObjectTypeDB::bind_method(_MD("canvas_item_get_opacity"),&VisualServer::canvas_item_get_opacity);
- ObjectTypeDB::bind_method(_MD("canvas_item_set_self_opacity"),&VisualServer::canvas_item_set_self_opacity);
- ObjectTypeDB::bind_method(_MD("canvas_item_get_self_opacity"),&VisualServer::canvas_item_get_self_opacity);
- ObjectTypeDB::bind_method(_MD("canvas_item_set_z"),&VisualServer::canvas_item_set_z);
- ObjectTypeDB::bind_method(_MD("canvas_item_set_sort_children_by_y"),&VisualServer::canvas_item_set_sort_children_by_y);
-
- ObjectTypeDB::bind_method(_MD("canvas_item_add_line"),&VisualServer::canvas_item_add_line, DEFVAL(1.0));
- ObjectTypeDB::bind_method(_MD("canvas_item_add_rect"),&VisualServer::canvas_item_add_rect);
- ObjectTypeDB::bind_method(_MD("canvas_item_add_texture_rect"),&VisualServer::canvas_item_add_texture_rect, DEFVAL(Color(1,1,1)), DEFVAL(false));
- ObjectTypeDB::bind_method(_MD("canvas_item_add_texture_rect_region"),&VisualServer::canvas_item_add_texture_rect_region, DEFVAL(Color(1,1,1)), DEFVAL(false));
-
- ObjectTypeDB::bind_method(_MD("canvas_item_add_style_box"),&VisualServer::_canvas_item_add_style_box, DEFVAL(Color(1,1,1)));
-// ObjectTypeDB::bind_method(_MD("canvas_item_add_primitive"),&VisualServer::canvas_item_add_primitive,DEFVAL(Vector<Vector2>()),DEFVAL(RID()));
- ObjectTypeDB::bind_method(_MD("canvas_item_add_circle"),&VisualServer::canvas_item_add_circle);
-
- ObjectTypeDB::bind_method(_MD("viewport_set_canvas_transform"),&VisualServer::viewport_set_canvas_transform);
-
- ObjectTypeDB::bind_method(_MD("canvas_item_clear"),&VisualServer::canvas_item_clear);
- ObjectTypeDB::bind_method(_MD("canvas_item_raise"),&VisualServer::canvas_item_raise);
+ ObjectTypeDB::bind_method(_MD("canvas_create"), &VisualServer::canvas_create);
+ ObjectTypeDB::bind_method(_MD("canvas_item_create"), &VisualServer::canvas_item_create);
+ ObjectTypeDB::bind_method(_MD("canvas_item_set_parent"), &VisualServer::canvas_item_set_parent);
+ ObjectTypeDB::bind_method(_MD("canvas_item_get_parent"), &VisualServer::canvas_item_get_parent);
+ ObjectTypeDB::bind_method(_MD("canvas_item_set_transform"), &VisualServer::canvas_item_set_transform);
+ ObjectTypeDB::bind_method(_MD("canvas_item_set_custom_rect"), &VisualServer::canvas_item_set_custom_rect);
+ ObjectTypeDB::bind_method(_MD("canvas_item_set_clip"), &VisualServer::canvas_item_set_clip);
+ ObjectTypeDB::bind_method(_MD("canvas_item_set_opacity"), &VisualServer::canvas_item_set_opacity);
+ ObjectTypeDB::bind_method(_MD("canvas_item_get_opacity"), &VisualServer::canvas_item_get_opacity);
+ ObjectTypeDB::bind_method(_MD("canvas_item_set_self_opacity"), &VisualServer::canvas_item_set_self_opacity);
+ ObjectTypeDB::bind_method(_MD("canvas_item_get_self_opacity"), &VisualServer::canvas_item_get_self_opacity);
+ ObjectTypeDB::bind_method(_MD("canvas_item_set_z"), &VisualServer::canvas_item_set_z);
+ ObjectTypeDB::bind_method(_MD("canvas_item_set_sort_children_by_y"), &VisualServer::canvas_item_set_sort_children_by_y);
+ ObjectTypeDB::bind_method(_MD("canvas_item_add_line"), &VisualServer::canvas_item_add_line, DEFVAL(1.0));
+ ObjectTypeDB::bind_method(_MD("canvas_item_add_rect"), &VisualServer::canvas_item_add_rect);
+ ObjectTypeDB::bind_method(_MD("canvas_item_add_texture_rect"), &VisualServer::canvas_item_add_texture_rect, DEFVAL(Color(1, 1, 1)), DEFVAL(false));
+ ObjectTypeDB::bind_method(_MD("canvas_item_add_texture_rect_region"), &VisualServer::canvas_item_add_texture_rect_region, DEFVAL(Color(1, 1, 1)), DEFVAL(false));
- ObjectTypeDB::bind_method(_MD("cursor_set_rotation"),&VisualServer::cursor_set_rotation);
- ObjectTypeDB::bind_method(_MD("cursor_set_texture"),&VisualServer::cursor_set_texture);
- ObjectTypeDB::bind_method(_MD("cursor_set_visible"),&VisualServer::cursor_set_visible);
- ObjectTypeDB::bind_method(_MD("cursor_set_pos"),&VisualServer::cursor_set_pos);
+ ObjectTypeDB::bind_method(_MD("canvas_item_add_style_box"), &VisualServer::_canvas_item_add_style_box, DEFVAL(Color(1, 1, 1)));
+ // ObjectTypeDB::bind_method(_MD("canvas_item_add_primitive"),&VisualServer::canvas_item_add_primitive,DEFVAL(Vector<Vector2>()),DEFVAL(RID()));
+ ObjectTypeDB::bind_method(_MD("canvas_item_add_circle"), &VisualServer::canvas_item_add_circle);
- ObjectTypeDB::bind_method(_MD("black_bars_set_margins","left","top","right","bottom"),&VisualServer::black_bars_set_margins);
- ObjectTypeDB::bind_method(_MD("black_bars_set_images","left","top","right","bottom"),&VisualServer::black_bars_set_images);
+ ObjectTypeDB::bind_method(_MD("viewport_set_canvas_transform"), &VisualServer::viewport_set_canvas_transform);
- ObjectTypeDB::bind_method(_MD("make_sphere_mesh"),&VisualServer::make_sphere_mesh);
- ObjectTypeDB::bind_method(_MD("mesh_add_surface_from_planes"),&VisualServer::mesh_add_surface_from_planes);
+ ObjectTypeDB::bind_method(_MD("canvas_item_clear"), &VisualServer::canvas_item_clear);
+ ObjectTypeDB::bind_method(_MD("canvas_item_raise"), &VisualServer::canvas_item_raise);
- ObjectTypeDB::bind_method(_MD("draw"),&VisualServer::draw);
- ObjectTypeDB::bind_method(_MD("sync"),&VisualServer::sync);
- ObjectTypeDB::bind_method(_MD("free_rid"),&VisualServer::free);
+ ObjectTypeDB::bind_method(_MD("cursor_set_rotation"), &VisualServer::cursor_set_rotation);
+ ObjectTypeDB::bind_method(_MD("cursor_set_texture"), &VisualServer::cursor_set_texture);
+ ObjectTypeDB::bind_method(_MD("cursor_set_visible"), &VisualServer::cursor_set_visible);
+ ObjectTypeDB::bind_method(_MD("cursor_set_pos"), &VisualServer::cursor_set_pos);
- ObjectTypeDB::bind_method(_MD("set_default_clear_color"),&VisualServer::set_default_clear_color);
- ObjectTypeDB::bind_method(_MD("get_default_clear_color"),&VisualServer::get_default_clear_color);
+ ObjectTypeDB::bind_method(_MD("black_bars_set_margins", "left", "top", "right", "bottom"), &VisualServer::black_bars_set_margins);
+ ObjectTypeDB::bind_method(_MD("black_bars_set_images", "left", "top", "right", "bottom"), &VisualServer::black_bars_set_images);
- ObjectTypeDB::bind_method(_MD("get_render_info"),&VisualServer::get_render_info);
+ ObjectTypeDB::bind_method(_MD("make_sphere_mesh"), &VisualServer::make_sphere_mesh);
+ ObjectTypeDB::bind_method(_MD("mesh_add_surface_from_planes"), &VisualServer::mesh_add_surface_from_planes);
- BIND_CONSTANT( NO_INDEX_ARRAY );
- BIND_CONSTANT( CUSTOM_ARRAY_SIZE );
- BIND_CONSTANT( ARRAY_WEIGHTS_SIZE );
- BIND_CONSTANT( MAX_PARTICLE_COLOR_PHASES );
- BIND_CONSTANT( MAX_PARTICLE_ATTRACTORS );
- BIND_CONSTANT( MAX_CURSORS );
+ ObjectTypeDB::bind_method(_MD("draw"), &VisualServer::draw);
+ ObjectTypeDB::bind_method(_MD("sync"), &VisualServer::sync);
+ ObjectTypeDB::bind_method(_MD("free_rid"), &VisualServer::free);
- BIND_CONSTANT( TEXTURE_FLAG_MIPMAPS );
- BIND_CONSTANT( TEXTURE_FLAG_REPEAT );
- BIND_CONSTANT( TEXTURE_FLAG_FILTER );
- BIND_CONSTANT( TEXTURE_FLAG_CUBEMAP );
- BIND_CONSTANT( TEXTURE_FLAGS_DEFAULT );
+ ObjectTypeDB::bind_method(_MD("set_default_clear_color"), &VisualServer::set_default_clear_color);
+ ObjectTypeDB::bind_method(_MD("get_default_clear_color"), &VisualServer::get_default_clear_color);
- BIND_CONSTANT( CUBEMAP_LEFT );
- BIND_CONSTANT( CUBEMAP_RIGHT );
- BIND_CONSTANT( CUBEMAP_BOTTOM );
- BIND_CONSTANT( CUBEMAP_TOP );
- BIND_CONSTANT( CUBEMAP_FRONT );
- BIND_CONSTANT( CUBEMAP_BACK );
+ ObjectTypeDB::bind_method(_MD("get_render_info"), &VisualServer::get_render_info);
- BIND_CONSTANT( SHADER_MATERIAL ); ///< param 0: name
- BIND_CONSTANT( SHADER_POST_PROCESS ); ///< param 0: name
+ BIND_CONSTANT(NO_INDEX_ARRAY);
+ BIND_CONSTANT(CUSTOM_ARRAY_SIZE);
+ BIND_CONSTANT(ARRAY_WEIGHTS_SIZE);
+ BIND_CONSTANT(MAX_PARTICLE_COLOR_PHASES);
+ BIND_CONSTANT(MAX_PARTICLE_ATTRACTORS);
+ BIND_CONSTANT(MAX_CURSORS);
- BIND_CONSTANT( MATERIAL_FLAG_VISIBLE );
- BIND_CONSTANT( MATERIAL_FLAG_DOUBLE_SIDED );
- BIND_CONSTANT( MATERIAL_FLAG_INVERT_FACES );
- BIND_CONSTANT( MATERIAL_FLAG_UNSHADED );
- BIND_CONSTANT( MATERIAL_FLAG_ONTOP );
- BIND_CONSTANT( MATERIAL_FLAG_MAX );
+ BIND_CONSTANT(TEXTURE_FLAG_MIPMAPS);
+ BIND_CONSTANT(TEXTURE_FLAG_REPEAT);
+ BIND_CONSTANT(TEXTURE_FLAG_FILTER);
+ BIND_CONSTANT(TEXTURE_FLAG_CUBEMAP);
+ BIND_CONSTANT(TEXTURE_FLAGS_DEFAULT);
- BIND_CONSTANT( MATERIAL_BLEND_MODE_MIX );
- BIND_CONSTANT( MATERIAL_BLEND_MODE_ADD );
- BIND_CONSTANT( MATERIAL_BLEND_MODE_SUB );
- BIND_CONSTANT( MATERIAL_BLEND_MODE_MUL );
+ BIND_CONSTANT(CUBEMAP_LEFT);
+ BIND_CONSTANT(CUBEMAP_RIGHT);
+ BIND_CONSTANT(CUBEMAP_BOTTOM);
+ BIND_CONSTANT(CUBEMAP_TOP);
+ BIND_CONSTANT(CUBEMAP_FRONT);
+ BIND_CONSTANT(CUBEMAP_BACK);
- BIND_CONSTANT( FIXED_MATERIAL_PARAM_DIFFUSE );
- BIND_CONSTANT( FIXED_MATERIAL_PARAM_DETAIL );
- BIND_CONSTANT( FIXED_MATERIAL_PARAM_SPECULAR );
- BIND_CONSTANT( FIXED_MATERIAL_PARAM_EMISSION );
- BIND_CONSTANT( FIXED_MATERIAL_PARAM_SPECULAR_EXP );
- BIND_CONSTANT( FIXED_MATERIAL_PARAM_GLOW );
- BIND_CONSTANT( FIXED_MATERIAL_PARAM_NORMAL );
- BIND_CONSTANT( FIXED_MATERIAL_PARAM_SHADE_PARAM );
- BIND_CONSTANT( FIXED_MATERIAL_PARAM_MAX );
+ BIND_CONSTANT(SHADER_MATERIAL); ///< param 0: name
+ BIND_CONSTANT(SHADER_POST_PROCESS); ///< param 0: name
+ BIND_CONSTANT(MATERIAL_FLAG_VISIBLE);
+ BIND_CONSTANT(MATERIAL_FLAG_DOUBLE_SIDED);
+ BIND_CONSTANT(MATERIAL_FLAG_INVERT_FACES);
+ BIND_CONSTANT(MATERIAL_FLAG_UNSHADED);
+ BIND_CONSTANT(MATERIAL_FLAG_ONTOP);
+ BIND_CONSTANT(MATERIAL_FLAG_MAX);
+ BIND_CONSTANT(MATERIAL_BLEND_MODE_MIX);
+ BIND_CONSTANT(MATERIAL_BLEND_MODE_ADD);
+ BIND_CONSTANT(MATERIAL_BLEND_MODE_SUB);
+ BIND_CONSTANT(MATERIAL_BLEND_MODE_MUL);
- BIND_CONSTANT( FIXED_MATERIAL_TEXCOORD_SPHERE );
- BIND_CONSTANT( FIXED_MATERIAL_TEXCOORD_UV );
- BIND_CONSTANT( FIXED_MATERIAL_TEXCOORD_UV_TRANSFORM );
- BIND_CONSTANT( FIXED_MATERIAL_TEXCOORD_UV2 );
+ BIND_CONSTANT(FIXED_MATERIAL_PARAM_DIFFUSE);
+ BIND_CONSTANT(FIXED_MATERIAL_PARAM_DETAIL);
+ BIND_CONSTANT(FIXED_MATERIAL_PARAM_SPECULAR);
+ BIND_CONSTANT(FIXED_MATERIAL_PARAM_EMISSION);
+ BIND_CONSTANT(FIXED_MATERIAL_PARAM_SPECULAR_EXP);
+ BIND_CONSTANT(FIXED_MATERIAL_PARAM_GLOW);
+ BIND_CONSTANT(FIXED_MATERIAL_PARAM_NORMAL);
+ BIND_CONSTANT(FIXED_MATERIAL_PARAM_SHADE_PARAM);
+ BIND_CONSTANT(FIXED_MATERIAL_PARAM_MAX);
+ BIND_CONSTANT(FIXED_MATERIAL_TEXCOORD_SPHERE);
+ BIND_CONSTANT(FIXED_MATERIAL_TEXCOORD_UV);
+ BIND_CONSTANT(FIXED_MATERIAL_TEXCOORD_UV_TRANSFORM);
+ BIND_CONSTANT(FIXED_MATERIAL_TEXCOORD_UV2);
- BIND_CONSTANT( ARRAY_VERTEX );
- BIND_CONSTANT( ARRAY_NORMAL );
- BIND_CONSTANT( ARRAY_TANGENT );
- BIND_CONSTANT( ARRAY_COLOR );
- BIND_CONSTANT( ARRAY_TEX_UV );
- BIND_CONSTANT( ARRAY_BONES );
- BIND_CONSTANT( ARRAY_WEIGHTS );
- BIND_CONSTANT( ARRAY_INDEX );
- BIND_CONSTANT( ARRAY_MAX );
+ BIND_CONSTANT(ARRAY_VERTEX);
+ BIND_CONSTANT(ARRAY_NORMAL);
+ BIND_CONSTANT(ARRAY_TANGENT);
+ BIND_CONSTANT(ARRAY_COLOR);
+ BIND_CONSTANT(ARRAY_TEX_UV);
+ BIND_CONSTANT(ARRAY_BONES);
+ BIND_CONSTANT(ARRAY_WEIGHTS);
+ BIND_CONSTANT(ARRAY_INDEX);
+ BIND_CONSTANT(ARRAY_MAX);
- BIND_CONSTANT( ARRAY_FORMAT_VERTEX );
- BIND_CONSTANT( ARRAY_FORMAT_NORMAL );
- BIND_CONSTANT( ARRAY_FORMAT_TANGENT );
- BIND_CONSTANT( ARRAY_FORMAT_COLOR );
- BIND_CONSTANT( ARRAY_FORMAT_TEX_UV );
- BIND_CONSTANT( ARRAY_FORMAT_BONES );
- BIND_CONSTANT( ARRAY_FORMAT_WEIGHTS );
- BIND_CONSTANT( ARRAY_FORMAT_INDEX );
+ BIND_CONSTANT(ARRAY_FORMAT_VERTEX);
+ BIND_CONSTANT(ARRAY_FORMAT_NORMAL);
+ BIND_CONSTANT(ARRAY_FORMAT_TANGENT);
+ BIND_CONSTANT(ARRAY_FORMAT_COLOR);
+ BIND_CONSTANT(ARRAY_FORMAT_TEX_UV);
+ BIND_CONSTANT(ARRAY_FORMAT_BONES);
+ BIND_CONSTANT(ARRAY_FORMAT_WEIGHTS);
+ BIND_CONSTANT(ARRAY_FORMAT_INDEX);
- BIND_CONSTANT( PRIMITIVE_POINTS );
- BIND_CONSTANT( PRIMITIVE_LINES );
- BIND_CONSTANT( PRIMITIVE_LINE_STRIP );
- BIND_CONSTANT( PRIMITIVE_LINE_LOOP );
- BIND_CONSTANT( PRIMITIVE_TRIANGLES );
- BIND_CONSTANT( PRIMITIVE_TRIANGLE_STRIP );
- BIND_CONSTANT( PRIMITIVE_TRIANGLE_FAN );
- BIND_CONSTANT( PRIMITIVE_MAX );
+ BIND_CONSTANT(PRIMITIVE_POINTS);
+ BIND_CONSTANT(PRIMITIVE_LINES);
+ BIND_CONSTANT(PRIMITIVE_LINE_STRIP);
+ BIND_CONSTANT(PRIMITIVE_LINE_LOOP);
+ BIND_CONSTANT(PRIMITIVE_TRIANGLES);
+ BIND_CONSTANT(PRIMITIVE_TRIANGLE_STRIP);
+ BIND_CONSTANT(PRIMITIVE_TRIANGLE_FAN);
+ BIND_CONSTANT(PRIMITIVE_MAX);
- BIND_CONSTANT( PARTICLE_LIFETIME );
- BIND_CONSTANT( PARTICLE_SPREAD );
- BIND_CONSTANT( PARTICLE_GRAVITY );
- BIND_CONSTANT( PARTICLE_LINEAR_VELOCITY );
- BIND_CONSTANT( PARTICLE_ANGULAR_VELOCITY );
- BIND_CONSTANT( PARTICLE_LINEAR_ACCELERATION );
- BIND_CONSTANT( PARTICLE_RADIAL_ACCELERATION );
- BIND_CONSTANT( PARTICLE_TANGENTIAL_ACCELERATION );
- BIND_CONSTANT( PARTICLE_INITIAL_SIZE );
- BIND_CONSTANT( PARTICLE_FINAL_SIZE );
- BIND_CONSTANT( PARTICLE_INITIAL_ANGLE );
- BIND_CONSTANT( PARTICLE_HEIGHT );
- BIND_CONSTANT( PARTICLE_HEIGHT_SPEED_SCALE );
- BIND_CONSTANT( PARTICLE_VAR_MAX );
+ BIND_CONSTANT(PARTICLE_LIFETIME);
+ BIND_CONSTANT(PARTICLE_SPREAD);
+ BIND_CONSTANT(PARTICLE_GRAVITY);
+ BIND_CONSTANT(PARTICLE_LINEAR_VELOCITY);
+ BIND_CONSTANT(PARTICLE_ANGULAR_VELOCITY);
+ BIND_CONSTANT(PARTICLE_LINEAR_ACCELERATION);
+ BIND_CONSTANT(PARTICLE_RADIAL_ACCELERATION);
+ BIND_CONSTANT(PARTICLE_TANGENTIAL_ACCELERATION);
+ BIND_CONSTANT(PARTICLE_INITIAL_SIZE);
+ BIND_CONSTANT(PARTICLE_FINAL_SIZE);
+ BIND_CONSTANT(PARTICLE_INITIAL_ANGLE);
+ BIND_CONSTANT(PARTICLE_HEIGHT);
+ BIND_CONSTANT(PARTICLE_HEIGHT_SPEED_SCALE);
+ BIND_CONSTANT(PARTICLE_VAR_MAX);
- BIND_CONSTANT( LIGHT_DIRECTIONAL );
- BIND_CONSTANT( LIGHT_OMNI );
- BIND_CONSTANT( LIGHT_SPOT );
+ BIND_CONSTANT(LIGHT_DIRECTIONAL);
+ BIND_CONSTANT(LIGHT_OMNI);
+ BIND_CONSTANT(LIGHT_SPOT);
+ BIND_CONSTANT(LIGHT_COLOR_DIFFUSE);
+ BIND_CONSTANT(LIGHT_COLOR_SPECULAR);
- BIND_CONSTANT( LIGHT_COLOR_DIFFUSE );
- BIND_CONSTANT( LIGHT_COLOR_SPECULAR );
+ BIND_CONSTANT(LIGHT_PARAM_SPOT_ATTENUATION);
+ BIND_CONSTANT(LIGHT_PARAM_SPOT_ANGLE);
+ BIND_CONSTANT(LIGHT_PARAM_RADIUS);
+ BIND_CONSTANT(LIGHT_PARAM_ENERGY);
+ BIND_CONSTANT(LIGHT_PARAM_ATTENUATION);
+ BIND_CONSTANT(LIGHT_PARAM_MAX);
- BIND_CONSTANT( LIGHT_PARAM_SPOT_ATTENUATION );
- BIND_CONSTANT( LIGHT_PARAM_SPOT_ANGLE );
- BIND_CONSTANT( LIGHT_PARAM_RADIUS );
- BIND_CONSTANT( LIGHT_PARAM_ENERGY );
- BIND_CONSTANT( LIGHT_PARAM_ATTENUATION );
- BIND_CONSTANT( LIGHT_PARAM_MAX );
+ BIND_CONSTANT(SCENARIO_DEBUG_DISABLED);
+ BIND_CONSTANT(SCENARIO_DEBUG_WIREFRAME);
+ BIND_CONSTANT(SCENARIO_DEBUG_OVERDRAW);
- BIND_CONSTANT( SCENARIO_DEBUG_DISABLED );
- BIND_CONSTANT( SCENARIO_DEBUG_WIREFRAME );
- BIND_CONSTANT( SCENARIO_DEBUG_OVERDRAW );
-
- BIND_CONSTANT( INSTANCE_MESH );
- BIND_CONSTANT( INSTANCE_MULTIMESH );
-
- BIND_CONSTANT( INSTANCE_PARTICLES );
- BIND_CONSTANT( INSTANCE_LIGHT );
- BIND_CONSTANT( INSTANCE_ROOM );
- BIND_CONSTANT( INSTANCE_PORTAL );
- BIND_CONSTANT( INSTANCE_GEOMETRY_MASK );
-
-
- BIND_CONSTANT( INFO_OBJECTS_IN_FRAME );
- BIND_CONSTANT( INFO_VERTICES_IN_FRAME );
- BIND_CONSTANT( INFO_MATERIAL_CHANGES_IN_FRAME );
- BIND_CONSTANT( INFO_SHADER_CHANGES_IN_FRAME );
- BIND_CONSTANT( INFO_SURFACE_CHANGES_IN_FRAME );
- BIND_CONSTANT( INFO_DRAW_CALLS_IN_FRAME );
- BIND_CONSTANT( INFO_USAGE_VIDEO_MEM_TOTAL );
- BIND_CONSTANT( INFO_VIDEO_MEM_USED );
- BIND_CONSTANT( INFO_TEXTURE_MEM_USED );
- BIND_CONSTANT( INFO_VERTEX_MEM_USED );
+ BIND_CONSTANT(INSTANCE_MESH);
+ BIND_CONSTANT(INSTANCE_MULTIMESH);
+ BIND_CONSTANT(INSTANCE_PARTICLES);
+ BIND_CONSTANT(INSTANCE_LIGHT);
+ BIND_CONSTANT(INSTANCE_ROOM);
+ BIND_CONSTANT(INSTANCE_PORTAL);
+ BIND_CONSTANT(INSTANCE_GEOMETRY_MASK);
+ BIND_CONSTANT(INFO_OBJECTS_IN_FRAME);
+ BIND_CONSTANT(INFO_VERTICES_IN_FRAME);
+ BIND_CONSTANT(INFO_MATERIAL_CHANGES_IN_FRAME);
+ BIND_CONSTANT(INFO_SHADER_CHANGES_IN_FRAME);
+ BIND_CONSTANT(INFO_SURFACE_CHANGES_IN_FRAME);
+ BIND_CONSTANT(INFO_DRAW_CALLS_IN_FRAME);
+ BIND_CONSTANT(INFO_USAGE_VIDEO_MEM_TOTAL);
+ BIND_CONSTANT(INFO_VIDEO_MEM_USED);
+ BIND_CONSTANT(INFO_TEXTURE_MEM_USED);
+ BIND_CONSTANT(INFO_VERTEX_MEM_USED);
}
-void VisualServer::_canvas_item_add_style_box(RID p_item, const Rect2& p_rect, const Rect2& p_source, RID p_texture,const Vector<float>& p_margins, const Color& p_modulate) {
+void VisualServer::_canvas_item_add_style_box(RID p_item, const Rect2 &p_rect, const Rect2 &p_source, RID p_texture, const Vector<float> &p_margins, const Color &p_modulate) {
- ERR_FAIL_COND(p_margins.size()!=4);
- canvas_item_add_style_box(p_item,p_rect,p_source,p_texture,Vector2(p_margins[0],p_margins[1]),Vector2(p_margins[2],p_margins[3]),true,p_modulate);
+ ERR_FAIL_COND(p_margins.size() != 4);
+ canvas_item_add_style_box(p_item, p_rect, p_source, p_texture, Vector2(p_margins[0], p_margins[1]), Vector2(p_margins[2], p_margins[3]), true, p_modulate);
}
-void VisualServer::_camera_set_orthogonal(RID p_camera,float p_size,float p_z_near,float p_z_far) {
+void VisualServer::_camera_set_orthogonal(RID p_camera, float p_size, float p_z_near, float p_z_far) {
- camera_set_orthogonal(p_camera,p_size,p_z_near,p_z_far);
+ camera_set_orthogonal(p_camera, p_size, p_z_near, p_z_far);
}
-void VisualServer::_viewport_set_rect(RID p_viewport,const Rect2& p_rect) {
+void VisualServer::_viewport_set_rect(RID p_viewport, const Rect2 &p_rect) {
ViewportRect r;
- r.x=p_rect.pos.x;
- r.y=p_rect.pos.y;
- r.width=p_rect.size.x;
- r.height=p_rect.size.y;
- viewport_set_rect(p_viewport,r);
+ r.x = p_rect.pos.x;
+ r.y = p_rect.pos.y;
+ r.width = p_rect.size.x;
+ r.height = p_rect.size.y;
+ viewport_set_rect(p_viewport, r);
}
Rect2 VisualServer::_viewport_get_rect(RID p_viewport) const {
- ViewportRect r=viewport_get_rect(p_viewport);
- return Rect2(r.x,r.y,r.width,r.height);
+ ViewportRect r = viewport_get_rect(p_viewport);
+ return Rect2(r.x, r.y, r.width, r.height);
}
-
-
-
-
-void VisualServer::mesh_add_surface_from_mesh_data( RID p_mesh, const Geometry::MeshData& p_mesh_data) {
+void VisualServer::mesh_add_surface_from_mesh_data(RID p_mesh, const Geometry::MeshData &p_mesh_data) {
#if 1
DVector<Vector3> vertices;
DVector<Vector3> normals;
- for (int i=0;i<p_mesh_data.faces.size();i++) {
+ for (int i = 0; i < p_mesh_data.faces.size(); i++) {
- const Geometry::MeshData::Face& f = p_mesh_data.faces[i];
+ const Geometry::MeshData::Face &f = p_mesh_data.faces[i];
- for (int j=2;j<f.indices.size();j++) {
+ for (int j = 2; j < f.indices.size(); j++) {
-#define _ADD_VERTEX(m_idx)\
- vertices.push_back( p_mesh_data.vertices[ f.indices[m_idx] ] );\
- normals.push_back( f.plane.normal );
+#define _ADD_VERTEX(m_idx) \
+ vertices.push_back(p_mesh_data.vertices[f.indices[m_idx]]); \
+ normals.push_back(f.plane.normal);
- _ADD_VERTEX( 0 );
- _ADD_VERTEX( j-1 );
- _ADD_VERTEX( j );
+ _ADD_VERTEX(0);
+ _ADD_VERTEX(j - 1);
+ _ADD_VERTEX(j);
}
}
Array d;
d.resize(VS::ARRAY_MAX);
- d[ARRAY_VERTEX]=vertices;
- d[ARRAY_NORMAL]=normals;
- mesh_add_surface(p_mesh,PRIMITIVE_TRIANGLES, d);
+ d[ARRAY_VERTEX] = vertices;
+ d[ARRAY_NORMAL] = normals;
+ mesh_add_surface(p_mesh, PRIMITIVE_TRIANGLES, d);
#else
-
DVector<Vector3> vertices;
+ for (int i = 0; i < p_mesh_data.edges.size(); i++) {
-
- for (int i=0;i<p_mesh_data.edges.size();i++) {
-
- const Geometry::MeshData::Edge& f = p_mesh_data.edges[i];
- vertices.push_back(p_mesh_data.vertices[ f.a]);
- vertices.push_back(p_mesh_data.vertices[ f.b]);
+ const Geometry::MeshData::Edge &f = p_mesh_data.edges[i];
+ vertices.push_back(p_mesh_data.vertices[f.a]);
+ vertices.push_back(p_mesh_data.vertices[f.b]);
}
Array d;
d.resize(VS::ARRAY_MAX);
- d[ARRAY_VERTEX]=vertices;
- mesh_add_surface(p_mesh,PRIMITIVE_LINES, d);
-
-
-
+ d[ARRAY_VERTEX] = vertices;
+ mesh_add_surface(p_mesh, PRIMITIVE_LINES, d);
#endif
-
}
-void VisualServer::mesh_add_surface_from_planes( RID p_mesh, const DVector<Plane>& p_planes) {
-
+void VisualServer::mesh_add_surface_from_planes(RID p_mesh, const DVector<Plane> &p_planes) {
Geometry::MeshData mdata = Geometry::build_convex_mesh(p_planes);
- mesh_add_surface_from_mesh_data(p_mesh,mdata);
-
+ mesh_add_surface_from_mesh_data(p_mesh, mdata);
}
RID VisualServer::instance_create2(RID p_base, RID p_scenario) {
RID instance = instance_create();
- instance_set_base(instance,p_base);
- instance_set_scenario(instance,p_scenario);
+ instance_set_base(instance, p_base);
+ instance_set_scenario(instance, p_scenario);
return instance;
}
-
VisualServer::VisualServer() {
-// ERR_FAIL_COND(singleton);
- singleton=this;
- mm_policy=GLOBAL_DEF("render/mipmap_policy",0);
- if (mm_policy<0 || mm_policy>2)
- mm_policy=0;
-
+ // ERR_FAIL_COND(singleton);
+ singleton = this;
+ mm_policy = GLOBAL_DEF("render/mipmap_policy", 0);
+ if (mm_policy < 0 || mm_policy > 2)
+ mm_policy = 0;
}
-
VisualServer::~VisualServer() {
- singleton=NULL;
+ singleton = NULL;
}
diff --git a/servers/visual_server.h b/servers/visual_server.h
index 311e6ec94..8ada611a5 100644
--- a/servers/visual_server.h
+++ b/servers/visual_server.h
@@ -29,30 +29,30 @@
#ifndef VISUAL_SERVER_H
#define VISUAL_SERVER_H
-
-#include "rid.h"
-#include "variant.h"
-#include "math_2d.h"
#include "bsp_tree.h"
#include "geometry.h"
+#include "math_2d.h"
#include "object.h"
+#include "rid.h"
+#include "variant.h"
/**
@author Juan Linietsky <reduzio@gmail.com>
*/
class VisualServer : public Object {
- OBJ_TYPE( VisualServer, Object );
+ OBJ_TYPE(VisualServer, Object);
static VisualServer *singleton;
int mm_policy;
DVector<String> _shader_get_param_list(RID p_shader) const;
- void _camera_set_orthogonal(RID p_camera,float p_size,float p_z_near,float p_z_far);
- void _viewport_set_rect(RID p_viewport,const Rect2& p_rect);
+ void _camera_set_orthogonal(RID p_camera, float p_size, float p_z_near, float p_z_far);
+ void _viewport_set_rect(RID p_viewport, const Rect2 &p_rect);
Rect2 _viewport_get_rect(RID p_viewport) const;
- void _canvas_item_add_style_box(RID p_item, const Rect2& p_rect, const Rect2& p_source, RID p_texture,const Vector<float>& p_margins, const Color& p_modulate=Color(1,1,1));
+ void _canvas_item_add_style_box(RID p_item, const Rect2 &p_rect, const Rect2 &p_source, RID p_texture, const Vector<float> &p_margins, const Color &p_modulate = Color(1, 1, 1));
+
protected:
RID _make_test_cube();
void _free_internal_rids();
@@ -61,10 +61,10 @@ protected:
RID test_material;
RID material_2d[16];
- static VisualServer* (*create_func)();
+ static VisualServer *(*create_func)();
static void _bind_methods();
-public:
+public:
static VisualServer *get_singleton();
static VisualServer *create();
@@ -75,23 +75,18 @@ public:
MIPMAPS_DISABLED
};
-
virtual void set_mipmap_policy(MipMapPolicy p_policy);
virtual MipMapPolicy get_mipmap_policy() const;
-
-
enum {
- NO_INDEX_ARRAY=-1,
- CUSTOM_ARRAY_SIZE=8,
- ARRAY_WEIGHTS_SIZE=4,
- MAX_PARTICLE_COLOR_PHASES=4,
- MAX_PARTICLE_ATTRACTORS=4,
- CANVAS_ITEM_Z_MIN=-4096,
- CANVAS_ITEM_Z_MAX=4096,
-
-
+ NO_INDEX_ARRAY = -1,
+ CUSTOM_ARRAY_SIZE = 8,
+ ARRAY_WEIGHTS_SIZE = 4,
+ MAX_PARTICLE_COLOR_PHASES = 4,
+ MAX_PARTICLE_ATTRACTORS = 4,
+ CANVAS_ITEM_Z_MIN = -4096,
+ CANVAS_ITEM_Z_MAX = 4096,
MAX_CURSORS = 8,
};
@@ -99,15 +94,15 @@ public:
/* TEXTURE API */
enum TextureFlags {
- TEXTURE_FLAG_MIPMAPS=1, /// Enable automatic mipmap generation - when available
- TEXTURE_FLAG_REPEAT=2, /// Repeat texture (Tiling), otherwise Clamping
- TEXTURE_FLAG_FILTER=4, /// Create texure with linear (or available) filter
- TEXTURE_FLAG_ANISOTROPIC_FILTER=8,
- TEXTURE_FLAG_CONVERT_TO_LINEAR=16,
- TEXTURE_FLAG_MIRRORED_REPEAT=32, /// Repeat texture, with alternate sections mirrored
- TEXTURE_FLAG_CUBEMAP=2048,
- TEXTURE_FLAG_VIDEO_SURFACE=4096,
- TEXTURE_FLAGS_DEFAULT=TEXTURE_FLAG_REPEAT|TEXTURE_FLAG_MIPMAPS|TEXTURE_FLAG_FILTER
+ TEXTURE_FLAG_MIPMAPS = 1, /// Enable automatic mipmap generation - when available
+ TEXTURE_FLAG_REPEAT = 2, /// Repeat texture (Tiling), otherwise Clamping
+ TEXTURE_FLAG_FILTER = 4, /// Create texure with linear (or available) filter
+ TEXTURE_FLAG_ANISOTROPIC_FILTER = 8,
+ TEXTURE_FLAG_CONVERT_TO_LINEAR = 16,
+ TEXTURE_FLAG_MIRRORED_REPEAT = 32, /// Repeat texture, with alternate sections mirrored
+ TEXTURE_FLAG_CUBEMAP = 2048,
+ TEXTURE_FLAG_VIDEO_SURFACE = 4096,
+ TEXTURE_FLAGS_DEFAULT = TEXTURE_FLAG_REPEAT | TEXTURE_FLAG_MIPMAPS | TEXTURE_FLAG_FILTER
};
enum CubeMapSide {
@@ -120,25 +115,24 @@ public:
CUBEMAP_BACK
};
+ virtual RID texture_create() = 0;
+ RID texture_create_from_image(const Image &p_image, uint32_t p_flags = TEXTURE_FLAGS_DEFAULT); // helper
+ virtual void texture_allocate(RID p_texture, int p_width, int p_height, Image::Format p_format, uint32_t p_flags = TEXTURE_FLAGS_DEFAULT) = 0;
+ virtual void texture_set_data(RID p_texture, const Image &p_image, CubeMapSide p_cube_side = CUBEMAP_LEFT) = 0;
+ virtual Image texture_get_data(RID p_texture, CubeMapSide p_cube_side = CUBEMAP_LEFT) const = 0;
+ virtual void texture_set_flags(RID p_texture, uint32_t p_flags) = 0;
+ virtual uint32_t texture_get_flags(RID p_texture) const = 0;
+ virtual Image::Format texture_get_format(RID p_texture) const = 0;
+ virtual uint32_t texture_get_width(RID p_texture) const = 0;
+ virtual uint32_t texture_get_height(RID p_texture) const = 0;
+ virtual void texture_set_size_override(RID p_texture, int p_width, int p_height) = 0;
+ virtual bool texture_can_stream(RID p_texture) const = 0;
+ virtual void texture_set_reload_hook(RID p_texture, ObjectID p_owner, const StringName &p_function) const = 0;
- virtual RID texture_create()=0;
- RID texture_create_from_image(const Image& p_image,uint32_t p_flags=TEXTURE_FLAGS_DEFAULT); // helper
- virtual void texture_allocate(RID p_texture,int p_width, int p_height,Image::Format p_format,uint32_t p_flags=TEXTURE_FLAGS_DEFAULT)=0;
- virtual void texture_set_data(RID p_texture,const Image& p_image,CubeMapSide p_cube_side=CUBEMAP_LEFT)=0;
- virtual Image texture_get_data(RID p_texture,CubeMapSide p_cube_side=CUBEMAP_LEFT) const=0;
- virtual void texture_set_flags(RID p_texture,uint32_t p_flags) =0;
- virtual uint32_t texture_get_flags(RID p_texture) const=0;
- virtual Image::Format texture_get_format(RID p_texture) const=0;
- virtual uint32_t texture_get_width(RID p_texture) const=0;
- virtual uint32_t texture_get_height(RID p_texture) const=0;
- virtual void texture_set_size_override(RID p_texture,int p_width, int p_height)=0;
- virtual bool texture_can_stream(RID p_texture) const=0;
- virtual void texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const=0;
+ virtual void texture_set_path(RID p_texture, const String &p_path) = 0;
+ virtual String texture_get_path(RID p_texture) const = 0;
- virtual void texture_set_path(RID p_texture,const String& p_path)=0;
- virtual String texture_get_path(RID p_texture) const=0;
-
- virtual void texture_set_shrink_all_x2_on_set_data(bool p_enable)=0;
+ virtual void texture_set_shrink_all_x2_on_set_data(bool p_enable) = 0;
struct TextureInfo {
RID texture;
@@ -148,8 +142,7 @@ public:
String path;
};
- virtual void texture_debug_usage(List<TextureInfo> *r_info)=0;
-
+ virtual void texture_debug_usage(List<TextureInfo> *r_info) = 0;
/* SHADER API */
@@ -160,31 +153,29 @@ public:
SHADER_POST_PROCESS,
};
+ virtual RID shader_create(ShaderMode p_mode = SHADER_MATERIAL) = 0;
- virtual RID shader_create(ShaderMode p_mode=SHADER_MATERIAL)=0;
-
- virtual void shader_set_mode(RID p_shader,ShaderMode p_mode)=0;
- virtual ShaderMode shader_get_mode(RID p_shader) const=0;
-
- virtual void shader_set_code(RID p_shader, const String& p_vertex, const String& p_fragment,const String& p_light, int p_vertex_ofs=0,int p_fragment_ofs=0,int p_light_ofs=0)=0;
- virtual String shader_get_fragment_code(RID p_shader) const=0;
- virtual String shader_get_vertex_code(RID p_shader) const=0;
- virtual String shader_get_light_code(RID p_shader) const=0;
- virtual void shader_get_param_list(RID p_shader, List<PropertyInfo> *p_param_list) const=0;
+ virtual void shader_set_mode(RID p_shader, ShaderMode p_mode) = 0;
+ virtual ShaderMode shader_get_mode(RID p_shader) const = 0;
- virtual void shader_set_default_texture_param(RID p_shader, const StringName& p_name, RID p_texture)=0;
- virtual RID shader_get_default_texture_param(RID p_shader, const StringName& p_name) const=0;
+ virtual void shader_set_code(RID p_shader, const String &p_vertex, const String &p_fragment, const String &p_light, int p_vertex_ofs = 0, int p_fragment_ofs = 0, int p_light_ofs = 0) = 0;
+ virtual String shader_get_fragment_code(RID p_shader) const = 0;
+ virtual String shader_get_vertex_code(RID p_shader) const = 0;
+ virtual String shader_get_light_code(RID p_shader) const = 0;
+ virtual void shader_get_param_list(RID p_shader, List<PropertyInfo> *p_param_list) const = 0;
+ virtual void shader_set_default_texture_param(RID p_shader, const StringName &p_name, RID p_texture) = 0;
+ virtual RID shader_get_default_texture_param(RID p_shader, const StringName &p_name) const = 0;
/* COMMON MATERIAL API */
- virtual RID material_create()=0;
+ virtual RID material_create() = 0;
- virtual void material_set_shader(RID p_shader_material, RID p_shader)=0;
- virtual RID material_get_shader(RID p_shader_material) const=0;
+ virtual void material_set_shader(RID p_shader_material, RID p_shader) = 0;
+ virtual RID material_get_shader(RID p_shader_material) const = 0;
- virtual void material_set_param(RID p_material, const StringName& p_param, const Variant& p_value)=0;
- virtual Variant material_get_param(RID p_material, const StringName& p_param) const=0;
+ virtual void material_set_param(RID p_material, const StringName &p_param, const Variant &p_value) = 0;
+ virtual Variant material_get_param(RID p_material, const StringName &p_param) const = 0;
enum MaterialFlag {
MATERIAL_FLAG_VISIBLE,
@@ -197,8 +188,8 @@ public:
MATERIAL_FLAG_MAX,
};
- virtual void material_set_flag(RID p_material, MaterialFlag p_flag,bool p_enabled)=0;
- virtual bool material_get_flag(RID p_material,MaterialFlag p_flag) const=0;
+ virtual void material_set_flag(RID p_material, MaterialFlag p_flag, bool p_enabled) = 0;
+ virtual bool material_get_flag(RID p_material, MaterialFlag p_flag) const = 0;
enum MaterialDepthDrawMode {
MATERIAL_DEPTH_DRAW_ALWAYS,
@@ -207,8 +198,8 @@ public:
MATERIAL_DEPTH_DRAW_NEVER
};
- virtual void material_set_depth_draw_mode(RID p_material, MaterialDepthDrawMode p_mode)=0;
- virtual MaterialDepthDrawMode material_get_depth_draw_mode(RID p_material) const=0;
+ virtual void material_set_depth_draw_mode(RID p_material, MaterialDepthDrawMode p_mode) = 0;
+ virtual MaterialDepthDrawMode material_get_depth_draw_mode(RID p_material) const = 0;
enum MaterialBlendMode {
MATERIAL_BLEND_MODE_MIX, //default
@@ -218,17 +209,15 @@ public:
MATERIAL_BLEND_MODE_PREMULT_ALPHA
};
+ virtual void material_set_blend_mode(RID p_material, MaterialBlendMode p_mode) = 0;
+ virtual MaterialBlendMode material_get_blend_mode(RID p_material) const = 0;
- virtual void material_set_blend_mode(RID p_material,MaterialBlendMode p_mode)=0;
- virtual MaterialBlendMode material_get_blend_mode(RID p_material) const=0;
-
- virtual void material_set_line_width(RID p_material,float p_line_width)=0;
- virtual float material_get_line_width(RID p_material) const=0;
-
+ virtual void material_set_line_width(RID p_material, float p_line_width) = 0;
+ virtual float material_get_line_width(RID p_material) const = 0;
//fixed material api
- virtual RID fixed_material_create()=0;
+ virtual RID fixed_material_create() = 0;
enum FixedMaterialParam {
@@ -261,16 +250,14 @@ public:
FIXED_MATERIAL_FLAG_MAX,
};
+ virtual void fixed_material_set_flag(RID p_material, FixedMaterialFlags p_flag, bool p_enabled) = 0;
+ virtual bool fixed_material_get_flag(RID p_material, FixedMaterialFlags p_flag) const = 0;
- virtual void fixed_material_set_flag(RID p_material, FixedMaterialFlags p_flag, bool p_enabled)=0;
- virtual bool fixed_material_get_flag(RID p_material, FixedMaterialFlags p_flag) const=0;
-
- virtual void fixed_material_set_param(RID p_material, FixedMaterialParam p_parameter, const Variant& p_value)=0;
- virtual Variant fixed_material_get_param(RID p_material,FixedMaterialParam p_parameter) const=0;
-
- virtual void fixed_material_set_texture(RID p_material,FixedMaterialParam p_parameter, RID p_texture)=0;
- virtual RID fixed_material_get_texture(RID p_material,FixedMaterialParam p_parameter) const=0;
+ virtual void fixed_material_set_param(RID p_material, FixedMaterialParam p_parameter, const Variant &p_value) = 0;
+ virtual Variant fixed_material_get_param(RID p_material, FixedMaterialParam p_parameter) const = 0;
+ virtual void fixed_material_set_texture(RID p_material, FixedMaterialParam p_parameter, RID p_texture) = 0;
+ virtual RID fixed_material_get_texture(RID p_material, FixedMaterialParam p_parameter) const = 0;
enum FixedMaterialLightShader {
@@ -281,134 +268,132 @@ public:
};
+ virtual void fixed_material_set_light_shader(RID p_material, FixedMaterialLightShader p_shader) = 0;
+ virtual FixedMaterialLightShader fixed_material_get_light_shader(RID p_material) const = 0;
- virtual void fixed_material_set_light_shader(RID p_material,FixedMaterialLightShader p_shader)=0;
- virtual FixedMaterialLightShader fixed_material_get_light_shader(RID p_material) const=0;
-
- virtual void fixed_material_set_texcoord_mode(RID p_material,FixedMaterialParam p_parameter, FixedMaterialTexCoordMode p_mode)=0;
- virtual FixedMaterialTexCoordMode fixed_material_get_texcoord_mode(RID p_material,FixedMaterialParam p_parameter) const=0;
+ virtual void fixed_material_set_texcoord_mode(RID p_material, FixedMaterialParam p_parameter, FixedMaterialTexCoordMode p_mode) = 0;
+ virtual FixedMaterialTexCoordMode fixed_material_get_texcoord_mode(RID p_material, FixedMaterialParam p_parameter) const = 0;
- virtual void fixed_material_set_uv_transform(RID p_material,const Transform& p_transform)=0;
- virtual Transform fixed_material_get_uv_transform(RID p_material) const=0;
+ virtual void fixed_material_set_uv_transform(RID p_material, const Transform &p_transform) = 0;
+ virtual Transform fixed_material_get_uv_transform(RID p_material) const = 0;
- virtual void fixed_material_set_point_size(RID p_material,float p_size)=0;
- virtual float fixed_material_get_point_size(RID p_material) const=0;
+ virtual void fixed_material_set_point_size(RID p_material, float p_size) = 0;
+ virtual float fixed_material_get_point_size(RID p_material) const = 0;
/* MESH API */
enum ArrayType {
- ARRAY_VERTEX=0,
- ARRAY_NORMAL=1,
- ARRAY_TANGENT=2,
- ARRAY_COLOR=3,
- ARRAY_TEX_UV=4,
- ARRAY_TEX_UV2=5,
- ARRAY_BONES=6,
- ARRAY_WEIGHTS=7,
- ARRAY_INDEX=8,
- ARRAY_MAX=9
+ ARRAY_VERTEX = 0,
+ ARRAY_NORMAL = 1,
+ ARRAY_TANGENT = 2,
+ ARRAY_COLOR = 3,
+ ARRAY_TEX_UV = 4,
+ ARRAY_TEX_UV2 = 5,
+ ARRAY_BONES = 6,
+ ARRAY_WEIGHTS = 7,
+ ARRAY_INDEX = 8,
+ ARRAY_MAX = 9
};
enum ArrayFormat {
/* ARRAY FORMAT FLAGS */
- ARRAY_FORMAT_VERTEX=1<<ARRAY_VERTEX, // mandatory
- ARRAY_FORMAT_NORMAL=1<<ARRAY_NORMAL,
- ARRAY_FORMAT_TANGENT=1<<ARRAY_TANGENT,
- ARRAY_FORMAT_COLOR=1<<ARRAY_COLOR,
- ARRAY_FORMAT_TEX_UV=1<<ARRAY_TEX_UV,
- ARRAY_FORMAT_TEX_UV2=1<<ARRAY_TEX_UV2,
- ARRAY_FORMAT_BONES=1<<ARRAY_BONES,
- ARRAY_FORMAT_WEIGHTS=1<<ARRAY_WEIGHTS,
- ARRAY_FORMAT_INDEX=1<<ARRAY_INDEX,
+ ARRAY_FORMAT_VERTEX = 1 << ARRAY_VERTEX, // mandatory
+ ARRAY_FORMAT_NORMAL = 1 << ARRAY_NORMAL,
+ ARRAY_FORMAT_TANGENT = 1 << ARRAY_TANGENT,
+ ARRAY_FORMAT_COLOR = 1 << ARRAY_COLOR,
+ ARRAY_FORMAT_TEX_UV = 1 << ARRAY_TEX_UV,
+ ARRAY_FORMAT_TEX_UV2 = 1 << ARRAY_TEX_UV2,
+ ARRAY_FORMAT_BONES = 1 << ARRAY_BONES,
+ ARRAY_FORMAT_WEIGHTS = 1 << ARRAY_WEIGHTS,
+ ARRAY_FORMAT_INDEX = 1 << ARRAY_INDEX,
};
enum PrimitiveType {
- PRIMITIVE_POINTS=0,
- PRIMITIVE_LINES=1,
- PRIMITIVE_LINE_STRIP=2,
- PRIMITIVE_LINE_LOOP=3,
- PRIMITIVE_TRIANGLES=4,
- PRIMITIVE_TRIANGLE_STRIP=5,
- PRIMITIVE_TRIANGLE_FAN=6,
- PRIMITIVE_MAX=7,
+ PRIMITIVE_POINTS = 0,
+ PRIMITIVE_LINES = 1,
+ PRIMITIVE_LINE_STRIP = 2,
+ PRIMITIVE_LINE_LOOP = 3,
+ PRIMITIVE_TRIANGLES = 4,
+ PRIMITIVE_TRIANGLE_STRIP = 5,
+ PRIMITIVE_TRIANGLE_FAN = 6,
+ PRIMITIVE_MAX = 7,
};
- virtual RID mesh_create()=0;
+ virtual RID mesh_create() = 0;
- virtual void mesh_add_surface(RID p_mesh,PrimitiveType p_primitive,const Array& p_arrays,const Array& p_blend_shapes=Array(),bool p_alpha_sort=false)=0;
- virtual Array mesh_get_surface_arrays(RID p_mesh,int p_surface) const=0;
- virtual Array mesh_get_surface_morph_arrays(RID p_mesh,int p_surface) const=0;
+ virtual void mesh_add_surface(RID p_mesh, PrimitiveType p_primitive, const Array &p_arrays, const Array &p_blend_shapes = Array(), bool p_alpha_sort = false) = 0;
+ virtual Array mesh_get_surface_arrays(RID p_mesh, int p_surface) const = 0;
+ virtual Array mesh_get_surface_morph_arrays(RID p_mesh, int p_surface) const = 0;
-
- virtual void mesh_add_custom_surface(RID p_mesh,const Variant& p_dat)=0; //this is used by each platform in a different way
- virtual void mesh_set_morph_target_count(RID p_mesh,int p_amount)=0;
- virtual int mesh_get_morph_target_count(RID p_mesh) const=0;
+ virtual void mesh_add_custom_surface(RID p_mesh, const Variant &p_dat) = 0; //this is used by each platform in a different way
+ virtual void mesh_set_morph_target_count(RID p_mesh, int p_amount) = 0;
+ virtual int mesh_get_morph_target_count(RID p_mesh) const = 0;
enum MorphTargetMode {
MORPH_MODE_NORMALIZED,
MORPH_MODE_RELATIVE,
};
- virtual void mesh_set_morph_target_mode(RID p_mesh,MorphTargetMode p_mode)=0;
- virtual MorphTargetMode mesh_get_morph_target_mode(RID p_mesh) const=0;
+ virtual void mesh_set_morph_target_mode(RID p_mesh, MorphTargetMode p_mode) = 0;
+ virtual MorphTargetMode mesh_get_morph_target_mode(RID p_mesh) const = 0;
- virtual void mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material,bool p_owned=false)=0;
- virtual RID mesh_surface_get_material(RID p_mesh, int p_surface) const=0;
+ virtual void mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material, bool p_owned = false) = 0;
+ virtual RID mesh_surface_get_material(RID p_mesh, int p_surface) const = 0;
- virtual int mesh_surface_get_array_len(RID p_mesh, int p_surface) const=0;
- virtual int mesh_surface_get_array_index_len(RID p_mesh, int p_surface) const=0;
- virtual uint32_t mesh_surface_get_format(RID p_mesh, int p_surface) const=0;
- virtual PrimitiveType mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const=0;
+ virtual int mesh_surface_get_array_len(RID p_mesh, int p_surface) const = 0;
+ virtual int mesh_surface_get_array_index_len(RID p_mesh, int p_surface) const = 0;
+ virtual uint32_t mesh_surface_get_format(RID p_mesh, int p_surface) const = 0;
+ virtual PrimitiveType mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const = 0;
- virtual void mesh_remove_surface(RID p_mesh,int p_index)=0;
- virtual int mesh_get_surface_count(RID p_mesh) const=0;
+ virtual void mesh_remove_surface(RID p_mesh, int p_index) = 0;
+ virtual int mesh_get_surface_count(RID p_mesh) const = 0;
- virtual void mesh_set_custom_aabb(RID p_mesh,const AABB& p_aabb)=0;
- virtual AABB mesh_get_custom_aabb(RID p_mesh) const=0;
+ virtual void mesh_set_custom_aabb(RID p_mesh, const AABB &p_aabb) = 0;
+ virtual AABB mesh_get_custom_aabb(RID p_mesh) const = 0;
- virtual void mesh_clear(RID p_mesh)=0;
+ virtual void mesh_clear(RID p_mesh) = 0;
/* MULTIMESH API */
- virtual RID multimesh_create()=0;
+ virtual RID multimesh_create() = 0;
- virtual void multimesh_set_instance_count(RID p_multimesh,int p_count)=0;
- virtual int multimesh_get_instance_count(RID p_multimesh) const=0;
+ virtual void multimesh_set_instance_count(RID p_multimesh, int p_count) = 0;
+ virtual int multimesh_get_instance_count(RID p_multimesh) const = 0;
- virtual void multimesh_set_mesh(RID p_multimesh,RID p_mesh)=0;
- virtual void multimesh_set_aabb(RID p_multimesh,const AABB& p_aabb)=0;
- virtual void multimesh_instance_set_transform(RID p_multimesh,int p_index,const Transform& p_transform)=0;
- virtual void multimesh_instance_set_color(RID p_multimesh,int p_index,const Color& p_color)=0;
+ virtual void multimesh_set_mesh(RID p_multimesh, RID p_mesh) = 0;
+ virtual void multimesh_set_aabb(RID p_multimesh, const AABB &p_aabb) = 0;
+ virtual void multimesh_instance_set_transform(RID p_multimesh, int p_index, const Transform &p_transform) = 0;
+ virtual void multimesh_instance_set_color(RID p_multimesh, int p_index, const Color &p_color) = 0;
- virtual RID multimesh_get_mesh(RID p_multimesh) const=0;
- virtual AABB multimesh_get_aabb(RID p_multimesh,const AABB& p_aabb) const=0;;
+ virtual RID multimesh_get_mesh(RID p_multimesh) const = 0;
+ virtual AABB multimesh_get_aabb(RID p_multimesh, const AABB &p_aabb) const = 0;
+ ;
- virtual Transform multimesh_instance_get_transform(RID p_multimesh,int p_index) const=0;
- virtual Color multimesh_instance_get_color(RID p_multimesh,int p_index) const=0;
+ virtual Transform multimesh_instance_get_transform(RID p_multimesh, int p_index) const = 0;
+ virtual Color multimesh_instance_get_color(RID p_multimesh, int p_index) const = 0;
- virtual void multimesh_set_visible_instances(RID p_multimesh,int p_visible)=0;
- virtual int multimesh_get_visible_instances(RID p_multimesh) const=0;
+ virtual void multimesh_set_visible_instances(RID p_multimesh, int p_visible) = 0;
+ virtual int multimesh_get_visible_instances(RID p_multimesh) const = 0;
/* IMMEDIATE API */
- virtual RID immediate_create()=0;
- virtual void immediate_begin(RID p_immediate,PrimitiveType p_rimitive,RID p_texture=RID())=0;
- virtual void immediate_vertex(RID p_immediate,const Vector3& p_vertex)=0;
- virtual void immediate_normal(RID p_immediate,const Vector3& p_normal)=0;
- virtual void immediate_tangent(RID p_immediate,const Plane& p_tangent)=0;
- virtual void immediate_color(RID p_immediate,const Color& p_color)=0;
- virtual void immediate_uv(RID p_immediate,const Vector2& tex_uv)=0;
- virtual void immediate_uv2(RID p_immediate,const Vector2& tex_uv)=0;
- virtual void immediate_end(RID p_immediate)=0;
- virtual void immediate_clear(RID p_immediate)=0;
- virtual void immediate_set_material(RID p_immediate,RID p_material)=0;
- virtual RID immediate_get_material(RID p_immediate) const=0;
-
+ virtual RID immediate_create() = 0;
+ virtual void immediate_begin(RID p_immediate, PrimitiveType p_rimitive, RID p_texture = RID()) = 0;
+ virtual void immediate_vertex(RID p_immediate, const Vector3 &p_vertex) = 0;
+ virtual void immediate_normal(RID p_immediate, const Vector3 &p_normal) = 0;
+ virtual void immediate_tangent(RID p_immediate, const Plane &p_tangent) = 0;
+ virtual void immediate_color(RID p_immediate, const Color &p_color) = 0;
+ virtual void immediate_uv(RID p_immediate, const Vector2 &tex_uv) = 0;
+ virtual void immediate_uv2(RID p_immediate, const Vector2 &tex_uv) = 0;
+ virtual void immediate_end(RID p_immediate) = 0;
+ virtual void immediate_clear(RID p_immediate) = 0;
+ virtual void immediate_set_material(RID p_immediate, RID p_material) = 0;
+ virtual RID immediate_get_material(RID p_immediate) const = 0;
/* PARTICLES API */
- virtual RID particles_create()=0;
+ virtual RID particles_create() = 0;
enum ParticleVariable {
PARTICLE_LIFETIME,
@@ -428,59 +413,59 @@ public:
PARTICLE_VAR_MAX
};
- virtual void particles_set_amount(RID p_particles, int p_amount)=0;
- virtual int particles_get_amount(RID p_particles) const=0;
+ virtual void particles_set_amount(RID p_particles, int p_amount) = 0;
+ virtual int particles_get_amount(RID p_particles) const = 0;
- virtual void particles_set_emitting(RID p_particles, bool p_emitting)=0;
- virtual bool particles_is_emitting(RID p_particles) const=0;
+ virtual void particles_set_emitting(RID p_particles, bool p_emitting) = 0;
+ virtual bool particles_is_emitting(RID p_particles) const = 0;
- virtual void particles_set_visibility_aabb(RID p_particles, const AABB& p_visibility)=0;
- virtual AABB particles_get_visibility_aabb(RID p_particles) const=0;
+ virtual void particles_set_visibility_aabb(RID p_particles, const AABB &p_visibility) = 0;
+ virtual AABB particles_get_visibility_aabb(RID p_particles) const = 0;
- virtual void particles_set_emission_half_extents(RID p_particles, const Vector3& p_half_extents)=0;
- virtual Vector3 particles_get_emission_half_extents(RID p_particles) const=0;
+ virtual void particles_set_emission_half_extents(RID p_particles, const Vector3 &p_half_extents) = 0;
+ virtual Vector3 particles_get_emission_half_extents(RID p_particles) const = 0;
- virtual void particles_set_emission_base_velocity(RID p_particles, const Vector3& p_base_velocity)=0;
- virtual Vector3 particles_get_emission_base_velocity(RID p_particles) const=0;
+ virtual void particles_set_emission_base_velocity(RID p_particles, const Vector3 &p_base_velocity) = 0;
+ virtual Vector3 particles_get_emission_base_velocity(RID p_particles) const = 0;
- virtual void particles_set_emission_points(RID p_particles, const DVector<Vector3>& p_points)=0;
- virtual DVector<Vector3> particles_get_emission_points(RID p_particles) const=0;
+ virtual void particles_set_emission_points(RID p_particles, const DVector<Vector3> &p_points) = 0;
+ virtual DVector<Vector3> particles_get_emission_points(RID p_particles) const = 0;
- virtual void particles_set_gravity_normal(RID p_particles, const Vector3& p_normal)=0;
- virtual Vector3 particles_get_gravity_normal(RID p_particles) const=0;
+ virtual void particles_set_gravity_normal(RID p_particles, const Vector3 &p_normal) = 0;
+ virtual Vector3 particles_get_gravity_normal(RID p_particles) const = 0;
- virtual void particles_set_variable(RID p_particles, ParticleVariable p_variable,float p_value)=0;
- virtual float particles_get_variable(RID p_particles, ParticleVariable p_variable) const=0;
+ virtual void particles_set_variable(RID p_particles, ParticleVariable p_variable, float p_value) = 0;
+ virtual float particles_get_variable(RID p_particles, ParticleVariable p_variable) const = 0;
- virtual void particles_set_randomness(RID p_particles, ParticleVariable p_variable,float p_randomness)=0;
- virtual float particles_get_randomness(RID p_particles, ParticleVariable p_variable) const=0;
+ virtual void particles_set_randomness(RID p_particles, ParticleVariable p_variable, float p_randomness) = 0;
+ virtual float particles_get_randomness(RID p_particles, ParticleVariable p_variable) const = 0;
- virtual void particles_set_color_phases(RID p_particles, int p_phases)=0;
- virtual int particles_get_color_phases(RID p_particles) const=0;
+ virtual void particles_set_color_phases(RID p_particles, int p_phases) = 0;
+ virtual int particles_get_color_phases(RID p_particles) const = 0;
- virtual void particles_set_color_phase_pos(RID p_particles, int p_phase, float p_pos)=0;
- virtual float particles_get_color_phase_pos(RID p_particles, int p_phase) const=0;
+ virtual void particles_set_color_phase_pos(RID p_particles, int p_phase, float p_pos) = 0;
+ virtual float particles_get_color_phase_pos(RID p_particles, int p_phase) const = 0;
- virtual void particles_set_color_phase_color(RID p_particles, int p_phase, const Color& p_color)=0;
- virtual Color particles_get_color_phase_color(RID p_particles, int p_phase) const=0;
+ virtual void particles_set_color_phase_color(RID p_particles, int p_phase, const Color &p_color) = 0;
+ virtual Color particles_get_color_phase_color(RID p_particles, int p_phase) const = 0;
- virtual void particles_set_attractors(RID p_particles, int p_attractors)=0;
- virtual int particles_get_attractors(RID p_particles) const=0;
+ virtual void particles_set_attractors(RID p_particles, int p_attractors) = 0;
+ virtual int particles_get_attractors(RID p_particles) const = 0;
- virtual void particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3& p_pos)=0;
- virtual Vector3 particles_get_attractor_pos(RID p_particles,int p_attractor) const=0;
+ virtual void particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3 &p_pos) = 0;
+ virtual Vector3 particles_get_attractor_pos(RID p_particles, int p_attractor) const = 0;
- virtual void particles_set_attractor_strength(RID p_particles, int p_attractor, float p_force)=0;
- virtual float particles_get_attractor_strength(RID p_particles,int p_attractor) const=0;
+ virtual void particles_set_attractor_strength(RID p_particles, int p_attractor, float p_force) = 0;
+ virtual float particles_get_attractor_strength(RID p_particles, int p_attractor) const = 0;
- virtual void particles_set_material(RID p_particles, RID p_material,bool p_owned=false)=0;
- virtual RID particles_get_material(RID p_particles) const=0;
+ virtual void particles_set_material(RID p_particles, RID p_material, bool p_owned = false) = 0;
+ virtual RID particles_get_material(RID p_particles) const = 0;
- virtual void particles_set_height_from_velocity(RID p_particles, bool p_enable)=0;
- virtual bool particles_has_height_from_velocity(RID p_particles) const=0;
+ virtual void particles_set_height_from_velocity(RID p_particles, bool p_enable) = 0;
+ virtual bool particles_has_height_from_velocity(RID p_particles) const = 0;
- virtual void particles_set_use_local_coordinates(RID p_particles, bool p_enable)=0;
- virtual bool particles_is_using_local_coordinates(RID p_particles) const=0;
+ virtual void particles_set_use_local_coordinates(RID p_particles, bool p_enable) = 0;
+ virtual bool particles_is_using_local_coordinates(RID p_particles) const = 0;
/* Light API */
@@ -510,23 +495,23 @@ public:
LIGHT_PARAM_MAX
};
- virtual RID light_create(LightType p_type)=0;
- virtual LightType light_get_type(RID p_light) const=0;
+ virtual RID light_create(LightType p_type) = 0;
+ virtual LightType light_get_type(RID p_light) const = 0;
- virtual void light_set_color(RID p_light,LightColor p_type, const Color& p_color)=0;
- virtual Color light_get_color(RID p_light,LightColor p_type) const=0;
+ virtual void light_set_color(RID p_light, LightColor p_type, const Color &p_color) = 0;
+ virtual Color light_get_color(RID p_light, LightColor p_type) const = 0;
- virtual void light_set_shadow(RID p_light,bool p_enabled)=0;
- virtual bool light_has_shadow(RID p_light) const=0;
+ virtual void light_set_shadow(RID p_light, bool p_enabled) = 0;
+ virtual bool light_has_shadow(RID p_light) const = 0;
- virtual void light_set_volumetric(RID p_light,bool p_enabled)=0;
- virtual bool light_is_volumetric(RID p_light) const=0;
+ virtual void light_set_volumetric(RID p_light, bool p_enabled) = 0;
+ virtual bool light_is_volumetric(RID p_light) const = 0;
- virtual void light_set_projector(RID p_light,RID p_texture)=0;
- virtual RID light_get_projector(RID p_light) const=0;
+ virtual void light_set_projector(RID p_light, RID p_texture) = 0;
+ virtual RID light_get_projector(RID p_light) const = 0;
- virtual void light_set_param(RID p_light, LightParam p_var, float p_value)=0;
- virtual float light_get_param(RID p_light, LightParam p_var) const=0;
+ virtual void light_set_param(RID p_light, LightParam p_var, float p_value) = 0;
+ virtual float light_get_param(RID p_light, LightParam p_var) const = 0;
enum LightOp {
@@ -534,8 +519,8 @@ public:
LIGHT_OPERATOR_SUB
};
- virtual void light_set_operator(RID p_light,LightOp p_op)=0;
- virtual LightOp light_get_operator(RID p_light) const=0;
+ virtual void light_set_operator(RID p_light, LightOp p_op) = 0;
+ virtual LightOp light_get_operator(RID p_light) const = 0;
// omni light
enum LightOmniShadowMode {
@@ -544,8 +529,8 @@ public:
LIGHT_OMNI_SHADOW_CUBEMAP
};
- virtual void light_omni_set_shadow_mode(RID p_light,LightOmniShadowMode p_mode)=0;
- virtual LightOmniShadowMode light_omni_get_shadow_mode(RID p_light) const=0;
+ virtual void light_omni_set_shadow_mode(RID p_light, LightOmniShadowMode p_mode) = 0;
+ virtual LightOmniShadowMode light_omni_get_shadow_mode(RID p_light) const = 0;
// directional light
enum LightDirectionalShadowMode {
@@ -555,8 +540,8 @@ public:
LIGHT_DIRECTIONAL_SHADOW_PARALLEL_4_SPLITS
};
- virtual void light_directional_set_shadow_mode(RID p_light,LightDirectionalShadowMode p_mode)=0;
- virtual LightDirectionalShadowMode light_directional_get_shadow_mode(RID p_light) const=0;
+ virtual void light_directional_set_shadow_mode(RID p_light, LightDirectionalShadowMode p_mode) = 0;
+ virtual LightDirectionalShadowMode light_directional_get_shadow_mode(RID p_light) const = 0;
enum LightDirectionalShadowParam {
@@ -565,81 +550,80 @@ public:
LIGHT_DIRECTIONAL_SHADOW_PARAM_PSSM_ZOFFSET_SCALE,
};
- virtual void light_directional_set_shadow_param(RID p_light,LightDirectionalShadowParam p_param, float p_value)=0;
- virtual float light_directional_get_shadow_param(RID p_light,LightDirectionalShadowParam p_param) const=0;
+ virtual void light_directional_set_shadow_param(RID p_light, LightDirectionalShadowParam p_param, float p_value) = 0;
+ virtual float light_directional_get_shadow_param(RID p_light, LightDirectionalShadowParam p_param) const = 0;
//@TODO fallof model and all that stuff
/* SKELETON API */
- virtual RID skeleton_create()=0;
- virtual void skeleton_resize(RID p_skeleton,int p_bones)=0;
- virtual int skeleton_get_bone_count(RID p_skeleton) const=0;
- virtual void skeleton_bone_set_transform(RID p_skeleton,int p_bone, const Transform& p_transform)=0;
- virtual Transform skeleton_bone_get_transform(RID p_skeleton,int p_bone)=0;
+ virtual RID skeleton_create() = 0;
+ virtual void skeleton_resize(RID p_skeleton, int p_bones) = 0;
+ virtual int skeleton_get_bone_count(RID p_skeleton) const = 0;
+ virtual void skeleton_bone_set_transform(RID p_skeleton, int p_bone, const Transform &p_transform) = 0;
+ virtual Transform skeleton_bone_get_transform(RID p_skeleton, int p_bone) = 0;
/* ROOM API */
- virtual RID room_create()=0;
- virtual void room_set_bounds(RID p_room, const BSP_Tree& p_bounds)=0;
- virtual BSP_Tree room_get_bounds(RID p_room) const=0;
+ virtual RID room_create() = 0;
+ virtual void room_set_bounds(RID p_room, const BSP_Tree &p_bounds) = 0;
+ virtual BSP_Tree room_get_bounds(RID p_room) const = 0;
/* PORTAL API */
// portals are only (x/y) points, forming a convex shape, which its clockwise
// order points outside. (z is 0);
- virtual RID portal_create()=0;
- virtual void portal_set_shape(RID p_portal, const Vector<Point2>& p_shape)=0;
- virtual Vector<Point2> portal_get_shape(RID p_portal) const=0;
- virtual void portal_set_enabled(RID p_portal, bool p_enabled)=0;
- virtual bool portal_is_enabled(RID p_portal) const=0;
- virtual void portal_set_disable_distance(RID p_portal, float p_distance)=0;
- virtual float portal_get_disable_distance(RID p_portal) const=0;
- virtual void portal_set_disabled_color(RID p_portal, const Color& p_color)=0;
- virtual Color portal_get_disabled_color(RID p_portal) const=0;
- virtual void portal_set_connect_range(RID p_portal, float p_range) =0;
- virtual float portal_get_connect_range(RID p_portal) const =0;
-
+ virtual RID portal_create() = 0;
+ virtual void portal_set_shape(RID p_portal, const Vector<Point2> &p_shape) = 0;
+ virtual Vector<Point2> portal_get_shape(RID p_portal) const = 0;
+ virtual void portal_set_enabled(RID p_portal, bool p_enabled) = 0;
+ virtual bool portal_is_enabled(RID p_portal) const = 0;
+ virtual void portal_set_disable_distance(RID p_portal, float p_distance) = 0;
+ virtual float portal_get_disable_distance(RID p_portal) const = 0;
+ virtual void portal_set_disabled_color(RID p_portal, const Color &p_color) = 0;
+ virtual Color portal_get_disabled_color(RID p_portal) const = 0;
+ virtual void portal_set_connect_range(RID p_portal, float p_range) = 0;
+ virtual float portal_get_connect_range(RID p_portal) const = 0;
/* BAKED LIGHT API */
- virtual RID baked_light_create()=0;
+ virtual RID baked_light_create() = 0;
enum BakedLightMode {
BAKED_LIGHT_OCTREE,
BAKED_LIGHT_LIGHTMAPS
};
- virtual void baked_light_set_mode(RID p_baked_light,BakedLightMode p_mode)=0;
- virtual BakedLightMode baked_light_get_mode(RID p_baked_light) const=0;
+ virtual void baked_light_set_mode(RID p_baked_light, BakedLightMode p_mode) = 0;
+ virtual BakedLightMode baked_light_get_mode(RID p_baked_light) const = 0;
- virtual void baked_light_set_octree(RID p_baked_light,const DVector<uint8_t> p_octree)=0;
- virtual DVector<uint8_t> baked_light_get_octree(RID p_baked_light) const=0;
+ virtual void baked_light_set_octree(RID p_baked_light, const DVector<uint8_t> p_octree) = 0;
+ virtual DVector<uint8_t> baked_light_get_octree(RID p_baked_light) const = 0;
- virtual void baked_light_set_light(RID p_baked_light,const DVector<uint8_t> p_light)=0;
- virtual DVector<uint8_t> baked_light_get_light(RID p_baked_light) const=0;
+ virtual void baked_light_set_light(RID p_baked_light, const DVector<uint8_t> p_light) = 0;
+ virtual DVector<uint8_t> baked_light_get_light(RID p_baked_light) const = 0;
- virtual void baked_light_set_sampler_octree(RID p_baked_light,const DVector<int> &p_sampler)=0;
- virtual DVector<int> baked_light_get_sampler_octree(RID p_baked_light) const=0;
+ virtual void baked_light_set_sampler_octree(RID p_baked_light, const DVector<int> &p_sampler) = 0;
+ virtual DVector<int> baked_light_get_sampler_octree(RID p_baked_light) const = 0;
- virtual void baked_light_set_lightmap_multiplier(RID p_baked_light,float p_multiplier)=0;
- virtual float baked_light_get_lightmap_multiplier(RID p_baked_light) const=0;
+ virtual void baked_light_set_lightmap_multiplier(RID p_baked_light, float p_multiplier) = 0;
+ virtual float baked_light_get_lightmap_multiplier(RID p_baked_light) const = 0;
- virtual void baked_light_add_lightmap(RID p_baked_light,const RID p_texture,int p_id)=0;
- virtual void baked_light_clear_lightmaps(RID p_baked_light)=0;
+ virtual void baked_light_add_lightmap(RID p_baked_light, const RID p_texture, int p_id) = 0;
+ virtual void baked_light_clear_lightmaps(RID p_baked_light) = 0;
- virtual void baked_light_set_realtime_color_enabled(RID p_baked_light, const bool p_enabled)=0;
- virtual bool baked_light_get_realtime_color_enabled(RID p_baked_light) const=0;
+ virtual void baked_light_set_realtime_color_enabled(RID p_baked_light, const bool p_enabled) = 0;
+ virtual bool baked_light_get_realtime_color_enabled(RID p_baked_light) const = 0;
- virtual void baked_light_set_realtime_color(RID p_baked_light, const Color& p_color)=0;
- virtual Color baked_light_get_realtime_color(RID p_baked_light) const=0;
+ virtual void baked_light_set_realtime_color(RID p_baked_light, const Color &p_color) = 0;
+ virtual Color baked_light_get_realtime_color(RID p_baked_light) const = 0;
virtual void baked_light_set_realtime_energy(RID p_baked_light, const float p_energy) = 0;
virtual float baked_light_get_realtime_energy(RID p_baked_light) const = 0;
/* BAKED LIGHT SAMPLER */
- virtual RID baked_light_sampler_create()=0;
+ virtual RID baked_light_sampler_create() = 0;
enum BakedLightSamplerParam {
BAKED_LIGHT_SAMPLER_RADIUS,
@@ -649,29 +633,29 @@ public:
BAKED_LIGHT_SAMPLER_MAX
};
- virtual void baked_light_sampler_set_param(RID p_baked_light_sampler,BakedLightSamplerParam p_param,float p_value)=0;
- virtual float baked_light_sampler_get_param(RID p_baked_light_sampler,BakedLightSamplerParam p_param) const=0;
+ virtual void baked_light_sampler_set_param(RID p_baked_light_sampler, BakedLightSamplerParam p_param, float p_value) = 0;
+ virtual float baked_light_sampler_get_param(RID p_baked_light_sampler, BakedLightSamplerParam p_param) const = 0;
- virtual void baked_light_sampler_set_resolution(RID p_baked_light_sampler,int p_resolution)=0;
- virtual int baked_light_sampler_get_resolution(RID p_baked_light_sampler) const=0;
+ virtual void baked_light_sampler_set_resolution(RID p_baked_light_sampler, int p_resolution) = 0;
+ virtual int baked_light_sampler_get_resolution(RID p_baked_light_sampler) const = 0;
/* CAMERA API */
- virtual RID camera_create()=0;
- virtual void camera_set_perspective(RID p_camera,float p_fovy_degrees, float p_z_near, float p_z_far)=0;
- virtual void camera_set_orthogonal(RID p_camera,float p_size, float p_z_near, float p_z_far)=0;
- virtual void camera_set_transform(RID p_camera,const Transform& p_transform)=0;
+ virtual RID camera_create() = 0;
+ virtual void camera_set_perspective(RID p_camera, float p_fovy_degrees, float p_z_near, float p_z_far) = 0;
+ virtual void camera_set_orthogonal(RID p_camera, float p_size, float p_z_near, float p_z_far) = 0;
+ virtual void camera_set_transform(RID p_camera, const Transform &p_transform) = 0;
- virtual void camera_set_visible_layers(RID p_camera,uint32_t p_layers)=0;
- virtual uint32_t camera_get_visible_layers(RID p_camera) const=0;
+ virtual void camera_set_visible_layers(RID p_camera, uint32_t p_layers) = 0;
+ virtual uint32_t camera_get_visible_layers(RID p_camera) const = 0;
- virtual void camera_set_environment(RID p_camera,RID p_env)=0;
- virtual RID camera_get_environment(RID p_camera) const=0;
+ virtual void camera_set_environment(RID p_camera, RID p_env) = 0;
+ virtual RID camera_get_environment(RID p_camera) const = 0;
- virtual void camera_set_use_vertical_aspect(RID p_camera,bool p_enable)=0;
- virtual bool camera_is_using_vertical_aspect(RID p_camera,bool p_enable) const=0;
+ virtual void camera_set_use_vertical_aspect(RID p_camera, bool p_enable) = 0;
+ virtual bool camera_is_using_vertical_aspect(RID p_camera, bool p_enable) const = 0;
-/*
+ /*
virtual void camera_add_layer(RID p_camera);
virtual void camera_layer_move_up(RID p_camera,int p_layer);
virtual void camera_layer_move_down(RID p_camera,int p_layer);
@@ -689,14 +673,13 @@ public:
*/
-
/* VIEWPORT API */
- virtual RID viewport_create()=0;
+ virtual RID viewport_create() = 0;
- virtual void viewport_attach_to_screen(RID p_viewport,int p_screen=0)=0;
- virtual void viewport_detach(RID p_viewport)=0;
- virtual void viewport_set_render_target_to_screen_rect(RID p_viewport,const Rect2& p_rect)=0;
+ virtual void viewport_attach_to_screen(RID p_viewport, int p_screen = 0) = 0;
+ virtual void viewport_detach(RID p_viewport) = 0;
+ virtual void viewport_set_render_target_to_screen_rect(RID p_viewport, const Rect2 &p_rect) = 0;
enum RenderTargetUpdateMode {
RENDER_TARGET_UPDATE_DISABLED,
@@ -705,56 +688,50 @@ public:
RENDER_TARGET_UPDATE_ALWAYS
};
+ virtual void viewport_set_as_render_target(RID p_viewport, bool p_enable) = 0;
+ virtual void viewport_set_render_target_update_mode(RID p_viewport, RenderTargetUpdateMode p_mode) = 0;
+ virtual RenderTargetUpdateMode viewport_get_render_target_update_mode(RID p_viewport) const = 0;
+ virtual RID viewport_get_render_target_texture(RID p_viewport) const = 0;
+ virtual void viewport_set_render_target_vflip(RID p_viewport, bool p_enable) = 0;
+ virtual bool viewport_get_render_target_vflip(RID p_viewport) const = 0;
+ virtual void viewport_set_render_target_clear_on_new_frame(RID p_viewport, bool p_enable) = 0;
+ virtual bool viewport_get_render_target_clear_on_new_frame(RID p_viewport) const = 0;
+ virtual void viewport_render_target_clear(RID p_viewport) = 0;
- virtual void viewport_set_as_render_target(RID p_viewport,bool p_enable)=0;
- virtual void viewport_set_render_target_update_mode(RID p_viewport,RenderTargetUpdateMode p_mode)=0;
- virtual RenderTargetUpdateMode viewport_get_render_target_update_mode(RID p_viewport) const=0;
- virtual RID viewport_get_render_target_texture(RID p_viewport) const=0;
- virtual void viewport_set_render_target_vflip(RID p_viewport,bool p_enable)=0;
- virtual bool viewport_get_render_target_vflip(RID p_viewport) const=0;
- virtual void viewport_set_render_target_clear_on_new_frame(RID p_viewport,bool p_enable)=0;
- virtual bool viewport_get_render_target_clear_on_new_frame(RID p_viewport) const=0;
- virtual void viewport_render_target_clear(RID p_viewport)=0;
-
- virtual void viewport_queue_screen_capture(RID p_viewport)=0;
- virtual Image viewport_get_screen_capture(RID p_viewport) const=0;
-
-
+ virtual void viewport_queue_screen_capture(RID p_viewport) = 0;
+ virtual Image viewport_get_screen_capture(RID p_viewport) const = 0;
struct ViewportRect {
- int x,y,width,height;
- ViewportRect() { x=y=width=height=0; }
+ int x, y, width, height;
+ ViewportRect() { x = y = width = height = 0; }
};
- virtual void viewport_set_rect(RID p_viewport,const ViewportRect& p_rect)=0;
- virtual ViewportRect viewport_get_rect(RID p_viewport) const=0;
-
- virtual void viewport_set_hide_scenario(RID p_viewport,bool p_hide)=0;
- virtual void viewport_set_hide_canvas(RID p_viewport,bool p_hide)=0;
- virtual void viewport_set_disable_environment(RID p_viewport,bool p_disable)=0;
-
- virtual void viewport_attach_camera(RID p_viewport,RID p_camera)=0;
- virtual void viewport_set_scenario(RID p_viewport,RID p_scenario)=0;
- virtual RID viewport_get_attached_camera(RID p_viewport) const=0;
- virtual RID viewport_get_scenario(RID p_viewport) const=0;
- virtual void viewport_attach_canvas(RID p_viewport,RID p_canvas)=0;
- virtual void viewport_remove_canvas(RID p_viewport,RID p_canvas)=0;
- virtual void viewport_set_canvas_transform(RID p_viewport,RID p_canvas,const Matrix32& p_offset)=0;
- virtual Matrix32 viewport_get_canvas_transform(RID p_viewport,RID p_canvas) const=0;
- virtual void viewport_set_transparent_background(RID p_viewport,bool p_enabled)=0;
- virtual bool viewport_has_transparent_background(RID p_viewport) const=0;
+ virtual void viewport_set_rect(RID p_viewport, const ViewportRect &p_rect) = 0;
+ virtual ViewportRect viewport_get_rect(RID p_viewport) const = 0;
+ virtual void viewport_set_hide_scenario(RID p_viewport, bool p_hide) = 0;
+ virtual void viewport_set_hide_canvas(RID p_viewport, bool p_hide) = 0;
+ virtual void viewport_set_disable_environment(RID p_viewport, bool p_disable) = 0;
- virtual void viewport_set_global_canvas_transform(RID p_viewport,const Matrix32& p_transform)=0;
- virtual Matrix32 viewport_get_global_canvas_transform(RID p_viewport) const=0;
- virtual void viewport_set_canvas_layer(RID p_viewport,RID p_canvas,int p_layer)=0;
-
+ virtual void viewport_attach_camera(RID p_viewport, RID p_camera) = 0;
+ virtual void viewport_set_scenario(RID p_viewport, RID p_scenario) = 0;
+ virtual RID viewport_get_attached_camera(RID p_viewport) const = 0;
+ virtual RID viewport_get_scenario(RID p_viewport) const = 0;
+ virtual void viewport_attach_canvas(RID p_viewport, RID p_canvas) = 0;
+ virtual void viewport_remove_canvas(RID p_viewport, RID p_canvas) = 0;
+ virtual void viewport_set_canvas_transform(RID p_viewport, RID p_canvas, const Matrix32 &p_offset) = 0;
+ virtual Matrix32 viewport_get_canvas_transform(RID p_viewport, RID p_canvas) const = 0;
+ virtual void viewport_set_transparent_background(RID p_viewport, bool p_enabled) = 0;
+ virtual bool viewport_has_transparent_background(RID p_viewport) const = 0;
+ virtual void viewport_set_global_canvas_transform(RID p_viewport, const Matrix32 &p_transform) = 0;
+ virtual Matrix32 viewport_get_global_canvas_transform(RID p_viewport) const = 0;
+ virtual void viewport_set_canvas_layer(RID p_viewport, RID p_canvas, int p_layer) = 0;
/* ENVIRONMENT API */
- virtual RID environment_create()=0;
+ virtual RID environment_create() = 0;
enum EnvironmentBG {
@@ -767,8 +744,8 @@ public:
ENV_BG_MAX
};
- virtual void environment_set_background(RID p_env,EnvironmentBG p_bg)=0;
- virtual EnvironmentBG environment_get_background(RID p_env) const=0;
+ virtual void environment_set_background(RID p_env, EnvironmentBG p_bg) = 0;
+ virtual EnvironmentBG environment_get_background(RID p_env) const = 0;
enum EnvironmentBGParam {
@@ -782,9 +759,8 @@ public:
ENV_BG_PARAM_MAX
};
-
- virtual void environment_set_background_param(RID p_env,EnvironmentBGParam p_param, const Variant& p_value)=0;
- virtual Variant environment_get_background_param(RID p_env,EnvironmentBGParam p_param) const=0;
+ virtual void environment_set_background_param(RID p_env, EnvironmentBGParam p_param, const Variant &p_value) = 0;
+ virtual Variant environment_get_background_param(RID p_env, EnvironmentBGParam p_param) const = 0;
enum EnvironmentFx {
ENV_FX_AMBIENT_LIGHT,
@@ -798,10 +774,8 @@ public:
ENV_FX_MAX
};
-
-
- virtual void environment_set_enable_fx(RID p_env,EnvironmentFx p_effect,bool p_enabled)=0;
- virtual bool environment_is_fx_enabled(RID p_env,EnvironmentFx p_mode) const=0;
+ virtual void environment_set_enable_fx(RID p_env, EnvironmentFx p_effect, bool p_enabled) = 0;
+ virtual bool environment_is_fx_enabled(RID p_env, EnvironmentFx p_mode) const = 0;
enum EnvironmentFxBlurBlendMode {
ENV_FX_BLUR_BLEND_MODE_ADDITIVE,
@@ -847,16 +821,12 @@ public:
ENV_FX_PARAM_MAX
};
- virtual void environment_fx_set_param(RID p_env,EnvironmentFxParam p_effect,const Variant& p_param)=0;
- virtual Variant environment_fx_get_param(RID p_env,EnvironmentFxParam p_effect) const=0;
-
+ virtual void environment_fx_set_param(RID p_env, EnvironmentFxParam p_effect, const Variant &p_param) = 0;
+ virtual Variant environment_fx_get_param(RID p_env, EnvironmentFxParam p_effect) const = 0;
/* SCENARIO API */
-
-
-
- virtual RID scenario_create()=0;
+ virtual RID scenario_create() = 0;
enum ScenarioDebugMode {
SCENARIO_DEBUG_DISABLED,
@@ -866,12 +836,10 @@ public:
};
-
- virtual void scenario_set_debug(RID p_scenario,ScenarioDebugMode p_debug_mode)=0;
- virtual void scenario_set_environment(RID p_scenario, RID p_environment)=0;
- virtual RID scenario_get_environment(RID p_scenario, RID p_environment) const=0;
- virtual void scenario_set_fallback_environment(RID p_scenario, RID p_environment)=0;
-
+ virtual void scenario_set_debug(RID p_scenario, ScenarioDebugMode p_debug_mode) = 0;
+ virtual void scenario_set_environment(RID p_scenario, RID p_environment) = 0;
+ virtual RID scenario_get_environment(RID p_scenario, RID p_environment) const = 0;
+ virtual void scenario_set_fallback_environment(RID p_scenario, RID p_environment) = 0;
/* INSTANCING API */
@@ -888,55 +856,52 @@ public:
INSTANCE_BAKED_LIGHT,
INSTANCE_BAKED_LIGHT_SAMPLER,
- INSTANCE_GEOMETRY_MASK=(1<<INSTANCE_MESH)|(1<<INSTANCE_MULTIMESH)|(1<<INSTANCE_IMMEDIATE)|(1<<INSTANCE_PARTICLES)
+ INSTANCE_GEOMETRY_MASK = (1 << INSTANCE_MESH) | (1 << INSTANCE_MULTIMESH) | (1 << INSTANCE_IMMEDIATE) | (1 << INSTANCE_PARTICLES)
};
-
-
virtual RID instance_create2(RID p_base, RID p_scenario);
-// virtual RID instance_create(RID p_base,RID p_scenario)=0; // from can be mesh, light, area and portal so far.
- virtual RID instance_create()=0; // from can be mesh, light, poly, area and portal so far.
-
- virtual void instance_set_base(RID p_instance, RID p_base)=0; // from can be mesh, light, poly, area and portal so far.
- virtual RID instance_get_base(RID p_instance) const=0;
+ // virtual RID instance_create(RID p_base,RID p_scenario)=0; // from can be mesh, light, area and portal so far.
+ virtual RID instance_create() = 0; // from can be mesh, light, poly, area and portal so far.
- virtual void instance_set_scenario(RID p_instance, RID p_scenario)=0; // from can be mesh, light, poly, area and portal so far.
- virtual RID instance_get_scenario(RID p_instance) const=0;
+ virtual void instance_set_base(RID p_instance, RID p_base) = 0; // from can be mesh, light, poly, area and portal so far.
+ virtual RID instance_get_base(RID p_instance) const = 0;
- virtual void instance_set_layer_mask(RID p_instance, uint32_t p_mask)=0;
- virtual uint32_t instance_get_layer_mask(RID p_instance) const=0;
+ virtual void instance_set_scenario(RID p_instance, RID p_scenario) = 0; // from can be mesh, light, poly, area and portal so far.
+ virtual RID instance_get_scenario(RID p_instance) const = 0;
- virtual AABB instance_get_base_aabb(RID p_instance) const=0;
+ virtual void instance_set_layer_mask(RID p_instance, uint32_t p_mask) = 0;
+ virtual uint32_t instance_get_layer_mask(RID p_instance) const = 0;
- virtual void instance_set_transform(RID p_instance, const Transform& p_transform)=0;
- virtual Transform instance_get_transform(RID p_instance) const=0;
+ virtual AABB instance_get_base_aabb(RID p_instance) const = 0;
+ virtual void instance_set_transform(RID p_instance, const Transform &p_transform) = 0;
+ virtual Transform instance_get_transform(RID p_instance) const = 0;
- virtual void instance_attach_object_instance_ID(RID p_instance,uint32_t p_ID)=0;
- virtual uint32_t instance_get_object_instance_ID(RID p_instance) const=0;
+ virtual void instance_attach_object_instance_ID(RID p_instance, uint32_t p_ID) = 0;
+ virtual uint32_t instance_get_object_instance_ID(RID p_instance) const = 0;
- virtual void instance_set_morph_target_weight(RID p_instance,int p_shape, float p_weight)=0;
- virtual float instance_get_morph_target_weight(RID p_instance,int p_shape) const=0;
+ virtual void instance_set_morph_target_weight(RID p_instance, int p_shape, float p_weight) = 0;
+ virtual float instance_get_morph_target_weight(RID p_instance, int p_shape) const = 0;
- virtual void instance_set_surface_material(RID p_instance,int p_surface, RID p_material)=0;
+ virtual void instance_set_surface_material(RID p_instance, int p_surface, RID p_material) = 0;
- virtual void instance_attach_skeleton(RID p_instance,RID p_skeleton)=0;
- virtual RID instance_get_skeleton(RID p_instance) const=0;
+ virtual void instance_attach_skeleton(RID p_instance, RID p_skeleton) = 0;
+ virtual RID instance_get_skeleton(RID p_instance) const = 0;
- virtual void instance_set_exterior( RID p_instance, bool p_enabled )=0;
- virtual bool instance_is_exterior( RID p_instance) const=0;
+ virtual void instance_set_exterior(RID p_instance, bool p_enabled) = 0;
+ virtual bool instance_is_exterior(RID p_instance) const = 0;
- virtual void instance_set_room( RID p_instance, RID p_room )=0;
- virtual RID instance_get_room( RID p_instance ) const =0;
+ virtual void instance_set_room(RID p_instance, RID p_room) = 0;
+ virtual RID instance_get_room(RID p_instance) const = 0;
- virtual void instance_set_extra_visibility_margin( RID p_instance, real_t p_margin )=0;
- virtual real_t instance_get_extra_visibility_margin( RID p_instance ) const =0;
+ virtual void instance_set_extra_visibility_margin(RID p_instance, real_t p_margin) = 0;
+ virtual real_t instance_get_extra_visibility_margin(RID p_instance) const = 0;
// don't use these in a game!
- virtual Vector<RID> instances_cull_aabb(const AABB& p_aabb, RID p_scenario=RID()) const=0;
- virtual Vector<RID> instances_cull_ray(const Vector3& p_from, const Vector3& p_to, RID p_scenario=RID()) const=0;
- virtual Vector<RID> instances_cull_convex(const Vector<Plane>& p_convex, RID p_scenario=RID()) const=0;
+ virtual Vector<RID> instances_cull_aabb(const AABB &p_aabb, RID p_scenario = RID()) const = 0;
+ virtual Vector<RID> instances_cull_ray(const Vector3 &p_from, const Vector3 &p_to, RID p_scenario = RID()) const = 0;
+ virtual Vector<RID> instances_cull_convex(const Vector<Plane> &p_convex, RID p_scenario = RID()) const = 0;
enum InstanceFlags {
INSTANCE_FLAG_VISIBLE,
@@ -957,108 +922,105 @@ public:
SHADOW_CASTING_SETTING_SHADOWS_ONLY,
};
- virtual void instance_geometry_set_flag(RID p_instance,InstanceFlags p_flags,bool p_enabled)=0;
- virtual bool instance_geometry_get_flag(RID p_instance,InstanceFlags p_flags) const=0;
+ virtual void instance_geometry_set_flag(RID p_instance, InstanceFlags p_flags, bool p_enabled) = 0;
+ virtual bool instance_geometry_get_flag(RID p_instance, InstanceFlags p_flags) const = 0;
virtual void instance_geometry_set_cast_shadows_setting(RID p_instance, ShadowCastingSetting p_shadow_casting_setting) = 0;
virtual ShadowCastingSetting instance_geometry_get_cast_shadows_setting(RID p_instance) const = 0;
- virtual void instance_geometry_set_material_override(RID p_instance, RID p_material)=0;
- virtual RID instance_geometry_get_material_override(RID p_instance) const=0;
+ virtual void instance_geometry_set_material_override(RID p_instance, RID p_material) = 0;
+ virtual RID instance_geometry_get_material_override(RID p_instance) const = 0;
- virtual void instance_geometry_set_draw_range(RID p_instance,float p_min,float p_max)=0;
- virtual float instance_geometry_get_draw_range_max(RID p_instance) const=0;
- virtual float instance_geometry_get_draw_range_min(RID p_instance) const=0;
+ virtual void instance_geometry_set_draw_range(RID p_instance, float p_min, float p_max) = 0;
+ virtual float instance_geometry_get_draw_range_max(RID p_instance) const = 0;
+ virtual float instance_geometry_get_draw_range_min(RID p_instance) const = 0;
- virtual void instance_geometry_set_baked_light(RID p_instance,RID p_baked_light)=0;
- virtual RID instance_geometry_get_baked_light(RID p_instance) const=0;
+ virtual void instance_geometry_set_baked_light(RID p_instance, RID p_baked_light) = 0;
+ virtual RID instance_geometry_get_baked_light(RID p_instance) const = 0;
- virtual void instance_geometry_set_baked_light_sampler(RID p_instance,RID p_baked_light_sampler)=0;
- virtual RID instance_geometry_get_baked_light_sampler(RID p_instance) const=0;
+ virtual void instance_geometry_set_baked_light_sampler(RID p_instance, RID p_baked_light_sampler) = 0;
+ virtual RID instance_geometry_get_baked_light_sampler(RID p_instance) const = 0;
- virtual void instance_geometry_set_baked_light_texture_index(RID p_instance,int p_tex_id)=0;
- virtual int instance_geometry_get_baked_light_texture_index(RID p_instance) const=0;
+ virtual void instance_geometry_set_baked_light_texture_index(RID p_instance, int p_tex_id) = 0;
+ virtual int instance_geometry_get_baked_light_texture_index(RID p_instance) const = 0;
-
- virtual void instance_light_set_enabled(RID p_instance,bool p_enabled)=0;
- virtual bool instance_light_is_enabled(RID p_instance) const=0;
+ virtual void instance_light_set_enabled(RID p_instance, bool p_enabled) = 0;
+ virtual bool instance_light_is_enabled(RID p_instance) const = 0;
/* CANVAS (2D) */
- virtual RID canvas_create()=0;
- virtual void canvas_set_item_mirroring(RID p_canvas,RID p_item,const Point2& p_mirroring)=0;
- virtual Point2 canvas_get_item_mirroring(RID p_canvas,RID p_item) const=0;
- virtual void canvas_set_modulate(RID p_canvas,const Color& p_color)=0;
-
+ virtual RID canvas_create() = 0;
+ virtual void canvas_set_item_mirroring(RID p_canvas, RID p_item, const Point2 &p_mirroring) = 0;
+ virtual Point2 canvas_get_item_mirroring(RID p_canvas, RID p_item) const = 0;
+ virtual void canvas_set_modulate(RID p_canvas, const Color &p_color) = 0;
+ virtual RID canvas_item_create() = 0;
+ virtual void canvas_item_set_parent(RID p_item, RID p_parent) = 0;
+ virtual RID canvas_item_get_parent(RID p_canvas_item) const = 0;
- virtual RID canvas_item_create()=0;
- virtual void canvas_item_set_parent(RID p_item,RID p_parent)=0;
- virtual RID canvas_item_get_parent(RID p_canvas_item) const=0;
+ virtual void canvas_item_set_visible(RID p_item, bool p_visible) = 0;
+ virtual bool canvas_item_is_visible(RID p_item) const = 0;
- virtual void canvas_item_set_visible(RID p_item,bool p_visible)=0;
- virtual bool canvas_item_is_visible(RID p_item) const=0;
+ virtual void canvas_item_set_light_mask(RID p_item, int p_mask) = 0;
- virtual void canvas_item_set_light_mask(RID p_item,int p_mask)=0;
+ virtual void canvas_item_set_blend_mode(RID p_canvas_item, MaterialBlendMode p_blend) = 0;
- virtual void canvas_item_set_blend_mode(RID p_canvas_item,MaterialBlendMode p_blend)=0;
-
- virtual void canvas_item_attach_viewport(RID p_item, RID p_viewport)=0;
+ virtual void canvas_item_attach_viewport(RID p_item, RID p_viewport) = 0;
//virtual void canvas_item_set_rect(RID p_item, const Rect2& p_rect)=0;
- virtual void canvas_item_set_transform(RID p_item, const Matrix32& p_transform)=0;
- virtual void canvas_item_set_clip(RID p_item, bool p_clip)=0;
- virtual void canvas_item_set_distance_field_mode(RID p_item, bool p_enable)=0;
- virtual void canvas_item_set_custom_rect(RID p_item, bool p_custom_rect,const Rect2& p_rect=Rect2())=0;
- virtual void canvas_item_set_opacity(RID p_item, float p_opacity)=0;
- virtual float canvas_item_get_opacity(RID p_item, float p_opacity) const=0;
+ virtual void canvas_item_set_transform(RID p_item, const Matrix32 &p_transform) = 0;
+ virtual void canvas_item_set_clip(RID p_item, bool p_clip) = 0;
+ virtual void canvas_item_set_distance_field_mode(RID p_item, bool p_enable) = 0;
+ virtual void canvas_item_set_custom_rect(RID p_item, bool p_custom_rect, const Rect2 &p_rect = Rect2()) = 0;
+ virtual void canvas_item_set_opacity(RID p_item, float p_opacity) = 0;
+ virtual float canvas_item_get_opacity(RID p_item, float p_opacity) const = 0;
- virtual void canvas_item_set_self_opacity(RID p_item, float p_self_opacity)=0;
- virtual float canvas_item_get_self_opacity(RID p_item, float p_self_opacity) const=0;
+ virtual void canvas_item_set_self_opacity(RID p_item, float p_self_opacity) = 0;
+ virtual float canvas_item_get_self_opacity(RID p_item, float p_self_opacity) const = 0;
- virtual void canvas_item_set_on_top(RID p_item, bool p_on_top)=0;
- virtual bool canvas_item_is_on_top(RID p_item) const=0;
+ virtual void canvas_item_set_on_top(RID p_item, bool p_on_top) = 0;
+ virtual bool canvas_item_is_on_top(RID p_item) const = 0;
- virtual void canvas_item_add_line(RID p_item, const Point2& p_from, const Point2& p_to,const Color& p_color,float p_width=1.0)=0;
- virtual void canvas_item_add_rect(RID p_item, const Rect2& p_rect, const Color& p_color)=0;
- virtual void canvas_item_add_circle(RID p_item, const Point2& p_pos, float p_radius,const Color& p_color)=0;
- virtual void canvas_item_add_texture_rect(RID p_item, const Rect2& p_rect, RID p_texture,bool p_tile=false,const Color& p_modulate=Color(1,1,1),bool p_transpose=false)=0;
- virtual void canvas_item_add_texture_rect_region(RID p_item, const Rect2& p_rect, RID p_texture,const Rect2& p_src_rect,const Color& p_modulate=Color(1,1,1),bool p_transpose=false)=0;
- virtual void canvas_item_add_style_box(RID p_item, const Rect2& p_rect, const Rect2& p_source, RID p_texture,const Vector2& p_topleft, const Vector2& p_bottomright, bool p_draw_center=true,const Color& p_modulate=Color(1,1,1))=0;
- virtual void canvas_item_add_primitive(RID p_item, const Vector<Point2>& p_points, const Vector<Color>& p_colors,const Vector<Point2>& p_uvs, RID p_texture,float p_width=1.0)=0;
- virtual void canvas_item_add_polygon(RID p_item, const Vector<Point2>& p_points, const Vector<Color>& p_colors,const Vector<Point2>& p_uvs=Vector<Point2>(), RID p_texture=RID())=0;
- virtual void canvas_item_add_triangle_array(RID p_item, const Vector<int>& p_indices, const Vector<Point2>& p_points, const Vector<Color>& p_colors,const Vector<Point2>& p_uvs=Vector<Point2>(), RID p_texture=RID(), int p_count=-1)=0;
- virtual void canvas_item_add_triangle_array_ptr(RID p_item, int p_count, const int* p_indices, const Point2* p_points, const Color* p_colors,const Point2* p_uvs=NULL, RID p_texture=RID())=0;
- virtual void canvas_item_add_set_transform(RID p_item,const Matrix32& p_transform)=0;
- virtual void canvas_item_add_set_blend_mode(RID p_item, MaterialBlendMode p_blend)=0;
- virtual void canvas_item_add_clip_ignore(RID p_item, bool p_ignore)=0;
- virtual void canvas_item_set_sort_children_by_y(RID p_item, bool p_enable)=0;
- virtual void canvas_item_set_z(RID p_item, int p_z)=0;
- virtual void canvas_item_set_z_as_relative_to_parent(RID p_item, bool p_enable)=0;
- virtual void canvas_item_set_copy_to_backbuffer(RID p_item, bool p_enable,const Rect2& p_rect)=0;
+ virtual void canvas_item_add_line(RID p_item, const Point2 &p_from, const Point2 &p_to, const Color &p_color, float p_width = 1.0) = 0;
+ virtual void canvas_item_add_rect(RID p_item, const Rect2 &p_rect, const Color &p_color) = 0;
+ virtual void canvas_item_add_circle(RID p_item, const Point2 &p_pos, float p_radius, const Color &p_color) = 0;
+ virtual void canvas_item_add_texture_rect(RID p_item, const Rect2 &p_rect, RID p_texture, bool p_tile = false, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false) = 0;
+ virtual void canvas_item_add_texture_rect_region(RID p_item, const Rect2 &p_rect, RID p_texture, const Rect2 &p_src_rect, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false) = 0;
+ virtual void canvas_item_add_style_box(RID p_item, const Rect2 &p_rect, const Rect2 &p_source, RID p_texture, const Vector2 &p_topleft, const Vector2 &p_bottomright, bool p_draw_center = true, const Color &p_modulate = Color(1, 1, 1)) = 0;
+ virtual void canvas_item_add_primitive(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs, RID p_texture, float p_width = 1.0) = 0;
+ virtual void canvas_item_add_polygon(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs = Vector<Point2>(), RID p_texture = RID()) = 0;
+ virtual void canvas_item_add_triangle_array(RID p_item, const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs = Vector<Point2>(), RID p_texture = RID(), int p_count = -1) = 0;
+ virtual void canvas_item_add_triangle_array_ptr(RID p_item, int p_count, const int *p_indices, const Point2 *p_points, const Color *p_colors, const Point2 *p_uvs = NULL, RID p_texture = RID()) = 0;
+ virtual void canvas_item_add_set_transform(RID p_item, const Matrix32 &p_transform) = 0;
+ virtual void canvas_item_add_set_blend_mode(RID p_item, MaterialBlendMode p_blend) = 0;
+ virtual void canvas_item_add_clip_ignore(RID p_item, bool p_ignore) = 0;
+ virtual void canvas_item_set_sort_children_by_y(RID p_item, bool p_enable) = 0;
+ virtual void canvas_item_set_z(RID p_item, int p_z) = 0;
+ virtual void canvas_item_set_z_as_relative_to_parent(RID p_item, bool p_enable) = 0;
+ virtual void canvas_item_set_copy_to_backbuffer(RID p_item, bool p_enable, const Rect2 &p_rect) = 0;
- virtual void canvas_item_clear(RID p_item)=0;
- virtual void canvas_item_raise(RID p_item)=0;
+ virtual void canvas_item_clear(RID p_item) = 0;
+ virtual void canvas_item_raise(RID p_item) = 0;
- virtual void canvas_item_set_material(RID p_item, RID p_material)=0;
+ virtual void canvas_item_set_material(RID p_item, RID p_material) = 0;
- virtual void canvas_item_set_use_parent_material(RID p_item, bool p_enable)=0;
+ virtual void canvas_item_set_use_parent_material(RID p_item, bool p_enable) = 0;
- virtual RID canvas_light_create()=0;
- virtual void canvas_light_attach_to_canvas(RID p_light,RID p_canvas)=0;
- virtual void canvas_light_set_enabled(RID p_light, bool p_enabled)=0;
- virtual void canvas_light_set_scale(RID p_light, float p_scale)=0;
- virtual void canvas_light_set_transform(RID p_light, const Matrix32& p_transform)=0;
- virtual void canvas_light_set_texture(RID p_light, RID p_texture)=0;
- virtual void canvas_light_set_texture_offset(RID p_light, const Vector2& p_offset)=0;
- virtual void canvas_light_set_color(RID p_light, const Color& p_color)=0;
- virtual void canvas_light_set_height(RID p_light, float p_height)=0;
- virtual void canvas_light_set_energy(RID p_light, float p_energy)=0;
- virtual void canvas_light_set_z_range(RID p_light, int p_min_z,int p_max_z)=0;
- virtual void canvas_light_set_layer_range(RID p_light, int p_min_layer,int p_max_layer)=0;
- virtual void canvas_light_set_item_mask(RID p_light, int p_mask)=0;
- virtual void canvas_light_set_item_shadow_mask(RID p_light, int p_mask)=0;
+ virtual RID canvas_light_create() = 0;
+ virtual void canvas_light_attach_to_canvas(RID p_light, RID p_canvas) = 0;
+ virtual void canvas_light_set_enabled(RID p_light, bool p_enabled) = 0;
+ virtual void canvas_light_set_scale(RID p_light, float p_scale) = 0;
+ virtual void canvas_light_set_transform(RID p_light, const Matrix32 &p_transform) = 0;
+ virtual void canvas_light_set_texture(RID p_light, RID p_texture) = 0;
+ virtual void canvas_light_set_texture_offset(RID p_light, const Vector2 &p_offset) = 0;
+ virtual void canvas_light_set_color(RID p_light, const Color &p_color) = 0;
+ virtual void canvas_light_set_height(RID p_light, float p_height) = 0;
+ virtual void canvas_light_set_energy(RID p_light, float p_energy) = 0;
+ virtual void canvas_light_set_z_range(RID p_light, int p_min_z, int p_max_z) = 0;
+ virtual void canvas_light_set_layer_range(RID p_light, int p_min_layer, int p_max_layer) = 0;
+ virtual void canvas_light_set_item_mask(RID p_light, int p_mask) = 0;
+ virtual void canvas_light_set_item_shadow_mask(RID p_light, int p_mask) = 0;
enum CanvasLightMode {
CANVAS_LIGHT_MODE_ADD,
@@ -1067,38 +1029,35 @@ public:
CANVAS_LIGHT_MODE_MASK,
};
- virtual void canvas_light_set_mode(RID p_light, CanvasLightMode p_mode)=0;
- virtual void canvas_light_set_shadow_enabled(RID p_light, bool p_enabled)=0;
- virtual void canvas_light_set_shadow_buffer_size(RID p_light, int p_size)=0;
- virtual void canvas_light_set_shadow_esm_multiplier(RID p_light, float p_multiplier)=0;
- virtual void canvas_light_set_shadow_color(RID p_light, const Color& p_color)=0;
-
-
+ virtual void canvas_light_set_mode(RID p_light, CanvasLightMode p_mode) = 0;
+ virtual void canvas_light_set_shadow_enabled(RID p_light, bool p_enabled) = 0;
+ virtual void canvas_light_set_shadow_buffer_size(RID p_light, int p_size) = 0;
+ virtual void canvas_light_set_shadow_esm_multiplier(RID p_light, float p_multiplier) = 0;
+ virtual void canvas_light_set_shadow_color(RID p_light, const Color &p_color) = 0;
- virtual RID canvas_light_occluder_create()=0;
- virtual void canvas_light_occluder_attach_to_canvas(RID p_occluder,RID p_canvas)=0;
- virtual void canvas_light_occluder_set_enabled(RID p_occluder,bool p_enabled)=0;
- virtual void canvas_light_occluder_set_polygon(RID p_occluder,RID p_polygon)=0;
- virtual void canvas_light_occluder_set_transform(RID p_occluder,const Matrix32& p_xform)=0;
- virtual void canvas_light_occluder_set_light_mask(RID p_occluder,int p_mask)=0;
+ virtual RID canvas_light_occluder_create() = 0;
+ virtual void canvas_light_occluder_attach_to_canvas(RID p_occluder, RID p_canvas) = 0;
+ virtual void canvas_light_occluder_set_enabled(RID p_occluder, bool p_enabled) = 0;
+ virtual void canvas_light_occluder_set_polygon(RID p_occluder, RID p_polygon) = 0;
+ virtual void canvas_light_occluder_set_transform(RID p_occluder, const Matrix32 &p_xform) = 0;
+ virtual void canvas_light_occluder_set_light_mask(RID p_occluder, int p_mask) = 0;
- virtual RID canvas_occluder_polygon_create()=0;
- virtual void canvas_occluder_polygon_set_shape(RID p_occluder_polygon,const DVector<Vector2>& p_shape,bool p_closed)=0;
- virtual void canvas_occluder_polygon_set_shape_as_lines(RID p_occluder_polygon,const DVector<Vector2>& p_shape)=0;
+ virtual RID canvas_occluder_polygon_create() = 0;
+ virtual void canvas_occluder_polygon_set_shape(RID p_occluder_polygon, const DVector<Vector2> &p_shape, bool p_closed) = 0;
+ virtual void canvas_occluder_polygon_set_shape_as_lines(RID p_occluder_polygon, const DVector<Vector2> &p_shape) = 0;
enum CanvasOccluderPolygonCullMode {
CANVAS_OCCLUDER_POLYGON_CULL_DISABLED,
CANVAS_OCCLUDER_POLYGON_CULL_CLOCKWISE,
CANVAS_OCCLUDER_POLYGON_CULL_COUNTER_CLOCKWISE,
};
- virtual void canvas_occluder_polygon_set_cull_mode(RID p_occluder_polygon,CanvasOccluderPolygonCullMode p_mode)=0;
+ virtual void canvas_occluder_polygon_set_cull_mode(RID p_occluder_polygon, CanvasOccluderPolygonCullMode p_mode) = 0;
/* CANVAS ITEM MATERIAL */
- virtual RID canvas_item_material_create()=0;
- virtual void canvas_item_material_set_shader(RID p_material, RID p_shader)=0;
- virtual void canvas_item_material_set_shader_param(RID p_material, const StringName& p_param, const Variant& p_value)=0;
- virtual Variant canvas_item_material_get_shader_param(RID p_material, const StringName& p_param) const=0;
-
+ virtual RID canvas_item_material_create() = 0;
+ virtual void canvas_item_material_set_shader(RID p_material, RID p_shader) = 0;
+ virtual void canvas_item_material_set_shader_param(RID p_material, const StringName &p_param, const Variant &p_value) = 0;
+ virtual Variant canvas_item_material_get_shader_param(RID p_material, const StringName &p_param) const = 0;
enum CanvasItemShadingMode {
CANVAS_ITEM_SHADING_NORMAL,
@@ -1106,41 +1065,39 @@ public:
CANVAS_ITEM_SHADING_ONLY_LIGHT,
};
- virtual void canvas_item_material_set_shading_mode(RID p_material, CanvasItemShadingMode p_mode)=0;
+ virtual void canvas_item_material_set_shading_mode(RID p_material, CanvasItemShadingMode p_mode) = 0;
/* CURSOR */
- virtual void cursor_set_rotation(float p_rotation, int p_cursor = 0)=0; // radians
- virtual void cursor_set_texture(RID p_texture, const Point2 &p_center_offset = Point2(0, 0), int p_cursor=0, const Rect2 &p_region=Rect2())=0;
- virtual void cursor_set_visible(bool p_visible, int p_cursor = 0)=0;
- virtual void cursor_set_pos(const Point2& p_pos, int p_cursor = 0)=0;
+ virtual void cursor_set_rotation(float p_rotation, int p_cursor = 0) = 0; // radians
+ virtual void cursor_set_texture(RID p_texture, const Point2 &p_center_offset = Point2(0, 0), int p_cursor = 0, const Rect2 &p_region = Rect2()) = 0;
+ virtual void cursor_set_visible(bool p_visible, int p_cursor = 0) = 0;
+ virtual void cursor_set_pos(const Point2 &p_pos, int p_cursor = 0) = 0;
/* BLACK BARS */
-
- virtual void black_bars_set_margins(int p_left, int p_top, int p_right, int p_bottom)=0;
- virtual void black_bars_set_images(RID p_left, RID p_top, RID p_right, RID p_bottom)=0;
-
+ virtual void black_bars_set_margins(int p_left, int p_top, int p_right, int p_bottom) = 0;
+ virtual void black_bars_set_images(RID p_left, RID p_top, RID p_right, RID p_bottom) = 0;
/* FREE */
- virtual void free( RID p_rid )=0; ///< free RIDs associated with the visual server
+ virtual void free(RID p_rid) = 0; ///< free RIDs associated with the visual server
/* CUSTOM SHADING */
- virtual void custom_shade_model_set_shader(int p_model, RID p_shader)=0;
- virtual RID custom_shade_model_get_shader(int p_model) const=0;
- virtual void custom_shade_model_set_name(int p_model, const String& p_name)=0;
- virtual String custom_shade_model_get_name(int p_model) const=0;
- virtual void custom_shade_model_set_param_info(int p_model, const List<PropertyInfo>& p_info)=0;
- virtual void custom_shade_model_get_param_info(int p_model, List<PropertyInfo>* p_info) const=0;
+ virtual void custom_shade_model_set_shader(int p_model, RID p_shader) = 0;
+ virtual RID custom_shade_model_get_shader(int p_model) const = 0;
+ virtual void custom_shade_model_set_name(int p_model, const String &p_name) = 0;
+ virtual String custom_shade_model_get_name(int p_model) const = 0;
+ virtual void custom_shade_model_set_param_info(int p_model, const List<PropertyInfo> &p_info) = 0;
+ virtual void custom_shade_model_get_param_info(int p_model, List<PropertyInfo> *p_info) const = 0;
/* EVENT QUEUING */
- virtual void draw()=0;
- virtual void sync()=0;
- virtual bool has_changed() const=0;
- virtual void init()=0;
- virtual void finish()=0;
+ virtual void draw() = 0;
+ virtual void sync() = 0;
+ virtual bool has_changed() const = 0;
+ virtual void init() = 0;
+ virtual void finish() = 0;
/* STATUS INFORMATION */
@@ -1158,30 +1115,27 @@ public:
INFO_VERTEX_MEM_USED,
};
- virtual int get_render_info(RenderInfo p_info)=0;
-
+ virtual int get_render_info(RenderInfo p_info) = 0;
/* Materials for 2D on 3D */
-
- RID material_2d_get(bool p_shaded, bool p_transparent, bool p_cut_alpha,bool p_opaque_prepass);
-
+ RID material_2d_get(bool p_shaded, bool p_transparent, bool p_cut_alpha, bool p_opaque_prepass);
/* TESTING */
- virtual RID get_test_cube()=0;
+ virtual RID get_test_cube() = 0;
virtual RID get_test_texture();
virtual RID get_white_texture();
- virtual RID make_sphere_mesh(int p_lats,int p_lons,float p_radius);
+ virtual RID make_sphere_mesh(int p_lats, int p_lons, float p_radius);
- virtual void mesh_add_surface_from_mesh_data( RID p_mesh, const Geometry::MeshData& p_mesh_data);
- virtual void mesh_add_surface_from_planes( RID p_mesh, const DVector<Plane>& p_planes);
+ virtual void mesh_add_surface_from_mesh_data(RID p_mesh, const Geometry::MeshData &p_mesh_data);
+ virtual void mesh_add_surface_from_planes(RID p_mesh, const DVector<Plane> &p_planes);
- virtual void set_boot_image(const Image& p_image, const Color& p_color,bool p_scale)=0;
- virtual void set_default_clear_color(const Color& p_color)=0;
- virtual Color get_default_clear_color() const=0;
+ virtual void set_boot_image(const Image &p_image, const Color &p_color, bool p_scale) = 0;
+ virtual void set_default_clear_color(const Color &p_color) = 0;
+ virtual Color get_default_clear_color() const = 0;
enum Features {
FEATURE_SHADERS,
@@ -1189,31 +1143,30 @@ public:
FEATURE_NEEDS_RELOAD_HOOK,
};
- virtual bool has_feature(Features p_feature) const=0;
+ virtual bool has_feature(Features p_feature) const = 0;
VisualServer();
virtual ~VisualServer();
-
};
// make variant understand the enums
-VARIANT_ENUM_CAST( VisualServer::CubeMapSide );
-VARIANT_ENUM_CAST( VisualServer::TextureFlags );
-VARIANT_ENUM_CAST( VisualServer::ShaderMode );
-VARIANT_ENUM_CAST( VisualServer::MaterialFlag );
-VARIANT_ENUM_CAST( VisualServer::MaterialBlendMode );
-VARIANT_ENUM_CAST( VisualServer::ParticleVariable );
-VARIANT_ENUM_CAST( VisualServer::ArrayType );
-VARIANT_ENUM_CAST( VisualServer::ArrayFormat );
-VARIANT_ENUM_CAST( VisualServer::PrimitiveType );
-VARIANT_ENUM_CAST( VisualServer::LightType );
-VARIANT_ENUM_CAST( VisualServer::LightColor );
-VARIANT_ENUM_CAST( VisualServer::LightParam );
-VARIANT_ENUM_CAST( VisualServer::ScenarioDebugMode );
-VARIANT_ENUM_CAST( VisualServer::InstanceType );
-VARIANT_ENUM_CAST( VisualServer::RenderInfo );
-VARIANT_ENUM_CAST( VisualServer::MipMapPolicy );
+VARIANT_ENUM_CAST(VisualServer::CubeMapSide);
+VARIANT_ENUM_CAST(VisualServer::TextureFlags);
+VARIANT_ENUM_CAST(VisualServer::ShaderMode);
+VARIANT_ENUM_CAST(VisualServer::MaterialFlag);
+VARIANT_ENUM_CAST(VisualServer::MaterialBlendMode);
+VARIANT_ENUM_CAST(VisualServer::ParticleVariable);
+VARIANT_ENUM_CAST(VisualServer::ArrayType);
+VARIANT_ENUM_CAST(VisualServer::ArrayFormat);
+VARIANT_ENUM_CAST(VisualServer::PrimitiveType);
+VARIANT_ENUM_CAST(VisualServer::LightType);
+VARIANT_ENUM_CAST(VisualServer::LightColor);
+VARIANT_ENUM_CAST(VisualServer::LightParam);
+VARIANT_ENUM_CAST(VisualServer::ScenarioDebugMode);
+VARIANT_ENUM_CAST(VisualServer::InstanceType);
+VARIANT_ENUM_CAST(VisualServer::RenderInfo);
+VARIANT_ENUM_CAST(VisualServer::MipMapPolicy);
//typedef VisualServer VS; // makes it easier to use
#define VS VisualServer