|
|
@@ -0,0 +1,92 @@
|
|
|
+//
|
|
|
+// helper.cxx
|
|
|
+// graphics
|
|
|
+//
|
|
|
+// Created by Sam Jaffe on 5/18/19.
|
|
|
+// Copyright © 2019 Sam Jaffe. All rights reserved.
|
|
|
+//
|
|
|
+
|
|
|
+#include "helper.hpp"
|
|
|
+
|
|
|
+#ifdef __APPLE__
|
|
|
+#include <OpenGL/gl3.h>
|
|
|
+#endif
|
|
|
+
|
|
|
+#include "vector/vector.hpp"
|
|
|
+
|
|
|
+namespace graphics { namespace detail { namespace texture {
|
|
|
+ static int glfmt(format color_fmt) {
|
|
|
+ switch (color_fmt) {
|
|
|
+ case format::RGB:
|
|
|
+ return GL_RGB;
|
|
|
+ case format::RGBA:
|
|
|
+ return GL_RGBA;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ unsigned int init(format color_fmt, math::vec2i dimension,
|
|
|
+ unsigned char * data) {
|
|
|
+ unsigned int id;
|
|
|
+ // Enable texturings
|
|
|
+ // glEnable( GL_TEXTURE_2D );
|
|
|
+
|
|
|
+ // Tell OpenGL that our pixel data is single-byte aligned
|
|
|
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
|
|
+
|
|
|
+ // Ask OpenGL for an unused texName (ID number) to use for this texture
|
|
|
+ glGenTextures(1, &id);
|
|
|
+
|
|
|
+ // Tell OpenGL to bind (set) this as the currently active texture
|
|
|
+ glBindTexture(GL_TEXTURE_2D, id);
|
|
|
+ // Set texture clamp vs. wrap (repeat)
|
|
|
+
|
|
|
+ // one of: GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT,
|
|
|
+ // GL_MIRROR_CLAMP_TO_EDGE, ...
|
|
|
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
|
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
|
+
|
|
|
+ // the format our source pixel data is currently in; any of: GL_RGB,
|
|
|
+ // GL_RGBA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, ...
|
|
|
+ int bufferFormat = glfmt(color_fmt);
|
|
|
+
|
|
|
+ // the format we want the texture to me on the card; allows us to translate
|
|
|
+ // into a different texture format as we upload to OpenGL
|
|
|
+ int internalFormat = bufferFormat;
|
|
|
+
|
|
|
+ /* glTexImage2D: Load a 2d texture image
|
|
|
+ * target: Creating this as a 2d texture.
|
|
|
+ * level: Which mipmap level to use as the "root" (0 = the highest-quality,
|
|
|
+ * full-res image), if mipmaps are enabled.
|
|
|
+ * internalFormat: Type of texel format we want OpenGL to use for this
|
|
|
+ * texture internally on the video card.
|
|
|
+ * width: Texel-width of image; for maximum compatibility, use 2^N + 2^B,
|
|
|
+ * where N is some integer in the range [3,10], and B is the border
|
|
|
+ * thickness [0,1]
|
|
|
+ * height: Texel-height of image; for maximum compatibility, use 2^M + 2^B,
|
|
|
+ * where M is some integer in the range [3,10], and B is the border
|
|
|
+ * thickness [0,1]
|
|
|
+ * border: Border size, in texels (must be 0 or 1)
|
|
|
+ * format: Pixel format describing the composition of the pixel data in
|
|
|
+ * buffer
|
|
|
+ * type: Pixel color components are unsigned bytes (one byte per color/alpha
|
|
|
+ * channel)
|
|
|
+ * pixels: Location of the actual pixel data bytes/buffer
|
|
|
+ */
|
|
|
+ glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, dimension.x(), dimension.y(),
|
|
|
+ 0, bufferFormat, GL_UNSIGNED_BYTE, data);
|
|
|
+
|
|
|
+ glGenerateMipmap(GL_TEXTURE_2D);
|
|
|
+
|
|
|
+ // Set magnification (texel > pixel) and minification (texel < pixel)
|
|
|
+ // filters one of: GL_NEAREST, GL_LINEAR
|
|
|
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
|
+ // one of: GL_NEAREST, GL_LINEAR, GL_NEAREST_MIPMAP_NEAREST,
|
|
|
+ // GL_NEAREST_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_NEAREST,
|
|
|
+ // GL_LINEAR_MIPMAP_LINEAR
|
|
|
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
|
|
|
+ GL_NEAREST_MIPMAP_LINEAR);
|
|
|
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 5);
|
|
|
+
|
|
|
+ return id;
|
|
|
+ }
|
|
|
+}}}
|