public ChordObject DouplicateChordObject(ChordObject chordObj, List <ChordObject> chordObjects)
    {
        // 0. Refs
        var fields   = Player.inst.curFieldSet;
        var ID       = chordObj.fieldID;
        var parent   = MeshRef.inst.recordObj_parent;
        var material = MeshRef.inst.recordObjs_mat[chordObj.trackLayer];
        var pos      = Recorder.inst.NextLoopPosition(chordObj.sequencer, chordObj.start);
        var layer    = 8;
        var visible  = true;
        var collider = true;
        var tag      = MeshRef.inst.chordObjTag;

        // 1. Instantiate & scale!
        var newObj = MeshCreation.CreateLaneSurface(fields, ID, "ChordObject", parent, material, visible, collider, tag, 1f, layer).gameObject;

        newObj.transform.localScale = chordObj.obj.transform.localScale;

        var douplicateObj = ChordObject.Create(newObj, null, pos, ID, chordObj.notes, chordObj.sequencer, chordObj.trackLayer, chordObj.start, chordObj.end, chordObj.loopStart, chordObj.loopEnd_extended);

        // 2. Set data
        chordObj.douplicate   = douplicateObj;
        chordObj.hasRespawned = true;

        // 3. Add to list
        chordObjects.Add(douplicateObj);

        return(douplicateObj);
    }
    public override void _Ready()
    {
        maze = new Maze(ShapeGeometry.MakePolygon(6, 21, (float)Math.PI / 2),
                        new Vector2(-21, -21), new Vector2(21, 21));
        //maze = new Maze(ShapeGeometry.MakeStar(12, 21, (float)Math.PI / 2), new Vector2(-21, -21), new Vector2(21, 21));

        //Draw cells to single mesh and apply to screen
        var surfTool = MeshCreation.CreateSurfaceTool();

        var walls = maze.GetWalls();

        foreach (var wall in walls)
        {
            if (!wall.KnockedDown)
            {
                MeshCreation.AddWall(surfTool, new Vector3(wall.GetPoint1X(), 0.0f, wall.GetPoint1Y()),
                                     new Vector3(wall.GetPoint2X(), 0.0f, wall.GetPoint2Y()), 0.1f, 2.0f);
            }
        }

        this.AddChild(MeshCreation.CreateMeshInstanceFromMesh(MeshCreation.CreateMeshFromSurfaceTool(surfTool)));

        //Put players at start
        KinematicBody player       = (KinematicBody)this.GetParent().GetNode("player");
        var           startingCell = maze.GetStartingCell();

        player.SetTranslation(new Vector3(startingCell.X, 0.0f, startingCell.Y));

        //Put flag at end
        Spatial flag       = (Spatial)this.GetParent().GetNode("Flag");
        var     endingCell = maze.GetEndingCell();

        flag.SetTranslation(new Vector3(endingCell.X, 0.0f, endingCell.Y));
    }
    // ------------------------------ Public functions ------------------------------



    /// <summary>
    /// Instantiate 2 lane surfaces (current chord, looped chord) from recording-data and keep scaling it by a coroutine upwards from zero until stopped. Writes into recording (!).
    /// </summary>
    /// <param name="recording">Recording data.</param>
    /// <param name="chordObjects">List to add the new chord objects.</param>
    public void CreateChordObjectTwice(Recording recording, List <ChordObject>[] chordObjects, int trackLayer)
    {
        // 0. Refs
        var fields       = Player.inst.curFieldSet;
        var ID           = recording.fieldID;
        var parent       = MeshRef.inst.recordObj_parent;
        var material     = MeshRef.inst.recordObjs_mat[trackLayer];
        var pos1         = Player.inst.transform.position;
        var pos2         = Recorder.inst.NextLoopPosition(recording.sequencer, recording.start);
        var layer1       = LayerMask.NameToLayer(MeshRef.inst.highlightSurfaces_layer);
        var renderQueue1 = MeshRef.inst.highlightSurfaces_renderQueue + 1;
        var layer2       = LayerMask.NameToLayer(MeshRef.inst.recordLayer);
        //var layer = 8;
        var collider = true;
        var visible  = true;
        var tag      = MeshRef.inst.chordObjTag;

        // 1. Instantiate
        var obj1 = MeshCreation.CreateLaneSurface(fields, ID, "ChordObject", parent, material, visible, collider, tag, 1f, layer1, renderQueue1).gameObject;
        var obj2 = MeshCreation.CreateLaneSurface(fields, ID, "ChordObject", parent, material, visible, collider, tag, 1f, layer2).gameObject;

        var recordObject2 = ChordObject.Create(obj2, null, pos2, ID, recording.notes, recording.sequencer, trackLayer, recording.start, recording.end, recording.loopStart, recording.loopEnd_extended);
        var recordObject1 = ChordObject.Create(obj1, recordObject2, pos1, ID, recording.notes, recording.sequencer, trackLayer, recording.start, recording.end, recording.loopStart, recording.loopEnd_extended);

        recordObject1.hasRespawned = true;

        // 2. Add to list
        chordObjects[trackLayer].Add(recordObject1);
        chordObjects[trackLayer].Add(recordObject2);

        // 3. Edit recording / Start scaling
        recording.obj          = recordObject1;     // Nur für scaling-coroutine
        recording.loopObj      = recordObject2;     // Nur für scaling-coroutine
        recording.scaleRoutine = StartCoroutine(ScaleChordObject(recordObject1, recordObject2));
    }
    IEnumerator Start()
    {
        inst = this;

        var cursorOffset = new Vector2(MeshRef.inst.mouse.width / 2, MeshRef.inst.mouse.height / 2);

        Cursor.SetCursor(MeshRef.inst.mouse, cursorOffset, CursorMode.Auto);

        // Wait (cause raycasts wouldnt hit any collider)
        yield return(new WaitForFixedUpdate()); yield return(new WaitForEndOfFrame());

        // 1. Create all meshes
        MeshCreation.CreateAll();

        // 2. Fill fields with last content (chords & colors)
        LoopData.Init();
        #region hack: isNotSpawning = false
        for (int i = 0; i < TunnelData.fields.Length; i++)
        {
            Player.inst.curFieldSet[i].isNotSpawning = false;
        }
        #endregion

        // EVENTS
        MusicRef.inst.beatSequencer.beatEvent.AddListener(MusicManager.inst.OnBeat);
        MusicRef.inst.beatSequencer.beatEvent.AddListener(MusicManager.inst.OnVeryFirstBeats);
        GameEvents.inst.onVeryFirstBeat  += OnVeryFirstBeat;
        GameEvents.inst.onVerySecondBeat += OnVerySecondBeat;
        GameEvents.inst.onPlayPerformed  += VisualController.inst.OnPlayField_byInput;
        GameEvents.inst.onPlayCanceled   += VisualController.inst.OnStopfield_byInput;
        GameEvents.inst.onChangeField    += VisualController.inst.OnFieldChange;
        GameEvents.inst.onMouseInside    += VisualController.inst.OnMouseInside;
        GameEvents.inst.onMouseOutside   += VisualController.inst.OnMouseOutside;
        GameEvents.inst.onScreenResize   += CameraOps.PanCamera;

        // Music-related
        GameEvents.inst.onPlayPerformed += MusicManager.inst.OnFieldStart;
        GameEvents.inst.onChangeField   += MusicManager.inst.OnFieldChange;
        GameEvents.inst.onPlayCanceled  += MusicManager.inst.OnFieldLeave;

        GameEvents.inst.onScreenResize?.Invoke(); // Hack

        yield return(null);
    }
Esempio n. 5
0
        public void FitEdge(ref Mesh mesh, Polyline pts, double tol)
        {
            MeshCreation mc    = new MeshCreation();
            List <int>   index = mc.MeshEdgeVerticeIndex(mesh);

            for (int i = 0; i < index.Count; i++)
            {
                Point3d pt = mesh.Vertices[index[i]];
                int     sign = 0; double dist = double.MaxValue;
                for (int j = 0; j < pts.Count; j++)
                {
                    double t = pts[j].DistanceTo(pt);
                    if (t < dist)
                    {
                        dist = t; sign = j;
                    }
                }
                mesh.Vertices.SetVertex(index[i], pts[sign]);
            }
            for (int i = 0; i < mesh.Vertices.Count; i++)
            {
                Point3d pt = mesh.Vertices[i];
                int     sign = 0; double dist = double.MaxValue;
                for (int j = 0; j < pts.Count; j++)
                {
                    double t = pts[j].DistanceTo(pt);
                    if (t < dist)
                    {
                        dist = t; sign = j;
                    }
                }
                if (dist < tol)
                {
                    mesh.Vertices.SetVertex(i, pts[sign]);
                }
            }
        }
Esempio n. 6
0
 public MeshConvert()
 {
     mc = new MeshCreation();
 }
    // Creates a wire mesh and places the spheres to make sure the tile is aligned.
    private void CreateMeshForTile(Tile tile, float sphereScale)
    {
        //Get tile center point
        decimal      tileCenterX = 0;
        decimal      tileCenterY = 0;
        decimal      tileCenterZ = 0;
        List <Point> points      = tile.boundary;

        //Calculate the average center point and polygon side length.
        foreach (Point point in points)
        {
            tileCenterX += point.x / points.Count;
            tileCenterY += point.y / points.Count;
            tileCenterZ += point.z / points.Count;
        }
        //Create the center point
        var tileCenterPoint = new Vector3((float)tileCenterX, (float)tileCenterY, (float)tileCenterZ);

        if (points.Count == 5)
        {
            tileCenterPoint = tileCenterPoint + (tileCenterPoint.Normalized() * 6);
        }
        GD.Print(tileCenterPoint);

        //Create surface tool
        var material = new SpatialMaterial();

        //material.SetEmission(new Color(1.0f, 0.0f, 0.0f));
        //material.SetEmissionEnergy(0.5f);
        material.SetAlbedo(new Color(0.0f, 0.0f, 0.0f));
        //material.SetMetallic(0.5f);
        material.SetCullMode(SpatialMaterial.CullMode.Back);
        var surfaceTool = MeshCreation.CreateSurfaceTool(material);

        //Make triangles for polygon
        for (var index = 0; index < points.Count; index++)
        {
            var     point = new Vector3((float)points[index].x, (float)points[index].y, (float)points[index].z);
            Vector3 nextPoint;
            if (index < points.Count - 1)
            {
                nextPoint = new Vector3((float)points[index + 1].x, (float)points[index + 1].y, (float)points[index + 1].z);
            }
            else
            {
                nextPoint = new Vector3((float)points[0].x, (float)points[0].y, (float)points[0].z);
            }
            if (points.Count == 5)
            {
                point     = point + (point.Normalized() * 6);
                nextPoint = nextPoint + (nextPoint.Normalized() * 6);
            }
            MeshCreation.AddTriangle(surfaceTool, point, nextPoint, tileCenterPoint, true);
        }
        //Add to scene
        var meshInstance = MeshCreation.CreateMeshInstanceFromMesh(MeshCreation.CreateMeshFromSurfaceTool(surfaceTool));

        this.AddChild(meshInstance);


        /*
         * var surfTool = new SurfaceTool();
         * var mesh = new ArrayMesh();
         * var material = new SpatialMaterial();
         * material.SetEmission(new Color(1.0f, 0.0f, 0.0f));
         * material.SetAlbedo(new Color(1.0f, 0.0f, 0.0f));
         * surfTool.Begin(Mesh.PrimitiveType.TriangleStrip);
         * //LineLoop - Nothing
         * //Lines - Nothing
         * //LineStrip - Nothing
         * //Points - Nothing
         * //TriangleFan - Nothing
         * //Triangles - Nothing
         * //TriangleStrip - Nothing
         * surfTool.SetMaterial(material);
         * decimal tileCenterX = 0;
         * decimal tileCenterY = 0;
         * decimal tileCenterZ = 0;
         * decimal polygonRadius = 0;
         *
         * List<Point> points = tile.boundary;
         * var lastPoint = points[points.Count - 1];
         * Vector3 lastPointVector = new Vector3((float)lastPoint.x, (float)lastPoint.y, (float)lastPoint.z);
         * decimal polygonSideLength = 0;
         * foreach (Point point in points) {
         *  surfTool.AddUv(new Vector2(0, 0));
         *  surfTool.AddVertex(new Vector3((float)point.x, (float)point.y, (float)point.z));
         *
         *  tileCenterX += point.x / points.Count;
         *  tileCenterY += point.y / points.Count;
         *  tileCenterZ += point.z / points.Count;
         *  Vector3 currentVector = new Vector3((float)point.x, (float)point.y, (float)point.z);
         *  polygonSideLength += (decimal)currentVector.DistanceTo(lastPointVector);
         *  lastPointVector = currentVector;
         * }
         * polygonSideLength = polygonSideLength / points.Count;
         *
         * var tileCenterPoint = new Vector3((float)tileCenterX, (float)tileCenterY, (float)tileCenterZ);
         * var firstPoint = new Vector3((float)points[0].x, (float)points[0].y, (float)points[0].z);
         *
         * foreach (Point point in points)
         * {
         *  var vector = new Vector3((float) point.x, (float)point.y, (float)point.z);
         *  polygonRadius += (decimal)vector.DistanceTo(tileCenterPoint);
         * }
         * polygonRadius = polygonRadius / points.Count;
         *
         * var polygonRotation = firstPoint.AngleTo(tileCenterPoint);
         *
         *
         * var sphereCenterPoint = new Vector3(0f, 0f, 0f);
         *
         * MeshInstance sphere = (MeshInstance)blueSphereMeshScene.Instance();
         * sphere.SetTranslation(tileCenterPoint);
         * sphere.SetScale(new Vector3(sphereScale, sphereScale, sphereScale));
         * this.AddChild(sphere);
         *
         * MeshInstance sphere2 = (MeshInstance)greenSphereMeshScene.Instance();
         * sphere2.SetTranslation(firstPoint);
         * sphere2.SetScale(new Vector3(sphereScale, sphereScale, sphereScale));
         * this.AddChild(sphere2);
         *
         * MeshInstance sphere3 = (MeshInstance)greenSphereMeshScene.Instance();
         * sphere3.SetTranslation((firstPoint - tileCenterPoint) / 2 + tileCenterPoint);
         * sphere3.SetScale(new Vector3(sphereScale, sphereScale, sphereScale));
         * this.AddChild(sphere3);
         *
         * surfTool.GenerateNormals();
         * surfTool.Index();
         * surfTool.Commit(mesh);
         * var meshInstance = new MeshInstance();
         * meshInstance.SetMesh(mesh);
         * meshInstance.CreateTrimeshCollision();
         * this.AddChild(meshInstance);
         */
    }