//
// main.cpp
// Application
//
// Created by John Ryland on 4/10/17.
// Copyright © 2017 John Ryland. All rights reserved.
//
#include "../Framework/Framework.h"
#include <cstdio>
#include <ratio>
#include <chrono>
int main(int argc, const char * argv[])
{
Application app(argc, argv);
int h = 800;
int wt = 900;
std::chrono::high_resolution_clock::time_point startTime = std::chrono::high_resolution_clock::now();
Window w;
w.setTitle("3D Experiments");
w.setGeometry(10, 10, wt, h);
const DemoContextFactoryItem* currentDemoItem = DemoContextFactoryItem::getFactoryHead();
DemoContext* demoContext = currentDemoItem->m_value();
vec2f siz{0,0};
int y = h - 20;
while (currentDemoItem)
{
y -= 60;
Label l(w);
l.setGeometry(15, y, 180, 50);
l.setText(currentDemoItem->m_name);
l.setColor(0.0, 1.0, 0.0, 1.0);
l.setFontSize(18);
l.onMouseEvent([&l, currentDemoItem, &demoContext](const MouseEvent& ev){
printf("label clicked %f %f %s %s %s\n", ev.m_x, ev.m_y,
ev.m_buttons & 1 ? "#" : "-", ev.m_buttons & 2 ? "#" : "-", ev.m_buttons & 4 ? "#" : "-" );
if (ev.m_buttons & 1)
{
DemoContext* oldContext = demoContext;
DemoContext* newContext = currentDemoItem->m_value();
newContext->m_needsPrepare = true;
demoContext = newContext;
delete oldContext;
}
});
currentDemoItem = currentDemoItem->m_next;
}
/*
View v(w);
v.setGeometry(4, 4, 100, 100);
v.setColor(1.0, 0.0, 0.0, 1.0);
v.onMouseEvent([](const MouseEvent& ev){ printf("view clicked %f %f %s %s %s\n", ev.m_x, ev.m_y,
ev.m_buttons & 1 ? "#" : "-", ev.m_buttons & 2 ? "#" : "-", ev.m_buttons & 4 ? "#" : "-" );
});
Label l(w);
l.setGeometry(14, 14, 70, 70);
l.setText(currentDemoItem->m_name);
l.setColor(0.0, 1.0, 0.0, 1.0);
l.setFontSize(18);
v.onMouseEvent([&l, ¤tDemoItem, &demoContext](const MouseEvent& ev){ printf("label clicked %f %f %s %s %s\n", ev.m_x, ev.m_y,
ev.m_buttons & 1 ? "#" : "-", ev.m_buttons & 2 ? "#" : "-", ev.m_buttons & 4 ? "#" : "-" );
if (ev.m_buttons & 1)
{
currentDemoItem = currentDemoItem->m_next;
if (!currentDemoItem)
currentDemoItem = DemoContextFactoryItem::getFactoryHead();
l.setText(currentDemoItem->m_name);
delete demoContext;
demoContext = currentDemoItem->m_value();
demoContext->m_needsPrepare = true;
}
});
*/
GLView gl(w);
gl.setGeometry(210, 0, wt - 210, h);
gl.onPrepare([&siz,&demoContext](){
demoContext->onResize(siz);
demoContext->prepare();
demoContext->m_needsPrepare = false;
});
gl.onUpdate([startTime, &siz,&demoContext](){
if (demoContext->m_needsPrepare) {
demoContext->onResize(siz);
demoContext->prepare();
demoContext->m_needsPrepare = false;
}
float seconds = std::chrono::duration_cast<std::chrono::duration<float>>(std::chrono::high_resolution_clock::now() - startTime).count();
demoContext->update(seconds);
});
gl.onDraw([&demoContext](){
if (!demoContext->m_needsPrepare) {
demoContext->draw();
}
});
gl.onResize([&siz, &demoContext](float w, float h){
siz = vec2f{w,h};
demoContext->m_needsPrepare = true;
});
gl.onMouseEvent([](const MouseEvent& ev){
printf("view clicked %f %f %s %s %s\n", ev.m_x, ev.m_y,
ev.m_buttons & 1 ? "#" : "-", ev.m_buttons & 2 ? "#" : "-", ev.m_buttons & 4 ? "#" : "-" );
});
w.show();
return app.run();
}