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"); }
private void HittableInvalidated(PTObject sender) => Destroy();
private void TextureInvalidated(PTObject sender) => Destroy();
private void MaterialInvalidated(PTObject sender) => Destroy();