]> git.lizzy.rs Git - irrlicht.git/commitdiff
Merging r6107 through r6116 from trunk to ogl-es branch
authorcutealien <cutealien@dfc29bdd-3216-0410-991c-e03cc46cb475>
Fri, 12 Jun 2020 20:47:40 +0000 (20:47 +0000)
committercutealien <cutealien@dfc29bdd-3216-0410-991c-e03cc46cb475>
Fri, 12 Jun 2020 20:47:40 +0000 (20:47 +0000)
Caught up with trunk again.
Not yet tested beside compiling (quick test failed, but seems like nothing from the new changes).

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@6117 dfc29bdd-3216-0410-991c-e03cc46cb475

13 files changed:
changes.txt
include/ICursorControl.h
include/ISceneManager.h
source/Irrlicht/CB3DMeshWriter.cpp
source/Irrlicht/CB3DMeshWriter.h
source/Irrlicht/CIrrDeviceWin32.h
source/Irrlicht/CPLYMeshFileLoader.cpp
source/Irrlicht/CSceneManager.cpp
source/Irrlicht/CSceneManager.h
source/Irrlicht/CTRTextureLightMap2_Add.cpp
source/Irrlicht/CTriangleSelector.cpp
source/Irrlicht/SoftwareDriver2_helper.h
source/Irrlicht/burning_shader_compile_fragment_default.h

index c213dfc6b86295d8d672e650fe7ae850f862828f..174236aabbc4531f93954502e90dd5ac14baee4f 100644 (file)
@@ -9,6 +9,15 @@ Changes in ogl-es (not yet released - will be merged with trunk at some point)
 \r
 --------------------------\r
 Changes in 1.9 (not yet released)\r
+- Fix potential reading/writing 1 byte behind it's own buffer in PLY loader.\r
+  Thanks @wolfgang for report and patch (http://irrlicht.sourceforge.net/forum/viewtopic.php?f=7&t=52627&p=305573#p305573)\r
+- ICursorControl::isVisible is now always returning the flag set in setVisible. \r
+  This changes the behaviour on Win32 somewhat when Windows returned a CURSOR_SUPPRESSED state (touch-screen input).\r
+  Previously we set IsVisible it to false when CURSOR_SUPPRESSED was set.\r
+  Also we handle the CURSOR_SUPPRESSED state slightly different now and still try to hide cursors once when requested.\r
+- Improvements to B3D writer for speed, readability and handling of low framerate animations.\r
+  Thanks @JLouisB for the patch (For more info, see: http://irrlicht.sourceforge.net/forum/viewtopic.php?f=2&t=50067&start=15)\r
+- Add another render pass ESNRP_GUI which is drawn last and is p.E. useful for rendering gui nodes in the scenemanager.\r
 - BurningVideo: 0.51\r
   - 10 year anniversary update\r
   - Lighting model reworked. moved to eyespace like openGL. [Specular Highlights, Fog, Sphere/Reflection Map] \r
index 4597bf370cf6ee92cf60c096fb6ca070ecf7950a..13c99c4566e30b96eddbc0bbca621b99472fd581 100644 (file)
@@ -104,7 +104,7 @@ namespace gui
                virtual void setVisible(bool visible) = 0;\r
 \r
                //! Returns if the cursor is currently visible.\r
-               /** \return True if the cursor is visible, false if not. */\r
+               /** \return True if the cursor flag is set to visible, false if not. */\r
                virtual bool isVisible() const = 0;\r
 \r
                //! Sets the new position of the cursor.\r
index 29b4b8786afe10bfd7650a1108375c2982ff4445..65e81c3dfa2c36fc0be72249fde2c9f47d8c0199 100644 (file)
@@ -52,7 +52,9 @@ namespace scene
 {\r
        //! Enumeration for render passes.\r
        /** A parameter passed to the registerNodeForRendering() method of the ISceneManager,\r
-       specifying when the node wants to be drawn in relation to the other nodes. */\r
+       specifying when the node wants to be drawn in relation to the other nodes.\r
+       Note: Despite the numbering this is not used as bit-field.\r
+       */\r
        enum E_SCENE_NODE_RENDER_PASS\r
        {\r
                //! No pass currently active\r
@@ -92,7 +94,11 @@ namespace scene
                ESNRP_TRANSPARENT_EFFECT =32,\r
 \r
                //! Drawn after the solid nodes, before the transparent nodes, the time for drawing shadow volumes\r
-               ESNRP_SHADOW =64\r
+               ESNRP_SHADOW =64,\r
+\r
+               //! Drawn after transparent effect nodes. For custom gui's. Unsorted (in order nodes registered themselves). \r
+               ESNRP_GUI = 128\r
+\r
        };\r
 \r
        class IAnimatedMesh;\r
@@ -1122,6 +1128,8 @@ namespace scene
                \param pass: Specifies when the node wants to be drawn in relation to the other nodes.\r
                For example, if the node is a shadow, it usually wants to be drawn after all other nodes\r
                and will use ESNRP_SHADOW for this. See scene::E_SCENE_NODE_RENDER_PASS for details.\r
+               Note: This is _not_ a bitfield. If you want to register a note for several render passes, then \r
+               call this function once for each pass.\r
                \return scene will be rendered ( passed culling ) */\r
                virtual u32 registerNodeForRendering(ISceneNode* node,\r
                        E_SCENE_NODE_RENDER_PASS pass = ESNRP_AUTOMATIC) = 0;\r
index dd6031add6945794538e9fee1cab75dd69455fe8..bf5576b999841540e313a0a4e052752c91064a22 100644 (file)
@@ -50,20 +50,19 @@ bool CB3DMeshWriter::writeMesh(io::IWriteFile* file, IMesh* const mesh, s32 flag
     return false;\r
 #endif\r
 \r
-    Size = 0;\r
     file->write("BB3D", 4);\r
-    file->write(&Size, sizeof(u32)); // Updated later once known.\r
+    file->write("size", 4); // BB3D chunk size, updated later\r
 \r
-    int version = 1;\r
-    write(file, &version, sizeof(int));\r
+    const u32 version = 1;\r
+    file->write(&version, 4);\r
 \r
     //\r
 \r
-    const u32 numBeshBuffers = mesh->getMeshBufferCount();\r
+    const u32 numMeshBuffers = mesh->getMeshBufferCount();\r
     array<SB3dTexture> texs;\r
     map<ITexture *, u32> tex2id;       // TODO: texture pointer as key not sufficient as same texture can have several id's\r
     u32 texsizes = 0;\r
-    for (u32 i = 0; i < numBeshBuffers; i++)\r
+    for (u32 i = 0; i < numMeshBuffers; i++)\r
        {\r
         const IMeshBuffer * const mb = mesh->getMeshBuffer(i);\r
         const SMaterial &mat = mb->getMaterial();\r
@@ -93,192 +92,122 @@ bool CB3DMeshWriter::writeMesh(io::IWriteFile* file, IMesh* const mesh, s32 flag
         }\r
     }\r
 \r
-    write(file, "TEXS", 4);\r
-    write(file, &texsizes, 4);\r
+    file->write("TEXS", 4);\r
+    file->write(&texsizes, 4);\r
 \r
     u32 numTexture = texs.size();\r
     for (u32 i = 0; i < numTexture; i++)\r
        {\r
-        write(file, texs[i].TextureName.c_str(), texs[i].TextureName.size() + 1);\r
-        write(file, &texs[i].Flags, 7*4);\r
+        file->write(texs[i].TextureName.c_str(), texs[i].TextureName.size() + 1);\r
+        file->write(&texs[i].Flags, 7*4);\r
     }\r
 \r
     //\r
 \r
-    const u32 brushsize = (7 * 4 + 1) * numBeshBuffers + numBeshBuffers * 4 * MATERIAL_MAX_TEXTURES + 4;\r
-    write(file, "BRUS", 4);\r
-    write(file, &brushsize, 4);\r
-    u32 brushcheck = Size;\r
+    file->write("BRUS", 4);\r
+    const u32 brushSizeAdress = file->getPos();\r
+    file->write(&brushSizeAdress, 4); // BRUSH chunk size, updated later\r
+\r
     const u32 usedtex = MATERIAL_MAX_TEXTURES;\r
-    write(file, &usedtex, 4);\r
+    file->write(&usedtex, 4);\r
 \r
-    for (u32 i = 0; i < numBeshBuffers; i++)\r
+    for (u32 i = 0; i < numMeshBuffers; i++)\r
        {\r
         const IMeshBuffer * const mb = mesh->getMeshBuffer(i);\r
         const SMaterial &mat = mb->getMaterial();\r
 \r
-        write(file, "", 1);\r
+        file->write("", 1);\r
 \r
         float f = 1;\r
-        write(file, &f, 4);\r
-        write(file, &f, 4);\r
-        write(file, &f, 4);\r
-        write(file, &f, 4);\r
+        file->write(&f, 4);\r
+        file->write(&f, 4);\r
+        file->write(&f, 4);\r
+        file->write(&f, 4);\r
 \r
         f = 0;\r
-        write(file, &f, 4);\r
+        file->write(&f, 4);\r
 \r
         u32 tmp = 1;\r
-        write(file, &tmp, 4);\r
+        file->write(&tmp, 4);\r
         tmp = 0;\r
-        write(file, &tmp, 4);\r
+        file->write(&tmp, 4);\r
 \r
         for (u32 j = 0; j < MATERIAL_MAX_TEXTURES; j++)\r
                {\r
+                   s32 id = -1;\r
             if (mat.getTexture(j))\r
                        {\r
-                const u32 id = tex2id[mat.getTexture(j)];\r
-                write(file, &id, 4);\r
-            }\r
-                       else\r
-                       {\r
-                const int id = -1;\r
-                write(file, &id, 4);\r
+                id = tex2id[mat.getTexture(j)];\r
             }\r
+            file->write(&id, 4);\r
         }\r
     }\r
+    writeSizeFrom(file, brushSizeAdress+4, brushSizeAdress); // BRUSH chunk size\r
 \r
-    // Check brushsize\r
-    brushcheck = Size - brushcheck;\r
-    if (brushcheck != brushsize)\r
-       {\r
-        printf("Failed in brush size calculation, size %u advanced %u\n",\r
-            brushsize, brushcheck);\r
-       }\r
-\r
-    write(file, "NODE", 4);\r
-\r
-    // Calculate node size\r
-    u32 nodesize = 41 + 8 + 4 + 8;\r
-    u32 bonesSize = 0;\r
-\r
-    if(ISkinnedMesh *skinnedMesh = getSkinned(mesh))\r
-    {\r
-        if (!skinnedMesh->isStatic())\r
-        {\r
-            bonesSize += 20;\r
-        }\r
-\r
-        const core::array<ISkinnedMesh::SJoint*> rootJoints = getRootJoints(skinnedMesh);\r
-        for (u32 i = 0; i < rootJoints.size(); i++)\r
-        {\r
-            bonesSize += getJointChunkSize(skinnedMesh, rootJoints[i]);\r
-        }\r
-        nodesize += bonesSize;\r
-\r
-        // -------------------\r
-\r
-    }\r
-\r
-    // VERT data\r
-    nodesize += 12;\r
+    file->write("NODE", 4);\r
+    u32 nodeSizeAdress = file->getPos();\r
+    file->write(&nodeSizeAdress, 4); // NODE chunk size, updated later\r
 \r
-    const u32 texcoords = getUVlayerCount(mesh);\r
-    for (u32 i = 0; i < numBeshBuffers; i++)\r
-    {\r
-        nodesize += 8 + 4;\r
-        const IMeshBuffer * const mb = mesh->getMeshBuffer(i);\r
+    // Node\r
+    file->write("", 1);\r
 \r
-        nodesize += mb->getVertexCount() * 10 * 4;\r
+    // position\r
+    writeVector3(file, core::vector3df(0.f, 0.f, 0.f));\r
 \r
-        nodesize += mb->getVertexCount() * texcoords * 2 * 4;\r
-        nodesize += mb->getIndexCount() * 4;\r
-    }\r
-    write(file, &nodesize, 4);\r
-    u32 nodecheck = Size;\r
+    // scale\r
+    writeVector3(file, core::vector3df(1.f, 1.f, 1.f));\r
 \r
-    // Node\r
-    write(file, "", 1);\r
-    float f = 0;\r
-    write(file, &f, 4);\r
-    write(file, &f, 4);\r
-    write(file, &f, 4);\r
-\r
-    f = 1;\r
-    write(file, &f, 4);\r
-    write(file, &f, 4);\r
-    write(file, &f, 4);\r
-\r
-    write(file, &f, 4);\r
-    f = 0;\r
-    write(file, &f, 4);\r
-    write(file, &f, 4);\r
-    write(file, &f, 4);\r
+    // rotation\r
+    writeQuaternion(file, core::quaternion(0.f, 0.f, 0.f, 1.f));\r
 \r
     // Mesh\r
-    write(file, "MESH", 4);\r
-    const u32 meshsize = nodesize - 41 - 8 - bonesSize;\r
-    write(file, &meshsize, 4);\r
+    file->write("MESH", 4);\r
+    const u32 meshSizeAdress = file->getPos();\r
+    file->write(&meshSizeAdress, 4); // MESH chunk size, updated later\r
+\r
        s32 brushID = -1;\r
-    write(file, &brushID, 4);\r
+    file->write(&brushID, 4);\r
 \r
 \r
 \r
     // Verts\r
-    write(file, "VRTS", 4);\r
-    u32 vertsize = 12;\r
-\r
-    for (u32 i = 0; i < numBeshBuffers; i++)\r
-    {\r
-        const IMeshBuffer * const mb = mesh->getMeshBuffer(i);\r
+    file->write("VRTS", 4);\r
+    const u32 verticesSizeAdress = file->getPos();\r
+    file->write(&verticesSizeAdress, 4);\r
 \r
-        vertsize += mb->getVertexCount() * 10 * 4 +\r
-                    mb->getVertexCount() * texcoords * 2 * 4;\r
-    }\r
-    write(file, &vertsize, 4);\r
-    u32 vertcheck = Size;\r
+    u32 flagsB3D = 3; // 1=normal values present, 2=rgba values present\r
+    file->write(&flagsB3D, 4);\r
 \r
-    int flagsB3D = 3;\r
-    write(file, &flagsB3D, 4);\r
-\r
-    write(file, &texcoords, 4);\r
+    const u32 texcoordsCount = getUVlayerCount(mesh);\r
+    file->write(&texcoordsCount, 4);\r
     flagsB3D = 2;\r
-    write(file, &flagsB3D, 4);\r
+    file->write(&flagsB3D, 4);\r
 \r
-    for (u32 i = 0; i < numBeshBuffers; i++)\r
+    for (u32 i = 0; i < numMeshBuffers; i++)\r
     {\r
         const IMeshBuffer * const mb = mesh->getMeshBuffer(i);\r
-        irr::u32 numVertices = mb->getVertexCount();\r
+        const u32 numVertices = mb->getVertexCount();\r
         for (u32 j = 0; j < numVertices; j++)\r
                {\r
             const vector3df &pos = mb->getPosition(j);\r
-            write(file, &pos.X, 4);\r
-            write(file, &pos.Y, 4);\r
-            write(file, &pos.Z, 4);\r
+            writeVector3(file, pos);\r
 \r
             const vector3df &n = mb->getNormal(j);\r
-            write(file, &n.X, 4);\r
-            write(file, &n.Y, 4);\r
-            write(file, &n.Z, 4);\r
+            writeVector3(file, n);\r
 \r
-            const u32 zero = 0;\r
             switch (mb->getVertexType())\r
                        {\r
                 case EVT_STANDARD:\r
                 {\r
                     S3DVertex *v = (S3DVertex *) mb->getVertices();\r
                     const SColorf col(v[j].Color);\r
-                    write(file, &col.r, 4);\r
-                    write(file, &col.g, 4);\r
-                    write(file, &col.b, 4);\r
-                    write(file, &col.a, 4);\r
-\r
-                    write(file, &v[j].TCoords.X, 4);\r
-                    write(file, &v[j].TCoords.Y, 4);\r
-                    if (texcoords == 2)\r
+                    writeColor(file, col);\r
+\r
+                    const core::vector2df uv1 = v[j].TCoords;\r
+                    writeVector2(file, uv1);\r
+                    if (texcoordsCount == 2)\r
                     {\r
-                        write(file, &zero, 4);\r
-                        write(file, &zero, 4);\r
+                        writeVector2(file, core::vector2df(0.f, 0.f));\r
                     }\r
                 }\r
                 break;\r
@@ -286,101 +215,93 @@ bool CB3DMeshWriter::writeMesh(io::IWriteFile* file, IMesh* const mesh, s32 flag
                 {\r
                     S3DVertex2TCoords *v = (S3DVertex2TCoords *) mb->getVertices();\r
                     const SColorf col(v[j].Color);\r
-                    write(file, &col.r, 4);\r
-                    write(file, &col.g, 4);\r
-                    write(file, &col.b, 4);\r
-                    write(file, &col.a, 4);\r
-\r
-                    write(file, &v[j].TCoords.X, 4);\r
-                    write(file, &v[j].TCoords.Y, 4);\r
-                    write(file, &v[j].TCoords2.X, 4);\r
-                    write(file, &v[j].TCoords2.Y, 4);\r
+                    writeColor(file, col);\r
+\r
+                    const core::vector2df uv1 = v[j].TCoords;\r
+                    writeVector2(file, uv1);\r
+                    const core::vector2df uv2 = v[j].TCoords;\r
+                    writeVector2(file, uv2);\r
                 }\r
                 break;\r
                 case EVT_TANGENTS:\r
                 {\r
                     S3DVertexTangents *v = (S3DVertexTangents *) mb->getVertices();\r
                     const SColorf col(v[j].Color);\r
-                    write(file, &col.r, 4);\r
-                    write(file, &col.g, 4);\r
-                    write(file, &col.b, 4);\r
-                    write(file, &col.a, 4);\r
-\r
-                    write(file, &v[j].TCoords.X, 4);\r
-                    write(file, &v[j].TCoords.Y, 4);\r
-                    if (texcoords == 2)\r
+                    writeColor(file, col);\r
+\r
+                    const core::vector2df uv1 = v[j].TCoords;\r
+                    writeVector2(file, uv1);\r
+                    if (texcoordsCount == 2)\r
                     {\r
-                        write(file, &zero, 4);\r
-                        write(file, &zero, 4);\r
+                        writeVector2(file, core::vector2df(0.f, 0.f));\r
                     }\r
                 }\r
                 break;\r
             }\r
         }\r
     }\r
-    // Check vertsize\r
-    vertcheck = Size - vertcheck;\r
-    if (vertcheck != vertsize)\r
-       {\r
-        printf("Failed in vertex size calculation, size %u advanced %u\n",\r
-            vertsize, vertcheck);\r
-       }\r
+    writeSizeFrom(file, verticesSizeAdress+4, verticesSizeAdress); // VERT chunk size\r
+\r
 \r
     u32 currentMeshBufferIndex = 0;\r
     // Tris\r
-    for (u32 i = 0; i < numBeshBuffers; i++)\r
+    for (u32 i = 0; i < numMeshBuffers; i++)\r
     {\r
         const IMeshBuffer * const mb = mesh->getMeshBuffer(i);\r
-        write(file, "TRIS", 4);\r
-        const u32 trisize = 4 + mb->getIndexCount() * 4;\r
-        write(file, &trisize, 4);\r
-\r
-        u32 tricheck = Size;\r
+        file->write("TRIS", 4);\r
+        const u32 trisSizeAdress = file->getPos();\r
+        file->write(&trisSizeAdress, 4); // TRIS chunk size, updated later\r
 \r
-        write(file, &i, 4);\r
+        file->write(&i, 4);\r
 \r
         u32 numIndices = mb->getIndexCount();\r
         const u16 * const idx = (u16 *) mb->getIndices();\r
         for (u32 j = 0; j < numIndices; j += 3)\r
                {\r
             u32 tmp = idx[j] + currentMeshBufferIndex;\r
-            write(file, &tmp, sizeof(u32));\r
+            file->write(&tmp, sizeof(u32));\r
 \r
             tmp = idx[j + 1] + currentMeshBufferIndex;\r
-            write(file, &tmp, sizeof(u32));\r
+            file->write(&tmp, sizeof(u32));\r
 \r
             tmp = idx[j + 2] + currentMeshBufferIndex;\r
-            write(file, &tmp, sizeof(u32));\r
+            file->write(&tmp, sizeof(u32));\r
         }\r
-\r
-        // Check that tris calculation was ok\r
-        tricheck = Size - tricheck;\r
-        if (tricheck != trisize)\r
-               {\r
-            printf("Failed in tris size calculation, size %u advanced %u\n",\r
-                trisize, tricheck);\r
-               }\r
+        writeSizeFrom(file, trisSizeAdress+4, trisSizeAdress);  // TRIS chunk size\r
 \r
         currentMeshBufferIndex += mb->getVertexCount();\r
     }\r
+    writeSizeFrom(file, meshSizeAdress+4, meshSizeAdress); // MESH chunk size\r
+\r
 \r
     if(ISkinnedMesh *skinnedMesh = getSkinned(mesh))\r
     {\r
         // Write animation data\r
+        f32 animationSpeedMultiplier = 1.f;\r
         if (!skinnedMesh->isStatic())\r
         {\r
-            write(file, "ANIM", 4);\r
+            file->write("ANIM", 4);\r
 \r
             const u32 animsize = 12;\r
-            write(file, &animsize, 4);\r
+            file->write(&animsize, 4);\r
 \r
             const u32 flags = 0;\r
-            const u32 frames = skinnedMesh->getFrameCount();\r
-            const f32 fps = skinnedMesh->getAnimationSpeed();\r
+            f32 fps = skinnedMesh->getAnimationSpeed();\r
+\r
+            /* B3D file format use integer as keyframe, so there is some potential issues if the model use float as keyframe (Irrlicht use float) with a low animation FPS value\r
+            So we define a minimum animation FPS value to multiply the frame and FPS value if the FPS of the animation is too low to store the keyframe with integers */\r
+            const int minimumAnimationFPS = 60;\r
+\r
+            if (fps < minimumAnimationFPS)\r
+            {\r
+                animationSpeedMultiplier = minimumAnimationFPS / fps;\r
+                fps = minimumAnimationFPS;\r
+            }\r
+            const u32 frames = static_cast<u32>(skinnedMesh->getFrameCount() * animationSpeedMultiplier);\r
 \r
-            write(file, &flags, 4);\r
-            write(file, &frames, 4);\r
-            write(file, &fps, 4);\r
+            file->write(&flags, 4);\r
+            file->write(&frames, 4);\r
+            file->write(&fps, 4);\r
         }\r
 \r
         // Write joints\r
@@ -388,67 +309,49 @@ bool CB3DMeshWriter::writeMesh(io::IWriteFile* file, IMesh* const mesh, s32 flag
 \r
         for (u32 i = 0; i < rootJoints.size(); i++)\r
         {\r
-            writeJointChunk(file, skinnedMesh, rootJoints[i]);\r
+            writeJointChunk(file, skinnedMesh, rootJoints[i], animationSpeedMultiplier);\r
         }\r
     }\r
 \r
-    // Check that node calculation was ok\r
-    nodecheck = Size - nodecheck;\r
-    if (nodecheck != nodesize)\r
-       {\r
-        printf("Failed in node size calculation, size %u advanced %u\n",\r
-            nodesize, nodecheck);\r
-       }\r
-    file->seek(4);\r
-    file->write(&Size, 4);\r
+    writeSizeFrom(file, nodeSizeAdress+4, nodeSizeAdress); // Node chunk size\r
+       writeSizeFrom(file, 8, 4); // BB3D chunk size\r
 \r
     return true;\r
 }\r
 \r
 \r
 \r
-void CB3DMeshWriter::writeJointChunk(io::IWriteFile* file, ISkinnedMesh* mesh , ISkinnedMesh::SJoint* joint)\r
+void CB3DMeshWriter::writeJointChunk(io::IWriteFile* file, ISkinnedMesh* mesh, ISkinnedMesh::SJoint* joint, f32 animationSpeedMultiplier)\r
 {\r
     // Node\r
-    write(file, "NODE", 4);\r
-\r
-    // Calculate node size\r
-    u32 nodesize = getJointChunkSize(mesh, joint);\r
-    nodesize -= 8; // The declaration + size of THIS chunk shouldn't be added to the size\r
-\r
-    write(file, &nodesize, 4);\r
+    file->write("NODE", 4);\r
+    const u32 nodeSizeAdress = file->getPos();\r
+    file->write(&nodeSizeAdress, 4);\r
 \r
 \r
     core::stringc name = joint->Name;\r
-    write(file, name.c_str(), name.size());\r
-    write(file, "", 1);\r
+    file->write(name.c_str(), name.size());\r
+    file->write("", 1);\r
 \r
-    core::vector3df pos = joint->Animatedposition;\r
     // Position\r
-    write(file, &pos.X, 4);\r
-    write(file, &pos.Y, 4);\r
-    write(file, &pos.Z, 4);\r
+    const core::vector3df pos = joint->Animatedposition;\r
+    writeVector3(file, pos);\r
 \r
     // Scale\r
     core::vector3df scale = joint->Animatedscale;\r
     if (scale == core::vector3df(0, 0, 0))\r
         scale = core::vector3df(1, 1, 1);\r
 \r
-    write(file, &scale.X, 4);\r
-    write(file, &scale.Y, 4);\r
-    write(file, &scale.Z, 4);\r
+    writeVector3(file, scale);\r
 \r
     // Rotation\r
-    core::quaternion quat = joint->Animatedrotation;\r
-    write(file, &quat.W, 4);\r
-    write(file, &quat.X, 4);\r
-    write(file, &quat.Y, 4);\r
-    write(file, &quat.Z, 4);\r
+    const core::quaternion quat = joint->Animatedrotation;\r
+    writeQuaternion(file, quat);\r
 \r
     // Bone\r
-    write(file, "BONE", 4);\r
+    file->write("BONE", 4);\r
     u32 bonesize = 8 * joint->Weights.size();\r
-    write(file, &bonesize, 4);\r
+    file->write(&bonesize, 4);\r
 \r
     // Skinning ------------------\r
     for (u32 i = 0; i < joint->Weights.size(); i++)\r
@@ -463,85 +366,83 @@ void CB3DMeshWriter::writeJointChunk(io::IWriteFile* file, ISkinnedMesh* mesh ,
             b3dVertexID += mesh->getMeshBuffer(j)->getVertexCount();\r
         }\r
 \r
-        write(file, &b3dVertexID, 4);\r
-        write(file, &weight, 4);\r
+        file->write(&b3dVertexID, 4);\r
+        file->write(&weight, 4);\r
     }\r
     // ---------------------------\r
 \r
+    f32 floatBuffer[5];\r
     // Animation keys\r
     if (joint->PositionKeys.size())\r
     {\r
-        write(file, "KEYS", 4);\r
+        file->write("KEYS", 4);\r
         u32 keysSize = 4 * joint->PositionKeys.size() * 4; // X, Y and Z pos + frame\r
         keysSize += 4;  // Flag to define the type of the key\r
-        write(file, &keysSize, 4);\r
+        file->write(&keysSize, 4);\r
 \r
         u32 flag = 1; // 1 = flag for position keys\r
-        write(file, &flag, 4);\r
+        file->write(&flag, 4);\r
 \r
         for (u32 i = 0; i < joint->PositionKeys.size(); i++)\r
         {\r
-            const s32 frame = static_cast<s32>(joint->PositionKeys[i].frame);\r
-            const core::vector3df pos = joint->PositionKeys[i].position;\r
-\r
-            write (file, &frame, 4);\r
-\r
-            write (file, &pos.X, 4);\r
-            write (file, &pos.Y, 4);\r
-            write (file, &pos.Z, 4);\r
+            const s32 frame = static_cast<s32>(joint->PositionKeys[i].frame * animationSpeedMultiplier);\r
+            file->write(&frame, 4);\r
 \r
+            const core::vector3df pos = joint->PositionKeys[i].position;\r
+            pos.getAs3Values(floatBuffer);\r
+            file->write(floatBuffer, 12);\r
         }\r
     }\r
     if (joint->RotationKeys.size())\r
     {\r
-        write(file, "KEYS", 4);\r
+        file->write("KEYS", 4);\r
         u32 keysSize = 4 * joint->RotationKeys.size() * 5; // W, X, Y and Z rot + frame\r
         keysSize += 4; // Flag\r
-        write(file, &keysSize, 4);\r
+        file->write(&keysSize, 4);\r
 \r
         u32 flag = 4;\r
-        write(file, &flag, 4);\r
+        file->write(&flag, 4);\r
 \r
         for (u32 i = 0; i < joint->RotationKeys.size(); i++)\r
         {\r
-            const s32 frame = static_cast<s32>(joint->RotationKeys[i].frame);\r
+            const s32 frame = static_cast<s32>(joint->RotationKeys[i].frame * animationSpeedMultiplier);\r
             const core::quaternion rot = joint->RotationKeys[i].rotation;\r
 \r
-            write (file, &frame, 4);\r
-\r
-            write (file, &rot.W, 4);\r
-            write (file, &rot.X, 4);\r
-            write (file, &rot.Y, 4);\r
-            write (file, &rot.Z, 4);\r
+            memcpy(floatBuffer, &frame, 4);\r
+            floatBuffer[1] = rot.W;\r
+            floatBuffer[2] = rot.X;\r
+            floatBuffer[3] = rot.Y;\r
+            floatBuffer[4] = rot.Z;\r
+            file->write(floatBuffer, 20);\r
         }\r
     }\r
     if (joint->ScaleKeys.size())\r
     {\r
-        write(file, "KEYS", 4);\r
+        file->write("KEYS", 4);\r
         u32 keysSize = 4 * joint->ScaleKeys.size() * 4; // X, Y and Z scale + frame\r
         keysSize += 4; // Flag\r
-        write(file, &keysSize, 4);\r
+        file->write(&keysSize, 4);\r
 \r
         u32 flag = 2;\r
-        write(file, &flag, 4);\r
+        file->write(&flag, 4);\r
 \r
         for (u32 i = 0; i < joint->ScaleKeys.size(); i++)\r
         {\r
-            const s32 frame = static_cast<s32>(joint->ScaleKeys[i].frame);\r
-            const core::vector3df scale = joint->ScaleKeys[i].scale;\r
-\r
-            write (file, &frame, 4);\r
+            const s32 frame = static_cast<s32>(joint->ScaleKeys[i].frame * animationSpeedMultiplier);\r
+            file->write(&frame, 4);\r
 \r
-            write (file, &scale.X, 4);\r
-            write (file, &scale.Y, 4);\r
-            write (file, &scale.Z, 4);\r
+            const core::vector3df scale = joint->ScaleKeys[i].scale;\r
+            scale.getAs3Values(floatBuffer);\r
+            file->write(floatBuffer, 12);\r
         }\r
     }\r
 \r
     for (u32 i = 0; i < joint->Children.size(); i++)\r
     {\r
-        writeJointChunk(file, mesh, joint->Children[i]);\r
+        writeJointChunk(file, mesh, joint->Children[i], animationSpeedMultiplier);\r
     }\r
+\r
+    writeSizeFrom(file, nodeSizeAdress+4, nodeSizeAdress); // NODE chunk size\r
 }\r
 \r
 \r
@@ -554,47 +455,6 @@ ISkinnedMesh* CB3DMeshWriter::getSkinned (IMesh *mesh)
     return 0;\r
 }\r
 \r
-u32 CB3DMeshWriter::getJointChunkSize(const ISkinnedMesh* mesh, ISkinnedMesh::SJoint* joint)\r
-{\r
-    u32 chunkSize = 8 + 40; // Chunk declaration + chunk data\r
-    chunkSize += joint->Name.size() + 1; // the NULL character at the end of the string\r
-\r
-    u32 boneSize = joint->Weights.size() * 8; // vertex_id + weight = 8 bits per weight block\r
-    boneSize += 8; // declaration + size of he BONE chunk\r
-\r
-    u32 keysSize = 0;\r
-    if (joint->PositionKeys.size() != 0)\r
-    {\r
-        keysSize += 8; // KEYS + chunk size\r
-        keysSize += 4; // flags\r
-\r
-        keysSize += (joint->PositionKeys.size() * 16);\r
-    }\r
-    if (joint->RotationKeys.size() != 0)\r
-    {\r
-        keysSize += 8; // KEYS + chunk size\r
-        keysSize += 4; // flags\r
-\r
-        keysSize += (joint->RotationKeys.size() * 20);\r
-    }\r
-    if (joint->ScaleKeys.size() != 0)\r
-    {\r
-        keysSize += 8; // KEYS + chunk size\r
-        keysSize += 4; // flags\r
-\r
-        keysSize += (joint->ScaleKeys.size() * 16);\r
-    }\r
-\r
-    chunkSize += boneSize;\r
-    chunkSize += keysSize;\r
-\r
-    for (u32 i = 0; i < joint->Children.size(); ++i)\r
-    {\r
-        chunkSize += (getJointChunkSize(mesh, joint->Children[i]));\r
-    }\r
-    return chunkSize;\r
-}\r
-\r
 core::array<ISkinnedMesh::SJoint*> CB3DMeshWriter::getRootJoints(const ISkinnedMesh* mesh)\r
 {\r
     core::array<ISkinnedMesh::SJoint*> roots;\r
@@ -635,10 +495,39 @@ u32 CB3DMeshWriter::getUVlayerCount(IMesh* mesh)
     return 1;\r
 }\r
 \r
-void CB3DMeshWriter::write(io::IWriteFile* file, const void *ptr, const u32 bytes)\r
+void CB3DMeshWriter::writeVector2(io::IWriteFile* file, const core::vector2df& vec2)\r
+{\r
+    f32 buffer[2] = {vec2.X, vec2.Y};\r
+    file->write(buffer, 8);\r
+}\r
+\r
+void CB3DMeshWriter::writeVector3(io::IWriteFile* file, const core::vector3df& vec3)\r
+{\r
+    f32 buffer[3];\r
+    vec3.getAs3Values(buffer);\r
+    file->write(buffer, 12);\r
+}\r
+\r
+void CB3DMeshWriter::writeQuaternion(io::IWriteFile* file, const core::quaternion& quat)\r
+{\r
+    f32 buffer[4] = {quat.W, quat.X, quat.Y, quat.Z};\r
+    file->write(buffer, 16);\r
+}\r
+\r
+void CB3DMeshWriter::writeColor(io::IWriteFile* file, const video::SColorf& color)\r
+{\r
+    f32 buffer[4] = {color.r, color.g, color.b, color.a};\r
+    file->write(buffer, 16);\r
+}\r
+\r
+// Write the size from a given position to current position at a specific position in the file\r
+void CB3DMeshWriter::writeSizeFrom(io::IWriteFile* file, const u32 from, const u32 adressToWrite)\r
 {\r
-       file->write(ptr, bytes);\r
-       Size += bytes;\r
+    const long back = file->getPos();\r
+    file->seek(adressToWrite);\r
+    const u32 sizeToWrite = back - from;\r
+    file->write(&sizeToWrite, 4);\r
+    file->seek(back);\r
 }\r
 \r
 } // end namespace\r
index 454b7a6e43f4755aa70e1efee081537f82f0996c..21dfeebaa7bdd8c37c87426e96316771382d0092 100644 (file)
@@ -33,17 +33,18 @@ public:
     virtual bool writeMesh(io::IWriteFile* file, scene::IMesh* mesh, s32 flags=EMWF_NONE) _IRR_OVERRIDE_;\r
 \r
 private:\r
-       u32 Size;\r
-\r
-    void writeJointChunk(io::IWriteFile* file, ISkinnedMesh* mesh , ISkinnedMesh::SJoint* joint);\r
+    void writeJointChunk(io::IWriteFile* file, ISkinnedMesh* mesh , ISkinnedMesh::SJoint* joint, f32 animationSpeedMultiplier);\r
     u32 getJointChunkSize(const ISkinnedMesh* mesh, ISkinnedMesh::SJoint* joint);\r
     core::array<ISkinnedMesh::SJoint*> getRootJoints(const ISkinnedMesh* mesh);\r
 \r
     u32 getUVlayerCount(IMesh *mesh);\r
     ISkinnedMesh* getSkinned (IMesh *mesh);\r
 \r
-       void write(io::IWriteFile* file, const void *ptr, const u32 bytes);\r
-\r
+    inline void writeVector2(io::IWriteFile* file, const core::vector2df& vec);\r
+    inline void writeVector3(io::IWriteFile* file, const core::vector3df& vec);\r
+    inline void writeQuaternion(io::IWriteFile* file, const core::quaternion& quat);\r
+    inline void writeColor(io::IWriteFile* file, const video::SColorf& color);\r
+    void writeSizeFrom(io::IWriteFile* file, const u32 from, const u32 adressToWrite);\r
 };\r
 \r
 } // end namespace\r
index b32da28298057a85ec80bb177429f451bbc11b42..9e64a13e3a0354c51c83fd49dfcbc85e8b3e8b77 100644 (file)
@@ -148,11 +148,9 @@ namespace irr
                                while ( gotCursorInfo )\r
                                {\r
 #ifdef CURSOR_SUPPRESSED\r
-                                       // new flag for Windows 8, where cursor\r
-                                       // might be suppressed for touch interface\r
-                                       if (info.flags == CURSOR_SUPPRESSED)\r
+                                       // Since Windows 8 the cursor can be suppressed by a touch interface\r
+                                       if (visible && info.flags == CURSOR_SUPPRESSED)\r
                                        {\r
-                                               visible=false;\r
                                                break;\r
                                        }\r
 #endif\r
@@ -173,6 +171,16 @@ namespace irr
                                        // yes, it really must be set each time\r
                                        info.cbSize = sizeof(CURSORINFO);\r
                                        gotCursorInfo = GetCursorInfo(&info);\r
+\r
+#ifdef CURSOR_SUPPRESSED\r
+                                       // Not sure if a cursor which we tried to hide still can be suppressed.\r
+                                       // I have no touch-display for testing this and MSDN doesn't describe it.\r
+                                       // But adding this check shouldn't hurt and might prevent an endless loop.\r
+                                       if (!visible && info.flags == CURSOR_SUPPRESSED)\r
+                                       {\r
+                                               break;\r
+                                       }\r
+#endif\r
                                }\r
                                IsVisible = visible;\r
                        }\r
index f15409564666774695f4fff05047622c60c1c7a4..94cbaceba98db829431fb964d87185fc0816f5b8 100644 (file)
@@ -572,7 +572,7 @@ c8* CPLYMeshFileLoader::getNextLine()
        StartPointer = LineEndPointer + 1;\r
 \r
        // crlf split across buffer move\r
-       if (*StartPointer == '\n')\r
+       if (StartPointer<EndPointer && *StartPointer == '\n')\r
        {\r
                *StartPointer = '\0';\r
                ++StartPointer;\r
@@ -583,7 +583,7 @@ c8* CPLYMeshFileLoader::getNextLine()
        while (pos < EndPointer && *pos && *pos != '\r' && *pos != '\n')\r
                ++pos;\r
 \r
-       if ( pos < EndPointer && ( *(pos+1) == '\r' || *(pos+1) == '\n') )\r
+       if ( (pos+1) < EndPointer && ( *(pos+1) == '\r' || *(pos+1) == '\n') )\r
        {\r
                *pos = '\0';\r
                ++pos;\r
index 0d1f7c9d39d9bfb0dfd41120ec5125e0ae3879a6..e49e0a930ace34d19eab2ffb0c3d59105bf37348 100644 (file)
@@ -357,6 +357,7 @@ CSceneManager::CSceneManager(video::IVideoDriver* driver, io::IFileSystem* fs,
                        getProfiler().add(EPID_SM_RENDER_SHADOWS, L"shadows", L"Irrlicht scene");\r
                        getProfiler().add(EPID_SM_RENDER_TRANSPARENT, L"transp.nodes", L"Irrlicht scene");\r
                        getProfiler().add(EPID_SM_RENDER_EFFECT, L"effectnodes", L"Irrlicht scene");\r
+                       getProfiler().add(EPID_SM_RENDER_GUI_NODES, L"guinodes", L"Irrlicht scene");\r
                        getProfiler().add(EPID_SM_REGISTER, L"reg.render.node", L"Irrlicht scene");\r
                }\r
        )\r
@@ -1403,6 +1404,13 @@ u32 CSceneManager::registerNodeForRendering(ISceneNode* node, E_SCENE_NODE_RENDE
                }\r
                break;\r
 \r
+       case ESNRP_GUI:\r
+               if (!isCulled(node))\r
+               {\r
+                       GuiNodeList.push_back(node);\r
+                       taken = 1;\r
+               }\r
+\r
        case ESNRP_NONE: // ignore this one\r
                break;\r
        }\r
@@ -1430,6 +1438,7 @@ void CSceneManager::clearAllRegisteredNodesForRendering()
        TransparentNodeList.clear();\r
        TransparentEffectNodeList.clear();\r
        ShadowNodeList.clear();\r
+       GuiNodeList.clear();\r
 }\r
 \r
 //! This method is called just before the rendering process of the whole scene.\r
@@ -1711,6 +1720,36 @@ void CSceneManager::drawAll()
                TransparentEffectNodeList.set_used(0);\r
        }\r
 \r
+       // render custom gui nodes\r
+       {\r
+               IRR_PROFILE(CProfileScope psEffect(EPID_SM_RENDER_GUI_NODES);)\r
+               CurrentRenderPass = ESNRP_GUI;\r
+               Driver->getOverrideMaterial().Enabled = ((Driver->getOverrideMaterial().EnablePasses & CurrentRenderPass) != 0);\r
+\r
+               if (LightManager)\r
+               {\r
+                       LightManager->OnRenderPassPreRender(CurrentRenderPass);\r
+\r
+                       for (i=0; i<GuiNodeList.size(); ++i)\r
+                       {\r
+                               ISceneNode* node = GuiNodeList[i];\r
+                               LightManager->OnNodePreRender(node);\r
+                               node->render();\r
+                               LightManager->OnNodePostRender(node);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       for (i=0; i<GuiNodeList.size(); ++i)\r
+                               GuiNodeList[i]->render();\r
+               }\r
+#ifdef _IRR_SCENEMANAGER_DEBUG\r
+               Parameters->setAttribute("drawn_gui_nodes", (s32) GuiNodeList.size());\r
+#endif\r
+               GuiNodeList.set_used(0);\r
+       }\r
+       \r
+\r
        if (LightManager)\r
                LightManager->OnPostRender();\r
 \r
index a83ab48b15f0208265926d19c68141c5ec3f20d6..7340c95416c9db1625a7c018d26009320997f85f 100644 (file)
@@ -632,6 +632,7 @@ namespace scene
                core::array<DefaultNodeEntry> SolidNodeList;\r
                core::array<TransparentNodeEntry> TransparentNodeList;\r
                core::array<TransparentNodeEntry> TransparentEffectNodeList;\r
+               core::array<ISceneNode*> GuiNodeList;\r
 \r
                core::array<IMeshLoader*> MeshLoaderList;\r
                core::array<ISceneLoader*> SceneLoaderList;\r
index d5cc7e320913601b7b33d3f2bcfd6eb95e9130ab..11d430bf910428f39d3a1662b1b54c40dc574a29 100644 (file)
@@ -234,7 +234,7 @@ REALINLINE void CTRTextureLightMap2_Add::scanline_bilinear ()
 #else\r
 \r
                        getSample_texture ( r0, g0, b0, &IT[0], tofix ( line.t[0][0].x,inversew), tofix ( line.t[0][0].y,inversew) );\r
-                       getSample_texture ( r1, g1, b1, &IT[1], tofix ( line.t[0][1].x,inversew), tofix ( line.t[0][1].y,inversew) );\r
+                       getSample_texture ( r1, g1, b1, &IT[1], tofix ( line.t[1][0].x,inversew), tofix ( line.t[1][0].y,inversew) );\r
 \r
                        dst[i] = fix_to_sample( clampfix_maxcolor ( r0 + r1 ),\r
                                                                        clampfix_maxcolor ( g0 + g1 ),\r
@@ -641,6 +641,7 @@ namespace video
 //! creates a flat triangle renderer\r
 IBurningShader* createTriangleRendererTextureLightMap2_Add(CBurningVideoDriver* driver)\r
 {\r
+       /* ETR_TEXTURE_GOURAUD_LIGHTMAP_ADD */\r
        #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_\r
        return new CTRTextureLightMap2_Add(driver);\r
        #else\r
index 0342b34989ee0894cb55b8243f3207480dd669b9..531c62d689f72ab35bfa046bbd85ee3d141ac0b3 100644 (file)
@@ -127,22 +127,22 @@ static void updateTriangles(u32& triangleCount, core::array<core::triangle3df>&
 {\r
        if ( bufferTransform )\r
        {\r
-               for (u32 index = 0; index < idxCnt; index += 3)\r
+               for (u32 index = 2; index < idxCnt; index += 3)\r
                {\r
                        core::triangle3df& tri = triangles[triangleCount++];\r
-                       bufferTransform->transformVect( tri.pointA, (*reinterpret_cast<const video::S3DVertex*>(&vertices[indices[index + 0]*vertexPitch])).Pos );\r
-                       bufferTransform->transformVect( tri.pointB, (*reinterpret_cast<const video::S3DVertex*>(&vertices[indices[index + 1]*vertexPitch])).Pos );\r
-                       bufferTransform->transformVect( tri.pointC, (*reinterpret_cast<const video::S3DVertex*>(&vertices[indices[index + 2]*vertexPitch])).Pos );\r
+                       bufferTransform->transformVect( tri.pointA, (*reinterpret_cast<const video::S3DVertex*>(&vertices[indices[index - 2]*vertexPitch])).Pos );\r
+                       bufferTransform->transformVect( tri.pointB, (*reinterpret_cast<const video::S3DVertex*>(&vertices[indices[index - 1]*vertexPitch])).Pos );\r
+                       bufferTransform->transformVect( tri.pointC, (*reinterpret_cast<const video::S3DVertex*>(&vertices[indices[index - 0]*vertexPitch])).Pos );\r
                }\r
        }\r
        else\r
        {\r
-               for (u32 index = 0; index < idxCnt; index += 3)\r
+               for (u32 index = 2; index < idxCnt; index += 3)\r
                {\r
                        core::triangle3df& tri = triangles[triangleCount++];\r
-                       tri.pointA = (*reinterpret_cast<const video::S3DVertex*>(&vertices[indices[index + 0]*vertexPitch])).Pos;\r
-                       tri.pointB = (*reinterpret_cast<const video::S3DVertex*>(&vertices[indices[index + 1]*vertexPitch])).Pos;\r
-                       tri.pointC = (*reinterpret_cast<const video::S3DVertex*>(&vertices[indices[index + 2]*vertexPitch])).Pos;\r
+                       tri.pointA = (*reinterpret_cast<const video::S3DVertex*>(&vertices[indices[index - 2]*vertexPitch])).Pos;\r
+                       tri.pointB = (*reinterpret_cast<const video::S3DVertex*>(&vertices[indices[index - 1]*vertexPitch])).Pos;\r
+                       tri.pointC = (*reinterpret_cast<const video::S3DVertex*>(&vertices[indices[index - 0]*vertexPitch])).Pos;\r
                }\r
        }\r
 }\r
index 59a91b8590c3b8a1e51dd37334507501ba26e7ac..a8979262d14f5ea2d6accaaca40cfcc0e0720787 100644 (file)
@@ -495,10 +495,12 @@ inline tFixPoint s32_to_fixPoint (const s32 x)
        return x << FIX_POINT_PRE;\r
 }\r
 \r
+#if 0\r
 inline tFixPointu u32_to_fixPoint (const u32 x)\r
 {\r
        return x << FIX_POINT_PRE;\r
 }\r
+#endif\r
 \r
 inline u32 fixPointu_to_u32 (const tFixPointu x)\r
 {\r
@@ -641,13 +643,13 @@ REALINLINE tFixPoint saturateFix ( const tFixPoint a)
 }\r
 \r
 \r
+#if 0\r
 // rount fixpoint to int\r
 inline s32 roundFix ( const tFixPoint x )\r
 {\r
        return (s32)(( x + FIX_POINT_ZERO_DOT_FIVE ) >> FIX_POINT_PRE);\r
 }\r
-\r
-\r
+#endif\r
 \r
 // x in [0;1[\r
 #if 0\r
index f28ab70df784dc3fa72d8eb7833e6fbfcb2fb02e..ab5bb7c710e3a0940bd54aabfe3ceff3a1c9e7a3 100644 (file)
@@ -34,7 +34,7 @@ private:
 \r
 \r
 //! constructor\r
-burning_shader_class::burning_shader_color(CBurningVideoDriver* driver)\r
+burning_shader_class::burning_shader_class(CBurningVideoDriver* driver)\r
        : IBurningShader(driver)\r
 {\r
 #ifdef _DEBUG\r