Newer
Older
Import / research / 3d-experiments / Application / main.cpp
//
//  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, &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)
    {
      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();
}