From f2b0cd4582bdc3b8666ec7f6c4a29d67b06e7646 Mon Sep 17 00:00:00 2001 From: chai Date: Mon, 14 Jan 2019 17:37:28 +0800 Subject: =?UTF-8?q?*=E6=9D=90=E8=B4=A8=E5=92=8Cshader?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Source/Asura/Component.h | 13 ++++ Source/Asura/Containers/Map.h | 9 +-- Source/Asura/Containers/StringMap.hpp | 13 ++++ Source/Asura/GameObject.h | 1 + Source/Asura/Graphics/Animation.cpp | 0 Source/Asura/Graphics/Animation.h | 0 Source/Asura/Graphics/Animations/Animation.cpp | 0 Source/Asura/Graphics/Animations/Animation.h | 0 Source/Asura/Graphics/Effects/ParticleSystem.cpp | 0 Source/Asura/Graphics/Effects/ParticleSystem.h | 0 Source/Asura/Graphics/Material.h | 81 ++++++++++++++++++++++-- Source/Asura/Graphics/ParticleSystem.cpp | 0 Source/Asura/Graphics/ParticleSystem.h | 19 ++++++ Source/Asura/Graphics/Renderer.h | 6 +- Source/Asura/Graphics/Shader.h | 37 +++++++++-- Source/Asura/Graphics/SpriteBatch.cpp | 0 Source/Asura/Graphics/SpriteBatch.h | 0 Source/Asura/Object.cpp | 23 +++++++ Source/Asura/Object.h | 13 ++++ Source/Asura/Transform.h | 2 +- Source/Asura/rename.bat | 0 21 files changed, 200 insertions(+), 17 deletions(-) create mode 100644 Source/Asura/Graphics/Animation.cpp create mode 100644 Source/Asura/Graphics/Animation.h delete mode 100644 Source/Asura/Graphics/Animations/Animation.cpp delete mode 100644 Source/Asura/Graphics/Animations/Animation.h delete mode 100644 Source/Asura/Graphics/Effects/ParticleSystem.cpp delete mode 100644 Source/Asura/Graphics/Effects/ParticleSystem.h create mode 100644 Source/Asura/Graphics/ParticleSystem.cpp create mode 100644 Source/Asura/Graphics/ParticleSystem.h create mode 100644 Source/Asura/Graphics/SpriteBatch.cpp create mode 100644 Source/Asura/Graphics/SpriteBatch.h delete mode 100644 Source/Asura/rename.bat (limited to 'Source') diff --git a/Source/Asura/Component.h b/Source/Asura/Component.h index 20f0685..a602d50 100644 --- a/Source/Asura/Component.h +++ b/Source/Asura/Component.h @@ -11,6 +11,7 @@ namespace AsuraEngine class Component : public Object { public: + virtual void OnEnable(); virtual void OnEvent(); virtual void OnUpdate(uint32 milliseconds); @@ -18,6 +19,18 @@ namespace AsuraEngine virtual void OnDisable(); protected: + + enum class EnableCallback + { + OnEnable = 1, + OnEvent = 1 << 1, + OnUpdate = 1 << 2, + OnRender = 1 << 3, + OnDisable = 1 << 4, + }; + + EnableCallback mEnabledCallbacks; + GameObject* mGameObject; }; diff --git a/Source/Asura/Containers/Map.h b/Source/Asura/Containers/Map.h index cc2358e..2caedef 100644 --- a/Source/Asura/Containers/Map.h +++ b/Source/Asura/Containers/Map.h @@ -7,13 +7,10 @@ namespace AsuraEngine { namespace Containers { -/* - template - class Map : public std::map< - { - }; -*/ + template + using Map = std::map; + } } diff --git a/Source/Asura/Containers/StringMap.hpp b/Source/Asura/Containers/StringMap.hpp index af5b856..94858a7 100644 --- a/Source/Asura/Containers/StringMap.hpp +++ b/Source/Asura/Containers/StringMap.hpp @@ -1,15 +1,28 @@ #ifndef __AE_STRINGMAP_H__ #define __AE_STRINGMAP_H__ +#include "String.h" + namespace AsuraEngine { namespace Containers { + /// + /// 一个双向一一对应的映射,用来储存shader uniforms、statemathine state parameter的ID。 + /// + template class StringMap { public: + bool ContainsKey(const key_type& key); + + bool ContainsString(const String& str); + + String GetStringByKey(const key_type& key); + + key_type GetKeyByString(const String& str); }; diff --git a/Source/Asura/GameObject.h b/Source/Asura/GameObject.h index 954ce6c..fcef864 100644 --- a/Source/Asura/GameObject.h +++ b/Source/Asura/GameObject.h @@ -38,6 +38,7 @@ namespace AsuraEngine void SetRotation(const Math::Vector2& rotation); private: + Transform mTransform; Containers::Vector mComponents; diff --git a/Source/Asura/Graphics/Animation.cpp b/Source/Asura/Graphics/Animation.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura/Graphics/Animation.h b/Source/Asura/Graphics/Animation.h new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura/Graphics/Animations/Animation.cpp b/Source/Asura/Graphics/Animations/Animation.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/Source/Asura/Graphics/Animations/Animation.h b/Source/Asura/Graphics/Animations/Animation.h deleted file mode 100644 index e69de29..0000000 diff --git a/Source/Asura/Graphics/Effects/ParticleSystem.cpp b/Source/Asura/Graphics/Effects/ParticleSystem.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/Source/Asura/Graphics/Effects/ParticleSystem.h b/Source/Asura/Graphics/Effects/ParticleSystem.h deleted file mode 100644 index e69de29..0000000 diff --git a/Source/Asura/Graphics/Material.h b/Source/Asura/Graphics/Material.h index 6093d18..2b74879 100644 --- a/Source/Asura/Graphics/Material.h +++ b/Source/Asura/Graphics/Material.h @@ -25,14 +25,51 @@ namespace AsuraEngine class Material : public Object { public: + + enum class UniformsType + { + None = 0, + Float, + Int, + Vector2, + Vector3, + Vector4, + Matrix44, + Texture, + Color, + }; + + struct UniformsInfo + { + int id; // uniform变量的ID + UniformsType type; // uniform变量的类型 + union + { + float f; + int i; + Math::Vector2 v2; + Math::Vector3 v3; + Math::Vector4 v4; + Math::Matrix44 m44; + Texture* tex; + Color col; + }value; // uniform变量的值 + }; + Material(); Material(const Material& srcMat); ~Material(); Material* Clone(); - // 设置Uniform变量 + void SetShader(Shader* shader); + + // 设置Uniform变量,保存在材质中,渲染时上传到GPU + /// + /// 获得uniform变量的ID,ID和name的map在shader间共享。设置uniform变量的值时,通过ID查询uniform变量名,在 + /// shader中找到uniform location并对这个location赋值。 + /// static int GetUniformID(const Containers::String& name); void SetTexture(int ID, Texture* texture); @@ -44,6 +81,16 @@ namespace AsuraEngine void SetInteger(int ID, int value); void SetColor(int ID, Color color); + UniformsInfo GetUniformInfo(int ID); + float GetUniformInfof(int ID); + int GetUniformInfoi(int ID); + Math::Vector2 GetUniformInfov2(int ID); + Math::Vector3 GetUniformInfov3(int ID); + Math::Vector4 GetUniformInfov4(int ID); + Math::Matrix44 GetUniformInfom44(int ID); + Texture* GetUniformInfotex(int ID); + Color GetUniformInfocol(int ID); + // 上传顶点数据 void SetVertexAttributes(); @@ -52,6 +99,8 @@ namespace AsuraEngine LUAX_DECL_FACTORY( Material ); + LUAX_DECL_METHOD( l_SetShader ); + LUAX_DECL_METHOD( l_SetTexture ); LUAX_DECL_METHOD( l_SetVector2 ); LUAX_DECL_METHOD( l_SetVector3 ); @@ -62,10 +111,34 @@ namespace AsuraEngine LUAX_DECL_METHOD( l_SetColor ); LUAX_DECL_METHOD( l_SetVertexAttributes ); + LUAX_DECL_METHOD( l_GetUniformInfo ); + LUAX_DECL_METHOD( l_GetUniformInfof ); + LUAX_DECL_METHOD( l_GetUniformInfoi ); + LUAX_DECL_METHOD( l_GetUniformInfov2 ); + LUAX_DECL_METHOD( l_GetUniformInfov3 ); + LUAX_DECL_METHOD( l_GetUniformInfov4 ); + LUAX_DECL_METHOD( l_GetUniformInfom44 ); + LUAX_DECL_METHOD( l_GetUniformInfotex ); + LUAX_DECL_METHOD( l_GetUniformInfocol ); + + LUAX_DECL_METHOD( l_SetVertexAttributes ); + private: - //Color mColor; - //Shader* mShader; - //Texture* mMainTexture; + + /// + /// + /// + Shader* mShader; + + /// + /// Uniforms变量的值,映射ID到值 + /// + Containers::Map mUniforms; + + /// + /// 是否是共享的材质 + /// + bool mIsShared; }; diff --git a/Source/Asura/Graphics/ParticleSystem.cpp b/Source/Asura/Graphics/ParticleSystem.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura/Graphics/ParticleSystem.h b/Source/Asura/Graphics/ParticleSystem.h new file mode 100644 index 0000000..98aba49 --- /dev/null +++ b/Source/Asura/Graphics/ParticleSystem.h @@ -0,0 +1,19 @@ +#ifndef __AE_PARTICLESYSTEM_H__ +#define __AE_PARTICLESYSTEM_H__ + +#include "Component.h" + +namespace AsuraEngine +{ + namespace Graphics + { + + class ParticleSystem : public Component + { + + }; + + } +} + +#endif \ No newline at end of file diff --git a/Source/Asura/Graphics/Renderer.h b/Source/Asura/Graphics/Renderer.h index 004bbe4..2efa391 100644 --- a/Source/Asura/Graphics/Renderer.h +++ b/Source/Asura/Graphics/Renderer.h @@ -1,6 +1,7 @@ #ifndef __AE_RENDERER_H__ #define __AE_RENDERER_H__ +#include "Component.h" #include "Material.h" namespace AsuraEngine @@ -8,11 +9,12 @@ namespace AsuraEngine namespace Graphics { - class Renderer + class Renderer : public Component { public: /// - /// + /// 一旦调用此方法,就会拷贝shared material,调用此方法意味着要对material的配置进行修改,如果此时使用的材质是 + /// shared material,则需要拷贝一份,避免影响其他共享的renderer。 /// Material* GetMaterial(); diff --git a/Source/Asura/Graphics/Shader.h b/Source/Asura/Graphics/Shader.h index 0589c70..7c09139 100644 --- a/Source/Asura/Graphics/Shader.h +++ b/Source/Asura/Graphics/Shader.h @@ -1,10 +1,11 @@ #ifndef __AE_SHADER_H__ #define __AE_SHADER_H__ -#include "../Object.h" - #include "luax/luax.h" +#include "Containers/Map.h" +#include "Containers/StringMap.hpp" +#include "Object.h" #include "Color.h" namespace AsuraEngine @@ -12,17 +13,45 @@ namespace AsuraEngine namespace Graphics { + class Material; + + /// + /// 一个shader是一个在材质间共享的程序。Shader本身不保存uniforms和顶点数据,只保存uniforms location。 + /// class Shader : public Object { public: + Shader(); + ~Shader(); + + private: + + friend class Material; + + /// + /// 保存了所有shader的uniforms变量的ID映射。 + /// + static Containers::StringMap sUniformsID; + + /// + /// 获得uniform变量的ID。 + /// + static int GetUniformID(const Containers::String& name); + /// /// 设置内置变量: - /// vec2 Asura_Time x值为进入当前场景开始的时间,y值为上一帧的时间间隔 - /// vec2 Asura_RenderTargetSize RT的大小,以像素为单位 + /// vec2 Asura_Time x值为进入当前场景开始的时间,y值为上一帧的时间间隔 + /// vec2 Asura_RenderTargetSize RT的大小,以像素为单位 + /// Texture Asura_MainTexture 主纹理 /// void SetBuiltInUniforms(); + /// + /// 映射uniforms ID到location。 + /// + Containers::Map mLocations; + }; } diff --git a/Source/Asura/Graphics/SpriteBatch.cpp b/Source/Asura/Graphics/SpriteBatch.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura/Graphics/SpriteBatch.h b/Source/Asura/Graphics/SpriteBatch.h new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura/Object.cpp b/Source/Asura/Object.cpp index e69de29..587dca7 100644 --- a/Source/Asura/Object.cpp +++ b/Source/Asura/Object.cpp @@ -0,0 +1,23 @@ +#include "Object.h" + +namespace AsuraEngine +{ + + Object::Object() + : mRC(0) + { + + } + + void Object::Retain(Object* obj) + { + ++obj->mRC; + } + + void Object::Release(Object* obj) + { + if (--obj->mRC == 0) + delete obj; + } + +} \ No newline at end of file diff --git a/Source/Asura/Object.h b/Source/Asura/Object.h index 4617a4a..2511500 100644 --- a/Source/Asura/Object.h +++ b/Source/Asura/Object.h @@ -8,6 +8,19 @@ namespace AsuraEngine class Object { + public: + + Object(); + + virtual ~Object(); + + static void Retain(Object* obj); + + static void Release(Object* obj); + + private: + + int mRC; // 引用数 }; diff --git a/Source/Asura/Transform.h b/Source/Asura/Transform.h index 9666ec4..98a0c77 100644 --- a/Source/Asura/Transform.h +++ b/Source/Asura/Transform.h @@ -1,7 +1,7 @@ #ifndef __AE_TRANSFORM_H__ #define __AE_TRANSFORM_H__ -#include "./Math/AE_Vector2.h" +#include "Math/Vector2.h" namespace AsuraEngine { diff --git a/Source/Asura/rename.bat b/Source/Asura/rename.bat deleted file mode 100644 index e69de29..0000000 -- cgit v1.1-26-g67d0