public override Voxel mutate(LocalApplication app, Index p, LocalAction action, Voxel original) { CubeAction cAction = (CubeAction)action; byte newOpacity = (byte)((original.averageOpacity() * (1 - cAction.percentInside) + value.averageOpacity() * (cAction.percentInside))); byte newSubstance = original.averageMaterialType(); if (overwriteSubstance && cAction.percentInside > 0.5) newSubstance = value.averageMaterialType(); if (!overwriteShape) newOpacity = original.averageOpacity(); return new Voxel(newSubstance, newOpacity); }
public override Voxel mutate(LocalApplication app, Index p, LocalAction action, Voxel original) { SphereApp sApp = (SphereApp)app; SphereAction sAction = (SphereAction)action; float dis = Mathf.Sqrt(sAction.disSqr); float percentInside = Mathf.Min((sAction.maxRadius -dis) /(sAction.maxRadius -sAction.minRadius), 1); byte newOpacity = (byte)(original.averageOpacity() * (1 -percentInside) + value.averageOpacity() * percentInside); byte newSubstance = original.averageMaterialType(); if (overwriteSubstance && (dis < sApp.radius || percentInside > 0.5f)) newSubstance = value.averageMaterialType(); if (!overwriteShape) newOpacity = original.averageOpacity(); return new Voxel(newSubstance, newOpacity); }
protected override VoxelHolder modifyVoxel(VoxelHolder original, int x, int y, int z) { double percentInside = 1; percentInside *= percentOverlapping(x, min.x); percentInside *= percentOverlapping(y, min.y); percentInside *= percentOverlapping(z, min.z); percentInside *= percentOverlapping(-x, -max.x); percentInside *= percentOverlapping(-y, -max.y); percentInside *= percentOverlapping(-z, -max.z); if (percentInside <= 0.001) { return(original); } if (percentInside >= 0.999) { return(new Voxel(value.averageMaterialType(), overwriteShape? value.averageOpacity(): original.averageOpacity())); } byte newOpacity = (byte)((original.averageOpacity() * (1 - percentInside) + value.averageOpacity() * (percentInside))); byte newSubstance = original.averageMaterialType(); if (newOpacity >= 2 * original.averageOpacity() || (overwriteSubstance && percentInside > 0.5)) { newSubstance = value.averageMaterialType(); } if (!overwriteShape) { newOpacity = original.averageOpacity(); } return(new Voxel(newSubstance, newOpacity)); }
protected byte calculateOpacity(int x, int y, int z, float strength) { double opacity = original[x, y, z].averageOpacity(); int minX = Mathf.Max(x - blurRadius, 0); int maxX = Mathf.Min(x + blurRadius, original.GetLength(0)); int minY = Mathf.Max(y - blurRadius, 0); int maxY = Mathf.Min(y + blurRadius, original.GetLength(1)); int minZ = Mathf.Max(z - blurRadius, 0); int maxZ = Mathf.Min(z + blurRadius, original.GetLength(2)); int count = 0; for (int xi = minX; xi < maxX; ++xi) { for (int yi = minY; yi < maxY; ++yi) { for (int zi = minZ; zi < maxZ; ++zi) { ++count; Vector3 diff = new Vector3(x - xi, y - yi, z - zi); float dis = diff.magnitude; Voxel value = original[xi, yi, zi]; if (dis < 0.5f || value == null) { continue; } float factor = Mathf.Max((1 - dis / blurRadius) * strength * 0.1f, 0); opacity = opacity * (1 - factor) + value.averageOpacity() * factor; } } } return((byte)Mathf.Min((float)opacity, byte.MaxValue)); }
public override Voxel mutate(LocalApplication app, Index p, LocalAction action, Voxel original) { CubeAction cAction = (CubeAction)action; byte newOpacity = (byte)((original.averageOpacity() * (1 - cAction.percentInside) + value.averageOpacity() * (cAction.percentInside))); byte newSubstance = original.averageMaterialType(); if (newOpacity >= 2 * original.averageOpacity() || (overwriteSubstance && cAction.percentInside > 0.5)) { newSubstance = value.averageMaterialType(); } if (!overwriteShape) { newOpacity = original.averageOpacity(); } return(new Voxel(newSubstance, newOpacity)); }
public override Voxel mutate(LocalApplication app, Index p, LocalAction action, Voxel original) { SphereApp sApp = (SphereApp)app; SphereAction sAction = (SphereAction)action; float dis = Mathf.Sqrt(sAction.disSqr); byte newOpacity = (dis <= sAction.minRadius) ? value.averageOpacity() : (byte)((original.averageOpacity() * (dis - sAction.minRadius) + value.averageOpacity() * (sAction.maxRadius - dis)) / 2); byte newSubstance = original.averageMaterialType(); if (newOpacity >= 2 * original.averageOpacity() || (overwriteSubstance && dis < sApp.radius)) newSubstance = value.averageMaterialType(); if (!overwriteShape) newOpacity = original.averageOpacity(); return new Voxel(newSubstance, newOpacity); }
public override Voxel mutate(LocalApplication app, Index p, LocalAction action, Voxel original) { SphereApp sApp = (SphereApp)app; SphereAction sAction = (SphereAction)action; float dis = Mathf.Sqrt(sAction.disSqr); byte newOpacity = (dis <= sAction.minRadius) ? value.averageOpacity() : (byte)((original.averageOpacity() * (dis - sAction.minRadius) + value.averageOpacity() * (sAction.maxRadius - dis)) / 2); byte newSubstance = original.averageMaterialType(); if (newOpacity >= 2 * original.averageOpacity() || (overwriteSubstance && dis < sApp.radius)) { newSubstance = value.averageMaterialType(); } if (!overwriteShape) { newOpacity = original.averageOpacity(); } return(new Voxel(newSubstance, newOpacity)); }