From 9fdb9a23c0b9d2aef9f53a4eeda26fe64e9c3452 Mon Sep 17 00:00:00 2001 From: austin Date: Sat, 23 Oct 2021 10:10:16 -0400 Subject: [PATCH] the UI update part 1 --- assets/Shaders/plane/plane.fs | 10 ++ assets/Shaders/plane/plane.vs | 29 +++++ assets/Textures/Testing1.png | Bin 0 -> 6511 bytes assets/Textures/ui/WindowBorder.png | Bin 0 -> 1861 bytes .../electrosphere/engine/LoadingThread.java | 26 ++-- src/main/java/electrosphere/main/Globals.java | 12 +- src/main/java/electrosphere/menu/Menu.java | 1 + .../electrosphere/menu/MenuTransition.java | 9 ++ .../java/electrosphere/menu/MenuUtils.java | 12 +- .../java/electrosphere/renderer/Material.java | 35 ++++- .../java/electrosphere/renderer/Mesh.java | 2 +- .../java/electrosphere/renderer/Model.java | 6 + .../electrosphere/renderer/ModelUtils.java | 6 +- .../electrosphere/renderer/RenderUtils.java | 121 ++++++++++++++++++ .../renderer/RenderingEngine.java | 12 +- .../renderer/framebuffer/Framebuffer.java | 22 ++-- .../framebuffer/FramebufferUtils.java | 35 ++++- .../renderer/texture/Texture.java | 14 +- .../electrosphere/renderer/ui/Widget.java | 28 ++-- .../renderer/ui/WidgetUtils.java | 40 ++++++ .../electrosphere/renderer/ui/Window.java | 93 ++++++++++++++ .../renderer/ui/font/TextBox.java | 4 +- .../renderer/ui/layout/LayoutSchemeList.java | 46 ------- .../ui/layout/LayoutSchemeListScrollable.java | 62 +++++++-- .../ui/transparenttextbox/TextBox.java | 6 +- .../renderer/ui/widgets/ImagePanel.java | 90 +++++++++++++ .../java/electrosphere/util/ModelLoader.java | 2 +- 27 files changed, 592 insertions(+), 131 deletions(-) create mode 100644 assets/Shaders/plane/plane.fs create mode 100644 assets/Shaders/plane/plane.vs create mode 100644 assets/Textures/Testing1.png create mode 100644 assets/Textures/ui/WindowBorder.png create mode 100644 src/main/java/electrosphere/renderer/ui/Window.java delete mode 100644 src/main/java/electrosphere/renderer/ui/layout/LayoutSchemeList.java create mode 100644 src/main/java/electrosphere/renderer/ui/widgets/ImagePanel.java diff --git a/assets/Shaders/plane/plane.fs b/assets/Shaders/plane/plane.fs new file mode 100644 index 00000000..232dc842 --- /dev/null +++ b/assets/Shaders/plane/plane.fs @@ -0,0 +1,10 @@ +#version 330 core +out vec4 FragColor; + +in vec2 TexCoords; + +uniform sampler2D screenTexture; + +void main(){ + FragColor = texture(screenTexture, TexCoords); +} \ No newline at end of file diff --git a/assets/Shaders/plane/plane.vs b/assets/Shaders/plane/plane.vs new file mode 100644 index 00000000..e595ac93 --- /dev/null +++ b/assets/Shaders/plane/plane.vs @@ -0,0 +1,29 @@ +#version 330 core +layout (location = 0) in vec3 aPos; +layout (location = 4) in vec2 aTexCoords; + +out vec2 TexCoords; + +uniform vec3 mPosition; +uniform vec3 mDimension; +uniform vec3 tPosition; +uniform vec3 tDimension; + +void main(){ + vec2 finalPos = vec2( + aPos.x * mDimension.x - (1 - mDimension.x) + mPosition.x, + aPos.y * mDimension.y + (1 - mDimension.y) - mPosition.y + ); + gl_Position = vec4(finalPos.x, finalPos.y, 0.0, 1.0); + + vec2 finalTex = vec2( + aTexCoords.x * tDimension.x + tPosition.x, + aTexCoords.y * tDimension.y + tPosition.y + ); + // vec2 finalTex = aTexCoords; + // vec2 finalTex = vec2( + // aTexCoords.x + 0.7, + // aTexCoords.y + // ); + TexCoords = finalTex; +} diff --git a/assets/Textures/Testing1.png b/assets/Textures/Testing1.png new file mode 100644 index 0000000000000000000000000000000000000000..85afb66cd2d99a98b84f9720b3bf33c7302baca8 GIT binary patch literal 6511 zcmeAS@N?(olHy`uVBq!ia0y~yU;#2&7&zE~RK2WrGXn!-OQy4PfTy#wLP1e}T4qiv z1B1rI+KILvhaF^&#s|AI7LhBpi`#ymRAWyFU3tVJ%VCnSg$uV z%Xf#ei>JrR#;`hmU_Ns8tmj2nuRrlY8G?@w7TVvtTYYCQb4%LPm1+Jw0j8%t)E_13 z?brIYSE)hqhoF;B(z1DHbkZJL?tAy}@$1+r>6P<;7xQSaPG+>5Skd>g&2^8X&F0LP zbG~;TUZbOV{-3X*qb5r{!DH)c5SucD(uWeeRYW9?`o`|JizYTg8b`2GyrJZDQB6CpR=5ufM~S zE8bUM@R$8woRadlz58|=|BnYcP%w`3N{D?6xX9SxTknmOqBy!;Tt{vPCAXWp@>vXWTeda%R!^~>~oA)67 z)|BfP!A_GAV+3U{28{=2yu}4i?4^Mv=>acvKwl;029O=0!+`+_<+VNZf~gh zRjUs&(c!+LLZ2ivR31XlaO3Hy;A0YGcVh&5a@pd&KPtaH+bROmu%Q0!YH?dO0U(nL zL@+pj2uK(ZWP&w7+)9uMb`n7oAqp4|fFg=W#bAR8T92fFB$oi)!GNTfAd^OhlM)sX zwcw~G=v=S@QVb`~M5Hu9E5k_%=+Pv?00bB@LCqxcpgbyVnIXuQ`_I0wetJt{!LrY* zZzpcPVa4v?IK5oF`8>meU;I~+z@-^d$xo08E*%ws2IHt@7!V2?z^VwE2v(rLAOZ3| zaf%@ZBP>F)6FZYMmw=o-2n;7BETCaXyvs>3oP@A|gd2?vCnXjkYDsW8DTXUBfWROy zoRokbO(LL3YXA|*#SC3z(O}uMnVCF52VB@*dHX1+P@Z%2!lPT33|eyk3ypv9Fs%FU zpt}v^!Uhn5>`pvUtpHX_oJa5&(*QOGNdZ%XAW#TH7)b>>QvqxQ4O{{;cMurf0CESB zu>w&`Tv#Z8jD=`G4^r%+3PAOvB@l8Zd>AOhmF>0qhX0Zp5f` zNiiI|iOE?rXC4FDSUdav`f1t84YSUz&uc%M^je02HTGUCj~#QvYx{t1U62w55P{(a z?4p#r46Az^7!p{3ZoqCQc2SzS1n3UrEJ)BEtRBK1oDCqei8NdRtacC>PA~w_6_Da` zbiEB=Ut<>~AuL7!)YH|^Wt~$(69BzCFEaoD literal 0 HcmV?d00001 diff --git a/assets/Textures/ui/WindowBorder.png b/assets/Textures/ui/WindowBorder.png new file mode 100644 index 0000000000000000000000000000000000000000..f7c86dccdd7b78348251bad9913007774567bb2e GIT binary patch literal 1861 zcmd^Ai!<9<6uuF82nlUNDAj0py0NVgwpMmnsYk;|Nm0a76jfWnkXBMd5|4VcyH%@0 zyIrzFk!?k_UGJf#-bFgKi^hABwu2JydS-uV|B9VGGk4BC-~G){ z0I=?EF5UoWKwB6EX@u&$D?3KL#hEY6VtPlu6nT;+utV7_ziy(Hf~wF zOTnzpYxFm=`G;j!S2UH5aQ{GA2piaxlnu)QKcPQNBFPfjy=GL<0&wM zJl{4-@xd9^BQ!3@##N=<{{a}y{ZFsSu3 zO=oAUu6U)Br5rm8Ld)`6u>!*0p)e~cZ)AJy4jc~*?c^I7!W*qBv7>^=#4&-$TUyaL z#D+6=8~TKaP$>Nho(%Z#KPHx%hyd|}F_z~_Q`ULo?pxpiW98?N3G%G%z*u&a2bBh+ zb<2=e-9yz7Q+h=@$eDhNEZU-zPy@#>pj;iM^@0dGL-Pn?wm>||JBP!A>)30B<&afU zpm^Tk2dw(TjYDVsbqe4J@W#FtR-XDkn8JkMQZza>28#z~mhz==Vbo%7k`tAQ!wbUF zCNfVSmkA7q2P0XYx-IhkZJX^wUb+ez-Z`+GhyurK+XOfd#R-#4n) z7J{j+WEq``)^DNst;Z{!c#4@y7I?Hh&83opb)1B%82l8*MC#Y{^HSG6g?EffS6c9eSH9>WAi6I$_9H4ETjmu%!s=3ub^ zPQX1y@wE}OeWB}uI170e3DlxqaeGV}+yXZpK;7bl4PBpRwc~ZM#F_Y^9 z1+Yf&do5_atq2jC_ys_!##_h7Lg2odddnC=g21L=+6z>WVAOX0+@WOcgJ3OxoR z{g!7M_w1%d8=5wQdj8p~g_WVXX4PQCl=$g@zL1aCPIaYqYjY7mK~q8<<>5g=I>pk3 zFj@0-fuXH7;XbWw;AHxlaa=>qcyb3`D4Fut?9|~#>FXYrrMnQS`ku|-<*YN7NPvVY zPn7{PT@2_ILZl3PHIx>zPj6WSL?+FNyr!~kJIB8UbMojgL7IZt)e$#ahaEYf9MHl5 zPK$%y&WZud#~uS10XR*S2~-|5^!#37-(;ftulQfc$SNX#o%QSf!pG+7`?|Y&x=5Tt G)BXj8vwMaB literal 0 HcmV?d00001 diff --git a/src/main/java/electrosphere/engine/LoadingThread.java b/src/main/java/electrosphere/engine/LoadingThread.java index b4176eec..5a56f31a 100644 --- a/src/main/java/electrosphere/engine/LoadingThread.java +++ b/src/main/java/electrosphere/engine/LoadingThread.java @@ -86,7 +86,7 @@ public class LoadingThread extends Thread { Globals.currentMenu = MenuUtils.createTitleMenu(); - loadingBox.setDraw(false); + loadingBox.setVisible(false); MenuUtils.makeMenuDrawable(Globals.currentMenu); @@ -102,7 +102,7 @@ public class LoadingThread extends Thread { case LOAD_MAIN_GAME: - loadingBox.setDraw(true); + loadingBox.setVisible(true); //disable menu input Globals.controlHandler.setHandlerState(ControlHandler.ControlsState.NO_INPUT); @@ -162,7 +162,7 @@ public class LoadingThread extends Thread { Globals.controlHandler.hideMouse(); - loadingBox.setDraw(false); + loadingBox.setVisible(false); RenderUtils.recaptureScreen(); @@ -187,7 +187,7 @@ public class LoadingThread extends Thread { case LOAD_ARENA: - loadingBox.setDraw(true); + loadingBox.setVisible(true); //disable menu input Globals.controlHandler.setHandlerState(ControlHandler.ControlsState.NO_INPUT); @@ -242,7 +242,7 @@ public class LoadingThread extends Thread { //hide cursor Globals.controlHandler.hideMouse(); - loadingBox.setDraw(false); + loadingBox.setVisible(false); RenderUtils.recaptureScreen(); @@ -544,14 +544,14 @@ public class LoadingThread extends Thread { //// EntityUtils.getEntityRotation(tree).rotateAxis((float)-Math.PI/2.0f, new Vector3f(1,0,0)); // } -// Random rand = new Random(); -// for(int i = 0; i < 1000; i++){ -// String wheatPath = "Models/wheat2.fbx"; -// Entity wheatStalk = EntityUtils.spawnDrawableEntity(wheatPath); -// EntityUtils.getPosition(wheatStalk).set(rand.nextFloat() * 20, 0, rand.nextFloat() * 20); -// EntityUtils.getRotation(wheatStalk).rotateLocalX(-(float)Math.PI/2.0f); -// EntityUtils.getScale(wheatStalk).set(1, 1, 2); -// } + Random rand = new Random(); + for(int i = 0; i < 1000; i++){ + String wheatPath = "Models/wheat2.fbx"; + Entity wheatStalk = EntityUtils.spawnDrawableEntity(wheatPath); + EntityUtils.getPosition(wheatStalk).set(rand.nextFloat() * 20, 0, rand.nextFloat() * 20); + EntityUtils.getRotation(wheatStalk).rotateLocalX(-(float)Math.PI/2.0f); + EntityUtils.getScale(wheatStalk).set(1, 1, 2); + } // String buildingPath = "Models/building1.fbx"; // Entity building = EntityUtils.spawnDrawableEntity(buildingPath); diff --git a/src/main/java/electrosphere/main/Globals.java b/src/main/java/electrosphere/main/Globals.java index 2e8822ba..445efeb7 100644 --- a/src/main/java/electrosphere/main/Globals.java +++ b/src/main/java/electrosphere/main/Globals.java @@ -173,6 +173,9 @@ public class Globals { public static Material materialDefault; public static String blackTexture; + public static String testingTexture; + + public static String planeModelID; public static ArrayList lightPointListDefault; public static SpotLight lightSpotDefault; @@ -328,7 +331,7 @@ public class Globals { particleBillboardModel = assetManager.registerModel(RenderUtils.createParticleModel()); //black texture for backgrouns blackTexture = "Textures/b1.png"; - Globals.assetManager.addTexturePathtoQueue("Textures/b1.png"); + Globals.assetManager.addTexturePathtoQueue(blackTexture); //loading box loadingBox = WidgetUtils.createVerticallyAlignedTextBox(520, 100, 50, 7, 1, "LOADING", true); //init default shaderProgram @@ -345,6 +348,13 @@ public class Globals { assetManager.addModelPathToQueue("Models/unitcylinder.fbx"); assetManager.addModelPathToQueue("Models/unitplane.fbx"); assetManager.addModelPathToQueue("Models/unitcube.fbx"); + planeModelID = assetManager.registerModel(RenderUtils.createPlaneModel()); + + //init ui images + assetManager.addTexturePathtoQueue("Textures/ui/WindowBorder.png"); + + testingTexture = "Textures/Testing1.png"; + Globals.assetManager.addTexturePathtoQueue(testingTexture); //as these assets are required for the renderer to work, we go ahead and //load them into memory now. The loading time penalty is worth it I think. diff --git a/src/main/java/electrosphere/menu/Menu.java b/src/main/java/electrosphere/menu/Menu.java index a6956b7b..c0426555 100644 --- a/src/main/java/electrosphere/menu/Menu.java +++ b/src/main/java/electrosphere/menu/Menu.java @@ -18,6 +18,7 @@ public class Menu { MULTIPLAYER_MENU, IP_MENU, OPTIONS_MAIN_MENU, + TEST, } MenuType type; diff --git a/src/main/java/electrosphere/menu/MenuTransition.java b/src/main/java/electrosphere/menu/MenuTransition.java index 23c1b17d..da7d732d 100644 --- a/src/main/java/electrosphere/menu/MenuTransition.java +++ b/src/main/java/electrosphere/menu/MenuTransition.java @@ -44,6 +44,11 @@ public class MenuTransition { m.dispose(); Globals.currentMenu = MenuUtils.createOptionsMainMenu(); break; + //test + case 4: + m.dispose(); + Globals.currentMenu = MenuUtils.createTestMainMenu(); + break; } break; case MULTIPLAYER_MENU: @@ -106,6 +111,10 @@ public class MenuTransition { m.dispose(); Globals.currentMenu = MenuUtils.createTitleMenu(); break; + case TEST: + m.dispose(); + Globals.currentMenu = MenuUtils.createTitleMenu(); + break; } } diff --git a/src/main/java/electrosphere/menu/MenuUtils.java b/src/main/java/electrosphere/menu/MenuUtils.java index 97faac94..7315b3ee 100644 --- a/src/main/java/electrosphere/menu/MenuUtils.java +++ b/src/main/java/electrosphere/menu/MenuUtils.java @@ -24,7 +24,7 @@ public class MenuUtils { rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 200, "MULTIPLAYER", true)); rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 275, "ARENA", true)); rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 350, "OPTIONS", true)); - rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 350, "UI TESTING", true)); + rVal.addOption( WidgetUtils.createVerticallyAlignedMinSizeTextBoxFromCharCount(40, 40, screenTop - 425, "UI TESTING", true)); return rVal; } @@ -61,15 +61,21 @@ public class MenuUtils { return rVal; } + public static Menu createTestMainMenu(){ + Menu rVal = new Menu(MenuType.TEST); + rVal.addElement(WidgetUtils.createWindowTEST()); + return rVal; + } + public static void makeMenuDrawable(Menu m){ for(Widget w : m.widgetList){ - w.setDraw(true); + w.setVisible(true); } } public static void makeMenuUndrawable(Menu m){ for(Widget w : m.widgetList){ - w.setDraw(false); + w.setVisible(false); } } diff --git a/src/main/java/electrosphere/renderer/Material.java b/src/main/java/electrosphere/renderer/Material.java index 6c5a83ee..021b1df1 100644 --- a/src/main/java/electrosphere/renderer/Material.java +++ b/src/main/java/electrosphere/renderer/Material.java @@ -10,15 +10,25 @@ import electrosphere.renderer.texture.Texture; import org.lwjgl.PointerBuffer; import org.lwjgl.assimp.AIMaterial; import org.lwjgl.assimp.AIMaterialProperty; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; +import static org.lwjgl.opengl.GL11.glBindTexture; +import static org.lwjgl.opengl.GL13.GL_TEXTURE0; +import static org.lwjgl.opengl.GL13.glActiveTexture; /** * * @author amaterasu */ public class Material { + String diffuse; String specular; boolean hasTransparency = false; + + boolean usesFetch = true; + + int texturePointer; + public Material(){ } @@ -53,14 +63,25 @@ public class Material { // } } + public void setTexturePointer(int pointer){ + texturePointer = pointer; + usesFetch = false; + } + public void apply_material(){ - Texture diffuseTexture = Globals.assetManager.fetchTexture(diffuse); - if(diffuseTexture != null){ - diffuseTexture.bind(0); - } - Texture specularTexture = Globals.assetManager.fetchTexture(specular); - if(specularTexture != null){ - specularTexture.bind(1); + //basically a switch for the case where we want to manually set texture pointer + if(usesFetch){ + Texture diffuseTexture = Globals.assetManager.fetchTexture(diffuse); + if(diffuseTexture != null){ + diffuseTexture.bind(0); + } + Texture specularTexture = Globals.assetManager.fetchTexture(specular); + if(specularTexture != null){ + specularTexture.bind(1); + } + } else { + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, texturePointer); } } public void apply_material(int diffuse_channel, int specular_channel){ diff --git a/src/main/java/electrosphere/renderer/Mesh.java b/src/main/java/electrosphere/renderer/Mesh.java index 3f76c97b..2bc40f37 100644 --- a/src/main/java/electrosphere/renderer/Mesh.java +++ b/src/main/java/electrosphere/renderer/Mesh.java @@ -608,7 +608,7 @@ public class Mesh { textureListArrayUniformName = uniformName; } - public void set_material(Material input){ + public void setMaterial(Material input){ this.material = input; } diff --git a/src/main/java/electrosphere/renderer/Model.java b/src/main/java/electrosphere/renderer/Model.java index 28a1ac69..2b80b865 100644 --- a/src/main/java/electrosphere/renderer/Model.java +++ b/src/main/java/electrosphere/renderer/Model.java @@ -362,6 +362,12 @@ public class Model { } } + public void drawFramebuffer(){ + for(Mesh m : meshes){ + m.complexDraw(true, false, true, false, false, false, false); + } + } + public void pushUniformToMesh(String meshName, String uniformKey, Object uniform){ for(Mesh m : meshes){ if(m.nodeID.equals(meshName)){ diff --git a/src/main/java/electrosphere/renderer/ModelUtils.java b/src/main/java/electrosphere/renderer/ModelUtils.java index 9348fc85..e7eb4c62 100644 --- a/src/main/java/electrosphere/renderer/ModelUtils.java +++ b/src/main/java/electrosphere/renderer/ModelUtils.java @@ -334,7 +334,7 @@ public class ModelUtils { Globals.assetManager.addTexturePathtoQueue("/Textures/Ground/Dirt1.png"); groundMat.set_diffuse("/Textures/Ground/Dirt1.png"); groundMat.set_specular("/Textures/Ground/Dirt1.png"); - m.set_material(groundMat); + m.setMaterial(groundMat); rVal.meshes.add(m); return rVal; @@ -560,7 +560,7 @@ public class ModelUtils { Globals.assetManager.addTexturePathtoQueue("/Textures/Ground/Dirt1.png"); groundMat.set_diffuse("/Textures/Ground/Dirt1.png"); groundMat.set_specular("/Textures/Ground/Dirt1.png"); - m.set_material(groundMat); + m.setMaterial(groundMat); rVal.meshes.add(m); return rVal; @@ -680,7 +680,7 @@ public class ModelUtils { Globals.assetManager.addTexturePathtoQueue("/Textures/Fonts/myfont1-harsher.png"); uiMat.set_diffuse("/Textures/Fonts/myfont1-harsher.png"); uiMat.set_specular("/Textures/Fonts/myfont1-harsher.png"); - m.set_material(uiMat); + m.setMaterial(uiMat); rVal.meshes.add(m); diff --git a/src/main/java/electrosphere/renderer/RenderUtils.java b/src/main/java/electrosphere/renderer/RenderUtils.java index f8f90928..4e95414d 100644 --- a/src/main/java/electrosphere/renderer/RenderUtils.java +++ b/src/main/java/electrosphere/renderer/RenderUtils.java @@ -562,4 +562,125 @@ public class RenderUtils { return particleModel; } + + public static Model createPlaneModel(){ + Model rVal = new Model(); + + rVal.meshes = new ArrayList(); + rVal.modelMatrix = new Matrix4f(); + + + Mesh planeMesh = new Mesh(); + + + planeMesh.mesh = null; + + // + // VAO + // + planeMesh.vertexArrayObject = glGenVertexArrays(); + glBindVertexArray(planeMesh.vertexArrayObject); + + + + + + + + + + + float[] vertexcoords = { + -1.0f, 1.0f, 0.0f, + 1.0f, 1.0f, 0.0f, + -1.0f, -1.0f, 0.0f, + 1.0f, -1.0f, 0.0f, + + }; + + // + //Buffer data to GPU + // + + try { + planeMesh.vertexCount = vertexcoords.length / 3; + FloatBuffer VertexArrayBufferData = BufferUtils.createFloatBuffer(planeMesh.vertexCount * 3); + float[] temp = new float[3]; + for (int i = 0; i < planeMesh.vertexCount; i++) { + temp[0] = vertexcoords[i * 3 + 0]; + temp[1] = vertexcoords[i * 3 + 1]; + temp[2] = vertexcoords[i * 3 + 2]; + VertexArrayBufferData.put(temp); + } + VertexArrayBufferData.flip(); + planeMesh.buffer_vertices(VertexArrayBufferData, 3); + } catch (NullPointerException ex){ + ex.printStackTrace(); + } + + int[] facedata = { + 0,1,2, + 1,2,3, + }; + + // + // FACES + // + planeMesh.faceCount = facedata.length / 3; + planeMesh.elementCount = facedata.length; + IntBuffer elementArrayBufferData = BufferUtils.createIntBuffer(planeMesh.elementCount); + for(int i = 0; i < planeMesh.faceCount; i++){ + int[] temp = new int[3]; + temp[0] = facedata[i * 3 + 0]; + temp[1] = facedata[i * 3 + 1]; + temp[2] = facedata[i * 3 + 2]; + elementArrayBufferData.put(temp); + } + elementArrayBufferData.flip(); + planeMesh.buffer_faces(elementArrayBufferData); + + // + // TEXTURE COORDS + // + FloatBuffer texture_coords = BufferUtils.createFloatBuffer(8); + float[] texturedata = { + 0,1, + 1,1, + 0,0, + 1,0 + }; + texture_coords.put(texturedata); + texture_coords.flip(); + planeMesh.buffer_texture_coords(texture_coords, 2); + + + + + planeMesh.shader = ShaderProgram.loadSpecificShader("Shaders/plane/plane.vs", "Shaders/plane/plane.fs"); + planeMesh.hasBones = false; + + + + + glBindVertexArray(0); + + + + + + + + + + planeMesh.nodeID = "plane"; + + planeMesh.parent = rVal; + + + rVal.meshes.add(planeMesh); + + + return rVal; + } + } diff --git a/src/main/java/electrosphere/renderer/RenderingEngine.java b/src/main/java/electrosphere/renderer/RenderingEngine.java index 02272879..531fe753 100644 --- a/src/main/java/electrosphere/renderer/RenderingEngine.java +++ b/src/main/java/electrosphere/renderer/RenderingEngine.java @@ -168,7 +168,7 @@ public class RenderingEngine { lightDepthShaderProgram = ShaderProgram.loadSpecificShader("/Shaders/lightDepth/lightDepth.vs", "/Shaders/lightDepth/lightDepth.fs"); Globals.depthMapShaderProgramLoc = lightDepthShaderProgram.shaderProgram; lightDepthBuffer = FramebufferUtils.generateDepthBuffer(); - Globals.shadowMapTextureLoc = lightDepthBuffer.getTexture(); + Globals.shadowMapTextureLoc = lightDepthBuffer.getTexturePointer(); // glEnable(GL_CULL_FACE); // enabled for shadow mapping // @@ -563,7 +563,7 @@ public class RenderingEngine { // GL_COLOR_BUFFER_BIT, GL_NEAREST); Globals.renderingEngine.setActiveShader(screenTextureShaders); glBindVertexArray(screenTextureVAO); - glBindTexture(GL_TEXTURE_2D, screenFramebuffer.getTexture()); + glBindTexture(GL_TEXTURE_2D, screenFramebuffer.getTexturePointer()); // glBindTexture(GL_TEXTURE_2D, lightDepthBuffer.getTexture()); glDrawArrays(GL_TRIANGLES, 0, 6); glBindVertexArray(0); @@ -574,8 +574,8 @@ public class RenderingEngine { Matrix4f modelTransformMatrix = new Matrix4f(); glDisable(GL_DEPTH_TEST); for(Widget currentWidget : Globals.widgetManager.getWidgetList()){ - if(currentWidget.isDraw()){ - currentWidget.draw(); + if(currentWidget.getVisible()){ + currentWidget.draw(GL_DEFAULT_FRAMEBUFFER); } } @@ -614,4 +614,8 @@ public class RenderingEngine { return activeProgram; } + public void bindFramebuffer(int framebufferPointer){ + glBindFramebuffer(GL_FRAMEBUFFER, framebufferPointer); + } + } diff --git a/src/main/java/electrosphere/renderer/framebuffer/Framebuffer.java b/src/main/java/electrosphere/renderer/framebuffer/Framebuffer.java index 4123fa45..65ebc0db 100644 --- a/src/main/java/electrosphere/renderer/framebuffer/Framebuffer.java +++ b/src/main/java/electrosphere/renderer/framebuffer/Framebuffer.java @@ -14,23 +14,23 @@ import static org.lwjgl.opengl.GL30.glGenFramebuffers; */ public class Framebuffer { - int framebuffer; - int texture; + int framebufferPointer; + int texturePointer; public Framebuffer(){ - framebuffer = glGenFramebuffers(); + framebufferPointer = glGenFramebuffers(); } - public void setTexture(int texture){ - this.texture = texture; + public void setTexturePointer(int texturePointer){ + this.texturePointer = texturePointer; } - public int getTexture(){ - return texture; + public int getTexturePointer(){ + return texturePointer; } public void bind(){ - glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, framebufferPointer); } public boolean isComplete(){ @@ -38,11 +38,11 @@ public class Framebuffer { return glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE; } - public int getFramebufferID(){ - return framebuffer; + public int getFramebufferPointer(){ + return framebufferPointer; } public void free(){ - glDeleteFramebuffers(framebuffer); + glDeleteFramebuffers(framebufferPointer); } } diff --git a/src/main/java/electrosphere/renderer/framebuffer/FramebufferUtils.java b/src/main/java/electrosphere/renderer/framebuffer/FramebufferUtils.java index 760b3acf..3fe0316b 100644 --- a/src/main/java/electrosphere/renderer/framebuffer/FramebufferUtils.java +++ b/src/main/java/electrosphere/renderer/framebuffer/FramebufferUtils.java @@ -58,7 +58,7 @@ public class FramebufferUtils { //these make sure the texture actually clamps to the borders of the quad glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - buffer.setTexture(texture); + buffer.setTexturePointer(texture); //bind texture to fbo int mipMapLevel = 0; glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, mipMapLevel); @@ -75,6 +75,37 @@ public class FramebufferUtils { return buffer; } + public static Framebuffer generateTextureFramebuffer(int width, int height){ + Framebuffer buffer = new Framebuffer(); + buffer.bind(); + //texture + int texture = glGenTextures(); + glBindTexture(GL_TEXTURE_2D,texture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + //these make sure the texture actually clamps to the borders of the quad + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + buffer.setTexturePointer(texture); + //bind texture to fbo + int mipMapLevel = 0; + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, mipMapLevel); + //renderbuffer + int renderBuffer = glGenRenderbuffers(); + glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height); + //bind rbo to fbo + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderBuffer); + //check make sure compiled + if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){ + System.out.println("Framebuffer is not complete!"); + } + return buffer; + } + + + public static Renderbuffer generateScreensizeStencilDepthRenderbuffer(){ Renderbuffer buffer = new Renderbuffer(); buffer.bind(); @@ -101,7 +132,7 @@ public class FramebufferUtils { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); float borderColor[] = { 1.0f, 1.0f, 1.0f, 1.0f }; glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor); - buffer.setTexture(texture); + buffer.setTexturePointer(texture); diff --git a/src/main/java/electrosphere/renderer/texture/Texture.java b/src/main/java/electrosphere/renderer/texture/Texture.java index 75e982e4..d598aea3 100644 --- a/src/main/java/electrosphere/renderer/texture/Texture.java +++ b/src/main/java/electrosphere/renderer/texture/Texture.java @@ -25,7 +25,7 @@ import static org.lwjgl.opengl.GL30.*; * @author amaterasu */ public class Texture { - int texture_pointer; + int texturePointer; int width; int height; boolean hasTransparency; @@ -36,9 +36,9 @@ public class Texture { public Texture(String path){ this.path = path; //generate the texture object on gpu - texture_pointer = glGenTextures(); + texturePointer = glGenTextures(); //bind the new texture - glBindTexture(GL_TEXTURE_2D, texture_pointer); + glBindTexture(GL_TEXTURE_2D, texturePointer); //how are we gonna wrap the texture?? glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT); @@ -126,12 +126,12 @@ public class Texture { public void bind(){ glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, texture_pointer); + glBindTexture(GL_TEXTURE_2D, texturePointer); } public void bind(int attrib_val){ glActiveTexture(GL_TEXTURE0 + attrib_val); - glBindTexture(GL_TEXTURE_2D, texture_pointer); + glBindTexture(GL_TEXTURE_2D, texturePointer); } public boolean isTransparent(){ @@ -141,4 +141,8 @@ public class Texture { public String getPath(){ return path; } + + public int getTexturePointer(){ + return texturePointer; + } } diff --git a/src/main/java/electrosphere/renderer/ui/Widget.java b/src/main/java/electrosphere/renderer/ui/Widget.java index 517befa6..f54f82ba 100644 --- a/src/main/java/electrosphere/renderer/ui/Widget.java +++ b/src/main/java/electrosphere/renderer/ui/Widget.java @@ -6,22 +6,14 @@ package electrosphere.renderer.ui; */ public abstract class Widget { - int width; - int height; + public int width; + public int height; - int positionX; - int positionY; + public int positionX; + public int positionY; - boolean draw; + public boolean visible = false; - public Widget(int positionX, int positionY, int width, int height, boolean draw) { - this.width = width; - this.height = height; - this.positionX = positionX; - this.positionY = positionY; - this.draw = draw; - } - public int getWidth() { return width; } @@ -38,8 +30,8 @@ public abstract class Widget { return positionY; } - public boolean isDraw() { - return draw; + public boolean getVisible() { + return visible; } public void setWidth(int width) { @@ -58,10 +50,10 @@ public abstract class Widget { this.positionY = positionY; } - public void setDraw(boolean draw) { - this.draw = draw; + public void setVisible(boolean draw) { + this.visible = draw; } - public abstract void draw(); + public abstract void draw(int parentFramebufferPointer); } diff --git a/src/main/java/electrosphere/renderer/ui/WidgetUtils.java b/src/main/java/electrosphere/renderer/ui/WidgetUtils.java index 9490b6ec..7b831f68 100644 --- a/src/main/java/electrosphere/renderer/ui/WidgetUtils.java +++ b/src/main/java/electrosphere/renderer/ui/WidgetUtils.java @@ -2,6 +2,8 @@ package electrosphere.renderer.ui; import electrosphere.main.Globals; import electrosphere.renderer.ui.font.TextBox; +import electrosphere.renderer.ui.layout.LayoutSchemeListScrollable; +import electrosphere.renderer.ui.widgets.ImagePanel; /** * @@ -45,4 +47,42 @@ public class WidgetUtils { return rVal; } + public static LayoutSchemeListScrollable createListTEST(){ + LayoutSchemeListScrollable rVal = new LayoutSchemeListScrollable(200, 200, 500, 500, true); + rVal.addWidget(createVerticallyAlignedMinSizeTextBoxFromCharCount(25, 25, 0, "TESTESTESTEST", true)); + rVal.addWidget(WidgetUtils.createTextBox(100, 100, 500, 500, 3, 10, "TEST", true)); + Globals.widgetManager.registerWidget(rVal); + return rVal; + } + + public static Widget createWindowTEST(){ + Window rVal = new Window(500, 500, 500, 500); + //panel 1 + ImagePanel imagePanel = new ImagePanel(); + imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.testingTexture)); + imagePanel.setPositionX(100); + imagePanel.setPositionY(100); + imagePanel.setVisible(true); + rVal.addWidget(imagePanel); + //panel 2 + imagePanel = new ImagePanel(); + imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.testingTexture)); + imagePanel.setVisible(true); + rVal.addWidget(imagePanel); + rVal.setVisible(true); + //window top + imagePanel = new ImagePanel(); + imagePanel.setTexture(Globals.assetManager.fetchTexture("Textures/ui/WindowBorder.png")); + imagePanel.setWidth(100); + imagePanel.setHeight(50); + imagePanel.setPositionX(200); + imagePanel.setPositionY(50); + imagePanel.setVisible(true); + rVal.addWidget(imagePanel); + rVal.setVisible(true); + Globals.widgetManager.registerWidget(rVal); + return rVal; + } + + } diff --git a/src/main/java/electrosphere/renderer/ui/Window.java b/src/main/java/electrosphere/renderer/ui/Window.java new file mode 100644 index 00000000..0cfa8bda --- /dev/null +++ b/src/main/java/electrosphere/renderer/ui/Window.java @@ -0,0 +1,93 @@ +package electrosphere.renderer.ui; + +import electrosphere.main.Globals; +import electrosphere.renderer.Material; +import electrosphere.renderer.Model; +import electrosphere.renderer.framebuffer.Framebuffer; +import electrosphere.renderer.framebuffer.FramebufferUtils; +import java.util.LinkedList; +import java.util.List; +import org.joml.Vector3f; +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL30.*; + +/** + * + * @author amaterasu + */ +public class Window extends Widget { + List widgetList = new LinkedList(); + Framebuffer widgetBuffer; + Material customMat = new Material(); + + Vector3f boxPosition = new Vector3f(); + Vector3f boxDimensions = new Vector3f(); + Vector3f texPosition = new Vector3f(0,0,0); + Vector3f texScale = new Vector3f(1,1,0); + + public Window(int positionX, int positionY, int width, int height){ + //TODO: figure out why this has to be 1920x1080 +// widgetBuffer = FramebufferUtils.generateTextureFramebuffer(width, height); + widgetBuffer = FramebufferUtils.generateScreensizeTextureFramebuffer(); + customMat.setTexturePointer(widgetBuffer.getTexturePointer()); + float ndcX = (float)positionX/Globals.WINDOW_WIDTH; + float ndcY = (float)positionY/Globals.WINDOW_HEIGHT; + float ndcWidth = (float)width/Globals.WINDOW_WIDTH; + float ndcHeight = (float)height/Globals.WINDOW_HEIGHT; + boxPosition = new Vector3f(ndcX,ndcY,0); + boxDimensions = new Vector3f(ndcWidth,ndcHeight,0); + } + + @Override + public void draw(int parentFramebufferPointer) { + + widgetBuffer.bind(); + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + for(Widget child : widgetList){ + child.draw(widgetBuffer.getFramebufferPointer()); + } + //this call binds the screen as the "texture" we're rendering to + //have to call before actually rendering + glBindFramebuffer(GL_FRAMEBUFFER, parentFramebufferPointer); + + Model planeModel = Globals.assetManager.fetchModel(Globals.planeModelID); + planeModel.pushUniformToMesh("plane", "mPosition", boxPosition); + planeModel.pushUniformToMesh("plane", "mDimension", boxDimensions); + planeModel.pushUniformToMesh("plane", "tPosition", texPosition); + planeModel.pushUniformToMesh("plane", "tDimension", texScale); + planeModel.meshes.get(0).setMaterial(customMat); + planeModel.drawUI(); + } + + public void pack() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + public void addWidget(Widget widget) { + widgetList.add(widget); + widget.setVisible(false); + } + + public List getWidgets() { + return widgetList; + } + + public void destroy() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + public void setTextureCoord(int x, int y){ + float ndcX = (float)x/Globals.WINDOW_WIDTH; + float ndcY = (float)y/Globals.WINDOW_HEIGHT; + texPosition = new Vector3f(ndcX,ndcY,0); + } + + public void setTextureScale(int x, int y){ + float ndcWidth = (float)x/Globals.WINDOW_WIDTH; + float ndcHeight = (float)y/Globals.WINDOW_HEIGHT; + texScale = new Vector3f(ndcWidth,ndcHeight,0); + } +} diff --git a/src/main/java/electrosphere/renderer/ui/font/TextBox.java b/src/main/java/electrosphere/renderer/ui/font/TextBox.java index eeb05db9..8513cebe 100644 --- a/src/main/java/electrosphere/renderer/ui/font/TextBox.java +++ b/src/main/java/electrosphere/renderer/ui/font/TextBox.java @@ -25,7 +25,6 @@ public class TextBox extends Widget{ Vector3f color = new Vector3f(0,0,0); public TextBox(int positionX, int positionY, int width, int height, int rows, int cols, String text, boolean render, boolean editable) { - super(positionX,positionY,width,height,render); this.positionX = positionX; this.positionY = positionY; this.width = width; @@ -73,7 +72,8 @@ public class TextBox extends Widget{ @Override - public void draw(){ + public void draw(int parentFramebufferPointer){ + Globals.renderingEngine.bindFramebuffer(parentFramebufferPointer); float ndcX = (float)positionX/Globals.WINDOW_WIDTH; float ndcY = (float)positionY/Globals.WINDOW_HEIGHT; float ndcWidth = (float)width/Globals.WINDOW_WIDTH; diff --git a/src/main/java/electrosphere/renderer/ui/layout/LayoutSchemeList.java b/src/main/java/electrosphere/renderer/ui/layout/LayoutSchemeList.java deleted file mode 100644 index a4669d96..00000000 --- a/src/main/java/electrosphere/renderer/ui/layout/LayoutSchemeList.java +++ /dev/null @@ -1,46 +0,0 @@ -package electrosphere.renderer.ui.layout; - -import electrosphere.renderer.ui.Widget; -import java.util.LinkedList; -import java.util.List; - -/** - * - * @author amaterasu - */ -public class LayoutSchemeList extends Widget implements LayoutScheme { - - List widgetList = new LinkedList(); - - public LayoutSchemeList(int positionX, int positionY, int width, int height, boolean draw){ - super(positionX,positionY,width,height,draw); - } - - @Override - public void draw() { - for(Widget child : widgetList){ - child.draw(); - } - } - - @Override - public void addWidget(Widget widget) { - widgetList.add(widget); - widget.setDraw(false); - } - - @Override - public List getWidgets() { - return widgetList; - } - - @Override - public void destroy() { - } - - @Override - public void pack() { - - } - -} diff --git a/src/main/java/electrosphere/renderer/ui/layout/LayoutSchemeListScrollable.java b/src/main/java/electrosphere/renderer/ui/layout/LayoutSchemeListScrollable.java index dbf87abf..4a7d05f5 100644 --- a/src/main/java/electrosphere/renderer/ui/layout/LayoutSchemeListScrollable.java +++ b/src/main/java/electrosphere/renderer/ui/layout/LayoutSchemeListScrollable.java @@ -1,54 +1,96 @@ package electrosphere.renderer.ui.layout; +import electrosphere.main.Globals; +import electrosphere.renderer.Material; import electrosphere.renderer.framebuffer.Framebuffer; import electrosphere.renderer.ui.Widget; +import electrosphere.renderer.Model; +import electrosphere.renderer.assetmanager.AssetDataStrings; +import electrosphere.renderer.framebuffer.FramebufferUtils; import java.util.LinkedList; import java.util.List; +import org.joml.Vector3f; import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; +import static org.lwjgl.opengl.GL11.glBindTexture; import static org.lwjgl.opengl.GL11.glClear; import static org.lwjgl.opengl.GL11.glClearColor; +import static org.lwjgl.opengl.GL13.GL_TEXTURE0; +import static org.lwjgl.opengl.GL13.GL_TEXTURE1; +import static org.lwjgl.opengl.GL13.GL_TEXTURE2; +import static org.lwjgl.opengl.GL13.GL_TEXTURE3; +import static org.lwjgl.opengl.GL13.glActiveTexture; +import static org.lwjgl.opengl.GL30.GL_FRAMEBUFFER; +import static org.lwjgl.opengl.GL30.glBindFramebuffer; /** * * @author amaterasu */ -public class LayoutSchemeListScrollable extends Widget implements LayoutScheme { +public class LayoutSchemeListScrollable extends Widget { List widgetList = new LinkedList(); - Framebuffer widgetBuffer = new Framebuffer(); + Framebuffer widgetBuffer = FramebufferUtils.generateScreensizeTextureFramebuffer(); + Material customMat = new Material(); + + Vector3f boxPosition = new Vector3f(); + Vector3f boxDimensions = new Vector3f(); + Vector3f texPosition = new Vector3f(0,0,0); + Vector3f texScale = new Vector3f(1,1,0); public LayoutSchemeListScrollable(int positionX, int positionY, int width, int height, boolean draw){ - super(positionX,positionY,width,height,draw); + customMat.setTexturePointer(widgetBuffer.getTexturePointer()); +// customMat.setTexturePointer(Globals.assetManager.fetchTexture("Textures/Branch.png").getTexturePointer()); + + float ndcX = (float)positionX/Globals.WINDOW_WIDTH; + float ndcY = (float)positionY/Globals.WINDOW_HEIGHT; + float ndcWidth = (float)width/Globals.WINDOW_WIDTH; + float ndcHeight = (float)height/Globals.WINDOW_HEIGHT; + boxPosition = new Vector3f(ndcX,ndcY,0); + boxDimensions = new Vector3f(ndcWidth,ndcHeight,0); } + static float aaaa = 0; + @Override - public void draw() { + public void draw(int parentFramebufferPointer) { widgetBuffer.bind(); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); for(Widget child : widgetList){ - child.draw(); + child.draw(widgetBuffer.getFramebufferPointer()); } + //this call binds the screen as the "texture" we're rendering to + //have to call before actually rendering + glBindFramebuffer(GL_FRAMEBUFFER, 0); + aaaa = aaaa + 0.0005f; + if(aaaa > 1){ + aaaa = -1; + } + texPosition.y = aaaa; + Model planeModel = Globals.assetManager.fetchModel(Globals.planeModelID); + planeModel.pushUniformToMesh("plane", "mPosition", boxPosition); + planeModel.pushUniformToMesh("plane", "mDimension", boxDimensions); + planeModel.pushUniformToMesh("plane", "tPosition", texPosition); + planeModel.pushUniformToMesh("plane", "tDimension", texScale); + planeModel.meshes.get(0).setMaterial(customMat); + planeModel.drawUI(); } - @Override public void pack() { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } - @Override public void addWidget(Widget widget) { widgetList.add(widget); - widget.setDraw(false); + widget.setVisible(false); } - @Override public List getWidgets() { return widgetList; } - @Override public void destroy() { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } diff --git a/src/main/java/electrosphere/renderer/ui/transparenttextbox/TextBox.java b/src/main/java/electrosphere/renderer/ui/transparenttextbox/TextBox.java index 629d69de..a3fd48b4 100644 --- a/src/main/java/electrosphere/renderer/ui/transparenttextbox/TextBox.java +++ b/src/main/java/electrosphere/renderer/ui/transparenttextbox/TextBox.java @@ -7,7 +7,7 @@ import electrosphere.renderer.ui.Widget; import electrosphere.renderer.ui.font.FontUtils; import org.joml.Vector3f; -public class TextBox extends Widget{ +public class TextBox extends Widget{ int positionX; @@ -20,7 +20,6 @@ public class TextBox extends Widget{ Vector3f scalar; public TextBox(int positionX, int positionY, int width, int height, String text, boolean render, boolean editable) { - super(positionX,positionY,width,height,render); this.positionX = positionX; this.positionY = positionY; this.width = width; @@ -30,7 +29,6 @@ public class TextBox extends Widget{ } public TextBox(int positionX, int positionY, int width, int height, String text, boolean render, boolean editable, Vector3f scalar) { - super(positionX,positionY,width,height,render); this.positionX = positionX; this.positionY = positionY; this.width = width; @@ -57,7 +55,7 @@ public class TextBox extends Widget{ @Override - public void draw(){ + public void draw(int parentFramebufferPointer){ throw new UnsupportedOperationException("Transparent Text box draw function not implemented yet oop"); // float ndcX = (float)positionX/Globals.WINDOW_WIDTH; // float ndcY = (float)positionY/Globals.WINDOW_HEIGHT; diff --git a/src/main/java/electrosphere/renderer/ui/widgets/ImagePanel.java b/src/main/java/electrosphere/renderer/ui/widgets/ImagePanel.java new file mode 100644 index 00000000..d5de99d9 --- /dev/null +++ b/src/main/java/electrosphere/renderer/ui/widgets/ImagePanel.java @@ -0,0 +1,90 @@ +package electrosphere.renderer.ui.widgets; + +import electrosphere.main.Globals; +import electrosphere.renderer.Material; +import electrosphere.renderer.Model; +import electrosphere.renderer.framebuffer.Framebuffer; +import electrosphere.renderer.framebuffer.FramebufferUtils; +import electrosphere.renderer.texture.Texture; +import electrosphere.renderer.ui.Widget; +import org.joml.Vector3f; +import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; +import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; +import static org.lwjgl.opengl.GL11.glClear; +import static org.lwjgl.opengl.GL11.glClearColor; +import static org.lwjgl.opengl.GL30.GL_FRAMEBUFFER; +import static org.lwjgl.opengl.GL30.glBindFramebuffer; + +/** + * + * @author amaterasu + */ +public class ImagePanel extends Widget { + + Material customMat = new Material(); + Texture texture = null; + + Vector3f boxPosition = new Vector3f(0,0,0); + Vector3f boxDimensions = new Vector3f(1,1,0); + Vector3f texPosition = new Vector3f(0,0,0); + Vector3f texScale = new Vector3f(1,1,0); + + public ImagePanel(){ + texture = Globals.assetManager.fetchTexture("Textures/default_diffuse.png"); + customMat.setTexturePointer(texture.getTexturePointer()); + } + + public void setTexture(Texture texture){ + customMat.setTexturePointer(texture.getTexturePointer()); + } + + public Texture getTexture(){ + return texture; + } + + @Override + public void setPositionY(int positionY) { + float ndcY = (float)positionY/Globals.WINDOW_HEIGHT; + boxPosition.y = ndcY; + super.setPositionY(positionY); + } + + @Override + public void setPositionX(int positionX) { + float ndcX = (float)positionX/Globals.WINDOW_WIDTH; + boxPosition.x = ndcX; + super.setPositionX(positionX); + } + + @Override + public void setHeight(int height) { + float ndcHeight = (float)height/Globals.WINDOW_HEIGHT; + boxDimensions.y = ndcHeight; + super.setHeight(height); + } + + @Override + public void setWidth(int width) { + float ndcWidth = (float)width/Globals.WINDOW_WIDTH; + boxDimensions.x = ndcWidth; + super.setWidth(width); + } + + + + @Override + public void draw(int parentFramebufferPointer) { + //this call binds the screen as the "texture" we're rendering to + //have to call before actually rendering + glBindFramebuffer(GL_FRAMEBUFFER, parentFramebufferPointer); + + Model planeModel = Globals.assetManager.fetchModel(Globals.planeModelID); + planeModel.pushUniformToMesh("plane", "mPosition", boxPosition); + planeModel.pushUniformToMesh("plane", "mDimension", boxDimensions); + planeModel.pushUniformToMesh("plane", "tPosition", texPosition); + planeModel.pushUniformToMesh("plane", "tDimension", texScale); + planeModel.meshes.get(0).setMaterial(customMat); + planeModel.drawUI(); + } + +} diff --git a/src/main/java/electrosphere/util/ModelLoader.java b/src/main/java/electrosphere/util/ModelLoader.java index 08be9e55..6d689d70 100644 --- a/src/main/java/electrosphere/util/ModelLoader.java +++ b/src/main/java/electrosphere/util/ModelLoader.java @@ -88,7 +88,7 @@ public class ModelLoader { } //once we've either added default textures or actual textures, //set the current mesh's material to this new one - current_mesh.set_material(final_material); + current_mesh.setMaterial(final_material); } else { LoggerInterface.loggerRenderer.WARNING("Failed to load texture for node " + current_mesh.nodeID + " of model " + path); }