summaryrefslogtreecommitdiff
path: root/source/tests/win32/01-window/03_sub_menu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/tests/win32/01-window/03_sub_menu.cpp')
-rw-r--r--source/tests/win32/01-window/03_sub_menu.cpp209
1 files changed, 170 insertions, 39 deletions
diff --git a/source/tests/win32/01-window/03_sub_menu.cpp b/source/tests/win32/01-window/03_sub_menu.cpp
index 091db6d..6343f06 100644
--- a/source/tests/win32/01-window/03_sub_menu.cpp
+++ b/source/tests/win32/01-window/03_sub_menu.cpp
@@ -4,9 +4,12 @@
#include <asura-utils/io/file_system.h>
#include <asura-utils/io/data_buffer.h>
#include <asura-core/graphics/image.h>
+#include <asura-core/graphics/shader.h>
#include <asura-core/image/image_data.h>
#include <SDL2/SDL.h>
+#include <string>
+using namespace std;
using namespace AEIO;
using namespace AEGraphics;
@@ -22,6 +25,81 @@ void AddMenus(HWND);
HWND wnd;
+AEMath::Recti viewport;
+
+
+/*
+shader в
+* MVP matrix
+* position
+* UV
+* UV_0
+* UV_1
+* UV_2
+* UV_n
+* framework涨壬DZ༭ҪΪ༭ȾͼƬȾ
+* Asura Shader Semantics.
+*/
+string shader_frame = R"(
+//
+in vec2 asura_position;
+in vec4 asura_color;
+// asura_texcoord(n)
+in vec2 asura_texcoord0;
+in vec2 asura_texcoord1;
+in vec2 asura_texcoord2;
+in vec2 asura_texcoord3;
+in vec2 asura_texcoord4;
+
+// uniform
+uniform mat4 asura_projection_matrix;
+uniform mat4 asura_model_matrix;
+uniform mat4 asura_view_matrix;
+
+uniform mat4 asura_draw_color;
+
+uniform int asura_layer; // 0~10000Ȳ
+
+uniform vec2 asura_time; // 뵱ǰʱǰ֡ļ
+
+)";
+
+string vert = R"(
+
+in vec2 vertex;
+in vec2 vertUVs;
+
+uniform mat4 projMatrix;
+uniform mat4 modelMatrix;
+uniform mat4 viewMatrix;
+
+out vec2 texCoord;
+
+void main()
+{
+ texCoord = vertUVs;
+ gl_Position = projMatrix * viewMatrix * modelMatrix * vec4(vertex, 1, 1);
+}
+)";
+
+string frag = R"(
+in vec2 texCoord;
+uniform sampler2D img;
+uniform sampler2D img2;
+void main()
+{
+ gl_FragColor = texture2D(img, texCoord);
+}
+)";
+
+Shader* shader;
+GPUBuffer* vb;
+
+struct Vert
+{
+ float x, y; // coord
+ float s, t; // uv
+};
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR lpCmdLine, int nCmdShow)
{
@@ -66,12 +144,82 @@ DataBuffer db(102400);
AEIO::Filesystem* fs;
ImageData* imgdata = new ImageData();
Image* img;
-
+GLint tex;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam) {
switch (msg) {
+ case WM_SIZE:
+ {
+ if (gl.Inited())
+ {
+ RECT rect;
+ GetWindowRect(hwnd, &rect);
+ viewport.Set(0, 0, rect.right - rect.left, rect.bottom - rect.top);
+ gl.SetViewport(viewport);
+ }
+ }
+ case WM_PAINT:
+ if (!gl.Inited())
+ break;
+ glEnable(GL_BLEND);
+ glEnable(GL_DEPTH_TEST);
+ //hdc = GetDC(hwnd);
+ //glc = wglCreateContext(hdc);
+ glClearColor(0.16, 0.16, 0.16, 1);
+ glColor4f(0.219, 0.219, 0.219, 1);
+ //glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
+ glColor4f(1, 1, 1, 1);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ tex = img->GetGLTexture();
+
+ glBindTexture(GL_TEXTURE_2D, tex); //
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); //Sͼ
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); //Tͼ
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //Ŵ˷ʽ
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //С˷ʽ
+
+ {
+ int uvAttribLoc = shader->GetAttributeLocation("vertUVs");
+ int vertAttribLoc = shader->GetAttributeLocation("vertex");
+ int imgLoc = shader->GetUniformLocation("img");
+ int img2Loc = shader->GetUniformLocation("img2");
+ int projmat = shader->GetUniformLocation("projMatrix");
+ int mmat = shader->GetUniformLocation("modelMatrix");
+ int vmat = shader->GetUniformLocation("viewMatrix");
+ int code = gl.GetError();
+ gl.UseShader(shader);
+ shader->SetUniformTexture(imgLoc, *img);
+ shader->SetUniformTexture(img2Loc, *img);
+ gl.SetMatrixMode(MATRIX_MODE_PROJECTION);
+ gl.PushMatrix();
+ gl.LoadIdentity();
+ gl.Ortho(0, viewport.w, viewport.h, 0, -1, 1);
+ shader->SetUniformMatrix44(projmat, gl.GetMatrix(MATRIX_MODE_PROJECTION));
+ gl.PopMatrix();
+ gl.SetMatrixMode(MATRIX_MODE_MODEL);
+ gl.LoadIdentity();
+ gl.Translate(100, 10);
+ shader->SetUniformMatrix44(mmat, gl.GetMatrix(MATRIX_MODE_MODEL));
+ shader->SetUniformMatrix44(vmat, gl.GetMatrix(MATRIX_MODE_VIEW));
+ vb->Bind();
+ glVertexAttribPointer(vertAttribLoc, 2, GL_FLOAT, GL_FALSE, sizeof(Vert), 0);
+ glVertexAttribPointer(uvAttribLoc, 2, GL_FLOAT, GL_FALSE, sizeof(Vert), (const void*)(2 * sizeof(float)));
+ vb->UnBind();
+ glEnableVertexAttribArray(vertAttribLoc);
+ glEnableVertexAttribArray(uvAttribLoc);
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+ glDisableVertexAttribArray(vertAttribLoc);
+ glDisableVertexAttribArray(uvAttribLoc);
+ gl.UnuseShader();
+ }
+ glFlush();
+ BeginPaint(hwnd, &ps); EndPaint(hwnd, &ps);
+ UpdateWindow(hwnd);
+ break;
case WM_CREATE:
AddMenus(hwnd);
@@ -96,13 +244,14 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
file = new File("root/img.jpg");
file->Open(File::FILE_MODE_READ);
file->ReadAll(&db);
-
+
wglMakeCurrent(hdc, glc);
- if (!gladLoadGL())
- {
+ RECT rect;
+ GetWindowRect(hwnd, &rect);
+ viewport.Set(0, 0, rect.right - rect.left, rect.bottom - rect.top);
+ if (!gl.Init(viewport))
return 0;
- }
imgdata->Decode(db);
img = new Image();
@@ -116,6 +265,22 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
img->Load(imgdata, {50, 100});
imgdata->Release();
+ // shader
+ shader = new Shader();
+ shader->Load(vert, frag);
+ {
+ int w = img->GetWidth();
+ int h = img->GetHeight();
+ Vert v[] = {
+ { 0, 0, 0, 0 },
+ { 0, h, 0, 1 },
+ { w, 0, 1, 0 },
+ { w, h, 1, 1 },
+ };
+ vb = new GPUBuffer(BUFFER_TYPE_VERTEX, BUFFER_USAGE_STATIC, sizeof(v));
+ vb->Fill(v, sizeof(v));
+ };
+
break;
case WM_COMMAND:
@@ -139,40 +304,6 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
PostQuitMessage(0);
break;
- case WM_PAINT:
-
- //hdc = GetDC(hwnd);
- //glc = wglCreateContext(hdc);
- glClearColor(0.16, 0.16, 0.16, 1);
- glColor4f(0.219, 0.219, 0.219, 1);
- //glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
- glColor4f( 1, 1, 1, 1);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- GLint tex = img->GetGLTextureHandle();
-
- glBindTexture(GL_TEXTURE_2D, tex); //
- glEnable(GL_TEXTURE_2D); //2Dӳ
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); //Sͼ
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); //Tͼ
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //Ŵ˷ʽ
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); //С˷ʽ
-
- glBegin(GL_QUADS);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(-0.5f, -0.5f, 0.0f);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(0.5f, -0.5f, 0.0f);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(0.5f, 0.5f, 0.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(-0.5f, 0.5f, 0.0f);
- glEnd();
-
- glFlush();
- BeginPaint(hwnd, &ps); EndPaint(hwnd, &ps);
- break;
}
return DefWindowProcW(hwnd, msg, wParam, lParam);