Beispiel #1
0
        private string RenderScene()
        {
            pboxPreview.Image = null;


            int width     = int.Parse(txtbxWidth.Text);
            int height    = int.Parse(txtbxHeight.Text);
            int samples   = int.Parse(txtbxSamples.Text);
            int chunkSize = int.Parse(txtbxChunkSize.Text);

            string fname = "Test";

            if (txtbxFileName.Text != "")
            {
                fname = txtbxFileName.Text;
            }

            List <Hittable> activeHittables = new List <Hittable>();

            foreach (string hittableName in listbxHittables.CheckedItems)
            {
                activeHittables.Add(GetHittable(hittableName));
            }

            XmlSerializer serializer = new XmlSerializer(typeof(PTObject[]));

            using (XmlWriter writer = XmlWriter.Create("autosave.xml"))
            {
                List <PTObject> temp = new List <PTObject>();
                foreach (PTObject material in materials.Values)
                {
                    temp.Add(material);
                }
                foreach (PTObject hittable in hittables.Values)
                {
                    temp.Add(hittable);
                }
                serializer.Serialize(writer, temp.ToArray());
            }

            PTObject scene = new HittableList(activeHittables.ToArray());

            Vec3 lookFrom = new Vec3(2f, 1.2f, -2f);
            Vec3 lookAt   = new Vec3(-2f, 0f, 2f);

            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            sw.Start();
            if (!PTObject.RenderSceneChunked(
                    width, height, samples, chunkSize, fname,
                    lookFrom, lookAt, new Vec3(0f, 1f, 0f), (float)Math.PI / 3f, (float)width / height, 0f, (lookFrom - lookAt).Length,
                    scene))
            {
                // all objects are invalidated if rendering fails.
                foreach (string textureName in textures.Keys)
                {
                    GetTexture(textureName).Destroy();
                }
                textures.Clear();
                foreach (string materialName in materials.Keys)
                {
                    GetMaterial(materialName).Destroy();
                }
                materials.Clear();
                foreach (string hittableName in hittables.Keys)
                {
                    GetHittable(hittableName).Destroy();
                }
                hittables.Clear();
                scene.Destroy();

                using (XmlReader reader = XmlReader.Create("autosave.xml"))
                {
                    PTObject[] autosaved = serializer.Deserialize(reader) as PTObject[];
                    for (int i = 0; i < autosaved.Length; i++)
                    {
                        switch (autosaved[i].Kind)
                        {
                        case PTObject.PTObjectKind.Hittable:
                            hittables.Add(i.ToString(), autosaved[i] as Hittable);
                            break;

                        case PTObject.PTObjectKind.Material:
                            materials.Add(i.ToString(), autosaved[i] as Material);
                            break;

                        case PTObject.PTObjectKind.Texture:
                            textures.Add(i.ToString(), autosaved[i] as Texture);
                            break;
                        }
                    }
                }

                return("Rendering failed.");
            }
            sw.Stop();

            scene.Destroy();

            Bitmap image = ReadBitmapFromPPM(Directory.GetCurrentDirectory() + "\\" + fname + ".ppm");

            pboxPreview.Image = image;
            return($"Last Render Took: {sw.ElapsedMilliseconds} ms");
        }
Beispiel #2
0
 private void HittableInvalidated(PTObject sender) => Destroy();
Beispiel #3
0
 private void TextureInvalidated(PTObject sender) => Destroy();
Beispiel #4
0
 private void MaterialInvalidated(PTObject sender) => Destroy();