예제 #1
0
		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);
		}
예제 #2
0
		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);
		}
예제 #3
0
        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));
        }
예제 #4
0
        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));
        }
예제 #5
0
        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));
        }
예제 #6
0
        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);
        }
예제 #7
0
        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));
        }