summaryrefslogtreecommitdiff
path: root/drivers/gles3
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2016-11-23 07:04:55 -0300
committerJuan Linietsky <reduzio@gmail.com>2016-11-23 07:04:55 -0300
commit7cf8d75cf8c49d02a72eac1d5342808526fa54ef (patch)
tree01fd616a0d376dccb227388365eba46674e151b5 /drivers/gles3
parentb72ca046051018628a31bc458dd730384ebddbe8 (diff)
WIP immediates and proper buffers swapping
Diffstat (limited to 'drivers/gles3')
-rw-r--r--drivers/gles3/rasterizer_gles3.cpp3
-rw-r--r--drivers/gles3/rasterizer_storage_gles3.cpp134
-rw-r--r--drivers/gles3/rasterizer_storage_gles3.h36
-rw-r--r--drivers/gles3/shader_gles3.cpp3
4 files changed, 161 insertions, 15 deletions
diff --git a/drivers/gles3/rasterizer_gles3.cpp b/drivers/gles3/rasterizer_gles3.cpp
index ebcedd5f05..9046028705 100644
--- a/drivers/gles3/rasterizer_gles3.cpp
+++ b/drivers/gles3/rasterizer_gles3.cpp
@@ -276,8 +276,7 @@ void RasterizerGLES3::end_frame(){
canvas->draw_generic_textured_rect(Rect2(0,0,15,15),Rect2(0,0,1,1));
#endif
- if (ContextGL::get_singleton())
- ContextGL::get_singleton()->swap_buffers();
+ OS::get_singleton()->swap_buffers();
}
void RasterizerGLES3::finalize(){
diff --git a/drivers/gles3/rasterizer_storage_gles3.cpp b/drivers/gles3/rasterizer_storage_gles3.cpp
index 60cbbc9023..a618953b86 100644
--- a/drivers/gles3/rasterizer_storage_gles3.cpp
+++ b/drivers/gles3/rasterizer_storage_gles3.cpp
@@ -3675,57 +3675,157 @@ void RasterizerStorageGLES3::update_dirty_multimeshes() {
/* IMMEDIATE API */
-RID RasterizerStorageGLES3::immediate_create(){
- return RID();
+RID RasterizerStorageGLES3::immediate_create() {
+
+ Immediate *im = memnew( Immediate );
+ return immediate_owner.make_rid(im);
+
}
-void RasterizerStorageGLES3::immediate_begin(RID p_immediate,VS::PrimitiveType p_rimitive,RID p_texture){
+
+void RasterizerStorageGLES3::immediate_begin(RID p_immediate, VS::PrimitiveType p_rimitive, RID p_texture){
+
+ Immediate *im = immediate_owner.get(p_immediate);
+ ERR_FAIL_COND(!im);
+ ERR_FAIL_COND(im->building);
+
+ Immediate::Chunk ic;
+ ic.texture=p_texture;
+ ic.primitive=p_rimitive;
+ im->chunks.push_back(ic);
+ im->mask=0;
+ im->building=true;
}
void RasterizerStorageGLES3::immediate_vertex(RID p_immediate,const Vector3& p_vertex){
+ Immediate *im = immediate_owner.get(p_immediate);
+ ERR_FAIL_COND(!im);
+ ERR_FAIL_COND(!im->building);
-}
-void RasterizerStorageGLES3::immediate_vertex_2d(RID p_immediate,const Vector3& p_vertex){
+ Immediate::Chunk *c = &im->chunks.back()->get();
+
+
+ if (c->vertices.empty() && im->chunks.size()==1) {
+ im->aabb.pos=p_vertex;
+ im->aabb.size=Vector3();
+ } else {
+ im->aabb.expand_to(p_vertex);
+ }
+
+ if (im->mask&VS::ARRAY_FORMAT_NORMAL)
+ c->normals.push_back(chunk_normal);
+ if (im->mask&VS::ARRAY_FORMAT_TANGENT)
+ c->tangents.push_back(chunk_tangent);
+ if (im->mask&VS::ARRAY_FORMAT_COLOR)
+ c->colors.push_back(chunk_color);
+ if (im->mask&VS::ARRAY_FORMAT_TEX_UV)
+ c->uvs.push_back(chunk_uv);
+ if (im->mask&VS::ARRAY_FORMAT_TEX_UV2)
+ c->uvs2.push_back(chunk_uv2);
+ im->mask|=VS::ARRAY_FORMAT_VERTEX;
+ c->vertices.push_back(p_vertex);
}
+
+
void RasterizerStorageGLES3::immediate_normal(RID p_immediate,const Vector3& p_normal){
+ Immediate *im = immediate_owner.get(p_immediate);
+ ERR_FAIL_COND(!im);
+ ERR_FAIL_COND(!im->building);
+
+ im->mask|=VS::ARRAY_FORMAT_NORMAL;
+ chunk_normal=p_normal;
}
void RasterizerStorageGLES3::immediate_tangent(RID p_immediate,const Plane& p_tangent){
+ Immediate *im = immediate_owner.get(p_immediate);
+ ERR_FAIL_COND(!im);
+ ERR_FAIL_COND(!im->building);
+
+ im->mask|=VS::ARRAY_FORMAT_TANGENT;
+ chunk_tangent=p_tangent;
}
void RasterizerStorageGLES3::immediate_color(RID p_immediate,const Color& p_color){
+ Immediate *im = immediate_owner.get(p_immediate);
+ ERR_FAIL_COND(!im);
+ ERR_FAIL_COND(!im->building);
+
+ im->mask|=VS::ARRAY_FORMAT_COLOR;
+ chunk_color=p_color;
}
void RasterizerStorageGLES3::immediate_uv(RID p_immediate,const Vector2& tex_uv){
+ Immediate *im = immediate_owner.get(p_immediate);
+ ERR_FAIL_COND(!im);
+ ERR_FAIL_COND(!im->building);
+
+ im->mask|=VS::ARRAY_FORMAT_TEX_UV;
+ chunk_uv=tex_uv;
}
void RasterizerStorageGLES3::immediate_uv2(RID p_immediate,const Vector2& tex_uv){
+ Immediate *im = immediate_owner.get(p_immediate);
+ ERR_FAIL_COND(!im);
+ ERR_FAIL_COND(!im->building);
+
+ im->mask|=VS::ARRAY_FORMAT_TEX_UV2;
+ chunk_uv2=tex_uv;
}
+
void RasterizerStorageGLES3::immediate_end(RID p_immediate){
+ Immediate *im = immediate_owner.get(p_immediate);
+ ERR_FAIL_COND(!im);
+ ERR_FAIL_COND(!im->building);
+
+ im->building=false;
+
+ im->instance_change_notify();
}
-void RasterizerStorageGLES3::immediate_clear(RID p_immediate){
+void RasterizerStorageGLES3::immediate_clear(RID p_immediate) {
+
+ Immediate *im = immediate_owner.get(p_immediate);
+ ERR_FAIL_COND(!im);
+ ERR_FAIL_COND(im->building);
+ im->chunks.clear();
+ im->instance_change_notify();
}
-void RasterizerStorageGLES3::immediate_set_material(RID p_immediate,RID p_material){
+AABB RasterizerStorageGLES3::immediate_get_aabb(RID p_immediate) const {
+ Immediate *im = immediate_owner.get(p_immediate);
+ ERR_FAIL_COND_V(!im,AABB());
+ return im->aabb;
}
-RID RasterizerStorageGLES3::immediate_get_material(RID p_immediate) const{
- return RID();
+void RasterizerStorageGLES3::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->instance_material_change_notify();
+
+}
+
+RID RasterizerStorageGLES3::immediate_get_material(RID p_immediate) const {
+
+ const Immediate *im = immediate_owner.get(p_immediate);
+ ERR_FAIL_COND_V(!im,RID());
+ return im->material;
+
}
/* SKELETON API */
@@ -4417,6 +4517,10 @@ void RasterizerStorageGLES3::instance_add_dependency(RID p_base,RasterizerScene:
inst = multimesh_owner.getornull(p_base);
ERR_FAIL_COND(!inst);
} break;
+ case VS::INSTANCE_IMMEDIATE: {
+ inst = immediate_owner.getornull(p_base);
+ ERR_FAIL_COND(!inst);
+ } break;
case VS::INSTANCE_REFLECTION_PROBE: {
inst = reflection_probe_owner.getornull(p_base);
ERR_FAIL_COND(!inst);
@@ -4452,6 +4556,10 @@ void RasterizerStorageGLES3::instance_remove_dependency(RID p_base,RasterizerSce
inst = multimesh_owner.getornull(p_base);
ERR_FAIL_COND(!inst);
} break;
+ case VS::INSTANCE_IMMEDIATE: {
+ inst = immediate_owner.getornull(p_base);
+ ERR_FAIL_COND(!inst);
+ } break;
case VS::INSTANCE_REFLECTION_PROBE: {
inst = reflection_probe_owner.getornull(p_base);
ERR_FAIL_COND(!inst);
@@ -4949,6 +5057,9 @@ VS::InstanceType RasterizerStorageGLES3::get_base_type(RID p_rid) const {
if (multimesh_owner.owns(p_rid)) {
return VS::INSTANCE_MULTIMESH;
}
+ if (immediate_owner.owns(p_rid)) {
+ return VS::INSTANCE_IMMEDIATE;
+ }
if (light_owner.owns(p_rid)) {
return VS::INSTANCE_LIGHT;
}
@@ -5057,7 +5168,12 @@ bool RasterizerStorageGLES3::free(RID p_rid){
multimesh_owner.free(p_rid);
memdelete(multimesh);
+ } else if (immediate_owner.owns(p_rid)) {
+
+ Immediate *immediate = immediate_owner.get(p_rid);
+ immediate_owner.free(p_rid);
+ memdelete(immediate);
} else if (light_owner.owns(p_rid)) {
// delete the texture
diff --git a/drivers/gles3/rasterizer_storage_gles3.h b/drivers/gles3/rasterizer_storage_gles3.h
index c6712bd8ea..623962bf61 100644
--- a/drivers/gles3/rasterizer_storage_gles3.h
+++ b/drivers/gles3/rasterizer_storage_gles3.h
@@ -651,10 +651,41 @@ public:
/* IMMEDIATE API */
+ struct Immediate : public Geometry {
+
+ struct Chunk {
+
+ RID texture;
+ VS::PrimitiveType primitive;
+ Vector<Vector3> vertices;
+ Vector<Vector3> normals;
+ Vector<Plane> tangents;
+ Vector<Color> colors;
+ Vector<Vector2> uvs;
+ Vector<Vector2> uvs2;
+ };
+
+ List<Chunk> chunks;
+ bool building;
+ int mask;
+ AABB aabb;
+
+ Immediate() { type=GEOMETRY_IMMEDIATE; building=false;}
+
+ };
+
+ Vector3 chunk_vertex;
+ Vector3 chunk_normal;
+ Plane chunk_tangent;
+ Color chunk_color;
+ Vector2 chunk_uv;
+ Vector2 chunk_uv2;
+
+ mutable RID_Owner<Immediate> immediate_owner;
+
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_vertex_2d(RID p_immediate,const Vector3& p_vertex);
+ 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);
@@ -664,6 +695,7 @@ public:
virtual void immediate_clear(RID p_immediate);
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_immediate) const;
/* SKELETON API */
diff --git a/drivers/gles3/shader_gles3.cpp b/drivers/gles3/shader_gles3.cpp
index e906f9a790..78f35c493a 100644
--- a/drivers/gles3/shader_gles3.cpp
+++ b/drivers/gles3/shader_gles3.cpp
@@ -222,9 +222,8 @@ ShaderGLES3::Version* ShaderGLES3::get_current_version() {
Vector<const char*> strings;
#ifdef GLES_OVER_GL
strings.push_back("#version 330\n");
- //strings.push_back("#version 300 es\n");
#else
- strings.push_back("#version 300 es\n"); //ATI requieres this before anything
+ strings.push_back("#version 300 es\n");
#endif