#include "imgui.h"
#include "imgui_impl_sdl.h"
#include <stdio.h>
#include <SDL.h>
#include <SDL_opengl.h>
#include "escapi.h"
struct SimpleCapParams capture[16];
int active[16];
int devicecount;
GLuint texture[16];
bool showdisabled = false;
void toggle(int device)
{
if (active[device])
{
deinitCapture(device);
active[device] = 0;
}
else
{
initCapture(device, &capture[device]);
active[device] = 1;
doCapture(device);
}
}
void devicewindow(int device)
{
char camname[256];
getCaptureDeviceName(device, camname, 256);
float prop[CAPTURE_PROP_MAX];
bool propauto[CAPTURE_PROP_MAX];
int i;
for (i = 0; i < CAPTURE_PROP_MAX; i++)
{
prop[i] = getCapturePropertyValue(device, i);
propauto[i] = getCapturePropertyAuto(device, i) != 0;
}
if (isCaptureDone(device))
{
int i;
for (i = 0; i < 256 * 256; i++)
capture[device].mTargetBuf[i] = (capture[device].mTargetBuf[i] & 0xff00ff00) |
((capture[device].mTargetBuf[i] & 0xff) << 16) |
((capture[device].mTargetBuf[i] & 0xff0000) >> 16);
glBindTexture(GL_TEXTURE_2D, texture[device]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*)capture[device].mTargetBuf);
doCapture(device);
}
bool opened = true;
ImGui::Begin(camname, &opened, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize);
ImVec2 picsize(256, 256);
ImGui::Image((ImTextureID)texture[device], picsize);
bool disabled_bool = false;
#define CTRLPROP(x) \
if (prop[x] < 0) \
{ \
if (showdisabled) \
{\
ImGui::Checkbox("", &disabled_bool); \
ImGui::SameLine(); \
ImGui::PushItemWidth(200);\
ImGui::SliderFloat(#x + 8, &prop[x], -1, -1, ""); \
ImGui::PopItemWidth();\
} \
} \
else \
{ \
bool changed = false; \
changed |= ImGui::Checkbox("", &propauto[x]); \
ImGui::SameLine(); \
ImGui::PushItemWidth(200);\
changed |= ImGui::SliderFloat(#x+8, &prop[x], 0, 1); \
ImGui::PopItemWidth();\
if (changed) \
{ \
setCaptureProperty(device, x, prop[x], propauto[x]?1:0); \
} \
}
ImGui::SameLine();
ImGui::BeginChild("foo", ImVec2(420, 256), false, ImGuiWindowFlags_HorizontalScrollbar);
ImGui::Text("Auto Value");
CTRLPROP(CAPTURE_BRIGHTNESS);
CTRLPROP(CAPTURE_CONTRAST);
CTRLPROP(CAPTURE_HUE);
CTRLPROP(CAPTURE_SATURATION);
CTRLPROP(CAPTURE_SHARPNESS);
CTRLPROP(CAPTURE_GAMMA);
CTRLPROP(CAPTURE_COLORENABLE);
CTRLPROP(CAPTURE_WHITEBALANCE);
CTRLPROP(CAPTURE_BACKLIGHTCOMPENSATION);
CTRLPROP(CAPTURE_GAIN);
CTRLPROP(CAPTURE_PAN);
CTRLPROP(CAPTURE_TILT);
CTRLPROP(CAPTURE_ROLL);
CTRLPROP(CAPTURE_ZOOM);
CTRLPROP(CAPTURE_EXPOSURE);
CTRLPROP(CAPTURE_IRIS);
CTRLPROP(CAPTURE_FOCUS);
ImGui::EndChild();
ImGui::End();
if (!opened)
toggle(device);
}
int main(int, char**)
{
devicecount = setupESCAPI();
if (devicecount < 1)
{
fprintf(stderr, "Unable to init ESCAPI\n");
exit(1);
}
if (SDL_Init(SDL_INIT_EVERYTHING) != 0)
{
printf("Error: %s\n", SDL_GetError());
return -1;
}
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_DisplayMode current;
SDL_GetCurrentDisplayMode(0, ¤t);
SDL_Window *window = SDL_CreateWindow("ESCAPI complex example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);
SDL_GLContext glcontext = SDL_GL_CreateContext(window);
ImGui_ImplSdl_Init(window);
bool show_test_window = true;
bool show_another_window = false;
ImVec4 clear_color = ImColor(114, 144, 154);
int i;
for (i = 0; i < 16; i++)
{
active[i] = 0;
capture[i].mWidth = 256;
capture[i].mHeight = 256;
capture[i].mTargetBuf = new int[256 * 256];
glGenTextures(1, &texture[i]);
glBindTexture(GL_TEXTURE_2D, texture[i]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*)capture[i].mTargetBuf);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); }
bool done = false;
while (!done)
{
SDL_Event event;
while (SDL_PollEvent(&event))
{
ImGui_ImplSdl_ProcessEvent(&event);
if (event.type == SDL_QUIT)
done = true;
}
ImGui_ImplSdl_NewFrame(window);
ImGui::Begin("Main", 0, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize);
ImGui::Checkbox("Show disabled controls", &showdisabled);
for (i = 0; i < devicecount; i++)
{
char temp[256];
getCaptureDeviceName(i, temp, 256);
if (ImGui::Button(temp))
toggle(i);
}
ImGui::End();
for (i = 0; i < devicecount; i++)
{
if (active[i])
{
devicewindow(i);
}
}
glViewport(0, 0, (int)ImGui::GetIO().DisplaySize.x, (int)ImGui::GetIO().DisplaySize.y);
glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w);
glClear(GL_COLOR_BUFFER_BIT);
ImGui::Render();
SDL_GL_SwapWindow(window);
}
ImGui_ImplSdl_Shutdown();
SDL_GL_DeleteContext(glcontext);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}