Skip to content

Instantly share code, notes, and snippets.

@gorbatschow
Created November 18, 2021 20:17
Show Gist options
  • Save gorbatschow/5da8914718c04a18ff7a37343cf0c26d to your computer and use it in GitHub Desktop.
Save gorbatschow/5da8914718c04a18ff7a37343cf0c26d to your computer and use it in GitHub Desktop.
ImGui + GLFW An example of runtime image generation
// An example of runtime image generation using Dear ImGui & GLFW
// c++ code by [email protected]
// Usage:
// RuntimeImage m_image;
// m_image.setSize(50, 50);
// m_image.setColor(255, 0, 255, 255);
// m_image.updateTexture();
// ImGui::Image((void*)(intptr_t)m_image.textureId(), m_image.imageSize());
#pragma once
#include <GLFW/glfw3.h>
#include <imgui.h>
class RuntimeImage
{
public:
RuntimeImage() {
setSize(50, 50);
setColor(255, 0, 255, 255); // pink
}
void setSize(size_t vsize, size_t hsize)
{
if ((m_vsize != vsize) || (hsize != hsize)) {
if (m_image != nullptr) delete m_image;
m_image = new uint32_t[vsize * hsize];
memset(m_image, 0, vsize * hsize * sizeof(uint32_t));
}
m_vsize = vsize;
m_hsize = hsize;
}
void setColor(uint32_t red, uint32_t green, uint32_t blue, uint32_t alpha)
{
const uint32_t color = (alpha << 24) | (blue << 16) | (green << 8) | red;
for (size_t i = 0; i != m_hsize * m_vsize; ++i) {
m_image[i] = color;
}
}
void updateTexture()
{
glBindTexture(GL_TEXTURE_2D, m_textureId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_hsize, m_vsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, (uint8_t*)m_image);
}
GLuint textureId() const { return m_textureId; }
ImVec2 imageSize() const { return { float(m_vsize), float(m_hsize) }; }
private:
GLuint m_textureId = 0;
uint32_t* m_image = nullptr;
GLsizei m_vsize = 0;
GLsizei m_hsize = 0;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment