diff options
-rw-r--r-- | examples/studio3d/simpleqml/main.qml | 8 | ||||
-rw-r--r-- | examples/studio3d/simpleqml/presentation/barrel.uip | 67 | ||||
-rw-r--r-- | res/DataModelMetadata/en-us/MetaData.xml | 2 | ||||
-rw-r--r-- | src/runtime/Qt3DSActivationManager.cpp | 10 | ||||
-rw-r--r-- | src/runtime/Qt3DSApplication.cpp | 7 | ||||
-rw-r--r-- | src/runtime/Qt3DSApplication.h | 1 | ||||
-rw-r--r-- | src/runtime/Qt3DSElementSystem.h | 4 | ||||
-rw-r--r-- | src/runtime/Qt3DSInputEventTypes.h | 3 | ||||
-rw-r--r-- | src/runtime/Qt3DSKernelTypes.h | 5 | ||||
-rw-r--r-- | src/runtime/Qt3DSLogicSystem.cpp | 10 | ||||
-rw-r--r-- | tests/auto/studio3d/q3dssurfaceviewer/tst_q3dssurfaceviewer.cpp | 36 | ||||
-rw-r--r-- | tests/auto/studio3d/shared/presentation/activateactions.uip | 55 | ||||
-rw-r--r-- | tests/auto/studio3d/shared/shared_presentations.h | 1 | ||||
-rw-r--r-- | tests/auto/studio3d/shared/shared_presentations.qrc | 1 |
14 files changed, 178 insertions, 32 deletions
diff --git a/examples/studio3d/simpleqml/main.qml b/examples/studio3d/simpleqml/main.qml index abdcb79..4cbea83 100644 --- a/examples/studio3d/simpleqml/main.qml +++ b/examples/studio3d/simpleqml/main.qml @@ -77,7 +77,7 @@ Rectangle { Presentation { id: s3dpres source: "qrc:/presentation/barrel.uia" - onCustomSignalEmitted: customSignalName.text = Date.now() + ": " + name + onCustomSignalEmitted: customSignalName.text = Date.now() + ": customSignal:" + name onSlideEntered: slideEnter.text = "Entered slide " + name + "(index " + index + ") on " + elementPath onSlideExited: slideExit.text = "Exited slide " + name + "(index " + index + ") on " + elementPath @@ -218,19 +218,19 @@ Rectangle { id: customSignalName anchors.bottom: parent.bottom anchors.left: fpsCount.right - anchors.leftMargin: 8 + anchors.leftMargin: 30 } Text { id: slideEnter anchors.bottom: parent.bottom anchors.left: customSignalName.right - anchors.leftMargin: 8 + anchors.leftMargin: 30 } Text { id: slideExit anchors.bottom: parent.bottom anchors.left: slideEnter.right - anchors.leftMargin: 8 + anchors.leftMargin: 30 } Button { id: nextSlideByIndex diff --git a/examples/studio3d/simpleqml/presentation/barrel.uip b/examples/studio3d/simpleqml/presentation/barrel.uip index 7b9b2fb..c36f0e5 100644 --- a/examples/studio3d/simpleqml/presentation/barrel.uip +++ b/examples/studio3d/simpleqml/presentation/barrel.uip @@ -1,47 +1,54 @@ <?xml version="1.0" encoding="UTF-8" ?> <UIP version="6" > <Project > - <ProjectSettings author="" company="" presentationWidth="800" presentationHeight="480" maintainAspect="False" preferKtx="False" > + <ProjectSettings author="" company="" presentationWidth="800" presentationHeight="480" maintainAspect="False" preferKtx="False" flipCompressedTextures="False" > <CustomColors count="16" >#ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff</CustomColors> </ProjectSettings> + <BufferData > + <ImageBuffer sourcepath="maps/barrel_barrel_Diffuse.png" hasTransparency="False" hasOpaquePixels="True" /> + <ImageBuffer sourcepath="maps/barrel_barrel_Emissive.png" hasTransparency="False" hasOpaquePixels="True" /> + <ImageBuffer sourcepath="maps/barrel_barrel_Normal.png" hasTransparency="False" hasOpaquePixels="True" /> + <ImageBuffer sourcepath="maps/barrel_barrel_Specular.png" hasTransparency="False" hasOpaquePixels="True" /> + </BufferData> <Graph > - <Scene id="Scene" > - <Layer id="Layer" variants="" > - <Camera id="Camera" /> - <Light id="Light" /> - <Model id="Barrel" variants="" > - <Material id="Material" > - <Image id="Material_diffusemap" /> - <Image id="Material_normalmap" /> - <Image id="Material_emissivemap" /> - <Image id="Material_specularmap" /> + <Scene id="Scene_u51457" > + <Layer id="Layer_u16894" variants="" > + <Camera id="Camera_u20801" /> + <Light id="Light_u60375" /> + <Model id="Barrel_u17933" variants="" > + <Material id="Material_u43207" > + <Image id="Material_diffusemap_u25218" /> + <Image id="Material_normalmap_u31730" /> + <Image id="Material_emissivemap_u20392" /> + <Image id="Material_specularmap_u63189" /> </Material> </Model> - <Text id="Text" variants="" /> - <Text id="Text2" variants="" /> + <Text id="Text_u12278" variants="" /> + <Text id="Text2_u28451" variants="" /> + <Group id="Group_u19473" variants="" /> </Layer> </Scene> </Graph> <Logic > - <State name="Master Slide" component="#Scene" > - <Add ref="#Layer" /> - <Add ref="#Camera" /> - <Add ref="#Light" /> - <State id="Scene-Slide1" name="Slide1" playmode="Looping" > - <Add ref="#Barrel" name="Barrel" position="0 -42 -483" rotation="90 0 0" scale="100 100 100" sourcepath=".\barrel\meshes\Barrel.mesh#1" > + <State name="Master Slide" component="#Scene_u51457" > + <Add ref="#Layer_u16894" /> + <Add ref="#Camera_u20801" /> + <Add ref="#Light_u60375" /> + <State id="Scene-Slide1_u1119" name="Slide1" playmode="Looping" > + <Add ref="#Barrel_u17933" name="Barrel" position="0 -42 -483" rotation="90 0 0" scale="100 100 100" sourcepath=".\barrel\meshes\Barrel.mesh#1" > <AnimationTrack property="opacity" type="EaseInOut" /> <AnimationTrack property="rotation.x" type="EaseInOut" >0 90 100 100 5 64 100 100 10 90 100 100</AnimationTrack> <AnimationTrack property="rotation.y" type="EaseInOut" >0 0 100 100 5 -302 100 100 10 0 100 100</AnimationTrack> <AnimationTrack property="rotation.z" type="EaseInOut" >0 0 100 100 5 0 100 100 10 0 100 100</AnimationTrack> </Add> - <Add ref="#Material" bumpamount="0" diffuse="1 1 1 1" diffusemap="#Material_diffusemap" emissivemap="#Material_emissivemap" fresnelPower="25" normalmap="#Material_normalmap" specularamount="4" specularmap="#Material_specularmap" specularmodel="Default" specularroughness="0.001" > + <Add ref="#Material_u43207" bumpamount="0" diffuse="1 1 1 1" diffusemap="#Material_diffusemap_u25218" emissivemap="#Material_emissivemap_u20392" fresnelPower="25" normalmap="#Material_normalmap_u31730" specularamount="4" specularmap="#Material_specularmap_u63189" specularmodel="Default" specularroughness="0.001" > <AnimationTrack property="bumpamount" type="EaseInOut" >0 0 100 100 5 1 100 100</AnimationTrack> </Add> - <Add ref="#Material_diffusemap" sourcepath=".\maps\barrel_barrel_Diffuse.png" /> - <Add ref="#Material_normalmap" sourcepath=".\maps\barrel_barrel_Normal.png" /> - <Add ref="#Material_emissivemap" sourcepath=".\maps\barrel_barrel_Emissive.png" /> - <Add ref="#Material_specularmap" sourcepath=".\maps\barrel_barrel_Specular.png" /> - <Add ref="#Text" name="Text" font="Arimo-Regular" position="-486.418 297.128 50.5569" textcolor="0 1 0 1" textstring="Barrel!" tracking="0" > + <Add ref="#Material_diffusemap_u25218" sourcepath=".\maps\barrel_barrel_Diffuse.png" /> + <Add ref="#Material_normalmap_u31730" sourcepath=".\maps\barrel_barrel_Normal.png" /> + <Add ref="#Material_emissivemap_u20392" sourcepath=".\maps\barrel_barrel_Emissive.png" /> + <Add ref="#Material_specularmap_u63189" sourcepath=".\maps\barrel_barrel_Specular.png" /> + <Add ref="#Text_u12278" name="Text" font="Arimo-Regular" position="-486.418 297.128 50.5569" textcolor="0 1 0 1" textstring="Barrel!" tracking="0" > <AnimationTrack property="opacity" type="EaseInOut" >0 100 100 100 5.009 43.75 100 100 10 100 100 100</AnimationTrack> <AnimationTrack property="rotation.x" type="EaseInOut" >0 0 100 100 4.997 0 100 100 5.009 0 100 100 10 0 100 100</AnimationTrack> <AnimationTrack property="rotation.y" type="EaseInOut" >0 0 100 100 4.997 0 100 100 5.009 0 100 100 10 360 100 100</AnimationTrack> @@ -50,7 +57,15 @@ <AnimationTrack property="textcolor.y" type="EaseInOut" >0 1 100 100 5.009 0.235294 100 100 10 1 100 100</AnimationTrack> <AnimationTrack property="textcolor.z" type="EaseInOut" >0 0 100 100 5.009 0.333333 100 100 10 0 100 100</AnimationTrack> </Add> - <Add ref="#Text2" name="Text2" controlledproperty="$di_text textstring" font="Arimo-Regular" position="437.342 256.921 0" /> + <Add ref="#Text2_u28451" name="Text2" controlledproperty="$di_text textstring" font="Arimo-Regular" position="437.342 256.921 0" /> + <Add ref="#Group_u19473" name="Group" endtime="3083" starttime="1433" > + <Action id="Group-Action_u35574" eyeball="True" triggerObject="#Group_u19473" event="onActivate" targetObject="#Group_u19473" handler="Emit Signal" > + <HandlerArgument name="Signal Name" type="String" argtype="Signal" value="CustomTestSignal1" /> + </Action> + <Action id="Group-Action_u20930" eyeball="True" triggerObject="#Group_u19473" event="onDeactivate" targetObject="#Group_u19473" handler="Emit Signal" > + <HandlerArgument name="Signal Name" type="String" argtype="Signal" /> + </Action> + </Add> </State> </State> </Logic> diff --git a/res/DataModelMetadata/en-us/MetaData.xml b/res/DataModelMetadata/en-us/MetaData.xml index c5d2458..b793df7 100644 --- a/res/DataModelMetadata/en-us/MetaData.xml +++ b/res/DataModelMetadata/en-us/MetaData.xml @@ -49,6 +49,8 @@ <Event name="onPressureDown" category="Gesture" /> <Event name="onPressureUp" category="Gesture" /> <Event name="onTap" category="Gesture" /> + <Event name="onActivate" category="Time" /> + <Event name="onDeactivate" category="Time" /> <!-- <Event name="onDoubleTap" category="Gesture" /> <Event name="onSingleTap" category="Gesture" /> diff --git a/src/runtime/Qt3DSActivationManager.cpp b/src/runtime/Qt3DSActivationManager.cpp index 664e3a2..b1965fa 100644 --- a/src/runtime/Qt3DSActivationManager.cpp +++ b/src/runtime/Qt3DSActivationManager.cpp @@ -46,6 +46,7 @@ #include "foundation/Qt3DSSync.h" #include "Qt3DSRenderThreadPool.h" #include "foundation/Qt3DSSimpleTypes.h" +#include "Qt3DSInputEventTypes.h" using namespace qt3ds::runtime; using namespace qt3ds::runtime::element; @@ -517,6 +518,15 @@ struct STimeContext Mutex &inElementAccessMutex, bool &scriptBufferRequiresSort, bool inIsActive) { + + if (inNode.Flags().HasActivityAction() && inNode.GetBelongedPresentation()) { + // If node has activity changing actions enabled, fire them + if (inIsActive) + inNode.GetBelongedPresentation()->FireEvent(Q3DStudio::ON_ACTIVATE, &inNode); + else + inNode.GetBelongedPresentation()->FireEvent(Q3DStudio::ON_DEACTIVATE, &inNode); + } + Mutex::ScopedLock __locker(inElementAccessMutex); TElementAndSortKey theKey(&inNode, inNode.Depth()); if (inIsActive) { diff --git a/src/runtime/Qt3DSApplication.cpp b/src/runtime/Qt3DSApplication.cpp index 7b4d625..6bc7b1b 100644 --- a/src/runtime/Qt3DSApplication.cpp +++ b/src/runtime/Qt3DSApplication.cpp @@ -2326,6 +2326,13 @@ bool IApplication::isPickingEvent(TEventCommandHash event) || event == ON_GROUPEDMOUSEOUT); } +// Checks if the event comes from timeline becoming (de)active +bool IApplication::isActivityEvent(TEventCommandHash event) +{ + return (event == ON_ACTIVATE + || event == ON_DEACTIVATE); +} + QDebug operator<<(QDebug debug, const DataInOutAttribute &value) { QDebugStateSaver saver(debug); diff --git a/src/runtime/Qt3DSApplication.h b/src/runtime/Qt3DSApplication.h index fd9c871..fd7f027 100644 --- a/src/runtime/Qt3DSApplication.h +++ b/src/runtime/Qt3DSApplication.h @@ -254,6 +254,7 @@ public: static IApplication &CreateApplicationCore(Q3DStudio::IRuntimeFactoryCore &inFactory, const char8_t *inApplicationDirectory); static bool isPickingEvent(Q3DStudio::TEventCommandHash event); + static bool isActivityEvent(Q3DStudio::TEventCommandHash event); // This will print out and reset the startup perf logs virtual void OutputPerfLoggingData() = 0; diff --git a/src/runtime/Qt3DSElementSystem.h b/src/runtime/Qt3DSElementSystem.h index a633ea8..eeafb5d 100644 --- a/src/runtime/Qt3DSElementSystem.h +++ b/src/runtime/Qt3DSElementSystem.h @@ -246,6 +246,10 @@ namespace runtime { { return this->operator&(Q3DStudio::ELEMENTFLAG_TIMELINE); } + bool HasActivityAction() const + { + return this->operator&(Q3DStudio::ELEMENTFLAG_ACTIVITYACTIONENABLED); + } }; typedef eastl::pair<SPropertyDesc, Q3DStudio::UVariant *> TPropertyDescAndValuePtr; diff --git a/src/runtime/Qt3DSInputEventTypes.h b/src/runtime/Qt3DSInputEventTypes.h index 0b3c398..fcf1d23 100644 --- a/src/runtime/Qt3DSInputEventTypes.h +++ b/src/runtime/Qt3DSInputEventTypes.h @@ -46,6 +46,9 @@ const TEventCommandHash ON_MOUSEOUT = CHash::HashEventCommand("onMouseOut"); const TEventCommandHash ON_GROUPEDMOUSEOVER = CHash::HashEventCommand("onGroupedMouseOver"); const TEventCommandHash ON_GROUPEDMOUSEOUT = CHash::HashEventCommand("onGroupedMouseOut"); +const TEventCommandHash ON_ACTIVATE = CHash::HashEventCommand("onActivate"); +const TEventCommandHash ON_DEACTIVATE = CHash::HashEventCommand("onDeactivate"); + // Crude hack to pretend mouse events are gesture events, since gesture events are all you // can specify in studio. // TODO: Fix properly, preferably by bringing back gesture support diff --git a/src/runtime/Qt3DSKernelTypes.h b/src/runtime/Qt3DSKernelTypes.h index 866196d..2e6d769 100644 --- a/src/runtime/Qt3DSKernelTypes.h +++ b/src/runtime/Qt3DSKernelTypes.h @@ -143,7 +143,10 @@ enum EElementFlag { // Flags used by the activation manager ELEMENTFLAG_AMGR_TIMEACTIVE = 1 << 13, ///< Is the element alive according to time information - ELEMENTFLAG_CONTROLLED_ACTIVE = 1 << 14 ///< Is the element alive based on datainput control + ELEMENTFLAG_CONTROLLED_ACTIVE = 1 << 14, ///< Is the element alive based on datainput control + + ELEMENTFLAG_ACTIVITYACTIONENABLED = 1 << 15, ///< Activity changing action has been registered on this element + }; // Four byte aligned time unit structure. diff --git a/src/runtime/Qt3DSLogicSystem.cpp b/src/runtime/Qt3DSLogicSystem.cpp index 4a8341b..742764c 100644 --- a/src/runtime/Qt3DSLogicSystem.cpp +++ b/src/runtime/Qt3DSLogicSystem.cpp @@ -218,7 +218,7 @@ struct SLogicSystem : public ILogicSystem if (logicIter != m_LogicKeys.end()) { for (TLogicDataList::iterator listIter = logicIter->second.begin(), listEnd = logicIter->second.end(); - listIter != listEnd; ++listIter) + listIter != listEnd; ++listIter) { if (listIter->m_Id == inActionIndex) { listIter->m_Active = inActive; if (IApplication::isPickingEvent(logicIter->first.m_CommandHash)) { @@ -226,8 +226,16 @@ struct SLogicSystem : public ILogicSystem logicIter->first.m_ElementHandle); if (theElement && inActive) theElement->SetFlag(Q3DStudio::ELEMENTFLAG_PICKENABLED, true); + } else if (IApplication::isActivityEvent(logicIter->first.m_CommandHash)) { + SElement *theElement = inElemAllocator.FindElementByHandle( + logicIter->first.m_ElementHandle); + if (theElement && inActive) { + theElement->SetFlag(Q3DStudio::ELEMENTFLAG_ACTIVITYACTIONENABLED, + true); + } } } + } } } } diff --git a/tests/auto/studio3d/q3dssurfaceviewer/tst_q3dssurfaceviewer.cpp b/tests/auto/studio3d/q3dssurfaceviewer/tst_q3dssurfaceviewer.cpp index 7197b49..6133577 100644 --- a/tests/auto/studio3d/q3dssurfaceviewer/tst_q3dssurfaceviewer.cpp +++ b/tests/auto/studio3d/q3dssurfaceviewer/tst_q3dssurfaceviewer.cpp @@ -61,6 +61,8 @@ private slots: void testBasics(); void testSourceChange_data(); void testSourceChange(); + void testActivateActions_data(); + void testActivateActions(); void testSizeChange_data(); void testSizeChange(); void testUpdateInterval_data(); @@ -368,6 +370,40 @@ void tst_Q3DSSurfaceViewer::testSourceChange() checkPixel(m_viewer, Qt::red); } +void tst_Q3DSSurfaceViewer::testActivateActions_data() +{ + testBasics_data(); +} + +void tst_Q3DSSurfaceViewer::testActivateActions() +{ + QFETCH(bool, isWindow); + + if (isWindow) + createWindowAndViewer(m_viewer, ACTIVATEACTIONS); + else + createOffscreenAndViewer(m_viewer, ACTIVATEACTIONS); + + QSignalSpy spy(m_viewer->presentation(), &Q3DSPresentation::customSignalEmitted); + + QVERIFY(spy.isValid()); + + // This presentations sends custom signals at 1000ms and at 3000ms. + // At same times it also changes scene color using activate actions. + QCOMPARE(spy.count(), 0); + QImage image1 = m_viewer->grab(); + + QTest::qWait(2000); + QCOMPARE(spy.count(), 1); + QImage image2 = m_viewer->grab(); + QVERIFY(image1 != image2); + + QTest::qWait(2000); + QCOMPARE(spy.count(), 2); + QImage image3 = m_viewer->grab(); + QVERIFY(image1 == image3); +} + void tst_Q3DSSurfaceViewer::testSizeChange_data() { testBasics_data(); diff --git a/tests/auto/studio3d/shared/presentation/activateactions.uip b/tests/auto/studio3d/shared/presentation/activateactions.uip new file mode 100644 index 0000000..52ca81a --- /dev/null +++ b/tests/auto/studio3d/shared/presentation/activateactions.uip @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<UIP version="6" > + <Project > + <ProjectSettings author="" company="" presentationWidth="800" presentationHeight="480" maintainAspect="False" preferKtx="False" flipCompressedTextures="False" > + <CustomColors count="16" >#969696 #780000 #ff0055 #ffffff #0a0a0a #ffffff #a0a8b2 #ffffff #ff643a #ffffff #4694ff #ffffff #ff0800 #ffffff #280000 #ffffff</CustomColors> + </ProjectSettings> + <Graph > + <Scene id="Scene_u31923" backgroundcolor="1 0 0 1" bgcolorenable="False" > + <Layer id="Layer_u40191" variants="" > + <Camera id="Camera_u60961" /> + <Light id="Light_u46987" /> + <Model id="Cube_u48840" variants="" > + <ReferencedMaterial id="Default_u50569" name="Default" /> + </Model> + <Group id="Events1_u28102" variants="" /> + <Group id="Events2_u17296" variants="" /> + </Layer> + <Material id="__Container_u55481" > + <Material id="materials//Default_u19189" /> + </Material> + </Scene> + </Graph> + <Logic > + <State name="Master Slide" component="#Scene_u31923" > + <Add ref="#Layer_u40191" /> + <Add ref="#Camera_u60961" /> + <Add ref="#Light_u46987" /> + <Add ref="#__Container_u55481" name="__Container" /> + <Add ref="#materials//Default_u19189" name="materials//Default" /> + <State id="Scene-Slide1_u54514" name="Slide1" > + <Add ref="#Cube_u48840" name="Cube" rotation="20 360 20" sourcepath="#Cube" /> + <Add ref="#Default_u50569" name="Default" referencedmaterial="#materials//Default_u19189" sourcepath="/Default" /> + <Add ref="#Events1_u28102" name="Events1" endtime="3000" starttime="1000" > + <Action id="Events1-Action_u22921" eyeball="True" triggerObject="#Events1_u28102" event="onActivate" targetObject="#Scene_u31923" handler="Set Property" > + <HandlerArgument name="Property Name" type="String" argtype="Property" value="bgcolorenable" /> + <HandlerArgument name="Property Value" type="Bool" argtype="Dependent" value="True" /> + </Action> + <Action id="Events1-Action_u62890" eyeball="True" triggerObject="#Events1_u28102" event="onDeactivate" targetObject="#Scene_u31923" handler="Set Property" > + <HandlerArgument name="Property Name" type="String" argtype="Property" value="bgcolorenable" /> + <HandlerArgument name="Property Value" type="Bool" argtype="Dependent" /> + </Action> + </Add> + <Add ref="#Events2_u17296" name="Events2" endtime="3000" starttime="1000" > + <Action id="Events2-Action_u55956" eyeball="True" triggerObject="#Events2_u17296" event="onActivate" targetObject="#Events2_u17296" handler="Emit Signal" > + <HandlerArgument name="Signal Name" type="String" argtype="Signal" value="mySignal1" /> + </Action> + <Action id="Events2-Action_u17879" eyeball="True" triggerObject="#Events2_u17296" event="onDeactivate" targetObject="#Events2_u17296" handler="Emit Signal" > + <HandlerArgument name="Signal Name" type="String" argtype="Signal" value="mySignal2" /> + </Action> + </Add> + </State> + </State> + </Logic> + </Project> +</UIP> diff --git a/tests/auto/studio3d/shared/shared_presentations.h b/tests/auto/studio3d/shared/shared_presentations.h index 6d38273..af9bd87 100644 --- a/tests/auto/studio3d/shared/shared_presentations.h +++ b/tests/auto/studio3d/shared/shared_presentations.h @@ -37,3 +37,4 @@ const QUrl SETTINGS = QUrl(QStringLiteral("qrc:/settings.uip")); const QUrl MULTISLIDE = QUrl(QStringLiteral("qrc:/multislide.uip")); const QUrl MOUSE = QUrl(QStringLiteral("qrc:/mouse.uip")); const QUrl DATAINPUT = QUrl(QStringLiteral("qrc:/datainput.uia")); +const QUrl ACTIVATEACTIONS = QUrl(QStringLiteral("qrc:/activateactions.uip")); diff --git a/tests/auto/studio3d/shared/shared_presentations.qrc b/tests/auto/studio3d/shared/shared_presentations.qrc index 25dd40e..c55f2bc 100644 --- a/tests/auto/studio3d/shared/shared_presentations.qrc +++ b/tests/auto/studio3d/shared/shared_presentations.qrc @@ -12,5 +12,6 @@ <file alias="datainput.uia">presentation/datainput.uia</file> <file alias="datainput_sub.uip">presentation/datainput_sub.uip</file> <file>maps/OpenfootageNET_garage-512.hdr</file> + <file alias="activateactions.uip">presentation/activateactions.uip</file> </qresource> </RCC> |