diff options
Diffstat (limited to 'source/tests/win32/01-window/03_sub_menu.cpp')
-rw-r--r-- | source/tests/win32/01-window/03_sub_menu.cpp | 209 |
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); |