Exemplo n.º 1
0
    void TestSplit()
    {
        if (m_bpatch == null)
        {
            return;
        }

        if (m_splited[0] == null)
        {
            for (int i = 0; i < m_splited.Length; ++i)
            {
                m_splited[i] = new BezierPatch();
            }
        }

        var uv = new Vector2(0.5f, 0.5f);

        if (m_use_compute_shader)
        {
            if (m_buf_split == null)
            {
                m_buf_split = new ComputeBuffer(1, SizeOf <TestSplitData>());
            }
            m_bpatch.bpatch.GetRawData(ref m_data_split[0].bp);
            m_data_split[0].uv = uv;

            int k = m_debug_cs.FindKernel("TestSplit");
            m_buf_split.SetData(m_data_split);
            m_debug_cs.SetBuffer(k, "_TestSplitData", m_buf_split);
            m_debug_cs.Dispatch(k, 1, 1, 1);
            m_buf_split.GetData(m_data_split);

            m_splited[0].SetRawData(ref m_data_split[0].dst0);
            m_splited[1].SetRawData(ref m_data_split[0].dst1);
            m_splited[2].SetRawData(ref m_data_split[0].dst2);
            m_splited[3].SetRawData(ref m_data_split[0].dst3);
        }
        else
        {
            m_bpatch.bpatch.Split(
                ref m_splited[0], ref m_splited[1], ref m_splited[2], ref m_splited[3], ref uv);
        }
    }
Exemplo n.º 2
0
        public override MapItem Deserialize(BinaryReader r)
        {
            var bp = new BezierPatch(false);

            ReadKdopItem(r, bp);

            bp.ControlPoints = new Vector3[BezierPatch.ControlPointCols,
                                           BezierPatch.ControlPointRows];

            for (int x = 0; x < BezierPatch.ControlPointCols; x++)
            {
                for (int z = 0; z < BezierPatch.ControlPointRows; z++)
                {
                    bp.ControlPoints[x, z] = r.ReadVector3();
                }
            }
            bp.ControlPoints = Utils.MirrorX(bp.ControlPoints);

            bp.XTesselation = r.ReadUInt16();
            bp.ZTesselation = r.ReadUInt16();

            bp.UVRotation = r.ReadSingle();

            bp.Node = new UnresolvedNode(r.ReadUInt64());

            bp.RandomSeed = r.ReadUInt32();

            for (int i = 0; i < bp.Vegetation.Length; i++)
            {
                bp.Vegetation[i].Name    = r.ReadToken();
                bp.Vegetation[i].Density = r.ReadUInt16() / vegDensityFactor;
                bp.Vegetation[i].Scale   = (VegetationScale)r.ReadByte();
            }
            bp.VegetationSpheres = ReadObjectList <VegetationSphere>(r);

            bp.QuadData = new TerrainQuadData();
            bp.QuadData.Deserialize(r);

            return(bp);
        }
Exemplo n.º 3
0
        public void LoadFromFile(string filename)
        {
            var   p = new XMLSerializer();
            Scene scene;

            try
            {
                scene = p.DeserializeFromFile(filename);
            }
            catch (Exception)
            {
                return;
            }


            ClearScene();

            var catPoints = new List <CatPoint>(scene.Points.Length);

            for (int i = 0; i < scene.Points.Length; i++)
            {
                var pos = scene.Points[i].Position;
                var pt  = CreateCatPoint(new Vector3(pos.X, pos.Y, pos.Z), false);
                pt.Name = scene.Points[i].Name;
                catPoints.Add(pt);
            }


            foreach (var bezierCurveC0 in scene.BezierCurvesC0)
            {
                var curve = new Bezier(bezierCurveC0.Points.Select(x => catPoints[x]), this)
                {
                    Name = bezierCurveC0.Name
                };
                if (bezierCurveC0.DisplayPolygonSpecified)
                {
                    curve.ShowPolygon = bezierCurveC0.DisplayPolygon;
                }
                AddNewModel(curve);
            }

            foreach (var bezierCurveC2 in scene.BezierCurvesC2)
            {
                var curve = new BezierC2(bezierCurveC2.Points.Select(x => catPoints[x]), this)
                {
                    Name = bezierCurveC2.Name
                };
                if (bezierCurveC2.DisplayPolygonSpecified)
                {
                    curve.ShowPolygon = bezierCurveC2.DisplayPolygon;
                }
                AddNewModel(curve);
            }

            foreach (var interpolationBezierCurveC2 in scene.InterpolationBezierCurvesC2)
            {
                var curve = new BsplineInterpolator(interpolationBezierCurveC2.Points.Select(x => catPoints[x]), this)
                {
                    Name = interpolationBezierCurveC2.Name
                };
                if (interpolationBezierCurveC2.DisplayPolygonSpecified)
                {
                    curve.ShowPolygon = interpolationBezierCurveC2.DisplayPolygon;
                }
                AddNewModel(curve);
            }

            foreach (var bezierSurfaceC0 in scene.BezierSurfacesC0)
            {
                var patches = new List <Patch>();
                var ptches  = new Patch[bezierSurfaceC0.PatchesV, bezierSurfaceC0.PatchesU];
                foreach (var bezierSurfaceC0Patch in bezierSurfaceC0.Patches)
                {
                    var pts = new CatPoint[4, 4];
                    for (int i = 0; i < 4; i++)
                    {
                        for (int j = 0; j < 4; j++)
                        {
                            pts[i, j] = catPoints[bezierSurfaceC0Patch.Points[j, i]];
                        }
                    }
                    var patch = new BezierPatch(pts)
                    {
                        ShowPolygon = false,
                        HeightDiv   = bezierSurfaceC0Patch.SurfaceDivisionsV,
                        WidthDiv    = bezierSurfaceC0Patch.SurfaceDivisionsU,
                        Name        = bezierSurfaceC0Patch.Name,
                        VPos        = bezierSurfaceC0Patch.PatchU,
                        UPos        = bezierSurfaceC0Patch.PatchV
                    };
                    AddNewModel(patch);
                    patches.Add(patch);
                    ptches[bezierSurfaceC0Patch.PatchV, bezierSurfaceC0Patch.PatchU] = patch;
                }


                var surfacePoints = patches.SelectMany(x => x.EnumerateCatPoints()).Distinct().ToList();
                var surface       = new Surface(SurfaceType.Bezier, ptches, surfacePoints, this, false, false)
                {
                    Name     = bezierSurfaceC0.Name,
                    PatchesU = bezierSurfaceC0.PatchesU,
                    PatchesV = bezierSurfaceC0.PatchesV,
                };
                AddNewModel(surface);
            }

            foreach (var bezierSurfaceC2 in scene.BezierSurfacesC2)
            {
                var patches = new List <Patch>();
                var ptches  = new Patch[bezierSurfaceC2.PatchesV, bezierSurfaceC2.PatchesU];

                foreach (var bezierSurfaceC2Patch in bezierSurfaceC2.Patches)
                {
                    var pts = new CatPoint[4, 4];
                    for (int i = 0; i < 4; i++)
                    {
                        for (int j = 0; j < 4; j++)
                        {
                            pts[i, j] = catPoints[bezierSurfaceC2Patch.Points[j, i]];
                        }
                    }
                    var patch = new BSplinePatch(pts)
                    {
                        ShowPolygon = false,
                        HeightDiv   = bezierSurfaceC2Patch.SurfaceDivisionsV,
                        WidthDiv    = bezierSurfaceC2Patch.SurfaceDivisionsU,
                        Name        = bezierSurfaceC2Patch.Name,
                        UPos        = bezierSurfaceC2Patch.PatchU,
                        VPos        = bezierSurfaceC2Patch.PatchV
                    };
                    AddNewModel(patch);
                    patches.Add(patch);
                    ptches[bezierSurfaceC2Patch.PatchV, bezierSurfaceC2Patch.PatchU] = patch;
                }
                var loopedV = true;
                var loopedU = true;


                for (int i = 0; i < 3; i++)
                {
                    var pat  = ptches[0, 0].GetCatPoint(i, 0);
                    var pat2 = ptches[0, bezierSurfaceC2.PatchesU - 1].GetCatPoint(i + 1, 0);
                    if (pat != pat2 ||
                        ptches[0, 0].GetCatPoint(i, 1) != ptches[0, bezierSurfaceC2.PatchesU - 1].GetCatPoint(i + 1, 1) ||
                        ptches[0, 0].GetCatPoint(i, 2) != ptches[0, bezierSurfaceC2.PatchesU - 1].GetCatPoint(i + 1, 2))
                    {
                        loopedU = false;
                        break;
                    }
                }

                if (loopedU)
                {
                    for (int i = 0; i < ptches.GetLength(0); i++)
                    {
                        if (ptches[i, 0].GetCatPoint(0, 3) != ptches[i, bezierSurfaceC2.PatchesU - 1].GetCatPoint(1, 3) ||
                            ptches[i, 0].GetCatPoint(1, 3) != ptches[i, bezierSurfaceC2.PatchesU - 1].GetCatPoint(2, 3) ||
                            ptches[i, 0].GetCatPoint(2, 3) != ptches[i, bezierSurfaceC2.PatchesU - 1].GetCatPoint(3, 3))
                        {
                            loopedU = false;
                            break;
                        }
                    }
                }

                for (int i = 0; i < 3; i++)
                {
                    if (ptches[0, 0].GetCatPoint(0, i) != ptches[bezierSurfaceC2.PatchesV - 1, 0].GetCatPoint(0, i + 1) ||
                        ptches[0, 0].GetCatPoint(0, i) != ptches[bezierSurfaceC2.PatchesV - 1, 0].GetCatPoint(0, i + 1) ||
                        ptches[0, 0].GetCatPoint(0, i) != ptches[bezierSurfaceC2.PatchesV - 1, 0].GetCatPoint(0, i + 1))
                    {
                        loopedV = false;
                        break;
                    }
                }

                if (loopedV)
                {
                    for (int i = 0; i < ptches.GetLength(1); i++)
                    {
                        if (ptches[0, i].GetCatPoint(3, 0) != ptches[bezierSurfaceC2.PatchesV - 1, i].GetCatPoint(3, 1) ||
                            ptches[0, i].GetCatPoint(3, 1) != ptches[bezierSurfaceC2.PatchesV - 1, i].GetCatPoint(3, 2) ||
                            ptches[0, i].GetCatPoint(3, 2) != ptches[bezierSurfaceC2.PatchesV - 1, i].GetCatPoint(3, 3))
                        {
                            loopedV = false;
                            break;
                        }
                    }
                }
                if (loopedU == loopedV)
                {
                    Console.WriteLine($"Surf: {bezierSurfaceC2.Name}");
                }

                var surfacePoints = patches.SelectMany(x => x.EnumerateCatPoints()).Distinct().ToList();
                var surface       = new Surface(SurfaceType.BSpline, ptches, surfacePoints, this, loopedU, loopedV)
                {
                    Name     = bezierSurfaceC2.Name,
                    PatchesU = bezierSurfaceC2.PatchesU,
                    PatchesV = bezierSurfaceC2.PatchesV
                };
                AddNewModel(surface);
            }
        }
Exemplo n.º 4
0
        private void ConvertToBezierPatches(SceneData scene)
        {
            int widthPoints  = UDensity * 3 + 1;
            int heightPoints = VDensity * 3 + 1;

            if (changed || points.Count == 0)
            {
                GenerateModel();
            }
            var catPoints = new CatPoint[heightPoints, widthPoints];
            var matrix    = GetMatrix(false, new Vector3());

            if (!Curved)
            {
                for (int i = 0; i < widthPoints; i++)
                {
                    for (int j = 0; j < heightPoints; j++)
                    {
                        var pt = points[i * heightPoints + j];
                        catPoints[j, i] = scene.CreateCatPoint((matrix * new Vector4(pt)).ClipToVector3());
                    }
                }
            }
            else
            {
                bool cylinder = System.Math.Abs(CurvatureAngle - 360) < Utils.Eps;

                for (int i = 0; i < widthPoints - (cylinder ? 1 : 0); i++)
                {
                    for (int j = 0; j < heightPoints; j++)
                    {
                        Vector3 pt;
                        if (i % 3 != 0)
                        {
                            int ai = i - i % 3;
                            int ci = ai + 3;
                            var p  = (points[(ai + 1) * heightPoints + j] + points[(ai + 2) * heightPoints + j]);
                            var b  = p - (points[ai * heightPoints + j] + points[ci * heightPoints + j]) / 2;

                            var pot = i % 3 == 1 ? points[ai * heightPoints + j] : points[ci * heightPoints + j];

                            pt = b * 2 / 3.0 + pot * 1 / 3.0;
                        }
                        else
                        {
                            pt = points[i * heightPoints + j];
                        }
                        catPoints[j, i] = scene.CreateCatPoint((matrix * new Vector4(pt)).ClipToVector3());
                    }
                }
                if (cylinder)
                {
                    for (int j = 0; j < heightPoints; j++)
                    {
                        catPoints[j, widthPoints - 1] = catPoints[j, 0];
                    }
                }
            }
            scene.RemoveModel(this);
            var subArray = new CatPoint[4, 4];
            var ptchs    = new Patch[VDensity, UDensity];

            for (int i = 0; i < UDensity; i++)
            {
                for (int j = 0; j < VDensity; j++)
                {
                    for (int x = 0; x < 4; x++)
                    {
                        for (int y = 0; y < 4; y++)
                        {
                            subArray[y, x] = catPoints[j * 3 + y, i * 3 + x];
                        }
                    }
                    var patch = new BezierPatch(subArray)
                    {
                        UPos = i,
                        VPos = j
                    };
                    scene.AddNewModel(patch);
                    ptchs[j, i] = patch;
                }
            }
            var catPointsList = new List <CatPoint>(catPoints.GetLength(0) * catPoints.GetLength(1));

            foreach (var catPoint in catPoints)
            {
                catPointsList.Add(catPoint);
            }
            scene.AddNewModel(new Surface(SurfaceType.Bezier, ptchs, catPointsList, scene, IsCylinder, false)
            {
                PatchesU = UDensity, PatchesV = VDensity
            });
        }
Exemplo n.º 5
0
        private void btnAddNewObject_Click(object sender, EventArgs e)
        {
            Point3D[,] patchControlPoints;
            Point3D[] ninePoints = new Point3D[9];

            #region Создаем девять точек
            ninePoints[0] = new Point3D(
                Convert.ToDouble(txtObjPoint1X.Text),
                Convert.ToDouble(txtObjPoint1Y.Text),
                Convert.ToDouble(txtObjPoint1Z.Text)
                );
            ninePoints[1] = new Point3D(
                Convert.ToDouble(txtObjPoint2X.Text),
                Convert.ToDouble(txtObjPoint2Y.Text),
                Convert.ToDouble(txtObjPoint2Z.Text)
                );
            ninePoints[2] = new Point3D(
                Convert.ToDouble(txtObjPoint3X.Text),
                Convert.ToDouble(txtObjPoint3Y.Text),
                Convert.ToDouble(txtObjPoint3Z.Text)
                );
            ninePoints[3] = new Point3D(
                Convert.ToDouble(txtObjPoint4X.Text),
                Convert.ToDouble(txtObjPoint4Y.Text),
                Convert.ToDouble(txtObjPoint4Z.Text)
                );
            ninePoints[4] = new Point3D(
                Convert.ToDouble(txtObjPoint5X.Text),
                Convert.ToDouble(txtObjPoint5Y.Text),
                Convert.ToDouble(txtObjPoint5Z.Text)
                );
            ninePoints[5] = new Point3D(
                Convert.ToDouble(txtObjPoint6X.Text),
                Convert.ToDouble(txtObjPoint6Y.Text),
                Convert.ToDouble(txtObjPoint6Z.Text)
                );
            ninePoints[6] = new Point3D(
                Convert.ToDouble(txtObjPoint7X.Text),
                Convert.ToDouble(txtObjPoint7Y.Text),
                Convert.ToDouble(txtObjPoint7Z.Text)
                );
            ninePoints[7] = new Point3D(
                Convert.ToDouble(txtObjPoint8X.Text),
                Convert.ToDouble(txtObjPoint8Y.Text),
                Convert.ToDouble(txtObjPoint8Z.Text)
                );
            ninePoints[8] = new Point3D(
                Convert.ToDouble(txtObjShapeControlPointX.Text),
                Convert.ToDouble(txtObjShapeControlPointY.Text),
                Convert.ToDouble(txtObjShapeControlPointZ.Text)
                );
            #endregion

            patchControlPoints = getBezierPatchPoinsFrom9Points(ninePoints);

            // Создаем наш объект
            // Тут должны задаваться и передаваться параметры объекта
            int         detalizationDegree = Convert.ToInt32(txtObjDetalization.Text);
            BezierPatch bezierPatch        = new BezierPatch(patchControlPoints, detalizationDegree);

            //bezierPatch.setID(objectCounter);
            // Устанавливаем id для фигуры и ее составляющих
            if (tempObjectNumber != -1)
            {
                bezierPatch.setID(tempObjectNumber);

                // Добавляем объект в комбобокс
                cbObjects.Items.Add("object_" + tempObjectNumber++);

                tempObjectNumber = -1;
            }
            else
            {
                bezierPatch.setID(objectCounter);

                // Добавляем объект в комбобокс
                cbObjects.Items.Add("object_" + objectCounter++);
            }

            // Добавили объект в список
            List <SimpleObject> lToAdd = new List <SimpleObject>();
            lToAdd.Add(bezierPatch);
            bezierPatches.Add(lToAdd);

            // Добавляем объекты в движок
            engine.addObject(bezierPatch);


            // Перерисовываем изображение
            needToReDraw = true;
        }