Exemple #1
0
        public override void Read(AssetReader reader)
        {
            base.Read(reader);

            RenderMode = IsModeShort(reader.Version) ? (ParticleSystemRenderMode)reader.ReadUInt16() : (ParticleSystemRenderMode)reader.ReadInt32();
            if (IsSortModeFirst(reader.Version))
            {
                SortMode = (ParticleSystemSortMode)reader.ReadUInt16();
            }

            if (IsReadMinParticleSize(reader.Version))
            {
                MinParticleSize = reader.ReadSingle();
            }
            MaxParticleSize     = reader.ReadSingle();
            CameraVelocityScale = reader.ReadSingle();
            VelocityScale       = reader.ReadSingle();
            LengthScale         = reader.ReadSingle();
            SortingFudge        = reader.ReadSingle();

            if (IsReadNormalDirection(reader.Version))
            {
                NormalDirection = reader.ReadSingle();
            }
            if (IsReadShadowBias(reader.Version))
            {
                ShadowBias = reader.ReadSingle();
            }
            if (!IsSortModeFirst(reader.Version))
            {
                SortMode = (ParticleSystemSortMode)reader.ReadInt32();
            }

            if (IsReadRenderAlignment(reader.Version))
            {
                RenderAlignment = (ParticleSystemRenderSpace)reader.ReadInt32();
                Pivot.Read(reader);
            }
            else
            {
                RenderAlignment = RenderMode == ParticleSystemRenderMode.Mesh ? ParticleSystemRenderSpace.Local : ParticleSystemRenderSpace.View;
            }
            if (IsReadFlip(reader.Version))
            {
                Flip.Read(reader);
            }

            if (IsReadUseCustomVertexStreams(reader.Version))
            {
                UseCustomVertexStreams = reader.ReadBoolean();
                if (IsReadEnableGPUInstancing(reader.Version))
                {
                    EnableGPUInstancing = reader.ReadBoolean();
                }
                if (IsReadApplyActiveColorSpace(reader.Version))
                {
                    ApplyActiveColorSpace = reader.ReadBoolean();
                }
                if (IsReadAllowRoll(reader.Version))
                {
                    AllowRoll = reader.ReadBoolean();
                }
                reader.AlignStream(AlignType.Align4);
            }
            if (IsReadVertexStreamMask(reader.Version))
            {
                int         vertexStreamMask = reader.ReadInt32();
                List <byte> vertexStreams    = new List <byte>(8);
                for (byte i = 0; i < 8; i++)
                {
                    if ((vertexStreamMask & (1 << i)) != 0)
                    {
                        vertexStreams.Add(i);
                    }
                }
                m_vertexStreams = vertexStreams.ToArray();
            }
            if (IsReadVertexStreams(reader.Version))
            {
                m_vertexStreams = reader.ReadByteArray();
                reader.AlignStream(AlignType.Align4);
            }

            Mesh.Read(reader);
            if (IsReadMeshes(reader.Version))
            {
                Mesh1.Read(reader);
                Mesh2.Read(reader);
                Mesh3.Read(reader);
            }
            if (IsReadMaskInteraction(reader.Version))
            {
                MaskInteraction = (SpriteMaskInteraction)reader.ReadInt32();
            }
        }
Exemple #2
0
        public void Membrane_Triangle_InPlaneSpringOnOneSide()
        {
            var k3d = new Toolkit();

            var logger = new MessageLogger();

            double L      = 1.0;
            var    points = new List <Point3> {
                new Point3(0, 0.5 * L, 0), new Point3(0, -0.5 * L, 0), new Point3(L, 0, 0)
            };

            var mesh = new Mesh3();

            foreach (var point in points)
            {
                mesh.AddVertex(point);
            }
            mesh.AddFace(new Face3(0, 1, 2));

            var material = k3d.Material.IsotropicMaterial("", "", 200000, 100000, 100000, 0, 0, 0, 0, 0);
            var crosec   = k3d.CroSec.ShellConst(0.01, 0, material);
            var shells   = k3d.Part.MeshToShell(new List <Mesh3> {
                mesh
            }, null, new List <CroSec> {
                crosec
            }, false, logger, out var out_nodes);

            // create supports
            var supportConditions_1 = new List <bool>()
            {
                true, true, true, true, true, true
            };
            var supports = new List <Support>
            {
                k3d.Support.Support(points[0], supportConditions_1),
                k3d.Support.Support(points[1], supportConditions_1),
            };

            // create a Point-load
            double fx    = 100.0;
            var    loads = new List <Load>
            {
                k3d.Load.PointLoad(points[2], new Vector3(fx, 0, 0), new Vector3()),
            };

            double cx     = 2.0;
            var    joints = new List <Joint>()
            {
                new JointLine(new List <string> {
                    ""
                },
                              new PolyLine3(new List <Point3> {
                    points[1], points[0]
                }),
                              -Vector3.XAxis, Vector3.ZAxis, Math.PI * 0.5, new double?[] { null, cx })
            };

            // create the model
            var model = k3d.Model.AssembleModel(shells, supports, loads,
                                                out var info, out var mass, out var cog, out var message, out var warning, joints);

            // var model = k3d.Model.AssembleModel(shells, supports, loads,
            //     out var info, out var mass, out var cog, out var message, out var warning);

            ThIAnalyze.solve(model, out var outMaxDisp, out var outG, out var outComp, out var warning_msg, out model);

            var h = (model.elems[0].crosec as CroSec_Shell).getHeight();
            var E = model.elems[0].crosec.material.E();
            // var c_inv_tot = 2 * L / (E * h);
            var c_inv_tot  = 2 * L / (E * h) + 1 / cx / L;
            var dispTarget = Math.Abs(fx) / L * c_inv_tot;
            var dispCalc   = outMaxDisp[0];

            Assert.AreEqual(dispCalc, dispTarget, 1);
        }
Exemple #3
0
        public void TSection_2Elems()
        {
            var k3d = new Toolkit();

            var logger = new MessageLogger();

            double Lx     = 1.0;
            double Ly     = 2.0;
            double Lz     = 3.0;
            var    points = new List <Point3> {
                new Point3(0, Ly, 0), new Point3(0, 0, 0),
                new Point3(Lx, 0, 0),
                new Point3(0, 0, Lz)
            };

            var mesh = new Mesh3();

            foreach (var point in points)
            {
                mesh.AddVertex(point);
            }
            mesh.AddFace(new Face3(0, 1, 2));
            mesh.AddFace(new Face3(1, 2, 3));

            var material = k3d.Material.IsotropicMaterial("", "", 200000, 100000, 100000, 0, 0, 0, 0, 0);
            var crosec   = k3d.CroSec.ShellConst(0.1, 0, material);
            var shells   = k3d.Part.MeshToShell(
                new List <Mesh3> {
                mesh
            }, null, new List <CroSec> {
                crosec
            }, true, logger, out var nodes,
                0.005, null, points);

            // create supports
            var supportConditions_1 = new List <bool>()
            {
                true, true, true, true, true, true
            };
            var supports = new List <Support>
            {
                k3d.Support.Support(points[0], supportConditions_1),
                k3d.Support.Support(points[1], supportConditions_1),
                k3d.Support.Support(points[2], supportConditions_1)
            };

            // create a Point-load
            double Fx    = 100.0;
            var    loads = new List <Load>
            {
                k3d.Load.PointLoad(points[3], new Vector3(Fx, 0, 0), new Vector3()),
            };

            double c      = 0.1;
            var    joints = new List <Joint>()
            {
                new JointLine(new List <string> {
                    ""
                },
                              new PolyLine3(new List <Point3> {
                    points[1], points[2]
                }),
                              -Vector3.ZAxis, null, Math.PI * 0.25, new double?[] { c })
            };

            // create the model
            var model = k3d.Model.AssembleModel(shells, supports, loads,
                                                out var info, out var mass, out var cog, out var message, out var warning, joints);

            // var model = k3d.Model.AssembleModel(shells, supports, loads,
            //    out var info, out var mass, out var cog, out var message, out var warning, joints, points);
            // var model = k3d.Model.AssembleModel(shells, supports, loads,
            //    out var info, out var mass, out var cog, out var message, out var warning);

            ThIAnalyze.solve(model, out var outMaxDisp, out var outG, out var outComp, out var warning_msg, out model);

            var dispTarget = Fx / Lx / c;
            var dispCalc   = outMaxDisp[0];

            Assert.AreEqual(dispCalc, dispTarget, 1);
        }
Exemple #4
0
        public void DeformationTestIsotropicShellInPlane()
        {
            var nFaces     = 1;
            var length     = 1.0;
            var xIncMesh   = length / nFaces;
            var limit_dist = xIncMesh / 100.0;

            var y0 = 0.0;
            var y1 = 1.0;

            // create the mesh
            var mesh = new Mesh3((nFaces + 1) * 2, nFaces);

            mesh.AddVertex(new Point3(0, y0, 0));
            mesh.AddVertex(new Point3(0, y1, 0));
            for (var faceInd = 0; faceInd < nFaces; ++faceInd)
            {
                mesh.AddVertex(new Point3((faceInd + 1) * xIncMesh, y0, 0));
                mesh.AddVertex(new Point3((faceInd + 1) * xIncMesh, y1, 0));
                var nV = mesh.Vertices.Count;
                mesh.AddFace(nV - 4, nV - 3, nV - 1, nV - 2);
            }

            // create a shell
            MeshToShell.solve(new List <Point3>(), new List <Mesh3>()
            {
                mesh
            }, limit_dist, new List <string>(), new List <Color>(), new List <CroSec>(), true,
                              out List <Point3> outPoints, out List <BuilderShell> outBuilderShells, out MessageLogger outLogger);

            // create two supports
            var support1 = new Support(new Point3(0, y0, 0), new List <bool>()
            {
                true, true, true, true, true, true
            }, Plane3.Default);
            var support2 = new Support(new Point3(0, y1, 0), new List <bool>()
            {
                true, false, true, true, true, true
            }, Plane3.Default);

            // create two point loads
            var pl1 = new PointLoad(mesh.Vertices.Count - 2, new Vector3(25, 0, 0), new Vector3(), false);
            var pl2 = new PointLoad(mesh.Vertices.Count - 1, new Vector3(25, 0, 0), new Vector3(), false);

            // assemble the model
            var modelBuilder = new ModelBuilder(limit_dist);
            var model        = modelBuilder.build(new List <Point3>(), new List <FemMaterial>(), new List <CroSec>(),
                                                  new List <Support>()
            {
                support1, support2
            }, new List <Load>()
            {
                pl1, pl2
            }, outBuilderShells, new List <ElemSet>(),
                                                  new List <Joint>(), new MessageLogger()
                                                  );

            ThIAnalyze.solve(model, out var outMaxDisp, out var outG, out var outComp, out var warning, out model);

            Assert.AreEqual(outMaxDisp[0], 2.4858889456113236E-05, 1E-5);
        }
Exemple #5
0
        /// <summary>
        /// Performs the specified operation on the provided meshes.
        /// </summary>
        /// <param name="first">The first mesh</param>
        /// <param name="second">The second mesh</param>
        /// <param name="operation">The mesh opration to perform on the two meshes</param>
        /// <returns>A triangular mesh resulting from performing the specified operation. If the resulting mesh is empty, will return null.</returns>
        public static Mesh3 PerformCSG(Mesh3 first, Mesh3 second, CSGOperations operation)
        {
            Mesh3 finalResult = null;

            unsafe
            {
                InteropMesh a            = new InteropMesh();
                InteropMesh b            = new InteropMesh();
                Vector3[]   aTransformed = first.GetTransformedVertices();
                Vector3[]   bTransformed = second.GetTransformedVertices();

                InteropMesh *result;

                fixed(Vector3 *aVerts = &aTransformed[0], bVerts = &bTransformed[0])
                {
                    fixed(int *aTris = &first.TriangleIndices[0], bTris = &second.TriangleIndices[0])
                    {
                        a.vertsArrayLength = first.Vertices.Length * 3;
                        a.triArrayLength   = first.TriangleIndices.Length;
                        a.vertices         = (double *)aVerts;
                        a.triangleIndices  = aTris;

                        b.vertsArrayLength = second.Vertices.Length * 3;
                        b.triArrayLength   = second.TriangleIndices.Length;
                        b.vertices         = (double *)bVerts;
                        b.triangleIndices  = bTris;

                        try
                        {
                            result = performCSG(ref a, ref b, operation);
                        }
                        catch (SEHException ex)
                        {
                            ArgumentException e = new ArgumentException("Carve has thrown an error. Possible reason is corrupt or self-intersecting meshes", ex);
                            throw e;
                        }
                    }
                }

                if (result->vertsArrayLength == 0)
                {
                    freeMesh(result);
                    return(null);
                }

                Vector3[] vertices        = new Vector3[result->vertsArrayLength / 3];
                int[]     triangleIndices = new int[result->triArrayLength];

                // Copy the results back in parallel
                Parallel.For(0, vertices.Length, i =>
                {
                    vertices[i] = new Vector3(result->vertices[3 * i], result->vertices[3 * i + 1], result->vertices[3 * i + 2]);
                });

                Parallel.For(0, triangleIndices.Length, i =>
                {
                    triangleIndices[i] = result->triangleIndices[i];
                });

                // If none of the vertices had colors, return whatever we have
                if (!first.HasColours && !second.HasColours)
                {
                    finalResult = new Mesh3(vertices, triangleIndices);
                    freeMesh(result);
                }
                else // Assign colors to the resulting mesh
                {
                    uint[] colors   = new uint[vertices.Length];
                    uint   grayCode = 4286611584; // The uint value of the color gray (representing no color)

                    // Assign the default gray to all vertices
                    Parallel.For(0, colors.Length, i =>
                    {
                        colors[i] = grayCode;
                    });

                    #region Worst practices of parallel coding

                    /**
                     * The procedure for color matching is creating a map of (vertex=>color) and then
                     * comparing all vertices of the resulting mesh (in parallel) with this map and
                     * assigning colors as necessary
                     */
                    if (first.HasColours)
                    {
                        ConcurrentDictionary <Vector3, uint> firstMap = new ConcurrentDictionary <Vector3, uint>();

                        // Create vertex to color map
                        Parallel.For(0, aTransformed.Length, i =>
                        {
                            firstMap[aTransformed[i]] = first.VertexColours[i];
                        });

                        // Assign colors
                        Parallel.For(0, vertices.Length, i =>
                        {
                            if (firstMap.ContainsKey(vertices[i]))
                            {
                                colors[i] = firstMap[vertices[i]];
                            }
                        });
                    }

                    if (second.HasColours)
                    {
                        ConcurrentDictionary <Vector3, uint> secondMap = new ConcurrentDictionary <Vector3, uint>();

                        Parallel.For(0, bTransformed.Length, i =>
                        {
                            secondMap[bTransformed[i]] = second.VertexColours[i];
                        });

                        Parallel.For(0, vertices.Length, i =>
                        {
                            if (secondMap.ContainsKey(vertices[i]))
                            {
                                colors[i] = secondMap[vertices[i]];
                            }
                        });
                    }
                    #endregion

                    finalResult = new Mesh3(vertices, triangleIndices, colors);
                }
            } // end-unsafe

            Matrix3 transform = first.Transform.Invert();
            finalResult = new Mesh3(finalResult.Vertices.Select(x => transform.Transform(x - first.Position)).ToArray(),
                                    finalResult.TriangleIndices, finalResult.VertexColours);
            finalResult.Position  = first.Position;
            finalResult.Transform = first.Transform;
            return(finalResult);
        }
Exemple #6
0
        static void Main(string[] args)
        {
            Window window = new Window(1024, 768, "3D Orthographic Test");

            window.SetDefaultOrthographicSize(200);
            window.SetZNearZFar(-300, 300);

            window.EnableDepthTest();

            window.SetClearColor(0f, 1f, 1f, 1f);

            Texture backgroundTexture = new Texture("Assets/airadventurelevel1.png");

            Sprite background = new Sprite(window.OrthoWidth, window.OrthoHeight);


            Mesh3 mesh3 = new Mesh3();

            Mesh3 suzanne = ObjLoader.Load("Assets/suzanne.obj", new Vector3(50, -50, 50))[0];

            suzanne.Position3 = new Vector3(75, 100, 100);

            suzanne.vc = new float[suzanne.v.Length / 3 * 4];
            int vcPos = 0;

            for (int i = 0; i < suzanne.v.Length; i += 3)
            {
                suzanne.vc[vcPos++] = suzanne.v[i] / 50f;
                suzanne.vc[vcPos++] = suzanne.v[i + 1] / -50f;
                suzanne.vc[vcPos++] = suzanne.v[i + 2] / 50f;
                suzanne.vc[vcPos++] = 0.5f;
            }
            suzanne.UpdateVertexColor();

            Mesh3 stormTrooper = ObjLoader.Load("Assets/Stormtrooper.obj", new Vector3(50, -50, 50))[0];

            stormTrooper.Position3 = new Vector3(200, 200, 100);

            Texture texture = new Texture("Assets/Stormtrooper.png");

            texture.SetRepeatX();
            texture.SetRepeatY();

            mesh3.v = new float[]
            {
                // front face
                0, 0, 0,
                100, 0, 0,
                0, 100, 0,

                100, 0, 0,
                100, 100, 0,
                0, 100, 0,

                // back face
                0, 0, -100,
                100, 0, -100,
                0, 100, -100,

                100, 0, -100,
                100, 100, -100,
                0, 100, -100,

                // bottom face
                0, 100, 0,
                0, 100, -100,
                100, 100, 0,

                0, 100, -100,
                100, 100, -100,
                100, 100, 0,

                // right face
                100, 0, 0,
                100, 0, -100,
                100, 100, 0,

                100, 0, -100,
                100, 100, -100,
                100, 100, 0,

                // left face
                0, 0, 0,
                0, 0, -100,
                0, 100, 0,

                0, 0, -100,
                0, 100, -100,
                0, 100, 0,


                // top face
                0, 0, 0,
                0, 0, -100,
                100, 0, 0,

                0, 0, -100,
                100, 0, -100,
                100, 0, 0,
            };
            mesh3.UpdateVertex();

            mesh3.Pivot3 = new Vector3(50, 50, -50);

            mesh3.Position3 = new Vector3(130, 130, 100);

            mesh3.Scale3 = new Vector3(0.5f, 0.5f, 0.5f);


            while (window.opened)
            {
                if (window.GetKey(KeyCode.Esc))
                {
                    break;
                }

                if (window.GetKey(KeyCode.Up))
                {
                    mesh3.EulerRotation3        += new Vector3(-20 * window.deltaTime, 0, 0);
                    suzanne.EulerRotation3      += new Vector3(0, -30 * window.deltaTime, 0);
                    stormTrooper.EulerRotation3 += new Vector3(0, 30 * window.deltaTime, 0);
                }

                mesh3.Position3       = new Vector3(130, 130, 100);
                mesh3.Scale3          = new Vector3(0.5f, 0.5f, 0.5f);
                mesh3.EulerRotation3 += new Vector3(0, -10 * window.deltaTime, 0);

                background.DrawTexture(backgroundTexture);

                stormTrooper.DrawTexture(texture);

                mesh3.DrawWireframe(1f, 0f, 0f, 1f);

                window.CullBackFaces();
                suzanne.Draw();
                window.DisableCullFaces();

                window.Update();
            }
        }
Exemple #7
0
        static void Main(string[] args)
        {
            Window window = new Window(1024, 768, "Aiv.Fast3D Perspective Test", false, 24, 0);

            window.SetDefaultOrthographicSize(10);
            //Window window = new Window("Aiv.Fast3D Perspective Test", 24, 4);



            window.EnableDepthTest();
            //window.CullBackFaces();

            window.SetCursor(false);

            PerspectiveCamera camera = new PerspectiveCamera(new Vector3(0, 6, 30), new Vector3(-10, 180, 0), 60, 0.01f, 1000);

            Texture crate = new Texture("Assets/crate.jpg");

            Texture floorTexture = new Texture("Assets/floor.jpg");

            floorTexture.SetRepeatX();
            floorTexture.SetRepeatY();

            Texture stormTrooperTexture = new Texture("Assets/Stormtrooper.png");

            stormTrooperTexture.SetRepeatX();
            stormTrooperTexture.SetRepeatY();

            Cube cube = new Cube();

            Cube floor = new Cube();

            floor.Scale3    = new Vector3(150, 50f, 150);
            floor.Position3 = new Vector3(0, -25, 0);

            // tiling texture
            for (int i = 0; i < floor.uv.Length; i++)
            {
                floor.uv[i] *= 10;
            }
            floor.UpdateUV();

            Mesh3 stormTrooper = ObjLoader.Load("Assets/Stormtrooper.obj", Vector3.One)[0];

            //stormTrooper.RegenerateNormals();

            Pyramid pyramid = new Pyramid();

            Texture logoAiv = new Texture("Assets/LogoAIV.png");
            Sprite  logo    = new Sprite(1 * logoAiv.Ratio, 1);

            Camera hudCamera = new Camera();

            logo.Camera = hudCamera;

            float lightRotation = -30;


            DepthTexture shadowTexture = new DepthTexture(4096, 4096, 24);

            Sprite shadow = new Sprite(5, 5);

            shadow.Camera = hudCamera;

            float shadow_left   = -30;
            float shadow_right  = 30;
            float shadow_bottom = -30;
            float shadow_top    = 30;
            float shadow_near   = -30;
            float shadow_far    = 30;

            DirectionalLight directionalLight = new DirectionalLight(Utils.EulerRotationToDirection(new Vector3(lightRotation, 180, 0)));

            directionalLight.SetShadowProjection(shadow_left, shadow_right, shadow_bottom, shadow_top, shadow_near, shadow_far);

            //directionalLight.Color = new Vector3(0.5f, 1, 0.5f);

            float crateRotation = 0;

            Mesh3[] botMesh = FbxLoader.Load("Assets/running.fbx", new Vector3(0.02f, 0.02f, 0.02f));

            SkeletalAnimation[] animations = FbxLoader.LoadAnimations("Assets/running.fbx", new Vector3(0.02f, 0.02f, 0.02f));


            int numFrames = 0;

            Mesh3 movingTrooper = ObjLoader.Load("Assets/Stormtrooper.obj", Vector3.One)[0];

            movingTrooper.Position3 = new Vector3(0, 0, 2);

            foreach (SkeletalAnimation animation in animations)
            {
                Console.WriteLine(animation.Name);
                foreach (string subject in animation.KeyFrames.Keys)
                {
                    Console.WriteLine(subject);
                    int currentFrames = 0;
                    foreach (SkeletalAnimation.KeyFrame frame in animation.KeyFrames[subject])
                    {
                        Console.WriteLine(frame.Time + " " + frame.Position + " " + frame.Rotation + " " + frame.Scale);
                        currentFrames++;
                    }
                    if (currentFrames > numFrames)
                    {
                        numFrames = currentFrames;
                    }
                }
            }

            float neckRotation = 0;

            int   animationIndex = 0;
            float animationTimer = 1f / animations[0].Fps;

            movingTrooper.SetParent(cube);

            Mesh3[] tank         = ObjLoader.Load("Assets/T34.obj", Vector3.One);
            Texture tankDiffuse  = new Texture("Assets/T-34.png");
            Texture tankSpecular = new Texture("Assets/T-34_S.png");



            //window.AddPostProcessingEffect(new DepthViewer());

            window.AddPostProcessingEffect(new Fog());

            //window.AddPostProcessingEffect(new Sobel());

            Vector3 pyramidRotation = Vector3.Zero;

            PostProcessingEffect fxaa = window.AddPostProcessingEffect(new FXAA());

            Plane plane = new Plane();

            Vector3 shadowOffset = new Vector3(0, 0, 0.22f);

            Sphere  sphere = new Sphere();
            Texture world  = new Texture("Assets/world.jpg");

            while (window.IsOpened)
            {
                if (window.GetKey(KeyCode.Esc))
                {
                    break;
                }

                if (window.GetKey(KeyCode.W))
                {
                    camera.Position3 += camera.Forward * 10 * window.deltaTime;
                }

                if (window.GetKey(KeyCode.S))
                {
                    camera.Position3 += -camera.Forward * 10 * window.deltaTime;
                }

                if (window.GetKey(KeyCode.D))
                {
                    camera.Position3 += camera.Right * 10 * window.deltaTime;
                }

                if (window.GetKey(KeyCode.A))
                {
                    camera.Position3 += -camera.Right * 10 * window.deltaTime;
                }

                if (window.GetKey(KeyCode.Up))
                {
                    camera.Position3 += camera.Up * 10 * window.deltaTime;
                }

                if (window.GetKey(KeyCode.Down))
                {
                    camera.Position3 += -camera.Up * 10 * window.deltaTime;
                }

                if (window.HasFocus)
                {
                    // currently broken, the mouse is too flaky
                    //float yaw = MouseX(window) * (90 + 45f);
                    //float pitch = MouseY(window) * 90f;
                    //camera.EulerRotation3 += new Vector3(pitch, yaw, 0) * window.deltaTime;
                }

                if (window.GetKey(KeyCode.Right))
                {
                    camera.EulerRotation3 += new Vector3(0, 90 + 45, 0) * window.deltaTime;
                }

                if (window.GetKey(KeyCode.Left))
                {
                    camera.EulerRotation3 -= new Vector3(0, 90 + 45, 0) * window.deltaTime;
                }

                if (window.GetKey(KeyCode.P))
                {
                    camera.EulerRotation3 += new Vector3(90 + 45, 0, 0) * window.deltaTime;
                }

                if (window.GetKey(KeyCode.L))
                {
                    camera.EulerRotation3 -= new Vector3(90 + 45, 0, 0) * window.deltaTime;
                }


                //fxaa.enabled = window.GetKey(KeyCode.X);

                if (window.GetKey(KeyCode.Num1))
                {
                    shadowOffset += Vector3.UnitX * 2 * window.deltaTime;
                    Console.WriteLine(shadowOffset);
                }

                if (window.GetKey(KeyCode.Num2))
                {
                    shadowOffset -= Vector3.UnitX * 2 * window.deltaTime;
                    Console.WriteLine(shadowOffset);
                }

                if (window.GetKey(KeyCode.Num3))
                {
                    shadowOffset += Vector3.UnitY * 2 * window.deltaTime;
                    Console.WriteLine(shadowOffset);
                }

                if (window.GetKey(KeyCode.Num4))
                {
                    shadowOffset -= Vector3.UnitY * 2 * window.deltaTime;
                    Console.WriteLine(shadowOffset);
                }

                if (window.GetKey(KeyCode.Num5))
                {
                    shadowOffset += Vector3.UnitZ * 0.2f * window.deltaTime;
                    Console.WriteLine(shadowOffset);
                }

                if (window.GetKey(KeyCode.Num6))
                {
                    shadowOffset -= Vector3.UnitZ * 2 * window.deltaTime;
                    Console.WriteLine(shadowOffset);
                }



                directionalLight.SetShadowProjection(shadow_left, shadow_right, shadow_bottom, shadow_top, shadow_near, shadow_far);

                animationTimer -= window.deltaTime;
                if (animationTimer <= 0)
                {
                    animationIndex++;
                    if (animationIndex >= numFrames)
                    {
                        animationIndex = 0;
                    }
                    animationTimer = 1f / animations[0].Fps;
                }

                foreach (string subject in animations[0].KeyFrames.Keys)
                {
                    if (botMesh[0].HasBone(subject))
                    {
                        Mesh3.Bone bone = botMesh[0].GetBone(subject);
                        if (animationIndex < animations[0].KeyFrames[subject].Count)
                        {
                            //bone.Position = animations[0].KeyFrames[subject][animationIndex].Position;
                            //bone.Rotation = animations[0].KeyFrames[subject][animationIndex].Rotation;
                        }
                    }
                }

                pyramidRotation += new Vector3(0, 10, 0) * window.deltaTime;
                neckRotation    += window.deltaTime;

                string boneName = "mixamorig:Neck";
                if (botMesh[0].HasBone(boneName))
                {
                    Mesh3.Bone bone = botMesh[0].GetBone(boneName);
                    bone.Rotation = Quaternion.FromEulerAngles(new Vector3(0, (float)Math.Sin(neckRotation) / 2, 0));
                }

                if (botMesh[1].HasBone(boneName))
                {
                    Mesh3.Bone bone = botMesh[1].GetBone(boneName);
                    bone.Rotation = Quaternion.FromEulerAngles(new Vector3(0, (float)Math.Sin(neckRotation) / 2, 0));
                }



                crateRotation += 30 * window.deltaTime;

                //lightRotation += 10 * window.deltaTime;
                //directionalLight.UpdateDirection(Utils.EulerRotationToDirection(new Vector3(lightRotation, 180, 0)));

                window.DisableCullFaces();
                // draw shadow map texture
                window.RenderTo(shadowTexture);
                window.CullFrontFaces();
                floor.DrawShadowMap(directionalLight);
                pyramid.Scale3         = new Vector3(1, 2, 1);
                pyramid.EulerRotation3 = pyramidRotation;
                pyramid.Position3      = new Vector3(-6, 2, 10) + shadowOffset;
                pyramid.DrawShadowMap(directionalLight);

                pyramid.Scale3    = new Vector3(1, 2, 1);
                pyramid.Rotation3 = Vector3.Zero;
                pyramid.Position3 = new Vector3(-30, 2, 10) + shadowOffset;
                pyramid.DrawShadowMap(directionalLight);


                botMesh[0].Position3 = new Vector3(6, 0, 10) + shadowOffset;
                botMesh[0].DrawShadowMap(directionalLight);
                botMesh[1].Position3 = new Vector3(6, 0, 10) + shadowOffset;
                botMesh[1].DrawShadowMap(directionalLight);

                stormTrooper.Position3 = new Vector3(0, 0, 5) + shadowOffset;
                stormTrooper.Rotation3 = Vector3.Zero;
                stormTrooper.DrawShadowMap(directionalLight);
                stormTrooper.Position3 = new Vector3(-5, 0, 5) + shadowOffset;
                stormTrooper.Rotation3 = Vector3.Zero;
                stormTrooper.DrawShadowMap(directionalLight);
                stormTrooper.Position3 = new Vector3(7, 0, 5) + shadowOffset;
                stormTrooper.Rotation3 = Utils.LookAt((camera.Position3 - stormTrooper.Position3).Normalized());
                stormTrooper.DrawShadowMap(directionalLight);
                cube.EulerRotation3 = new Vector3(0, crateRotation, 0);
                cube.Position3      = new Vector3(0, 7, 0) + shadowOffset;
                cube.DrawShadowMap(directionalLight);
                cube.EulerRotation3 = Vector3.Zero;
                cube.Position3      = new Vector3(5, 1, 5) + shadowOffset;
                cube.DrawShadowMap(directionalLight);


                foreach (Mesh3 item in tank)
                {
                    item.Position3 = new Vector3(-10, 0, 20) + shadowOffset;
                    item.DrawShadowMap(directionalLight);
                }

                window.DisableCullFaces();
                window.RenderTo(null);

                window.CullBackFaces();
                //window.DisableCullFaces();

                floor.DrawPhong(floorTexture, directionalLight, new Vector3(0.5f, 0.5f, 0.5f), 0, shadowTexture);

                pyramid.Scale3         = new Vector3(1, 2, 1);
                pyramid.EulerRotation3 = pyramidRotation;
                pyramid.Position3      = new Vector3(-6, 2, 10);
                pyramid.DrawGouraud(new Vector4(1, 0, 0, 1), directionalLight, shadowTexture);

                pyramid.Scale3         = new Vector3(1, 2, 1);
                pyramid.EulerRotation3 = Vector3.Zero;
                pyramid.Position3      = new Vector3(-30, 2, 10);
                pyramid.DrawGouraud(new Vector4(1, 1, 0, 1), directionalLight, shadowTexture);

                botMesh[0].Position3 = new Vector3(6, 0, 10);
                botMesh[0].DrawGouraud(new Vector4(0, 0.8f, 1, 1), directionalLight, shadowTexture, 0.01f);
                botMesh[1].Position3 = new Vector3(6, 0, 10);
                botMesh[1].DrawGouraud(new Vector4(1, 0, 0, 1), directionalLight, shadowTexture, 0.01f);

                stormTrooper.Position3 = new Vector3(0, 0, 5);
                stormTrooper.Rotation3 = Vector3.Zero;
                stormTrooper.DrawGouraud(stormTrooperTexture, directionalLight, shadowTexture);

                stormTrooper.Position3 = new Vector3(-5, 0, 5);
                stormTrooper.Rotation3 = Vector3.Zero;
                stormTrooper.DrawPhong(stormTrooperTexture, directionalLight, new Vector3(0, 0.1f, 0), 0.75f, shadowTexture);

                stormTrooper.Position3 = new Vector3(7, 0, 5);
                stormTrooper.Rotation3 = Utils.LookAt((camera.Position3 - stormTrooper.Position3).Normalized());
                stormTrooper.DrawCel(stormTrooperTexture, directionalLight, new Vector3(0, 0.1f, 0), 0.75f, shadowTexture);


                //cube.DrawColor(new Vector4(1, 0, 0, 1));
                cube.EulerRotation3 = new Vector3(0, crateRotation, 0);
                cube.Position3      = new Vector3(0, 7, 0);
                cube.DrawTexture(crate);

                if (window.GetKey(KeyCode.Space))
                {
                    movingTrooper.Position3 += movingTrooper.Forward * window.deltaTime * 2;
                }

                if (window.GetKey(KeyCode.G))
                {
                    movingTrooper.EulerRotation3 += new Vector3(0, 90, 0) * window.deltaTime;
                }

                if (window.GetKey(KeyCode.H))
                {
                    movingTrooper.EulerRotation3 -= new Vector3(0, 90, 0) * window.deltaTime;
                }

                movingTrooper.DrawGouraud(new Vector4(1, 0, 0, 1), directionalLight);

                cube.EulerRotation3 = Vector3.Zero;
                cube.Position3      = new Vector3(5, 1, 5);
                cube.DrawGouraud(new Vector4(0, 0, 1, 1), directionalLight, shadowTexture);


                foreach (Mesh3 item in tank)
                {
                    item.Position3 = new Vector3(-10, 0, 20);
                    item.DrawPhong(tankDiffuse, directionalLight, new Vector3(0.1f, 0.1f, 0.1f), tankSpecular);
                }

                plane.Position3       = new Vector3(-13, 5, 0);
                plane.EulerRotation3 += Vector3.UnitY * 30 * window.deltaTime;
                plane.DrawColor(new Vector4(1, 1, 0, 1));

                sphere.Position3       = new Vector3(-5, 2, 20);
                sphere.EulerRotation3 += Vector3.UnitY * 10 * window.deltaTime;
                sphere.Scale3          = new Vector3(3);
                sphere.DrawPhong(world, directionalLight, new Vector3(0.2f, 0.2f, 0.2f));
                //sphere.DrawColor(new Vector4(1, 0, 0, 1));

                logo.DrawTexture(logoAiv);

                shadow.DrawTexture(shadowTexture);

                // this ensure postprocessing works
                window.DisableCullFaces();

                plane.Position3       = new Vector3(-10, 5, 0);
                plane.EulerRotation3 += Vector3.UnitY * 30 * window.deltaTime;
                plane.DrawColor(new Vector4(0, 1, 1, 1));

                window.Update();
            }
        }
Exemple #8
0
        public void MeshLoadProfiling()
        {
            var k3d    = new Toolkit();
            var logger = new MessageLogger();

            int    nBeams      = 20;
            int    nFaces      = 1500;
            double lengthBeams = 10.0;
            double xIncBeam    = lengthBeams / nBeams;
            double xIncMesh    = lengthBeams / nFaces;
            double limit_dist  = xIncBeam / 100.0;

            // create beams
            var lines = new List <Line3>();
            var nodeI = new Point3(0, 0, 0);

            for (int beamInd = 0; beamInd < nBeams; ++beamInd)
            {
                var nodeK = new Point3(nodeI.X + xIncBeam, 0, 0);
                lines.Add(new Line3(nodeI, nodeK));
                nodeI = nodeK;
            }

            var builderElements = k3d.Part.LineToBeam(lines, new List <string>(), new List <CroSec>(), logger, out List <Point3> outPoints);

            // create a MeshLoad
            var mesh = new Mesh3((nFaces + 1) * 2, nFaces);

            mesh.AddVertex(new Point3(0, -0.5, 0));
            mesh.AddVertex(new Point3(0, 0.5, 0));
            for (var faceInd = 0; faceInd < nFaces; ++faceInd)
            {
                mesh.AddVertex(new Point3((faceInd + 1) * xIncMesh, -0.5, 0));
                mesh.AddVertex(new Point3((faceInd + 1) * xIncMesh, 0.5, 0));
                var nV = mesh.Vertices.Count;
                mesh.AddFace(nV - 4, nV - 3, nV - 1, nV - 2);
            }
            UnitsConversionFactory ucf = UnitsConversionFactory.Conv();
            UnitConversion         m   = ucf.m();
            var baseMesh = m.toBaseMesh(mesh);

            // create a mesh load
            var load = k3d.Load.MeshLoad(new List <Vector3>()
            {
                new Vector3(0, 0, -1)
            }, baseMesh);

            // create a support
            var support = k3d.Support.Support(new Point3(0, 0, 0), k3d.Support.SupportFixedConditions);

            // assemble the model
            var model = k3d.Model.AssembleModel(builderElements, new List <Support>()
            {
                support
            }, new List <Load>()
            {
                load
            },
                                                out var info, out var mass, out var cog, out var message, out var runtimeWarning);

            // calculate the model
            model = k3d.Algorithms.AnalyzeThI(model, out var outMaxDisp, out var outG, out var outComp, out var warning);
            Assert.AreEqual(outMaxDisp[0], 2.8232103119228276, 1E-5);
        }
        public void Initialize()
        {
            var k3d = new Toolkit();

            var mesh = new Mesh3();

            mesh.AddVertex(0, 0, 0);
            mesh.AddVertex(0, 1, 0);
            mesh.AddVertex(1, 0, 0);
            mesh.AddVertex(1, 1, 0);
            mesh.AddFace(0, 2, 3);
            mesh.AddFace(0, 3, 1);

            var supportConditions = new List <bool>()
            {
                true, true, true, true, true, true
            };
            var supports = new List <Support>
            {
                k3d.Support.Support(new Point3(0, 0, 0), supportConditions),
                k3d.Support.Support(new Point3(0, 1, 0), supportConditions),
            };

            var loads = new List <Load>
            {
                k3d.Load.PointLoad(new Point3(1, 1, 0), new Vector3(-5, 0, -5)),
                k3d.Load.PointLoad(new Point3(1, 0, 0), new Vector3(-5, 0, -5)),
            };

            var logger = new MessageLogger();
            var crosec = k3d.CroSec.ReinforcedConcreteStandardShellConst(1);//20, 0, null, new List<double> { 4, 4, -4, -4 }, 0);
            var shells = k3d.Part.MeshToShell(new List <Mesh3> {
                mesh
            }, null, new List <CroSec> {
                crosec
            }, logger, out var nodes);
            var model = k3d.Model.AssembleModel(shells, supports, loads, out var info, out var mass, out var cog, out var message, out var any_warning);


            model             = k3d.Algorithms.AnalyzeThI(model, out var maxDisplacements, out var gravityForce, out var elasticEnergy, out var warning);
            _model            = model;
            _inputPolyline    = new PolyLine3(new Point3(0.5, -0.5, 1), new Point3(0.5, 1.5, 1));
            _projectionVector = new Vector3(0, 0, -1);
            _tol             = 1E-12;
            _delta           = 0.02;
            _outputPolylines = new List <PolyLine3>()
            {
                new PolyLine3
                (
                    new Point3(0.5, 0, 0),
                    new Point3(0.5, 0.5, 0),
                    new Point3(0.5, 1, 0)
                )
            };
            _outputCrossedFaces = new List <List <int> >()
            {
                new List <int>()
                {
                    0, 1
                }
            };
        }
        public void Initialize()
        {
            //Create Mesh
            var mesh = new Mesh3();

            mesh.AddVertex(0, 0, 0);
            mesh.AddVertex(0, 1, 0);
            mesh.AddVertex(1, 0, 0);
            mesh.AddVertex(1, 1, 0);
            mesh.AddVertex(2, 0, 0);
            mesh.AddVertex(2, 1, 0);
            mesh.AddVertex(0, 0, 0);
            mesh.AddVertex(1, 0, 0);
            mesh.AddVertex(2, 0, 0);
            mesh.AddVertex(0, 0, 1);
            mesh.AddVertex(1, 0, 1);
            mesh.AddVertex(2, 0, 1);
            mesh.AddVertex(0, 0, 2);
            mesh.AddVertex(1, 0, 2);
            mesh.AddVertex(2, 0, 2);
            mesh.AddVertex(2, 0, 0);
            mesh.AddVertex(2, 1, 0);
            mesh.AddVertex(2, 0, 1);
            mesh.AddVertex(2, 1, 1);
            mesh.AddVertex(2, 0, 2);
            mesh.AddVertex(2, 1, 2);
            mesh.AddVertex(2, 1, 0);
            mesh.AddVertex(1, 1, 0);
            mesh.AddVertex(0, 1, 0);
            mesh.AddVertex(2, 1, 1);
            mesh.AddVertex(1, 1, 1);
            mesh.AddVertex(0, 1, 1);
            mesh.AddVertex(2, 1, 2);
            mesh.AddVertex(1, 1, 2);
            mesh.AddVertex(0, 1, 2);
            mesh.AddVertex(0, 1, 0);
            mesh.AddVertex(0, 0, 0);
            mesh.AddVertex(0, 1, 1);
            mesh.AddVertex(0, 0, 1);
            mesh.AddVertex(0, 1, 2);
            mesh.AddVertex(0, 0, 2);
            mesh.AddVertex(0, 0, 2);
            mesh.AddVertex(1, 0, 2);
            mesh.AddVertex(2, 0, 2);
            mesh.AddVertex(0, 1, 2);
            mesh.AddVertex(1, 1, 2);
            mesh.AddVertex(2, 1, 2);
            mesh.AddFace(0, 1, 3);
            mesh.AddFace(2, 3, 5);
            mesh.AddFace(6, 7, 10);
            mesh.AddFace(7, 8, 11);
            mesh.AddFace(9, 10, 13);
            mesh.AddFace(10, 11, 14);
            mesh.AddFace(15, 16, 18);
            mesh.AddFace(17, 18, 20);
            mesh.AddFace(21, 22, 25);
            mesh.AddFace(22, 23, 26);
            mesh.AddFace(24, 25, 28);
            mesh.AddFace(25, 26, 29);
            mesh.AddFace(30, 31, 33);
            mesh.AddFace(32, 33, 35);
            mesh.AddFace(36, 37, 40);
            mesh.AddFace(37, 38, 41);
            mesh.AddFace(0, 3, 2);
            mesh.AddFace(2, 5, 4);
            mesh.AddFace(6, 10, 9);
            mesh.AddFace(7, 11, 10);
            mesh.AddFace(9, 13, 12);
            mesh.AddFace(10, 14, 13);
            mesh.AddFace(15, 18, 17);
            mesh.AddFace(17, 20, 19);
            mesh.AddFace(21, 25, 24);
            mesh.AddFace(22, 26, 25);
            mesh.AddFace(24, 28, 27);
            mesh.AddFace(25, 29, 28);
            mesh.AddFace(30, 33, 32);
            mesh.AddFace(32, 35, 34);
            mesh.AddFace(36, 40, 39);
            mesh.AddFace(37, 41, 40);

            //Create Model
            var k3d = new Toolkit();
            var supportConditions = new List <bool>()
            {
                true, true, true, true, true, true
            };
            var supports = new List <Support>
            {
                k3d.Support.Support(new Point3(0, 0, 0), supportConditions),
                k3d.Support.Support(new Point3(0, 1, 0), supportConditions),
                k3d.Support.Support(new Point3(1, 0, 0), supportConditions),
                k3d.Support.Support(new Point3(1, 1, 0), supportConditions),
                k3d.Support.Support(new Point3(2, 0, 0), supportConditions),
                k3d.Support.Support(new Point3(2, 1, 0), supportConditions)
            };
            var loads = new List <Load>
            {
                k3d.Load.PointLoad(new Point3(0, 0, 2), new Vector3(1000, 0, 0)),
                k3d.Load.PointLoad(new Point3(1, 0, 2), new Vector3(1000, 0, 0)),
                k3d.Load.PointLoad(new Point3(2, 0, 2), new Vector3(1000, 0, 0)),
                k3d.Load.PointLoad(new Point3(2, 1, 2), new Vector3(1000, 0, 0)),
                k3d.Load.PointLoad(new Point3(1, 1, 2), new Vector3(1000, 0, 0)),
                k3d.Load.PointLoad(new Point3(0, 1, 2), new Vector3(1000, 0, 0))
            };

            var logger = new MessageLogger();
            var crosec = k3d.CroSec.ReinforcedConcreteStandardShellConst(25, 0, null, new List <double> {
                4, 4, -4, -4
            }, 0);
            var shells = k3d.Part.MeshToShell(new List <Mesh3> {
                mesh
            }, null, new List <CroSec> {
                crosec
            }, logger, out var nodes);

            var model = k3d.Model.AssembleModel(shells, supports, loads,
                                                out var info, out var mass, out var cog, out var message, out var any_warning);

            model = k3d.Algorithms.AnalyzeThI(model, out var maxDisplacements,
                                              out var gravityForce, out var elasticEnergy, out var warning);

            //Create projection Vector
            Vector3 proj_vect = new Vector3(0, 1, 0);

            //Create other definition
            var tol   = 1E-12;
            var delta = 0.02;

            _model            = model;
            _projectionVector = proj_vect;
            _tol   = tol;
            _delta = delta;
        }
Exemple #11
0
        public void Initialize()
        {
            //Create Mesh
            var mesh = new Mesh3();

            mesh.AddVertex(0, 0, 0);
            mesh.AddVertex(0, 1, 0);
            mesh.AddVertex(0, 2, 0);
            mesh.AddVertex(1, 0, 0);
            mesh.AddVertex(1, 1, 0);
            mesh.AddVertex(1, 2, 0);
            mesh.AddVertex(2, 0, 0);
            mesh.AddVertex(2, 1, 0);
            mesh.AddVertex(2, 2, 0);

            mesh.AddFace(0, 3, 4);
            mesh.AddFace(1, 4, 5);
            mesh.AddFace(3, 6, 7);
            mesh.AddFace(4, 7, 8);
            mesh.AddFace(0, 4, 1);
            mesh.AddFace(1, 5, 2);
            mesh.AddFace(3, 7, 4);
            mesh.AddFace(4, 8, 5);

            //Create Model
            var k3d = new Toolkit();
            var supportConditions = new List <bool>()
            {
                true, true, true, true, true, true
            };
            var supports = new List <Support>
            {
                k3d.Support.Support(new Point3(0, 0, 0), supportConditions),
                k3d.Support.Support(new Point3(0, 1, 0), supportConditions),
                k3d.Support.Support(new Point3(0, 2, 0), supportConditions)
            };

            var loads = new List <Load>
            {
                k3d.Load.PointLoad(new Point3(2, 2, 0), new Vector3(0, 0, -5)),
                k3d.Load.PointLoad(new Point3(2, 1, 0), new Vector3(0, 0, -5)),
                k3d.Load.PointLoad(new Point3(2, 0, 0), new Vector3(0, 0, -5)),
            };

            var logger = new MessageLogger();
            var crosec = k3d.CroSec.ReinforcedConcreteStandardShellConst(25, 0, null, new List <double> {
                4, 4, -4, -4
            }, 0);
            var shells = k3d.Part.MeshToShell(new List <Mesh3> {
                mesh
            }, null, new List <CroSec> {
                crosec
            }, logger, out var nodes);

            var model = k3d.Model.AssembleModel(shells, supports, loads,
                                                out var info, out var mass, out var cog, out var message, out var any_warning);

            model = k3d.Algorithms.AnalyzeThI(model, out var maxDisplacements,
                                              out var gravityForce, out var elasticEnergy, out var warning);

            //Create projection Vector
            Vector3 proj_vect = new Vector3(0, 0, -1);

            //Create other definition
            var tol   = 1E-12;
            var delta = 0.02;


            _model            = model;
            _projectionVector = proj_vect;
            _tol   = tol;
            _delta = delta;
        }
Exemple #12
0
        private static IEnumerable <Polygon3> CreateTesselatedLineSupport(List <Point3> intersectionPoints, double plateSpacing, Mesh3 model)
        {
            intersectionPoints.Sort(new Point3XComparer());
            double xyLength           = intersectionPoints[0].DistanceTo(intersectionPoints[intersectionPoints.Count - 1]);
            double xyAvgSegmentLength = xyLength / (intersectionPoints.Count - 1);

            double buildPlateZ      = model.MinPoint.Z - plateSpacing;
            double zSegmentCountSum = 0;

            foreach (Point3 intersection in intersectionPoints)
            {
                zSegmentCountSum += Math.Abs(intersection.Z - buildPlateZ) / xyAvgSegmentLength;
            }
            int zAvgSegmentCount = (int)(zSegmentCountSum / intersectionPoints.Count);
            int numRows          = zAvgSegmentCount + 2;
            int numCols          = intersectionPoints.Count;

            Point3[,] pointGrid = new Point3[numRows, numCols];
            for (int row = 0; row != numRows; row++)
            {
                for (int col = 0; col != numCols; col++)
                {
                    Point3 referencePoint = intersectionPoints[col];
                    float  newZ           = (float)(referencePoint.Z - Math.Abs(referencePoint.Z - buildPlateZ) / (numRows - 1) * row);
                    pointGrid[row, col] = new Point3(referencePoint.X, referencePoint.Y, newZ);
                }
            }
            Console.WriteLine("Filled grid of points");

            List <Polygon3> scaffoldingFacets = new List <Polygon3>();

            for (int row = 0; row != numRows - 1; row++)
            {
                for (int col = 0; col != numCols - 1; col++)
                {
                    //Console.WriteLine($"Row {row}, Col {col}");
                    Point3 p1 = pointGrid[row + 1, col + 1];
                    Point3 p2 = pointGrid[row + 1, col];
                    Point3 p3 = pointGrid[row, col];
                    Point3 p4 = pointGrid[row, col + 1];

                    scaffoldingFacets.Add(TesselatePoints(p3, p2, p1));
                    scaffoldingFacets.Add(TesselatePoints(p1, p4, p3));
                }
            }
            Console.WriteLine("Created tesselation from grid");
            return(scaffoldingFacets);
        }
		public override void Read(AssetStream stream)
		{
			base.Read(stream);

			if (IsModeShort(stream.Version))
			{
				RenderMode = stream.ReadUInt16();
			}
			else
			{
				RenderMode = stream.ReadInt32();
			}
			if (IsSortModeFirst(stream.Version))
			{
				SortMode = stream.ReadUInt16();
			}

			if (IsReadMinParticleSize(stream.Version))
			{
				MinParticleSize = stream.ReadSingle();
			}
			MaxParticleSize = stream.ReadSingle();
			CameraVelocityScale = stream.ReadSingle();
			VelocityScale = stream.ReadSingle();
			LengthScale = stream.ReadSingle();
			SortingFudge = stream.ReadSingle();

			if (IsReadNormalDirection(stream.Version))
			{
				NormalDirection = stream.ReadSingle();
			}
			if (!IsSortModeFirst(stream.Version))
			{
				SortMode = stream.ReadInt32();
			}

			if (IsReadRenderAlignment(stream.Version))
			{
				RenderAlignment = stream.ReadInt32();
				Pivot.Read(stream);
			}
			if (IsReadUseCustomVertexStreams(stream.Version))
			{
				UseCustomVertexStreams = stream.ReadBoolean();
				stream.AlignStream(AlignType.Align4);
			}
			if (IsReadVertexStreamMask(stream.Version))
			{
				VertexStreamMask = stream.ReadInt32();
			}
			if (IsReadVertexStreams(stream.Version))
			{
				m_vertexStreams = stream.ReadByteArray();
				stream.AlignStream(AlignType.Align4);
			}

			Mesh.Read(stream);
			if (IsReadMeshes(stream.Version))
			{
				Mesh1.Read(stream);
				Mesh2.Read(stream);
				Mesh3.Read(stream);
			}
			if (IsReadMaskInteraction(stream.Version))
			{
				MaskInteraction = stream.ReadInt32();
			}
		}
Exemple #14
0
 public void SetParent(Mesh3 mesh)
 {
     this.mesh.SetParent(mesh);
 }
Exemple #15
0
 public ShellMesh(Shell s, Mesh3 m)
 {
     Shell = s;
     Mesh  = m;
 }
Exemple #16
0
        public static Mesh3 Chuck(params object[] o)
        {
            Mesh3 mesh = new Mesh3();
            int v0 = mesh.AddVertex(0, 0, 0);
            int v1 = mesh.AddVertex(40, 0, 0);
            int v2 = mesh.AddVertex(40, 15, 0);
            int v3 = mesh.AddVertex(0, 15, 0);
            int v4 = mesh.AddVertex(90, 0, 0);
            int v5 = mesh.AddVertex(90, 30, 0);
            int v6 = mesh.AddVertex(40, 30, 0);
            int v7 = mesh.AddVertex(110, 0, 0);
            int v8 = mesh.AddVertex(110, 45, 0);
            int v9 = mesh.AddVertex(90, 45, 0);

            int v12 = mesh.AddVertex(90, 45, -30);
            int v13 = mesh.AddVertex(90, 30, -30);
            int v14 = mesh.AddVertex(40, 30, -30);
            int v15 = mesh.AddVertex(40, 15, -30);
            int v16 = mesh.AddVertex(0, 15, -30);

            int v17 = mesh.AddVertex(90, 0, -30);
            int v18 = mesh.AddVertex(40, 0, -30);
            int v19 = mesh.AddVertex(0, 0, -30);

            int v10 = mesh.AddVertex(110, 0, -30);
            int v11 = mesh.AddVertex(110, 45, -30);

            int v20 = mesh.AddVertex(120, 45, -20);
            int v21 = mesh.AddVertex(120, 45, -10);
            int v22 = mesh.AddVertex(120, 0, -10);
            int v23 = mesh.AddVertex(120, 0, -20);

            int n0 = mesh.AddNormal(0, 0, 1);
            int[] poly0 = { v0, v1, v2, v3 };
            int[] normal0 = { n0, n0, n0, n0 };
            mesh.AddPoly(poly0, normal0);

            int[] poly1 = { v1, v4, v5, v6 };
            mesh.AddPoly(poly1, normal0);

            int[] poly2 = { v4, v7, v8, v9 };
            mesh.AddPoly(poly2, normal0);

            int n1 = mesh.AddNormal(1, 0, 0);
            int[] poly3 = { v21, v22, v23, v20 };
            int[] normal1 = { n1, n1, n1, n1 };
            mesh.AddPoly(poly3, normal1);

            int n3 = mesh.AddNormal(0, 1, 0);
            int[] poly4 = { v9, v8, v11, v12 };
            int[] normal3 = { n3, n3, n3, n3 };
            mesh.AddPoly(poly4, normal3);

            int[] poly5 = { v6, v5, v13, v14 };
            mesh.AddPoly(poly5, normal3);

            int[] poly6 = { v3, v2, v15, v16 };
            mesh.AddPoly(poly6, normal3);

            int n2 = mesh.AddNormal(0, 0, -1);
            int[] normal2 = { n2, n2, n2, n2 };
            int[] poly7 = { v12, v11, v10, v17 };
            mesh.AddPoly(poly7, normal2);

            int[] poly8 = { v14, v13, v17, v18 };
            mesh.AddPoly(poly8, normal2);

            int[] poly9 = { v16, v15, v18, v19 };
            mesh.AddPoly(poly9, normal2);

            int n4 = mesh.AddNormal(-1, 0, 0);
            int[] normal4 = { n4, n4, n4, n4 };
            int[] poly10 = { v9, v12, v13, v5 };
            mesh.AddPoly(poly10, normal4);

            int[] poly11 = { v6, v14, v15, v2 };
            mesh.AddPoly(poly11, normal4);

            int[] poly12 = { v0, v3, v16, v19 };
            mesh.AddPoly(poly12, normal4);

            int n5 = mesh.AddNormal(0, -1, 0);
            int[] normal5 = { n5, n5, n5, n5 };
            int[] poly13 = { v0, v19, v10, v7 };
            mesh.AddPoly(poly13, normal5);

            int[] poly14 = { v8, v7, v22, v21 };
            int n6 = mesh.AddNormal(new Vector3D(1, 0, 1).Unit());
            int[] normal6 = { n6, n6, n6, n6 };
            mesh.AddPoly(poly14, normal6);

            int[] poly15 = { v11, v20, v23, v10 };
            int n7 = mesh.AddNormal(new Vector3D(1, 0, -1).Unit());
            int[] normal7 = { n7, n7, n7, n7 };
            mesh.AddPoly(poly15, normal2);

            int[] poly16 = { v8, v21, v20, v11 };
            mesh.AddPoly(poly16, normal3);

            int[] poly17 = { v7, v10, v23, v22 };
            mesh.AddPoly(poly17, normal5);
            return mesh;
        }
        public void ReinforcedPlate()
        {
            var k3d    = new Toolkit();
            var logger = new MessageLogger();

            double length = 1.0;
            var    mesh   = new Mesh3();

            mesh.AddVertex(new Point3(0, length, 0));
            mesh.AddVertex(new Point3(0, 0, 0));
            mesh.AddVertex(new Point3(length, 0, 0));
            mesh.AddVertex(new Point3(length, length, 0));
            mesh.AddFace(new Face3(0, 1, 3));
            mesh.AddFace(new Face3(1, 2, 3));

            var crosec = k3d.CroSec.ReinforcedConcreteStandardShellConst(25, 0, null, new List <double> {
                4, 4, -4, -4
            }, 0);
            var shells = k3d.Part.MeshToShell(new List <Mesh3> {
                mesh
            }, null, new List <CroSec> {
                crosec
            }, logger, out var nodes);

            // create supports
            var supportConditions = new List <bool>()
            {
                true, true, true, true, true, true
            };
            var supports = new List <Support>
            {
                k3d.Support.Support(0, supportConditions),
                k3d.Support.Support(1, supportConditions),
            };

            // create a Point-load
            var loads = new List <Load>
            {
                k3d.Load.PointLoad(2, new Vector3(), new Vector3(0, 25, 0)),
                k3d.Load.PointLoad(3, new Vector3(), new Vector3(0, 25, 0))
            };

            // create the model
            var model = k3d.Model.AssembleModel(shells, supports, loads,
                                                out var info, out var mass, out var cog, out var message, out var warning);

            model = k3d.Algorithms.OptiReinf(model,
                                             out List <double> maxDisplacements, out List <double> compliances, out message, out double reinfMass);

            k3d.Results.ShellForcesLocal(model, null, 0,
                                         out var nxx, out var nyy, out var nxy,
                                         out var mxx, out var myy, out var mxy,
                                         out var vx, out var vy);
            Assert.AreEqual(mxx[0][0], 50.082245640312429, 1E-5);
            Assert.AreEqual(mxx[0][1], 49.91775435968767, 1E-5);

            var crosec_shell = model.elems[0].crosec as CroSec_Shell;
            var reinf_thick  = crosec_shell.elem_crosecs[0].layers[1].height;

            Assert.AreEqual(reinf_thick, 0.00046824411288599481, 1E-5);
        }
Exemple #18
0
 public void SetParent(Mesh3 mesh)
 {
     this.shape[mainMesh].SetParent(mesh);
 }