Exemple #1
0
        private List <SerializableFLBuffer> ParseDefinedBuffersTask(List <string> defineStatements, int start, int count)
        {
            List <SerializableFLBuffer> definedBuffers = new List <SerializableFLBuffer>();

            for (int i = start; i < start + count; i++)
            {
                string[] data = defineStatements[i].Replace("--define texture", "")
                                .Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
                string bufferName = data[0].Trim();
                if (bufferName == "in")
                {
                    SerializableFLBuffer bi = new SerializableEmptyFLBuffer("in");
                    definedBuffers.Add(bi);
                    continue;
                }


                string paramPart = data[1].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)[0];

                SerializableFLBuffer buf = parser.BufferCreator.Create(paramPart, bufferName,
                                                                       data[1].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries));
                if (buf != null)
                {
                    definedBuffers.Add(buf);
                }
                else if (IOManager.FileExists(data[1].Trim().Replace("\"", "")))
                {
                    SerializableFromFileFLBuffer bi =
                        new SerializableFromFileFLBuffer(bufferName, data[1].Trim().Replace("\"", ""));
                    definedBuffers.Add(bi);
                }
                else
                {
                    throw new Byt3Exception($"Can not Find BufferLoader for \"{defineStatements[i]}\"");
                }
            }

            return(definedBuffers);
        }
Exemple #2
0
        protected override void Validate(
            SerializableFLProgram prog, SerializableFLFunction func,
            SerializableFLInstruction inst, SerializableFLInstructionArgument arg)
        {
            SerializableFLBuffer buf = prog.DefinedBuffers.First(x => x.Name == arg.Identifier);

            if (buf.Modifiers.IsReadOnly)
            {
                throw new FLInvalidFLElementModifierUseException(
                          func.Name,
                          FLKeywords.ReadOnlyBufferModifier,
                          $"Can not use instruction {inst.InstructionKey} with a static buffer."
                          );
            }

            if (buf.Modifiers.IsArray)
            {
                throw new FLInvalidFLElementModifierUseException(
                          func.Name,
                          FLKeywords.ArrayKey,
                          $"Can not use instruction {inst.InstructionKey} with an array buffer."
                          );
            }
        }
        public override object Process(object o)
        {
            SerializableFLProgram                    input       = (SerializableFLProgram)o;
            List <SerializableRandomFLBuffer>        rndBuffers  = new List <SerializableRandomFLBuffer>();
            List <SerializableUnifiedRandomFLBuffer> urndBuffers = new List <SerializableUnifiedRandomFLBuffer>();

            for (int i = 0; i < input.DefinedBuffers.Count; i++)
            {
                SerializableFLBuffer serializableFlBuffer = input.DefinedBuffers[i];
                if (serializableFlBuffer is SerializableRandomFLBuffer r)
                {
                    rndBuffers.Add(r);
                    input.DefinedBuffers[i] = new SerializableEmptyFLBuffer(r.Name);
                }
                else if (serializableFlBuffer is SerializableUnifiedRandomFLBuffer u)
                {
                    urndBuffers.Add(u);
                    input.DefinedBuffers[i] = new SerializableEmptyFLBuffer(u.Name);
                }
            }

            List <SerializableFLInstruction> weavedBufferInitializationCode = new List <SerializableFLInstruction>();

            for (int i = 0; i < rndBuffers.Count; i++)
            {
                weavedBufferInitializationCode.Add(new SerializableFLInstruction("setactive", new List <SerializableFLInstructionArgument>
                {
                    new SerializeBufferArgument(rndBuffers[i].Name),
                    new SerializeDecimalArgument(0),
                    new SerializeDecimalArgument(1),
                    new SerializeDecimalArgument(2),
                    new SerializeDecimalArgument(3),
                }));
                weavedBufferInitializationCode.Add(new SerializableFLInstruction("rnd_gpu", new List <SerializableFLInstructionArgument>()));
            }

            for (int i = 0; i < urndBuffers.Count; i++)
            {
                weavedBufferInitializationCode.Add(new SerializableFLInstruction("setactive", new List <SerializableFLInstructionArgument>
                {
                    new SerializeBufferArgument(urndBuffers[i].Name),
                    new SerializeDecimalArgument(0),
                    new SerializeDecimalArgument(1),
                    new SerializeDecimalArgument(2),
                    new SerializeDecimalArgument(3),
                }));
                weavedBufferInitializationCode.Add(new SerializableFLInstruction("urnd_gpu", new List <SerializableFLInstructionArgument>()));
            }
            weavedBufferInitializationCode.Add(new SerializableFLInstruction("setactive", new List <SerializableFLInstructionArgument>
            {
                new SerializeBufferArgument("in"),
                new SerializeDecimalArgument(0),
                new SerializeDecimalArgument(1),
                new SerializeDecimalArgument(2),
                new SerializeDecimalArgument(3),
            }));


            if (urndBuffers.Count != 0 || rndBuffers.Count != 0)
            {
                string s = "Weaved Assembly:\n";
                weavedBufferInitializationCode.ForEach(x => s += "\t" + x + "\n");
                Logger.Log(LogType.Log, s, 2);
                input.Functions.First(x => x.Name == "Main").Instructions.InsertRange(0, weavedBufferInitializationCode);
            }
            return(input);
        }
Exemple #4
0
        private List <SerializableFLBuffer> ParseDefinedBuffersTask(
            List <DefineStatement> defineStatements, int start,
            int count)
        {
            List <SerializableFLBuffer> definedBuffers = new List <SerializableFLBuffer>();

            for (int i = start; i < start + count; i++)
            {
                FLBufferModifiers bmod       = defineStatements[i].Modifiers as FLBufferModifiers;
                string            name       = defineStatements[i].Name;
                List <string>     parameter  = defineStatements[i].Parameter.ToList();
                string            bufferName = bmod.ElementName;

                if (bufferName == FLKeywords.InputBufferKey)
                {
                    SerializableFLBuffer bi = new SerializableEmptyFLBuffer(FLKeywords.InputBufferKey, bmod);
                    definedBuffers.Add(bi);
                    continue;
                }

                string creatorKey = parameter.First();
                parameter.RemoveAt(0);


                if (creatorKey.StartsWith("\"") && creatorKey.EndsWith("\"")
                    ) //IOManager.FileExists(paramPart.Trim().Replace("\"", ""))
                {
                    string path = creatorKey.Trim().Replace("\"", "");
                    SerializableFromFileFLBuffer bi =
                        new SerializableFromFileFLBuffer(bufferName, path, bmod, 0);
                    definedBuffers.Add(bi);
                }
                else
                {
                    int size = -1;
                    if (bmod.IsArray &&
                        parameter.Count != 0 &&
                        !int.TryParse(
                            parameter[0],
                            NumberStyles.AllowDecimalPoint,
                            CultureInfo.InvariantCulture,
                            out size
                            ))
                    {
                    }

                    SerializableFLBuffer buf =
                        parser.BufferCreator.Create(creatorKey, bufferName, parameter.ToArray(), bmod, size);
                    if (buf != null)
                    {
                        definedBuffers.Add(buf);
                    }
                    else
                    {
                        throw new Byt3Exception($"Can not Find BufferLoader for \"{defineStatements[i]}\"");
                    }
                }
            }

            return(definedBuffers);
        }
Exemple #5
0
        public override object Process(object o)
        {
            SerializableFLProgram                    input       = (SerializableFLProgram)o;
            List <SerializableRandomFLBuffer>        rndBuffers  = new List <SerializableRandomFLBuffer>();
            List <SerializableUnifiedRandomFLBuffer> urndBuffers = new List <SerializableUnifiedRandomFLBuffer>();

            for (int i = 0; i < input.DefinedBuffers.Count; i++)
            {
                if (input.DefinedBuffers[i].IsArray)
                {
                    continue; //No support for arrays due to crashes that have not yet been fixed.
                }

                SerializableFLBuffer serializableFlBuffer = input.DefinedBuffers[i];
                if (serializableFlBuffer is SerializableRandomFLBuffer r)
                {
                    rndBuffers.Add(r);
                    if (r.IsArray)
                    {
                        input.DefinedBuffers[i] = new SerializableEmptyFLBuffer(r.Name, r.Size, r.Modifiers);
                    }
                    else
                    {
                        input.DefinedBuffers[i] = new SerializableEmptyFLBuffer(r.Name, r.Modifiers);
                    }
                }
                else if (serializableFlBuffer is SerializableUnifiedRandomFLBuffer u)
                {
                    urndBuffers.Add(u);
                    if (u.IsArray)
                    {
                        input.DefinedBuffers[i] = new SerializableEmptyFLBuffer(u.Name, u.Size, u.Modifiers);
                    }
                    else
                    {
                        input.DefinedBuffers[i] = new SerializableEmptyFLBuffer(u.Name, u.Modifiers);
                    }
                }
            }

            List <SerializableFLInstruction> weavedBufferInitializationCode = new List <SerializableFLInstruction>();

            for (int i = 0; i < rndBuffers.Count; i++)
            {
                weavedBufferInitializationCode.Add(
                    new SerializableFLInstruction(
                        "setactive",
                        new
                        List <SerializableFLInstructionArgument>
                {
                    new SerializeBufferArgument(
                        rndBuffers
                        [i]
                        .Name
                        ),
                    new SerializeDecimalArgument(0),
                    new SerializeDecimalArgument(1),
                    new SerializeDecimalArgument(2),
                    new SerializeDecimalArgument(3)
                }
                        )
                    );
                weavedBufferInitializationCode.Add(
                    new SerializableFLInstruction(
                        "rnd_gpu",
                        new List <
                            SerializableFLInstructionArgument
                            >
                {
                    new SerializeDecimalArgument(seedGenerator.Next()),
                    new SerializeDecimalArgument(seedGenerator.Next())
                }
                        )
                    );
            }

            for (int i = 0; i < urndBuffers.Count; i++)
            {
                weavedBufferInitializationCode.Add(
                    new SerializableFLInstruction(
                        "setactive",
                        new
                        List <SerializableFLInstructionArgument>
                {
                    new SerializeBufferArgument(
                        urndBuffers
                        [i]
                        .Name
                        ),
                    new SerializeDecimalArgument(0),
                    new SerializeDecimalArgument(1),
                    new SerializeDecimalArgument(2),
                    new SerializeDecimalArgument(3)
                }
                        )
                    );
                weavedBufferInitializationCode.Add(
                    new SerializableFLInstruction(
                        "urnd_gpu",
                        new List <
                            SerializableFLInstructionArgument
                            >
                {
                    new SerializeDecimalArgument(seedGenerator.Next()),
                    new SerializeDecimalArgument(seedGenerator.Next())
                }
                        )
                    );
            }

            weavedBufferInitializationCode.Add(
                new SerializableFLInstruction(
                    "setactive",
                    new List <SerializableFLInstructionArgument>
            {
                new SerializeBufferArgument(
                    FLKeywords
                    .InputBufferKey
                    ),
                new SerializeDecimalArgument(0),
                new SerializeDecimalArgument(1),
                new SerializeDecimalArgument(2),
                new SerializeDecimalArgument(3)
            }
                    )
                );


            if (urndBuffers.Count != 0 || rndBuffers.Count != 0)
            {
                string s = "Weaved Assembly:\n";
                weavedBufferInitializationCode.ForEach(x => s += "\t" + x + "\n");
                Logger.Log(LogType.Log, s, 2);
                input.Functions.First(x => x.Name == FLKeywords.EntryFunctionKey).Instructions
                .InsertRange(0, weavedBufferInitializationCode);
            }

            return(input);
        }