Merge pull request #11708 from samcake/blue

Expose the Render api to the tablet js context and update render engine tool
This commit is contained in:
Andrew Meadows 2017-10-27 17:12:36 -07:00 committed by GitHub
commit f958829d00
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 404 additions and 264 deletions

View file

@ -222,6 +222,7 @@ void Web3DOverlay::setupQmlSurface() {
_webSurface->getSurfaceContext()->setContextProperty("SoundCache", DependencyManager::get<SoundCache>().data());
_webSurface->getSurfaceContext()->setContextProperty("MenuInterface", MenuScriptingInterface::getInstance());
_webSurface->getSurfaceContext()->setContextProperty("Settings", SettingsScriptingInterface::getInstance());
_webSurface->getSurfaceContext()->setContextProperty("Render", AbstractViewStateInterface::instance()->getRenderEngine()->getConfiguration().get());
_webSurface->getSurfaceContext()->setContextProperty("Controller", DependencyManager::get<controller::ScriptingInterface>().data());
_webSurface->getSurfaceContext()->setContextProperty("Web3DOverlay", this);

View file

@ -100,7 +100,11 @@ EntityRendererPointer EntityTreeRenderer::renderableForEntityId(const EntityItem
render::ItemID EntityTreeRenderer::renderableIdForEntityId(const EntityItemID& id) const {
auto renderable = renderableForEntityId(id);
return renderable ? renderable->getRenderItemID() : render::Item::INVALID_ITEM_ID;
if (renderable) {
return renderable->getRenderItemID();
} else {
return render::Item::INVALID_ITEM_ID;
}
}
int EntityTreeRenderer::_entitiesScriptEngineCount = 0;

View file

@ -1,6 +1,5 @@
//
// ConfigSlider.qml
// examples/utilities/tools/render
//
// Created by Zach Pomerantz on 2/8/2016
// Copyright 2016 High Fidelity, Inc.
@ -8,12 +7,21 @@
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
//
import QtQuick 2.5
import QtQuick.Controls 1.4
import QtQuick 2.7
import QtQuick.Controls 1.4 as Original
import QtQuick.Controls.Styles 1.4
import "qrc:///qml/styles-uit"
import "qrc:///qml/controls-uit" as HifiControls
Item {
HifiConstants { id: hifi }
id: root
width: 400
anchors.left: parent.left
anchors.right: parent.right
height: 24
property bool integral: false
property var config
@ -28,22 +36,21 @@ Item {
bindingControl.when = true;
}
Label {
HifiControls.Label {
id: labelControl
text: root.label
enabled: true
anchors.left: root.left
anchors.leftMargin: 8
anchors.top: root.top
anchors.topMargin: 7
anchors.right: root.horizontalCenter
anchors.verticalCenter: root.verticalCenter
}
Label {
HifiControls.Label {
id: labelValue
text: sliderControl.value.toFixed(root.integral ? 0 : 2)
anchors.left: root.left
anchors.leftMargin: 200
anchors.top: root.top
anchors.topMargin: 15
anchors.right: root.right
anchors.bottom: root.bottom
anchors.bottomMargin: 0
}
Binding {
@ -54,14 +61,13 @@ Item {
when: false
}
Slider {
HifiControls.Slider {
id: sliderControl
stepSize: root.integral ? 1.0 : 0.0
width: root.width-130
height: 20
anchors.left: root.horizontalCenter
anchors.right: root.right
anchors.rightMargin: 8
anchors.rightMargin: 0
anchors.top: root.top
anchors.topMargin: 3
anchors.topMargin: 0
}
}

View file

@ -1,49 +0,0 @@
//
// debugDeferredLighting.js
//
// Created by Sam Gateau on 6/6/2016
// Copyright 2016 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
//
// Set up the qml ui
var qml = Script.resolvePath('deferredLighting.qml');
var window = new OverlayWindow({
title: 'Lighting',
source: qml,
width: 400, height:400,
});
window.setPosition(Window.innerWidth - 420, 50);
window.closed.connect(function() { Script.stop(); });
var DDB = Render.RenderDeferredTask.DebugDeferredBuffer;
DDB.enabled = true;
DDB.mode = 0;
// Debug buffer sizing
var resizing = false;
Controller.mousePressEvent.connect(function (e) {
if (shouldStartResizing(e.x)) {
resizing = true;
}
});
Controller.mouseReleaseEvent.connect(function() { resizing = false; });
Controller.mouseMoveEvent.connect(function (e) { resizing && setDebugBufferSize(e.x); });
Script.scriptEnding.connect(function () { DDB.enabled = false; });
function shouldStartResizing(eventX) {
var x = Math.abs(eventX - Window.innerWidth * (1.0 + DDB.size.x) / 2.0);
var mode = DDB.mode;
return mode !== 0 && x < 20;
}
function setDebugBufferSize(x) {
x = (2.0 * (x / Window.innerWidth) - 1.0); // scale
x = Math.min(Math.max(-1, x), 1); // clamp
DDB.size = { x: x, y: -1, z: 1, w: 1 };
}

View file

@ -7,215 +7,268 @@
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
//
import QtQuick 2.5
import QtQuick 2.7
import QtQuick.Controls 1.4
import "configSlider"
import QtQuick.Layouts 1.3
Column {
spacing: 8
property var mainViewTask: Render.getConfig("RenderMainView")
import "qrc:///qml/styles-uit"
import "qrc:///qml/controls-uit" as HifiControls
import "configSlider"
Rectangle {
HifiConstants { id: hifi;}
id: render;
anchors.margins: hifi.dimensions.contentMargin.x
Row {
spacing: 8
Column {
spacing: 10
Repeater {
model: [
"Unlit:LightingModel:enableUnlit",
"Emissive:LightingModel:enableEmissive",
"Lightmap:LightingModel:enableLightmap",
"Background:LightingModel:enableBackground",
"ssao:AmbientOcclusion:enabled",
"Textures:LightingModel:enableMaterialTexturing"
]
CheckBox {
text: modelData.split(":")[0]
checked: mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]]
onCheckedChanged: { mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]] = checked }
}
}
}
Column {
spacing: 10
Repeater {
model: [
"Obscurance:LightingModel:enableObscurance",
"Scattering:LightingModel:enableScattering",
"Diffuse:LightingModel:enableDiffuse",
"Specular:LightingModel:enableSpecular",
"Albedo:LightingModel:enableAlbedo",
"Wireframe:LightingModel:enableWireframe"
]
CheckBox {
text: modelData.split(":")[0]
checked: mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]]
onCheckedChanged: { mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]] = checked }
}
}
}
Column {
spacing: 10
Repeater {
model: [
"Ambient:LightingModel:enableAmbientLight",
"Directional:LightingModel:enableDirectionalLight",
"Point:LightingModel:enablePointLight",
"Spot:LightingModel:enableSpotLight",
"Light Contour:LightingModel:showLightContour",
"Zone Stack:DrawZoneStack:enabled",
"Shadow:RenderShadowTask:enabled"
]
CheckBox {
text: modelData.split(":")[0]
checked: mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]]
onCheckedChanged: { mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]] = checked }
}
}
}
}
color: hifi.colors.baseGray;
property var mainViewTask: Render.getConfig("RenderMainView")
Column {
spacing: 10
Repeater {
model: [ "Tone Mapping Exposure:ToneMapping:exposure:5.0:-5.0"
]
ConfigSlider {
label: qsTr(modelData.split(":")[0])
integral: false
config: mainViewTask.getConfig(modelData.split(":")[1])
property: modelData.split(":")[2]
max: modelData.split(":")[3]
min: modelData.split(":")[4]
spacing: 5
anchors.left: parent.left
anchors.right: parent.right
anchors.margins: hifi.dimensions.contentMargin.x
//padding: hifi.dimensions.contentMargin.x
HifiControls.Label {
text: "Shading"
}
Row {
anchors.left: parent.left
anchors.right: parent.right
spacing: 20
Column {
spacing: 10
// padding: 10
Repeater {
model: [
"Unlit:LightingModel:enableUnlit",
"Emissive:LightingModel:enableEmissive",
"Lightmap:LightingModel:enableLightmap",
"Background:LightingModel:enableBackground",
"ssao:AmbientOcclusion:enabled",
"Textures:LightingModel:enableMaterialTexturing"
]
HifiControls.CheckBox {
boxSize: 20
text: modelData.split(":")[0]
checked: render.mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]]
onCheckedChanged: { render.mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]] = checked }
}
}
}
Column {
spacing: 10
Repeater {
model: [
"Obscurance:LightingModel:enableObscurance",
"Scattering:LightingModel:enableScattering",
"Diffuse:LightingModel:enableDiffuse",
"Specular:LightingModel:enableSpecular",
"Albedo:LightingModel:enableAlbedo",
"Wireframe:LightingModel:enableWireframe"
]
HifiControls.CheckBox {
boxSize: 20
text: modelData.split(":")[0]
checked: render.mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]]
onCheckedChanged: { render.mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]] = checked }
}
}
}
Column {
spacing: 10
Repeater {
model: [
"Ambient:LightingModel:enableAmbientLight",
"Directional:LightingModel:enableDirectionalLight",
"Point:LightingModel:enablePointLight",
"Spot:LightingModel:enableSpotLight",
"Light Contour:LightingModel:showLightContour",
"Zone Stack:DrawZoneStack:enabled",
"Shadow:RenderShadowTask:enabled"
]
HifiControls.CheckBox {
boxSize: 20
text: modelData.split(":")[0]
checked: render.mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]]
onCheckedChanged: { render.mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]] = checked }
}
}
}
}
Separator {}
Column {
anchors.left: parent.left
anchors.right: parent.right
spacing: 10
Repeater {
model: [ "Tone Mapping Exposure:ToneMapping:exposure:5.0:-5.0"
]
ConfigSlider {
label: qsTr(modelData.split(":")[0])
integral: false
config: render.mainViewTask.getConfig(modelData.split(":")[1])
property: modelData.split(":")[2]
max: modelData.split(":")[3]
min: modelData.split(":")[4]
Row {
Label {
text: "Tone Mapping Curve"
anchors.left: root.left
anchors.left: parent.left
anchors.right: parent.right
}
}
ComboBox {
anchors.right: root.right
currentIndex: 1
Item {
height: childrenRect.height
anchors.left: parent.left
anchors.right: parent.right
HifiControls.Label {
text: "Tone Mapping Curve"
anchors.left: parent.left
}
HifiControls.ComboBox {
anchors.right: parent.right
currentIndex: 1
model: ListModel {
id: cbItems
ListElement { text: "RGB"; color: "Yellow" }
ListElement { text: "SRGB"; color: "Green" }
ListElement { text: "Reinhard"; color: "Yellow" }
ListElement { text: "Filmic"; color: "White" }
}
width: 200
onCurrentIndexChanged: { render.mainViewTask.getConfig("ToneMapping")["curve"] = currentIndex }
}
}
}
Separator {}
Item {
height: childrenRect.height
anchors.left: parent.left
anchors.right: parent.right
id: framebuffer
HifiControls.Label {
text: "Debug Framebuffer"
anchors.left: parent.left
}
property var config: render.mainViewTask.getConfig("DebugDeferredBuffer")
function setDebugMode(mode) {
framebuffer.config.enabled = (mode != 0);
framebuffer.config.mode = mode;
}
HifiControls.ComboBox {
anchors.right: parent.right
currentIndex: 0
model: ListModel {
id: cbItems
ListElement { text: "RGB"; color: "Yellow" }
ListElement { text: "SRGB"; color: "Green" }
ListElement { text: "Reinhard"; color: "Yellow" }
ListElement { text: "Filmic"; color: "White" }
id: cbItemsFramebuffer
ListElement { text: "Off"; color: "Yellow" }
ListElement { text: "Depth"; color: "Green" }
ListElement { text: "Albedo"; color: "Yellow" }
ListElement { text: "Normal"; color: "White" }
ListElement { text: "Roughness"; color: "White" }
ListElement { text: "Metallic"; color: "White" }
ListElement { text: "Emissive"; color: "White" }
ListElement { text: "Unlit"; color: "White" }
ListElement { text: "Occlusion"; color: "White" }
ListElement { text: "Lightmap"; color: "White" }
ListElement { text: "Scattering"; color: "White" }
ListElement { text: "Lighting"; color: "White" }
ListElement { text: "Shadow"; color: "White" }
ListElement { text: "Linear Depth"; color: "White" }
ListElement { text: "Half Linear Depth"; color: "White" }
ListElement { text: "Half Normal"; color: "White" }
ListElement { text: "Mid Curvature"; color: "White" }
ListElement { text: "Mid Normal"; color: "White" }
ListElement { text: "Low Curvature"; color: "White" }
ListElement { text: "Low Normal"; color: "White" }
ListElement { text: "Curvature Occlusion"; color: "White" }
ListElement { text: "Debug Scattering"; color: "White" }
ListElement { text: "Ambient Occlusion"; color: "White" }
ListElement { text: "Ambient Occlusion Blurred"; color: "White" }
ListElement { text: "Custom"; color: "White" }
}
width: 200
onCurrentIndexChanged: { mainViewTask.getConfig("ToneMapping")["curve"] = currentIndex }
onCurrentIndexChanged: { framebuffer.setDebugMode(currentIndex) }
}
}
Separator {}
Row {
spacing: 10
Column {
spacing: 10
HifiControls.CheckBox {
boxSize: 20
text: "Opaques"
checked: render.mainViewTask.getConfig("DrawOpaqueBounds")["enabled"]
onCheckedChanged: { render.mainViewTask.getConfig("DrawOpaqueBounds")["enabled"] = checked }
}
HifiControls.CheckBox {
boxSize: 20
text: "Transparents"
checked: render.mainViewTask.getConfig("DrawTransparentBounds")["enabled"]
onCheckedChanged: { render.mainViewTask.getConfig("DrawTransparentBounds")["enabled"] = checked }
}
HifiControls.CheckBox {
boxSize: 20
text: "Opaques in Front"
checked: render.mainViewTask.getConfig("DrawOverlayInFrontOpaqueBounds")["enabled"]
onCheckedChanged: { render.mainViewTask.getConfig("DrawOverlayInFrontOpaqueBounds")["enabled"] = checked }
}
HifiControls.CheckBox {
boxSize: 20
text: "Transparents in Front"
checked: render.mainViewTask.getConfig("DrawOverlayInFrontTransparentBounds")["enabled"]
onCheckedChanged: { render.mainViewTask.getConfig("DrawOverlayInFrontTransparentBounds")["enabled"] = checked }
}
HifiControls.CheckBox {
boxSize: 20
text: "Opaques in HUD"
checked: render.mainViewTask.getConfig("DrawOverlayHUDOpaqueBounds")["enabled"]
onCheckedChanged: { render.mainViewTask.getConfig("DrawOverlayHUDOpaqueBounds")["enabled"] = checked }
}
HifiControls.CheckBox {
boxSize: 20
text: "Transparents in HUD"
checked: render.mainViewTask.getConfig("DrawOverlayHUDTransparentBounds")["enabled"]
onCheckedChanged: { render.mainViewTask.getConfig("DrawOverlayHUDTransparentBounds")["enabled"] = checked }
}
}
Column {
spacing: 10
HifiControls.CheckBox {
boxSize: 20
text: "Metas"
checked: render.mainViewTask.getConfig("DrawMetaBounds")["enabled"]
onCheckedChanged: { render.mainViewTask.getConfig("DrawMetaBounds")["enabled"] = checked }
}
HifiControls.CheckBox {
boxSize: 20
text: "Lights"
checked: render.mainViewTask.getConfig("DrawLightBounds")["enabled"]
onCheckedChanged: { render.mainViewTask.getConfig("DrawLightBounds")["enabled"] = checked; }
}
HifiControls.CheckBox {
boxSize: 20
text: "Zones"
checked: render.mainViewTask.getConfig("DrawZones")["enabled"]
onCheckedChanged: { render.mainViewTask.getConfig("ZoneRenderer")["enabled"] = checked; render.mainViewTask.getConfig("DrawZones")["enabled"] = checked; }
}
}
}
}
Row {
id: framebuffer
spacing: 10
Label {
text: "Debug Framebuffer"
anchors.left: root.left
}
property var config: mainViewTask.getConfig("DebugDeferredBuffer")
function setDebugMode(mode) {
framebuffer.config.enabled = (mode != 0);
framebuffer.config.mode = mode;
}
ComboBox {
anchors.right: root.right
currentIndex: 0
model: ListModel {
id: cbItemsFramebuffer
ListElement { text: "Off"; color: "Yellow" }
ListElement { text: "Depth"; color: "Green" }
ListElement { text: "Albedo"; color: "Yellow" }
ListElement { text: "Normal"; color: "White" }
ListElement { text: "Roughness"; color: "White" }
ListElement { text: "Metallic"; color: "White" }
ListElement { text: "Emissive"; color: "White" }
ListElement { text: "Unlit"; color: "White" }
ListElement { text: "Occlusion"; color: "White" }
ListElement { text: "Lightmap"; color: "White" }
ListElement { text: "Scattering"; color: "White" }
ListElement { text: "Lighting"; color: "White" }
ListElement { text: "Shadow"; color: "White" }
ListElement { text: "Linear Depth"; color: "White" }
ListElement { text: "Half Linear Depth"; color: "White" }
ListElement { text: "Half Normal"; color: "White" }
ListElement { text: "Mid Curvature"; color: "White" }
ListElement { text: "Mid Normal"; color: "White" }
ListElement { text: "Low Curvature"; color: "White" }
ListElement { text: "Low Normal"; color: "White" }
ListElement { text: "Curvature Occlusion"; color: "White" }
ListElement { text: "Debug Scattering"; color: "White" }
ListElement { text: "Ambient Occlusion"; color: "White" }
ListElement { text: "Ambient Occlusion Blurred"; color: "White" }
ListElement { text: "Custom"; color: "White" }
}
width: 200
onCurrentIndexChanged: { framebuffer.setDebugMode(currentIndex) }
}
}
Row {
Column {
CheckBox {
text: "Opaques"
checked: mainViewTask.getConfig("DrawOpaqueBounds")["enabled"]
onCheckedChanged: { mainViewTask.getConfig("DrawOpaqueBounds")["enabled"] = checked }
}
CheckBox {
text: "Transparents"
checked: mainViewTask.getConfig("DrawTransparentBounds")["enabled"]
onCheckedChanged: { mainViewTask.getConfig("DrawTransparentBounds")["enabled"] = checked }
}
CheckBox {
text: "Opaques in Front"
checked: mainViewTask.getConfig("DrawOverlayInFrontOpaqueBounds")["enabled"]
onCheckedChanged: { mainViewTask.getConfig("DrawOverlayInFrontOpaqueBounds")["enabled"] = checked }
}
CheckBox {
text: "Transparents in Front"
checked: mainViewTask.getConfig("DrawOverlayInFrontTransparentBounds")["enabled"]
onCheckedChanged: { mainViewTask.getConfig("DrawOverlayInFrontTransparentBounds")["enabled"] = checked }
}
CheckBox {
text: "Opaques in HUD"
checked: mainViewTask.getConfig("DrawOverlayHUDOpaqueBounds")["enabled"]
onCheckedChanged: { mainViewTask.getConfig("DrawOverlayHUDOpaqueBounds")["enabled"] = checked }
}
CheckBox {
text: "Transparents in HUD"
checked: mainViewTask.getConfig("DrawOverlayHUDTransparentBounds")["enabled"]
onCheckedChanged: { mainViewTask.getConfig("DrawOverlayHUDTransparentBounds")["enabled"] = checked }
}
}
Column {
CheckBox {
text: "Metas"
checked: mainViewTask.getConfig("DrawMetaBounds")["enabled"]
onCheckedChanged: { mainViewTask.getConfig("DrawMetaBounds")["enabled"] = checked }
}
CheckBox {
text: "Lights"
checked: mainViewTask.getConfig("DrawLightBounds")["enabled"]
onCheckedChanged: { mainViewTask.getConfig("DrawLightBounds")["enabled"] = checked; }
}
CheckBox {
text: "Zones"
checked: mainViewTask.getConfig("DrawZones")["enabled"]
onCheckedChanged: { mainViewTask.getConfig("ZoneRenderer")["enabled"] = checked; mainViewTask.getConfig("DrawZones")["enabled"] = checked; }
}
}
}
//}
}

View file

@ -0,0 +1,102 @@
"use strict";
//
// Luci.js
// tablet-engine app
//
// Copyright 2017 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
(function() {
var TABLET_BUTTON_NAME = "LUCI";
var QMLAPP_URL = Script.resolvePath("./deferredLighting.qml");
var ICON_URL = Script.resolvePath("../../../system/assets/images/luci-i.svg");
var ACTIVE_ICON_URL = Script.resolvePath("../../../system/assets/images/luci-a.svg");
var onLuciScreen = false;
function onClicked() {
if (onLuciScreen) {
tablet.gotoHomeScreen();
} else {
tablet.loadQMLSource(QMLAPP_URL);
}
}
var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system");
var button = tablet.addButton({
text: TABLET_BUTTON_NAME,
icon: ICON_URL,
activeIcon: ACTIVE_ICON_URL,
sortOrder: 1
});
var hasEventBridge = false;
function wireEventBridge(on) {
if (!tablet) {
print("Warning in wireEventBridge(): 'tablet' undefined!");
return;
}
if (on) {
if (!hasEventBridge) {
tablet.fromQml.connect(fromQml);
hasEventBridge = true;
}
} else {
if (hasEventBridge) {
tablet.fromQml.disconnect(fromQml);
hasEventBridge = false;
}
}
}
function onScreenChanged(type, url) {
if (url === QMLAPP_URL) {
onLuciScreen = true;
} else {
onLuciScreen = false;
}
button.editProperties({isActive: onLuciScreen});
wireEventBridge(onLuciScreen);
}
function fromQml(message) {
}
button.clicked.connect(onClicked);
tablet.screenChanged.connect(onScreenChanged);
var moveDebugCursor = false;
Controller.mousePressEvent.connect(function (e) {
if (e.isMiddleButton) {
moveDebugCursor = true;
setDebugCursor(e.x, e.y);
}
});
Controller.mouseReleaseEvent.connect(function() { moveDebugCursor = false; });
Controller.mouseMoveEvent.connect(function (e) { if (moveDebugCursor) setDebugCursor(e.x, e.y); });
Script.scriptEnding.connect(function () {
if (onLuciScreen) {
tablet.gotoHomeScreen();
}
button.clicked.disconnect(onClicked);
tablet.screenChanged.disconnect(onScreenChanged);
tablet.removeButton(button);
});
function setDebugCursor(x, y) {
nx = (x / Window.innerWidth);
ny = 1.0 - ((y) / (Window.innerHeight - 32));
Render.getConfig("RenderMainView").getConfig("Antialiasing").debugCursorTexcoord = { x: nx, y: ny };
}
}());

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 50 50" style="enable-background:new 0 0 50 50;" xml:space="preserve">
<path d="M18.5,36.5c-6.8-2.2-6.8-11.8-0.1-14.1l12.1-4.1c-2.6-2.4-6.1-3.8-9.9-3.8c-8.2,0-14.8,6.6-14.8,14.8
c0,8.2,6.6,14.8,14.8,14.8c3.7,0,7.1-1.4,9.7-3.7L18.5,36.5z"/>
<path d="M31.9,17.9c-0.5,0.2-0.9,0.3-1.3,0.5c2.9,2.7,4.8,6.6,4.8,10.9c0,4.4-1.9,8.3-4.9,11c0.5,0.2,1,0.5,1.6,0.7l5.9,2.4
c3.1,1,6.2-1.3,6.2-4.5V13.2L31.9,17.9z"/>
<circle cx="40" cy="6.6" r="3.7"/>
</svg>

After

Width:  |  Height:  |  Size: 721 B

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 50 50" style="enable-background:new 0 0 50 50;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
</style>
<path class="st0" d="M18.5,36.5c-6.8-2.2-6.8-11.8-0.1-14.1l12.1-4.1c-2.6-2.4-6.1-3.8-9.9-3.8c-8.2,0-14.8,6.6-14.8,14.8
c0,8.2,6.6,14.8,14.8,14.8c3.7,0,7.1-1.4,9.7-3.7L18.5,36.5z"/>
<path class="st0" d="M31.9,17.9c-0.5,0.2-0.9,0.3-1.3,0.5c2.9,2.7,4.8,6.6,4.8,10.9c0,4.4-1.9,8.3-4.9,11c0.5,0.2,1,0.5,1.6,0.7
l5.9,2.4c3.1,1,6.2-1.3,6.2-4.5V13.2L31.9,17.9z"/>
<circle class="st0" cx="40" cy="6.6" r="3.7"/>
</svg>

After

Width:  |  Height:  |  Size: 811 B