Selaa lähdekoodia

Move glClear to the common point before the actual render of an image
Added work in progress reverse engineering of MDL files

Signed-off-by: Alexis Maiquez <almamu@almamu.com>

Alexis Maiquez 3 vuotta sitten
vanhempi
commit
157966a528
2 muutettua tiedostoa jossa 109 lisäystä ja 10 poistoa
  1. 104 0
      docs/rendering/MDL_FILES.md
  2. 5 10
      src/WallpaperEngine/Render/Objects/CImage.cpp

+ 104 - 0
docs/rendering/MDL_FILES.md

@@ -0,0 +1,104 @@
+# MDL Files
+These seem to be simple model files containing the required information to render 3D objects.
+They're also used in some 2D backgrounds (like 2879436369) for bones.
+
+**NOTE**: This documentation page is not completed yet as there's still work left to do on the reverse engineering of this file format. For now just a structure, describing the file format is here
+
+```
+//
+// 010 editor template
+//
+//
+typedef struct {
+    float x <fgcolor=cRed>;
+    float y <fgcolor=cGreen>;
+    float z <fgcolor=cBlue>;
+} VECTOR3;
+
+typedef struct {
+    float x <fgcolor=cRed>;
+    float y <fgcolor=cGreen>;
+    float z <fgcolor=cBlue>;
+    float w <fgcolor=cPurple>;
+} VECTOR4;
+
+typedef struct {
+    float x <fgcolor=cRed>;
+    float y <fgcolor=cGreen>;
+} VECTOR2;
+
+typedef struct {
+    DWORD x <fgcolor=cRed>;
+    DWORD y <fgcolor=cGreen>;
+    DWORD z <fgcolor=cBlue>;
+    DWORD w <fgcolor=cPurple>;
+} BLENDINDICES;
+
+typedef struct {
+    VECTOR3 vertex <bgcolor=cRed>;
+    BLENDINDICES blendindices;
+    VECTOR4 blendweight;
+    VECTOR2 uv <bgcolor=cBlue>;
+} VERTEX;
+
+typedef struct {
+    WORD x;
+    WORD y;
+    WORD z;
+} VERTEXINDICE;
+
+typedef struct {
+    CHAR header[];
+    DWORD first;
+    DWORD second;
+    DWORD third;
+    CHAR json[];
+    DWORD fourth;
+    DWORD fifth;
+    DWORD vertexByteLength;
+    VERTEX vertices[vertexByteLength / sizeof(VERTEX)];
+    DWORD indicesByteLength;
+    VERTEXINDICE indices[indicesByteLength / sizeof (VERTEXINDICE)] <bgcolor=cYellow>;
+} MDLVHEADER;
+
+typedef struct {
+    BYTE tmp;
+    DWORD type;
+    DWORD unk1;
+} BONEENTRYHEADER;
+
+typedef struct {
+    BONEENTRYHEADER header;
+    DWORD entryByteLength;
+    float v[entryByteLength / sizeof (float)];
+    CHAR info[];
+} BONEENTRY;
+
+typedef struct {
+    BONEENTRYHEADER header;
+} BONE2ENTRY;
+
+typedef struct {
+    CHAR header[];
+    DWORD mightBeByteLength;
+    DWORD numberOfBones;
+    BONEENTRY bones[numberOfBones]<optimize=false>;
+    BONE2ENTRY unk[numberOfBones]<optimize=false>;
+} MDLSHEADER;
+
+typedef struct {
+    CHAR header[];
+} MDLAHEADER;
+
+typedef struct {
+    MDLVHEADER mdlv;
+    MDLSHEADER mdls;
+} MDLFILE;
+
+LittleEndian ();
+MDLFILE file;
+
+// mdlv => vertices information
+// mdls => skinning information
+// mdla => animation information
+```

+ 5 - 10
src/WallpaperEngine/Render/Objects/CImage.cpp

@@ -269,11 +269,6 @@ void CImage::simpleRender ()
 {
     ITexture* input = this->m_mainFBO;
 
-    // clear the main framebuffer
-    glBindFramebuffer (GL_FRAMEBUFFER, this->m_mainFBO->getFramebuffer ());
-    // attach the main texture
-    glClear (GL_COLOR_BUFFER_BIT);
-
     // FIXME: THIS IS A QUICK HACK FOR ANIMATED IMAGES, IF ANY OF THOSE HAVE ANY EFFECT ON THEM THIS WILL LIKELY BREAK
     if (this->getTexture ()->isAnimated () == true)
     {
@@ -303,11 +298,6 @@ void CImage::complexRender ()
     CFBO* drawTo = this->m_mainFBO;
     ITexture* asInput = this->getTexture ();
 
-    // clear the main framebuffer
-    glBindFramebuffer (GL_FRAMEBUFFER, this->m_mainFBO->getFramebuffer ());
-    // attach the main texture
-    glClear (GL_COLOR_BUFFER_BIT);
-
     // do the first pass render into the main framebuffer
     auto cur = this->m_copyMaterial->getPasses ().begin ();
     auto end = this->m_copyMaterial->getPasses ().end ();
@@ -389,6 +379,11 @@ void CImage::render ()
 
     glColorMask (true, true, true, true);
 
+    // clear the main framebuffer
+    glBindFramebuffer (GL_FRAMEBUFFER, this->m_mainFBO->getFramebuffer ());
+    // attach the main texture
+    glClear (GL_COLOR_BUFFER_BIT);
+
     // check if there's more than one pass and do different things based on that
     if (this->m_effects.empty () == true)
         this->simpleRender ();