started adding ttf loader

This commit is contained in:
Dmitry
2019-07-06 21:46:11 +03:00
parent f2558be436
commit 45faaf1614
13 changed files with 2179 additions and 296 deletions
+137 -139
View File
@@ -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&lt;Handle</find>
<find>Option&lt;RcHandle</find>
<find>glyph-&gt;</find>
<find>ttf -&gt;</find>
<find>ttf-&gt;</find>
<find>-&gt;</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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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);
}
}
+8 -4
View File
@@ -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 {
+1 -1
View File
@@ -1198,7 +1198,7 @@ impl Fbx {
}
}
}
scene.calculate_transforms();
scene.update_nodes();
Ok(root)
}
+1
View File
@@ -1,6 +1,7 @@
pub mod texture;
pub mod fbx;
pub mod model;
pub mod ttf;
use std::path::*;
use crate::resource::texture::*;
+412
View File
@@ -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
View File
@@ -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
View File
@@ -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;
+1504 -117
View File
File diff suppressed because it is too large Load Diff