Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 5
0
        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;
        }
Ejemplo n.º 6
0
        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;
                }
            }
        }
Ejemplo n.º 7
0
        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);
                }
            }
        }