Merge pull request #62046 from clayjohn/vertexless-draw
Allow creating meshes without vertex positions
This commit is contained in:
commit
5e0d2b5097
10 changed files with 60 additions and 37 deletions
|
|
@ -867,7 +867,6 @@ void RasterizerSceneGLES3::_update_sky_radiance(RID p_env, const Projection &p_p
|
|||
GLES3::MaterialStorage::get_singleton()->shaders.sky_shader.version_set_uniform(SkyShaderGLES3::TIME, time, shader_data->version, SkyShaderGLES3::MODE_CUBEMAP);
|
||||
GLES3::MaterialStorage::get_singleton()->shaders.sky_shader.version_set_uniform(SkyShaderGLES3::PROJECTION, cm.matrix[2][0], cm.matrix[0][0], cm.matrix[2][1], cm.matrix[1][1], shader_data->version, SkyShaderGLES3::MODE_CUBEMAP);
|
||||
|
||||
// Bind a vertex array or else OpenGL complains. We won't actually use it
|
||||
glBindVertexArray(sky_globals.screen_triangle_array);
|
||||
|
||||
glViewport(0, 0, sky->radiance_size, sky->radiance_size);
|
||||
|
|
@ -2150,7 +2149,9 @@ void RasterizerSceneGLES3::_render_list_template(RenderListParameters *p_params,
|
|||
index_array_gl = mesh_storage->mesh_surface_get_index_buffer(mesh_surface, surf->lod_index);
|
||||
|
||||
if (prev_vertex_array_gl != vertex_array_gl) {
|
||||
glBindVertexArray(vertex_array_gl);
|
||||
if (vertex_array_gl != 0) {
|
||||
glBindVertexArray(vertex_array_gl);
|
||||
}
|
||||
prev_vertex_array_gl = vertex_array_gl;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1456,8 +1456,8 @@ MaterialStorage::MaterialStorage() {
|
|||
actions.renames["UV2"] = "uv2_interp";
|
||||
actions.renames["COLOR"] = "color_interp";
|
||||
actions.renames["POINT_SIZE"] = "gl_PointSize";
|
||||
actions.renames["INSTANCE_ID"] = "gl_InstanceIndex";
|
||||
actions.renames["VERTEX_ID"] = "gl_VertexIndex";
|
||||
actions.renames["INSTANCE_ID"] = "gl_InstanceID";
|
||||
actions.renames["VERTEX_ID"] = "gl_VertexID";
|
||||
|
||||
actions.renames["ALPHA_SCISSOR_THRESHOLD"] = "alpha_scissor_threshold";
|
||||
actions.renames["ALPHA_HASH_SCALE"] = "alpha_hash_scale";
|
||||
|
|
|
|||
|
|
@ -186,11 +186,13 @@ void MeshStorage::mesh_add_surface(RID p_mesh, const RS::SurfaceData &p_surface)
|
|||
s->format = p_surface.format;
|
||||
s->primitive = p_surface.primitive;
|
||||
|
||||
glGenBuffers(1, &s->vertex_buffer);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, s->vertex_buffer);
|
||||
glBufferData(GL_ARRAY_BUFFER, p_surface.vertex_data.size(), p_surface.vertex_data.ptr(), (s->format & RS::ARRAY_FLAG_USE_DYNAMIC_UPDATE) ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0); //unbind
|
||||
s->vertex_buffer_size = p_surface.vertex_data.size();
|
||||
if (p_surface.vertex_data.size()) {
|
||||
glGenBuffers(1, &s->vertex_buffer);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, s->vertex_buffer);
|
||||
glBufferData(GL_ARRAY_BUFFER, p_surface.vertex_data.size(), p_surface.vertex_data.ptr(), (s->format & RS::ARRAY_FLAG_USE_DYNAMIC_UPDATE) ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0); //unbind
|
||||
s->vertex_buffer_size = p_surface.vertex_data.size();
|
||||
}
|
||||
|
||||
if (p_surface.attribute_data.size()) {
|
||||
glGenBuffers(1, &s->attribute_buffer);
|
||||
|
|
@ -214,7 +216,7 @@ void MeshStorage::mesh_add_surface(RID p_mesh, const RS::SurfaceData &p_surface)
|
|||
}
|
||||
|
||||
if (p_surface.index_count) {
|
||||
bool is_index_16 = p_surface.vertex_count <= 65536;
|
||||
bool is_index_16 = p_surface.vertex_count <= 65536 && p_surface.vertex_count > 0;
|
||||
glGenBuffers(1, &s->index_buffer);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, s->index_buffer);
|
||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, p_surface.index_data.size(), p_surface.index_data.ptr(), GL_STATIC_DRAW);
|
||||
|
|
@ -238,6 +240,8 @@ void MeshStorage::mesh_add_surface(RID p_mesh, const RS::SurfaceData &p_surface)
|
|||
}
|
||||
}
|
||||
|
||||
ERR_FAIL_COND_MSG(!p_surface.index_count && !p_surface.vertex_count, "Meshes must contain a vertex array, an index array, or both");
|
||||
|
||||
s->aabb = p_surface.aabb;
|
||||
s->bone_aabbs = p_surface.bone_aabbs; //only really useful for returning them.
|
||||
|
||||
|
|
@ -340,7 +344,9 @@ RS::SurfaceData MeshStorage::mesh_get_surface(RID p_mesh, int p_surface) const {
|
|||
|
||||
RS::SurfaceData sd;
|
||||
sd.format = s.format;
|
||||
sd.vertex_data = Utilities::buffer_get_data(GL_ARRAY_BUFFER, s.vertex_buffer, s.vertex_buffer_size);
|
||||
if (s.vertex_buffer != 0) {
|
||||
sd.vertex_data = Utilities::buffer_get_data(GL_ARRAY_BUFFER, s.vertex_buffer, s.vertex_buffer_size);
|
||||
}
|
||||
|
||||
if (s.attribute_buffer != 0) {
|
||||
sd.attribute_data = Utilities::buffer_get_data(GL_ARRAY_BUFFER, s.attribute_buffer, s.attribute_buffer_size);
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ struct Mesh {
|
|||
// Cache vertex arrays so they can be created
|
||||
struct Version {
|
||||
uint32_t input_mask = 0;
|
||||
GLuint vertex_array;
|
||||
GLuint vertex_array = 0;
|
||||
|
||||
Attrib attribs[RS::ARRAY_MAX];
|
||||
};
|
||||
|
|
@ -92,7 +92,7 @@ struct Mesh {
|
|||
float edge_length = 0.0;
|
||||
uint32_t index_count = 0;
|
||||
uint32_t index_buffer_size = 0;
|
||||
GLuint index_buffer;
|
||||
GLuint index_buffer = 0;
|
||||
};
|
||||
|
||||
LOD *lods = nullptr;
|
||||
|
|
@ -175,7 +175,7 @@ struct MultiMesh {
|
|||
bool *data_cache_dirty_regions = nullptr;
|
||||
uint32_t data_cache_used_dirty_regions = 0;
|
||||
|
||||
GLuint buffer;
|
||||
GLuint buffer = 0;
|
||||
|
||||
bool dirty = false;
|
||||
MultiMesh *dirty_list = nullptr;
|
||||
|
|
@ -362,7 +362,7 @@ public:
|
|||
_FORCE_INLINE_ GLenum mesh_surface_get_index_type(void *p_surface) const {
|
||||
Mesh::Surface *s = reinterpret_cast<Mesh::Surface *>(p_surface);
|
||||
|
||||
return s->vertex_count <= 65536 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT;
|
||||
return (s->vertex_count <= 65536 && s->vertex_count > 0) ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT;
|
||||
}
|
||||
|
||||
// Use this to cache Vertex Array Objects so they are only generated once
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue