Exemple #1
0
        public static void ClusterSort(NativeArray <Fragment> fragments, NativeArray <float> distances)
        {
            if (fragments.Length == 0)
            {
                return;
            }
            NativeArray <Element> elements = new NativeArray <Element>(fragments.Length, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);
            Element * elementsPtr          = (Element *)elements.GetUnsafePtr();
            Fragment *fragmentsPtr         = (Fragment *)fragments.GetUnsafePtr();
            float *   distancePtr          = (float *)distances.GetUnsafePtr();
            Element   newElement;

            newElement.sign       = 0;
            newElement.policy     = new Fragment();
            newElement.leftValue  = -1;
            newElement.rightValue = -1;
            for (int i = 0; i < elements.Length; ++i)
            {
                newElement.sign   = distancePtr[i];
                newElement.policy = fragmentsPtr[i];
                elementsPtr[i]    = newElement;
            }
            for (int i = 1; i < fragments.Length; ++i)
            {
                int currentIndex = 0;
STARTFIND:
                Element * currentIndexValue = elementsPtr + currentIndex;
                if ((elementsPtr + i)->sign < currentIndexValue->sign)
                {
                    if (currentIndexValue->leftValue < 0)
                    {
                        currentIndexValue->leftValue = i;
                    }
                    else
                    {
                        currentIndex = currentIndexValue->leftValue;
                        goto STARTFIND;
                    }
                }
                else
                {
                    if (currentIndexValue->rightValue < 0)
                    {
                        currentIndexValue->rightValue = i;
                    }
                    else
                    {
                        currentIndex = currentIndexValue->rightValue;
                        goto STARTFIND;
                    }
                }
            }
            int start = 0;

            Iterate(0, ref start, elements, fragments);
            elements.Dispose();
        }
Exemple #2
0
        public void Execute(int index)
        {
            NativeArray <Fragment> fragments = allFragments[index];
            Fragment *          fragPtr      = (Fragment *)fragments.GetUnsafePtr();
            ClusterMeshData     data         = new ClusterMeshData();
            NativeArray <Point> allPoints    = pointsArray[index];

            for (int i = 0, pointCount = 0; i < fragments.Length - 1; ++i)
            {
                int *indices = (int *)&fragPtr[i].indices;
                for (int a = 0; a < 4; ++a)
                {
                    ref Point p = ref pointsFromMesh[indices[a]];
                    allPoints[pointCount] = p;
                    pointCount++;
                }
            }
Exemple #3
0
        public unsafe RenderBuffer <float> Draw <T>(RenderEntity[] entities, T camera) where T : ICamera
        {
            Clear();

            int entityCount = entities.Length;

            BeginRasterize();
            SetPerRenderValues(camera);
            for (int i = 0; i < entityCount; i++)
            {
                RenderEntity currentEntity = entities[i];
                SetPerObjectValues(currentEntity);

                Material material = currentEntity.Material ?? DEFAULT_MATERIAL;
                Model    model    = currentEntity.Model;

                #region Vertex Stage

                //Prepare vertex shader
                VertexInvoker.ChangeActiveShader(material.ShaderType, material.Shader);

                //Invoke vertex shader
                int      vertexCount  = model.Vertices.Length;
                Vector2 *coordsOutput = stackalloc Vector2[vertexCount];
                ShaderInOutPatternDefault *inoutPtr = stackalloc ShaderInOutPatternDefault[1];
                for (int j = 0; j < vertexCount; j++)
                {
                    VertexInvoker.Invoke(model.ReadVerticesDataAsPattern(j));
                    VertexInvoker.ActiveOutputMap.Write(inoutPtr);
                    coordsOutput[j] = *(Vector2 *)&inoutPtr->Vertex;
                }

                #endregion

                #region Fragment Stage

                FragmentInvoker.ChangeActiveShader(material.ShaderType, material.Shader);

                //Primitive assemble
                int newPrimitiveCount = AssemblePrimitive(model, coordsOutput);
                _rasterizedFragments.AddEmpty(newPrimitiveCount);
                switch (_assembleMode)
                {
                case PrimitiveAssembleMode.Line:
                case PrimitiveAssembleMode.LineTriangle:
                    Rasterize <LinePrimitive, Line>(_linePrimitives.GetPointer(_linePrimitives.Count - newPrimitiveCount), newPrimitiveCount, _rasterizedFragments.GetPointer(_rasterizedFragments.Count - newPrimitiveCount));
                    break;

                case PrimitiveAssembleMode.Triangle:
                    Rasterize <TrianglePrimitive, Triangle>(_trianglePrimitives.GetPointer(_trianglePrimitives.Count - newPrimitiveCount), newPrimitiveCount, _rasterizedFragments.GetPointer(_rasterizedFragments.Count - newPrimitiveCount));
                    break;
                }

                for (int j = _rasterizedFragments.Count - newPrimitiveCount; j < _rasterizedFragments.Count; j++)
                {
                    Fragment *fragment = _rasterizedFragments.GetPointer(j);
                    for (int k = 0; k < fragment->PixelCount; k++)
                    {
                        //Fragment.FragmentData has been tailored to a proper size
                        FragmentInvoker.Invoke((byte *)fragment->FragmentData[k]);
                        FragmentInvoker.ActiveOutputMap.Write(inoutPtr);
                        _renderedColors.Add(inoutPtr->Color);
                    }
                    fragment->FragmentColor = _renderedColors.ArchivePointer();
                }

                #endregion
            }

            EndRasterize();


            //Octree is so annoying
            //TODO: View frustum clip, triangle clip, pixel clip
            //Clipping();

            //This is not the proper way to output, rather for debugging
            for (int i = 0; i < _rasterizedFragments.Count; i++)
            {
                Fragment *fragmentPtr = _rasterizedFragments.GetPointer(i);
                RenderTarget.WritePixel(fragmentPtr->Rasterization, fragmentPtr->PixelCount, fragmentPtr->FragmentColor);
            }

            return(RenderTarget);
        }
Exemple #4
0
        public unsafe RenderBuffer <float> Draw(RenderEntity[] entities, ICamera camera)
        {
            RenderTarget.Clear();

            int        entityCount         = entities.Length;
            Fragment **rasterizedFragments = stackalloc Fragment *[entityCount];
            int *      primitiveCounts     = stackalloc int[entityCount];

            BeginRasterize();
            ShaderValue.WorldToView = camera.WorldToView;
            ShaderValue.Time        = CRenderer.CurrentSecond;
            ShaderValue.SinTime     = MathF.Sin(ShaderValue.Time);
            for (int i = 0; i < entityCount; i++)
            {
                RenderEntity instanceCopy = entities[i].GetInstanceToApply();
                IMaterial    material     = instanceCopy.Material ?? DEFAULT_MATERIAL;
                Vector4[]    vertices     = instanceCopy.Model.Vertices;
                IPrimitive[] primitives   = instanceCopy.Model.Primitives;

                ShaderValue.ObjectToWorld = instanceCopy.Transform.LocalToWorld;
                ShaderValue.ObjectToView  = ShaderValue.WorldToView * ShaderValue.ObjectToWorld;

                ShaderInvoker <IVertexShader> .ChangeActiveShader(material.ShaderType, material.Shader);

                int      vertexCount  = vertices.Length;
                Vector2 *coordsOutput = stackalloc Vector2[vertexCount];
                Vector4 *vertexOutput = stackalloc Vector4[vertexCount];

                for (int j = 0; j < vertexCount; j++)
                {
                    ShaderInOutMap outputMap = ShaderInvoker <IVertexShader> .Invoke(j, vertices);

                    vertexOutput[j] = *outputMap.VertexPtr;
                    coordsOutput[j] = ViewToScreen(*outputMap.VertexPtr);
                }

                Fragment *fragments = stackalloc Fragment[primitives.Length];
                primitiveCounts[i] = primitives.Length;
                for (int j = 0; j < primitives.Length; j++)
                {
                    Rasterize(coordsOutput, primitives[j], fragments + j);
                }
                rasterizedFragments[i] = fragments;
            }
            EndRasterize();

            //Octree is so annoying
            //TODO: View frustum clip, triangle clip, pixel clip
            //Clipping();

            //This is not the proper way to output, just to check result as soon as possible
            GenericVector <float> white = new GenericVector <float>(3)
            {
                1, 1, 1
            };

            for (int i = 0; i < entityCount; i++)
            {
                for (int j = 0; j < primitiveCounts[i]; j++)
                {
                    RenderTarget.WritePixel(rasterizedFragments[i][j].Rasterization, rasterizedFragments[i][j].PixelCount, white);
                }
            }

            return(RenderTarget);
        }
Exemple #5
0
 public static void ContriveResult(Fragment *result)
 {
     result->PixelCount    = RasterizedPixelCount;
     result->Rasterization = _pixelCoords.ArchivePointer();
     result->FragmentData  = _fragmentData.Count > 0 ? (float **)_fragmentData.ArchivePointer() : null;
 }