예제 #1
0
 protected override void CapacityChanged()
 {
     unsafe
     {
         m_Ptr = (Vector2 *)m_AlignedPtr.ToPointer();
     }
 }
예제 #2
0
        public static unsafe void TestRasterize()
        {
            Rasterizer.StartRasterize(CRenderSettings.ResolutionF);
            RenderBuffer <float>     tex0    = new RenderBuffer <float>(CRenderSettings.Resolution, 3);
            CharRenderBuffer <float> texChar = new CharRenderBuffer <float>(tex0);
            Vector2 *points = stackalloc Vector2[4];

            for (float i = 0; i < JMath.PI_TWO; i += .02f)
            {
                Vector2 dir      = new Vector2(MathF.Cos(i) * .3f, MathF.Sin(i) * .3f);
                Vector2 orthoDir = new Vector2(-dir.Y, dir.X);
                points[0] = new Vector2(.5f, .5f) + dir;
                points[1] = new Vector2(.5f, .5f) - dir;
                points[2] = new Vector2(.5f, .5f) + orthoDir;
                points[3] = new Vector2(.5f, .5f) - orthoDir;
                LinePrimitive *line = stackalloc LinePrimitive[1] {
                    new LinePrimitive(points, null, 0)
                };
                Rasterizer.Rasterize <Line, LinePrimitive>(line);
                tex0.WritePixel(Rasterizer.ContriveResult(), new GenericVector <float>(3)
                {
                    1f, 1f, 1f
                });
                CRenderer.Render(texChar);
                tex0.Clear();
                Thread.Sleep(16);
            }

            Rasterizer.EndRasterize();
        }
예제 #3
0
        public static unsafe void Line()
        {
            if (_pointsPtr[0] == _pointsPtr[1])
            {
                return;
            }

            float xSub = (_pointsPtr[1].X - _pointsPtr[0].X) * _resolution.X,
                  ySub = (_pointsPtr[1].Y - _pointsPtr[0].Y) * _resolution.Y;

            //0: X-major 1:Y-major
            int   dir, otherDir;
            int   dirStep, otherDirStep;
            float slopeAbs;

            if ((xSub > 0 ? xSub : -xSub) >= (ySub > 0 ? ySub : -ySub))
            {
                dir          = 0;
                dirStep      = xSub > 0 ? 1 : -1;
                otherDirStep = ySub > 0 ? 1 : -1;
                slopeAbs     = ySub / xSub;
            }
            else
            {
                dir          = 1;
                dirStep      = ySub > 0 ? 1 : -1;
                otherDirStep = xSub > 0 ? 1 : -1;
                slopeAbs     = xSub / ySub;
            }
            otherDir = 1 - dir;
            if (slopeAbs < 0)
            {
                slopeAbs = -slopeAbs;
            }

            Vector2Int resultPoint = new Vector2Int(JMath.RoundToInt(_pointsPtr[0].X * _resolution.X), JMath.RoundToInt(_pointsPtr[0].Y * _resolution.Y));

            if (resultPoint.X == _resolution.X)
            {
                resultPoint.X--;
            }
            if (resultPoint.Y == _resolution.Y)
            {
                resultPoint.Y--;
            }

            //End coordinate in Int
            int end = JMath.RoundToInt(_pointsPtr[1][dir] * _resolution[dir]);

            for (float otherDirFrac = slopeAbs; resultPoint[dir] != end; otherDirFrac += slopeAbs, resultPoint[dir] += dirStep)
            {
                _rasterizeBufferPtr[_rasterizeBufferUsed++] = resultPoint;
                if (otherDirFrac >= 1f)
                {
                    resultPoint[otherDir] += otherDirStep;
                    otherDirFrac--;
                }
            }
            _pointsPtr += 2;
        }
예제 #4
0
        private unsafe void FillDownSampler4X4(int srcWidth, int srcHeight, Vector2 *pter, bool shift = true)
        {
            int   idx = 0;
            float tU  = 1.0f / (float)srcWidth;
            float tV  = 1.0f / (float)srcHeight;

            for (float y = 0; y < 4; y++)
            {
                for (float x = 0; x < 4; x++)
                {
                    if (shift)
                    {
                        pter[idx].X = (x - 1.0f) * tU;
                        pter[idx].Y = (y - 1.0f) * tV;
                    }
                    else
                    {
                        pter[idx].X = x * tU;
                        pter[idx].Y = y * tV;
                    }

                    idx++;
                }
            }
        }
예제 #5
0
        private int AssemblePrimitive(Model model, Vector2 *screenCoords)
        {
            int[] indices = model.Indices;
            int   i, j;

            switch (_assembleMode)
            {
            case PrimitiveAssembleMode.Line:
                for (i = indices.Length - 2, j = i / 2, _linePrimitives.AddEmpty(j + 1); i > -1; i -= 2, j--)
                {
                    AssemblePrimitve(model, screenCoords, i, _linePrimitives.GetPointer(j));
                }
                return(indices.Length / 2);

            case PrimitiveAssembleMode.Triangle:
                for (i = indices.Length - 3, j = i / 3, _trianglePrimitives.AddEmpty(j + 1); i > -1; i -= 3, j--)
                {
                    AssemblePrimitve(model, screenCoords, i, _trianglePrimitives.GetPointer(j));
                }
                return(indices.Length / 3);

            case PrimitiveAssembleMode.LineTriangle:
                for (i = indices.Length - 3, j = i, _linePrimitives.AddEmpty(j + 3); i > -1; i -= 3, j -= 3)
                {
                    AssemblePrimitve(model, screenCoords, i, _linePrimitives.GetPointer(j));
                    AssemblePrimitve(model, screenCoords, i + 1, _linePrimitives.GetPointer(j + 1));
                    AssemblePrimitve(model, screenCoords, i + 2, _linePrimitives.GetPointer(j + 2));
                }
                return(indices.Length);
            }
            return(0);
        }
예제 #6
0
        private static void selectDiagonal(Vector3 *points, int num, Vector3 *maxColor, Vector3 *minColor)
        {
            Vector3  center = (*maxColor + *minColor) * 0.5f;
            Vector3  t;
            Vector2 *tp = (Vector2 *)&t;

            Vector2 covariance = new Vector2();

            for (uint i = 0; i < num; i++)
            {
                t           = points[i] - center;
                covariance += *tp * t._z;
            }

            float x0 = maxColor->_x;
            float y0 = maxColor->_y;
            float x1 = minColor->_x;
            float y1 = minColor->_y;

            if (covariance._x < 0)
            {
                VoidPtr.Swap(&x0, &x1);
            }

            if (covariance._y < 0)
            {
                VoidPtr.Swap(&y0, &y1);
            }

            maxColor->_x = x0;
            maxColor->_y = y0;

            minColor->_x = x1;
            minColor->_y = y1;
        }
예제 #7
0
 public VertexCodec(Vector2 *sPtr, int count)
 {
     _srcCount    = count;
     _srcElements = 2;
     _pData       = (float *)sPtr;
     Evaluate(false);
 }
예제 #8
0
        /// <summary>
        ///     Gets offset and velocity.
        /// </summary>
        /// <param name="offset">   [in,out] If non-, the offset. </param>
        /// <param name="velocity"> [in,out] If non-, the velocity. </param>
        public unsafe void GetOffsetAndVelocity(Vector2 *offset, Vector2 *velocity)
        {
            Random2.Default.NextUnitVector(velocity);
            switch (Random2.Default.Next(4))
            {
            case 0:
            {
                offset->X = Width * -0.5f;
                offset->Y = Random2.Default.NextSingle(Height * -0.5f, Height * 0.5f);
                break;
            }

            case 1:
            {
                offset->X = Random2.Default.NextSingle(Width * -0.5f, Width * 0.5f);
                offset->Y = Height * -0.5f;
                break;
            }

            case 2:
            {
                offset->X = Width * 0.5f;
                offset->Y = Random2.Default.NextSingle(Height * -0.5f, Height * 0.5f);
                break;
            }

            default:     // catch 3
            {
                offset->X = Random2.Default.NextSingle(Width * -0.5f, Width * 0.5f);
                offset->Y = Height * 0.5f;
                break;
            }
            }
        }
예제 #9
0
        private unsafe void DrawDisconnectedIndicator()
        {
            MyPlayer player;

            MyPlayer.PlayerId?savedPlayer = (base.Entity as MyCharacter).SavedPlayer;
            if (((savedPlayer != null) && (savedPlayer.Value.SerialId == 0)) && !MySession.Static.Players.TryGetPlayerById(savedPlayer.Value, out player))
            {
                Vector3D vectord = (base.Entity.PositionComp.GetPosition() + (base.Entity.PositionComp.LocalAABB.Height * base.Entity.PositionComp.WorldMatrix.Up)) + (base.Entity.PositionComp.WorldMatrix.Up * 0.20000000298023224);
                double   num     = Vector3D.Distance(MySector.MainCamera.Position, vectord);
                if (num <= MAX_DISCONNECT_ICON_DISTANCE)
                {
                    Color  white     = Color.White;
                    Color *colorPtr1 = (Color *)ref white;
                    colorPtr1.A = (byte)(white.A * ((float)Math.Min(1.0, Math.Max((double)0.0, (double)((MAX_DISCONNECT_ICON_DISTANCE - num) / 10.0)))));
                    MyGuiDrawAlignEnum drawAlign = MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_BOTTOM;
                    MyGuiPaddedTexture texture   = MyGuiConstants.TEXTURE_DISCONNECTED_PLAYER;
                    Vector3D           vectord2  = Vector3D.Transform(vectord, MySector.MainCamera.ViewMatrix * MySector.MainCamera.ProjectionMatrix);
                    if (vectord2.Z < 1.0)
                    {
                        Vector2 hudPos = new Vector2((float)vectord2.X, (float)vectord2.Y);
                        hudPos = (hudPos * 0.5f) + (0.5f * Vector2.One);
                        Vector2 *vectorPtr1 = (Vector2 *)ref hudPos;
                        vectorPtr1->Y = 1f - hudPos.Y;
                        Vector2 normalizedCoord = MyGuiScreenHudBase.ConvertHudToNormalizedGuiPosition(ref hudPos);
                        MyGuiManager.DrawSpriteBatch(texture.Texture, normalizedCoord, (texture.SizeGui * 0.5f) * (1f - (((float)num) / ((float)MAX_DISCONNECT_ICON_DISTANCE))), white, drawAlign, false, true);
                    }
                }
            }
        }
예제 #10
0
 private void setUV(Vector2 *xy, Vector2 *uv)
 {
     for (int i = 0; i < 6; ++i)
     {
         uv[i] = (xy[i] + Vector2.one * 0.5f) / textureSize;
     }
 }
예제 #11
0
        internal unsafe void GetWitnessPoints(Vector2 *pA, Vector2 *pB)
        {
            switch (_count)
            {
            case 0:
                break;

            case 1:
                *pA = _v1.wA;
                *pB = _v1.wB;
                break;

            case 2:
                *pA = _v1.a * _v1.wA + _v2.a * _v2.wA;
                *pB = _v1.a * _v1.wB + _v2.a * _v2.wB;
                break;

            case 3:
                *pA = _v1.a * _v1.wA + _v2.a * _v2.wA + _v3.a * _v3.wA;
                *pB = *pA;
                break;

            default:
                break;
            }
        }
            private unsafe void UpdateStream(int index)
            {
                index += 4;
                if (_manager._faceData[index] == null || !_enabled[index - 4])
                {
                    return;
                }

                //Set starting address
                byte *pDst = (byte *)_renderBuffer.Address;

                for (int i = 4; i < index; i++)
                {
                    if (_manager._faceData[i] != null && _enabled[i - 4])
                    {
                        pDst += 8;
                    }
                }

                Vector2 *pSrc = (Vector2 *)_manager._faceData[index].Address;

                for (int i = 0; i < _manager._pointCount; i++, pDst += _stride)
                {
                    *(Vector2 *)pDst = *pSrc++;
                }
            }
예제 #13
0
        private unsafe void GetWindowSize(ImGuiViewportPtr vp, Vector2 *outSize)
        {
            VeldridImGuiWindow window = (VeldridImGuiWindow)GCHandle.FromIntPtr(vp.PlatformUserData).Target;
            Rectangle          bounds = window.Window.Bounds;

            *outSize = new Vector2(bounds.Width, bounds.Height);
        }
예제 #14
0
        public void Execute(int i)
        {
            Vector2 *resultV = result + i;
            byte *   off     = input + i * byteStride;

            *resultV = *(Vector2 *)off;
            (*resultV).y = 1 - (*resultV).y;
        }
예제 #15
0
        private unsafe void Move(float deltaPos)
        {
            Vector2  anchoredPosition = this.contentRoot.anchoredPosition;
            Vector2 *vectorPtr1       = &anchoredPosition;

            vectorPtr1->x -= deltaPos;
            this.contentRoot.anchoredPosition = anchoredPosition;
        }
 private unsafe static extern bool ProcessImage(
     Vector2 *resultArray,
     Color32[] rawImage,
     Vector2 userInput,
     int width,
     int height,
     bool rotated
     );
예제 #17
0
파일: Jobs.cs 프로젝트: p-skakun/glTFast
        public void Execute(int i)
        {
            Vector2 *resultV = (Vector2 *)(((byte *)result) + (i * outputByteStride));
            byte *   off     = input + (i * inputByteStride);

            *resultV = *(Vector2 *)off;
            (*resultV).y = 1 - (*resultV).y;
        }
예제 #18
0
        public override unsafe void RenderSprites(RenderingTextureAllocator textureAllocator, bool linearFilter, params Sprite[] sprites)
        {
            Vector2 textureScaling = new Vector2(16777216.0f) / new Vector2(textureAllocator.Size.X, textureAllocator.Size.Y);

            // Build vertex buffer
            int vertexCount = sprites.Length * 6;
            int bufferSize  = vertexCount * (sizeof(Vector2) + sizeof(ulong));

            fixed(byte *data = new byte[bufferSize])
            {
                Vector2 *positions = (Vector2 *)(data);
                ulong *  uvws      = (ulong *)(data + vertexCount * sizeof(Vector2));

                // Setup vertices
                int count = sprites.Length;

                for (int i = 0; i < count; ++i)
                {
                    Sprite     sprite  = sprites[i];
                    VectorInt3 texPos  = textureAllocator.Get(sprite.Texture);
                    VectorInt2 texSize = sprite.Texture.To - sprite.Texture.From;

                    positions[i * 6 + 0] = sprite.Pos00;
                    positions[i * 6 + 2] = positions[i * 6 + 3] = sprite.Pos10;
                    positions[i * 6 + 1] = positions[i * 6 + 4] = sprite.Pos01;
                    positions[i * 6 + 5] = sprite.Pos11;
                    uvws[i * 6 + 1]      = uvws[i * 6 + 4] = Dx11RenderingDevice.CompressUvw(texPos, textureScaling, new Vector2(0.5f, 0.5f));
                    uvws[i * 6 + 5]      = Dx11RenderingDevice.CompressUvw(texPos, textureScaling, new Vector2(texSize.X - 0.5f, 0.5f));
                    uvws[i * 6 + 0]      = Dx11RenderingDevice.CompressUvw(texPos, textureScaling, new Vector2(0.5f, texSize.Y - 0.5f));
                    uvws[i * 6 + 2]      = uvws[i * 6 + 3] = Dx11RenderingDevice.CompressUvw(texPos, textureScaling, new Vector2(texSize.X - 0.5f, texSize.Y - 0.5f));
                }

                // Create GPU resources
                using (var VertexBuffer = new Buffer(Device.Device, new IntPtr(data),
                                                     new BufferDescription(bufferSize, ResourceUsage.Immutable, BindFlags.VertexBuffer,
                                                                           CpuAccessFlags.None, ResourceOptionFlags.None, 0)))
                {
                    var VertexBufferBindings = new VertexBufferBinding[] {
                        new VertexBufferBinding(VertexBuffer, sizeof(Vector2), (int)((byte *)positions - data)),
                        new VertexBufferBinding(VertexBuffer, sizeof(ulong), (int)((byte *)uvws - data))
                    };

                    // Render
                    Bind();
                    Device.SpriteShader.Apply(Device.Context);
                    Device.Context.PixelShader.SetSampler(0, linearFilter ? Device.SamplerDefault : Device.SamplerRoundToNearest);
                    Device.Context.PixelShader.SetShaderResources(0, ((Dx11RenderingTextureAllocator)(textureAllocator)).TextureView);
                    Device.Context.InputAssembler.SetVertexBuffers(0, VertexBufferBindings);
                    Device.Context.OutputMerger.SetDepthStencilState(Device.DepthStencilNoZBuffer);

                    // Render
                    Device.Context.Draw(vertexCount, 0);

                    // Reset state
                    Device.Context.OutputMerger.SetDepthStencilState(Device.DepthStencilDefault);
                }
            }
        }
예제 #19
0
        public unsafe static Vector2[] GetUVsFloatInterleaved(
            ref byte[] bytes,
            int start,
            int count,
            int byteStride
            )
        {
            Profiler.BeginSample("GetUVsFloatInterleaved");
            var res = new Vector2[count];

            int elementSize = Marshal.SizeOf(typeof(Vector2));

#if BUFFER_MEMORY_COPY
            fixed(Vector2 *dest = &(res[0]))
            {
                Vector2 *destV = dest;

                fixed(byte *src = &(bytes[start]))
                {
                    byte *off = src;

                    for (int i = 0; i < count; i++)
                    {
                        System.Buffer.MemoryCopy(
                            off,
                            destV,
                            elementSize,
                            elementSize
                            );
                        off   += byteStride;
                        destV += 1;
                    }
                }
            }
#else
            var gcRes = GCHandle.Alloc(res, GCHandleType.Pinned);

            int off  = start;
            var dest = gcRes.AddrOfPinnedObject();

            for (int i = 0; i < count; i++)
            {
                Marshal.Copy(bytes, off, dest, elementSize);
                off  += byteStride;
                dest += elementSize;
            }

            gcRes.Free();
#endif
            for (var i = 0; i < count; i++)
            {
                res[i].y = 1 - res[i].y;
            }

            Profiler.EndSample();
            return(res);
        }
예제 #20
0
        private static unsafe float XIntercept(Vector2 *p, Vector2 *q, float y)
        {
            if (Math.Abs(p->Y - q->Y) < float.Epsilon)
            {
                throw new ArgumentException("unexpected horizontal segment");
            }

            return(q->X - ((q->Y - y) * ((p->X - q->X) / (p->Y - q->Y))));
        }
예제 #21
0
        private unsafe void Start()
        {
            RectTransform component  = this.inputField.InputField.gameObject.GetComponent <RectTransform>();
            Vector2       pivot      = component.pivot;
            Vector2 *     vectorPtr1 = &pivot;

            vectorPtr1->y  += this.yPivotOffset;
            component.pivot = pivot;
        }
예제 #22
0
        private void setXY(float baseX, float baseY, float width, float height, Vector2 *xy)
        {
            xy[0] = new Vector2(baseX + width, /**/ baseY);
            xy[1] = new Vector2(baseX, /**/ baseY + height);
            xy[2] = new Vector2(baseX + 2 * width, /**/ baseY + height);

            xy[3] = new Vector2(baseX + 2 * width + spacing, baseY + height);
            xy[4] = new Vector2(baseX + 3 * width + spacing, baseY);
            xy[5] = new Vector2(baseX + width + spacing, /**/ baseY);
        }
예제 #23
0
        private unsafe void Awake()
        {
            this.nextUpgrade.SetActive(this.showNextUpgradeValue);
            RectTransform component  = this.upgradeGlow.GetComponent <RectTransform>();
            Vector2       sizeDelta  = component.sizeDelta;
            Vector2 *     vectorPtr1 = &sizeDelta;

            vectorPtr1->x      *= 100f / ((float)UpgradablePropertiesUtils.MAX_LEVEL);
            component.sizeDelta = sizeDelta;
        }
예제 #24
0
        private unsafe void GetWindowPos(ImGuiViewportPtr vp, Vector2 *outPos)
        {
            VeldridImGuiWindow?window = (VeldridImGuiWindow?)GCHandle.FromIntPtr(vp.PlatformUserData).Target;

            if (window == null)
            {
                throw new NullReferenceException();
            }
            *outPos = new Vector2(window.Window.Bounds.X, window.Window.Bounds.Y);
        }
예제 #25
0
        /// <summary>
        ///     Gets offset and velocity.
        /// </summary>
        /// <param name="offset">   [in,out] If non-, the offset. </param>
        /// <param name="velocity"> [in,out] If non-, the velocity. </param>
        public unsafe void GetOffsetAndVelocity(Vector2 *offset, Vector2 *velocity)
        {
            offset->X = 0;
            offset->Y = 0;

            double angle = Math.Atan2(Direction.Y, Direction.X);

            angle       = Random2.Default.NextDouble(angle - Spread, angle + Spread);
            velocity->X = (float)Math.Cos(angle);
            velocity->Y = (float)Math.Sin(angle);
        }
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello, world!");
            Vector2  result;
            Vector2 *resultP = ReturnsVec2(out result);

            Console.WriteLine($"ReturnsVec2 = {result} ({resultP == &result})");
            CdeclCallbackTest(TestCallback);
            StdcallCallbackTest(TestCallback);
            Console.WriteLine("Done.");
            Console.ReadLine();
        }
예제 #27
0
        private unsafe Matrix4x4 GetOrthographicProjectionMatrix(Vector2 offset)
        {
            float    orthographicSize = base.context.camera.orthographicSize;
            float    num2             = orthographicSize * base.context.camera.aspect;
            Vector2 *vectorPtr1       = &offset;

            vectorPtr1->x *= num2 / (0.5f * base.context.width);
            Vector2 *vectorPtr2 = &offset;

            vectorPtr2->y *= orthographicSize / (0.5f * base.context.height);
            return(Matrix4x4.Ortho(offset.x - num2, offset.x + num2, offset.y - orthographicSize, offset.y + orthographicSize, base.context.camera.nearClipPlane, base.context.camera.farClipPlane));
        }
예제 #28
0
        private static void WriteUVs(string name, Vector2 *pData, int count, int set, XmlWriter writer)
        {
            bool first = true;

            //Position source
            writer.WriteStartElement("source");
            writer.WriteAttributeString("id", name + "_UVs" + set.ToString());

            //Array start
            writer.WriteStartElement("float_array");
            writer.WriteAttributeString("id", name + "_UVArr" + set.ToString());
            writer.WriteAttributeString("count", (count * 2).ToString());

            for (int i = 0; i < count; i++)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                    writer.WriteString(" ");
                }

                //Reverse T component to a top-down form
                writer.WriteString(String.Format("{0} {1}", pData->_x, 1.0 - pData->_y));
                pData++;
            }

            writer.WriteEndElement(); //int_array

            //Technique
            writer.WriteStartElement("technique_common");

            writer.WriteStartElement("accessor");
            writer.WriteAttributeString("source", "#" + name + "_UVArr" + set.ToString());
            writer.WriteAttributeString("count", count.ToString());
            writer.WriteAttributeString("stride", "2");

            writer.WriteStartElement("param");
            writer.WriteAttributeString("name", "S");
            writer.WriteAttributeString("type", "float");
            writer.WriteEndElement(); //param
            writer.WriteStartElement("param");
            writer.WriteAttributeString("name", "T");
            writer.WriteAttributeString("type", "float");
            writer.WriteEndElement(); //param

            writer.WriteEndElement(); //accessor
            writer.WriteEndElement(); //technique_common

            writer.WriteEndElement(); //source
        }
예제 #29
0
        public void Execute()
        {
            Vector2 *resultV = result;
            byte *   off     = input;

            for (int i = 0; i < count; i++)
            {
                *resultV = *(Vector2 *)off;
                off     += byteStride;
                resultV += 1;
            }
        }
예제 #30
0
        private unsafe void GetWindowSize(ImGuiViewportPtr vp, Vector2 *outSize)
        {
            VeldridImGuiWindow?window = (VeldridImGuiWindow?)GCHandle.FromIntPtr(vp.PlatformUserData).Target;

            if (window == null)
            {
                throw new NullReferenceException();
            }
            Rectangle bounds = window.Window.Bounds;

            *outSize = new Vector2(bounds.Width, bounds.Height);
        }