Пример #1
0
        static void PrepareResultGameObject(SpriteCutterGameObject resultGameObject, RendererParametersRepresentation tempParameters,
                                            SideCutData cutData)
        {
            resultGameObject.AssignMeshFilter(cutData.cuttedMesh);
            resultGameObject.AssignMeshRendererFrom(tempParameters);

            if (cutData.cuttedCollidersRepresentations != null)
            {
                resultGameObject.BuildCollidersFrom(cutData.cuttedCollidersRepresentations);
            }
        }
Пример #2
0
        static void PrepareResultGameObject(SpriteCutterGameObject resultGameObject, SpriteRenderer spriteRenderer,
                                            MeshRenderer meshRenderer, SideCutData cutData)
        {
            resultGameObject.AssignMeshFilter(cutData.cuttedMesh);
            if (spriteRenderer != null)
            {
                resultGameObject.AssignMeshRendererFrom(spriteRenderer);
            }
            else
            {
                resultGameObject.AssignMeshRendererFrom(meshRenderer);
            }

            if (cutData.cuttedCollidersRepresentations != null)
            {
                resultGameObject.BuildCollidersFrom(cutData.cuttedCollidersRepresentations);
            }
        }
Пример #3
0
        /// <summary>
        /// Returns null, if cutting didn't took place.
        /// </summary>
        public static SpriteCutterOutput Cut( SpriteCutterInput input )
        {
            if ( input.gameObject == null ) {
                Debug.LogWarning( "SpriteCutter.Cut exceuted with null gameObject!" );
                return null;
            }

            /* Cutting  mesh and collider */

            Vector3 localLineStart = input.gameObject.transform.InverseTransformPoint( input.lineStart );
            Vector3 localLineEnd = input.gameObject.transform.InverseTransformPoint( input.lineEnd );

            SpriteRenderer spriteRenderer = input.gameObject.GetComponent<SpriteRenderer>();
            MeshRenderer meshRenderer = input.gameObject.GetComponent<MeshRenderer>();

            FlatConvexPolygonMeshCutter.CutResult meshCutResult =
                CutSpriteOrMeshRenderer( localLineStart, localLineEnd, spriteRenderer, meshRenderer );
            if ( meshCutResult.DidNotCut() ) {
                return null;
            }

            FlatConvexCollidersCutter.CutResult collidersCutResults;
            if ( input.dontCutColliders ) {
                collidersCutResults = new FlatConvexCollidersCutter.CutResult();
            } else {
                collidersCutResults =
                    CutColliders( localLineStart, localLineEnd, input.gameObject.GetComponents<Collider2D>() );

                if ( collidersCutResults.DidNotCut() ) {
                    return null;
                }
            }

            SideCutData firstCutData = new SideCutData() {
                cuttedMesh = meshCutResult.firstSideMesh,
                cuttedCollidersRepresentations = collidersCutResults.firstSideColliderRepresentations
            };
            SideCutData secondCutData = new SideCutData() {
                cuttedMesh = meshCutResult.secondSideMesh,
                cuttedCollidersRepresentations = collidersCutResults.secondSideColliderRepresentations
            };

            /* Second side result - created as new GameObject or instantiated copy of the original GameObject. */

            SpriteCutterGameObject secondSideResult = null;
            switch ( input.gameObjectCreationMode ) {
                case GameObjectCreationMode.CUT_OFF_NEW:
                case GameObjectCreationMode.CUT_INTO_TWO:
                    secondSideResult = SpriteCutterGameObject.CreateNew( input.gameObject, true );
                    PrepareResultGameObject( secondSideResult, spriteRenderer, meshRenderer, secondCutData );
                    break;

                case GameObjectCreationMode.CUT_OFF_COPY:
                    secondSideResult = SpriteCutterGameObject.CreateAsInstantiatedCopyOf( input.gameObject, true );
                    SpriteRenderer copiedSpriteRenderer = secondSideResult.gameObject.GetComponent<SpriteRenderer>();
                    MeshRenderer copiedMeshRenderer = secondSideResult.gameObject.GetComponent<MeshRenderer>();
                    if ( copiedSpriteRenderer != null ) {
                        RendererParametersRepresentation tempParameters = new RendererParametersRepresentation();
                        tempParameters.CopyFrom( copiedSpriteRenderer );
                        SafeSpriteRendererRemoverBehaviour.get.RemoveAndWaitOneFrame( copiedSpriteRenderer, onFinish: () => {
                                PrepareResultGameObject( secondSideResult, tempParameters, secondCutData );
                        } );

                    } else {
                        PrepareResultGameObject( secondSideResult, copiedSpriteRenderer, copiedMeshRenderer, secondCutData );
                    }
                    break;
            }

            /* First side result */

            SpriteCutterGameObject firstSideResult = null;
            switch ( input.gameObjectCreationMode ) {
                case GameObjectCreationMode.CUT_OFF_NEW:
                case GameObjectCreationMode.CUT_OFF_COPY:
                    firstSideResult = SpriteCutterGameObject.CreateAs( input.gameObject );
                    if ( spriteRenderer != null ) {
                        RendererParametersRepresentation tempParameters = new RendererParametersRepresentation();
                        tempParameters.CopyFrom( spriteRenderer );
                        SafeSpriteRendererRemoverBehaviour.get.RemoveAndWaitOneFrame( spriteRenderer, onFinish: () => {
                            PrepareResultGameObject( firstSideResult, tempParameters, firstCutData );
                        } );

                    } else {
                        PrepareResultGameObject( firstSideResult, spriteRenderer, meshRenderer, firstCutData );
                    }
                    break;

                case GameObjectCreationMode.CUT_INTO_TWO:
                    firstSideResult = SpriteCutterGameObject.CreateNew( input.gameObject, true );
                    PrepareResultGameObject( firstSideResult, spriteRenderer, meshRenderer, firstCutData );
                    break;
            }

            return new SpriteCutterOutput() {
                firstSideGameObject = firstSideResult.gameObject,
                secondSideGameObject = secondSideResult.gameObject,
            };
        }
Пример #4
0
        static void PrepareResultGameObject( SpriteCutterGameObject resultGameObject, RendererParametersRepresentation tempParameters,
		                                     SideCutData cutData )
        {
            resultGameObject.AssignMeshFilter( cutData.cuttedMesh );
            resultGameObject.AssignMeshRendererFrom( tempParameters );

            if ( cutData.cuttedCollidersRepresentations != null ) {
                resultGameObject.BuildCollidersFrom( cutData.cuttedCollidersRepresentations );
            }
        }
Пример #5
0
        static void PrepareResultGameObject( SpriteCutterGameObject resultGameObject, SpriteRenderer spriteRenderer,
		                                     MeshRenderer meshRenderer, SideCutData cutData )
        {
            resultGameObject.AssignMeshFilter( cutData.cuttedMesh );
            if ( spriteRenderer != null ) {
                resultGameObject.AssignMeshRendererFrom( spriteRenderer );
            } else {
                resultGameObject.AssignMeshRendererFrom( meshRenderer );
            }

            if ( cutData.cuttedCollidersRepresentations != null ) {
                resultGameObject.BuildCollidersFrom( cutData.cuttedCollidersRepresentations );
            }
        }
Пример #6
0
        /// <summary>
        /// Returns null, if cutting didn't took place.
        /// </summary>
        public static SpriteCutterOutput Cut(SpriteCutterInput input)
        {
            if (input.gameObject == null)
            {
                Debug.LogWarning("SpriteCutter.Cut exceuted with null gameObject!");
                return(null);
            }

            /* Cutting  mesh and collider */

            Vector3 localLineStart = input.gameObject.transform.InverseTransformPoint(input.lineStart);
            Vector3 localLineEnd   = input.gameObject.transform.InverseTransformPoint(input.lineEnd);

            SpriteRenderer spriteRenderer = input.gameObject.GetComponent <SpriteRenderer>();
            MeshRenderer   meshRenderer   = input.gameObject.GetComponent <MeshRenderer>();

            FlatConvexPolygonMeshCutter.CutResult meshCutResult =
                CutSpriteOrMeshRenderer(localLineStart, localLineEnd, spriteRenderer, meshRenderer);
            if (meshCutResult.DidNotCut())
            {
                return(null);
            }

            FlatConvexCollidersCutter.CutResult collidersCutResults;
            if (input.dontCutColliders)
            {
                collidersCutResults = new FlatConvexCollidersCutter.CutResult();
            }
            else
            {
                collidersCutResults =
                    CutColliders(localLineStart, localLineEnd, input.gameObject.GetComponents <Collider2D>());

                if (collidersCutResults.DidNotCut())
                {
                    return(null);
                }
            }

            SideCutData firstCutData = new SideCutData()
            {
                cuttedMesh = meshCutResult.firstSideMesh,
                cuttedCollidersRepresentations = collidersCutResults.firstSideColliderRepresentations
            };
            SideCutData secondCutData = new SideCutData()
            {
                cuttedMesh = meshCutResult.secondSideMesh,
                cuttedCollidersRepresentations = collidersCutResults.secondSideColliderRepresentations
            };

            /* Second side result - created as new GameObject or instantiated copy of the original GameObject. */

            SpriteCutterGameObject secondSideResult = null;

            switch (input.gameObjectCreationMode)
            {
            case GameObjectCreationMode.CUT_OFF_NEW:
            case GameObjectCreationMode.CUT_INTO_TWO:
                secondSideResult = SpriteCutterGameObject.CreateNew(input.gameObject, true);
                PrepareResultGameObject(secondSideResult, spriteRenderer, meshRenderer, secondCutData);
                break;

            case GameObjectCreationMode.CUT_OFF_COPY:
                secondSideResult = SpriteCutterGameObject.CreateAsInstantiatedCopyOf(input.gameObject, true);
                GameObject.Destroy(secondSideResult.gameObject, .5f);
                SpriteRenderer copiedSpriteRenderer = secondSideResult.gameObject.GetComponent <SpriteRenderer>();
                MeshRenderer   copiedMeshRenderer   = secondSideResult.gameObject.GetComponent <MeshRenderer>();
                if (copiedSpriteRenderer != null)
                {
                    RendererParametersRepresentation tempParameters = new RendererParametersRepresentation();
                    tempParameters.CopyFrom(copiedSpriteRenderer);
                    SafeSpriteRendererRemoverBehaviour.get.RemoveAndWaitOneFrame(copiedSpriteRenderer, onFinish: () => {
                        PrepareResultGameObject(secondSideResult, tempParameters, secondCutData);
                    });
                }
                else
                {
                    PrepareResultGameObject(secondSideResult, copiedSpriteRenderer, copiedMeshRenderer, secondCutData);
                }
                break;
            }


            /* First side result */

            SpriteCutterGameObject firstSideResult = null;

            switch (input.gameObjectCreationMode)
            {
            case GameObjectCreationMode.CUT_OFF_NEW:
            case GameObjectCreationMode.CUT_OFF_COPY:
                firstSideResult = SpriteCutterGameObject.CreateAs(input.gameObject);
                if (spriteRenderer != null)
                {
                    RendererParametersRepresentation tempParameters = new RendererParametersRepresentation();
                    tempParameters.CopyFrom(spriteRenderer);
                    SafeSpriteRendererRemoverBehaviour.get.RemoveAndWaitOneFrame(spriteRenderer, onFinish: () => {
                        PrepareResultGameObject(firstSideResult, tempParameters, firstCutData);
                    });
                }
                else
                {
                    PrepareResultGameObject(firstSideResult, spriteRenderer, meshRenderer, firstCutData);
                }
                break;

            case GameObjectCreationMode.CUT_INTO_TWO:
                firstSideResult = SpriteCutterGameObject.CreateNew(input.gameObject, true);
                PrepareResultGameObject(firstSideResult, spriteRenderer, meshRenderer, firstCutData);
                break;
            }

            return(new SpriteCutterOutput()
            {
                firstSideGameObject = firstSideResult.gameObject,
                secondSideGameObject = secondSideResult.gameObject,
            });
        }