diff options
| author | Rémi Verschelde | 2017-03-19 00:36:26 +0100 |
|---|---|---|
| committer | Rémi Verschelde | 2017-03-19 00:36:26 +0100 |
| commit | f8db8a3faa30b71dca33ced38be16d3f93f43e8a (patch) | |
| tree | 3b798318132cca7eccfbca5818ab55656a2896d7 /servers | |
| parent | 1d418afe863c9e553b69174ce63aef203c46d2f0 (diff) | |
| download | godot-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 '')
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,¶ms); - - if (params.collisions>0) { + _cull_segment(0, ¶ms); + 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,¶ms); - + _cull(0, ¶ms); } 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,¶ms); @@ -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 |
