Merge branch 'master' of github.com:bkaradzic/bgfx

This commit is contained in:
Branimir Karadžić 2015-03-16 16:48:54 -07:00
commit 68810fbc8a
8 changed files with 155 additions and 73 deletions

View File

@ -584,10 +584,10 @@ namespace entry
if (!s_ctx.m_fullscreen)
{
[NSMenu setMenuBarVisible: false];
s_ctx.m_style &= ~NSTitledWindowMask;
dispatch_async(dispatch_get_main_queue()
, ^{
[NSMenu setMenuBarVisible: false];
[window setStyleMask: s_ctx.m_style];
[window setFrame:screenRect display:YES];
});
@ -596,10 +596,10 @@ namespace entry
}
else
{
[NSMenu setMenuBarVisible: true];
s_ctx.m_style |= NSTitledWindowMask;
dispatch_async(dispatch_get_main_queue()
, ^{
[NSMenu setMenuBarVisible: true];
[window setStyleMask: s_ctx.m_style];
[window setFrame:s_ctx.m_windowFrame display:YES];
});

View File

@ -211,6 +211,9 @@ namespace entry
: m_width(ENTRY_DEFAULT_WIDTH)
, m_height(ENTRY_DEFAULT_HEIGHT)
, m_aspectRatio(16.0f/9.0f)
, m_mx(0)
, m_my(0)
, m_mz(0)
, m_mouseLock(false)
, m_fullscreen(false)
{
@ -376,10 +379,13 @@ namespace entry
case SDL_MOUSEMOTION:
{
const SDL_MouseMotionEvent& mev = event.motion;
m_mx = mev.x;
m_my = mev.y;
WindowHandle handle = findHandle(mev.windowID);
if (isValid(handle) )
{
m_eventQueue.postMouseEvent(handle, mev.x, mev.y, 0);
m_eventQueue.postMouseEvent(handle, m_mx, m_my, m_mz);
}
}
break;
@ -411,6 +417,19 @@ namespace entry
}
break;
case SDL_MOUSEWHEEL:
{
const SDL_MouseWheelEvent& mev = event.wheel;
m_mz += mev.y;
WindowHandle handle = findHandle(mev.windowID);
if (isValid(handle) )
{
m_eventQueue.postMouseEvent(handle, m_mx, m_my, m_mz);
}
}
break;
case SDL_KEYDOWN:
{
const SDL_KeyboardEvent& kev = event.key;
@ -745,6 +764,7 @@ namespace entry
int32_t m_mx;
int32_t m_my;
int32_t m_mz;
bool m_mouseLock;
bool m_fullscreen;
};

View File

@ -388,6 +388,8 @@ struct Imgui
, m_halfTexel(0.0f)
, m_nvg(NULL)
, m_view(255)
, m_surfaceWidth(0)
, m_surfaceHeight(0)
, m_viewWidth(0)
, m_viewHeight(0)
, m_currentFontIdx(0)
@ -810,21 +812,31 @@ struct Imgui
m_char = _inputChar;
}
void beginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, char _inputChar, uint8_t _view)
void beginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, uint16_t _surfaceWidth, uint16_t _surfaceHeight, char _inputChar, uint8_t _view)
{
IMGUI_beginFrame(_mx, _my, _button, _width, _height, _inputChar, _view);
nvgViewId(m_nvg, _view);
m_view = _view;
m_viewWidth = _width;
m_viewHeight = _height;
m_surfaceWidth = _surfaceWidth;
m_surfaceHeight = _surfaceHeight;
const float xscale = float(m_surfaceWidth) /float(m_viewWidth);
const float yscale = float(m_surfaceHeight)/float(m_viewHeight);
const int32_t mx = int32_t(float(_mx)*xscale);
const int32_t my = int32_t(float(_my)*yscale);
IMGUI_beginFrame(mx, my, _button, _width, _height, _inputChar, _view);
nvgBeginFrameScaled(m_nvg, m_viewWidth, m_viewHeight, m_surfaceWidth, m_surfaceHeight, 1.0f);
nvgViewId(m_nvg, _view);
bgfx::setViewName(_view, "IMGUI");
bgfx::setViewSeq(_view, true);
const bgfx::HMD* hmd = bgfx::getHMD();
if (NULL != hmd)
{
m_viewWidth = _width / 2;
m_viewWidth = _width / 2;
m_surfaceWidth = _surfaceWidth / 2;
float proj[16];
bx::mtxProj(proj, hmd->eye[0].fov, 0.1f, 100.0f);
@ -837,22 +849,22 @@ struct Imgui
const float offset1 = -proj[8] + (hmd->eye[1].viewOffset[0] / dist * proj[0]);
float ortho[2][16];
const float viewOffset = _width/4.0f;
const float viewWidth = _width/2.0f;
bx::mtxOrtho(ortho[0], viewOffset, viewOffset + viewWidth, (float)m_viewHeight, 0.0f, 0.0f, 1000.0f, offset0);
bx::mtxOrtho(ortho[1], viewOffset, viewOffset + viewWidth, (float)m_viewHeight, 0.0f, 0.0f, 1000.0f, offset1);
const float viewOffset = _surfaceWidth/4.0f;
const float viewWidth = _surfaceWidth/2.0f;
bx::mtxOrtho(ortho[0], viewOffset, viewOffset + viewWidth, (float)m_surfaceHeight, 0.0f, 0.0f, 1000.0f, offset0);
bx::mtxOrtho(ortho[1], viewOffset, viewOffset + viewWidth, (float)m_surfaceHeight, 0.0f, 0.0f, 1000.0f, offset1);
bgfx::setViewTransform(_view, NULL, ortho[0], BGFX_VIEW_STEREO, ortho[1]);
bgfx::setViewRect(_view, 0, 0, hmd->width, hmd->height);
}
else
{
float ortho[16];
bx::mtxOrtho(ortho, 0.0f, (float)m_viewWidth, (float)m_viewHeight, 0.0f, 0.0f, 1000.0f);
bx::mtxOrtho(ortho, 0.0f, (float)m_surfaceWidth, (float)m_surfaceHeight, 0.0f, 0.0f, 1000.0f);
bgfx::setViewTransform(_view, NULL, ortho);
bgfx::setViewRect(_view, 0, 0, _width, _height);
}
updateInput(_mx, _my, _button, _scroll, _inputChar);
updateInput(mx, my, _button, _scroll, _inputChar);
m_hot = m_hotToBe;
m_hotToBe = 0;
@ -884,6 +896,7 @@ struct Imgui
clearInput();
nvgEndFrame(m_nvg);
IMGUI_endFrame();
}
@ -937,12 +950,7 @@ struct Imgui
setEnabled(m_areaId);
}
nvgScissor(m_nvg
, float(area.m_scissorX)
, float(area.m_scissorY-1)
, float(area.m_scissorWidth)
, float(area.m_scissorHeight+1)
);
nvgScissor(m_nvg, area);
m_insideArea |= area.m_inside;
@ -1080,12 +1088,7 @@ struct Imgui
}
}
nvgScissor(m_nvg
, float(parentArea.m_scissorX)
, float(parentArea.m_scissorY-1)
, float(parentArea.m_scissorWidth)
, float(parentArea.m_scissorHeight+1)
);
nvgScissor(m_nvg, parentArea);
}
bool beginArea(const char* _name, int32_t _x, int32_t _y, int32_t _width, int32_t _height, bool _enabled, int32_t _r)
@ -1159,13 +1162,7 @@ struct Imgui
}
area.m_scissorEnabled = true;
nvgBeginFrame(m_nvg, m_viewWidth, m_viewHeight, 1.0f);
nvgScissor(m_nvg
, float(area.m_scissorX)
, float(area.m_scissorY-1)
, float(area.m_scissorWidth)
, float(area.m_scissorHeight+1)
);
nvgScissor(m_nvg, area);
m_insideArea |= area.m_inside;
return area.m_inside;
@ -1175,7 +1172,6 @@ struct Imgui
{
m_areaId.pop();
nvgResetScissor(m_nvg);
nvgEndFrame(m_nvg);
}
bool button(const char* _text, bool _enabled, ImguiAlign::Enum _align, uint32_t _rgb0, int32_t _r)
@ -1204,7 +1200,7 @@ struct Imgui
//|| ImguiAlign::CenterIndented == _align).
{
xx = area.m_widgetX;
width = area.m_widgetW - (area.m_widgetX-area.m_scissorX);
width = area.m_widgetW - (area.m_widgetX-area.m_contentX);
}
const bool enabled = _enabled && isEnabled(m_areaId);
@ -1387,7 +1383,7 @@ struct Imgui
//|| ImguiAlign::CenterIndented == _align).
{
xx = area.m_widgetX;
width = area.m_widgetW - (area.m_widgetX-area.m_scissorX);
width = area.m_widgetW - (area.m_widgetX-area.m_contentX);
}
const bool drawLabel = (NULL != _label && _label[0] != '\0');
@ -1526,7 +1522,7 @@ struct Imgui
//|| ImguiAlign::CenterIndented == _align).
{
xx = area.m_widgetX;
width = area.m_widgetW - (area.m_widgetX-area.m_scissorX);
width = area.m_widgetW - (area.m_widgetX-area.m_contentX);
}
uint8_t selected = _selected;
@ -1746,7 +1742,7 @@ struct Imgui
//|| ImguiAlign::CenterIndented == _align).
{
xx = area.m_widgetX;
width = area.m_widgetW - (area.m_widgetX-area.m_scissorX);
width = area.m_widgetW - (area.m_widgetX-area.m_contentX);
}
const int32_t height = width/2;
@ -1799,7 +1795,7 @@ struct Imgui
//|| ImguiAlign::CenterIndented == _align).
{
xx = area.m_widgetX;
width = area.m_widgetW - (area.m_widgetX-area.m_scissorX);
width = area.m_widgetW - (area.m_widgetX-area.m_contentX);
}
const bool adjustHeight = (_cross && _sameHeight);
@ -2025,39 +2021,39 @@ struct Imgui
xx = -borderSize;
yy = -1;
width = 2*borderSize+1;
height = m_viewHeight+1;
height = m_surfaceHeight+1;
triX = 0;
triY = (m_viewHeight-triSize)/2;
triY = (m_surfaceHeight-triSize)/2;
orientation = _checked ? TriangleOrientation::Left : TriangleOrientation::Right;
}
else if (ImguiBorder::Right == _border)
{
xx = m_viewWidth - borderSize;
xx = m_surfaceWidth - borderSize;
yy = -1;
width = 2*borderSize+1;
height = m_viewHeight+1;
triX = m_viewWidth - triSize - 2;
triY = (m_viewHeight-width)/2;
height = m_surfaceHeight+1;
triX = m_surfaceWidth - triSize - 2;
triY = (m_surfaceHeight-width)/2;
orientation = _checked ? TriangleOrientation::Right : TriangleOrientation::Left;
}
else if (ImguiBorder::Top == _border)
{
xx = 0;
yy = -borderSize;
width = m_viewWidth;
width = m_surfaceWidth;
height = 2*borderSize;
triX = (m_viewWidth-triSize)/2;
triX = (m_surfaceWidth-triSize)/2;
triY = 0;
orientation = _checked ? TriangleOrientation::Up : TriangleOrientation::Down;
}
else //if (ImguiBorder::Bottom == _border).
{
xx = 0;
yy = m_viewHeight - borderSize;
width = m_viewWidth;
yy = m_surfaceHeight - borderSize;
width = m_surfaceWidth;
height = 2*borderSize;
triX = (m_viewWidth-triSize)/2;
triY = m_viewHeight-triSize;
triX = (m_surfaceWidth-triSize)/2;
triY = m_surfaceHeight-triSize;
orientation = _checked ? TriangleOrientation::Down : TriangleOrientation::Up;
}
@ -2148,7 +2144,7 @@ struct Imgui
//|| ImguiAlign::CenterIndented == _align).
{
xx = area.m_widgetX;
width = area.m_widgetW - (area.m_widgetX-area.m_scissorX);
width = area.m_widgetW - (area.m_widgetX-area.m_contentX);
}
drawRoundedRect( (float)xx, (float)yy, (float)width, (float)height, 4.0f, imguiRGBA(0, 0, 0, 128) );
@ -2266,19 +2262,40 @@ struct Imgui
area.m_widgetY += _height;
}
void separatorLine(uint16_t _height)
void separatorLine(uint16_t _height, ImguiAlign::Enum _align)
{
Area& area = getCurrentArea();
const int32_t rectWidth = area.m_widgetW;
const int32_t rectHeight = 1;
const int32_t xx = area.m_widgetX;
const int32_t yy = area.m_widgetY + _height/2 - rectHeight;
//const int32_t width = area.m_widgetW;
const int32_t height = 1;
//const int32_t xx = area.m_widgetX;
const int32_t yy = area.m_widgetY + _height/2 - height;
int32_t xx;
int32_t width;
if (ImguiAlign::Left == _align)
{
xx = area.m_contentX + SCROLL_AREA_PADDING;
width = area.m_widgetW;
}
else if (ImguiAlign::LeftIndented == _align
|| ImguiAlign::Right == _align)
{
xx = area.m_widgetX;
width = area.m_widgetW;
}
else //if (ImguiAlign::Center == _align
//|| ImguiAlign::CenterIndented == _align).
{
xx = area.m_widgetX;
width = area.m_widgetW - (area.m_widgetX-area.m_contentX) + 1;
}
area.m_widgetY += _height;
drawRect( (float)xx
, (float)yy
, (float)rectWidth
, (float)rectHeight
, (float)width
, (float)height
, imguiRGBA(255, 255, 255, 32)
);
}
@ -3049,10 +3066,16 @@ struct Imgui
const Area& area = getCurrentArea();
if (area.m_scissorEnabled)
{
bgfx::setScissor(uint16_t(IMGUI_MAX(0, area.m_scissorX) )
, uint16_t(IMGUI_MAX(0, area.m_scissorY-1) )
, area.m_scissorWidth
, area.m_scissorHeight+1
const float xscale = float(m_viewWidth) /float(m_surfaceWidth);
const float yscale = float(m_viewHeight)/float(m_surfaceHeight);
const int16_t scissorX = int16_t(float(area.m_scissorX)*xscale);
const int16_t scissorY = int16_t(float(area.m_scissorY)*yscale);
const int16_t scissorWidth = int16_t(float(area.m_scissorWidth)*xscale);
const int16_t scissorHeight = int16_t(float(area.m_scissorHeight)*yscale);
bgfx::setScissor(uint16_t(IMGUI_MAX(0, scissorX) )
, uint16_t(IMGUI_MAX(0, scissorY-1) )
, scissorWidth
, scissorHeight+1
);
}
else
@ -3061,6 +3084,23 @@ struct Imgui
}
}
inline void nvgScissor(NVGcontext* _ctx, const Area& _area)
{
if (_area.m_scissorEnabled)
{
::nvgScissor(_ctx
, float(IMGUI_MAX(0, _area.m_scissorX) )
, float(IMGUI_MAX(0, _area.m_scissorY-1) )
, float(_area.m_scissorWidth)
, float(_area.m_scissorHeight+1)
);
}
else
{
nvgResetScissor(_ctx);
}
}
template <typename Ty, uint16_t Max=64>
struct IdStack
{
@ -3150,6 +3190,8 @@ struct Imgui
uint8_t m_view;
uint16_t m_viewWidth;
uint16_t m_viewHeight;
uint16_t m_surfaceWidth;
uint16_t m_surfaceHeight;
#if !USE_NANOVG_FONT
struct Font
@ -3204,9 +3246,14 @@ ImguiFontHandle imguiGetCurrentFont()
return handle;
}
void imguiBeginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, uint16_t _surfaceWidth, uint16_t _surfaceHeight, char _inputChar, uint8_t _view)
{
s_imgui.beginFrame(_mx, _my, _button, _scroll, _width, _height, _surfaceWidth, _surfaceHeight, _inputChar, _view);
}
void imguiBeginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, char _inputChar, uint8_t _view)
{
s_imgui.beginFrame(_mx, _my, _button, _scroll, _width, _height, _inputChar, _view);
s_imgui.beginFrame(_mx, _my, _button, _scroll, _width, _height, _width, _height, _inputChar, _view);
}
void imguiEndFrame()
@ -3289,9 +3336,9 @@ void imguiSeparator(uint16_t _height)
s_imgui.separator(_height);
}
void imguiSeparatorLine(uint16_t _height)
void imguiSeparatorLine(uint16_t _height, ImguiAlign::Enum _align)
{
s_imgui.separatorLine(_height);
s_imgui.separatorLine(_height, _align);
}
int32_t imguiGetWidgetX()

View File

@ -137,6 +137,7 @@ ImguiFontHandle imguiCreate(const void* _data = NULL, uint32_t _size = 0, float
void imguiDestroy();
void imguiBeginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, char _inputChar = 0, uint8_t _view = 255);
void imguiBeginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, uint16_t _surfaceWidth, uint16_t _surfaceHeight, char _inputChar = 0, uint8_t _view = 255);
void imguiEndFrame();
void imguiDrawText(int _x, int _y, ImguiTextAlign::Enum _align, const char* _text, uint32_t _argb);
@ -158,7 +159,7 @@ void imguiEndScrollArea(int32_t _r = IMGUI_SCROLL_BAR_R);
void imguiIndent(uint16_t _width = IMGUI_INDENT_VALUE);
void imguiUnindent(uint16_t _width = IMGUI_INDENT_VALUE);
void imguiSeparator(uint16_t _height = IMGUI_SEPARATOR_VALUE);
void imguiSeparatorLine(uint16_t _height = IMGUI_SEPARATOR_VALUE);
void imguiSeparatorLine(uint16_t _height = IMGUI_SEPARATOR_VALUE, ImguiAlign::Enum = ImguiAlign::LeftIndented);
int32_t imguiGetWidgetX();
int32_t imguiGetWidgetY();

View File

@ -296,7 +296,7 @@ void nvgDeleteInternal(NVGcontext* ctx)
free(ctx);
}
void nvgBeginFrame(NVGcontext* ctx, int windowWidth, int windowHeight, float devicePixelRatio)
void nvgBeginFrameScaled(NVGcontext* ctx, int windowWidth, int windowHeight, int surfaceWidth, int surfaceHeight, float devicePixelRatio)
{
/* printf("Tris: draws:%d fill:%d stroke:%d text:%d TOT:%d\n",
ctx->drawCallCount, ctx->fillTriCount, ctx->strokeTriCount, ctx->textTriCount,
@ -307,8 +307,8 @@ void nvgBeginFrame(NVGcontext* ctx, int windowWidth, int windowHeight, float dev
nvgReset(ctx);
nvg__setDevicePixelRatio(ctx, devicePixelRatio);
ctx->params.renderViewport(ctx->params.userPtr, windowWidth, windowHeight);
ctx->params.renderViewport(ctx->params.userPtr, windowWidth, windowHeight, surfaceWidth, surfaceHeight);
ctx->drawCallCount = 0;
ctx->fillTriCount = 0;
@ -316,6 +316,11 @@ void nvgBeginFrame(NVGcontext* ctx, int windowWidth, int windowHeight, float dev
ctx->textTriCount = 0;
}
void nvgBeginFrame(NVGcontext* ctx, int windowWidth, int windowHeight, float devicePixelRatio)
{
nvgBeginFrameScaled(ctx, windowWidth, windowHeight, windowWidth, windowHeight, devicePixelRatio);
}
void nvgCancelFrame(NVGcontext* ctx)
{
ctx->params.renderCancel(ctx->params.userPtr);

View File

@ -116,6 +116,7 @@ enum NVGimageFlags {
// frame buffer size. In that case you would set windowWidth/Height to the window size
// devicePixelRatio to: frameBufferWidth / windowWidth.
void nvgBeginFrame(NVGcontext* ctx, int windowWidth, int windowHeight, float devicePixelRatio);
void nvgBeginFrameScaled(NVGcontext* ctx, int windowWidth, int windowHeight, int surfaceWidth, int surfaceHeight, float devicePixelRatio);
// Cancels drawing the current frame.
void nvgCancelFrame(NVGcontext* ctx);
@ -588,7 +589,7 @@ struct NVGparams {
int (*renderDeleteTexture)(void* uptr, int image);
int (*renderUpdateTexture)(void* uptr, int image, int x, int y, int w, int h, const unsigned char* data);
int (*renderGetTextureSize)(void* uptr, int image, int* w, int* h);
void (*renderViewport)(void* uptr, int width, int height);
void (*renderViewport)(void* uptr, int width, int height, int surfaceWidth, int surfaceHeight);
void (*renderCancel)(void* uptr);
void (*renderFlush)(void* uptr);
void (*renderFill)(void* uptr, NVGpaint* paint, NVGscissor* scissor, float fringe, const float* bounds, const NVGpath* paths, int npaths);

View File

@ -132,6 +132,7 @@ namespace
struct GLNVGtexture* textures;
float view[2];
float surface[2];
int ntextures;
int ctextures;
int textureId;
@ -516,11 +517,13 @@ namespace
gl->th = handle;
}
static void nvgRenderViewport(void* _userPtr, int width, int height)
static void nvgRenderViewport(void* _userPtr, int width, int height, int surfaceWidth, int surfaceHeight)
{
struct GLNVGcontext* gl = (struct GLNVGcontext*)_userPtr;
gl->view[0] = (float)width;
gl->view[1] = (float)height;
gl->surface[0] = (float)surfaceWidth;
gl->surface[1] = (float)surfaceHeight;
bgfx::setViewRect(gl->viewid, 0, 0, width, height);
}
@ -720,7 +723,7 @@ namespace
);
}
bgfx::setUniform(gl->u_viewSize, gl->view);
bgfx::setUniform(gl->u_viewSize, gl->surface);
for (uint32_t ii = 0, num = gl->ncalls; ii < num; ++ii)
{

View File

@ -25,6 +25,11 @@ function bgfxProject(_name, _kind, _defines)
"-shared",
}
configuration { "linux-*" }
buildoptions {
"-fPIC",
}
configuration {}
end