private Vector3 HandleHitCommon(Quaternion rotation, float pressure) { var finalOpacity = opacity; var finalRadius = radius; var finalHardness = hardness; var finalColor = color; var finalAngle = angle; var finalTexture = texture; var finalMatrix = tileTransform != null ? tileTransform.localToWorldMatrix : Matrix4x4.identity; var finalAspect = P3dHelper.GetAspect(shape, texture); P3dPaintableManager.BuildModifiers(gameObject); P3dPaintableManager.ModifyColor(pressure, ref finalColor); P3dPaintableManager.ModifyAngle(pressure, ref finalAngle); P3dPaintableManager.ModifyOpacity(pressure, ref finalOpacity); P3dPaintableManager.ModifyHardness(pressure, ref finalHardness); P3dPaintableManager.ModifyRadius(pressure, ref finalRadius); P3dPaintableManager.ModifyTexture(pressure, ref finalTexture); rotation = rotation * Quaternion.Euler(0.0f, 0.0f, finalAngle); var finalSize = Command.Instance.SetShape(rotation, scale, finalRadius, finalAspect); Command.Instance.SetMaterial(blendMode, texture, shape, shapeChannel, finalHardness, wrapping, normalBack, normalFront, normalFade, finalColor, finalOpacity, tileTexture, finalMatrix, tileBlend); return(finalSize); }
private Vector3 HandleHitCommon(bool preview, float pressure, int seed, Quaternion rotation) { var finalOpacity = opacity; var finalRadius = radius; var finalHardness = hardness; var finalColor = color; var finalAngle = angle; var finalTexture = texture; var finalMatrix = tileTransform != null ? tileTransform.localToWorldMatrix : Matrix4x4.identity; if (modifiers != null && modifiers.Count > 0) { P3dHelper.BeginSeed(seed); modifiers.ModifyColor(ref finalColor, preview, pressure); modifiers.ModifyAngle(ref finalAngle, preview, pressure); modifiers.ModifyOpacity(ref finalOpacity, preview, pressure); modifiers.ModifyRadius(ref finalRadius, preview, pressure); modifiers.ModifyHardness(ref finalHardness, preview, pressure); modifiers.ModifyTexture(ref finalTexture, preview, pressure); P3dHelper.EndSeed(); } var finalAspect = P3dHelper.GetAspect(shape, finalTexture); var finalSize = P3dHelper.ScaleAspect(scale * finalRadius, finalAspect); P3dCommandDecal.Instance.SetShape(rotation, finalSize, finalAngle); P3dCommandDecal.Instance.SetMaterial(blendMode, finalTexture, shape, shapeChannel, finalHardness, wrapping, normalBack, normalFront, normalFade, finalColor, finalOpacity, tileTexture, finalMatrix, tileOpacity, tileTransition); return(finalSize); }
private void DoPaint(bool preview, Ray ray, RaycastHit hit) { pendingCommands.Clear(); var aspect = P3dHelper.GetAspect(currentPaintBrush.Shape); switch (currentPaintMaterial.Style) { case P3dPaintMaterial.StyleType.Seamless: { foreach (var slot in currentPaintMaterial.Slots) { var radius = currentPaintBrush.Radius * settings.PaintScale; var tileMatrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, new Vector3(settings.PaintTile, settings.PaintTile, settings.PaintTile)); var color = currentPaintBrush.Color; if (slot.Group == settings.ColorModifies) { color *= settings.PaintColor; } P3dPaintDecal.Command.Instance.SetState(preview, slot.Group); // Store group in priority P3dPaintDecal.Command.Instance.SetShape(Quaternion.LookRotation(ray.direction), Vector3.one, radius, aspect); P3dPaintDecal.Command.Instance.SetLocation(hit.point); P3dPaintDecal.Command.Instance.SetMaterial(P3dBlendMode.AlphaBlend, null, currentPaintBrush.Shape, currentPaintBrush.ShapeChannel, 1.0f, 1.0f, 1.0f, 1.0f, 0.1f, color, 1.0f, slot.Texture, tileMatrix, 3.0f); pendingCommands.Add(P3dPaintDecal.Command.Instance.SpawnCopy()); } } break; case P3dPaintMaterial.StyleType.Decal: { var shape = currentPaintBrush.Shape != null ? currentPaintBrush.Shape : currentPaintMaterial.Shape; if (shape != null) { aspect = P3dHelper.GetAspect(shape); } else { foreach (var slot in currentPaintMaterial.Slots) { if (slot.Texture != null) { aspect = P3dHelper.GetAspect(slot.Texture); break; } } } foreach (var slot in currentPaintMaterial.Slots) { var radius = currentPaintBrush.Radius * settings.PaintScale; var color = currentPaintBrush.Color; if (slot.Group == settings.ColorModifies) { color *= settings.PaintColor; } P3dPaintDecal.Command.Instance.SetState(preview, slot.Group); // Store group in priority P3dPaintDecal.Command.Instance.SetShape(Quaternion.LookRotation(ray.direction), Vector3.one, radius, aspect); P3dPaintDecal.Command.Instance.SetLocation(hit.point); P3dPaintDecal.Command.Instance.SetMaterial(P3dBlendMode.AlphaBlend, slot.Texture, shape, currentPaintBrush.ShapeChannel, 1.0f, 1.0f, 1.0f, 1.0f, 0.1f, color, 1.0f, null, Matrix4x4.identity, 1.0f); pendingCommands.Add(P3dPaintDecal.Command.Instance.SpawnCopy()); } } break; } // Clone pending commands clonedCommands.Clear(); tempCloners.Clear(); currentCloners.RemoveAll(c => scene.Cloners.Contains(c) == false); foreach (var cloner in currentCloners) { tempCloners.Add(cloner); } foreach (var command in pendingCommands) { clonedCommands.Add(command.SpawnCopy()); P3dPaintableManager.BuildCloners(tempCloners); for (var c = 0; c < P3dPaintableManager.ClonerCount; c++) { for (var m = 0; m < P3dPaintableManager.MatrixCount; m++) { var copy = command.SpawnCopy(); P3dPaintableManager.Clone(copy, c, m); clonedCommands.Add(copy); } } } pendingCommands.Clear(); // Paint commands paintedGroups.Clear(); foreach (var command in clonedCommands) { foreach (var mat in scene.Mats) { var image = currentLayer.GetImage(mat.Id, command.Priority); // Group is stored in priority foreach (var obj in scene.Objs) { if (obj.Mesh != null && obj.Paintable == true) { for (var j = 0; j < obj.MatIds.Count; j++) { if (mat.Id == obj.MatIds[j]) { var subMesh = Mathf.Max(j, obj.Mesh.subMeshCount - 1); Render(command, mat, image, obj, subMesh); } } } } } command.Pool(); } pendingUpdate = true; }
private void DoPaint(bool preview, float pressure, Ray ray, RaycastHit hit, Mesh hitMesh, Matrix4x4 hitMatrix) { pendingCommands.Clear(); var finalPosition = hit.point; var finalAngle = settings.PaintAngle; var finalOpacity = settings.PaintOpacity; var finalRadius = settings.PaintScale; var finalRotation = Quaternion.LookRotation(ray.direction); var finalAspect = P3dHelper.GetAspect(paintBrushData.Shape); paintBrushData.Modifiers.ModifyAngle(ref finalAngle, false, pressure); paintBrushData.Modifiers.ModifyOpacity(ref finalOpacity, false, pressure); paintBrushData.Modifiers.ModifyPosition(ref finalPosition, false, pressure); paintBrushData.Modifiers.ModifyRadius(ref finalRadius, false, pressure); var finalSize = Vector3.one * finalRadius; switch (currentPaintMaterial.Style) { case P3dPaintMaterial.StyleType.Seamless: { foreach (var slot in currentPaintMaterial.Slots) { var tileMatrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, new Vector3(settings.PaintTile, settings.PaintTile, settings.PaintTile)); var finalColor = Color.white; if (slot.Group == settings.ColorModifies) { finalColor *= settings.PaintColor; paintBrushData.Modifiers.ModifyColor(ref finalColor, false, pressure); } P3dCommandDecal.Instance.SetState(preview, slot.Group); // Store group in priority SubmitLocation(hit, hitMesh, hitMatrix, finalPosition); P3dCommandDecal.Instance.SetShape(finalRotation, P3dHelper.ScaleAspect(finalSize, finalAspect), finalAngle); P3dCommandDecal.Instance.SetMaterial(P3dBlendMode.AlphaBlend, null, paintBrushData.Shape, paintBrushData.ShapeChannel, 1.0f, 1.0f, settings.PaintNormalBack, settings.PaintNormalFront, settings.PaintNormalFade, finalColor, finalOpacity, slot.Texture, tileMatrix, 1.0f, 2.0f); P3dCommandDecal.Instance.ClearMask(); pendingCommands.Add(P3dCommandDecal.Instance.SpawnCopy()); } } break; case P3dPaintMaterial.StyleType.Decal: { var shape = paintBrushData.Shape != null ? paintBrushData.Shape : currentPaintMaterial.Shape; if (shape != null) { finalAspect = P3dHelper.GetAspect(shape); } else { foreach (var slot in currentPaintMaterial.Slots) { if (slot.Texture != null) { finalAspect = P3dHelper.GetAspect(slot.Texture); break; } } } foreach (var slot in currentPaintMaterial.Slots) { var finalColor = Color.white; if (slot.Group == settings.ColorModifies) { finalColor *= settings.PaintColor; paintBrushData.Modifiers.ModifyColor(ref finalColor, false, pressure); } P3dCommandDecal.Instance.SetState(preview, slot.Group); // Store group in priority SubmitLocation(hit, hitMesh, hitMatrix, finalPosition); P3dCommandDecal.Instance.SetShape(finalRotation, P3dHelper.ScaleAspect(finalSize, finalAspect), finalAngle); P3dCommandDecal.Instance.SetMaterial(P3dBlendMode.AlphaBlend, slot.Texture, shape, paintBrushData.ShapeChannel, 1.0f, 1.0f, settings.PaintNormalBack, settings.PaintNormalFront, settings.PaintNormalFade, finalColor, finalOpacity, null, Matrix4x4.identity, 1.0f, 2.0f); P3dCommandDecal.Instance.ClearMask(); pendingCommands.Add(P3dCommandDecal.Instance.SpawnCopy()); } } break; } // Clone pending commands clonedCommands.Clear(); tempCloners.Clear(); currentCloners.RemoveAll(c => scene.Cloners.Contains(c) == false); foreach (var cloner in currentCloners) { tempCloners.Add(cloner); } // Remove excluded or non-isolated groups (stored in priority) if (isolatedGroups.Count > 0) { pendingCommands.RemoveAll(c => isolatedGroups.Contains(c.Priority) == false); } else { pendingCommands.RemoveAll(c => excludedGroups.Contains(c.Priority) == true); } foreach (var command in pendingCommands) { clonedCommands.Add(command.SpawnCopy()); P3dClone.BuildCloners(tempCloners); for (var c = 0; c < P3dClone.ClonerCount; c++) { for (var m = 0; m < P3dClone.MatrixCount; m++) { var copy = command.SpawnCopy(); P3dClone.Clone(copy, c, m); clonedCommands.Add(copy); } } } pendingCommands.Clear(); // Paint commands paintedGroups.Clear(); foreach (var command in clonedCommands) { foreach (var mat in scene.Mats) { var image = currentLayer.GetImage(mat.Id, command.Priority); // Group is stored in priority foreach (var obj in scene.Objs) { if (obj.Mesh != null && obj.Paintable == true) { for (var j = 0; j < obj.MatIds.Count; j++) { if (mat.Id == obj.MatIds[j]) { var subMesh = Mathf.Max(j, obj.Mesh.subMeshCount - 1); Render(command, mat, image, obj, subMesh); } } } } } command.Pool(); } pendingUpdate = true; }