Ejemplo n.º 1
0
                /// <summary>
                /// Adds a triangles in the given starting index range
                /// </summary>
                public static void AddTriangleRange(Vector2I range, IReadOnlyList <int> indices, IReadOnlyList <Vector3D> vertices, ref PolyMaterial mat, MatrixD[] matrixRef = null)
                {
                    var bbPool     = instance.bbPoolBack;
                    var bbDataBack = instance.triangleList;
                    var bbBuf      = instance.bbBuf;
                    var matList    = instance.matrixBuf;
                    var matTable   = instance.matrixTable;

                    // Find matrix index in table or add it
                    int matrixID = -1;

                    if (matrixRef != null && !matTable.TryGetValue(matrixRef, out matrixID))
                    {
                        matrixID = matList.Count;
                        matList.Add(matrixRef[0]);
                        matTable.Add(matrixRef, matrixID);
                    }

                    int iMax          = indices.Count,
                        triangleCount = (range.Y - range.X) / 3,
                        bbRemaining   = bbPool.Count - bbDataBack.Count,
                        bbToAdd       = Math.Max(triangleCount - bbRemaining, 0);

                    instance.AddNewBB(bbToAdd);

                    for (int i = bbDataBack.Count; i < triangleCount + bbDataBack.Count; i++)
                    {
                        bbBuf.Add(bbPool[i]);
                    }

                    MyTransparentGeometry.AddBillboards(bbBuf, false);
                    bbBuf.Clear();

                    bbDataBack.EnsureCapacity(bbDataBack.Count + triangleCount);

                    for (int i = range.X; i <= range.Y; i += 3)
                    {
                        var bb = new TriangleBillboardData
                        {
                            Item1 = BlendTypeEnum.PostPP,
                            Item2 = new Vector2I(bbDataBack.Count, matrixID),
                            Item3 = mat.textureID,
                            Item4 = mat.bbColor,
                            Item5 = new MyTuple <Vector2, Vector2, Vector2>
                                    (
                                mat.texCoords[indices[i % iMax]],
                                mat.texCoords[indices[(i + 1) % iMax]],
                                mat.texCoords[indices[(i + 2) % iMax]]
                                    ),
                            Item6 = new MyTuple <Vector3D, Vector3D, Vector3D>
                                    (
                                vertices[indices[i % iMax]],
                                vertices[indices[(i + 1) % iMax]],
                                vertices[indices[(i + 2) % iMax]]
                                    ),
                        };
                        bbDataBack.Add(bb);
                    }
                }
Ejemplo n.º 2
0
                /// <summary>
                /// Queues a single triangle billboard for rendering
                /// </summary>
                public static void AddTriangle(ref TriMaterial mat, ref TriangleD triangle, MatrixD[] matrixRef = null)
                {
                    var bbPool     = instance.bbPoolBack;
                    var bbDataBack = instance.triangleList;
                    int index      = bbDataBack.Count;
                    var matList    = instance.matrixBuf;
                    var matTable   = instance.matrixTable;

                    // Find matrix index in table or add it
                    int matrixID = -1;

                    if (matrixRef != null && !matTable.TryGetValue(matrixRef, out matrixID))
                    {
                        matrixID = matList.Count;
                        matList.Add(matrixRef[0]);
                        matTable.Add(matrixRef, matrixID);
                    }

                    var bb = new TriangleBillboardData
                    {
                        Item1 = BlendTypeEnum.PostPP,
                        Item2 = new Vector2I(index, matrixID),
                        Item3 = mat.textureID,
                        Item4 = mat.bbColor,
                        Item5 = new MyTuple <Vector2, Vector2, Vector2>
                                (
                            mat.texCoords.Point0,
                            mat.texCoords.Point1,
                            mat.texCoords.Point2
                                ),
                        Item6 = new MyTuple <Vector3D, Vector3D, Vector3D>
                                (
                            triangle.Point0,
                            triangle.Point1,
                            triangle.Point2
                                ),
                    };

                    bbDataBack.Add(bb);

                    if (index >= bbPool.Count)
                    {
                        instance.AddNewBB(index - (bbPool.Count - 1));
                    }

                    MyTransparentGeometry.AddBillboard(bbPool[index], false);
                }
Ejemplo n.º 3
0
                /// <summary>
                /// Queues a quad billboard for rendering
                /// </summary>
                public static void AddQuad(ref BoundedQuadMaterial mat, ref MyQuadD quad, MatrixD[] matrixRef = null)
                {
                    var bbPool     = instance.bbPoolBack;
                    var bbDataBack = instance.triangleList;
                    int indexL     = bbDataBack.Count,
                        indexR     = bbDataBack.Count + 1;
                    var matList    = instance.matrixBuf;
                    var matTable   = instance.matrixTable;

                    // Find matrix index in table or add it
                    int matrixID = -1;

                    if (matrixRef != null && !matTable.TryGetValue(matrixRef, out matrixID))
                    {
                        matrixID = matList.Count;
                        matList.Add(matrixRef[0]);
                        matTable.Add(matrixRef, matrixID);
                    }

                    var bbL = new TriangleBillboardData
                    {
                        Item1 = BlendTypeEnum.PostPP,
                        Item2 = new Vector2I(indexL, matrixID),
                        Item3 = mat.textureID,
                        Item4 = mat.bbColor,
                        Item5 = new MyTuple <Vector2, Vector2, Vector2>
                                (
                            mat.texBounds.Min,
                            mat.texBounds.Min + new Vector2(0f, mat.texBounds.Size.Y),
                            mat.texBounds.Max
                                ),
                        Item6 = new MyTuple <Vector3D, Vector3D, Vector3D>
                                (
                            quad.Point0,
                            quad.Point1,
                            quad.Point2
                                ),
                    };
                    var bbR = new TriangleBillboardData
                    {
                        Item1 = BlendTypeEnum.PostPP,
                        Item2 = new Vector2I(indexR, matrixID),
                        Item3 = mat.textureID,
                        Item4 = mat.bbColor,
                        Item5 = new MyTuple <Vector2, Vector2, Vector2>
                                (
                            mat.texBounds.Min,
                            mat.texBounds.Max,
                            mat.texBounds.Min + new Vector2(mat.texBounds.Size.X, 0f)
                                ),
                        Item6 = new MyTuple <Vector3D, Vector3D, Vector3D>
                                (
                            quad.Point0,
                            quad.Point2,
                            quad.Point3
                                ),
                    };

                    bbDataBack.Add(bbL);
                    bbDataBack.Add(bbR);

                    if (indexR >= bbPool.Count)
                    {
                        instance.AddNewBB(indexR - (bbPool.Count - 1));
                    }

                    MyTransparentGeometry.AddBillboard(bbPool[indexL], false);
                    MyTransparentGeometry.AddBillboard(bbPool[indexR], false);
                }
Ejemplo n.º 4
0
                /// <summary>
                /// Adds a list of textured quads in one batch using QuadBoard data
                /// </summary>
                public static void AddQuads(IReadOnlyList <QuadBoardData> quads, MatrixD[] matrixRef = null)
                {
                    var bbPool     = instance.bbPoolBack;
                    var bbDataBack = instance.triangleList;
                    var bbBuf      = instance.bbBuf;
                    var matList    = instance.matrixBuf;
                    var matTable   = instance.matrixTable;

                    // Find matrix index in table or add it
                    int matrixID = -1;

                    if (matrixRef != null && !matTable.TryGetValue(matrixRef, out matrixID))
                    {
                        matrixID = matList.Count;
                        matList.Add(matrixRef[0]);
                        matTable.Add(matrixRef, matrixID);
                    }

                    int triangleCount = quads.Count * 2,
                        bbRemaining   = bbPool.Count - bbDataBack.Count,
                        bbToAdd       = Math.Max(triangleCount - bbRemaining, 0);

                    instance.AddNewBB(bbToAdd);

                    for (int i = bbDataBack.Count; i < triangleCount + bbDataBack.Count; i++)
                    {
                        bbBuf.Add(bbPool[i]);
                    }

                    MyTransparentGeometry.AddBillboards(bbBuf, false);
                    bbBuf.Clear();

                    bbDataBack.EnsureCapacity(bbDataBack.Count + triangleCount);

                    for (int i = 0; i < quads.Count; i++)
                    {
                        QuadBoardData       quadBoard = quads[i];
                        MyQuadD             quad      = quadBoard.positions;
                        BoundedQuadMaterial mat       = quadBoard.material;

                        var bbL = new TriangleBillboardData
                        {
                            Item1 = BlendTypeEnum.PostPP,
                            Item2 = new Vector2I(bbDataBack.Count, matrixID),
                            Item3 = mat.textureID,
                            Item4 = mat.bbColor,
                            Item5 = new MyTuple <Vector2, Vector2, Vector2>
                                    (
                                mat.texBounds.Min,
                                mat.texBounds.Min + new Vector2(0f, mat.texBounds.Size.Y),
                                mat.texBounds.Max
                                    ),
                            Item6 = new MyTuple <Vector3D, Vector3D, Vector3D>
                                    (
                                quad.Point0,
                                quad.Point1,
                                quad.Point2
                                    ),
                        };
                        var bbR = new TriangleBillboardData
                        {
                            Item1 = BlendTypeEnum.PostPP,
                            Item2 = new Vector2I(bbDataBack.Count + 1, matrixID),
                            Item3 = mat.textureID,
                            Item4 = mat.bbColor,
                            Item5 = new MyTuple <Vector2, Vector2, Vector2>
                                    (
                                mat.texBounds.Min,
                                mat.texBounds.Max,
                                mat.texBounds.Min + new Vector2(mat.texBounds.Size.X, 0f)
                                    ),
                            Item6 = new MyTuple <Vector3D, Vector3D, Vector3D>
                                    (
                                quad.Point0,
                                quad.Point2,
                                quad.Point3
                                    ),
                        };

                        bbDataBack.Add(bbL);
                        bbDataBack.Add(bbR);
                    }
                }