public override async System.Threading.Tasks.Task GCode_CodeDom_GenerateCode(CodeTypeDeclaration codeClass, CodeStatementCollection codeStatementCollection, LinkPinControl element, GenerateCodeContext_Method context) { await EngineNS.Thread.AsyncDummyClass.DummyFunc(); Type clipType = typeof(EngineNS.Bricks.Animation.BlendTree.Node.BlendTree_AnimationClip); var createLAClipMethodInvoke = new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(new CodeMethodReferenceExpression(new CodeTypeReferenceExpression(clipType), "CreateSync"), new CodeExpression[] { new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(new CodeTypeReferenceExpression(typeof(EngineNS.RName)), "GetRName", new CodeExpression[] { new CodePrimitiveExpression(FileName.Name) }) }); CodeVariableDeclarationStatement stateVarDeclaration = new CodeVariableDeclarationStatement(clipType, ValidName, createLAClipMethodInvoke); codeStatementCollection.Add(stateVarDeclaration); var info = await EditorCommon.Resources.ResourceInfoManager.Instance.CreateResourceInfoFromFile(FileName.Address + ".rinfo", null); var animationInfo = info as EditorCommon.ResourceInfos.AnimationClipResourceInfo; Notifies.Clear(); foreach (var pair in animationInfo.NotifyTrackMap) { Notifies.Add(pair.NotifyName); } for (int i = 0; i < Notifies.Count; ++i) { var notify = Notifies[i]; var validNotifyName = StringRegex.GetValidName(notify); validNotifyName = "Anim_Notify_" + validNotifyName; if (hasTheNotifyMethod(codeClass, validNotifyName)) { var attachNotifyEventExp = new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(new CodeMethodReferenceExpression(new CodeVariableReferenceExpression(ValidName), "AttachNotifyEvent"), new CodeExpression[] { new CodePrimitiveExpression(i), new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), validNotifyName) }); //CodeArrayIndexerExpression arrayIndex = new CodeArrayIndexerExpression(new CodeFieldReferenceExpression(animRef, "Notifies"), new CodePrimitiveExpression(i)); //CodeAttachEventStatement attachEvent = new CodeAttachEventStatement(arrayIndex, "OnNotify", new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), validNotifyName)); codeStatementCollection.Add(attachNotifyEventExp); } } }
public override async System.Threading.Tasks.Task GCode_CodeDom_GenerateCode(CodeTypeDeclaration codeClass, CodeStatementCollection codeStatementCollection, LinkPinControl element, GenerateCodeContext_Method context) { await EngineNS.Thread.AsyncDummyClass.DummyFunc(); /* * EngineNS.GamePlay.StateMachine.AnimationStateMachine StateMachine = new EngineNS.GamePlay.StateMachine.AnimationStateMachine("StateMachine"); * StateMachine.AnimationPose = this.AnimationPose; * this.AddStateMachine(StateMachine); */ var validName = StringRegex.GetValidName(NodeName); //System.CodeDom.CodeVariableDeclarationStatement st = new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(EngineNS.GamePlay.StateMachine.AnimationStateMachine)), validName, new CodeObjectCreateExpression(new CodeTypeReference(typeof(EngineNS.GamePlay.StateMachine.AnimationStateMachine)),new CodePrimitiveExpression(validName))); System.CodeDom.CodeVariableDeclarationStatement st = new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(EngineNS.Bricks.Animation.AnimStateMachine.LogicAnimationStateMachine)), validName); codeStatementCollection.Add(st); var createStateMachine = new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), "CreateStateMachine"), new CodePrimitiveExpression(validName)); CodeVariableReferenceExpression stateMachineRef = new CodeVariableReferenceExpression(validName); CodeAssignStatement stateMachineAssign = new CodeAssignStatement(); stateMachineAssign.Left = stateMachineRef; stateMachineAssign.Right = createStateMachine; codeStatementCollection.Add(stateMachineAssign); CodeFieldReferenceExpression animPoseField = new CodeFieldReferenceExpression(stateMachineRef, "AnimationPoseProxy"); //CodeAssignStatement animPoseAssign = new CodeAssignStatement(); //animPoseAssign.Left = animPoseField; //animPoseAssign.Right = context.InstanceAnimPoseReferenceExpression; //codeStatementCollection.Add(animPoseAssign); //CodeMethodReferenceExpression methodRef = new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), "AddTickComponent"); //var methodInvoke = new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(methodRef, new CodeExpression[] { stateMachineRef }); //codeStatementCollection.Add(methodInvoke); if (mLinkedNodesContainer == null) { return; } context.AnimStateMachineReferenceExpression = stateMachineRef; context.StateMachineAnimPoseReferenceExpression = animPoseField; foreach (var ctrl in mLinkedNodesContainer.CtrlNodeList) { if ((ctrl is CodeDomNode.MethodOverride) || (ctrl is CodeDomNode.MethodCustom) || ctrl is FinalAnimPoseControl || ctrl is StateEntryControl) { await ctrl.GCode_CodeDom_GenerateCode(codeClass, codeStatementCollection, element, context); } } }
public async Task <CodeMemberMethod> GCode_CodeDom_GenerateTransitionLambdaMethod(CodeTypeDeclaration codeClass, LinkPinControl element, GenerateCodeContext_Method context) { var name = StringRegex.GetValidName("Transition" + HostNodesContainer.TitleString + EngineNS.Editor.Assist.GetValuedGUIDString(this.Id) + "_Lambda"); foreach (var member in codeClass.Members) { if (member is CodeGenerateSystem.CodeDom.CodeMemberMethod) { var existMethod = member as CodeGenerateSystem.CodeDom.CodeMemberMethod; if (existMethod.Name == name) { return(existMethod); } } } CodeGenerateSystem.CodeDom.CodeMemberMethod method = new CodeGenerateSystem.CodeDom.CodeMemberMethod() { Name = name, Attributes = MemberAttributes.Public | MemberAttributes.Final, ReturnType = new CodeTypeReference(typeof(bool)), }; codeClass.Members.Add(method); if (!mCtrlValueInputHandle.HasLink) { method.Statements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(true))); } else { var linkObj = mCtrlValueInputHandle.GetLinkedObject(0, true); var linkElm = mCtrlValueInputHandle.GetLinkedPinControl(0, true); var methodContext = new GenerateCodeContext_Method(context.ClassContext, method); if (!linkObj.IsOnlyReturnValue) { await linkObj.GCode_CodeDom_GenerateCode(codeClass, method.Statements, linkElm, methodContext); } var exp = linkObj.GCode_CodeDom_GetValue(mCtrlValueInputHandle.GetLinkedPinControl(0), methodContext); method.Statements.Add(new CodeMethodReturnStatement(exp)); } return(method); }
public override CodeExpression GCode_CodeDom_GetSelfRefrence(LinkPinControl element, GenerateCodeContext_Method context, GenerateCodeContext_PreNode preNodeContext = null) { var validName = StringRegex.GetValidName(NodeName); return(new CodeVariableReferenceExpression(validName)); }
public override async System.Threading.Tasks.Task GCode_CodeDom_GenerateCode(CodeTypeDeclaration codeClass, CodeStatementCollection codeStatementCollection, LinkPinControl element, GenerateCodeContext_Method context) { var valueEvaluateMethod = new CodeMemberMethod(); valueEvaluateMethod.Name = ValidName + "_InputEvaluate"; valueEvaluateMethod.Attributes = MemberAttributes.Public | MemberAttributes.Final; valueEvaluateMethod.ReturnType = new CodeTypeReference(typeof(EngineNS.Vector3)); var valueEvaluateMethodContex = new GenerateCodeContext_Method(context.ClassContext, valueEvaluateMethod); var tempInputName = "tempInput"; CodeVariableDeclarationStatement tempInput = new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(EngineNS.Vector3)), tempInputName, new CodeObjectCreateExpression(typeof(EngineNS.Vector3), new CodeExpression[] { new CodePrimitiveExpression(0), new CodePrimitiveExpression(0), new CodePrimitiveExpression(0) })); valueEvaluateMethod.Statements.Add(tempInput); CodeExpression xValue = null; CodeExpression yValue = null; xValue = await Helper.GetEvaluateValueExpression(codeClass, valueEvaluateMethodContex, valueEvaluateMethod, mXLinkHandle, 0); if (!Is1D) { yValue = await Helper.GetEvaluateValueExpression(codeClass, valueEvaluateMethodContex, valueEvaluateMethod, mYLinkHandle, 0); } CodeAssignStatement xValueAssign = new CodeAssignStatement(); xValueAssign.Left = new CodeFieldReferenceExpression(new CodeVariableReferenceExpression(tempInputName), "X"); xValueAssign.Right = xValue; valueEvaluateMethod.Statements.Add(xValueAssign); if (!Is1D) { CodeAssignStatement yValueAssign = new CodeAssignStatement(); yValueAssign.Left = new CodeFieldReferenceExpression(new CodeVariableReferenceExpression(tempInputName), "Y"); yValueAssign.Right = yValue; valueEvaluateMethod.Statements.Add(yValueAssign); } valueEvaluateMethod.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression(tempInputName))); codeClass.Members.Add(valueEvaluateMethod); Type bsType; if (Is1D) { bsType = typeof(EngineNS.Bricks.Animation.BlendTree.Node.BlendTree_BlendSpace1D); } else { bsType = typeof(EngineNS.Bricks.Animation.BlendTree.Node.BlendTree_BlendSpace2D); } var createLABSMethodInvoke = new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(new CodeMethodReferenceExpression(new CodeTypeReferenceExpression(bsType), "CreateSync"), new CodeExpression[] { new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(new CodeTypeReferenceExpression(typeof(EngineNS.RName)), "GetRName", new CodeExpression[] { new CodePrimitiveExpression(FileName.Name) }) }); CodeVariableDeclarationStatement stateVarDeclaration = new CodeVariableDeclarationStatement(bsType, ValidName, createLABSMethodInvoke); codeStatementCollection.Add(stateVarDeclaration); var syncPlayPercentGropAssign = new CodeAssignStatement(); syncPlayPercentGropAssign.Left = new CodeFieldReferenceExpression(new CodeVariableReferenceExpression(ValidName), "SyncPlayPercentGrop"); syncPlayPercentGropAssign.Right = new CodePrimitiveExpression(SyncPlayPercentGrop); codeStatementCollection.Add(syncPlayPercentGropAssign); CodeAssignStatement inputFuncAssign = new CodeAssignStatement(); inputFuncAssign.Left = new CodeFieldReferenceExpression(new CodeVariableReferenceExpression(ValidName), "EvaluateInput"); inputFuncAssign.Right = new CodeVariableReferenceExpression(valueEvaluateMethod.Name); codeStatementCollection.Add(inputFuncAssign); List <string> nofifies = new List <string>(); var info = await EditorCommon.Resources.ResourceInfoManager.Instance.CreateResourceInfoFromFile(FileName.Address + ".rinfo", null); EngineNS.Bricks.Animation.AnimNode.BlendSpace bs = null; if (Is1D) { bs = EngineNS.Bricks.Animation.AnimNode.BlendSpace1D.CreateSync(FileName); } else { bs = EngineNS.Bricks.Animation.AnimNode.BlendSpace2D.CreateSync(FileName); } if (info != null) { for (int j = 0; j < bs.Samples.Count; ++j) { var clip = bs.GetAnimationSample(j); var refInfo = await EditorCommon.Resources.ResourceInfoManager.Instance.CreateResourceInfoFromFile(clip.AnimationName.Address + ".rinfo", null); var animationInfo = refInfo as EditorCommon.ResourceInfos.AnimationClipResourceInfo; nofifies.Clear(); foreach (var pair in animationInfo.NotifyTrackMap) { nofifies.Add(pair.NotifyName); } for (int i = 0; i < nofifies.Count; ++i) { var notify = nofifies[i]; var validNotifyName = StringRegex.GetValidName(notify); validNotifyName = "Anim_Notify_" + validNotifyName; if (hasTheNotifyMethod(codeClass, validNotifyName)) { var attachNotifyEventExp = new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(new CodeMethodReferenceExpression(new CodeFieldReferenceExpression(new CodeVariableReferenceExpression(ValidName), "BlendSpace"), "AttachNotifyEvent"), new CodeExpression[] { new CodePrimitiveExpression(j), new CodePrimitiveExpression(i), new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), validNotifyName) }); //CodeArrayIndexerExpression arrayIndex = new CodeArrayIndexerExpression(new CodeFieldReferenceExpression(animRef, "Notifies"), new CodePrimitiveExpression(i)); //CodeAttachEventStatement attachEvent = new CodeAttachEventStatement(arrayIndex, "OnNotify", new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), validNotifyName)); codeStatementCollection.Add(attachNotifyEventExp); } } } } return; }
public override async System.Threading.Tasks.Task GCode_CodeDom_GenerateCode(CodeTypeDeclaration codeClass, CodeStatementCollection codeStatementCollection, LinkPinControl element, GenerateCodeContext_Method context) { if (!mCtrlValueLinkHandle.RecursionReached) { mCtrlValueLinkHandle.RecursionReached = true; /* * EngineNS.GamePlay.StateMachine.AnimationState State = new EngineNS.GamePlay.StateMachine.AnimationState("State", StateMachine); * State.AnimationPose = StateMachine.AnimationPose; */ var stateMachineRef = context.AnimStateMachineReferenceExpression; var validName = StringRegex.GetValidName(NodeName); System.CodeDom.CodeVariableDeclarationStatement stateStateMent = new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(EngineNS.Bricks.Animation.AnimStateMachine.LogicAnimationState)), validName, new CodeObjectCreateExpression(new CodeTypeReference(typeof(EngineNS.Bricks.Animation.AnimStateMachine.LogicAnimationState)), new CodeExpression[] { new CodePrimitiveExpression(validName), stateMachineRef })); codeStatementCollection.Add(stateStateMent); stateRef = new CodeVariableReferenceExpression(validName); CodeFieldReferenceExpression animPoseField = new CodeFieldReferenceExpression(stateRef, "AnimationPoseProxy"); CodeAssignStatement animPoseAssign = new CodeAssignStatement(); animPoseAssign.Left = animPoseField; animPoseAssign.Right = context.StateMachineAnimPoseReferenceExpression; codeStatementCollection.Add(animPoseAssign); context.StateAnimPoseReferenceExpression = animPoseField; //子图 context.AminStateReferenceExpression = stateRef; if (mLinkedNodesContainer != null) { foreach (var ctrl in mLinkedNodesContainer.CtrlNodeList) { if ((ctrl is CodeDomNode.MethodOverride) || (ctrl is CodeDomNode.MethodCustom) || ctrl is FinalAnimPoseControl || ctrl is CodeDomNode.Animation.StateEntryControl) { await ctrl.GCode_CodeDom_GenerateCode(codeClass, codeStatementCollection, element, context); } } } //指向的节点 for (int i = 0; i < mCtrlValueLinkHandle.GetLinkInfosCount(); ++i) { var linkInfo = mCtrlValueLinkHandle.GetLinkInfo(i); if (linkInfo.m_linkFromObjectInfo == mCtrlValueLinkHandle) { //需要返回state,来添加两者之间 的转换关系 await linkInfo.m_linkToObjectInfo.HostNodeControl.GCode_CodeDom_GenerateCode(codeClass, codeStatementCollection, element, context); if (mCtrlValueLinkHandle.LinkCurveType == enLinkCurveType.Line) { var linkCurve = linkInfo.LinkPath as CodeGenerateSystem.Base.ArrowLine; foreach (var transitionCtrl in linkCurve.TransitionControlList) { //构建状态转换宏图 await transitionCtrl.GCode_CodeDom_GenerateCode(codeClass, codeStatementCollection, element, context); } var desState = context.ReturnedAminStateReferenceExpression; var stateTransitionMethod = context.StateTransitionMethodReferenceExpression; if (stateTransitionMethod != null) { //生成转换代码 CodeMethodReferenceExpression methodRef = new CodeMethodReferenceExpression(stateRef, "AddStateTransition"); var methodInvoke = new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(methodRef, new CodeExpression[] { desState, new CodeMethodReferenceExpression(null, stateTransitionMethod.Name) }); codeStatementCollection.Add(methodInvoke); } } } } } //将自己的state返回给上层递归 context.ReturnedAminStateReferenceExpression = stateRef; //返回currentState foreach (var node in mCtrlValueLinkHandle.GetLinkedObjects()) { if (node is CodeDomNode.Animation.StateEntryControl) { context.FirstStateReferenceExpression = stateRef; } } }
public override async System.Threading.Tasks.Task GCode_CodeDom_GenerateCode(CodeTypeDeclaration codeClass, CodeStatementCollection codeStatementCollection, LinkPinControl element, GenerateCodeContext_Method context) { /*生成代码 * EngineNS.Graphics.Mesh.Animation.CGfxAnimationSequence batmanidle = new EngineNS.Graphics.Mesh.Animation.CGfxAnimationSequence(); * EngineNS.RName animName; * animName = EngineNS.RName.GetRName("titandemo/character/batman/animation/[email protected]"); * batmanidle.Init(animName); * batmanidle.AnimationPose = animPose; * state.AddTickComponent(batmanidle); * batmanidle.Notifies[0].OnNotify += this.Anim_Notify_Walk; * return true; */ await EngineNS.Thread.AsyncDummyClass.DummyFunc(); var validName = StringRegex.GetValidName(NodeName); System.CodeDom.CodeVariableDeclarationStatement st = new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(EngineNS.Bricks.Animation.AnimNode.AnimationClip)), validName, new CodeObjectCreateExpression(new CodeTypeReference(typeof(EngineNS.Bricks.Animation.AnimNode.AnimationClip)))); codeStatementCollection.Add(st); var calcMethod = new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(new CodeSnippetExpression("EngineNS.RName"), "GetRName", new CodePrimitiveExpression(RNameNodeName.Name)); CodeAssignStatement nodeNameAssign = new CodeAssignStatement(); CodeVariableDeclarationStatement rNameSt = new CodeVariableDeclarationStatement(new CodeTypeReference(typeof(EngineNS.RName)), "animName"); nodeNameAssign.Left = new CodeVariableReferenceExpression("animName"); nodeNameAssign.Right = calcMethod; codeStatementCollection.Add(rNameSt); codeStatementCollection.Add(nodeNameAssign); CodeVariableReferenceExpression animRef = new CodeVariableReferenceExpression(validName); CodeMethodReferenceExpression methodRef = new CodeMethodReferenceExpression(animRef, "Init"); var methodInvoke = new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(methodRef, new CodeExpression[] { new CodeVariableReferenceExpression("animName") }); codeStatementCollection.Add(methodInvoke); var animCP = CSParam as AnimationAssetConstructionParams; CodeFieldReferenceExpression isLoopField = new CodeFieldReferenceExpression(); isLoopField.FieldName = "IsLoop"; isLoopField.TargetObject = animRef; CodeAssignStatement isLoopAssign = new CodeAssignStatement(); isLoopAssign.Left = isLoopField; isLoopAssign.Right = new CodePrimitiveExpression((bool)mTemplateClassInstance.GetType().GetProperty("IsLoop").GetValue(mTemplateClassInstance)); codeStatementCollection.Add(isLoopAssign); CodeFieldReferenceExpression animPoseField = new CodeFieldReferenceExpression(); animPoseField.FieldName = "AnimationPoseProxy"; animPoseField.TargetObject = animRef; CodeAssignStatement animPoseAssign = new CodeAssignStatement(); animPoseAssign.Left = animPoseField; animPoseAssign.Right = context.AnimAssetAnimPoseProxyReferenceExpression; codeStatementCollection.Add(animPoseAssign); CodeMethodReferenceExpression addAnimTickComponentRef = new CodeMethodReferenceExpression(context.AnimAssetTickHostReferenceExpression, "AddTickComponent"); var addAnimTickComponentInvoke = new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(addAnimTickComponentRef, new CodeExpression[] { animRef }); codeStatementCollection.Add(addAnimTickComponentInvoke); var info = await EditorCommon.Resources.ResourceInfoManager.Instance.CreateResourceInfoFromFile(RNameNodeName.Address + ".rinfo", null); var animationInfo = info as EditorCommon.ResourceInfos.AnimationClipResourceInfo; animCP.Notifies.Clear(); foreach (var pair in animationInfo.NotifyTrackMap) { animCP.Notifies.Add(pair.NotifyName); } for (int i = 0; i < Notifies.Count; ++i) { var notify = Notifies[i]; var validNotifyName = StringRegex.GetValidName(notify); validNotifyName = "Anim_Notify_" + validNotifyName; if (hasTheNotifyMethod(codeClass, validNotifyName)) { var attachNotifyEventExp = new CodeGenerateSystem.CodeDom.CodeMethodInvokeExpression(new CodeMethodReferenceExpression(animRef, "AttachNotifyEvent"), new CodeExpression[] { new CodePrimitiveExpression(i), new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), validNotifyName) }); //CodeArrayIndexerExpression arrayIndex = new CodeArrayIndexerExpression(new CodeFieldReferenceExpression(animRef, "Notifies"), new CodePrimitiveExpression(i)); //CodeAttachEventStatement attachEvent = new CodeAttachEventStatement(arrayIndex, "OnNotify", new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), validNotifyName)); codeStatementCollection.Add(attachNotifyEventExp); } } }