mirror of
https://github.com/FyroxEngine/Fyrox.git
synced 2026-10-12 02:02:20 +00:00
started adding ttf loader
This commit is contained in:
Generated
+137
-139
@@ -7,24 +7,15 @@
|
||||
<list default="true" id="1932b2c4-d6ff-413c-9558-19959667326b" name="Default Changelist" comment="scene graph">
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Cargo.lock" beforeDir="false" afterPath="$PROJECT_DIR$/Cargo.lock" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Cargo.toml" beforeDir="false" afterPath="$PROJECT_DIR$/Cargo.toml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/engine/mod.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/engine/mod.rs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/main.rs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/math/mod.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/math/mod.rs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/math/plane.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/math/plane.rs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/math/quat.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/math/quat.rs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/math/ray.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/math/ray.rs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/math/triangulator.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/math/triangulator.rs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/math/vec3.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/math/vec3.rs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/physics/mod.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/physics/mod.rs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/level.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/game/level.rs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/mod.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/game/mod.rs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/player.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/game/player.rs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/game/weapon.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/game/weapon.rs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/renderer/renderer.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/renderer/renderer.rs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/renderer/surface.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/renderer/surface.rs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/resource/fbx/mod.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/resource/fbx/mod.rs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/resource/mod.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/resource/mod.rs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/scene/mod.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/scene/mod.rs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/scene/node.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/scene/node.rs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/utils/pool.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/utils/pool.rs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/utils/rcpool.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/utils/rcpool.rs" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/test.json" beforeDir="false" afterPath="$PROJECT_DIR$/test.json" afterDir="false" />
|
||||
</list>
|
||||
<ignored path="$PROJECT_DIR$/target/" />
|
||||
@@ -38,28 +29,10 @@
|
||||
<component name="FileEditorManager">
|
||||
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/src/engine/mod.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="327">
|
||||
<caret line="73" column="99" selection-start-line="73" selection-start-column="99" selection-end-line="73" selection-end-column="99" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="true">
|
||||
<entry file="file://$PROJECT_DIR$/src/game/weapon.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="847">
|
||||
<caret line="57" column="52" selection-start-line="57" selection-start-column="52" selection-end-line="57" selection-end-column="52" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/src/game/mod.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="837">
|
||||
<caret line="75" column="29" selection-start-line="75" selection-start-column="29" selection-end-line="75" selection-end-column="29" />
|
||||
<state relative-caret-position="391">
|
||||
<caret line="23" column="82" selection-start-line="23" selection-start-column="82" selection-end-line="23" selection-end-column="82" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
@@ -67,8 +40,26 @@
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/src/main.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="221">
|
||||
<caret line="13" selection-start-line="13" selection-end-line="13" />
|
||||
<state relative-caret-position="442">
|
||||
<caret line="26" column="1" selection-start-line="26" selection-start-column="1" selection-end-line="26" selection-end-column="1" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/src/game/mod.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="68">
|
||||
<caret line="4" column="18" lean-forward="true" selection-start-line="4" selection-start-column="18" selection-end-line="4" selection-end-column="18" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/src/resource/fbx/mod.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="658">
|
||||
<caret line="1081" column="124" selection-start-line="1081" selection-start-column="124" selection-end-line="1081" selection-end-column="124" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
@@ -76,35 +67,35 @@
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/src/game/level.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="782">
|
||||
<state relative-caret-position="952">
|
||||
<caret line="96" column="65" selection-start-line="96" selection-start-column="65" selection-end-line="96" selection-end-column="65" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/src/renderer/surface.rs">
|
||||
<entry file="file://$PROJECT_DIR$/src/resource/mod.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="6239">
|
||||
<caret line="367" column="5" selection-start-line="367" selection-start-column="5" selection-end-line="367" selection-end-column="5" />
|
||||
<state relative-caret-position="51">
|
||||
<caret line="3" column="12" selection-start-line="3" selection-start-column="12" selection-end-line="3" selection-end-column="12" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="true">
|
||||
<entry file="file://$PROJECT_DIR$/src/resource/ttf.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="713">
|
||||
<caret line="388" column="65" selection-start-line="388" selection-start-column="65" selection-end-line="388" selection-end-column="65" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/src/utils/pool.rs">
|
||||
<entry file="file://$USER_HOME$/.rustup/toolchains/stable-x86_64-pc-windows-gnu/lib/rustlib/src/rust/src/libcore/ptr.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="3094">
|
||||
<caret line="182" selection-start-line="182" selection-end-line="182" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$USER_HOME$/.rustup/toolchains/stable-x86_64-pc-windows-gnu/lib/rustlib/src/rust/src/libcore/option.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="14416">
|
||||
<caret line="848" column="11" selection-start-line="848" selection-start-column="11" selection-end-line="848" selection-end-column="11" />
|
||||
<state relative-caret-position="335">
|
||||
<caret line="1446" column="18" selection-start-line="1446" selection-start-column="18" selection-end-line="1446" selection-end-column="18" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
@@ -112,8 +103,8 @@
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/src/game/player.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="310">
|
||||
<caret line="233" column="29" selection-start-line="233" selection-start-column="29" selection-end-line="233" selection-end-column="29" />
|
||||
<state relative-caret-position="646">
|
||||
<caret line="198" column="25" selection-start-line="197" selection-start-column="25" selection-end-line="198" selection-end-column="25" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
@@ -122,7 +113,7 @@
|
||||
<entry file="file://$USER_HOME$/.cargo/registry/src/github.com-1ecc6299db9ec823/winit-0.19.0/src/events.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="327">
|
||||
<caret line="88" column="69" selection-start-line="88" selection-start-column="69" selection-end-line="88" selection-end-column="69" />
|
||||
<caret line="253" column="4" selection-start-line="253" selection-start-column="4" selection-end-line="253" selection-end-column="4" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
@@ -154,12 +145,18 @@
|
||||
<find>IterMut</find>
|
||||
<find>Option<Handle</find>
|
||||
<find>Option<RcHandle</find>
|
||||
<find>glyph-></find>
|
||||
<find>ttf -></find>
|
||||
<find>ttf-></find>
|
||||
<find>-></find>
|
||||
</findStrings>
|
||||
<replaceStrings>
|
||||
<replace>b.</replace>
|
||||
<replace>RcHandle</replace>
|
||||
<replace>RcPool</replace>
|
||||
<replace>RcPoolRecord</replace>
|
||||
<replace>self.</replace>
|
||||
<replace>.</replace>
|
||||
</replaceStrings>
|
||||
</component>
|
||||
<component name="Git.Settings">
|
||||
@@ -186,25 +183,26 @@
|
||||
<option value="$PROJECT_DIR$/src/math/vec3.rs" />
|
||||
<option value="$PROJECT_DIR$/src/math/ray.rs" />
|
||||
<option value="$PROJECT_DIR$/src/math/plane.rs" />
|
||||
<option value="$PROJECT_DIR$/src/main.rs" />
|
||||
<option value="$PROJECT_DIR$/src/math/quat.rs" />
|
||||
<option value="$PROJECT_DIR$/src/math/triangulator.rs" />
|
||||
<option value="$PROJECT_DIR$/src/resource/mod.rs" />
|
||||
<option value="$PROJECT_DIR$/src/math/mod.rs" />
|
||||
<option value="$PROJECT_DIR$/src/physics/mod.rs" />
|
||||
<option value="$PROJECT_DIR$/src/scene/node.rs" />
|
||||
<option value="$PROJECT_DIR$/src/resource/model.rs" />
|
||||
<option value="$PROJECT_DIR$/src/resource/fbx/mod.rs" />
|
||||
<option value="$PROJECT_DIR$/src/scene/mod.rs" />
|
||||
<option value="$PROJECT_DIR$/src/engine/mod.rs" />
|
||||
<option value="$PROJECT_DIR$/src/renderer/renderer.rs" />
|
||||
<option value="$PROJECT_DIR$/src/renderer/surface.rs" />
|
||||
<option value="$PROJECT_DIR$/src/utils/rcpool.rs" />
|
||||
<option value="$PROJECT_DIR$/src/utils/pool.rs" />
|
||||
<option value="$PROJECT_DIR$/src/game/level.rs" />
|
||||
<option value="$PROJECT_DIR$/src/game/mod.rs" />
|
||||
<option value="$PROJECT_DIR$/src/game/player.rs" />
|
||||
<option value="$PROJECT_DIR$/src/game/weapon.rs" />
|
||||
<option value="$PROJECT_DIR$/src/scene/node.rs" />
|
||||
<option value="$PROJECT_DIR$/src/scene/mod.rs" />
|
||||
<option value="$PROJECT_DIR$/src/renderer/renderer.rs" />
|
||||
<option value="$PROJECT_DIR$/src/game/player.rs" />
|
||||
<option value="$PROJECT_DIR$/src/main.rs" />
|
||||
<option value="$PROJECT_DIR$/src/resource/mod.rs" />
|
||||
<option value="$PROJECT_DIR$/src/game/mod.rs" />
|
||||
<option value="$PROJECT_DIR$/src/resource/ttf.rs" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
@@ -307,7 +305,7 @@
|
||||
</panes>
|
||||
</component>
|
||||
<component name="PropertiesComponent">
|
||||
<property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1562422800972" />
|
||||
<property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1562437975702" />
|
||||
<property name="last_opened_file_path" value="$PROJECT_DIR$/../Program Files/Git/bin/git.exe" />
|
||||
<property name="org.rust.cargo.project.model.PROJECT_DISCOVERY" value="true" />
|
||||
<property name="project.structure.last.edited" value="Project" />
|
||||
@@ -443,7 +441,7 @@
|
||||
<window_info id="Favorites" order="6" side_tool="true" />
|
||||
<window_info anchor="bottom" id="Message" order="0" />
|
||||
<window_info anchor="bottom" id="Find" order="1" weight="0.23264985" />
|
||||
<window_info active="true" anchor="bottom" id="Run" order="2" sideWeight="0.49818182" visible="true" weight="0.18690851" />
|
||||
<window_info anchor="bottom" id="Run" order="2" sideWeight="0.49818182" weight="0.18690851" />
|
||||
<window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
|
||||
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
|
||||
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
|
||||
@@ -473,20 +471,6 @@
|
||||
<option name="FILTER_TARGETS" value="false" />
|
||||
</component>
|
||||
<component name="editorHistoryManager">
|
||||
<entry file="file://$USER_HOME$/.rustup/toolchains/stable-x86_64-pc-windows-gnu/lib/rustlib/src/rust/src/libcore/hash/mod.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="335">
|
||||
<caret line="174" column="7" selection-start-line="174" selection-start-column="7" selection-end-line="174" selection-end-column="7" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/renderer/gl.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="374">
|
||||
<caret line="22" column="23" selection-start-line="22" selection-start-column="23" selection-end-line="22" selection-end-column="23" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$USER_HOME$/.cargo/registry/src/github.com-1ecc6299db9ec823/winit-0.19.0/src/window.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="374">
|
||||
@@ -676,13 +660,6 @@
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/resource/mod.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="493">
|
||||
<caret line="29" column="27" selection-start-line="29" selection-start-column="27" selection-end-line="29" selection-end-column="27" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$USER_HOME$/.cargo/registry/src/github.com-1ecc6299db9ec823/image-0.21.0/src/image.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="459">
|
||||
@@ -704,13 +681,6 @@
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/scene/node.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="361">
|
||||
<caret line="145" column="63" selection-start-line="145" selection-start-column="63" selection-end-line="145" selection-end-column="63" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$USER_HOME$/.rustup/toolchains/stable-x86_64-pc-windows-gnu/lib/rustlib/src/rust/src/libcore/cell.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="327">
|
||||
@@ -725,20 +695,6 @@
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/resource/fbx/mod.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="658">
|
||||
<caret line="1081" column="124" selection-start-line="1081" selection-start-column="124" selection-end-line="1081" selection-end-column="124" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/scene/mod.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="667">
|
||||
<caret line="132" column="34" selection-start-line="132" selection-start-column="34" selection-end-line="132" selection-end-column="34" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/utils/rcpool.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="1479">
|
||||
@@ -746,20 +702,6 @@
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/renderer/renderer.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="3315">
|
||||
<caret line="195" column="13" selection-start-line="195" selection-start-column="13" selection-end-line="195" selection-end-column="13" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/main.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="221">
|
||||
<caret line="13" selection-start-line="13" selection-end-line="13" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/renderer/surface.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="6239">
|
||||
@@ -781,13 +723,6 @@
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$USER_HOME$/.cargo/registry/src/github.com-1ecc6299db9ec823/winit-0.19.0/src/events.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="327">
|
||||
<caret line="88" column="69" selection-start-line="88" selection-start-column="69" selection-end-line="88" selection-end-column="69" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/engine/mod.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="327">
|
||||
@@ -795,31 +730,94 @@
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/scene/node.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="310">
|
||||
<caret line="171" column="15" selection-start-line="171" selection-start-column="15" selection-end-line="171" selection-end-column="15" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/scene/mod.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="711">
|
||||
<caret line="197" selection-start-line="197" selection-end-line="197" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/renderer/renderer.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="663">
|
||||
<caret line="355" column="45" selection-start-line="355" selection-start-column="45" selection-end-line="355" selection-end-column="45" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/game/weapon.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="391">
|
||||
<caret line="23" column="82" selection-start-line="23" selection-start-column="82" selection-end-line="23" selection-end-column="82" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$USER_HOME$/.cargo/registry/src/github.com-1ecc6299db9ec823/winit-0.19.0/src/events.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="327">
|
||||
<caret line="253" column="4" selection-start-line="253" selection-start-column="4" selection-end-line="253" selection-end-column="4" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/game/player.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="646">
|
||||
<caret line="198" column="25" selection-start-line="197" selection-start-column="25" selection-end-line="198" selection-end-column="25" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/resource/fbx/mod.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="658">
|
||||
<caret line="1081" column="124" selection-start-line="1081" selection-start-column="124" selection-end-line="1081" selection-end-column="124" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/resource/mod.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="51">
|
||||
<caret line="3" column="12" selection-start-line="3" selection-start-column="12" selection-end-line="3" selection-end-column="12" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$USER_HOME$/.rustup/toolchains/stable-x86_64-pc-windows-gnu/lib/rustlib/src/rust/src/libcore/ptr.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="335">
|
||||
<caret line="1446" column="18" selection-start-line="1446" selection-start-column="18" selection-end-line="1446" selection-end-column="18" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/main.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="442">
|
||||
<caret line="26" column="1" selection-start-line="26" selection-start-column="1" selection-end-line="26" selection-end-column="1" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/game/level.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="782">
|
||||
<state relative-caret-position="952">
|
||||
<caret line="96" column="65" selection-start-line="96" selection-start-column="65" selection-end-line="96" selection-end-column="65" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/game/mod.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="837">
|
||||
<caret line="75" column="29" selection-start-line="75" selection-start-column="29" selection-end-line="75" selection-end-column="29" />
|
||||
<state relative-caret-position="68">
|
||||
<caret line="4" column="18" lean-forward="true" selection-start-line="4" selection-start-column="18" selection-end-line="4" selection-end-column="18" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/game/player.rs">
|
||||
<entry file="file://$PROJECT_DIR$/src/resource/ttf.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="310">
|
||||
<caret line="233" column="29" selection-start-line="233" selection-start-column="29" selection-end-line="233" selection-end-column="29" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/src/game/weapon.rs">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="847">
|
||||
<caret line="57" column="52" selection-start-line="57" selection-start-column="52" selection-end-line="57" selection-end-column="52" />
|
||||
<state relative-caret-position="713">
|
||||
<caret line="388" column="65" selection-start-line="388" selection-start-column="65" selection-end-line="388" selection-end-column="65" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
|
||||
Generated
+6
-6
@@ -62,7 +62,7 @@ name = "backtrace-sys"
|
||||
version = "0.1.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
@@ -83,7 +83,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.0.31"
|
||||
version = "1.0.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
@@ -399,7 +399,7 @@ name = "libloading"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
@@ -461,7 +461,7 @@ version = "0.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@@ -473,7 +473,7 @@ version = "0.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@@ -1093,7 +1093,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12"
|
||||
"checksum block 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
|
||||
"checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb"
|
||||
"checksum cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)" = "c9ce8bb087aacff865633f0bd5aeaed910fe2fe55b55f4739527f2e023a2e53d"
|
||||
"checksum cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d"
|
||||
"checksum cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11d43355396e872eefb45ce6342e4374ed7bc2b3a502d1b28e36d6e23c05d1f4"
|
||||
"checksum cgl 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "55e7ec0b74fe5897894cbc207092c577e87c52f8a59e8ca8d97ef37551f60a49"
|
||||
"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
|
||||
|
||||
+2
-2
@@ -31,7 +31,7 @@ impl Level {
|
||||
|
||||
// Create collision geometry
|
||||
let polygon_handle = scene.find_node_by_name(&map_root_handle, "Polygon");
|
||||
if let Some(polygon) = scene.borrow_node(&polygon_handle) {
|
||||
if let Some(polygon) = scene.get_node(&polygon_handle) {
|
||||
let global_transform = polygon.global_transform.clone();
|
||||
let mut static_geometry = StaticGeometry::new();
|
||||
if let NodeKind::Mesh(mesh) = polygon.borrow_kind() {
|
||||
@@ -75,7 +75,7 @@ impl Level {
|
||||
}
|
||||
}
|
||||
for (i, handle) in ripper_handles.iter().enumerate() {
|
||||
if let Some(node) = scene.borrow_node_mut(&handle) {
|
||||
if let Some(node) = scene.get_node_mut(&handle) {
|
||||
node.set_local_position(Vec3::make(-0.25, 0.0, 3.0 - i as f32 * 1.75));
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -29,12 +29,13 @@ impl Game {
|
||||
let mut engine = Engine::new();
|
||||
let level = Level::new(&mut engine);
|
||||
|
||||
/*
|
||||
match File::create(Path::new("test.json")) {
|
||||
Err(_) => println!("unable to create a save"),
|
||||
Ok(file) => {
|
||||
serde_json::to_writer_pretty(file, engine.get_state()).unwrap();
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
Game {
|
||||
engine,
|
||||
|
||||
+65
-13
@@ -4,7 +4,7 @@ use crate::math::vec3::*;
|
||||
use crate::math::quat::*;
|
||||
use crate::scene::node::*;
|
||||
use crate::scene::*;
|
||||
use crate::physics::{Body};
|
||||
use crate::physics::Body;
|
||||
use crate::game::weapon::{Weapon, WeaponKind};
|
||||
use crate::engine::State;
|
||||
use crate::game::GameTime;
|
||||
@@ -39,6 +39,7 @@ impl Default for Controller {
|
||||
|
||||
pub struct Player {
|
||||
camera: Handle<Node>,
|
||||
camera_pivot: Handle<Node>,
|
||||
pivot: Handle<Node>,
|
||||
body: Handle<Body>,
|
||||
weapon_pivot: Handle<Node>,
|
||||
@@ -47,17 +48,24 @@ pub struct Player {
|
||||
dest_yaw: f32,
|
||||
pitch: f32,
|
||||
dest_pitch: f32,
|
||||
stand_body_radius: f32,
|
||||
run_speed_multiplier: f32,
|
||||
stand_body_radius: f32,
|
||||
crouch_body_radius: f32,
|
||||
move_speed: f32,
|
||||
weapons: Vec<Weapon>,
|
||||
current_weapon: usize
|
||||
camera_offset: Vec3,
|
||||
camera_dest_offset: Vec3,
|
||||
current_weapon: usize,
|
||||
}
|
||||
|
||||
impl Player {
|
||||
pub fn new(state: &mut State, scene: &mut Scene) -> Player {
|
||||
let mut camera = Node::new(NodeKind::Camera(Camera::default()));
|
||||
camera.set_local_position(Vec3 { x: 0.0, y: 1.0, z: 0.0 });
|
||||
let camera_handle = scene.add_node(Node::new(NodeKind::Camera(Camera::default())));
|
||||
|
||||
let mut camera_pivot = Node::new(NodeKind::Base);
|
||||
camera_pivot.set_local_position(Vec3 { x: 0.0, y: 1.0, z: 0.0 });
|
||||
let camera_pivot_handle = scene.add_node(camera_pivot);
|
||||
scene.link_nodes(&camera_handle, &camera_pivot_handle);
|
||||
|
||||
let mut pivot = Node::new(NodeKind::Base);
|
||||
pivot.set_local_position(Vec3 { x: -1.0, y: 0.0, z: 1.0 });
|
||||
@@ -68,9 +76,8 @@ impl Player {
|
||||
let body_handle = scene.get_physics_mut().add_body(body);
|
||||
pivot.set_body(body_handle.clone());
|
||||
|
||||
let camera_handle = scene.add_node(camera);
|
||||
let pivot_handle = scene.add_node(pivot);
|
||||
scene.link_nodes(&camera_handle, &pivot_handle);
|
||||
scene.link_nodes(&camera_pivot_handle, &pivot_handle);
|
||||
|
||||
let mut weapon_pivot = Node::new(NodeKind::Base);
|
||||
weapon_pivot.set_local_position(Vec3::make(-0.065, -0.052, 0.02));
|
||||
@@ -80,6 +87,7 @@ impl Player {
|
||||
let mut player = Player {
|
||||
camera: camera_handle,
|
||||
pivot: pivot_handle,
|
||||
camera_pivot: camera_pivot_handle,
|
||||
controller: Controller::default(),
|
||||
stand_body_radius,
|
||||
dest_pitch: 0.0,
|
||||
@@ -87,16 +95,22 @@ impl Player {
|
||||
move_speed: 0.058,
|
||||
body: body_handle,
|
||||
run_speed_multiplier: 1.75,
|
||||
crouch_body_radius: 0.35,
|
||||
yaw: 0.0,
|
||||
pitch: 0.0,
|
||||
weapons: Vec::new(),
|
||||
camera_dest_offset: Vec3::new(),
|
||||
camera_offset: Vec3::new(),
|
||||
weapon_pivot: weapon_pivot_handle,
|
||||
current_weapon: 0
|
||||
current_weapon: 0,
|
||||
};
|
||||
|
||||
let ak47 = Weapon::new(WeaponKind::Ak47, state, scene);
|
||||
player.add_weapon(scene, ak47);
|
||||
|
||||
let m4 = Weapon::new(WeaponKind::M4, state, scene);
|
||||
player.add_weapon(scene, m4);
|
||||
|
||||
player
|
||||
}
|
||||
|
||||
@@ -134,13 +148,14 @@ impl Player {
|
||||
let mut look = Vec3::zero();
|
||||
let mut side = Vec3::zero();
|
||||
|
||||
if let Some(pivot_node) = scene.borrow_node(&self.pivot) {
|
||||
if let Some(pivot_node) = scene.get_node(&self.pivot) {
|
||||
look = pivot_node.get_look_vector();
|
||||
side = pivot_node.get_side_vector();
|
||||
}
|
||||
|
||||
let has_ground_contact = self.has_ground_contact(scene);
|
||||
|
||||
let mut is_moving = false;
|
||||
if let Some(body) = scene.get_physics_mut().borrow_body_mut(&self.body) {
|
||||
let mut velocity = Vec3::new();
|
||||
if self.controller.move_forward {
|
||||
@@ -166,6 +181,8 @@ impl Player {
|
||||
if let Some(normalized_velocity) = velocity.normalized() {
|
||||
body.set_x_velocity(normalized_velocity.x * self.move_speed * speed_mult);
|
||||
body.set_z_velocity(normalized_velocity.z * self.move_speed * speed_mult);
|
||||
|
||||
is_moving = true;
|
||||
}
|
||||
|
||||
if self.controller.jump {
|
||||
@@ -176,15 +193,35 @@ impl Player {
|
||||
}
|
||||
}
|
||||
|
||||
if has_ground_contact && is_moving {
|
||||
let k = (time.elapsed * 15.0) as f32;
|
||||
self.camera_dest_offset.x = 0.05 * (k * 0.5).cos();
|
||||
self.camera_dest_offset.y = 0.1 * k.sin();
|
||||
}
|
||||
|
||||
self.camera_offset.x += (self.camera_dest_offset.x - self.camera_offset.x) * 0.1;
|
||||
self.camera_offset.y += (self.camera_dest_offset.y - self.camera_offset.y) * 0.1;
|
||||
self.camera_offset.z += (self.camera_dest_offset.z - self.camera_offset.z) * 0.1;
|
||||
|
||||
if let Some(camera_node) = scene.get_node_mut(&self.camera) {
|
||||
camera_node.set_local_position(self.camera_offset);
|
||||
}
|
||||
|
||||
for (i, weapon) in self.weapons.iter().enumerate() {
|
||||
if let Some(model) = scene.get_node_mut(&weapon.get_model()) {
|
||||
model.set_visibility(i == self.current_weapon);
|
||||
}
|
||||
}
|
||||
|
||||
self.yaw += (self.dest_yaw - self.yaw) * 0.2;
|
||||
self.pitch += (self.dest_pitch - self.pitch) * 0.2;
|
||||
|
||||
if let Some(pivot_node) = scene.borrow_node_mut(&self.pivot) {
|
||||
if let Some(pivot_node) = scene.get_node_mut(&self.pivot) {
|
||||
pivot_node.set_local_rotation(Quat::from_axis_angle(Vec3::up(), self.yaw.to_radians()));
|
||||
}
|
||||
|
||||
if let Some(camera_node) = scene.borrow_node_mut(&self.camera) {
|
||||
camera_node.set_local_rotation(Quat::from_axis_angle(Vec3::right(), self.pitch.to_radians()));
|
||||
if let Some(camera_pivot) = scene.get_node_mut(&self.camera_pivot) {
|
||||
camera_pivot.set_local_rotation(Quat::from_axis_angle(Vec3::right(), self.pitch.to_radians()));
|
||||
}
|
||||
|
||||
if let Some(current_weapon) = self.weapons.get_mut(self.current_weapon) {
|
||||
@@ -233,7 +270,20 @@ impl Player {
|
||||
self.controller.shoot = false;
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
_ => ()
|
||||
}
|
||||
}
|
||||
|
||||
WindowEvent::MouseWheel { delta, .. } => {
|
||||
match delta {
|
||||
MouseScrollDelta::LineDelta(_, y) => {
|
||||
if *y < 0.0 {
|
||||
self.prev_weapon();
|
||||
} else if *y > 0.0 {
|
||||
self.next_weapon();
|
||||
}
|
||||
}
|
||||
_ => ()
|
||||
}
|
||||
}
|
||||
@@ -247,6 +297,7 @@ impl Player {
|
||||
VirtualKeyCode::S => self.controller.move_backward = true,
|
||||
VirtualKeyCode::A => self.controller.move_left = true,
|
||||
VirtualKeyCode::D => self.controller.move_right = true,
|
||||
VirtualKeyCode::C => self.controller.crouch = true,
|
||||
VirtualKeyCode::Space => self.controller.jump = true,
|
||||
VirtualKeyCode::LShift => self.controller.run = true,
|
||||
_ => ()
|
||||
@@ -260,6 +311,7 @@ impl Player {
|
||||
VirtualKeyCode::S => self.controller.move_backward = false,
|
||||
VirtualKeyCode::A => self.controller.move_left = false,
|
||||
VirtualKeyCode::D => self.controller.move_right = false,
|
||||
VirtualKeyCode::C => self.controller.crouch = false,
|
||||
VirtualKeyCode::LShift => self.controller.run = false,
|
||||
_ => ()
|
||||
}
|
||||
|
||||
+7
-2
@@ -22,8 +22,13 @@ pub struct Weapon {
|
||||
|
||||
impl Weapon {
|
||||
pub fn new(kind: WeaponKind, state: &mut State, scene: &mut Scene) -> Weapon {
|
||||
let model_path = match kind {
|
||||
WeaponKind::Ak47 => Path::new("data/models/ak47.fbx"),
|
||||
WeaponKind::M4 => Path::new("data/models/m4.fbx"),
|
||||
};
|
||||
|
||||
let mut weapon_model = Handle::none();
|
||||
let model_resource_handle = state.request_resource(Path::new("data/models/ak47.fbx"));
|
||||
let model_resource_handle = state.request_resource(model_path);
|
||||
if let Some(resource) = state.get_resource_manager().borrow_resource(&model_resource_handle) {
|
||||
if let ResourceKind::Model(model) = resource.borrow_kind() {
|
||||
weapon_model = model.instantiate(state, scene);
|
||||
@@ -49,7 +54,7 @@ impl Weapon {
|
||||
self.offset.y += (self.dest_offset.y - self.offset.y) * 0.2;
|
||||
self.offset.z += (self.dest_offset.z - self.offset.z) * 0.2;
|
||||
|
||||
if let Some(node) = scene.borrow_node_mut(&self.model) {
|
||||
if let Some(node) = scene.get_node_mut(&self.model) {
|
||||
node.set_local_position(self.offset);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -174,7 +174,7 @@ impl Renderer {
|
||||
|
||||
Self {
|
||||
context,
|
||||
events_loop: events_loop,
|
||||
events_loop,
|
||||
flat_shader: GpuProgram::from_source(&vertex_source, &fragment_source).unwrap(),
|
||||
traversal_stack: Vec::new(),
|
||||
cameras: Vec::new(),
|
||||
@@ -313,7 +313,7 @@ impl Renderer {
|
||||
self.traversal_stack.clear();
|
||||
self.traversal_stack.push(scene.root.clone());
|
||||
while let Some(node_handle) = self.traversal_stack.pop() {
|
||||
if let Some(node) = scene.borrow_node(&node_handle) {
|
||||
if let Some(node) = scene.get_node(&node_handle) {
|
||||
match node.borrow_kind() {
|
||||
NodeKind::Mesh(_) => self.meshes.push(node_handle),
|
||||
NodeKind::Light(_) => self.lights.push(node_handle),
|
||||
@@ -335,7 +335,7 @@ impl Renderer {
|
||||
|
||||
// Render scene from each camera
|
||||
for camera_handle in self.cameras.iter() {
|
||||
if let Some(camera_node) = scene.borrow_node(&camera_handle) {
|
||||
if let Some(camera_node) = scene.get_node(&camera_handle) {
|
||||
if let NodeKind::Camera(camera) = camera_node.borrow_kind() {
|
||||
|
||||
// Setup viewport
|
||||
@@ -351,7 +351,11 @@ impl Renderer {
|
||||
let view_projection = camera.get_view_projection_matrix();
|
||||
|
||||
for mesh_handle in self.meshes.iter() {
|
||||
if let Some(node) = scene.borrow_node(&mesh_handle) {
|
||||
if let Some(node) = scene.get_node(&mesh_handle) {
|
||||
if !node.get_global_visibility() {
|
||||
continue;
|
||||
}
|
||||
|
||||
let mvp = view_projection * node.global_transform;
|
||||
|
||||
unsafe {
|
||||
|
||||
@@ -1198,7 +1198,7 @@ impl Fbx {
|
||||
}
|
||||
}
|
||||
}
|
||||
scene.calculate_transforms();
|
||||
scene.update_nodes();
|
||||
Ok(root)
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
pub mod texture;
|
||||
pub mod fbx;
|
||||
pub mod model;
|
||||
pub mod ttf;
|
||||
|
||||
use std::path::*;
|
||||
use crate::resource::texture::*;
|
||||
|
||||
@@ -0,0 +1,412 @@
|
||||
// TTF loader and rasterizer
|
||||
|
||||
const ON_CURVE_POINT: u8 = 1;
|
||||
const REPEAT_FLAG: u8 = 8;
|
||||
|
||||
struct Point {
|
||||
x: f32,
|
||||
y: f32,
|
||||
flags: u8,
|
||||
}
|
||||
|
||||
struct Polygon {
|
||||
points: Vec<Point>
|
||||
}
|
||||
|
||||
struct Glyph {
|
||||
num_contours: i16,
|
||||
x_min: i16,
|
||||
y_min: i16,
|
||||
x_max: i16,
|
||||
y_max: i16,
|
||||
has_outline: bool,
|
||||
advance: u16,
|
||||
left_side_bearing: i16,
|
||||
end_points: Vec<u16>,
|
||||
raw_contours: Vec<Polygon>,
|
||||
contours: Vec<Polygon>,
|
||||
}
|
||||
|
||||
struct TrueType {
|
||||
data: Vec<u8>,
|
||||
cmap_table: *const u8,
|
||||
loca_table: *const u8,
|
||||
maxp_table: *const u8,
|
||||
head_table: *const u8,
|
||||
glyf_table: *const u8,
|
||||
hhea_table: *const u8,
|
||||
hmtx_table: *const u8,
|
||||
kern_table: *const u8,
|
||||
num_glyphs: u16,
|
||||
glyphs: Vec<Glyph>,
|
||||
}
|
||||
|
||||
fn get_u16(p: *const u8) -> u16
|
||||
{
|
||||
unsafe {
|
||||
let b0 = p.read() as u16;
|
||||
let b1 = p.offset(1).read() as u16;
|
||||
return b0 * 256 + b1;
|
||||
}
|
||||
}
|
||||
|
||||
fn get_i16(p: *const u8) -> i16
|
||||
{
|
||||
unsafe {
|
||||
let b0 = p.read() as i16;
|
||||
let b1 = p.offset(1).read() as i16;
|
||||
return b0 * 256 + b1;
|
||||
}
|
||||
}
|
||||
|
||||
fn get_u32(p: *const u8) -> u32
|
||||
{
|
||||
unsafe {
|
||||
let b0 = p.read() as u32;
|
||||
let b1 = p.offset(1).read() as u32;
|
||||
let b2 = p.offset(2).read() as u32;
|
||||
let b3 = p.offset(3).read() as u32;
|
||||
return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
|
||||
}
|
||||
}
|
||||
|
||||
fn fourcc(d: u8, c: u8, b: u8, a: u8) -> u32 {
|
||||
((d as u32) << 24) | ((c as u32) << 16) | ((b as u32) << 8) | (a as u32)
|
||||
}
|
||||
|
||||
fn segmented_mapping(subtable: *const u8, unicode: u32) -> u32 {
|
||||
unsafe {
|
||||
let segment_count = (get_u16(subtable.offset(6)) / 2) as u32;
|
||||
let end_codes = subtable.offset(14);
|
||||
let start_codes = subtable.offset((16 + 2 * segment_count) as isize);
|
||||
let id_delta = subtable.offset((16 + 4 * segment_count) as isize);
|
||||
let id_range_offset = subtable.offset((16 + 6 * segment_count) as isize);
|
||||
|
||||
let mut segment = 0;
|
||||
while segment < segment_count {
|
||||
if get_u16(end_codes.offset(2 * segment as isize)) as u32 >= unicode {
|
||||
break;
|
||||
}
|
||||
segment += 1;
|
||||
}
|
||||
|
||||
if segment != segment_count {
|
||||
let start_code = get_u16(start_codes.offset(2 * segment as isize)) as u32;
|
||||
if start_code <= unicode {
|
||||
let range_offset = (get_u16(id_range_offset.offset(2 * segment as isize)) / 2) as u32;
|
||||
if range_offset == 0 {
|
||||
return (unicode + get_u16(id_delta.offset(2 * segment as isize)) as u32) & 0xFFFF;
|
||||
} else {
|
||||
let offset = 2 * (segment + range_offset + (unicode - start_code));
|
||||
return get_u16(id_range_offset.offset(offset as isize)) as u32;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
fn direct_mapping(subtable: *const u8, unicode: u32) -> u32 {
|
||||
unsafe {
|
||||
if unicode < 256 {
|
||||
let indices = subtable.offset(6);
|
||||
return indices.offset(unicode as isize).read() as u32;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
fn dense_mapping(subtable: *const u8, unicode: u32) -> u32 {
|
||||
unsafe {
|
||||
let first = get_u16(subtable.offset(6)) as u32;
|
||||
let entry_count = get_u16(subtable.offset(8)) as u32;
|
||||
let indices = subtable.offset(10);
|
||||
|
||||
if unicode > first && unicode < first + entry_count {
|
||||
return get_u16(indices.offset(2 * (unicode - first) as isize)) as u32;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
impl TrueType {
|
||||
fn find_tables(&mut self) {
|
||||
unsafe {
|
||||
let data = self.data.as_ptr();
|
||||
let num_tables = get_u16(data.offset(4)) as isize;
|
||||
for i in 0..num_tables {
|
||||
let subtable = data.offset(12 + i * 16);
|
||||
let tag = get_u32(subtable.offset(0));
|
||||
let offset = get_u32(subtable.offset(8));
|
||||
let table_location = data.offset(offset as isize);
|
||||
|
||||
if tag == fourcc(b'c', b'm', b'a', b'p') {
|
||||
self.cmap_table = table_location;
|
||||
} else if tag == fourcc(b'l', b'o', b'c', b'a') {
|
||||
self.loca_table = table_location;
|
||||
} else if tag == fourcc(b'm', b'a', b'x', b'p') {
|
||||
self.maxp_table = table_location;
|
||||
} else if tag == fourcc(b'h', b'e', b'a', b'd') {
|
||||
self.head_table = table_location;
|
||||
} else if tag == fourcc(b'g', b'l', b'y', b'f') {
|
||||
self.glyf_table = table_location;
|
||||
} else if tag == fourcc(b'h', b'h', b'e', b'a') {
|
||||
self.hhea_table = table_location;
|
||||
} else if tag == fourcc(b'h', b'm', b't', b'x') {
|
||||
self.hmtx_table = table_location;
|
||||
} else if tag == fourcc(b'k', b'e', b'r', b'n') {
|
||||
self.kern_table = table_location;
|
||||
}
|
||||
}
|
||||
self.num_glyphs = get_u16(self.maxp_table.offset(4));
|
||||
}
|
||||
}
|
||||
|
||||
fn unicode_to_glyph_index(&self, unicode: u32) -> u32 {
|
||||
unsafe {
|
||||
let subtable_count = get_u16(self.cmap_table.offset(2));
|
||||
for i in 0..subtable_count {
|
||||
let subtable_offset = get_u32(self.cmap_table.offset((4 + 4 * i + 4) as isize));
|
||||
let subtable = self.cmap_table.offset(subtable_offset as isize);
|
||||
let format = get_u16(subtable);
|
||||
match format {
|
||||
0 => return direct_mapping(subtable, unicode),
|
||||
4 => return segmented_mapping(subtable, unicode),
|
||||
6 => return dense_mapping(subtable, unicode),
|
||||
_ => () // TODO: Add more mappings
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
fn get_glyph_offset(&self, index: usize) -> isize {
|
||||
unsafe {
|
||||
let index_to_loc_format = get_i16(self.head_table.offset(50));
|
||||
if index_to_loc_format & 1 != 0 {
|
||||
get_u32(self.loca_table.offset(4 * index as isize)) as isize
|
||||
} else {
|
||||
(get_u16(self.loca_table.offset(2 * index as isize)) * 2) as isize
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn read_glyphs(&mut self) {
|
||||
unsafe {
|
||||
self.glyphs = Vec::with_capacity(self.num_glyphs as usize);
|
||||
for i in 0..(self.num_glyphs as usize) {
|
||||
let offset = self.get_glyph_offset(i);
|
||||
let next_offset = self.get_glyph_offset(i + 1);
|
||||
let glyph_data = self.glyf_table.offset(offset);
|
||||
|
||||
let mut glyph = Glyph {
|
||||
num_contours: get_i16(glyph_data),
|
||||
x_min: get_i16(glyph_data.offset(2)),
|
||||
y_min: get_i16(glyph_data.offset(4)),
|
||||
x_max: get_i16(glyph_data.offset(6)),
|
||||
y_max: get_i16(glyph_data.offset(8)),
|
||||
has_outline: (next_offset - offset) != 0,
|
||||
advance: 0,
|
||||
left_side_bearing: 0,
|
||||
end_points: Vec::new(),
|
||||
raw_contours: Vec::new(),
|
||||
contours: Vec::new(),
|
||||
};
|
||||
|
||||
if glyph.num_contours < 0 {
|
||||
/* TODO: Implement compound glyph support. */
|
||||
} else {
|
||||
/* Simple glyph */
|
||||
/* Read end contour points */
|
||||
let mut point_count = 0;
|
||||
for j in 0..glyph.num_contours {
|
||||
let end_point = get_u16(glyph_data.offset((10 + j * 2) as isize));
|
||||
glyph.end_points.push(end_point);
|
||||
if end_point > point_count {
|
||||
point_count = end_point;
|
||||
}
|
||||
}
|
||||
point_count += 1;
|
||||
|
||||
/* Alloc points */
|
||||
let mut points: Vec<Point> = Vec::new();
|
||||
for _ in 0..point_count {
|
||||
points.push(Point { x: 0.0, y: 0.0, flags: 0 });
|
||||
}
|
||||
|
||||
/* TODO: Skip instructions for now. Simple interpreter would be nice. */
|
||||
let instructions = get_u16(glyph_data.offset(10 + 2 * glyph.num_contours as isize)) as isize;
|
||||
|
||||
/* Read flags for each point */
|
||||
let mut flags = glyph_data.offset(10 + 2 * glyph.num_contours as isize + 2 + instructions);
|
||||
|
||||
let mut j = 0;
|
||||
while j < points.len() {
|
||||
let pt_flag = flags.read();
|
||||
points.get_unchecked_mut(j).flags = pt_flag;
|
||||
flags = flags.offset(1);
|
||||
if (pt_flag & REPEAT_FLAG) != 0 {
|
||||
let repeat_count = flags.read() as usize;
|
||||
flags = flags.offset(1);
|
||||
let mut k = 1;
|
||||
while k <= repeat_count {
|
||||
points.get_unchecked_mut(j + k).flags = pt_flag;
|
||||
k += 1;
|
||||
}
|
||||
j += repeat_count;
|
||||
}
|
||||
}
|
||||
|
||||
/* Read x-coordinates for each point */
|
||||
let mut coords = flags;
|
||||
let mut x = 0;
|
||||
for j in 0..(point_count as usize) {
|
||||
let pt = points.get_unchecked_mut(j);
|
||||
if (pt.flags & 2) != 0 {
|
||||
let dx = coords.read() as i32;
|
||||
coords = coords.offset(2);
|
||||
x += if (pt.flags & 16) != 0 { dx } else { -dx };
|
||||
} else {
|
||||
if (pt.flags & 16) == 0 {
|
||||
x += get_i16(coords) as i32;
|
||||
coords = coords.offset(2);
|
||||
}
|
||||
}
|
||||
pt.x = x as f32;
|
||||
}
|
||||
|
||||
/* Read y-coordinates for each point */
|
||||
let mut y = 0;
|
||||
for j in 0..(point_count as usize) {
|
||||
let pt = points.get_unchecked_mut(j);
|
||||
if (pt.flags & 4) != 0 {
|
||||
let dy = coords.read() as i32;
|
||||
coords = coords.offset(1);
|
||||
y += if (pt.flags & 32) != 0 { dy } else { -dy };
|
||||
} else {
|
||||
if (pt.flags & 32) == 0 {
|
||||
y += get_i16(coords) as i32;
|
||||
coords = coords.offset(2);
|
||||
}
|
||||
}
|
||||
pt.y = y as f32;
|
||||
}
|
||||
|
||||
glyph.prepare_contours(points);
|
||||
}
|
||||
|
||||
glyph.fill_horizontal_metrics(self.hhea_table, self.hmtx_table, i);
|
||||
|
||||
self.glyphs.push(glyph);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Glyph {
|
||||
fn fill_horizontal_metrics(&mut self, hhea_table: *const u8, hmtx_table: *const u8, glyph_index: usize) {
|
||||
unsafe {
|
||||
let num_of_long_hor_metrics = get_u16(hhea_table.offset(34)) as usize;
|
||||
if glyph_index < num_of_long_hor_metrics {
|
||||
self.advance = get_u16(hmtx_table.offset(4 * glyph_index as isize));
|
||||
self.left_side_bearing = get_i16(hmtx_table.offset((4 * glyph_index + 2) as isize));
|
||||
} else {
|
||||
self.advance = get_u16(hmtx_table.offset(4 * (num_of_long_hor_metrics - 1) as isize));
|
||||
self.left_side_bearing = get_i16(hmtx_table.offset((4 * num_of_long_hor_metrics + 2 * (glyph_index - num_of_long_hor_metrics)) as isize));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn prepare_contours(&mut self, points: Vec<Point>) {
|
||||
unsafe {
|
||||
let glyph_height = self.y_max - self.y_min;
|
||||
|
||||
/* Extract contours */
|
||||
for _ in 0..self.num_contours {
|
||||
self.raw_contours.push(Polygon { points: Vec::new() });
|
||||
}
|
||||
|
||||
let mut prev_end_pt = 0;
|
||||
for j in 0..self.num_contours {
|
||||
let end_pt = self.end_points[j as usize];
|
||||
let contour = self.raw_contours.get_unchecked_mut(j as usize);
|
||||
|
||||
/* Extract vertices */
|
||||
let mut k = prev_end_pt;
|
||||
while k <= end_pt {
|
||||
let pt = points.get_unchecked(k as usize);
|
||||
|
||||
let off_pt = Point {
|
||||
x: pt.x - self.x_min as f32,
|
||||
y: pt.y - self.y_min as f32,
|
||||
flags: pt.flags,
|
||||
};
|
||||
|
||||
contour.points.push(off_pt);
|
||||
|
||||
k += 1;
|
||||
}
|
||||
|
||||
prev_end_pt = end_pt + 1;
|
||||
}
|
||||
|
||||
/* Unpack contours */
|
||||
for j in 0..self.num_contours {
|
||||
let raw_contour = self.raw_contours.get_unchecked_mut(j as usize);
|
||||
let mut unpacked_contour = Polygon { points: Vec::new() };
|
||||
|
||||
let start_off = (raw_contour.points[0].flags & ON_CURVE_POINT) == 0;
|
||||
|
||||
let to =
|
||||
if start_off {
|
||||
/* when first point is off-curve we should add middle point between first and last points */
|
||||
let first = raw_contour.points.first().unwrap();
|
||||
let last = raw_contour.points.last().unwrap();
|
||||
|
||||
let middle = Point {
|
||||
flags: ON_CURVE_POINT,
|
||||
x: (first.x + last.x) / 2.0,
|
||||
y: glyph_height as f32 - (first.y + last.y) / 2.0,
|
||||
};
|
||||
|
||||
unpacked_contour.points.push(middle);
|
||||
|
||||
/* also make sure to iterate not to the end - we already added point */
|
||||
raw_contour.points.len() - 1
|
||||
} else {
|
||||
raw_contour.points.len()
|
||||
};
|
||||
|
||||
for k in 0..to {
|
||||
let p0 = raw_contour.points.get_unchecked(k as usize);
|
||||
let p1 = raw_contour.points.get_unchecked((k + 1) % raw_contour.points.len());
|
||||
|
||||
let p0_off_curve = (p0.flags & ON_CURVE_POINT) == 0;
|
||||
let p1_off_curve = (p1.flags & ON_CURVE_POINT) == 0;
|
||||
|
||||
let flipped = Point {
|
||||
flags: p0.flags,
|
||||
x: p0.x,
|
||||
y: glyph_height as f32 - p0.y,
|
||||
};
|
||||
&unpacked_contour.points.push(flipped);
|
||||
|
||||
if p0_off_curve && p1_off_curve {
|
||||
let middle = Point {
|
||||
flags: ON_CURVE_POINT,
|
||||
x: (p0.x + p1.x) / 2.0,
|
||||
y: glyph_height as f32 - (p0.y + p1.y) / 2.0,
|
||||
};
|
||||
unpacked_contour.points.push(middle);
|
||||
}
|
||||
}
|
||||
|
||||
*raw_contour = unpacked_contour;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+12
-10
@@ -64,12 +64,12 @@ impl Scene {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn borrow_node(&self, handle: &Handle<Node>) -> Option<&Node> {
|
||||
pub fn get_node(&self, handle: &Handle<Node>) -> Option<&Node> {
|
||||
self.nodes.borrow(handle)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn borrow_node_mut(&mut self, handle: &Handle<Node>) -> Option<&mut Node> {
|
||||
pub fn get_node_mut(&mut self, handle: &Handle<Node>) -> Option<&mut Node> {
|
||||
self.nodes.borrow_mut(handle)
|
||||
}
|
||||
|
||||
@@ -138,7 +138,7 @@ impl Scene {
|
||||
/// This is relatively heavy operation!
|
||||
/// In case if some error happened it returns Handle::none
|
||||
pub fn copy_node(&self, root_handle: &Handle<Node>, state: &State, dest_scene: &mut Scene) -> Handle<Node> {
|
||||
match self.borrow_node(root_handle) {
|
||||
match self.get_node(root_handle) {
|
||||
Some(src_node) => {
|
||||
let mut dest_node = src_node.make_copy(state);
|
||||
if let Some(src_body) = self.physics.borrow_body(&src_node.get_body()) {
|
||||
@@ -172,7 +172,7 @@ impl Scene {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn calculate_transforms(&mut self) {
|
||||
pub fn update_nodes(&mut self) {
|
||||
// Calculate transforms on nodes
|
||||
self.stack.clear();
|
||||
self.stack.push(self.root.clone());
|
||||
@@ -185,14 +185,16 @@ impl Scene {
|
||||
}
|
||||
|
||||
// Extract parent's global transform
|
||||
let parent_global_transform =
|
||||
match self.nodes.borrow_mut(&parent_handle) {
|
||||
Some(parent) => parent.global_transform,
|
||||
None => Mat4::identity()
|
||||
};
|
||||
let mut parent_global_transform = Mat4::identity();
|
||||
let mut parent_visibility = true;
|
||||
if let Some(parent) = self.nodes.borrow(&parent_handle) {
|
||||
parent_global_transform = parent.global_transform;
|
||||
parent_visibility = parent.global_visibility;
|
||||
}
|
||||
|
||||
if let Some(node) = self.nodes.borrow_mut(&handle) {
|
||||
node.global_transform = parent_global_transform * node.local_transform;
|
||||
node.global_visibility = parent_visibility && node.visibility;
|
||||
|
||||
// Queue children and continue traversal on them
|
||||
for child_handle in node.children.iter() {
|
||||
@@ -205,7 +207,7 @@ impl Scene {
|
||||
pub fn update(&mut self, aspect_ratio: f32, dt: f64) {
|
||||
self.update_physics(dt);
|
||||
|
||||
self.calculate_transforms();
|
||||
self.update_nodes();
|
||||
|
||||
for node in self.nodes.iter_mut() {
|
||||
let eye = node.get_global_position();
|
||||
|
||||
+22
-1
@@ -57,7 +57,7 @@ pub struct Camera {
|
||||
|
||||
impl Default for Camera {
|
||||
fn default() -> Camera {
|
||||
let fov: f32 = 45.0;
|
||||
let fov: f32 = 75.0;
|
||||
let z_near: f32 = 0.025;
|
||||
let z_far: f32 = 2048.0;
|
||||
|
||||
@@ -169,6 +169,8 @@ pub struct Node {
|
||||
rotation_pivot: Vec3,
|
||||
scaling_offset: Vec3,
|
||||
scaling_pivot: Vec3,
|
||||
pub(super) visibility: bool,
|
||||
pub(super) global_visibility: bool,
|
||||
pub(super) parent: Handle<Node>,
|
||||
pub(crate) children: Vec<Handle<Node>>,
|
||||
pub(super) local_transform: Mat4,
|
||||
@@ -192,6 +194,8 @@ impl Node {
|
||||
rotation_pivot: Vec3::new(),
|
||||
scaling_offset: Vec3::new(),
|
||||
scaling_pivot: Vec3::new(),
|
||||
visibility: true,
|
||||
global_visibility: true,
|
||||
local_transform: Mat4::identity(),
|
||||
global_transform: Mat4::identity(),
|
||||
body: Handle::none()
|
||||
@@ -238,6 +242,8 @@ impl Node {
|
||||
scaling_pivot: self.scaling_pivot,
|
||||
local_transform: self.local_transform,
|
||||
global_transform: self.global_transform,
|
||||
visibility: self.visibility,
|
||||
global_visibility: self.global_visibility,
|
||||
children: Vec::new(),
|
||||
parent: Handle::none(),
|
||||
body: Handle::none()
|
||||
@@ -304,6 +310,21 @@ impl Node {
|
||||
self.scaling_pivot = scaling_pivot;
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn set_visibility(&mut self, visibility: bool) {
|
||||
self.visibility = visibility;
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn get_visibility(&self) -> bool {
|
||||
self.visibility
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn get_global_visibility(&self) -> bool {
|
||||
self.global_visibility
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn set_name(&mut self, name: String) {
|
||||
self.name = name;
|
||||
|
||||
Reference in New Issue
Block a user