Beispiel #1
0
        /// <summary>
        /// Assigns a new value to a subscript of an existing value
        /// </summary>
        /// <param name="destList">The list to retrieve the value from</param>
        /// <param name="destIndex">The index of the item to change</param>
        /// <param name="subIndex">The subscript index to change</param>
        /// <param name="subScriptValue">The new value for the subscript</param>
        /// <returns>The old subscript value</returns>
        private float _AssignSubscript(object[] destList, int destIndex, int subIndex, object subScriptValue,
                                       SubScriptOp op)
        {
            object currLocal = destList[destIndex];

            if (currLocal is Vector3)
            {
                Vector3 vlocal = (Vector3)currLocal;

                switch (subIndex)
                {
                case 0:
                    if (op == SubScriptOp.INC)
                    {
                        subScriptValue = vlocal.X + 1;
                    }
                    else if (op == SubScriptOp.DEC)
                    {
                        subScriptValue = vlocal.X - 1;
                    }

                    destList[destIndex] = new Vector3((float)subScriptValue, vlocal.Y, vlocal.Z);
                    return(vlocal.X);

                case 1:
                    if (op == SubScriptOp.INC)
                    {
                        subScriptValue = vlocal.Y + 1;
                    }
                    else if (op == SubScriptOp.DEC)
                    {
                        subScriptValue = vlocal.Y - 1;
                    }

                    destList[destIndex] = new Vector3(vlocal.X, (float)subScriptValue, vlocal.Z);
                    return(vlocal.Y);

                case 2:
                    if (op == SubScriptOp.INC)
                    {
                        subScriptValue = vlocal.Z + 1;
                    }
                    else if (op == SubScriptOp.DEC)
                    {
                        subScriptValue = vlocal.Z - 1;
                    }

                    destList[destIndex] = new Vector3(vlocal.X, vlocal.Y, (float)subScriptValue);
                    return(vlocal.Z);

                default:
                    throw new VMException("Op_LoadSub: Invalid subscript index for vector");
                }
            }
            else if (currLocal is Quaternion)
            {
                Quaternion qlocal = (Quaternion)currLocal;
                switch (subIndex)
                {
                case 0:
                    if (op == SubScriptOp.INC)
                    {
                        subScriptValue = qlocal.X + 1;
                    }
                    else if (op == SubScriptOp.DEC)
                    {
                        subScriptValue = qlocal.X - 1;
                    }

                    destList[destIndex] = new Quaternion((float)subScriptValue, qlocal.Y, qlocal.Z, qlocal.W);
                    return(qlocal.X);

                case 1:
                    if (op == SubScriptOp.INC)
                    {
                        subScriptValue = qlocal.Y + 1;
                    }
                    else if (op == SubScriptOp.DEC)
                    {
                        subScriptValue = qlocal.Y - 1;
                    }

                    destList[destIndex] = new Quaternion(qlocal.X, (float)subScriptValue, qlocal.Z, qlocal.W);
                    return(qlocal.Y);

                case 2:
                    if (op == SubScriptOp.INC)
                    {
                        subScriptValue = qlocal.Z + 1;
                    }
                    else if (op == SubScriptOp.DEC)
                    {
                        subScriptValue = qlocal.Z - 1;
                    }

                    destList[destIndex] = new Quaternion(qlocal.X, qlocal.Y, (float)subScriptValue, qlocal.W);
                    return(qlocal.Z);

                case 3:
                    if (op == SubScriptOp.INC)
                    {
                        subScriptValue = qlocal.W + 1;
                    }
                    else if (op == SubScriptOp.DEC)
                    {
                        subScriptValue = qlocal.W - 1;
                    }

                    destList[destIndex] = new Quaternion(qlocal.X, qlocal.Y, qlocal.Z, (float)subScriptValue);
                    return(qlocal.W);

                default:
                    throw new VMException("Op_LoadSub: Invalid subscript index for rotation");
                }
            }
            else
            {
                throw new VMException("Op_LoadSub: Subscript access on non-subscriptable type");
            }
        }
        /// <summary>
        /// Assigns a new value to a subscript of an existing value
        /// </summary>
        /// <param name="destList">The list to retrieve the value from</param>
        /// <param name="destIndex">The index of the item to change</param>
        /// <param name="subIndex">The subscript index to change</param>
        /// <param name="subScriptValue">The new value for the subscript</param>
        /// <returns>The old subscript value</returns>
        private float _AssignSubscript(object[] destList, int destIndex, int subIndex, object subScriptValue,
            SubScriptOp op)
        {
            object currLocal = destList[destIndex];

            if (currLocal is Vector3)
            {
                Vector3 vlocal = (Vector3)currLocal;

                switch (subIndex)
                {
                    case 0:
                        if (op == SubScriptOp.INC)
                        {
                            subScriptValue = vlocal.X + 1;
                        }
                        else if (op == SubScriptOp.DEC)
                        {
                            subScriptValue = vlocal.X - 1;
                        }

                        destList[destIndex] = new Vector3((float)subScriptValue, vlocal.Y, vlocal.Z);
                        return vlocal.X;

                    case 1:
                        if (op == SubScriptOp.INC)
                        {
                            subScriptValue = vlocal.Y + 1;
                        }
                        else if (op == SubScriptOp.DEC)
                        {
                            subScriptValue = vlocal.Y - 1;
                        }

                        destList[destIndex] = new Vector3(vlocal.X, (float)subScriptValue, vlocal.Z);
                        return vlocal.Y;

                    case 2:
                        if (op == SubScriptOp.INC)
                        {
                            subScriptValue = vlocal.Z + 1;
                        }
                        else if (op == SubScriptOp.DEC)
                        {
                            subScriptValue = vlocal.Z - 1;
                        }

                        destList[destIndex] = new Vector3(vlocal.X, vlocal.Y, (float)subScriptValue);
                        return vlocal.Z;

                    default:
                        throw new VMException("Op_LoadSub: Invalid subscript index for vector");
                }
            }
            else if (currLocal is Quaternion)
            {
                Quaternion qlocal = (Quaternion)currLocal;
                switch (subIndex)
                {
                    case 0:
                        if (op == SubScriptOp.INC)
                        {
                            subScriptValue = qlocal.X + 1;
                        }
                        else if (op == SubScriptOp.DEC)
                        {
                            subScriptValue = qlocal.X - 1;
                        }

                        destList[destIndex] = new Quaternion((float)subScriptValue, qlocal.Y, qlocal.Z, qlocal.W);
                        return qlocal.X;

                    case 1:
                        if (op == SubScriptOp.INC)
                        {
                            subScriptValue = qlocal.Y + 1;
                        }
                        else if (op == SubScriptOp.DEC)
                        {
                            subScriptValue = qlocal.Y - 1;
                        }

                        destList[destIndex] = new Quaternion(qlocal.X, (float)subScriptValue, qlocal.Z, qlocal.W);
                        return qlocal.Y;

                    case 2:
                        if (op == SubScriptOp.INC)
                        {
                            subScriptValue = qlocal.Z + 1;
                        }
                        else if (op == SubScriptOp.DEC)
                        {
                            subScriptValue = qlocal.Z - 1;
                        }

                        destList[destIndex] = new Quaternion(qlocal.X, qlocal.Y, (float)subScriptValue, qlocal.W);
                        return qlocal.Z;

                    case 3:
                        if (op == SubScriptOp.INC)
                        {
                            subScriptValue = qlocal.W + 1;
                        }
                        else if (op == SubScriptOp.DEC)
                        {
                            subScriptValue = qlocal.W - 1;
                        }

                        destList[destIndex] = new Quaternion(qlocal.X, qlocal.Y, qlocal.Z, (float)subScriptValue);
                        return qlocal.W;

                    default:
                        throw new VMException("Op_LoadSub: Invalid subscript index for rotation");
                }
            }
            else
            {
                throw new VMException("Op_LoadSub: Subscript access on non-subscriptable type");
            }
        }