public void BuilderWorldObjectStatePropertiesAreSetCorrectly() { var fill = new ColorVector(1.0, 0.5, 1.0); var border = new ColorVector(0.2, 0.3, 0.4); var state = new BuilderWorldObjectState(fill, border); Assert.AreEqual(fill, state.Fill); Assert.AreEqual(border, state.Border); }
public void Screen() { Assert.Equal(ColorVector.Screen(Backdrop, ColorVector.Black).ToVector4(), Backdrop.ToVector4(), FloatComparer); Assert.Equal(ColorVector.Screen(Backdrop, ColorVector.White).ToVector4(), ColorVector.White.ToVector4(), FloatComparer); ColorVector screen = ColorVector.Screen(Backdrop, Source); Assert.Equal(screen.ToVector4(), new ColorVector(204, 163, 153).ToVector4(), FloatComparer); }
public void Multiply() { Assert.Equal(ColorVector.Multiply(Backdrop, ColorVector.Black).ToVector4(), Color.Black.ToVector4(), FloatComparer); Assert.Equal(ColorVector.Multiply(Backdrop, ColorVector.White).ToVector4(), Backdrop.ToVector4(), FloatComparer); ColorVector multiply = ColorVector.Multiply(Backdrop, Source); Assert.Equal(multiply.ToVector4(), new ColorVector(0, 41, 0).ToVector4(), FloatComparer); }
public PixelBuffer Execute(int width, int height) { var pixelBuffer = new PixelBuffer(width, height); float aperture = 2.0f; var lookFrom = new Vector3(3.0f, 3.0f, 2.0f); var lookAt = new Vector3(0.0f, 0.0f, -1.0f); float distanceToFocus = (lookFrom - lookAt).Length(); // .Magnitude(); var camera = new Camera( lookFrom, lookAt, new Vector3(0.0f, 1.0f, 0.0f), 30.0f, Convert.ToSingle(width) / Convert.ToSingle(height), aperture, distanceToFocus); var hitables = new HitableList { new Sphere(new Vector3(0.0f, 0.0f, -1.0f), 0.5f, new LambertianMaterial(new ColorTexture(0.1f, 0.2f, 0.5f))), new Sphere(new Vector3(0.0f, -100.5f, -1.0f), 100.0f, new LambertianMaterial(new ColorTexture(0.8f, 0.8f, 0.0f))), new Sphere(new Vector3(1.0f, 0.0f, -1.0f), 0.5f, new MetalMaterial(new ColorVector(0.8f, 0.6f, 0.2f), 0.3f)), new Sphere(new Vector3(-1.0f, 0.0f, -1.0f), 0.5f, new DialectricMaterial(1.5f)), new Sphere(new Vector3(-1.0f, 0.0f, -1.0f), -0.45f, new DialectricMaterial(1.5f)), }; var world = new HitableList { hitables }; for (int j = height - 1; j >= 0; j--) { for (int i = 0; i < width; i++) { ColorVector color = new ColorVector(0.0f, 0.0f, 0.0f); for (int sample = 0; sample < _numSamples; sample++) { float u = Convert.ToSingle(i + RandomService.Nextfloat()) / Convert.ToSingle(width); float v = Convert.ToSingle(j + RandomService.Nextfloat()) / Convert.ToSingle(height); var r = camera.GetRay(u, v); color += GetRayColor(r, world, 0); } color /= Convert.ToSingle(_numSamples); color = color.ApplyGamma2(); pixelBuffer.SetPixelColor(i, j, color); } Console.Write("."); } Console.WriteLine(); return(pixelBuffer); }
public void Color_Types_From_Hex_Produce_Equal_Scaled_Component_OutPut() { Color color = Color.FromHex("183060C0"); ColorVector colorVector = ColorVector.FromHex("183060C0"); Assert.Equal(color.R, (byte)(colorVector.R * 255)); Assert.Equal(color.G, (byte)(colorVector.G * 255)); Assert.Equal(color.B, (byte)(colorVector.B * 255)); Assert.Equal(color.A, (byte)(colorVector.A * 255)); }
public void Color_Types_From_Bytes_Produce_Equal_Scaled_Component_OutPut() { Color color = new Color(24, 48, 96, 192); ColorVector colorVector = new ColorVector(24, 48, 96, 192); Assert.Equal(color.R, (byte)(colorVector.R * 255)); Assert.Equal(color.G, (byte)(colorVector.G * 255)); Assert.Equal(color.B, (byte)(colorVector.B * 255)); Assert.Equal(color.A, (byte)(colorVector.A * 255)); }
public void Color_Types_From_Vector3_Produce_Equal_Scaled_Component_OutPut() { Color color = new Color(new Vector3(24 / 255F, 48 / 255F, 96 / 255F)); ColorVector colorVector = new ColorVector(new Vector3(24 / 255F, 48 / 255F, 96 / 255F)); Assert.Equal(color.R, (byte)(colorVector.R * 255)); Assert.Equal(color.G, (byte)(colorVector.G * 255)); Assert.Equal(color.B, (byte)(colorVector.B * 255)); Assert.Equal(color.A, (byte)(colorVector.A * 255)); }
private IFactory <IRenderable> CreateBlockIconFactory(ColorVector fill, ColorVector border) { var blockIconStates = new BuilderWorldObjectState[1]; blockIconStates[(int)ActiveState.Normal] = new BuilderWorldObjectState(fill, border); var frameworkElementFactory = new RectangleFrameworkElementFactory(1); var blockIconFactory = new WpfRenderableFactory(mainCanvas, frameworkElementFactory, blockIconStates); return(blockIconFactory); }
public void AreNotEqual() { ColorVector color1 = new ColorVector(1, 0, 0, 1); ColorVector color2 = new ColorVector(0, 0, 0, 1); ColorVector color3 = ColorVector.FromHex("#000"); ColorVector color4 = ColorVector.FromHex("#000000"); ColorVector color5 = ColorVector.FromHex("#FF000000"); Assert.NotEqual(color1, color2); Assert.NotEqual(color1, color3); Assert.NotEqual(color1, color4); Assert.NotEqual(color1, color5); }
public void FloatLayout() { ColorVector color = new ColorVector(1F, 2, 3, 4); Vector4 colorBase = Unsafe.As <ColorVector, Vector4>(ref Unsafe.Add(ref color, 0)); float[] ordered = new float[4]; colorBase.CopyTo(ordered); Assert.Equal(1, ordered[0]); Assert.Equal(2, ordered[1]); Assert.Equal(3, ordered[2]); Assert.Equal(4, ordered[3]); }
public void Color_Types_To_BgraBytes_Produce_Equal_OutPut() { Color color = new Color(24, 48, 96, 192); ColorVector colorVector = new ColorVector(24, 48, 96, 192); byte[] bgra = new byte[4]; byte[] bgraVector = new byte[4]; color.ToZyxwBytes(bgra, 0); colorVector.ToZyxwBytes(bgraVector, 0); Assert.Equal(bgra, bgraVector); }
public void Color_Types_To_RgbaBytes_Produce_Equal_OutPut() { Color color = new Color(24, 48, 96, 192); ColorVector colorVector = new ColorVector(24, 48, 96, 192); byte[] rgba = new byte[4]; byte[] rgbaVector = new byte[4]; color.ToXyzwBytes(rgba, 0); colorVector.ToXyzwBytes(rgbaVector, 0); Assert.Equal(rgba, rgbaVector); }
public SaveColor(ColorVector xyY, ColorVector XYZ, ColorVector RGB) { InitializeComponent(); EnableButtons(); this.xyY = xyY; this.XYZ = XYZ; this.RGB = RGB; this.xyYRadio.Text += " (" + xyY + ")"; this.XYZRadio.Text += " (" + XYZ + ")"; this.RGBRadio.Text += " (" + RGB.ToRGBString(100) + ")"; UpdateColor(); }
public void RenderableIsCreatedAndInitializedWithFirstState() { var red = new ColorVector(1.0, 0.0, 0.0); var green = new ColorVector(0.0, 1.0, 0.0); states[0] = new BuilderWorldObjectState(green, red); mockElementWrapper.SetupSet(wrapper => wrapper.Border = red).Verifiable(); mockElementWrapper.SetupSet(wrapper => wrapper.Fill = green).Verifiable(); wpfRenderableFactory.Create(); mockElementWrapper.VerifySet(wrapper => wrapper.Border = red, Times.Once()); mockElementWrapper.VerifySet(wrapper => wrapper.Fill = green, Times.Once()); }
public PixelBuffer Execute(int width, int height) { var pixelBuffer = new PixelBuffer(width, height); var lowerLeftCorner = new Vector3(-2.0f, -1.0f, -1.0f); var horizontal = new Vector3(4.0f, 0.0f, 0.0f); var vertical = new Vector3(0.0f, 2.0f, 0.0f); var origin = Vector3.Zero; var camera = new BasicCamera(origin, lowerLeftCorner, horizontal, vertical); var hitables = new HitableList { new Sphere(new Vector3(0.0f, 0.0f, -1.0f), 0.5f, new LambertianMaterial(new ColorTexture(0.8f, 0.3f, 0.3f))), new Sphere(new Vector3(0.0f, -100.5f, -1.0f), 100.0f, new LambertianMaterial(new ColorTexture(0.8f, 0.8f, 0.0f))), new Sphere(new Vector3(1.0f, 0.0f, -1.0f), 0.5f, new MetalMaterial(new ColorVector(0.8f, 0.6f, 0.2f), 0.3f)), new Sphere(new Vector3(-1.0f, 0.0f, -1.0f), 0.5f, new DialectricMaterial(1.5f)), new Sphere(new Vector3(-1.0f, 0.0f, -1.0f), -0.45f, new DialectricMaterial(1.5f)), }; var world = new HitableList { hitables }; for (int j = height - 1; j >= 0; j--) { for (int i = 0; i < width; i++) { ColorVector color = new ColorVector(0.0f, 0.0f, 0.0f); for (int sample = 0; sample < _numSamples; sample++) { float u = Convert.ToSingle(i + RandomService.Nextfloat()) / Convert.ToSingle(width); float v = Convert.ToSingle(j + RandomService.Nextfloat()) / Convert.ToSingle(height); var r = camera.GetRay(u, v); color += GetRayColor(r, world, 0); } color /= Convert.ToSingle(_numSamples); color = color.ApplyGamma2(); pixelBuffer.SetPixelColor(i, j, color); } Console.Write("."); } Console.WriteLine(); return(pixelBuffer); }
//https://en.wikipedia.org/wiki/HSL_and_HSV#From_HSV public ColorVector HSVToRGB() { float saturationProportion = Y * .01f; float valueProportion = Z * .01f; float chroma = valueProportion * saturationProportion; float hPrime = X / 60f; float x = chroma * (1 - Math.Abs(hPrime % 2 - 1)); ColorVector rgb = new ColorVector(0, 0, 0); if (hPrime <= 1) { rgb.X = chroma; rgb.Y = x; } else if (hPrime <= 2) { rgb.X = x; rgb.Y = chroma; } else if (hPrime <= 3) { rgb.Y = chroma; rgb.Z = x; } else if (hPrime <= 4) { rgb.Y = x; rgb.Z = chroma; } else if (hPrime <= 5) { rgb.X = x; rgb.Z = chroma; } else if (hPrime <= 6) { rgb.X = chroma; rgb.Z = x; } float m = valueProportion - chroma; rgb += m; rgb *= 255; return(rgb); }
void UpdateColorPreviewsHSV() { textBoxOutput.AppendText("\r\n-----------------------------------------\r\n"); textBoxOutput.AppendText("Updating HSV\r\n"); var hue = (float)numericUpDownHue.Value; var saturation = (float)numericUpDownSaturation.Value; var value = (float)numericUpDownValue.Value; var hsv = new ColorVector(hue, saturation, value); var rgb = hsv.HSVToRGB(); var color = rgb.RGBToColor(); pictureBoxNewColorPreview.BackColor = color; replacementColor = color; }
public void AreEqual() { ColorVector color1 = new ColorVector(0, 0, 0F); ColorVector color2 = new ColorVector(0, 0, 0, 1F); ColorVector color3 = ColorVector.FromHex("#000"); ColorVector color4 = ColorVector.FromHex("#000F"); ColorVector color5 = ColorVector.FromHex("#000000"); ColorVector color6 = ColorVector.FromHex("#000000FF"); Assert.Equal(color1, color2); Assert.Equal(color1, color3); Assert.Equal(color1, color4); Assert.Equal(color1, color5); Assert.Equal(color1, color6); }
void CreateColorOffsets() { textBoxOutput.AppendText("\r\n-----------------------------------------\r\n"); textBoxOutput.AppendText("Creating color offset\r\n"); List <KeyValuePair <string, ColorVector> > kvpList = uniqueColors.ToList(); offsetText = text; foreach (var kvp in kvpList) { var color = kvp.Value; color = new ColorVector(color.X, color.Y, color.Z + 25f); offsetText = offsetText.Replace(kvp.Key, color.ClampHSV().Round().HSVToColorMask().ToMaskString()); textBoxOutput.AppendText($"Old: {kvp.Key}\r\nNew: { color.ClampHSV().HSVToColorMask().ToMaskString()}\r\n"); } }
public void WpfStateIsSetCorrectly() { var fill = new ColorVector(1, 0.5, 0.1); var border = new ColorVector(0.1, 0.2, 0.3); var stubState = new BuilderWorldObjectState(fill, border); mockElementWrapper.SetupSet(wrapper => wrapper.Fill = fill).Verifiable(); mockElementWrapper.SetupSet(wrapper => wrapper.Fill = fill).Verifiable(); stubStates[1] = stubState; wpfRenderable.SetState(1); mockElementWrapper.VerifySet(wrapper => wrapper.Fill = fill, Times.Once()); mockElementWrapper.VerifySet(wrapper => wrapper.Border = border, Times.Once()); }
/// <inheritdoc /> public override ScatterResult Scatter(Ray rayIn, HitRecord hitRecord) { var reflected = rayIn.Direction.Reflect(hitRecord.Normal); var attenuation = new ColorVector(1.0f, 1.0f, 1.0f); float niOverNt; Vector3 outwardNormal; float cosine; if (Vector3.Dot(rayIn.Direction, hitRecord.Normal) > 0.0f) { outwardNormal = -hitRecord.Normal; niOverNt = RefractionIndex; cosine = RefractionIndex * Vector3.Dot(rayIn.Direction, hitRecord.Normal) / rayIn.Direction.Length(); } else { outwardNormal = hitRecord.Normal; niOverNt = 1.0f / RefractionIndex; cosine = -Vector3.Dot(rayIn.Direction, hitRecord.Normal) / rayIn.Direction.Length(); } float reflectProbability; Ray scattered; var refracted = rayIn.Direction.Refract(outwardNormal, niOverNt); if (refracted != Vector3.Zero) { reflectProbability = CalculateSchlickApproximation(cosine, RefractionIndex); } else { scattered = new Ray(hitRecord.P, reflected); reflectProbability = 1.0f; } if (RandomService.Nextfloat() < reflectProbability) { scattered = new Ray(hitRecord.P, reflected); } else { scattered = new Ray(hitRecord.P, refracted); } return(new ScatterResult(true, attenuation, scattered, null)); }
public PixelBuffer Execute(int width, int height) { var pixelBuffer = new PixelBuffer(width, height); var lowerLeftCorner = new Vector3(-2.0f, -1.0f, -1.0f); var horizontal = new Vector3(4.0f, 0.0f, 0.0f); var vertical = new Vector3(0.0f, 2.0f, 0.0f); var origin = Vector3.Zero; var camera = new BasicCamera(origin, lowerLeftCorner, horizontal, vertical); var hitables = new HitableList { new Sphere(new Vector3(0.0f, 0.0f, -1.0f), 0.5f), new Sphere(new Vector3(0.0f, -100.5f, -1.0f), 100.0f) }; var world = new HitableList { hitables }; for (int j = height - 1; j >= 0; j--) { for (int i = 0; i < width; i++) { ColorVector color = new ColorVector(0.0f, 0.0f, 0.0f); for (int sample = 0; sample < _numSamples; sample++) { float u = Convert.ToSingle(i + GetRandom()) / Convert.ToSingle(width); float v = Convert.ToSingle(j + GetRandom()) / Convert.ToSingle(height); var r = camera.GetRay(u, v); color += GetRayColor(r, world); } color /= Convert.ToSingle(_numSamples); pixelBuffer.SetPixelColor(i, j, color); } Console.Write("."); } Console.WriteLine(); return(pixelBuffer); }
public PixelBuffer Execute(int width, int height) { var pixelBuffer = new PixelBuffer(width, height); for (int j = height - 1; j >= 0; j--) { for (int i = 0; i < width; i++) { var color = new ColorVector( Convert.ToSingle(i) / Convert.ToSingle(width), Convert.ToSingle(j) / Convert.ToSingle(height), 0.2f); pixelBuffer.SetPixelColor(i, j, color); } } return(pixelBuffer); }
public PixelBuffer Execute(int width, int height) { var pixelBuffer = new PixelBuffer(width, height); float aperture = 0.01f; var lookFrom = new Vector3(24.0f, 2.0f, 6.0f); var lookAt = Vector3.UnitY; float distanceToFocus = (lookFrom - lookAt).Length(); var camera = new Camera( lookFrom, lookAt, Vector3.UnitY, 15.0f, Convert.ToSingle(width) / Convert.ToSingle(height), aperture, distanceToFocus); var world = CreateRandomScene(); for (int j = height - 1; j >= 0; j--) { for (int i = 0; i < width; i++) { ColorVector color = new ColorVector(0.0f, 0.0f, 0.0f); for (int sample = 0; sample < _numSamples; sample++) { float u = Convert.ToSingle(i + GetRandom()) / Convert.ToSingle(width); float v = Convert.ToSingle(j + GetRandom()) / Convert.ToSingle(height); var r = camera.GetRay(u, v); color += GetRayColor(r, world, 0); } color /= Convert.ToSingle(_numSamples); color = color.ApplyGamma2(); pixelBuffer.SetPixelColor(i, j, color); } Console.Write("."); } Console.WriteLine(); return(pixelBuffer); }
string RoundColors(string text, string maskPattern) { var matches = Regex.Matches(text, maskPattern); uniqueStrings.Clear(); foreach (var match in matches) { var matchString = match.ToString(); uniqueStrings.Add(matchString); } foreach (var matchString in uniqueStrings) { var color = ColorVector.HSVFromMaskString(matchString).ClampHSV().Round(); var roundedColorString = color.HSVToColorMask().ToMaskString(); text = text.Replace(matchString, roundedColorString); } return(text); }
public static ColorVector HSVFromMaskString(string mask) { if (!Regex.IsMatch(mask, maskPattern)) { //Console.WriteLine("Regex did not match"); return(new ColorVector(0, 0, 0)); } mask = mask.Replace(" ", ""); //remove spaces var maskSplit = mask.Split('"'); if (maskSplit.Length < 6) { return(new ColorVector(0, 0, 0)); } float h = 0, s = 0, v = 0; var format = new NumberFormatInfo(); format.NumberDecimalSeparator = "."; if (!float.TryParse(maskSplit[1], (NumberStyles.Number | NumberStyles.AllowExponent), format, out h) || !float.TryParse(maskSplit[3], (NumberStyles.Number | NumberStyles.AllowExponent), format, out s) || !float.TryParse(maskSplit[5], (NumberStyles.Number | NumberStyles.AllowExponent), format, out v)) { /* * Console.WriteLine("Color failed to parse"); * Console.WriteLine(float.TryParse(maskSplit[1], NumberStyles.Number, format, out h)); * Console.WriteLine(float.TryParse(maskSplit[3], NumberStyles.Number, format, out s)); * Console.WriteLine(float.TryParse(maskSplit[5], NumberStyles.Number, format, out v)); */ return(new ColorVector(0, 0, 0)); } ColorVector hsvMask = new ColorVector(h, s, v); return(hsvMask.ColorMaskToHSV()); //<ColorMaskHSV x="0" y="-0.8" z="7.450581E-09" /> // 0 1 2 3 4 5 6 }
public void SetPixelColor(int x, int y, ColorVector color) { _dispatcher.Invoke( () => { Debug.WriteLine($"SetPixelColor ({x}, {y}) --> {color}"); _pixelBuffer.SetPixelColor(x, y, color); int yToSet = IsYUp ? (Height - 1 - y) : y; Lock(); try { UnsafeSetPixelColor(x, yToSet, color); WriteableBitmap.AddDirtyRect(new Int32Rect(0, 0, Width, Height)); // AddDirtyRect(new Int32Rect(x, yToSet, 1, 1)); } finally { Unlock(); } }); }
private void UnsafeSetPixelColor(int x, int y, ColorVector color) { unsafe { // Get a pointer to the back buffer. int pBackBuffer = (int)WriteableBitmap.BackBuffer; // Find the address of the pixel to draw. pBackBuffer += y * WriteableBitmap.BackBufferStride; pBackBuffer += x * 4; // Compute the pixel's color. var clamped = color.Clamp(); int colorData = ColorToInt(clamped.R) << 16; // R colorData |= ColorToInt(clamped.G) << 8; // G colorData |= ColorToInt(clamped.B) << 0; // B // Assign the color data to the pixel. *((int *)pBackBuffer) = colorData; } }
void ReplaceColor() { listBoxColors.ClearSelected(); textBoxOutput.AppendText("\r\n-----------------------------------------\r\n"); textBoxOutput.AppendText($"Replacing color\r\n"); var rgb = ColorVector.FromColor(replacementColor); textBoxOutput.AppendText($"RGB: {rgb}\r\n"); var hsv = rgb.RGBToHSV().Round(); textBoxOutput.AppendText($"HSV: {hsv}\r\n"); var hsvMask = hsv.ClampHSV().HSVToColorMask().ToMaskString(); //clamps before converting to the mask textBoxOutput.AppendText($"mask: {hsvMask}\r\n"); text = text.Replace(maskToReplace, hsvMask); pictureBoxOldColorPreview.BackColor = replacementColor; GetUniqueColors(text, maskPattern); WriteColorsToListBox(); }
public void FromAndToHex() { ColorVector color = ColorVector.FromHex("#AABBCCDD"); Assert.Equal(170 / 255F, color.R); Assert.Equal(187 / 255F, color.G); Assert.Equal(204 / 255F, color.B); Assert.Equal(221 / 255F, color.A); color.A = 170 / 255F; color.B = 187 / 255F; color.G = 204 / 255F; color.R = 221 / 255F; Assert.Equal("DDCCBBAA", color.ToHex()); color.R = 0; Assert.Equal("00CCBBAA", color.ToHex()); color.A = 255 / 255F; Assert.Equal("00CCBBFF", color.ToHex()); }
public static ColorVector ToVector(this Color color) { var colorVector = new ColorVector(((float)color.R) / 255f, ((float)color.G) / 255f, ((float)color.B) / 255f, ((float)color.A) / 255f); return colorVector; }