diff options
Diffstat (limited to 'drivers/gles3/rasterizer_canvas_gles3.cpp')
| -rw-r--r-- | drivers/gles3/rasterizer_canvas_gles3.cpp | 110 | 
1 files changed, 58 insertions, 52 deletions
diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp index 29b4b0c6c4..30aa22732c 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.cpp +++ b/drivers/gles3/rasterizer_canvas_gles3.cpp @@ -222,12 +222,12 @@ RasterizerStorageGLES3::Texture *RasterizerCanvasGLES3::_bind_canvas_texture(con  		} else { -			texture = texture->get_ptr(); -  			if (texture->redraw_if_visible) { //check before proxy, because this is usually used with proxies  				VisualServerRaster::redraw_request();  			} +			texture = texture->get_ptr(); +  			if (texture->render_target)  				texture->render_target->used_in_frame = true; @@ -263,12 +263,12 @@ RasterizerStorageGLES3::Texture *RasterizerCanvasGLES3::_bind_canvas_texture(con  		} else { -			normal_map = normal_map->get_ptr(); -  			if (normal_map->redraw_if_visible) { //check before proxy, because this is usually used with proxies  				VisualServerRaster::redraw_request();  			} +			normal_map = normal_map->get_ptr(); +  			glActiveTexture(GL_TEXTURE1);  			glBindTexture(GL_TEXTURE_2D, normal_map->tex_id);  			state.current_normal = p_normal_map; @@ -332,7 +332,7 @@ void RasterizerCanvasGLES3::_draw_polygon(const int *p_indices, int p_index_coun  #endif  	glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Vector2) * p_vertex_count, p_vertices);  	glEnableVertexAttribArray(VS::ARRAY_VERTEX); -	glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, false, sizeof(Vector2), ((uint8_t *)0) + buffer_ofs); +	glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, false, sizeof(Vector2), CAST_INT_TO_UCHAR_PTR(buffer_ofs));  	buffer_ofs += sizeof(Vector2) * p_vertex_count;  	//color  #ifdef DEBUG_ENABLED @@ -350,7 +350,7 @@ void RasterizerCanvasGLES3::_draw_polygon(const int *p_indices, int p_index_coun  		glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Color) * p_vertex_count, p_colors);  		glEnableVertexAttribArray(VS::ARRAY_COLOR); -		glVertexAttribPointer(VS::ARRAY_COLOR, 4, GL_FLOAT, false, sizeof(Color), ((uint8_t *)0) + buffer_ofs); +		glVertexAttribPointer(VS::ARRAY_COLOR, 4, GL_FLOAT, false, sizeof(Color), CAST_INT_TO_UCHAR_PTR(buffer_ofs));  		buffer_ofs += sizeof(Color) * p_vertex_count;  	} @@ -362,7 +362,7 @@ void RasterizerCanvasGLES3::_draw_polygon(const int *p_indices, int p_index_coun  		glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Vector2) * p_vertex_count, p_uvs);  		glEnableVertexAttribArray(VS::ARRAY_TEX_UV); -		glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, false, sizeof(Vector2), ((uint8_t *)0) + buffer_ofs); +		glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, false, sizeof(Vector2), CAST_INT_TO_UCHAR_PTR(buffer_ofs));  		buffer_ofs += sizeof(Vector2) * p_vertex_count;  	} else { @@ -378,12 +378,12 @@ void RasterizerCanvasGLES3::_draw_polygon(const int *p_indices, int p_index_coun  		glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(int) * 4 * p_vertex_count, p_bones);  		glEnableVertexAttribArray(VS::ARRAY_BONES);  		//glVertexAttribPointer(VS::ARRAY_BONES, 4, GL_UNSIGNED_INT, false, sizeof(int) * 4, ((uint8_t *)0) + buffer_ofs); -		glVertexAttribIPointer(VS::ARRAY_BONES, 4, GL_UNSIGNED_INT, sizeof(int) * 4, ((uint8_t *)0) + buffer_ofs); +		glVertexAttribIPointer(VS::ARRAY_BONES, 4, GL_UNSIGNED_INT, sizeof(int) * 4, CAST_INT_TO_UCHAR_PTR(buffer_ofs));  		buffer_ofs += sizeof(int) * 4 * p_vertex_count;  		glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(float) * 4 * p_vertex_count, p_weights);  		glEnableVertexAttribArray(VS::ARRAY_WEIGHTS); -		glVertexAttribPointer(VS::ARRAY_WEIGHTS, 4, GL_FLOAT, false, sizeof(float) * 4, ((uint8_t *)0) + buffer_ofs); +		glVertexAttribPointer(VS::ARRAY_WEIGHTS, 4, GL_FLOAT, false, sizeof(float) * 4, CAST_INT_TO_UCHAR_PTR(buffer_ofs));  		buffer_ofs += sizeof(float) * 4 * p_vertex_count;  	} else if (state.using_skeleton) { @@ -423,7 +423,7 @@ void RasterizerCanvasGLES3::_draw_generic(GLuint p_primitive, int p_vertex_count  	//vertex  	glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Vector2) * p_vertex_count, p_vertices);  	glEnableVertexAttribArray(VS::ARRAY_VERTEX); -	glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, false, sizeof(Vector2), ((uint8_t *)0) + buffer_ofs); +	glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, false, sizeof(Vector2), CAST_INT_TO_UCHAR_PTR(buffer_ofs));  	buffer_ofs += sizeof(Vector2) * p_vertex_count;  	//color @@ -438,7 +438,7 @@ void RasterizerCanvasGLES3::_draw_generic(GLuint p_primitive, int p_vertex_count  		glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Color) * p_vertex_count, p_colors);  		glEnableVertexAttribArray(VS::ARRAY_COLOR); -		glVertexAttribPointer(VS::ARRAY_COLOR, 4, GL_FLOAT, false, sizeof(Color), ((uint8_t *)0) + buffer_ofs); +		glVertexAttribPointer(VS::ARRAY_COLOR, 4, GL_FLOAT, false, sizeof(Color), CAST_INT_TO_UCHAR_PTR(buffer_ofs));  		buffer_ofs += sizeof(Color) * p_vertex_count;  	} @@ -446,7 +446,7 @@ void RasterizerCanvasGLES3::_draw_generic(GLuint p_primitive, int p_vertex_count  		glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Vector2) * p_vertex_count, p_uvs);  		glEnableVertexAttribArray(VS::ARRAY_TEX_UV); -		glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, false, sizeof(Vector2), ((uint8_t *)0) + buffer_ofs); +		glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, false, sizeof(Vector2), CAST_INT_TO_UCHAR_PTR(buffer_ofs));  		buffer_ofs += sizeof(Vector2) * p_vertex_count;  	} else { @@ -581,10 +581,10 @@ void RasterizerCanvasGLES3::_canvas_item_render_commands(Item *p_item, Item *cur  #ifdef GLES_OVER_GL  					if (line->antialiased) {  						glEnable(GL_LINE_SMOOTH); -						for (int i = 0; i < 4; i++) { +						for (int j = 0; j < 4; j++) {  							Vector2 vertsl[2] = { -								verts[i], -								verts[(i + 1) % 4], +								verts[j], +								verts[(j + 1) % 4],  							};  							_draw_gui_primitive(2, vertsl, NULL, NULL);  						} @@ -782,8 +782,8 @@ void RasterizerCanvasGLES3::_canvas_item_render_commands(Item *p_item, Item *cur  				}  				if (primitive->colors.size() == 1 && primitive->points.size() > 1) { -					Color c = primitive->colors[0]; -					glVertexAttrib4f(VS::ARRAY_COLOR, c.r, c.g, c.b, c.a); +					Color col = primitive->colors[0]; +					glVertexAttrib4f(VS::ARRAY_COLOR, col.r, col.g, col.b, col.a);  				} else if (primitive->colors.empty()) {  					glVertexAttrib4f(VS::ARRAY_COLOR, 1, 1, 1, 1); @@ -826,6 +826,8 @@ void RasterizerCanvasGLES3::_canvas_item_render_commands(Item *p_item, Item *cur  					state.canvas_shader.set_uniform(CanvasShaderGLES3::COLOR_TEXPIXEL_SIZE, texpixel_size);  				} +				state.canvas_shader.set_uniform(CanvasShaderGLES3::MODELVIEW_MATRIX, state.final_transform * mesh->transform); +  				RasterizerStorageGLES3::Mesh *mesh_data = storage->mesh_owner.getornull(mesh->mesh);  				if (mesh_data) { @@ -834,6 +836,8 @@ void RasterizerCanvasGLES3::_canvas_item_render_commands(Item *p_item, Item *cur  						// materials are ignored in 2D meshes, could be added but many things (ie, lighting mode, reading from screen, etc) would break as they are not meant be set up at this point of drawing  						glBindVertexArray(s->array_id); +						glVertexAttrib4f(VS::ARRAY_COLOR, mesh->modulate.r, mesh->modulate.g, mesh->modulate.b, mesh->modulate.a); +  						if (s->index_array_len) {  							glDrawElements(gl_primitive[s->primitive], s->index_array_len, (s->array_len >= (1 << 16)) ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT, 0);  						} else { @@ -843,6 +847,8 @@ void RasterizerCanvasGLES3::_canvas_item_render_commands(Item *p_item, Item *cur  						glBindVertexArray(0);  					}  				} +				state.canvas_shader.set_uniform(CanvasShaderGLES3::MODELVIEW_MATRIX, state.final_transform); +  			} break;  			case Item::Command::TYPE_MULTIMESH: { @@ -886,17 +892,17 @@ void RasterizerCanvasGLES3::_canvas_item_render_commands(Item *p_item, Item *cur  					int stride = (multi_mesh->xform_floats + multi_mesh->color_floats + multi_mesh->custom_data_floats) * 4;  					glEnableVertexAttribArray(8); -					glVertexAttribPointer(8, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + 0); +					glVertexAttribPointer(8, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(0));  					glVertexAttribDivisor(8, 1);  					glEnableVertexAttribArray(9); -					glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + 4 * 4); +					glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(4 * 4));  					glVertexAttribDivisor(9, 1);  					int color_ofs;  					if (multi_mesh->transform_format == VS::MULTIMESH_TRANSFORM_3D) {  						glEnableVertexAttribArray(10); -						glVertexAttribPointer(10, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + 8 * 4); +						glVertexAttribPointer(10, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(8 * 4));  						glVertexAttribDivisor(10, 1);  						color_ofs = 12 * 4;  					} else { @@ -915,14 +921,14 @@ void RasterizerCanvasGLES3::_canvas_item_render_commands(Item *p_item, Item *cur  						} break;  						case VS::MULTIMESH_COLOR_8BIT: {  							glEnableVertexAttribArray(11); -							glVertexAttribPointer(11, 4, GL_UNSIGNED_BYTE, GL_TRUE, stride, ((uint8_t *)NULL) + color_ofs); +							glVertexAttribPointer(11, 4, GL_UNSIGNED_BYTE, GL_TRUE, stride, CAST_INT_TO_UCHAR_PTR(color_ofs));  							glVertexAttribDivisor(11, 1);  							custom_data_ofs += 4;  						} break;  						case VS::MULTIMESH_COLOR_FLOAT: {  							glEnableVertexAttribArray(11); -							glVertexAttribPointer(11, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + color_ofs); +							glVertexAttribPointer(11, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(color_ofs));  							glVertexAttribDivisor(11, 1);  							custom_data_ofs += 4 * 4;  						} break; @@ -936,13 +942,13 @@ void RasterizerCanvasGLES3::_canvas_item_render_commands(Item *p_item, Item *cur  						} break;  						case VS::MULTIMESH_CUSTOM_DATA_8BIT: {  							glEnableVertexAttribArray(12); -							glVertexAttribPointer(12, 4, GL_UNSIGNED_BYTE, GL_TRUE, stride, ((uint8_t *)NULL) + custom_data_ofs); +							glVertexAttribPointer(12, 4, GL_UNSIGNED_BYTE, GL_TRUE, stride, CAST_INT_TO_UCHAR_PTR(custom_data_ofs));  							glVertexAttribDivisor(12, 1);  						} break;  						case VS::MULTIMESH_CUSTOM_DATA_FLOAT: {  							glEnableVertexAttribArray(12); -							glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + custom_data_ofs); +							glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(custom_data_ofs));  							glVertexAttribDivisor(12, 1);  						} break;  					} @@ -1017,43 +1023,41 @@ void RasterizerCanvasGLES3::_canvas_item_render_commands(Item *p_item, Item *cur  				if (particles->draw_order != VS::PARTICLES_DRAW_ORDER_LIFETIME) {  					glEnableVertexAttribArray(8); //xform x -					glVertexAttribPointer(8, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 3); +					glVertexAttribPointer(8, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(sizeof(float) * 4 * 3));  					glVertexAttribDivisor(8, 1);  					glEnableVertexAttribArray(9); //xform y -					glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 4); +					glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(sizeof(float) * 4 * 4));  					glVertexAttribDivisor(9, 1);  					glEnableVertexAttribArray(10); //xform z -					glVertexAttribPointer(10, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 5); +					glVertexAttribPointer(10, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(sizeof(float) * 4 * 5));  					glVertexAttribDivisor(10, 1);  					glEnableVertexAttribArray(11); //color -					glVertexAttribPointer(11, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + 0); +					glVertexAttribPointer(11, 4, GL_FLOAT, GL_FALSE, stride, NULL);  					glVertexAttribDivisor(11, 1);  					glEnableVertexAttribArray(12); //custom -					glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 2); +					glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(sizeof(float) * 4 * 2));  					glVertexAttribDivisor(12, 1);  					glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, amount);  				} else {  					//split - -					int stride = sizeof(float) * 4 * 6;  					int split = int(Math::ceil(particles->phase * particles->amount));  					if (amount - split > 0) {  						glEnableVertexAttribArray(8); //xform x -						glVertexAttribPointer(8, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + stride * split + sizeof(float) * 4 * 3); +						glVertexAttribPointer(8, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(stride * split + sizeof(float) * 4 * 3));  						glVertexAttribDivisor(8, 1);  						glEnableVertexAttribArray(9); //xform y -						glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + stride * split + sizeof(float) * 4 * 4); +						glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(stride * split + sizeof(float) * 4 * 4));  						glVertexAttribDivisor(9, 1);  						glEnableVertexAttribArray(10); //xform z -						glVertexAttribPointer(10, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + stride * split + sizeof(float) * 4 * 5); +						glVertexAttribPointer(10, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(stride * split + sizeof(float) * 4 * 5));  						glVertexAttribDivisor(10, 1);  						glEnableVertexAttribArray(11); //color -						glVertexAttribPointer(11, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + stride * split + 0); +						glVertexAttribPointer(11, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(stride * split + 0));  						glVertexAttribDivisor(11, 1);  						glEnableVertexAttribArray(12); //custom -						glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + stride * split + sizeof(float) * 4 * 2); +						glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(stride * split + sizeof(float) * 4 * 2));  						glVertexAttribDivisor(12, 1);  						glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, amount - split); @@ -1061,19 +1065,19 @@ void RasterizerCanvasGLES3::_canvas_item_render_commands(Item *p_item, Item *cur  					if (split > 0) {  						glEnableVertexAttribArray(8); //xform x -						glVertexAttribPointer(8, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 3); +						glVertexAttribPointer(8, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(sizeof(float) * 4 * 3));  						glVertexAttribDivisor(8, 1);  						glEnableVertexAttribArray(9); //xform y -						glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 4); +						glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(sizeof(float) * 4 * 4));  						glVertexAttribDivisor(9, 1);  						glEnableVertexAttribArray(10); //xform z -						glVertexAttribPointer(10, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 5); +						glVertexAttribPointer(10, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(sizeof(float) * 4 * 5));  						glVertexAttribDivisor(10, 1);  						glEnableVertexAttribArray(11); //color -						glVertexAttribPointer(11, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + 0); +						glVertexAttribPointer(11, 4, GL_FLOAT, GL_FALSE, stride, NULL);  						glVertexAttribDivisor(11, 1);  						glEnableVertexAttribArray(12); //custom -						glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 2); +						glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(sizeof(float) * 4 * 2));  						glVertexAttribDivisor(12, 1);  						glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, split); @@ -1099,12 +1103,12 @@ void RasterizerCanvasGLES3::_canvas_item_render_commands(Item *p_item, Item *cur  				points[numpoints] = circle->pos;  				int indices[numpoints * 3]; -				for (int i = 0; i < numpoints; i++) { +				for (int j = 0; j < numpoints; j++) { -					points[i] = circle->pos + Vector2(Math::sin(i * Math_PI * 2.0 / numpoints), Math::cos(i * Math_PI * 2.0 / numpoints)) * circle->radius; -					indices[i * 3 + 0] = i; -					indices[i * 3 + 1] = (i + 1) % numpoints; -					indices[i * 3 + 2] = numpoints; +					points[j] = circle->pos + Vector2(Math::sin(j * Math_PI * 2.0 / numpoints), Math::cos(j * Math_PI * 2.0 / numpoints)) * circle->radius; +					indices[j * 3 + 0] = j; +					indices[j * 3 + 1] = (j + 1) % numpoints; +					indices[j * 3 + 2] = numpoints;  				}  				_bind_canvas_texture(RID(), RID()); @@ -1322,6 +1326,8 @@ void RasterizerCanvasGLES3::canvas_render_items(Item *p_item_list, int p_z, cons  				glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 1);  				glBindTexture(GL_TEXTURE_2D, skeleton->texture);  				state.using_skeleton = true; +				state.canvas_shader.set_uniform(CanvasShaderGLES3::SKELETON_TRANSFORM, state.skeleton_transform); +				state.canvas_shader.set_uniform(CanvasShaderGLES3::SKELETON_TRANSFORM_INVERSE, state.skeleton_transform_inverse);  			} else {  				state.using_skeleton = false;  			} @@ -1402,12 +1408,12 @@ void RasterizerCanvasGLES3::canvas_render_items(Item *p_item_list, int p_z, cons  						continue;  					} -					t = t->get_ptr(); -  					if (t->redraw_if_visible) { //check before proxy, because this is usually used with proxies  						VisualServerRaster::redraw_request();  					} +					t = t->get_ptr(); +  					if (storage->config.srgb_decode_supported && t->using_srgb) {  						//no srgb in 2D  						glTexParameteri(t->target, _TEXTURE_SRGB_DECODE_EXT, _SKIP_DECODE_EXT); @@ -2041,7 +2047,7 @@ void RasterizerCanvasGLES3::initialize() {  		glEnableVertexAttribArray(VS::ARRAY_VERTEX);  		glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 4, 0);  		glEnableVertexAttribArray(VS::ARRAY_TEX_UV); -		glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 4, (float *)0 + 2); +		glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 4, CAST_INT_TO_UCHAR_PTR(8));  		glBindVertexArray(0);  		glBindBuffer(GL_ARRAY_BUFFER, 0); //unbind  	} @@ -2078,16 +2084,16 @@ void RasterizerCanvasGLES3::initialize() {  			}  			glEnableVertexAttribArray(VS::ARRAY_VERTEX); -			glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + 0); +			glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, stride, NULL);  			if (i & 1) {  				glEnableVertexAttribArray(VS::ARRAY_COLOR); -				glVertexAttribPointer(VS::ARRAY_COLOR, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + color_ofs); +				glVertexAttribPointer(VS::ARRAY_COLOR, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(color_ofs));  			}  			if (i & 2) {  				glEnableVertexAttribArray(VS::ARRAY_TEX_UV); -				glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + uv_ofs); +				glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(uv_ofs));  			}  			glBindVertexArray(0);  |