public void AssignMeshRendererFrom( RendererParametersRepresentation tempParameters ) { MeshRenderer meshRenderer = gameObject.GetComponent<MeshRenderer>(); if ( meshRenderer == null ) { meshRenderer = gameObject.AddComponent<MeshRenderer>(); } tempParameters.PasteTo( meshRenderer ); }
/// <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, }; }
static void PrepareResultGameObject( SpriteCutterGameObject resultGameObject, RendererParametersRepresentation tempParameters, SideCutData cutData ) { resultGameObject.AssignMeshFilter( cutData.cuttedMesh ); resultGameObject.AssignMeshRendererFrom( tempParameters ); if ( cutData.cuttedCollidersRepresentations != null ) { resultGameObject.BuildCollidersFrom( cutData.cuttedCollidersRepresentations ); } }
public void AssignMeshRendererFrom( MeshRenderer meshRenderer ) { RendererParametersRepresentation tempParameters = new RendererParametersRepresentation(); tempParameters.CopyFrom( meshRenderer ); AssignMeshRendererFrom( tempParameters ); }