mirror of https://github.com/AxioDL/boo.git
Various fixes
This commit is contained in:
parent
e54c8a7c6b
commit
d5cd0bfb50
|
@ -11,6 +11,15 @@ if (NOT TARGET LogVisor)
|
||||||
endif()
|
endif()
|
||||||
include_directories(include ${LOG_VISOR_INCLUDE_DIR})
|
include_directories(include ${LOG_VISOR_INCLUDE_DIR})
|
||||||
|
|
||||||
|
if(NOT GEKKO AND NOT CAFE)
|
||||||
|
list(APPEND PLAT_SRCS
|
||||||
|
lib/graphicsdev/GL.cpp
|
||||||
|
lib/graphicsdev/glew.c)
|
||||||
|
|
||||||
|
list(APPEND PLAT_HDRS
|
||||||
|
include/boo/graphicsdev/GL.hpp)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
list(APPEND PLAT_SRCS
|
list(APPEND PLAT_SRCS
|
||||||
lib/win/ApplicationWin32.cpp
|
lib/win/ApplicationWin32.cpp
|
||||||
|
@ -18,9 +27,12 @@ if(WIN32)
|
||||||
lib/inputdev/HIDListenerWinUSB.cpp
|
lib/inputdev/HIDListenerWinUSB.cpp
|
||||||
lib/inputdev/HIDDeviceWinUSB.cpp
|
lib/inputdev/HIDDeviceWinUSB.cpp
|
||||||
lib/graphicsdev/D3D11.cpp
|
lib/graphicsdev/D3D11.cpp
|
||||||
lib/graphicsdev/D3D12.cpp
|
lib/graphicsdev/D3D12.cpp)
|
||||||
lib/graphicsdev/GL.cpp
|
|
||||||
lib/graphicsdev/glew.c)
|
list(APPEND PLAT_HDRS
|
||||||
|
include/boo/graphicsdev/D3D11.hpp
|
||||||
|
include/boo/graphicsdev/D3D12.hpp)
|
||||||
|
|
||||||
list(APPEND _BOO_SYS_LIBS Winusb)
|
list(APPEND _BOO_SYS_LIBS Winusb)
|
||||||
elseif(APPLE)
|
elseif(APPLE)
|
||||||
list(APPEND PLAT_SRCS
|
list(APPEND PLAT_SRCS
|
||||||
|
@ -28,15 +40,17 @@ elseif(APPLE)
|
||||||
lib/mac/WindowCocoa.mm
|
lib/mac/WindowCocoa.mm
|
||||||
lib/mac/GLViewCocoa.mm
|
lib/mac/GLViewCocoa.mm
|
||||||
lib/inputdev/HIDListenerIOKit.cpp
|
lib/inputdev/HIDListenerIOKit.cpp
|
||||||
lib/inputdev/HIDDeviceIOKit.cpp
|
lib/inputdev/HIDDeviceIOKit.cpp)
|
||||||
lib/graphicsdev/GL.cpp
|
|
||||||
lib/graphicsdev/glew.c)
|
list(APPEND PLAT_HDRS
|
||||||
|
include/boo/graphicsdev/Metal.hpp)
|
||||||
|
|
||||||
find_library(APPKIT_LIBRARY AppKit)
|
find_library(APPKIT_LIBRARY AppKit)
|
||||||
find_library(IOKIT_LIBRARY IOKit)
|
find_library(IOKIT_LIBRARY IOKit)
|
||||||
find_library(OPENGL_LIBRARY OpenGL)
|
find_library(OPENGL_LIBRARY OpenGL)
|
||||||
find_library(COREVIDEO_LIBRARY CoreVideo)
|
find_library(COREVIDEO_LIBRARY CoreVideo)
|
||||||
list(APPEND _BOO_SYS_LIBS ${APPKIT_LIBRARY} ${IOKIT_LIBRARY} ${OPENGL_LIBRARY} ${COREVIDEO_LIBRARY})
|
list(APPEND _BOO_SYS_LIBS ${APPKIT_LIBRARY} ${IOKIT_LIBRARY} ${OPENGL_LIBRARY} ${COREVIDEO_LIBRARY})
|
||||||
else()
|
else(NOT GEKKO)
|
||||||
list(APPEND PLAT_SRCS
|
list(APPEND PLAT_SRCS
|
||||||
lib/x11/ApplicationUnix.cpp
|
lib/x11/ApplicationUnix.cpp
|
||||||
lib/x11/ApplicationXCB.hpp
|
lib/x11/ApplicationXCB.hpp
|
||||||
|
@ -49,6 +63,8 @@ else()
|
||||||
lib/graphicsdev/GLX.cpp
|
lib/graphicsdev/GLX.cpp
|
||||||
lib/graphicsdev/glew.c)
|
lib/graphicsdev/glew.c)
|
||||||
|
|
||||||
|
# list(APPEND PLAT_HDRS )
|
||||||
|
|
||||||
find_package(PkgConfig)
|
find_package(PkgConfig)
|
||||||
if(PKG_CONFIG_FOUND)
|
if(PKG_CONFIG_FOUND)
|
||||||
pkg_check_modules(dbus_pkg QUIET libdbus dbus-1)
|
pkg_check_modules(dbus_pkg QUIET libdbus dbus-1)
|
||||||
|
@ -116,15 +132,12 @@ add_library(Boo
|
||||||
include/boo/IGraphicsContext.hpp
|
include/boo/IGraphicsContext.hpp
|
||||||
include/boo/graphicsdev/IGraphicsDataFactory.hpp
|
include/boo/graphicsdev/IGraphicsDataFactory.hpp
|
||||||
include/boo/graphicsdev/IGraphicsCommandQueue.hpp
|
include/boo/graphicsdev/IGraphicsCommandQueue.hpp
|
||||||
include/boo/graphicsdev/GL.hpp
|
|
||||||
include/boo/graphicsdev/D3D11.hpp
|
|
||||||
include/boo/graphicsdev/D3D12.hpp
|
|
||||||
include/boo/graphicsdev/Metal.hpp
|
|
||||||
include/boo/IWindow.hpp
|
include/boo/IWindow.hpp
|
||||||
include/boo/IApplication.hpp
|
include/boo/IApplication.hpp
|
||||||
include/boo/System.hpp
|
include/boo/System.hpp
|
||||||
include/boo/boo.hpp
|
include/boo/boo.hpp
|
||||||
InputDeviceClasses.cpp
|
InputDeviceClasses.cpp
|
||||||
${PLAT_SRCS})
|
${PLAT_SRCS}
|
||||||
|
${PLAT_HDRS})
|
||||||
|
|
||||||
add_subdirectory(test)
|
add_subdirectory(test)
|
||||||
|
|
|
@ -21,6 +21,12 @@ public:
|
||||||
BUTTON_AUX2 = 5
|
BUTTON_AUX2 = 5
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct SWindowRect
|
||||||
|
{
|
||||||
|
int location[2];
|
||||||
|
int size[2];
|
||||||
|
};
|
||||||
|
|
||||||
struct SWindowCoord
|
struct SWindowCoord
|
||||||
{
|
{
|
||||||
unsigned pixel[2];
|
unsigned pixel[2];
|
||||||
|
@ -84,6 +90,8 @@ public:
|
||||||
MKEY_COMMAND = 1<<4
|
MKEY_COMMAND = 1<<4
|
||||||
};
|
};
|
||||||
|
|
||||||
|
virtual void resized(const SWindowRect& rect)
|
||||||
|
{(void)rect;}
|
||||||
virtual void mouseDown(const SWindowCoord& coord, EMouseButton button, EModifierKey mods)
|
virtual void mouseDown(const SWindowCoord& coord, EMouseButton button, EModifierKey mods)
|
||||||
{(void)coord;(void)button;(void)mods;}
|
{(void)coord;(void)button;(void)mods;}
|
||||||
virtual void mouseUp(const SWindowCoord& coord, EMouseButton button, EModifierKey mods)
|
virtual void mouseUp(const SWindowCoord& coord, EMouseButton button, EModifierKey mods)
|
||||||
|
|
|
@ -18,21 +18,21 @@ public:
|
||||||
Platform platform() const {return PlatformD3D11;}
|
Platform platform() const {return PlatformD3D11;}
|
||||||
const char* platformName() const {return "Direct 3D 11";}
|
const char* platformName() const {return "Direct 3D 11";}
|
||||||
|
|
||||||
const IGraphicsBufferS* newStaticBuffer(BufferUse use, const void* data, size_t sz);
|
IGraphicsBufferS* newStaticBuffer(BufferUse use, const void* data, size_t sz);
|
||||||
IGraphicsBufferD* newDynamicBuffer(BufferUse use);
|
IGraphicsBufferD* newDynamicBuffer(BufferUse use);
|
||||||
|
|
||||||
const ITextureS* newStaticTexture(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
ITextureS* newStaticTexture(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
||||||
const void* data, size_t sz);
|
const void* data, size_t sz);
|
||||||
ITextureD* newDynamicTexture(size_t width, size_t height, TextureFormat fmt);
|
ITextureD* newDynamicTexture(size_t width, size_t height, TextureFormat fmt);
|
||||||
|
|
||||||
const IVertexFormat* newVertexFormat(size_t elementCount, const VertexElementDescriptor* elements);
|
IVertexFormat* newVertexFormat(size_t elementCount, const VertexElementDescriptor* elements);
|
||||||
|
|
||||||
const IShaderPipeline* newShaderPipeline(const char* vertSource, const char* fragSource,
|
IShaderPipeline* newShaderPipeline(const char* vertSource, const char* fragSource,
|
||||||
size_t texCount, const char** texNames,
|
size_t texCount, const char** texNames,
|
||||||
BlendFactor srcFac, BlendFactor dstFac,
|
BlendFactor srcFac, BlendFactor dstFac,
|
||||||
bool depthTest, bool depthWrite, bool backfaceCulling);
|
bool depthTest, bool depthWrite, bool backfaceCulling);
|
||||||
|
|
||||||
const IShaderDataBinding*
|
IShaderDataBinding*
|
||||||
newShaderDataBinding(const IShaderPipeline* pipeline,
|
newShaderDataBinding(const IShaderPipeline* pipeline,
|
||||||
const IVertexFormat* vtxFormat,
|
const IVertexFormat* vtxFormat,
|
||||||
const IGraphicsBuffer* vbo, const IGraphicsBuffer* ebo,
|
const IGraphicsBuffer* vbo, const IGraphicsBuffer* ebo,
|
||||||
|
|
|
@ -28,22 +28,22 @@ public:
|
||||||
Platform platform() const {return PlatformD3D12;}
|
Platform platform() const {return PlatformD3D12;}
|
||||||
const char* platformName() const {return "Direct 3D 12";}
|
const char* platformName() const {return "Direct 3D 12";}
|
||||||
|
|
||||||
const IGraphicsBufferS* newStaticBuffer(BufferUse use, const void* data, size_t stride, size_t count);
|
IGraphicsBufferS* newStaticBuffer(BufferUse use, const void* data, size_t stride, size_t count);
|
||||||
IGraphicsBufferD* newDynamicBuffer(BufferUse use, size_t stride, size_t count);
|
IGraphicsBufferD* newDynamicBuffer(BufferUse use, size_t stride, size_t count);
|
||||||
|
|
||||||
const ITextureS* newStaticTexture(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
ITextureS* newStaticTexture(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
||||||
const void* data, size_t sz);
|
const void* data, size_t sz);
|
||||||
ITextureD* newDynamicTexture(size_t width, size_t height, TextureFormat fmt);
|
ITextureD* newDynamicTexture(size_t width, size_t height, TextureFormat fmt);
|
||||||
|
|
||||||
const IVertexFormat* newVertexFormat(size_t elementCount, const VertexElementDescriptor* elements);
|
IVertexFormat* newVertexFormat(size_t elementCount, const VertexElementDescriptor* elements);
|
||||||
|
|
||||||
const IShaderPipeline* newShaderPipeline(const char* vertSource, const char* fragSource,
|
IShaderPipeline* newShaderPipeline(const char* vertSource, const char* fragSource,
|
||||||
ComPtr<ID3DBlob>& vertBlobOut, ComPtr<ID3DBlob>& fragBlobOut,
|
ComPtr<ID3DBlob>& vertBlobOut, ComPtr<ID3DBlob>& fragBlobOut,
|
||||||
const IVertexFormat* vtxFmt,
|
const IVertexFormat* vtxFmt,
|
||||||
BlendFactor srcFac, BlendFactor dstFac,
|
BlendFactor srcFac, BlendFactor dstFac,
|
||||||
bool depthTest, bool depthWrite, bool backfaceCulling);
|
bool depthTest, bool depthWrite, bool backfaceCulling);
|
||||||
|
|
||||||
const IShaderDataBinding*
|
IShaderDataBinding*
|
||||||
newShaderDataBinding(IShaderPipeline* pipeline,
|
newShaderDataBinding(IShaderPipeline* pipeline,
|
||||||
IVertexFormat* vtxFormat,
|
IVertexFormat* vtxFormat,
|
||||||
IGraphicsBuffer* vbo, IGraphicsBuffer* ebo,
|
IGraphicsBuffer* vbo, IGraphicsBuffer* ebo,
|
||||||
|
|
|
@ -23,26 +23,26 @@ public:
|
||||||
Platform platform() const {return PlatformOGLES3;}
|
Platform platform() const {return PlatformOGLES3;}
|
||||||
const char* platformName() const {return "OpenGL ES 3.0";}
|
const char* platformName() const {return "OpenGL ES 3.0";}
|
||||||
|
|
||||||
const IGraphicsBufferS* newStaticBuffer(BufferUse use, const void* data, size_t sz);
|
IGraphicsBufferS* newStaticBuffer(BufferUse use, const void* data, size_t stride, size_t count);
|
||||||
IGraphicsBufferD* newDynamicBuffer(BufferUse use);
|
IGraphicsBufferD* newDynamicBuffer(BufferUse use, size_t stride, size_t count);
|
||||||
|
|
||||||
const ITextureS* newStaticTexture(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
ITextureS* newStaticTexture(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
||||||
const void* data, size_t sz);
|
const void* data, size_t sz);
|
||||||
ITextureD* newDynamicTexture(size_t width, size_t height, TextureFormat fmt);
|
ITextureD* newDynamicTexture(size_t width, size_t height, TextureFormat fmt);
|
||||||
|
|
||||||
const IVertexFormat* newVertexFormat(size_t elementCount, const VertexElementDescriptor* elements);
|
IVertexFormat* newVertexFormat(size_t elementCount, const VertexElementDescriptor* elements);
|
||||||
|
|
||||||
const IShaderPipeline* newShaderPipeline(const char* vertSource, const char* fragSource,
|
IShaderPipeline* newShaderPipeline(const char* vertSource, const char* fragSource,
|
||||||
size_t texCount, const char** texNames,
|
size_t texCount, const char** texNames,
|
||||||
BlendFactor srcFac, BlendFactor dstFac,
|
BlendFactor srcFac, BlendFactor dstFac,
|
||||||
bool depthTest, bool depthWrite, bool backfaceCulling);
|
bool depthTest, bool depthWrite, bool backfaceCulling);
|
||||||
|
|
||||||
const IShaderDataBinding*
|
IShaderDataBinding*
|
||||||
newShaderDataBinding(const IShaderPipeline* pipeline,
|
newShaderDataBinding(IShaderPipeline* pipeline,
|
||||||
const IVertexFormat* vtxFormat,
|
IVertexFormat* vtxFormat,
|
||||||
const IGraphicsBuffer* vbo, const IGraphicsBuffer* ebo,
|
IGraphicsBuffer* vbo, IGraphicsBuffer* ebo,
|
||||||
size_t ubufCount, const IGraphicsBuffer** ubufs,
|
size_t ubufCount, IGraphicsBuffer** ubufs,
|
||||||
size_t texCount, const ITexture** texs);
|
size_t texCount, ITexture** texs);
|
||||||
|
|
||||||
void reset();
|
void reset();
|
||||||
IGraphicsData* commit();
|
IGraphicsData* commit();
|
||||||
|
|
|
@ -147,21 +147,21 @@ struct IGraphicsDataFactory
|
||||||
virtual Platform platform() const=0;
|
virtual Platform platform() const=0;
|
||||||
virtual const char* platformName() const=0;
|
virtual const char* platformName() const=0;
|
||||||
|
|
||||||
virtual const IGraphicsBufferS*
|
virtual IGraphicsBufferS*
|
||||||
newStaticBuffer(BufferUse use, const void* data, size_t stride, size_t count)=0;
|
newStaticBuffer(BufferUse use, const void* data, size_t stride, size_t count)=0;
|
||||||
virtual IGraphicsBufferD*
|
virtual IGraphicsBufferD*
|
||||||
newDynamicBuffer(BufferUse use, size_t stride, size_t count)=0;
|
newDynamicBuffer(BufferUse use, size_t stride, size_t count)=0;
|
||||||
|
|
||||||
virtual const ITextureS*
|
virtual ITextureS*
|
||||||
newStaticTexture(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
newStaticTexture(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
||||||
const void* data, size_t sz)=0;
|
const void* data, size_t sz)=0;
|
||||||
virtual ITextureD*
|
virtual ITextureD*
|
||||||
newDynamicTexture(size_t width, size_t height, TextureFormat fmt)=0;
|
newDynamicTexture(size_t width, size_t height, TextureFormat fmt)=0;
|
||||||
|
|
||||||
virtual const IVertexFormat*
|
virtual IVertexFormat*
|
||||||
newVertexFormat(size_t elementCount, const VertexElementDescriptor* elements)=0;
|
newVertexFormat(size_t elementCount, const VertexElementDescriptor* elements)=0;
|
||||||
|
|
||||||
virtual const IShaderDataBinding*
|
virtual IShaderDataBinding*
|
||||||
newShaderDataBinding(IShaderPipeline* pipeline,
|
newShaderDataBinding(IShaderPipeline* pipeline,
|
||||||
IVertexFormat* vtxFormat,
|
IVertexFormat* vtxFormat,
|
||||||
IGraphicsBuffer* vbo, IGraphicsBuffer* ebo,
|
IGraphicsBuffer* vbo, IGraphicsBuffer* ebo,
|
||||||
|
|
|
@ -141,7 +141,7 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const IGraphicsBufferS*
|
IGraphicsBufferS*
|
||||||
D3D12DataFactory::newStaticBuffer(BufferUse use, const void* data, size_t stride, size_t count)
|
D3D12DataFactory::newStaticBuffer(BufferUse use, const void* data, size_t stride, size_t count)
|
||||||
{
|
{
|
||||||
D3D12GraphicsBufferS* retval = new D3D12GraphicsBufferS(use, m_ctx, data, stride, count);
|
D3D12GraphicsBufferS* retval = new D3D12GraphicsBufferS(use, m_ctx, data, stride, count);
|
||||||
|
@ -246,7 +246,7 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const ITextureS*
|
ITextureS*
|
||||||
D3D12DataFactory::newStaticTexture(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
D3D12DataFactory::newStaticTexture(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
||||||
const void* data, size_t sz)
|
const void* data, size_t sz)
|
||||||
{
|
{
|
||||||
|
@ -360,7 +360,7 @@ public:
|
||||||
D3D12ShaderPipeline(const D3D12ShaderPipeline&) = delete;
|
D3D12ShaderPipeline(const D3D12ShaderPipeline&) = delete;
|
||||||
};
|
};
|
||||||
|
|
||||||
const IShaderPipeline* D3D12DataFactory::newShaderPipeline
|
IShaderPipeline* D3D12DataFactory::newShaderPipeline
|
||||||
(const char* vertSource, const char* fragSource,
|
(const char* vertSource, const char* fragSource,
|
||||||
ComPtr<ID3DBlob>& vertBlobOut, ComPtr<ID3DBlob>& fragBlobOut,
|
ComPtr<ID3DBlob>& vertBlobOut, ComPtr<ID3DBlob>& fragBlobOut,
|
||||||
const IVertexFormat* vtxFmt,
|
const IVertexFormat* vtxFmt,
|
||||||
|
@ -520,7 +520,7 @@ struct D3D12ShaderDataBinding : IShaderDataBinding
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const IShaderDataBinding*
|
IShaderDataBinding*
|
||||||
D3D12DataFactory::newShaderDataBinding(IShaderPipeline* pipeline,
|
D3D12DataFactory::newShaderDataBinding(IShaderPipeline* pipeline,
|
||||||
IVertexFormat* vtxFormat,
|
IVertexFormat* vtxFormat,
|
||||||
IGraphicsBuffer* vbuf, IGraphicsBuffer* ibuf,
|
IGraphicsBuffer* vbuf, IGraphicsBuffer* ibuf,
|
||||||
|
@ -800,7 +800,7 @@ D3D12DataFactory::newDynamicTexture(size_t width, size_t height, TextureFormat f
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
const IVertexFormat* D3D12DataFactory::newVertexFormat
|
IVertexFormat* D3D12DataFactory::newVertexFormat
|
||||||
(size_t elementCount, const VertexElementDescriptor* elements)
|
(size_t elementCount, const VertexElementDescriptor* elements)
|
||||||
{
|
{
|
||||||
D3D12CommandQueue* q = static_cast<D3D12CommandQueue*>(m_parent->getCommandQueue());
|
D3D12CommandQueue* q = static_cast<D3D12CommandQueue*>(m_parent->getCommandQueue());
|
||||||
|
|
|
@ -30,7 +30,7 @@ static const GLenum USE_TABLE[] =
|
||||||
GL_UNIFORM_BUFFER
|
GL_UNIFORM_BUFFER
|
||||||
};
|
};
|
||||||
|
|
||||||
class GLES3GraphicsBufferS : IGraphicsBufferS
|
class GLES3GraphicsBufferS : public IGraphicsBufferS
|
||||||
{
|
{
|
||||||
friend class GLES3DataFactory;
|
friend class GLES3DataFactory;
|
||||||
friend struct GLES3CommandQueue;
|
friend struct GLES3CommandQueue;
|
||||||
|
@ -54,7 +54,7 @@ public:
|
||||||
{glBindBufferBase(GL_UNIFORM_BUFFER, idx, m_buf);}
|
{glBindBufferBase(GL_UNIFORM_BUFFER, idx, m_buf);}
|
||||||
};
|
};
|
||||||
|
|
||||||
class GLES3GraphicsBufferD : IGraphicsBufferD
|
class GLES3GraphicsBufferD : public IGraphicsBufferD
|
||||||
{
|
{
|
||||||
friend class GLES3DataFactory;
|
friend class GLES3DataFactory;
|
||||||
friend struct GLES3CommandQueue;
|
friend struct GLES3CommandQueue;
|
||||||
|
@ -81,15 +81,15 @@ public:
|
||||||
void bindUniform(size_t idx) const;
|
void bindUniform(size_t idx) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
const IGraphicsBufferS*
|
IGraphicsBufferS*
|
||||||
GLES3DataFactory::newStaticBuffer(BufferUse use, const void* data, size_t sz)
|
GLES3DataFactory::newStaticBuffer(BufferUse use, const void* data, size_t stride, size_t count)
|
||||||
{
|
{
|
||||||
GLES3GraphicsBufferS* retval = new GLES3GraphicsBufferS(use, data, sz);
|
GLES3GraphicsBufferS* retval = new GLES3GraphicsBufferS(use, data, stride * count);
|
||||||
static_cast<GLES3Data*>(m_deferredData)->m_SBufs.emplace_back(retval);
|
static_cast<GLES3Data*>(m_deferredData)->m_SBufs.emplace_back(retval);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
class GLES3TextureS : ITextureS
|
class GLES3TextureS : public ITextureS
|
||||||
{
|
{
|
||||||
friend class GLES3DataFactory;
|
friend class GLES3DataFactory;
|
||||||
GLuint m_tex;
|
GLuint m_tex;
|
||||||
|
@ -125,7 +125,7 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class GLES3TextureD : ITextureD
|
class GLES3TextureD : public ITextureD
|
||||||
{
|
{
|
||||||
friend class GLES3DataFactory;
|
friend class GLES3DataFactory;
|
||||||
friend struct GLES3CommandQueue;
|
friend struct GLES3CommandQueue;
|
||||||
|
@ -168,7 +168,7 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const ITextureS*
|
ITextureS*
|
||||||
GLES3DataFactory::newStaticTexture(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
GLES3DataFactory::newStaticTexture(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
||||||
const void* data, size_t sz)
|
const void* data, size_t sz)
|
||||||
{
|
{
|
||||||
|
@ -276,7 +276,7 @@ static const GLenum BLEND_FACTOR_TABLE[] =
|
||||||
GL_ONE_MINUS_DST_ALPHA
|
GL_ONE_MINUS_DST_ALPHA
|
||||||
};
|
};
|
||||||
|
|
||||||
const IShaderPipeline* GLES3DataFactory::newShaderPipeline
|
IShaderPipeline* GLES3DataFactory::newShaderPipeline
|
||||||
(const char* vertSource, const char* fragSource,
|
(const char* vertSource, const char* fragSource,
|
||||||
size_t texCount, const char** texNames,
|
size_t texCount, const char** texNames,
|
||||||
BlendFactor srcFac, BlendFactor dstFac,
|
BlendFactor srcFac, BlendFactor dstFac,
|
||||||
|
@ -368,19 +368,19 @@ struct GLES3ShaderDataBinding : IShaderDataBinding
|
||||||
const GLES3ShaderPipeline* m_pipeline;
|
const GLES3ShaderPipeline* m_pipeline;
|
||||||
const GLES3VertexFormat* m_vtxFormat;
|
const GLES3VertexFormat* m_vtxFormat;
|
||||||
size_t m_ubufCount;
|
size_t m_ubufCount;
|
||||||
std::unique_ptr<const IGraphicsBuffer*[]> m_ubufs;
|
std::unique_ptr<IGraphicsBuffer*[]> m_ubufs;
|
||||||
size_t m_texCount;
|
size_t m_texCount;
|
||||||
std::unique_ptr<const ITexture*[]> m_texs;
|
std::unique_ptr<ITexture*[]> m_texs;
|
||||||
GLES3ShaderDataBinding(const IShaderPipeline* pipeline,
|
GLES3ShaderDataBinding(IShaderPipeline* pipeline,
|
||||||
const IVertexFormat* vtxFormat,
|
IVertexFormat* vtxFormat,
|
||||||
size_t ubufCount, const IGraphicsBuffer** ubufs,
|
size_t ubufCount, IGraphicsBuffer** ubufs,
|
||||||
size_t texCount, const ITexture** texs)
|
size_t texCount, ITexture** texs)
|
||||||
: m_pipeline(static_cast<const GLES3ShaderPipeline*>(pipeline)),
|
: m_pipeline(static_cast<GLES3ShaderPipeline*>(pipeline)),
|
||||||
m_vtxFormat(static_cast<const GLES3VertexFormat*>(vtxFormat)),
|
m_vtxFormat(static_cast<GLES3VertexFormat*>(vtxFormat)),
|
||||||
m_ubufCount(ubufCount),
|
m_ubufCount(ubufCount),
|
||||||
m_ubufs(new const IGraphicsBuffer*[ubufCount]),
|
m_ubufs(new IGraphicsBuffer*[ubufCount]),
|
||||||
m_texCount(texCount),
|
m_texCount(texCount),
|
||||||
m_texs(new const ITexture*[texCount])
|
m_texs(new ITexture*[texCount])
|
||||||
{
|
{
|
||||||
for (size_t i=0 ; i<ubufCount ; ++i)
|
for (size_t i=0 ; i<ubufCount ; ++i)
|
||||||
m_ubufs[i] = ubufs[i];
|
m_ubufs[i] = ubufs[i];
|
||||||
|
@ -393,20 +393,28 @@ struct GLES3ShaderDataBinding : IShaderDataBinding
|
||||||
m_vtxFormat->bind();
|
m_vtxFormat->bind();
|
||||||
for (size_t i=0 ; i<m_ubufCount ; ++i)
|
for (size_t i=0 ; i<m_ubufCount ; ++i)
|
||||||
{
|
{
|
||||||
m_ubufs[i]->bindUniform(i);
|
if (m_ubufs[i]->dynamic())
|
||||||
|
static_cast<GLES3GraphicsBufferD*>(m_ubufs[i])->bindUniform(i);
|
||||||
|
else
|
||||||
|
static_cast<GLES3GraphicsBufferD*>(m_ubufs[i])->bindUniform(i);
|
||||||
glUniformBlockBinding(prog, i, i);
|
glUniformBlockBinding(prog, i, i);
|
||||||
}
|
}
|
||||||
for (size_t i=0 ; i<m_texCount ; ++i)
|
for (size_t i=0 ; i<m_texCount ; ++i)
|
||||||
m_texs[i]->bind(i);
|
{
|
||||||
|
if (m_texs[i]->dynamic())
|
||||||
|
static_cast<GLES3TextureD*>(m_texs[i])->bind(i);
|
||||||
|
else
|
||||||
|
static_cast<GLES3TextureS*>(m_texs[i])->bind(i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const IShaderDataBinding*
|
IShaderDataBinding*
|
||||||
GLES3DataFactory::newShaderDataBinding(const IShaderPipeline* pipeline,
|
GLES3DataFactory::newShaderDataBinding(IShaderPipeline* pipeline,
|
||||||
const IVertexFormat* vtxFormat,
|
IVertexFormat* vtxFormat,
|
||||||
const IGraphicsBuffer*, const IGraphicsBuffer*,
|
IGraphicsBuffer*, IGraphicsBuffer*,
|
||||||
size_t ubufCount, const IGraphicsBuffer** ubufs,
|
size_t ubufCount, IGraphicsBuffer** ubufs,
|
||||||
size_t texCount, const ITexture** texs)
|
size_t texCount, ITexture** texs)
|
||||||
{
|
{
|
||||||
GLES3ShaderDataBinding* retval =
|
GLES3ShaderDataBinding* retval =
|
||||||
new GLES3ShaderDataBinding(pipeline, vtxFormat, ubufCount, ubufs, texCount, texs);
|
new GLES3ShaderDataBinding(pipeline, vtxFormat, ubufCount, ubufs, texCount, texs);
|
||||||
|
@ -549,12 +557,18 @@ struct GLES3CommandQueue : IGraphicsCommandQueue
|
||||||
if (desc->vertBuffer != lastVBO)
|
if (desc->vertBuffer != lastVBO)
|
||||||
{
|
{
|
||||||
lastVBO = desc->vertBuffer;
|
lastVBO = desc->vertBuffer;
|
||||||
lastVBO->bindVertex();
|
if (lastVBO->dynamic())
|
||||||
|
static_cast<const GLES3GraphicsBufferD*>(lastVBO)->bindVertex();
|
||||||
|
else
|
||||||
|
static_cast<const GLES3GraphicsBufferS*>(lastVBO)->bindVertex();
|
||||||
}
|
}
|
||||||
if (desc->indexBuffer != lastEBO)
|
if (desc->indexBuffer != lastEBO)
|
||||||
{
|
{
|
||||||
lastEBO = desc->indexBuffer;
|
lastEBO = desc->indexBuffer;
|
||||||
lastEBO->bindIndex();
|
if (lastEBO->dynamic())
|
||||||
|
static_cast<const GLES3GraphicsBufferD*>(lastEBO)->bindIndex();
|
||||||
|
else
|
||||||
|
static_cast<const GLES3GraphicsBufferS*>(lastEBO)->bindIndex();
|
||||||
}
|
}
|
||||||
glEnableVertexAttribArray(i);
|
glEnableVertexAttribArray(i);
|
||||||
glVertexAttribPointer(i, SEMANTIC_COUNT_TABLE[desc->semantic],
|
glVertexAttribPointer(i, SEMANTIC_COUNT_TABLE[desc->semantic],
|
||||||
|
@ -820,7 +834,7 @@ void GLES3GraphicsBufferD::bindUniform(size_t idx) const
|
||||||
{glBindBufferBase(GL_UNIFORM_BUFFER, idx, m_bufs[m_q->m_drawBuf]);}
|
{glBindBufferBase(GL_UNIFORM_BUFFER, idx, m_bufs[m_q->m_drawBuf]);}
|
||||||
|
|
||||||
IGraphicsBufferD*
|
IGraphicsBufferD*
|
||||||
GLES3DataFactory::newDynamicBuffer(BufferUse use)
|
GLES3DataFactory::newDynamicBuffer(BufferUse use, size_t stride, size_t count)
|
||||||
{
|
{
|
||||||
GLES3CommandQueue* q = static_cast<GLES3CommandQueue*>(m_parent->getCommandQueue());
|
GLES3CommandQueue* q = static_cast<GLES3CommandQueue*>(m_parent->getCommandQueue());
|
||||||
GLES3GraphicsBufferD* retval = new GLES3GraphicsBufferD(q, use);
|
GLES3GraphicsBufferD* retval = new GLES3GraphicsBufferD(q, use);
|
||||||
|
@ -863,7 +877,7 @@ GLES3VertexFormat::GLES3VertexFormat(GLES3CommandQueue* q, size_t elementCount,
|
||||||
}
|
}
|
||||||
GLES3VertexFormat::~GLES3VertexFormat() {m_q->delVertexFormat(this);}
|
GLES3VertexFormat::~GLES3VertexFormat() {m_q->delVertexFormat(this);}
|
||||||
|
|
||||||
const IVertexFormat* GLES3DataFactory::newVertexFormat
|
IVertexFormat* GLES3DataFactory::newVertexFormat
|
||||||
(size_t elementCount, const VertexElementDescriptor* elements)
|
(size_t elementCount, const VertexElementDescriptor* elements)
|
||||||
{
|
{
|
||||||
GLES3CommandQueue* q = static_cast<GLES3CommandQueue*>(m_parent->getCommandQueue());
|
GLES3CommandQueue* q = static_cast<GLES3CommandQueue*>(m_parent->getCommandQueue());
|
||||||
|
|
|
@ -315,16 +315,12 @@ public:
|
||||||
{
|
{
|
||||||
fprintf(stderr, "%s\n", message);
|
fprintf(stderr, "%s\n", message);
|
||||||
}
|
}
|
||||||
typedef void(*glDebugMessageCallbackPROC)(DEBUGPROC callback, void* userParam);
|
typedef void(*glDebugMessageCallbackPROC)(DEBUGPROC callback, void* userParam);
|
||||||
|
|
||||||
void postInit()
|
void postInit()
|
||||||
{
|
{
|
||||||
GLXExtensionCheck();
|
GLXExtensionCheck();
|
||||||
GLXEnableVSync(m_xDisp, m_glxWindow);
|
GLXEnableVSync(m_xDisp, m_glxWindow);
|
||||||
|
|
||||||
glDebugMessageCallbackPROC glDebugMessageCb = (glDebugMessageCallbackPROC)
|
|
||||||
glXGetProcAddressARB((const GLubyte*)"glDebugMessageCallback");
|
|
||||||
glDebugMessageCb(DebugCb, nullptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
IGraphicsCommandQueue* getCommandQueue()
|
IGraphicsCommandQueue* getCommandQueue()
|
||||||
|
@ -337,7 +333,7 @@ public:
|
||||||
IGraphicsDataFactory* getDataFactory()
|
IGraphicsDataFactory* getDataFactory()
|
||||||
{
|
{
|
||||||
if (!m_dataFactory)
|
if (!m_dataFactory)
|
||||||
m_dataFactory = new struct GLES3DataFactory(this);
|
m_dataFactory = new class GLES3DataFactory(this);
|
||||||
return m_dataFactory;
|
return m_dataFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -446,7 +442,7 @@ public:
|
||||||
XIEventMask mask = {XIAllMasterDevices, XIMaskLen(XI_LASTEVENT)};
|
XIEventMask mask = {XIAllMasterDevices, XIMaskLen(XI_LASTEVENT)};
|
||||||
mask.mask = (unsigned char*)malloc(mask.mask_len);
|
mask.mask = (unsigned char*)malloc(mask.mask_len);
|
||||||
memset(mask.mask, 0, mask.mask_len);
|
memset(mask.mask, 0, mask.mask_len);
|
||||||
XISetMask(mask.mask, XI_Motion);
|
/* XISetMask(mask.mask, XI_Motion); Can't do this without losing mouse move events :( */
|
||||||
XISetMask(mask.mask, XI_TouchBegin);
|
XISetMask(mask.mask, XI_TouchBegin);
|
||||||
XISetMask(mask.mask, XI_TouchUpdate);
|
XISetMask(mask.mask, XI_TouchUpdate);
|
||||||
XISetMask(mask.mask, XI_TouchEnd);
|
XISetMask(mask.mask, XI_TouchEnd);
|
||||||
|
@ -765,6 +761,12 @@ public:
|
||||||
m_wy = event->xexpose.y;
|
m_wy = event->xexpose.y;
|
||||||
m_ww = event->xexpose.width;
|
m_ww = event->xexpose.width;
|
||||||
m_wh = event->xexpose.height;
|
m_wh = event->xexpose.height;
|
||||||
|
if (m_callback)
|
||||||
|
{
|
||||||
|
IWindowCallback::SWindowRect rect =
|
||||||
|
{ {m_wx, m_wy}, {m_ww, m_wh} };
|
||||||
|
m_callback->resized(rect);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case ConfigureNotify:
|
case ConfigureNotify:
|
||||||
|
@ -775,6 +777,13 @@ public:
|
||||||
m_wy = event->xconfigure.y;
|
m_wy = event->xconfigure.y;
|
||||||
m_ww = event->xconfigure.width;
|
m_ww = event->xconfigure.width;
|
||||||
m_wh = event->xconfigure.height;
|
m_wh = event->xconfigure.height;
|
||||||
|
|
||||||
|
if (m_callback)
|
||||||
|
{
|
||||||
|
IWindowCallback::SWindowRect rect =
|
||||||
|
{ {m_wx, m_wy}, {m_ww, m_wh} };
|
||||||
|
m_callback->resized(rect);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -822,6 +831,7 @@ public:
|
||||||
{
|
{
|
||||||
if (m_callback)
|
if (m_callback)
|
||||||
{
|
{
|
||||||
|
getWindowFrame(m_wx, m_wy, m_ww, m_wh);
|
||||||
int button = translateButton(event->xbutton.button);
|
int button = translateButton(event->xbutton.button);
|
||||||
if (button)
|
if (button)
|
||||||
{
|
{
|
||||||
|
@ -830,7 +840,7 @@ public:
|
||||||
{
|
{
|
||||||
{(unsigned)event->xbutton.x, (unsigned)event->xbutton.y},
|
{(unsigned)event->xbutton.x, (unsigned)event->xbutton.y},
|
||||||
{(unsigned)(event->xbutton.x / m_pixelFactor), (unsigned)(event->xbutton.y / m_pixelFactor)},
|
{(unsigned)(event->xbutton.x / m_pixelFactor), (unsigned)(event->xbutton.y / m_pixelFactor)},
|
||||||
{event->xbutton.x / (float)m_ww, event->xbutton.y / (float)m_wh}
|
{float(event->xbutton.x) / float(m_ww), float(event->xbutton.y) / float(m_wh)}
|
||||||
};
|
};
|
||||||
m_callback->mouseDown(coord, (IWindowCallback::EMouseButton)button,
|
m_callback->mouseDown(coord, (IWindowCallback::EMouseButton)button,
|
||||||
(IWindowCallback::EModifierKey)modifierMask);
|
(IWindowCallback::EModifierKey)modifierMask);
|
||||||
|
@ -844,7 +854,7 @@ public:
|
||||||
{
|
{
|
||||||
{(unsigned)event->xbutton.x, (unsigned)event->xbutton.y},
|
{(unsigned)event->xbutton.x, (unsigned)event->xbutton.y},
|
||||||
{(unsigned)(event->xbutton.x / m_pixelFactor), (unsigned)(event->xbutton.y / m_pixelFactor)},
|
{(unsigned)(event->xbutton.x / m_pixelFactor), (unsigned)(event->xbutton.y / m_pixelFactor)},
|
||||||
{event->xbutton.x / (float)m_ww, event->xbutton.y / (float)m_wh}
|
{(float)event->xbutton.x / (float)m_ww, (float)event->xbutton.y / (float)m_wh}
|
||||||
};
|
};
|
||||||
IWindowCallback::SScrollDelta scrollDelta =
|
IWindowCallback::SScrollDelta scrollDelta =
|
||||||
{
|
{
|
||||||
|
@ -868,6 +878,7 @@ public:
|
||||||
{
|
{
|
||||||
if (m_callback)
|
if (m_callback)
|
||||||
{
|
{
|
||||||
|
getWindowFrame(m_wx, m_wy, m_ww, m_wh);
|
||||||
int button = translateButton(event->xbutton.button);
|
int button = translateButton(event->xbutton.button);
|
||||||
if (button)
|
if (button)
|
||||||
{
|
{
|
||||||
|
@ -888,6 +899,7 @@ public:
|
||||||
{
|
{
|
||||||
if (m_callback)
|
if (m_callback)
|
||||||
{
|
{
|
||||||
|
getWindowFrame(m_wx, m_wy, m_ww, m_wh);
|
||||||
IWindowCallback::SWindowCoord coord =
|
IWindowCallback::SWindowCoord coord =
|
||||||
{
|
{
|
||||||
{(unsigned)event->xmotion.x, (unsigned)event->xmotion.y},
|
{(unsigned)event->xmotion.x, (unsigned)event->xmotion.y},
|
||||||
|
@ -902,10 +914,13 @@ public:
|
||||||
{
|
{
|
||||||
if (event->xgeneric.extension == XINPUT_OPCODE)
|
if (event->xgeneric.extension == XINPUT_OPCODE)
|
||||||
{
|
{
|
||||||
|
getWindowFrame(m_wx, m_wy, m_ww, m_wh);
|
||||||
switch (event->xgeneric.evtype)
|
switch (event->xgeneric.evtype)
|
||||||
{
|
{
|
||||||
case XI_Motion:
|
case XI_Motion:
|
||||||
{
|
{
|
||||||
|
fprintf(stderr, "motion\n");
|
||||||
|
|
||||||
XIDeviceEvent* ev = (XIDeviceEvent*)event;
|
XIDeviceEvent* ev = (XIDeviceEvent*)event;
|
||||||
if (m_lastInputID != ev->deviceid)
|
if (m_lastInputID != ev->deviceid)
|
||||||
_pointingDeviceChanged(ev->deviceid);
|
_pointingDeviceChanged(ev->deviceid);
|
||||||
|
|
|
@ -115,6 +115,9 @@ public:
|
||||||
|
|
||||||
struct CTestWindowCallback : IWindowCallback
|
struct CTestWindowCallback : IWindowCallback
|
||||||
{
|
{
|
||||||
|
void resized(const SWindowRect& rect)
|
||||||
|
{ fprintf(stderr, "Resized %d, %d (%d, %d)\n", rect.size[0], rect.size[1], rect.location[0], rect.location[1]); }
|
||||||
|
|
||||||
void mouseDown(const SWindowCoord& coord, EMouseButton button, EModifierKey mods)
|
void mouseDown(const SWindowCoord& coord, EMouseButton button, EModifierKey mods)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Mouse Down %d (%f,%f)\n", button, coord.norm[0], coord.norm[1]);
|
fprintf(stderr, "Mouse Down %d (%f,%f)\n", button, coord.norm[0], coord.norm[1]);
|
||||||
|
@ -125,7 +128,7 @@ struct CTestWindowCallback : IWindowCallback
|
||||||
}
|
}
|
||||||
void mouseMove(const SWindowCoord& coord)
|
void mouseMove(const SWindowCoord& coord)
|
||||||
{
|
{
|
||||||
//fprintf(stderr, "Mouse Move (%f,%f)\n", coord.norm[0], coord.norm[1]);
|
fprintf(stderr, "Mouse Move (%f,%f)\n", coord.norm[0], coord.norm[1]);
|
||||||
}
|
}
|
||||||
void scroll(const SWindowCoord& coord, const SScrollDelta& scroll)
|
void scroll(const SWindowCoord& coord, const SScrollDelta& scroll)
|
||||||
{
|
{
|
||||||
|
@ -201,16 +204,16 @@ struct TestApplicationCallback : IApplicationCallback
|
||||||
{{0.5,-0.5},{1.0,0.0}},
|
{{0.5,-0.5},{1.0,0.0}},
|
||||||
{{-0.5,-0.5},{0.0,0.0}}
|
{{-0.5,-0.5},{0.0,0.0}}
|
||||||
};
|
};
|
||||||
const IGraphicsBuffer* vbo =
|
IGraphicsBuffer* vbo =
|
||||||
factory->newStaticBuffer(BufferUseVertex, quad, sizeof(quad));
|
factory->newStaticBuffer(BufferUseVertex, quad, sizeof(quad), 4);
|
||||||
|
|
||||||
/* Make vertex format */
|
/* Make vertex format */
|
||||||
const VertexElementDescriptor descs[2] =
|
VertexElementDescriptor descs[2] =
|
||||||
{
|
{
|
||||||
{vbo, nullptr, VertexSemanticPosition},
|
{vbo, nullptr, VertexSemanticPosition},
|
||||||
{vbo, nullptr, VertexSemanticUV}
|
{vbo, nullptr, VertexSemanticUV}
|
||||||
};
|
};
|
||||||
const IVertexFormat* vfmt = factory->newVertexFormat(2, descs);
|
IVertexFormat* vfmt = factory->newVertexFormat(2, descs);
|
||||||
|
|
||||||
/* Make ramp texture */
|
/* Make ramp texture */
|
||||||
using Pixel = uint8_t[4];
|
using Pixel = uint8_t[4];
|
||||||
|
@ -223,7 +226,7 @@ struct TestApplicationCallback : IApplicationCallback
|
||||||
tex[i][j][2] = 0;
|
tex[i][j][2] = 0;
|
||||||
tex[i][j][3] = 0xff;
|
tex[i][j][3] = 0xff;
|
||||||
}
|
}
|
||||||
const ITexture* texture =
|
ITexture* texture =
|
||||||
factory->newStaticTexture(256, 256, 1, TextureFormatRGBA8, tex, 256*256*4);
|
factory->newStaticTexture(256, 256, 1, TextureFormatRGBA8, tex, 256*256*4);
|
||||||
|
|
||||||
/* Make shader pipeline */
|
/* Make shader pipeline */
|
||||||
|
@ -251,7 +254,7 @@ struct TestApplicationCallback : IApplicationCallback
|
||||||
|
|
||||||
static const char* TexNames[] = {"smplr"};
|
static const char* TexNames[] = {"smplr"};
|
||||||
|
|
||||||
const IShaderPipeline* pipeline =
|
IShaderPipeline* pipeline =
|
||||||
factory->newShaderPipeline(VS, FS, 1, TexNames, BlendFactorOne, BlendFactorZero, true, true, false);
|
factory->newShaderPipeline(VS, FS, 1, TexNames, BlendFactorOne, BlendFactorZero, true, true, false);
|
||||||
|
|
||||||
/* Make shader data binding */
|
/* Make shader data binding */
|
||||||
|
@ -301,7 +304,7 @@ struct TestApplicationCallback : IApplicationCallback
|
||||||
gfxQ->present();
|
gfxQ->present();
|
||||||
gfxQ->execute();
|
gfxQ->execute();
|
||||||
|
|
||||||
fprintf(stderr, "%zu\n", frameIdx);
|
//fprintf(stderr, "%zu\n", frameIdx);
|
||||||
++frameIdx;
|
++frameIdx;
|
||||||
|
|
||||||
if ((frameIdx - lastCheck) > 100)
|
if ((frameIdx - lastCheck) > 100)
|
||||||
|
|
Loading…
Reference in New Issue