//================================================================= public override FSNSnapshot.Layer GenerateNextLayerImage(FSNSnapshot.Layer curLayer, params FSNProcessModuleCallParam[] callParams) { FSNSnapshot.Layer newLayer = curLayer.Clone(); foreach (var callParam in callParams) { if (callParam.segment.type == FSNScriptSequence.Segment.Type.Text) // ** 텍스트 세그먼트 처리 ** { var textSeg = callParam.segment as Segments.Text; // 타입 변환 switch (textSeg.textType) // * 텍스트 종류에 따라 처리 분기 { case Segments.Text.TextType.Normal: AddNormalText(newLayer, textSeg, callParam.setting); break; case Segments.Text.TextType.Clear: ClearTextsToDirection(newLayer, callParam.setting.CurrentFlowDirection); break; case Segments.Text.TextType.Options: ClearTextsToDirection(newLayer, callParam.setting.CurrentFlowDirection); // 선택지 텍스트는 clear를 먼저 한 뒤에 표시 ShowOptionTexts(newLayer, textSeg, callParam.setting); break; case Segments.Text.TextType.LastOption: AddLastOptionText(newLayer, textSeg, callParam.setting); break; } } else if (callParam.segment.type == FSNScriptSequence.Segment.Type.Control && (callParam.segment as Segments.Control).controlType == Segments.Control.ControlType.Clear) // Clear 명령에 반응 { ClearTextsToDirection(newLayer, callParam.setting.CurrentFlowDirection); } else if (callParam.segment.type == FSNScriptSequence.Segment.Type.HardClone) // 레이어 Hard-Clone { newLayer.MakeAllElemsHardClone(); } } return(newLayer); }
public override FSNSnapshot.Layer GenerateNextLayerImage(FSNSnapshot.Layer curLayer, params FSNProcessModuleCallParam[] callParams) { FSNSnapshot.Layer newLayer = curLayer.Clone(); if (curLayer.GetCustomData(c_customDataName) != null) // 이름 dictionary 카피 { newLayer.SetCustomData(c_customDataName, new Dictionary <string, int>(curLayer.GetCustomData(c_customDataName) as Dictionary <string, int>)); } foreach (var callParam in callParams) { if (callParam.segment.type == FSNScriptSequence.Segment.Type.Object) { var objSeg = callParam.segment as SegT; switch (objSeg.command) { case Segments.Object.CommandType.Create: CreateElement(objSeg, newLayer); break; case Segments.Object.CommandType.Remove: RemoveElement(objSeg, newLayer); break; case Segments.Object.CommandType.SetInitial: SetElementInitial(objSeg, newLayer); break; case Segments.Object.CommandType.SetFinal: SetElementFinal(objSeg, newLayer); break; case Segments.Object.CommandType.SetKey: SetElement(objSeg, newLayer); break; case Segments.Object.CommandType.Custom: ProcessCustomElementCommand(objSeg, newLayer); break; } } else if (callParam.segment.type == FSNScriptSequence.Segment.Type.Control) { var controlSeg = callParam.segment as Segments.Control; if (controlSeg.controlType == Segments.Control.ControlType.Clear && acceptClearCommand) // Clear 명령에 반응 { foreach (var rawelem in newLayer.Elements) // finalstate가 세팅되지 않은 오브젝트에 한해서 디폴트 세팅 { var elem = rawelem as ElemT; AutoSetFinalState(elem); } newLayer = new FSNSnapshot.Layer(); // 완전히 새로운 레이어로 교체 // TODO : 힘들게 복제한 레이어를 버리는 구조임. 최적화 여지가 있음. } } else if (callParam.segment.type == FSNScriptSequence.Segment.Type.HardClone) // 레이어 Hard-Clone { newLayer.MakeAllElemsHardClone(); } else { } } // TODO : call 처리 이후, snapshot 마무리 OnAfterGenerateNextLayerImage(newLayer); return(newLayer); }