|
@@ -37,6 +37,8 @@ struct Quaternion {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
final class Mesh {
|
|
final class Mesh {
|
|
|
public:
|
|
public:
|
|
|
Vertex[] vertexData;
|
|
Vertex[] vertexData;
|
|
@@ -44,11 +46,11 @@ public:
|
|
|
UV[] textureData;
|
|
UV[] textureData;
|
|
|
Color[] colorData;
|
|
Color[] colorData;
|
|
|
|
|
|
|
|
- Unique!(VertexArrayObject) vao;
|
|
|
|
|
- Unique!(VertexBufferObject!(VertexBufferObjectTarget.Array)) vboVertexData;
|
|
|
|
|
- Unique!(VertexBufferObject!(VertexBufferObjectTarget.Array)) vboNormalData;
|
|
|
|
|
- Unique!(VertexBufferObject!(VertexBufferObjectTarget.Array)) vboTextureData;
|
|
|
|
|
- Unique!(VertexBufferObject!(VertexBufferObjectTarget.Array)) vboColorData;
|
|
|
|
|
|
|
+ VertexArrayObject vao;
|
|
|
|
|
+ VertexBufferObject!(VertexBufferObjectTarget.Array) vboVertexData;
|
|
|
|
|
+ VertexBufferObject!(VertexBufferObjectTarget.Array) vboNormalData;
|
|
|
|
|
+ VertexBufferObject!(VertexBufferObjectTarget.Array) vboTextureData;
|
|
|
|
|
+ VertexBufferObject!(VertexBufferObjectTarget.Array) vboColorData;
|
|
|
|
|
|
|
|
this(string filePath) {
|
|
this(string filePath) {
|
|
|
writeln("loading scene: ", filePath);
|
|
writeln("loading scene: ", filePath);
|
|
@@ -87,9 +89,11 @@ public:
|
|
|
|
|
|
|
|
//-----------------------------
|
|
//-----------------------------
|
|
|
// upload
|
|
// upload
|
|
|
|
|
+ writeln("uploading mesh: ", filePath);
|
|
|
vao = new VertexArrayObject();
|
|
vao = new VertexArrayObject();
|
|
|
vao.bind();
|
|
vao.bind();
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
+ writeln("vertex data");
|
|
|
vboVertexData = new VertexBufferObject!(VertexBufferObjectTarget.Array);
|
|
vboVertexData = new VertexBufferObject!(VertexBufferObjectTarget.Array);
|
|
|
vboVertexData.bind();
|
|
vboVertexData.bind();
|
|
|
GLuint attribIndex = 0;
|
|
GLuint attribIndex = 0;
|
|
@@ -97,7 +101,8 @@ public:
|
|
|
glEnableVertexAttribArray(attribIndex);
|
|
glEnableVertexAttribArray(attribIndex);
|
|
|
glVertexAttribPointer(attribIndex, 3, GL_FLOAT, GL_FALSE, 0, cast(void*)0);
|
|
glVertexAttribPointer(attribIndex, 3, GL_FLOAT, GL_FALSE, 0, cast(void*)0);
|
|
|
vboVertexData.unbind();
|
|
vboVertexData.unbind();
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
+ writeln("normal data");
|
|
|
vboNormalData = new VertexBufferObject!(VertexBufferObjectTarget.Array);
|
|
vboNormalData = new VertexBufferObject!(VertexBufferObjectTarget.Array);
|
|
|
vboNormalData.bind();
|
|
vboNormalData.bind();
|
|
|
attribIndex = 1;
|
|
attribIndex = 1;
|
|
@@ -105,7 +110,8 @@ public:
|
|
|
glEnableVertexAttribArray(attribIndex);
|
|
glEnableVertexAttribArray(attribIndex);
|
|
|
glVertexAttribPointer(attribIndex, 3, GL_FLOAT, GL_FALSE, 0, cast(void*)0);
|
|
glVertexAttribPointer(attribIndex, 3, GL_FLOAT, GL_FALSE, 0, cast(void*)0);
|
|
|
vboNormalData.unbind();
|
|
vboNormalData.unbind();
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
+ writeln("uv data");
|
|
|
vboTextureData = new VertexBufferObject!(VertexBufferObjectTarget.Array);
|
|
vboTextureData = new VertexBufferObject!(VertexBufferObjectTarget.Array);
|
|
|
vboTextureData.bind();
|
|
vboTextureData.bind();
|
|
|
attribIndex = 2;
|
|
attribIndex = 2;
|
|
@@ -113,7 +119,8 @@ public:
|
|
|
glEnableVertexAttribArray(attribIndex);
|
|
glEnableVertexAttribArray(attribIndex);
|
|
|
glVertexAttribPointer(attribIndex, 2, GL_FLOAT, GL_FALSE, 0, cast(void*)0);
|
|
glVertexAttribPointer(attribIndex, 2, GL_FLOAT, GL_FALSE, 0, cast(void*)0);
|
|
|
vboTextureData.unbind();
|
|
vboTextureData.unbind();
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
+ writeln("color data");
|
|
|
vboColorData = new VertexBufferObject!(VertexBufferObjectTarget.Array);
|
|
vboColorData = new VertexBufferObject!(VertexBufferObjectTarget.Array);
|
|
|
vboColorData.bind();
|
|
vboColorData.bind();
|
|
|
attribIndex = 3;
|
|
attribIndex = 3;
|
|
@@ -123,81 +130,51 @@ public:
|
|
|
vboColorData.unbind();
|
|
vboColorData.unbind();
|
|
|
|
|
|
|
|
vao.unbind();
|
|
vao.unbind();
|
|
|
|
|
+ writeln("done");
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
|
-class Tester {
|
|
|
|
|
- Unique!(Window) _window;
|
|
|
|
|
- bool _keepRunning = true;
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
- this() {
|
|
|
|
|
- this._window = initThree();
|
|
|
|
|
- this._window.onKey.connect!"_onKey"(this);
|
|
|
|
|
- this._window.onClose.connect!"_onClose"(this);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+void setupTweakbar() {
|
|
|
|
|
+ writeln("creating TweakBar");
|
|
|
|
|
+ double time = 0, dt; // Current time and enlapsed time
|
|
|
|
|
+ double turn = 0; // Model turn counter
|
|
|
|
|
+ double speed = 0.3; // Model rotation speed
|
|
|
|
|
+ int wire = 0; // Draw model in wireframe?
|
|
|
|
|
+ uint frameCount = 0;
|
|
|
|
|
+ double fps = 0;
|
|
|
|
|
+ float bgColor[3] = [0.1f, 0.2f, 0.4f]; // Background color
|
|
|
|
|
+ ubyte cubeColor[4] = [255, 0, 0, 128]; // Model color (32bits RGBA)
|
|
|
|
|
|
|
|
- ~this() {
|
|
|
|
|
- //_window.destroy();
|
|
|
|
|
- deinitThree();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- void run() {
|
|
|
|
|
- auto mesh = new Mesh("C:/Coding/models/Collada/duck.dae");
|
|
|
|
|
-
|
|
|
|
|
- //-----------------
|
|
|
|
|
- // Create TweakBar
|
|
|
|
|
- writeln("creating TweakBar");
|
|
|
|
|
- double time = 0, dt; // Current time and enlapsed time
|
|
|
|
|
- double turn = 0; // Model turn counter
|
|
|
|
|
- double speed = 0.3; // Model rotation speed
|
|
|
|
|
- int wire = 0; // Draw model in wireframe?
|
|
|
|
|
- uint frameCount = 0;
|
|
|
|
|
- double fps = 0;
|
|
|
|
|
- float bgColor[3] = [0.1f, 0.2f, 0.4f]; // Background color
|
|
|
|
|
- ubyte cubeColor[4] = [255, 0, 0, 128]; // Model color (32bits RGBA)
|
|
|
|
|
-
|
|
|
|
|
- auto quat = Quaternion(0,0,0,1);
|
|
|
|
|
-
|
|
|
|
|
-// auto w = this._window.getBounds()[2];
|
|
|
|
|
-// auto h = this._window.getBounds()[3];
|
|
|
|
|
- TwWindowSize(1600, 900);
|
|
|
|
|
-
|
|
|
|
|
- // Create a tweak bar
|
|
|
|
|
- auto bar = TwNewBar("TweakBar");
|
|
|
|
|
- TwDefine(" GLOBAL help='This example shows how to integrate AntTweakBar with GLFW and OpenGL.' "); // Message added to the help bar.
|
|
|
|
|
- // Add 'speed' to 'bar': it is a modifable (RW) variable of type TW_TYPE_DOUBLE. Its key shortcuts are [s] and [S].
|
|
|
|
|
- TwAddVarRW(bar, "speed", TW_TYPE_DOUBLE, &speed, " label='Rot speed' min=0 max=2 step=0.01 keyIncr=s keyDecr=S help='Rotation speed (turns/second)' ");
|
|
|
|
|
- // Add 'wire' to 'bar': it is a modifable variable of type TW_TYPE_BOOL32 (32 bits boolean). Its key shortcut is [w].
|
|
|
|
|
- TwAddVarRW(bar, "wire", TW_TYPE_BOOL32, &wire, " label='Wireframe mode' key=CTRL+w help='Toggle wireframe display mode.' ");
|
|
|
|
|
- // Add 'time' to 'bar': it is a read-only (RO) variable of type TW_TYPE_DOUBLE, with 1 precision digit
|
|
|
|
|
- TwAddVarRO(bar, "time", TW_TYPE_DOUBLE, &time, " label='Time' precision=1 help='Time (in seconds).' ");
|
|
|
|
|
- //
|
|
|
|
|
- TwAddVarRO(bar, "frameCount", TW_TYPE_UINT32, &frameCount, " label='FrameCount' precision=1 help='FrameCount (in counts).' ");
|
|
|
|
|
- TwAddVarRO(bar, "fps", TW_TYPE_DOUBLE, &fps, " label='fps' precision=1 help='fps (in fps).' ");
|
|
|
|
|
- // Add 'bgColor' to 'bar': it is a modifable variable of type TW_TYPE_COLOR3F (3 floats color)
|
|
|
|
|
- TwAddVarRW(bar, "bgColor", TW_TYPE_COLOR3F, &bgColor, " label='Background color' ");
|
|
|
|
|
- // Add 'cubeColor' to 'bar': it is a modifable variable of type TW_TYPE_COLOR32 (32 bits color) with alpha
|
|
|
|
|
- TwAddVarRW(bar, "cubeColor", TW_TYPE_COLOR32, &cubeColor, " label='Cube color' alpha help='Color and transparency of the cube.' ");
|
|
|
|
|
- //
|
|
|
|
|
-// TwAddVarRW(bar, "quaternion", TW_TYPE_QUAT4F, &quat, " label='Cube color' alpha help='Color and transparency of the cube.' ");
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
- //-----------------
|
|
|
|
|
- // Create Mesh
|
|
|
|
|
- Vector3f vertices[3] = [
|
|
|
|
|
- Vector3f(-1.0f, -1.0f, 0.0f),
|
|
|
|
|
- Vector3f( 1.0f, -1.0f, 0.0f),
|
|
|
|
|
- Vector3f( 0.0f, 1.0f, 0.0f)
|
|
|
|
|
- ];
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
|
|
+ auto quat = Quaternion(0,0,0,1);
|
|
|
|
|
+
|
|
|
|
|
+ // auto w = this._window.getBounds()[2];
|
|
|
|
|
+ // auto h = this._window.getBounds()[3];
|
|
|
|
|
+ TwWindowSize(1600, 900);
|
|
|
|
|
+
|
|
|
|
|
+ // Create a tweak bar
|
|
|
|
|
+ auto bar = TwNewBar("TweakBar");
|
|
|
|
|
+ TwDefine(" GLOBAL help='This example shows how to integrate AntTweakBar with GLFW and OpenGL.' "); // Message added to the help bar.
|
|
|
|
|
+ // Add 'speed' to 'bar': it is a modifable (RW) variable of type TW_TYPE_DOUBLE. Its key shortcuts are [s] and [S].
|
|
|
|
|
+ TwAddVarRW(bar, "speed", TW_TYPE_DOUBLE, &speed, " label='Rot speed' min=0 max=2 step=0.01 keyIncr=s keyDecr=S help='Rotation speed (turns/second)' ");
|
|
|
|
|
+ // Add 'wire' to 'bar': it is a modifable variable of type TW_TYPE_BOOL32 (32 bits boolean). Its key shortcut is [w].
|
|
|
|
|
+ TwAddVarRW(bar, "wire", TW_TYPE_BOOL32, &wire, " label='Wireframe mode' key=CTRL+w help='Toggle wireframe display mode.' ");
|
|
|
|
|
+ // Add 'time' to 'bar': it is a read-only (RO) variable of type TW_TYPE_DOUBLE, with 1 precision digit
|
|
|
|
|
+ TwAddVarRO(bar, "time", TW_TYPE_DOUBLE, &time, " label='Time' precision=1 help='Time (in seconds).' ");
|
|
|
|
|
+ //
|
|
|
|
|
+ TwAddVarRO(bar, "frameCount", TW_TYPE_UINT32, &frameCount, " label='FrameCount' precision=1 help='FrameCount (in counts).' ");
|
|
|
|
|
+ TwAddVarRO(bar, "fps", TW_TYPE_DOUBLE, &fps, " label='fps' precision=1 help='fps (in fps).' ");
|
|
|
|
|
+ // Add 'bgColor' to 'bar': it is a modifable variable of type TW_TYPE_COLOR3F (3 floats color)
|
|
|
|
|
+ TwAddVarRW(bar, "bgColor", TW_TYPE_COLOR3F, &bgColor, " label='Background color' ");
|
|
|
|
|
+ // Add 'cubeColor' to 'bar': it is a modifable variable of type TW_TYPE_COLOR32 (32 bits color) with alpha
|
|
|
|
|
+ TwAddVarRW(bar, "cubeColor", TW_TYPE_COLOR32, &cubeColor, " label='Cube color' alpha help='Color and transparency of the cube.' ");
|
|
|
|
|
+ //
|
|
|
|
|
+ // TwAddVarRW(bar, "quaternion", TW_TYPE_QUAT4F, &quat, " label='Cube color' alpha help='Color and transparency of the cube.' ");
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- //-----------------
|
|
|
|
|
- // Create Shaders
|
|
|
|
|
- enum vertexShaderSource = "
|
|
|
|
|
|
|
+//-----------------
|
|
|
|
|
+// Create Shaders
|
|
|
|
|
+enum vertexShaderSource = "
|
|
|
#version 420 core
|
|
#version 420 core
|
|
|
|
|
|
|
|
layout(location = 0) in vec3 in_position;
|
|
layout(location = 0) in vec3 in_position;
|
|
@@ -220,7 +197,7 @@ class Tester {
|
|
|
}
|
|
}
|
|
|
";
|
|
";
|
|
|
|
|
|
|
|
- enum fragmentShaderSource = "
|
|
|
|
|
|
|
+enum fragmentShaderSource = "
|
|
|
#version 420 core
|
|
#version 420 core
|
|
|
in vec4 v_color;
|
|
in vec4 v_color;
|
|
|
|
|
|
|
@@ -232,25 +209,64 @@ class Tester {
|
|
|
}
|
|
}
|
|
|
";
|
|
";
|
|
|
|
|
|
|
|
- Unique!(Shader!(ShaderType.Vertex)) vertexShader = new Shader!(ShaderType.Vertex)(vertexShaderSource);
|
|
|
|
|
- Unique!(Shader!(ShaderType.Fragment)) fragmentShader = new Shader!(ShaderType.Fragment)(fragmentShaderSource);
|
|
|
|
|
|
|
|
|
|
- assert(vertexShader.isLinked, vertexShader.infoLog());
|
|
|
|
|
- assert(fragmentShader.isLinked, fragmentShader.infoLog());
|
|
|
|
|
|
|
+auto createShaderPipeline(Shader!(ShaderType.Vertex) vertexShader, Shader!(ShaderType.Fragment) fragmentShader) {
|
|
|
|
|
+ assert(vertexShader.isLinked, vertexShader.infoLog());
|
|
|
|
|
+ assert(fragmentShader.isLinked, fragmentShader.infoLog());
|
|
|
|
|
+
|
|
|
|
|
+ writeln("a: ");
|
|
|
|
|
+ auto shaderPipeline = new ShaderPipeline();
|
|
|
|
|
+ shaderPipeline.bind();
|
|
|
|
|
+ shaderPipeline.use(vertexShader);
|
|
|
|
|
+ shaderPipeline.use(fragmentShader);
|
|
|
|
|
+ writeln("b: ");
|
|
|
|
|
+ assert(shaderPipeline.isValidProgramPipeline, shaderPipeline.infoLog());
|
|
|
|
|
+ shaderPipeline.unbind();
|
|
|
|
|
+ writeln("c: ");
|
|
|
|
|
+ return shaderPipeline;
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- Unique!(ShaderPipeline) shaderPipeline = new ShaderPipeline();
|
|
|
|
|
- shaderPipeline.bind();
|
|
|
|
|
- shaderPipeline.use(vertexShader);
|
|
|
|
|
- shaderPipeline.use(fragmentShader);
|
|
|
|
|
- assert(shaderPipeline.isValidProgramPipeline, shaderPipeline.infoLog());
|
|
|
|
|
- shaderPipeline.unbind();
|
|
|
|
|
|
|
+class Tester {
|
|
|
|
|
+ Window _window;
|
|
|
|
|
+ bool _keepRunning = true;
|
|
|
|
|
|
|
|
|
|
+ this() {
|
|
|
|
|
+ this._window = initThree();
|
|
|
|
|
+ this._window.onKey.connect!"_onKey"(this);
|
|
|
|
|
+ this._window.onClose.connect!"_onClose"(this);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ ~this() {
|
|
|
|
|
+ import core.memory;
|
|
|
|
|
+ writeln("GC.collect: ");
|
|
|
|
|
+ GC.collect();
|
|
|
|
|
+ //Collect window _AFTER_ everything else
|
|
|
|
|
+ this._window = null;
|
|
|
|
|
+ GC.collect();
|
|
|
|
|
+ deinitThree();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ void run() {
|
|
|
|
|
+
|
|
|
|
|
+ auto mesh = new Mesh("C:/Coding/models/Collada/duck.dae");
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ setupTweakbar();
|
|
|
|
|
|
|
|
|
|
+ writeln("creating shaders: ");
|
|
|
|
|
+ auto vertexShader = new Shader!(ShaderType.Vertex)(vertexShaderSource);
|
|
|
|
|
+ auto fragmentShader = new Shader!(ShaderType.Fragment)(fragmentShaderSource);
|
|
|
|
|
+ writeln("creating shader pipeline: ");
|
|
|
|
|
+ auto shaderPipeline = createShaderPipeline(vertexShader, fragmentShader);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ writeln("connectiong window callbacks: ");
|
|
|
this._window.onSize.connect!"onSize"(this);
|
|
this._window.onSize.connect!"onSize"(this);
|
|
|
this._window.onPosition.connect!"onPosition"(this);
|
|
this._window.onPosition.connect!"onPosition"(this);
|
|
|
this._window.onButton.connect!"onButton"(this);
|
|
this._window.onButton.connect!"onButton"(this);
|
|
|
this._window.onCursorPos.connect!"onCursorPos"(this);
|
|
this._window.onCursorPos.connect!"onCursorPos"(this);
|
|
|
|
|
|
|
|
|
|
+ writeln("begin render loop: ");
|
|
|
//-----------------
|
|
//-----------------
|
|
|
// Render Loop
|
|
// Render Loop
|
|
|
glfwSetTime(0);
|
|
glfwSetTime(0);
|
|
@@ -269,42 +285,39 @@ class Tester {
|
|
|
TwDraw();
|
|
TwDraw();
|
|
|
|
|
|
|
|
this._window.swapBuffers();
|
|
this._window.swapBuffers();
|
|
|
|
|
+ updateWindows();
|
|
|
|
|
|
|
|
- ++frameCount;
|
|
|
|
|
- //if(frameCount % 100 == 0) {
|
|
|
|
|
- updateWindows();
|
|
|
|
|
- time = glfwGetTime();
|
|
|
|
|
- fps = cast(double)frameCount / time;
|
|
|
|
|
- //}
|
|
|
|
|
|
|
+
|
|
|
|
|
+// ++frameCount;
|
|
|
|
|
+// //if(frameCount % 100 == 0) {
|
|
|
|
|
+// time = glfwGetTime();
|
|
|
|
|
+// fps = cast(double)frameCount / time;
|
|
|
|
|
+// //}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-
|
|
|
|
|
- void onSize(Window w, int x, int y) {
|
|
|
|
|
|
|
+ void onSize(Window window, int width, int height) {
|
|
|
|
|
+ TwWindowSize(width, height);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- void onPosition(Window w, int x, int y) {
|
|
|
|
|
|
|
+ void onPosition(Window window, int x, int y) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ void onButton(Window window , int button, ButtonAction action) {
|
|
|
|
|
+ TwMouseAction twaction = action == ButtonAction.Pressed ? TW_MOUSE_PRESSED : TW_MOUSE_RELEASED;
|
|
|
|
|
+ TwMouseButtonID twbutton;
|
|
|
|
|
|
|
|
-//#define GLFW_MOUSE_BUTTON_LAST GLFW_MOUSE_BUTTON_8
|
|
|
|
|
-//#define GLFW_MOUSE_BUTTON_LEFT GLFW_MOUSE_BUTTON_1
|
|
|
|
|
-//#define GLFW_MOUSE_BUTTON_RIGHT GLFW_MOUSE_BUTTON_2
|
|
|
|
|
-//#define GLFW_MOUSE_BUTTON_MIDDLE GLFW_MOUSE_BUTTON_3
|
|
|
|
|
-//
|
|
|
|
|
-//
|
|
|
|
|
-// TW_MOUSE_LEFT = 1,
|
|
|
|
|
-// TW_MOUSE_MIDDLE = 2,
|
|
|
|
|
-// TW_MOUSE_RIGHT = 3
|
|
|
|
|
-
|
|
|
|
|
- void onButton(Window w , int b, ButtonAction a) {
|
|
|
|
|
- TwMouseAction action = a == ButtonAction.Pressed ? TW_MOUSE_PRESSED : TW_MOUSE_RELEASED;
|
|
|
|
|
- TwMouseButtonID button = b;
|
|
|
|
|
- TwMouseButton(action, button);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ switch(button) {
|
|
|
|
|
+ default:
|
|
|
|
|
+ case GLFW_MOUSE_BUTTON_LEFT: twbutton = TW_MOUSE_LEFT; break;
|
|
|
|
|
+ case GLFW_MOUSE_BUTTON_RIGHT: twbutton = TW_MOUSE_RIGHT; break;
|
|
|
|
|
+ case GLFW_MOUSE_BUTTON_MIDDLE: twbutton = TW_MOUSE_MIDDLE; break;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- void onCursorPos(Window w, double x, double y) {
|
|
|
|
|
|
|
+ TwMouseButton(twaction, twbutton);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
+ void onCursorPos(Window window, double x, double y) {
|
|
|
TwMouseMotion(cast(int)x, this._window.getBounds()[3] - cast(int)y);
|
|
TwMouseMotion(cast(int)x, this._window.getBounds()[3] - cast(int)y);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -313,7 +326,7 @@ class Tester {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void _onKey(Window window, Key key, ScanCode scanCode, KeyAction action, KeyMod keyMod) {
|
|
void _onKey(Window window, Key key, ScanCode scanCode, KeyAction action, KeyMod keyMod) {
|
|
|
- if(window is this._window.opDot() && action == KeyAction.Pressed) {
|
|
|
|
|
|
|
+ if(window is this._window && action == KeyAction.Pressed) {
|
|
|
if(key == Key.Escape) {
|
|
if(key == Key.Escape) {
|
|
|
this.stop();
|
|
this.stop();
|
|
|
}
|
|
}
|