@@ -1 +1 @@ | |||||
Subproject commit edf7cebc93c6172d45111deb7e52b5df44652ba5 | |||||
Subproject commit 7936e6f1d08165407c1e1c2a6560f5cb278c3b5e |
@@ -18,7 +18,7 @@ WINDRES ?= windres | |||||
ifeq ($(WIN32),true) | ifeq ($(WIN32),true) | ||||
TARGETS = app.exe color.exe demo.exe images.exe nanovg.exe rectangles.exe shapes.exe text.exe | TARGETS = app.exe color.exe demo.exe images.exe nanovg.exe rectangles.exe shapes.exe text.exe | ||||
else | else | ||||
TARGETS = app color demo images nanovg rectangles shapes text | |||||
TARGETS = app color demo images nanovg nanovg2 rectangles shapes text | |||||
endif | endif | ||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
@@ -51,9 +51,12 @@ demo: demo.cpp widgets/* ../dpf/dgl/* | |||||
images: images.cpp widgets/ExampleImagesWidget.hpp images_res/* ../dpf/dgl/* | images: images.cpp widgets/ExampleImagesWidget.hpp images_res/* ../dpf/dgl/* | ||||
$(CXX) $< $(BUILD_CXX_FLAGS) $(LINK_FLAGS) -o $@ | $(CXX) $< $(BUILD_CXX_FLAGS) $(LINK_FLAGS) -o $@ | ||||
nanovg: nanovg.cpp nanovg_res/* ../dpf/dgl/* | |||||
nanovg: nanovg.cpp widgets/NanoPerfWidget.hpp nanovg_res/* ../dpf/dgl/* | |||||
$(CXX) $< $(BUILD_CXX_FLAGS) -I../dpf/dgl/src/nanovg $(LINK_FLAGS) -o $@ | $(CXX) $< $(BUILD_CXX_FLAGS) -I../dpf/dgl/src/nanovg $(LINK_FLAGS) -o $@ | ||||
nanovg2: nanovg2.cpp widgets/NanoPerfWidget.hpp ../dpf/dgl/* | |||||
$(CXX) $< $(BUILD_CXX_FLAGS) $(LINK_FLAGS) -o $@ | |||||
rectangles: rectangles.cpp widgets/ExampleRectanglesWidget.hpp ../dpf/dgl/* | rectangles: rectangles.cpp widgets/ExampleRectanglesWidget.hpp ../dpf/dgl/* | ||||
$(CXX) $< $(BUILD_CXX_FLAGS) $(LINK_FLAGS) -o $@ | $(CXX) $< $(BUILD_CXX_FLAGS) $(LINK_FLAGS) -o $@ | ||||
@@ -24,6 +24,7 @@ | |||||
#include "widgets/ExampleRectanglesWidget.hpp" | #include "widgets/ExampleRectanglesWidget.hpp" | ||||
#include "widgets/ExampleShapesWidget.hpp" | #include "widgets/ExampleShapesWidget.hpp" | ||||
#include "widgets/ExampleTextWidget.hpp" | #include "widgets/ExampleTextWidget.hpp" | ||||
#include "widgets/NanoPerfWidget.hpp" | |||||
// ------------------------------------------------------ | // ------------------------------------------------------ | ||||
// Images | // Images | ||||
@@ -71,12 +72,12 @@ public: | |||||
protected: | protected: | ||||
void onDisplay() override | void onDisplay() override | ||||
{ | { | ||||
const int iconSize = getWidth(); | |||||
const int iconSize = bgIcon.getWidth(); | |||||
glColor3f(0.027f, 0.027f, 0.027f); | glColor3f(0.027f, 0.027f, 0.027f); | ||||
bg.draw(); | |||||
Rectangle<int>(0, 0, getSize()).draw(); | |||||
bgIcon.setY(curPage*iconSize + curPage + 1); | |||||
bgIcon.setY(curPage*iconSize + curPage*3); | |||||
glColor3f(0.129f, 0.129f, 0.129f); | glColor3f(0.129f, 0.129f, 0.129f); | ||||
bgIcon.draw(); | bgIcon.draw(); | ||||
@@ -86,7 +87,7 @@ protected: | |||||
if (curHover != curPage && curHover != -1) | if (curHover != curPage && curHover != -1) | ||||
{ | { | ||||
Rectangle<int> rHover(1, curHover*iconSize + curHover + 1, iconSize-2, iconSize-2); | |||||
Rectangle<int> rHover(1, curHover*iconSize + curHover*3, iconSize-2, iconSize-2); | |||||
glColor3f(0.071f, 0.071f, 0.071f); | glColor3f(0.071f, 0.071f, 0.071f); | ||||
rHover.draw(); | rHover.draw(); | ||||
@@ -105,10 +106,10 @@ protected: | |||||
const int pad = iconSize/2 - DemoArtwork::ico1Width/2; | const int pad = iconSize/2 - DemoArtwork::ico1Width/2; | ||||
img1.drawAt(pad, pad); | img1.drawAt(pad, pad); | ||||
img2.drawAt(pad, pad + 1 + iconSize); | |||||
img3.drawAt(pad, pad + 2 + iconSize*2); | |||||
img4.drawAt(pad, pad + 3 + iconSize*3); | |||||
//img5.drawAt(pad, pad + 3 + iconSize*3); | |||||
img2.drawAt(pad, pad + 3 + iconSize); | |||||
img3.drawAt(pad, pad + 6 + iconSize*2); | |||||
img4.drawAt(pad, pad + 9 + iconSize*3); | |||||
//img5.drawAt(pad, pad + 12 + iconSize*4); | |||||
} | } | ||||
bool onMouse(const MouseEvent& ev) override | bool onMouse(const MouseEvent& ev) override | ||||
@@ -118,11 +119,11 @@ protected: | |||||
if (! contains(ev.pos)) | if (! contains(ev.pos)) | ||||
return false; | return false; | ||||
const int iconSize = getWidth(); | |||||
const int iconSize = bgIcon.getWidth(); | |||||
for (int i=0; i<kPageCount; ++i) | for (int i=0; i<kPageCount; ++i) | ||||
{ | { | ||||
bgIcon.setY(i*iconSize + i + 1); | |||||
bgIcon.setY(i*iconSize + i*3); | |||||
if (bgIcon.contains(ev.pos)) | if (bgIcon.contains(ev.pos)) | ||||
{ | { | ||||
@@ -140,11 +141,11 @@ protected: | |||||
{ | { | ||||
if (contains(ev.pos)) | if (contains(ev.pos)) | ||||
{ | { | ||||
const int iconSize = getWidth(); | |||||
const int iconSize = bgIcon.getWidth(); | |||||
for (int i=0; i<kPageCount; ++i) | for (int i=0; i<kPageCount; ++i) | ||||
{ | { | ||||
bgIcon.setY(i*iconSize + i + 1); | |||||
bgIcon.setY(i*iconSize + i*3); | |||||
if (bgIcon.contains(ev.pos)) | if (bgIcon.contains(ev.pos)) | ||||
{ | { | ||||
@@ -180,19 +181,17 @@ protected: | |||||
const int width = ev.size.getWidth(); | const int width = ev.size.getWidth(); | ||||
const int height = ev.size.getHeight(); | const int height = ev.size.getHeight(); | ||||
bg.setSize(ev.size); | |||||
bgIcon.setWidth(width-4); | |||||
bgIcon.setHeight(width-4); | |||||
bgIcon.setWidth(width-2); | |||||
bgIcon.setHeight(width-2); | |||||
lineSep.setStartX(width+2); | |||||
lineSep.setEndPos(width+2, height); | |||||
lineSep.setStartPos(width, 0); | |||||
lineSep.setEndPos(width, height); | |||||
} | } | ||||
private: | private: | ||||
Callback* const callback; | Callback* const callback; | ||||
int curPage, curHover; | int curPage, curHover; | ||||
Rectangle<int> bg, bgIcon; | |||||
Rectangle<int> bgIcon; | |||||
Line<int> lineSep; | Line<int> lineSep; | ||||
Image img1, img2, img3, img4, img5; | Image img1, img2, img3, img4, img5; | ||||
}; | }; | ||||
@@ -318,6 +317,7 @@ public: | |||||
wText(*this), | wText(*this), | ||||
wLeft(*this, this), | wLeft(*this, this), | ||||
//wRezHandle(*this), | //wRezHandle(*this), | ||||
wPerf(*this, NanoPerfWidget::RENDER_FPS, "TESTING!!"), | |||||
curWidget(nullptr) | curWidget(nullptr) | ||||
{ | { | ||||
wColor.hide(); | wColor.hide(); | ||||
@@ -325,13 +325,15 @@ public: | |||||
wRects.hide(); | wRects.hide(); | ||||
wShapes.hide(); | wShapes.hide(); | ||||
wText.hide(); | wText.hide(); | ||||
//wPerf.hide(); | |||||
wColor.setAbsoluteX(80); | |||||
wImages.setAbsoluteX(80); | |||||
wRects.setAbsoluteX(80); | |||||
wShapes.setAbsoluteX(80); | |||||
wText.setAbsoluteX(80); | |||||
wColor.setAbsoluteX(81); | |||||
wImages.setAbsoluteX(81); | |||||
wRects.setAbsoluteX(81); | |||||
wShapes.setAbsoluteX(81); | |||||
wText.setAbsoluteX(81); | |||||
wLeft.setAbsolutePos(2, 2); | wLeft.setAbsolutePos(2, 2); | ||||
wPerf.setAbsoluteY(5); | |||||
setSize(600, 500); | setSize(600, 500); | ||||
setTitle("DGL Demo"); | setTitle("DGL Demo"); | ||||
@@ -341,17 +343,19 @@ public: | |||||
void onReshape(int width, int height) override | void onReshape(int width, int height) override | ||||
{ | { | ||||
Size<int> size(width-80, height); | |||||
Size<int> size(width-81, height); | |||||
wColor.setSize(size); | wColor.setSize(size); | ||||
wImages.setSize(size); | wImages.setSize(size); | ||||
wRects.setSize(size); | wRects.setSize(size); | ||||
wShapes.setSize(size); | wShapes.setSize(size); | ||||
wText.setSize(size); | wText.setSize(size); | ||||
wLeft.setSize(73, height-4); | |||||
wLeft.setSize(80-4, height-4); | |||||
//wRezHandle.setAbsoluteX(width-wRezHandle.getWidth()); | //wRezHandle.setAbsoluteX(width-wRezHandle.getWidth()); | ||||
//wRezHandle.setAbsoluteY(height-wRezHandle.getHeight()); | //wRezHandle.setAbsoluteY(height-wRezHandle.getHeight()); | ||||
wPerf.setAbsoluteX(width-wPerf.getWidth()-5); | |||||
Window::onReshape(width, height); | Window::onReshape(width, height); | ||||
} | } | ||||
@@ -378,7 +382,6 @@ protected: | |||||
case 3: | case 3: | ||||
curWidget = &wShapes; | curWidget = &wShapes; | ||||
break; | break; | ||||
break; | |||||
case 4: | case 4: | ||||
curWidget = &wText; | curWidget = &wText; | ||||
break; | break; | ||||
@@ -396,6 +399,7 @@ private: | |||||
ExampleTextWidget wText; | ExampleTextWidget wText; | ||||
LeftSideWidget wLeft; | LeftSideWidget wLeft; | ||||
//ResizeHandle wRezHandle; | //ResizeHandle wRezHandle; | ||||
NanoPerfWidget wPerf; | |||||
Widget* curWidget; | Widget* curWidget; | ||||
}; | }; | ||||
@@ -22,70 +22,8 @@ | |||||
// ------------------------------------------------------ | // ------------------------------------------------------ | ||||
// NanoVG Stuff | // NanoVG Stuff | ||||
#include "NanoVG.hpp" | |||||
#include "widgets/NanoPerfWidget.hpp" | |||||
#include "nanovg_res/demo.h" | #include "nanovg_res/demo.h" | ||||
#include "nanovg_res/perf.h" | |||||
// ------------------------------------------------------ | |||||
// get time | |||||
#include <sys/time.h> | |||||
#include <time.h> | |||||
#ifdef DISTRHO_OS_WINDOWS | |||||
#else | |||||
struct TimePOSIX { | |||||
bool monotonic; | |||||
double resolution; | |||||
uint64_t base; | |||||
TimePOSIX() | |||||
: monotonic(false), | |||||
resolution(1e-6), | |||||
base(0) | |||||
{ | |||||
#if defined(CLOCK_MONOTONIC) | |||||
struct timespec ts; | |||||
if (::clock_gettime(CLOCK_MONOTONIC, &ts) == 0) | |||||
{ | |||||
monotonic = true; | |||||
resolution = 1e-9; | |||||
} | |||||
#endif | |||||
base = getRawTime(); | |||||
} | |||||
uint64_t getRawTime() | |||||
{ | |||||
#if defined(CLOCK_MONOTONIC) | |||||
if (monotonic) | |||||
{ | |||||
struct timespec ts; | |||||
::clock_gettime(CLOCK_MONOTONIC, &ts); | |||||
return (uint64_t) ts.tv_sec * (uint64_t) 1000000000 + (uint64_t) ts.tv_nsec; | |||||
} | |||||
else | |||||
#endif | |||||
{ | |||||
struct timeval tv; | |||||
::gettimeofday(&tv, NULL); | |||||
return (uint64_t) tv.tv_sec * (uint64_t) 1000000 + (uint64_t) tv.tv_usec; | |||||
} | |||||
} | |||||
double getTime() | |||||
{ | |||||
return (double)(getRawTime() - base) * resolution; | |||||
} | |||||
}; | |||||
static TimePOSIX gTime; | |||||
#endif | |||||
// ------------------------------------------------------ | // ------------------------------------------------------ | ||||
// use namespace | // use namespace | ||||
@@ -102,8 +40,6 @@ int premult = 0; | |||||
int mx = 0; | int mx = 0; | ||||
int my = 0; | int my = 0; | ||||
double prevt = 0; | |||||
class NanoExampleWidget : public NanoWidget, | class NanoExampleWidget : public NanoWidget, | ||||
public IdleCallback | public IdleCallback | ||||
{ | { | ||||
@@ -114,11 +50,7 @@ public: | |||||
{ | { | ||||
parent.addIdleCallback(this); | parent.addIdleCallback(this); | ||||
initGraph(&fPerf, GRAPH_RENDER_FPS, "Frame Time"); | |||||
loadDemoData(fContext, &fData); | loadDemoData(fContext, &fData); | ||||
prevt = gTime.getTime(); | |||||
} | } | ||||
~NanoExampleWidget() override | ~NanoExampleWidget() override | ||||
@@ -143,13 +75,6 @@ protected: | |||||
const int winWidth = getWidth(); | const int winWidth = getWidth(); | ||||
const int winHeight = getHeight(); | const int winHeight = getHeight(); | ||||
double t, dt; | |||||
t = gTime.getTime(); | |||||
dt = t - prevt; | |||||
prevt = t; | |||||
updateGraph(&fPerf, dt); | |||||
if (premult) | if (premult) | ||||
glClearColor(0, 0, 0, 0); | glClearColor(0, 0, 0, 0); | ||||
else | else | ||||
@@ -157,8 +82,7 @@ protected: | |||||
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT); | glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT); | ||||
renderDemo(fContext, mx, my, winWidth, winHeight, t, blowup, &fData); | |||||
renderGraph(fContext, 5, 5, &fPerf); | |||||
renderDemo(fContext, mx, my, winWidth, winHeight, gTime.getTime(), blowup, &fData); | |||||
if (screenshot) | if (screenshot) | ||||
{ | { | ||||
@@ -204,7 +128,39 @@ protected: | |||||
private: | private: | ||||
NVGcontext* fContext; | NVGcontext* fContext; | ||||
DemoData fData; | DemoData fData; | ||||
PerfGraph fPerf; | |||||
}; | |||||
// ----------------------------------------------------------------------- | |||||
// We need a custom window for multiple widgets | |||||
class NanoExampleWindow : public Window | |||||
{ | |||||
public: | |||||
NanoExampleWindow(App& app) | |||||
: Window(app), | |||||
fDemo(*this), | |||||
fPerf(*this, NanoPerfWidget::RENDER_FPS, "Frame Time") | |||||
{ | |||||
fPerf.setAbsolutePos(5, 5); | |||||
//fPerf.hide(); | |||||
setSize(1000, 600); | |||||
setTitle("NanoVG"); | |||||
} | |||||
protected: | |||||
void onReshape(int width, int height) | |||||
{ | |||||
fDemo.setSize(width, height); | |||||
//fDemo.setAbsolutePos(10, height-fDemo.getHeight()-50); | |||||
Window::onReshape(width, height); | |||||
} | |||||
private: | |||||
NanoExampleWidget fDemo; | |||||
NanoPerfWidget fPerf; | |||||
}; | }; | ||||
// ------------------------------------------------------ | // ------------------------------------------------------ | ||||
@@ -212,12 +168,11 @@ private: | |||||
int main() | int main() | ||||
{ | { | ||||
StandaloneWindow swin; | |||||
NanoExampleWidget widget(swin); | |||||
App app; | |||||
NanoExampleWindow win(app); | |||||
swin.setSize(1000, 600); | |||||
swin.setTitle("NanoVG"); | |||||
swin.exec(); | |||||
win.show(); | |||||
app.exec(); | |||||
return 0; | return 0; | ||||
} | } | ||||
@@ -226,7 +181,6 @@ int main() | |||||
extern "C" { | extern "C" { | ||||
#include "nanovg_res/demo.c" | #include "nanovg_res/demo.c" | ||||
#include "nanovg_res/perf.c" | |||||
} | } | ||||
// ------------------------------------------------------ | // ------------------------------------------------------ |