diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index 3f7a660ace..f863c3a8dc 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -4774,6 +4774,9 @@ framebuffer_copy_to_ram(Texture *tex, int view, int z, case GL_FLOAT: GLCAT.spam(false) << "GL_FLOAT"; break; + case GL_INT: + GLCAT.spam(false) << "GL_INT"; + break; default: GLCAT.spam(false) << "unknown"; break; @@ -6545,6 +6548,8 @@ get_component_type(Texture::ComponentType component_type) { } else { return GL_UNSIGNED_BYTE; } + case Texture::T_int: + return GL_INT; default: GLCAT.error() << "Invalid Texture::Type value!\n"; return GL_UNSIGNED_BYTE; @@ -6756,6 +6761,8 @@ get_external_image_format(Texture *tex) const { case Texture::F_luminance_alpha: case Texture::F_sluminance_alpha: return GL_LUMINANCE_ALPHA; + case Texture::F_r32i: + return GL_RED_INTEGER; } GLCAT.error() << "Invalid Texture::Format value in get_external_image_format(): " @@ -7153,6 +7160,9 @@ get_internal_image_format(Texture *tex) const { case Texture::F_sluminance_alpha: return GL_SLUMINANCE8_ALPHA8; + case Texture::F_r32i: + return GL_R32I; + default: GLCAT.error() << "Invalid image format in get_internal_image_format(): " @@ -10306,6 +10316,10 @@ do_extract_texture_data(CLP(TextureContext) *gtc) { format = Texture::F_red; break; #endif + case GL_R32I: + format = Texture::F_r32i; + break; + #ifndef OPENGLES case GL_RED: format = Texture::F_red; diff --git a/panda/src/gobj/texture.cxx b/panda/src/gobj/texture.cxx index b65f41964a..b1bdb3c567 100644 --- a/panda/src/gobj/texture.cxx +++ b/panda/src/gobj/texture.cxx @@ -581,6 +581,10 @@ estimate_texture_memory() const { bpp = 6; break; + case Texture::F_r32i: + bpp = 4; + break; + default: break; } @@ -1597,6 +1601,10 @@ write(ostream &out, int indent_level) const { out << " floats"; break; + case T_int: + out << " ints"; + break; + default: break; } @@ -1707,6 +1715,10 @@ write(ostream &out, int indent_level) const { case F_sluminance_alpha: out << "sluminance_alpha"; break; + + case F_r32i: + out << "r32i"; + break; } if (cdata->_compression != CM_default) { @@ -2034,6 +2046,8 @@ format_component_type(ComponentType ct) { return "float"; case T_unsigned_int_24_8: return "unsigned_int_24_8"; + case T_int: + return "int"; } return "**invalid**"; @@ -2055,6 +2069,8 @@ string_component_type(const string &str) { return T_float; } else if (cmp_nocase(str, "unsigned_int_24_8") == 0) { return T_unsigned_int_24_8; + } else if (cmp_nocase(str, "int") == 0) { + return T_int; } gobj_cat->error() @@ -2137,6 +2153,8 @@ format_format(Format format) { return "sluminance"; case F_sluminance_alpha: return "sluminance_alpha"; + case F_r32i: + return "r32i"; } return "**invalid**"; } @@ -2215,6 +2233,8 @@ string_format(const string &str) { return F_sluminance; } else if (cmp_nocase(str, "sluminance_alpha") == 0) { return F_sluminance_alpha; + } else if (cmp_nocase(str, "r32i") == 0) { + return F_r32i; } gobj_cat->error() @@ -5060,6 +5080,7 @@ do_set_format(CData *cdata, Texture::Format format) { case F_luminance: case F_r16: case F_sluminance: + case F_r32i: cdata->_num_components = 1; break; @@ -5119,6 +5140,10 @@ do_set_component_type(CData *cdata, Texture::ComponentType component_type) { case T_unsigned_int_24_8: cdata->_component_width = 4; break; + + case T_int: + cdata->_component_width = 4; + break; } } diff --git a/panda/src/gobj/texture.h b/panda/src/gobj/texture.h index ed9800680e..cbd264a660 100644 --- a/panda/src/gobj/texture.h +++ b/panda/src/gobj/texture.h @@ -86,6 +86,7 @@ PUBLISHED: T_unsigned_short, T_float, T_unsigned_int_24_8, + T_int, }; enum Format { @@ -139,6 +140,8 @@ PUBLISHED: F_srgb_alpha, F_sluminance, F_sluminance_alpha, + + F_r32i, // 32-bit integer, used for atomic access }; enum FilterType {