浏览代码

Image zoom in

/pyrception-integration
leopoldo-zugasti 4 年前
当前提交
05d94f5c
共有 13 个文件被更改,包括 196 次插入88 次删除
  1. 12
      com.unity.perception/Editor/Pyrception/PyrceptionInstaller.cs
  2. 8
      com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/custom_components/itemselector/build/asset-manifest.json
  3. 2
      com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/custom_components/itemselector/build/index.html
  4. 2
      com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/custom_components/itemselector/build/service-worker.js
  5. 90
      com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/preview.py
  6. 117
      com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/SessionState.py
  7. 7
      com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/SessionState.py.meta
  8. 2
      com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/custom_components/itemselector/build/static/js/main.a9e501ea.chunk.js
  9. 1
      com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/custom_components/itemselector/build/static/js/main.a9e501ea.chunk.js.map
  10. 7
      com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/custom_components/itemselector/build/static/js/main.a9e501ea.chunk.js.map.meta
  11. 7
      com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/custom_components/itemselector/build/static/js/main.a9e501ea.chunk.js.meta
  12. 22
      com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/custom_components/itemselector/build/precache-manifest.05e94e122c3b2376022df49096526454.js
  13. 7
      com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/custom_components/itemselector/build/precache-manifest.05e94e122c3b2376022df49096526454.js.meta

12
com.unity.perception/Editor/Pyrception/PyrceptionInstaller.cs


string path = Path.GetFullPath(Application.dataPath.Replace("/Assets", ""));
#if UNITY_EDITOR_WIN
string packagesPath = Path.GetFullPath(Application.dataPath.Replace("/Assets","/Library/PythonInstall/Scripts"));
#elif (UNITY_EDITOR_OSX || UNITY_EDITOR_LINUX)
#elif UNITY_EDITOR_OSX
string packagesPath = Application.dataPath.Replace("/Assets","/Library/PythonInstall/bin");
#endif
string pathToData = PlayerPrefs.GetString(SimulationState.latestOutputDirectoryKey);

#if UNITY_EDITOR_WIN
command = $"cd \"{pathToData}\\..\" && \"{packagesPath}\\pyrception-utils.exe\" preview --data=\".\"";
#elif (UNITY_EDITOR_OSX || UNITY_EDITOR_LINUX)
#elif UNITY_EDITOR_OSX
command = $"cd \'{packagesPath}\' ;./python3.7 ./pyrception-utils.py preview --data=\'{pathToData}/..\'";
#endif
int ExitCode = 0;

//==============================SETUP PATHS======================================
#if UNITY_EDITOR_WIN
string packagesPath = Path.GetFullPath(Application.dataPath.Replace("/Assets","/Library/PythonInstall/Scripts"));
#elif (UNITY_EDITOR_OSX || UNITY_EDITOR_LINUX)
#elif UNITY_EDITOR_OSX
string packagesPath = Path.GetFullPath(Application.dataPath.Replace("/Assets","/Library/PythonInstall/bin"));
#endif
string pyrceptionPath = Path.GetFullPath("Packages/com.unity.perception/Editor/Pyrception/pyrception-utils").Replace("\\","/");

#if UNITY_EDITOR_WIN
ExecuteCMD($"XCOPY /E/I/Y \"{pyrceptionPath}\" \"{packagesPath}\\..\\pyrception-util\"", ref ExitCode);
#elif (UNITY_EDITOR_OSX || UNITY_EDITOR_LINUX)
#elif UNITY_EDITOR_OSX
ExecuteCMD($"\\cp -r \'{pyrceptionPath}\' \'{packagesPath}/../pyrception-util\'", ref ExitCode);
#endif
if (ExitCode != 0) {

EditorUtility.DisplayProgressBar("Setting up Pyrception", "Installing pyrception utils...", 2.5f / steps);
#if UNITY_EDITOR_WIN
ExecuteCMD($"cd \"{packagesPath}\\..\\pyrception-util\" && \"{packagesPath}\"\\pip3.bat install --no-warn-script-location --no-cache-dir -e .", ref ExitCode);
#elif (UNITY_EDITOR_OSX || UNITY_EDITOR_LINUX)
#elif UNITY_EDITOR_OSX
ExecuteCMD($"cd \'{packagesPath}\'; ./python3.7 -m pip install -e \'../pyrception-util/.\'", ref ExitCode);
ExecuteCMD($"\\cp -r \'{pyrceptionPath}/pyrception-utils.py\' \'{packagesPath}/pyrception-utils.py\'", ref ExitCode);
#endif

#if UNITY_EDITOR_WIN
shell = "cmd.exe";
argument = $"/c \"{command}\"";
#elif (UNITY_EDITOR_OSX || UNITY_EDITOR_LINUX)
#elif UNITY_EDITOR_OSX
shell = "/bin/bash";
argument = $"-c \"{command}\"";
#endif

8
com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/custom_components/itemselector/build/asset-manifest.json


{
"files": {
"main.js": "./static/js/main.a9e501ea.chunk.js",
"main.js.map": "./static/js/main.a9e501ea.chunk.js.map",
"main.js": "./static/js/main.f79fc270.chunk.js",
"main.js.map": "./static/js/main.f79fc270.chunk.js.map",
"precache-manifest.05e94e122c3b2376022df49096526454.js": "./precache-manifest.05e94e122c3b2376022df49096526454.js",
"precache-manifest.27ac81bfb307ceb0cd48077a28d3d23b.js": "./precache-manifest.27ac81bfb307ceb0cd48077a28d3d23b.js",
"service-worker.js": "./service-worker.js",
"static/js/2.c8d927de.chunk.js.LICENSE.txt": "./static/js/2.c8d927de.chunk.js.LICENSE.txt"
},

"static/js/main.a9e501ea.chunk.js"
"static/js/main.f79fc270.chunk.js"
]
}

2
com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/custom_components/itemselector/build/index.html


<!doctype html><html lang="en"><head><title>Streamlit Component</title><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Streamlit Component"/></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function t(t){for(var n,l,i=t[0],a=t[1],f=t[2],p=0,s=[];p<i.length;p++)l=i[p],Object.prototype.hasOwnProperty.call(o,l)&&o[l]&&s.push(o[l][0]),o[l]=0;for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n]);for(c&&c(t);s.length;)s.shift()();return u.push.apply(u,f||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,i=1;i<r.length;i++){var a=r[i];0!==o[a]&&(n=!1)}n&&(u.splice(t--,1),e=l(l.s=r[0]))}return e}var n={},o={1:0},u=[];function l(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,l),r.l=!0,r.exports}l.m=e,l.c=n,l.d=function(e,t,r){l.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,t){if(1&t&&(e=l(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(l.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)l.d(r,n,function(t){return e[t]}.bind(null,n));return r},l.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(t,"a",t),t},l.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},l.p="./";var i=this.webpackJsonpstreamlit_item_selector=this.webpackJsonpstreamlit_item_selector||[],a=i.push.bind(i);i.push=t,i=i.slice();for(var f=0;f<i.length;f++)t(i[f]);var c=a;r()}([])</script><script src="./static/js/2.c8d927de.chunk.js"></script><script src="./static/js/main.a9e501ea.chunk.js"></script></body></html>
<!doctype html><html lang="en"><head><title>Streamlit Component</title><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Streamlit Component"/></head><body><noscript>You need to enable JavaScript to run this app.</noscript><style>.css-9eqr5v .e19lei0e0{display:none}</style><div id="root"></div><script>!function(e){function t(t){for(var n,l,i=t[0],a=t[1],f=t[2],p=0,s=[];p<i.length;p++)l=i[p],Object.prototype.hasOwnProperty.call(o,l)&&o[l]&&s.push(o[l][0]),o[l]=0;for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n]);for(c&&c(t);s.length;)s.shift()();return u.push.apply(u,f||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,i=1;i<r.length;i++){var a=r[i];0!==o[a]&&(n=!1)}n&&(u.splice(t--,1),e=l(l.s=r[0]))}return e}var n={},o={1:0},u=[];function l(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,l),r.l=!0,r.exports}l.m=e,l.c=n,l.d=function(e,t,r){l.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,t){if(1&t&&(e=l(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(l.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)l.d(r,n,function(t){return e[t]}.bind(null,n));return r},l.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(t,"a",t),t},l.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},l.p="./";var i=this.webpackJsonpstreamlit_item_selector=this.webpackJsonpstreamlit_item_selector||[],a=i.push.bind(i);i.push=t,i=i.slice();for(var f=0;f<i.length;f++)t(i[f]);var c=a;r()}([])</script><script src="./static/js/2.c8d927de.chunk.js"></script><script src="./static/js/main.f79fc270.chunk.js"></script></body></html>

2
com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/custom_components/itemselector/build/service-worker.js


importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js");
importScripts(
"./precache-manifest.05e94e122c3b2376022df49096526454.js"
"./precache-manifest.27ac81bfb307ceb0cd48077a28d3d23b.js"
);
self.addEventListener('message', (event) => {

90
com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/preview.py


import numpy as np
import streamlit as st
import SessionState
import PIL
from PIL import ImageFont
from PIL.Image import Image

dataset_name = st.sidebar.selectbox(
"Please select a dataset...", list_datasets(base_dataset_dir)
)
labelers = {}
labelers['semantic_segmentation'] = st.sidebar.checkbox("Semantic Segmentation", key="ss")
labelers['bounding_boxes_2d'] = st.sidebar.checkbox("Bounding Boxes", key="bb2d")
num_rows = 5
if dataset_name is not None:
colors, dataset = load_perception_dataset(
os.path.join(base_dataset_dir, dataset_name)

# image, classes, labels, boxes, colors, "Bounding Boxes Preview", ""
#)
grid_view(num_rows, colors, dataset)
session_state = SessionState.get(image='-1', start_at='0')
index = int(session_state.image)
if index >= 0:
zoom(index, colors, dataset, session_state, labelers)
else:
num_rows = 5
grid_view(num_rows, colors, dataset, session_state, labelers)
#valid_result = False
#app_state = st.experimental_get_query_params()
#if "image_zoom_in" in app_state:
# index = int(app_state["image_zoom_in"][0])
# if index >= 0:
# valid_result = True
# zoom(index, dataset)
#
#if not valid_result:
# num_rows = 5
# grid_view(num_rows, colors, dataset)
def sidebar():

return None
def grid_view(num_rows, colors, dataset):
def grid_view(num_rows, colors, dataset, session_state, labelers):
start_at_2 = item_selector(0, num_cols * num_rows, len(dataset))
start_at = item_selector(int(session_state.start_at), num_cols * num_rows, len(dataset))
session_state.start_at = start_at
#inner_cols = st.beta_columns([0.1, 0.0001])
semantic_segmentation = st.sidebar.checkbox("Semantic Segmentation", key="ss")
bounding_boxes_2d = st.sidebar.checkbox("Bounding Boxes", key="bb2d")
#app_state = st.experimental_get_query_params()
#if "start_at" in app_state:
# start_at = int(app_state["start_at"][0])
#else:
# start_at = 0
#if inner_cols[1].button('>'):
# overflow_image_count = len(dataset) % (num_cols * num_rows)
# overflow_image_count = (num_cols * num_rows) if overflow_image_count == 0 else overflow_image_count
# start_at = min(start_at + num_cols * num_rows, len(dataset)-overflow_image_count)
#if inner_cols[0].button('<'):
# start_at = max(0, start_at - num_cols * num_rows)
#st.experimental_set_query_params(start_at=start_at)
for i in range(start_at_2, min(start_at_2 + (num_cols * num_rows), len(dataset))):
for i in range(start_at, min(start_at + (num_cols * num_rows), len(dataset))):
if semantic_segmentation:
if labelers['semantic_segmentation']:
if bounding_boxes_2d:
if labelers['bounding_boxes_2d']:
container = cols[(i - (start_at_2 % num_cols)) % num_cols].beta_container()
container = cols[(i - (start_at % num_cols)) % num_cols].beta_container()
container.write("Capture #" + str(i))
expand_image = container.button(label="Expand image", key="exp"+str(i))
if container.button(label="Expand image", key="exp"+str(i)):
container.write("IMAGE WAS CLICKED")
if expand_image:
session_state.image = i
st.experimental_rerun()
def zoom(index, colors, dataset, session_state, labelers):
if st.button('< Back to Grid view'):
session_state.image = -1
st.experimental_rerun()
classes = dataset.classes
image, segmentation, target = dataset[index]
labels = target["labels"]
boxes = target["boxes"]
def zoom(index):
return None
if labelers['semantic_segmentation']:
image = draw_image_with_semantic_segmentation(
image, dataset.metadata.image_size[0], dataset.metadata.image_size[1], segmentation, "Semantic Segmentation Preview", ""
)
if labelers['bounding_boxes_2d']:
image = draw_image_with_boxes(
image, classes, labels, boxes, colors, "Bounding Boxes Preview", ""
)
layout = st.beta_columns([0.8, 0.2])
layout[0].image(image, use_column_width=True)
layout[1].title("JSON metadata")
layout[1].write("-- display --")
def preview_app(args):
"""

117
com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/SessionState.py


"""Hack to add per-session state to Streamlit.
Usage
-----
>>> import SessionState
>>>
>>> session_state = SessionState.get(user_name='', favorite_color='black')
>>> session_state.user_name
''
>>> session_state.user_name = 'Mary'
>>> session_state.favorite_color
'black'
Since you set user_name above, next time your script runs this will be the
result:
>>> session_state = get(user_name='', favorite_color='black')
>>> session_state.user_name
'Mary'
"""
try:
import streamlit.ReportThread as ReportThread
from streamlit.server.Server import Server
except Exception:
# Streamlit >= 0.65.0
import streamlit.report_thread as ReportThread
from streamlit.server.server import Server
class SessionState(object):
def __init__(self, **kwargs):
"""A new SessionState object.
Parameters
----------
**kwargs : any
Default values for the session state.
Example
-------
>>> session_state = SessionState(user_name='', favorite_color='black')
>>> session_state.user_name = 'Mary'
''
>>> session_state.favorite_color
'black'
"""
for key, val in kwargs.items():
setattr(self, key, val)
def get(**kwargs):
"""Gets a SessionState object for the current session.
Creates a new object if necessary.
Parameters
----------
**kwargs : any
Default values you want to add to the session state, if we're creating a
new one.
Example
-------
>>> session_state = get(user_name='', favorite_color='black')
>>> session_state.user_name
''
>>> session_state.user_name = 'Mary'
>>> session_state.favorite_color
'black'
Since you set user_name above, next time your script runs this will be the
result:
>>> session_state = get(user_name='', favorite_color='black')
>>> session_state.user_name
'Mary'
"""
# Hack to get the session object from Streamlit.
ctx = ReportThread.get_report_ctx()
this_session = None
current_server = Server.get_current()
if hasattr(current_server, '_session_infos'):
# Streamlit < 0.56
session_infos = Server.get_current()._session_infos.values()
else:
session_infos = Server.get_current()._session_info_by_id.values()
for session_info in session_infos:
s = session_info.session
if (
# Streamlit < 0.54.0
(hasattr(s, '_main_dg') and s._main_dg == ctx.main_dg)
or
# Streamlit >= 0.54.0
(not hasattr(s, '_main_dg') and s.enqueue == ctx.enqueue)
or
# Streamlit >= 0.65.2
(not hasattr(s, '_main_dg') and s._uploaded_file_mgr == ctx.uploaded_file_mgr)
):
this_session = s
if this_session is None:
raise RuntimeError(
"Oh noes. Couldn't get your Streamlit Session object. "
'Are you doing something fancy with threads?')
# Got the session object! Now let's attach some state into it.
if not hasattr(this_session, '_custom_session_state'):
this_session._custom_session_state = SessionState(**kwargs)
return this_session._custom_session_state

7
com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/SessionState.py.meta


fileFormatVersion: 2
guid: 4a0e38cbb21fd8848a5fe4491e44d685
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

2
com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/custom_components/itemselector/build/static/js/main.a9e501ea.chunk.js


(this.webpackJsonpstreamlit_item_selector=this.webpackJsonpstreamlit_item_selector||[]).push([[0],{62:function(t,e,a){t.exports=a(76)},76:function(t,e,a){"use strict";a.r(e);var n=a(0),r=a.n(n),l=a(14),s=a.n(l),i=a(1),o=a(4),c=a(2),d=a(3),u=a(38),m=a(109),p=a(48),f=a.n(p),b=a(110),g=a(107),h=function(t){Object(c.a)(a,t);var e=Object(d.a)(a);function a(){var t;Object(i.a)(this,a);for(var n=arguments.length,l=new Array(n),s=0;s<n;s++)l[s]=arguments[s];return(t=e.call.apply(e,[this].concat(l))).state={startAt:0},t.handleClick=function(e){var a=t.props.args.incrementAmt,n=t.state.startAt;"left"===e?n-=a:"right"===e&&(n+=a),n=t.forceBounds(n),t.setState((function(){return{startAt:n}}),(function(){return u.a.setComponentValue(t.state.startAt)}))},t.handleIndexChange=function(e){var a=t.forceBounds(Number(e));t.setState((function(){return{startAt:a}}),(function(){return u.a.setComponentValue(t.state.startAt)}))},t.render=function(){var e=Object(b.a)(f.a)({}),a=Object(b.a)(f.a)({transform:"rotate(180deg)"}),n=Object(b.a)(m.a)({marginBottom:"10px"});return r.a.createElement("div",{style:{width:"100%"}},r.a.createElement("style",{dangerouslySetInnerHTML:{__html:"\n .css-9eqr5v { display: none }\n "}}),r.a.createElement("div",{style:{width:"50%",display:"inline-block"}},r.a.createElement("p",{style:{fontFamily:'"IBM Plex Sans", sans-serif',fontSize:"1rem",color:"rgb(38, 39, 48)"}},"Go to index:"),r.a.createElement(g.a,{label:"Index",id:"outlined-size-small",defaultValue:"",type:"number",variant:"outlined",size:"small",disabled:t.props.disabled,onChange:function(e){return t.handleIndexChange(e.target.value)},style:{marginBottom:"20px",marginTop:"-10px"}})),r.a.createElement("div",{style:{width:"50%",display:"inline-block"}},r.a.createElement("div",{style:{position:"relative",width:"300px",overflow:"visible",display:"block",marginLeft:"auto",marginRight:"auto"}},r.a.createElement(n,{color:"primary",disabled:t.props.disabled||0==t.state.startAt,onClick:function(){return t.handleClick("left")}},r.a.createElement(a,{fontSize:"large"})),r.a.createElement("h1",{style:{display:"inline-block"}},t.state.startAt," - ",Math.min(t.state.startAt+t.props.args.incrementAmt-1,t.props.args.datasetSize-1)),r.a.createElement(n,{color:"primary",disabled:t.props.disabled||t.state.startAt+t.props.args.incrementAmt>t.props.args.datasetSize,onClick:function(){return t.handleClick("right")}},r.a.createElement(e,{fontSize:"large"})))))},t}return Object(o.a)(a,[{key:"forceBounds",value:function(t){var e=this.props.args.datasetSize-1;return t<0?t=0:t>e&&(t=e),t}}]),a}(u.b),y=Object(u.c)(h);s.a.render(r.a.createElement(r.a.StrictMode,null,r.a.createElement(y,null)),document.getElementById("root"))}},[[62,1,2]]]);
//# sourceMappingURL=main.a9e501ea.chunk.js.map

1
com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/custom_components/itemselector/build/static/js/main.a9e501ea.chunk.js.map
文件差异内容过多而无法显示
查看文件

7
com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/custom_components/itemselector/build/static/js/main.a9e501ea.chunk.js.map.meta


fileFormatVersion: 2
guid: 72d28bf51415b4a4d992f5005285c2ee
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

7
com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/custom_components/itemselector/build/static/js/main.a9e501ea.chunk.js.meta


fileFormatVersion: 2
guid: 52117235aea155c4f9c43ebea8e13b4a
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

22
com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/custom_components/itemselector/build/precache-manifest.05e94e122c3b2376022df49096526454.js


self.__precacheManifest = (self.__precacheManifest || []).concat([
{
"revision": "6efd3cb598db8aebc49312d1eef8a378",
"url": "./index.html"
},
{
"revision": "ab8726a3439b9cc8bdfa",
"url": "./static/js/2.c8d927de.chunk.js"
},
{
"revision": "71aa9e5fe8bf6f2bc9396bc9828f6810",
"url": "./static/js/2.c8d927de.chunk.js.LICENSE.txt"
},
{
"revision": "7595e8428d44a8236a0c",
"url": "./static/js/main.a9e501ea.chunk.js"
},
{
"revision": "93b8f03b99fc2cbeddf9",
"url": "./static/js/runtime-main.08b6432a.js"
}
]);

7
com.unity.perception/Editor/Pyrception/pyrception-utils/pyrception_utils/custom_components/itemselector/build/precache-manifest.05e94e122c3b2376022df49096526454.js.meta


fileFormatVersion: 2
guid: ccc254de2ef23b9499d9f6418806fe4f
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
正在加载...
取消
保存