Example #1
0
        public Transformation CalculateSnap(TileData data, Transformation currentTransformation, List <WorldObject> snaptargetList)
        {
            this.currentTransformation = currentTransformation;

            var temp = new List <ISnappableWorldTarget>();

            temp.AddRange(snaptargetList.Select(o => (ISnappableWorldTarget)o));


            var snapInformation = builder.CreateFromTile(data);
            var transformations = snapper.SnapTo(snapInformation, temp);

            transformations.Sort(compareTransformations);

            var meBB = new BoundingBox(data.Dimensions * 0.95f * 0.5f, data.Dimensions * 0.95f * 0.5f);

            Transformation transformation;

            for (int i = 0; i < transformations.Count; i++)
            {
                transformation = transformations[i];
                var intersects = false;
                for (int j = 0; j < snaptargetList.Count; j++)
                {
                    var obj = snaptargetList[j];
                    //if (obj == selectedWorldObject) continue;

                    var objBB = new BoundingBox(-obj.ObjectType.TileData.Dimensions * 0.5f, obj.ObjectType.TileData.Dimensions * 0.5f);

                    if (objBB.Transform(obj.WorldMatrix)
                        .Contains(
                            meBB.Transform(transformation.CreateMatrix())) == ContainmentType.Disjoint)
                    {
                        continue;
                    }

                    intersects = true;
                    break;
                }

                if (intersects)
                {
                    continue;
                }

                var maxDist = 10;
                var distSq  = (transformation.Translation - currentTransformation.Translation).LengthSquared();
                if (distSq > maxDist * maxDist)
                {
                    return(currentTransformation);
                }
                return(transformation);
            }

            return(currentTransformation);
        }
        public void TestSnapTo()
        {
            XNAGame game    = new XNAGame();
            var     snapper = new Snapper();

            snapper.AddSnapper(new SnapperPointPoint());
            var builder = new TileSnapInformationBuilder();

            var tileData1 = new TileData(Guid.NewGuid());

            tileData1.Dimensions = new Vector3(1, 2, 3);
            var tileData2 = new TileData(Guid.NewGuid());

            tileData2.Dimensions = new Vector3(2, 2, 5);

            var faceSnapType1 = new TileFaceType(Guid.NewGuid())
            {
                Name = "type1"
            };
            var faceSnapType2 = new TileFaceType(Guid.NewGuid())
            {
                Name = "type2"
            };

            tileData1.SetFaceType(TileFace.Front, faceSnapType1);
            tileData1.SetFaceType(TileFace.Right, faceSnapType2);

            tileData2.SetFaceType(TileFace.Front, faceSnapType1);
            tileData2.SetFaceType(TileFace.Back, faceSnapType1);

            var list = new List <ISnappableWorldTarget>();

            var worldTarget1 = new SimpleSnappableWorldTarget()
            {
                TileData        = tileData1,
                SnapInformation = builder.CreateFromTile(tileData1),
                Transformation  = new Transformation(Vector3.One, Quaternion.Identity, new Vector3(2, 1, 3))
            };
            var worldTarget2 = new SimpleSnappableWorldTarget()
            {
                TileData        = tileData2,
                SnapInformation = builder.CreateFromTile(tileData2),
                Transformation  = new Transformation(Vector3.One, Quaternion.Identity, new Vector3(-2, 1, 1))
            };

            list.Add(worldTarget1);
            list.Add(worldTarget2);

            var tileData1SnapInformation = builder.CreateFromTile(tileData1);

            var transformations = snapper.SnapTo(builder.CreateFromTile(tileData1), list);

            var colorTypeMap = new Dictionary <SnapType, Color>();

            colorTypeMap.Add(worldTarget1.SnapInformation.SnapList[0].SnapType, Color.Red);
            colorTypeMap.Add(worldTarget1.SnapInformation.SnapList[1].SnapType, Color.Green);

            game.DrawEvent += delegate
            {
                for (int i = 0; i < list.Count; i++)
                {
                    var iTarget = (SimpleSnappableWorldTarget)list[i];
                    renderTile(game, iTarget.Transformation.CreateMatrix(), iTarget.TileData, Color.White);

                    renderSnapInformation(game, iTarget.Transformation.CreateMatrix(), iTarget.SnapInformation, colorTypeMap);
                }

                for (int i = 0; i < transformations.Count; i++)
                {
                    var iTransformation = transformations[i];
                    renderTile(game, iTransformation.CreateMatrix(), tileData1, Color.Yellow);
                    renderSnapInformation(game, iTransformation.CreateMatrix(), tileData1SnapInformation, colorTypeMap);
                }
            };

            game.Run();
        }
Example #3
0
        public void TestAddDeleteMeshToFromWorld()
        {
            XNAGame game = new XNAGame();

            OBJParser.ObjImporter importer = new OBJParser.ObjImporter();
            var c = new OBJToRAMMeshConverter(new RAMTextureFactory());

            importer.AddMaterialFileStream("WallInnerCorner.mtl", new FileStream(TWDir.GameData.CreateSubdirectory("Core\\TileEngine") + "/TileSet001/WallInnerCorner.mtl", FileMode.Open));
            importer.ImportObjFile(TWDir.GameData.CreateSubdirectory("Core\\TileEngine") + "/TileSet001/WallInnerCorner.obj");
            var meshWallInnerCorner = c.CreateMesh(importer);

            importer.AddMaterialFileStream("WallStraight.mtl", new FileStream(TWDir.GameData.CreateSubdirectory("Core\\TileEngine") + "/TileSet001/WallStraight.mtl", FileMode.Open));
            importer.ImportObjFile(TWDir.GameData.CreateSubdirectory("Core\\TileEngine") + "/TileSet001/WallStraight.obj");
            var meshWallStraight = c.CreateMesh(importer);

            importer.AddMaterialFileStream("WallOuterCorner.mtl", new FileStream(TWDir.GameData.CreateSubdirectory("Core\\TileEngine") + "/TileSet001/WallOuterCorner.mtl", FileMode.Open));
            importer.ImportObjFile(TWDir.GameData.CreateSubdirectory("Core\\TileEngine") + "/TileSet001/WallOuterCorner.obj");
            var meshWallOuterCorner = c.CreateMesh(importer);

            var texturePool           = new TexturePool();
            var meshpartPool          = new MeshPartPool();
            var vertexDeclarationPool = new VertexDeclarationPool();

            var renderer = new SimpleMeshRenderer(texturePool, meshpartPool, vertexDeclarationPool);

            vertexDeclarationPool.SetVertexElements <TangentVertex>(TangentVertex.VertexElements);

            World world = new World();
            TileSnapInformationBuilder builder = new TileSnapInformationBuilder();

            WorldObjectPlaceTool placeTool = new WorldObjectPlaceTool(game, world, renderer, builder, new SimpleMeshFactory(), new SimpleTileFaceTypeFactory());
            WorldObjectType      type1     = new WorldObjectType(meshWallInnerCorner, Guid.NewGuid(), builder);
            WorldObjectType      type2     = new WorldObjectType(meshWallStraight, Guid.NewGuid(), builder);
            WorldObjectType      type3     = new WorldObjectType(meshWallOuterCorner, Guid.NewGuid(), builder);

            var tileDataInnerCorner = new TileData(Guid.NewGuid());
            var tileDataStraight    = new TileData(Guid.NewGuid());
            var tileDataOuterCorner = new TileData(Guid.NewGuid());

            tileDataInnerCorner.Dimensions = type1.BoundingBox.Max - type1.BoundingBox.Min;
            tileDataStraight.Dimensions    = type2.BoundingBox.Max - type2.BoundingBox.Min;
            tileDataOuterCorner.Dimensions = type1.BoundingBox.Max - type1.BoundingBox.Min;

            var faceSnapType1 = new TileFaceType(Guid.NewGuid())
            {
                Name = "type1"
            };

            //var faceSnapType2 = new TileFaceType() { Name = "type2" };

            tileDataInnerCorner.SetFaceType(TileFace.Front, faceSnapType1);
            tileDataInnerCorner.SetLocalWinding(TileFace.Front, true);

            tileDataInnerCorner.SetFaceType(TileFace.Left, faceSnapType1);
            tileDataInnerCorner.SetLocalWinding(TileFace.Left, true);

            tileDataStraight.SetFaceType(TileFace.Back, faceSnapType1);
            tileDataStraight.SetLocalWinding(TileFace.Back, false);

            tileDataStraight.SetFaceType(TileFace.Front, faceSnapType1);
            tileDataStraight.SetLocalWinding(TileFace.Front, true);

            tileDataOuterCorner.SetFaceType(TileFace.Front, faceSnapType1);
            tileDataOuterCorner.SetLocalWinding(TileFace.Front, true);

            tileDataOuterCorner.SetFaceType(TileFace.Right, faceSnapType1);
            tileDataOuterCorner.SetLocalWinding(TileFace.Right, true);


            type1.TileData = tileDataInnerCorner;
            type2.TileData = tileDataStraight;
            type3.TileData = tileDataOuterCorner;


            type1.SnapInformation = builder.CreateFromTile(tileDataInnerCorner);
            type2.SnapInformation = builder.CreateFromTile(tileDataStraight);
            type3.SnapInformation = builder.CreateFromTile(tileDataOuterCorner);

            List <WorldObjectType> typeList = new List <WorldObjectType>();

            typeList.Add(type1);
            typeList.Add(type2);
            typeList.Add(type3);

            WorldObjectMoveTool moveTool = new WorldObjectMoveTool(game, world, builder, renderer);

            game.AddXNAObject(moveTool);
            game.AddXNAObject(placeTool);

            game.IsFixedTimeStep = false;
            game.DrawFps         = true;
            game.AddXNAObject(texturePool);
            game.AddXNAObject(meshpartPool);
            game.AddXNAObject(vertexDeclarationPool);
            game.AddXNAObject(renderer);

            EditorGrid grid;

            grid               = new EditorGrid();
            grid.Size          = new Vector2(100, 100);
            grid.Interval      = 1;
            grid.MajorInterval = 10;

            bool mouseEnabled = false;

            game.UpdateEvent += delegate
            {
                if (placeTool.Enabled)
                {
                    moveTool.Enabled = false;

                    if (placeTool.ObjectsPlacedSinceEnabled() == 1)
                    {
                        placeTool.Enabled = false;
                    }
                }
                else
                {
                    moveTool.Enabled = true;
                }

                if (game.Keyboard.IsKeyPressed(Microsoft.Xna.Framework.Input.Keys.NumPad1))
                {
                    placeTool.PlaceType = typeList[0];
                    placeTool.Enabled   = true;
                }
                if (game.Keyboard.IsKeyPressed(Microsoft.Xna.Framework.Input.Keys.NumPad2))
                {
                    placeTool.PlaceType = typeList[1];
                    placeTool.Enabled   = true;
                }
                if (game.Keyboard.IsKeyPressed(Microsoft.Xna.Framework.Input.Keys.NumPad3))
                {
                    placeTool.PlaceType = typeList[2];
                    placeTool.Enabled   = true;
                }

                if (game.Keyboard.IsKeyPressed(Microsoft.Xna.Framework.Input.Keys.LeftAlt))
                {
                    mouseEnabled = !mouseEnabled;
                }
                if (mouseEnabled)
                {
                    game.Mouse.CursorEnabled     = true;
                    game.IsMouseVisible          = true;
                    game.SpectaterCamera.Enabled = false;
                }
                else
                {
                    game.Mouse.CursorEnabled     = false;
                    game.IsMouseVisible          = false;
                    game.SpectaterCamera.Enabled = true;
                    //activeWorldObject = null;
                }
            };
            game.DrawEvent += delegate
            {
                grid.Render(game);
            };

            game.Run();
        }