82
82
83
83
#endif
84
84
85
+ static RasterizerGLES2* _singleton = NULL ;
86
+
85
87
static const GLenum prim_type[]={GL_POINTS,GL_LINES,GL_TRIANGLES,GL_TRIANGLE_FAN};
86
88
87
89
_FORCE_INLINE_ static void _set_color_attrib (const Color& p_color) {
@@ -381,39 +383,96 @@ Image RasterizerGLES2::_get_gl_image_and_format(const Image& p_image, Image::For
381
383
} break ;
382
384
case Image::FORMAT_BC1: {
383
385
384
- r_gl_components=1 ; // doesn't matter much
385
- r_gl_format=_EXT_COMPRESSED_RGBA_S3TC_DXT1_EXT;
386
- r_compressed=true ;
386
+ if (!s3tc_supported) {
387
+
388
+ if (!image.empty ()) {
389
+ image.decompress ();
390
+ }
391
+ r_gl_components=4 ;
392
+ r_gl_format=GL_RGBA;
393
+ r_has_alpha_cache=true ;
394
+
395
+ } else {
396
+
397
+ r_gl_components=1 ; // doesn't matter much
398
+ r_gl_format=_EXT_COMPRESSED_RGBA_S3TC_DXT1_EXT;
399
+ r_compressed=true ;
400
+ };
387
401
388
402
} break ;
389
403
case Image::FORMAT_BC2: {
390
- r_gl_components=1 ; // doesn't matter much
391
- r_gl_format=_EXT_COMPRESSED_RGBA_S3TC_DXT3_EXT;
392
- r_has_alpha_cache=true ;
393
- r_compressed=true ;
404
+
405
+ if (!s3tc_supported) {
406
+
407
+ if (!image.empty ()) {
408
+ image.decompress ();
409
+ }
410
+ r_gl_components=4 ;
411
+ r_gl_format=GL_RGBA;
412
+ r_has_alpha_cache=true ;
413
+
414
+ } else {
415
+ r_gl_components=1 ; // doesn't matter much
416
+ r_gl_format=_EXT_COMPRESSED_RGBA_S3TC_DXT3_EXT;
417
+ r_has_alpha_cache=true ;
418
+ r_compressed=true ;
419
+ };
394
420
395
421
} break ;
396
422
case Image::FORMAT_BC3: {
397
423
398
- r_gl_components=1 ; // doesn't matter much
399
- r_gl_format=_EXT_COMPRESSED_RGBA_S3TC_DXT5_EXT;
400
- r_has_alpha_cache=true ;
401
- r_compressed=true ;
424
+ if (!s3tc_supported) {
425
+
426
+ if (!image.empty ()) {
427
+ image.decompress ();
428
+ }
429
+ r_gl_components=4 ;
430
+ r_gl_format=GL_RGBA;
431
+ r_has_alpha_cache=true ;
432
+
433
+ } else {
434
+ r_gl_components=1 ; // doesn't matter much
435
+ r_gl_format=_EXT_COMPRESSED_RGBA_S3TC_DXT5_EXT;
436
+ r_has_alpha_cache=true ;
437
+ r_compressed=true ;
438
+ };
402
439
403
440
} break ;
404
441
case Image::FORMAT_BC4: {
405
442
406
- r_gl_format=_EXT_COMPRESSED_RED_RGTC1;
407
- r_gl_components=1 ; // doesn't matter much
408
- r_compressed=true ;
443
+ if (!s3tc_supported) {
444
+
445
+ if (!image.empty ()) {
446
+ image.decompress ();
447
+ }
448
+ r_gl_components=4 ;
449
+ r_gl_format=GL_RGBA;
450
+ r_has_alpha_cache=true ;
451
+
452
+ } else {
453
+
454
+ r_gl_format=_EXT_COMPRESSED_RED_RGTC1;
455
+ r_gl_components=1 ; // doesn't matter much
456
+ r_compressed=true ;
457
+ };
409
458
410
459
} break ;
411
460
case Image::FORMAT_BC5: {
412
461
462
+ if (!s3tc_supported) {
413
463
414
- r_gl_format=_EXT_COMPRESSED_RG_RGTC2;
415
- r_gl_components=1 ; // doesn't matter much
416
- r_compressed=true ;
464
+ if (!image.empty ()) {
465
+ image.decompress ();
466
+ }
467
+ r_gl_components=4 ;
468
+ r_gl_format=GL_RGBA;
469
+ r_has_alpha_cache=true ;
470
+
471
+ } else {
472
+ r_gl_format=_EXT_COMPRESSED_RG_RGTC2;
473
+ r_gl_components=1 ; // doesn't matter much
474
+ r_compressed=true ;
475
+ };
417
476
} break ;
418
477
case Image::FORMAT_PVRTC2: {
419
478
@@ -1078,6 +1137,15 @@ void RasterizerGLES2::texture_set_reload_hook(RID p_texture,ObjectID p_owner,con
1078
1137
}
1079
1138
1080
1139
1140
+ GLuint RasterizerGLES2::_texture_get_name (RID p_tex) {
1141
+
1142
+ Texture * texture = texture_owner.get (p_tex);
1143
+ ERR_FAIL_COND_V (!texture, 0 );
1144
+
1145
+ return texture->tex_id ;
1146
+ };
1147
+
1148
+
1081
1149
/* SHADER API */
1082
1150
1083
1151
RID RasterizerGLES2::shader_create (VS::ShaderMode p_mode) {
@@ -3995,17 +4063,17 @@ void RasterizerGLES2::_update_shader( Shader* p_shader) const {
3995
4063
if (p_shader->mode ==VS::SHADER_MATERIAL) {
3996
4064
// print_line("setting code to id.. "+itos(p_shader->custom_code_id));
3997
4065
Vector<const char *> enablers;
3998
- if (fragment_flags.use_color_interp )
4066
+ if (fragment_flags.use_color_interp || vertex_flags. use_color_interp )
3999
4067
enablers.push_back (" #define ENABLE_COLOR_INTERP\n " );
4000
- if (fragment_flags.use_uv_interp )
4068
+ if (fragment_flags.use_uv_interp || vertex_flags. use_uv_interp )
4001
4069
enablers.push_back (" #define ENABLE_UV_INTERP\n " );
4002
- if (fragment_flags.use_uv2_interp )
4070
+ if (fragment_flags.use_uv2_interp || vertex_flags. use_uv2_interp )
4003
4071
enablers.push_back (" #define ENABLE_UV2_INTERP\n " );
4004
- if (fragment_flags.use_tangent_interp )
4072
+ if (fragment_flags.use_tangent_interp || vertex_flags. use_tangent_interp )
4005
4073
enablers.push_back (" #define ENABLE_TANGENT_INTERP\n " );
4006
- if (fragment_flags.use_var1_interp )
4074
+ if (fragment_flags.use_var1_interp || vertex_flags. use_var1_interp )
4007
4075
enablers.push_back (" #define ENABLE_VAR1_INTERP\n " );
4008
- if (fragment_flags.use_var2_interp )
4076
+ if (fragment_flags.use_var2_interp || vertex_flags. use_var2_interp )
4009
4077
enablers.push_back (" #define ENABLE_VAR2_INTERP\n " );
4010
4078
if (fragment_flags.uses_texscreen ) {
4011
4079
enablers.push_back (" #define ENABLE_TEXSCREEN\n " );
@@ -4444,6 +4512,7 @@ bool RasterizerGLES2::_setup_material(const Geometry *p_geometry,const Material
4444
4512
material_shader.set_conditional (MaterialShaderGLES2::USE_SHADOW_PCF,shadow_filter==SHADOW_FILTER_PCF5 || shadow_filter==SHADOW_FILTER_PCF13);
4445
4513
material_shader.set_conditional (MaterialShaderGLES2::USE_SHADOW_PCF_HQ,shadow_filter==SHADOW_FILTER_PCF13);
4446
4514
material_shader.set_conditional (MaterialShaderGLES2::USE_SHADOW_ESM,shadow_filter==SHADOW_FILTER_ESM);
4515
+ material_shader.set_conditional (MaterialShaderGLES2::USE_LIGHTMAP_ON_UV2,p_material->flags [VS::MATERIAL_FLAG_LIGHTMAP_ON_UV2]);
4447
4516
4448
4517
if (p_opaque_pass && p_material->depth_draw_mode ==VS::MATERIAL_DEPTH_DRAW_OPAQUE_PRE_PASS_ALPHA && p_material->shader_cache && p_material->shader_cache ->has_alpha ) {
4449
4518
@@ -4716,7 +4785,8 @@ void RasterizerGLES2::_setup_light(uint16_t p_light) {
4716
4785
4717
4786
}
4718
4787
// print_line("shadow split: "+rtos(li->shadow_split));
4719
- } else
4788
+ }
4789
+
4720
4790
material_shader.set_uniform (MaterialShaderGLES2::SHADOW_DARKENING,li->base ->vars [VS::LIGHT_PARAM_SHADOW_DARKENING]);
4721
4791
// matrix
4722
4792
@@ -5545,6 +5615,7 @@ void RasterizerGLES2::_render_list_forward(RenderList *p_render_list,const Trans
5545
5615
const Skeleton *prev_skeleton =NULL ;
5546
5616
uint8_t prev_sort_flags=0xFF ;
5547
5617
const BakedLightData *prev_baked_light=NULL ;
5618
+ RID prev_baked_light_texture;
5548
5619
5549
5620
Geometry::Type prev_geometry_type=Geometry::GEOMETRY_INVALID;
5550
5621
@@ -5561,6 +5632,7 @@ void RasterizerGLES2::_render_list_forward(RenderList *p_render_list,const Trans
5561
5632
material_shader.set_conditional (MaterialShaderGLES2::LIGHT_USE_PSSM4,false );
5562
5633
material_shader.set_conditional (MaterialShaderGLES2::SHADELESS,false );
5563
5634
material_shader.set_conditional (MaterialShaderGLES2::ENABLE_AMBIENT_OCTREE,false );
5635
+ material_shader.set_conditional (MaterialShaderGLES2::ENABLE_AMBIENT_LIGHTMAP,false );
5564
5636
// material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_TEXTURE,false);
5565
5637
5566
5638
}
@@ -5585,6 +5657,7 @@ void RasterizerGLES2::_render_list_forward(RenderList *p_render_list,const Trans
5585
5657
5586
5658
bool rebind=false ;
5587
5659
bool bind_baked_light_octree=false ;
5660
+ bool bind_baked_lightmap=false ;
5588
5661
bool additive=false ;
5589
5662
5590
5663
@@ -5704,7 +5777,7 @@ void RasterizerGLES2::_render_list_forward(RenderList *p_render_list,const Trans
5704
5777
}
5705
5778
5706
5779
material_shader.set_conditional (MaterialShaderGLES2::ENABLE_AMBIENT_OCTREE,false );
5707
- // material_shader.set_conditional(MaterialShaderGLES2::USE_AMBIENT_TEXTURE ,false);
5780
+ material_shader.set_conditional (MaterialShaderGLES2::ENABLE_AMBIENT_LIGHTMAP ,false );
5708
5781
5709
5782
if (!additive && baked_light) {
5710
5783
@@ -5722,7 +5795,37 @@ void RasterizerGLES2::_render_list_forward(RenderList *p_render_list,const Trans
5722
5795
}
5723
5796
} else if (baked_light->mode ==VS::BAKED_LIGHT_LIGHTMAPS) {
5724
5797
5725
- // material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_TEXTURE,true);
5798
+
5799
+ int lightmap_idx = e->instance ->baked_lightmap_id ;
5800
+
5801
+ material_shader.set_conditional (MaterialShaderGLES2::ENABLE_AMBIENT_LIGHTMAP,false );
5802
+ bind_baked_lightmap=false ;
5803
+
5804
+
5805
+ if (baked_light->lightmaps .has (lightmap_idx)) {
5806
+
5807
+
5808
+ RID texid = baked_light->lightmaps [lightmap_idx];
5809
+
5810
+ if (prev_baked_light!=baked_light || texid!=prev_baked_light_texture) {
5811
+
5812
+
5813
+ Texture *tex = texture_owner.get (texid);
5814
+ if (tex) {
5815
+
5816
+ glActiveTexture (GL_TEXTURE5);
5817
+ glBindTexture (tex->target ,tex->tex_id ); // bind the texture
5818
+ }
5819
+
5820
+ prev_baked_light_texture=texid;
5821
+ }
5822
+
5823
+ if (texid.is_valid ()) {
5824
+ material_shader.set_conditional (MaterialShaderGLES2::ENABLE_AMBIENT_LIGHTMAP,true );
5825
+ bind_baked_lightmap=true ;
5826
+ }
5827
+
5828
+ }
5726
5829
}
5727
5830
}
5728
5831
@@ -5793,6 +5896,14 @@ void RasterizerGLES2::_render_list_forward(RenderList *p_render_list,const Trans
5793
5896
5794
5897
}
5795
5898
5899
+ if (bind_baked_lightmap && (baked_light!=prev_baked_light || rebind)) {
5900
+
5901
+ material_shader.set_uniform (MaterialShaderGLES2::AMBIENT_LIGHTMAP, 5 );
5902
+ material_shader.set_uniform (MaterialShaderGLES2::AMBIENT_LIGHTMAP_MULTIPLIER, baked_light->lightmap_multiplier );
5903
+
5904
+ }
5905
+
5906
+
5796
5907
_set_cull (e->mirror ,p_reverse_cull);
5797
5908
5798
5909
@@ -8212,9 +8323,13 @@ void RasterizerGLES2::_update_framebuffer() {
8212
8323
8213
8324
}
8214
8325
8215
- void RasterizerGLES2::set_base_framebuffer (GLuint p_id) {
8326
+ void RasterizerGLES2::set_base_framebuffer (GLuint p_id, Vector2 p_size ) {
8216
8327
8217
8328
base_framebuffer=p_id;
8329
+
8330
+ if (p_size.x != 0 ) {
8331
+ window_size = p_size;
8332
+ };
8218
8333
}
8219
8334
8220
8335
#if 0
@@ -8753,8 +8868,15 @@ void RasterizerGLES2::set_use_framebuffers(bool p_use) {
8753
8868
use_framebuffers=p_use;
8754
8869
}
8755
8870
8871
+ RasterizerGLES2* RasterizerGLES2::get_singleton () {
8872
+
8873
+ return _singleton;
8874
+ };
8875
+
8756
8876
RasterizerGLES2::RasterizerGLES2 (bool p_compress_arrays,bool p_keep_ram_copy,bool p_default_fragment_lighting,bool p_use_reload_hooks) {
8757
8877
8878
+ _singleton = this ;
8879
+
8758
8880
keep_copies=p_keep_ram_copy;
8759
8881
use_reload_hooks=p_use_reload_hooks;
8760
8882
pack_arrays=p_compress_arrays;
0 commit comments