Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3ee82dc43f | ||
|
|
33da5fa38e | ||
|
|
d136d85402 | ||
|
|
a44f6d9498 | ||
|
|
b5aeee3dfd | ||
|
|
d5ee54ff7e | ||
|
|
cfd75743a2 | ||
|
|
6fd4f94418 | ||
|
|
e155fad7ef | ||
|
|
3683f94704 | ||
|
|
34e2b81855 | ||
|
|
edebd8eed8 | ||
|
|
36f7911917 | ||
|
|
f64117fa26 | ||
|
|
1422c8cba9 | ||
|
|
29ed42fa98 | ||
|
|
93029d2318 | ||
|
|
c4a304788f | ||
|
|
dfcdc9ca1e | ||
|
|
dd844b1183 | ||
|
|
a29f3a3011 | ||
|
|
84218f6ba2 | ||
|
|
f9960fb065 | ||
|
|
172d6d1045 | ||
|
|
2cfae31e9a | ||
|
|
f44d1cbfe4 | ||
|
|
f8eaa14a31 | ||
|
|
3d29cffd5d | ||
|
|
3b1522ab56 | ||
|
|
f6f7082b55 | ||
|
|
4e50e64888 | ||
|
|
27f7b198a6 | ||
|
|
dc6c9996f6 | ||
|
|
e0d19c8442 | ||
|
|
086f81a49d | ||
|
|
4879a0a124 | ||
|
|
637affefeb | ||
|
|
8d219d3bc0 | ||
|
|
a7289da05f | ||
|
|
98eea205f3 | ||
|
|
1c22b48893 | ||
|
|
249dd9752d | ||
|
|
bb4cd43835 | ||
|
|
954d1021c7 | ||
|
|
bf598071a3 | ||
|
|
5cbc2321c7 | ||
|
|
6bee5fb56f | ||
|
|
eb0fcc065b | ||
|
|
117535364b | ||
|
|
b15ae15f39 | ||
|
|
74445904f2 | ||
|
|
678ad4ff98 | ||
|
|
b6d7ed2b35 | ||
|
|
725e33763a | ||
|
|
f24146c169 | ||
|
|
67288d483f | ||
|
|
c80c504a2a | ||
|
|
1f8cacdd70 | ||
|
|
a3ae9431f1 | ||
|
|
3d0653604f | ||
|
|
42a0a41be0 | ||
|
|
468d9cccb7 | ||
|
|
6cfd058e3d | ||
|
|
8234549cb9 | ||
|
|
c84d04254e | ||
|
|
573a51c430 | ||
|
|
b4d26bd32b | ||
|
|
5227ea36ce | ||
|
|
6f29ff988c | ||
|
|
3424222d6e | ||
|
|
a9ab9b6cd4 | ||
|
|
5d11dd653a | ||
|
|
7d1cb3ee85 | ||
|
|
8304cd9c32 | ||
|
|
6d1c337363 | ||
|
|
e59036c731 | ||
|
|
dd7d78b2a6 | ||
|
|
f096c4d8de | ||
|
|
da5ea821a8 | ||
|
|
1b944a6582 | ||
|
|
318a9002e7 | ||
|
|
eb5d9ac15d | ||
|
|
5cae0ee082 | ||
|
|
75d641ae8a | ||
|
|
c2c744b06d | ||
|
|
1e246d1332 | ||
|
|
7d242341f2 | ||
|
|
e625c7024c | ||
|
|
192a61a06b | ||
|
|
6a93e3a765 | ||
|
|
e1fb1391f9 | ||
|
|
a3922ac3a9 | ||
|
|
5f1112d85e | ||
|
|
09545690bf | ||
|
|
3ce752c47b | ||
|
|
1f9f3ddb91 | ||
|
|
8e94688fbf | ||
|
|
438ee40f40 | ||
|
|
7f22d733d7 | ||
|
|
77d77f0a5c | ||
|
|
0aabd3dd6a | ||
|
|
72a54b30f9 | ||
|
|
00b2ab7ac4 | ||
|
|
39e15d67fc | ||
|
|
921dbddad9 | ||
|
|
6406d4602c | ||
|
|
880cd66166 | ||
|
|
f27ff203cf | ||
|
|
3ea8e529cc | ||
|
|
572dd233d7 | ||
|
|
c19070e477 | ||
|
|
64328b7388 | ||
|
|
1414fdcd38 | ||
|
|
e607a035ae | ||
|
|
0496e089c1 | ||
|
|
b310e3d24a | ||
|
|
b359d77669 | ||
|
|
e57a4061cc | ||
|
|
53f82e6b71 | ||
|
|
e88bba5940 | ||
|
|
0b83454d08 | ||
|
|
1ef0d36f79 | ||
|
|
e350737d1e | ||
|
|
cb203b13de | ||
|
|
92a0d7bfc3 | ||
|
|
c1a7ed2799 | ||
|
|
692301bdf1 | ||
|
|
05b87b3c42 | ||
|
|
9825297e70 | ||
|
|
6a59c887de | ||
|
|
33b4b46220 | ||
|
|
06170a25f7 | ||
|
|
418dad883d | ||
|
|
447661efed | ||
|
|
bd61ab691c | ||
|
|
2a04cee97f | ||
|
|
5ae7760752 | ||
|
|
56b8bf5b4b | ||
|
|
6af38fa47f | ||
|
|
0c01799c50 | ||
|
|
e2519e0eed | ||
|
|
6178ae0459 | ||
|
|
8a1a0b0fd2 | ||
|
|
a7c3cf4173 | ||
|
|
57b68eeba3 | ||
|
|
ad8c9ce4e0 | ||
|
|
7dc0f2cc86 | ||
|
|
37110799ef | ||
|
|
88a06ec8e7 | ||
|
|
38705d6226 | ||
|
|
d325bb43cf | ||
|
|
0c52d3c9bf | ||
|
|
770176a1e3 | ||
|
|
672603f9b4 | ||
|
|
0ecf6c46e2 | ||
|
|
8b87a54c1a | ||
|
|
cd1d3e8749 | ||
|
|
e88072cec0 | ||
|
|
1d2e165d99 | ||
|
|
cfc4ac5511 | ||
|
|
73a03d7af0 | ||
|
|
56dc348cc8 | ||
|
|
1b46ddd8b6 | ||
|
|
a68aaa114e | ||
|
|
3da7dabb2a | ||
|
|
1e2311da3d | ||
|
|
a38c55c82d | ||
|
|
cd22478e4f | ||
|
|
60036c75fe | ||
|
|
044f2aeb7c | ||
|
|
c73d11858e | ||
|
|
23b67be41a | ||
|
|
7d53baad5c | ||
|
|
1ae33a23fe | ||
|
|
351d9287af | ||
|
|
e7e5004946 | ||
|
|
b9be9b4f2d | ||
|
|
ce88a56579 | ||
|
|
689e769f9a | ||
|
|
2f0a8b19b5 | ||
|
|
1bed68afb7 | ||
|
|
130e02da5c | ||
|
|
8e06a68446 | ||
|
|
656b50b304 | ||
|
|
880db4ec43 | ||
|
|
2ce294720d | ||
|
|
eb07decb4b | ||
|
|
47930edf70 | ||
|
|
05b89905d8 | ||
|
|
3e0df36c1c | ||
|
|
c9ce384f14 | ||
|
|
6a6bdd5be7 | ||
|
|
d56ade924e | ||
|
|
fe561e3e27 | ||
|
|
1d98e350e4 | ||
|
|
d34e018acb | ||
|
|
169c8d57ff | ||
|
|
a1e0cfa33c | ||
|
|
6d44db3ca0 | ||
|
|
a261429d06 | ||
|
|
69d0de3c6d | ||
|
|
1305303f2e | ||
|
|
8532511107 | ||
|
|
b762ccb78c | ||
|
|
3296eb153c | ||
|
|
ae6d1028f7 | ||
|
|
92579b6307 | ||
|
|
315b53c339 | ||
|
|
c55d459986 | ||
|
|
7876695545 | ||
|
|
e1a1464c5d | ||
|
|
67ed5141bf | ||
|
|
b9d7a25b91 | ||
|
|
ba63ac63a0 | ||
|
|
1e77947758 | ||
|
|
53df4012fe | ||
|
|
d880fab93f | ||
|
|
fb8030b80a | ||
|
|
e2d009ff2a | ||
|
|
0a67ef4d80 | ||
|
|
79d6f46f1a | ||
|
|
6481fa2acf | ||
|
|
7638b3ddd9 | ||
|
|
fe474a9d7e | ||
|
|
81008abe06 | ||
|
|
ef1d079c53 | ||
|
|
5286dec70b | ||
|
|
d748dc590e | ||
|
|
93a0aec246 | ||
|
|
f3fa734793 | ||
|
|
33d3c3a897 | ||
|
|
bbabf3480b | ||
|
|
e7a8f471a1 | ||
|
|
d45a5cc926 | ||
|
|
361ba2afea | ||
|
|
78419cd992 | ||
|
|
cc7361dba5 | ||
|
|
5c0841ff56 | ||
|
|
10af183756 | ||
|
|
56e0e9a424 | ||
|
|
86a500c846 | ||
|
|
5b3f13fc1d | ||
|
|
1b1dfaa57c | ||
|
|
bf8c84bbe5 | ||
|
|
fb179cabbc | ||
|
|
a80ea743e8 | ||
|
|
97f8106909 | ||
|
|
d455899b93 | ||
|
|
63fe439a5e | ||
|
|
7847220aba | ||
|
|
d76ae4395b | ||
|
|
f994cb58ce | ||
|
|
52eb682498 | ||
|
|
5a5168a191 | ||
|
|
e85dfe75c8 | ||
|
|
6beb40b0a1 | ||
|
|
5cb96e5732 | ||
|
|
927aa57a4e | ||
|
|
36e775902d | ||
|
|
53e28f3b33 | ||
|
|
7ccbdb4633 | ||
|
|
f10d226565 | ||
|
|
28ecf5c35d | ||
|
|
9683eb649c | ||
|
|
3d10ae3ee3 | ||
|
|
44a75dd44b | ||
|
|
de7bcd2df7 | ||
|
|
6adf140fb4 | ||
|
|
b94c802076 | ||
|
|
b231de0b5b | ||
|
|
fca200d549 | ||
|
|
ba1d3f6c76 | ||
|
|
7734fd4ad9 | ||
|
|
7e6839f535 | ||
|
|
3d78322058 | ||
|
|
3e1ea7cdfd | ||
|
|
6d413a4faf | ||
|
|
af09c517b6 | ||
|
|
67b9c72442 | ||
|
|
c1a8d73384 | ||
|
|
2d98ac878e | ||
|
|
35ab5f768d | ||
|
|
705b3c39f4 | ||
|
|
56231db326 | ||
|
|
e97f7ef628 | ||
|
|
4570c2e710 | ||
|
|
4759237e66 | ||
|
|
543b93939a | ||
|
|
9b356926b8 | ||
|
|
7179ab5b9d | ||
|
|
0a6bbdb35c | ||
|
|
29919e64cd | ||
|
|
a7660e40f8 | ||
|
|
22e1f9b930 | ||
|
|
e205611128 | ||
|
|
8a3bf04eef | ||
|
|
44840a481e | ||
|
|
8070643ba5 | ||
|
|
0c33f9f2a3 | ||
|
|
db72bd024b | ||
|
|
7c6b470650 | ||
|
|
68a99ef54c | ||
|
|
39fabdbc3b | ||
|
|
83967fdb1b | ||
|
|
b88c2d80a4 | ||
|
|
4a36193f04 | ||
|
|
8df19cb6b2 | ||
|
|
783c1c9c83 | ||
|
|
a92771c5ef | ||
|
|
c98a76135b | ||
|
|
7f2836bb43 | ||
|
|
b60d02919b | ||
|
|
156dde6872 | ||
|
|
dd2fbf01aa | ||
|
|
beba1f63f1 | ||
|
|
e20dd9ec93 | ||
|
|
7f80d956b6 | ||
|
|
3c941863dc | ||
|
|
57e2007aaf | ||
|
|
f88f0607c7 | ||
|
|
91b98964cc | ||
|
|
d92a90e22b | ||
|
|
79a548ecae | ||
|
|
3c4c8940b2 | ||
|
|
75d2252d33 | ||
|
|
9d3a55291d | ||
|
|
170dec0945 | ||
|
|
7967157fbb | ||
|
|
597ced13e1 | ||
|
|
c3542b135e | ||
|
|
ca3ff7e08e | ||
|
|
42c760a92f | ||
|
|
327a537bcc | ||
|
|
cfc4f34c18 | ||
|
|
6dac384bd9 | ||
|
|
d666f8a0ba | ||
|
|
d6ae3a57b5 | ||
|
|
c2155f3f98 | ||
|
|
e2a3637413 | ||
|
|
390df4e42c | ||
|
|
21dd1319df | ||
|
|
444ac8d6a6 | ||
|
|
aac1e7dc4c | ||
|
|
5b8a1e5e58 | ||
|
|
ad1b36d2b3 | ||
|
|
315c2c273f | ||
|
|
005d835dbe | ||
|
|
cade94ab2c | ||
|
|
5cd2f5626c | ||
|
|
94bbcbf1c3 | ||
|
|
52c998d2b6 | ||
|
|
527d831c15 | ||
|
|
2790f2e64c | ||
|
|
757640e850 | ||
|
|
9d9abca33a | ||
|
|
bea7a7c73f | ||
|
|
dd62f98784 | ||
|
|
395a3eda9b | ||
|
|
9d18cc35e0 | ||
|
|
2e37ebe70c | ||
|
|
63ef412be1 | ||
|
|
f0996296c1 | ||
|
|
a60d570b3b | ||
|
|
3fdb9f311a |
@@ -57,7 +57,7 @@ SpaceBeforeInheritanceColon: true
|
|||||||
SpaceBeforeParens: ControlStatements
|
SpaceBeforeParens: ControlStatements
|
||||||
SpaceBeforeRangeBasedForLoopColon: false
|
SpaceBeforeRangeBasedForLoopColon: false
|
||||||
SpaceInEmptyParentheses: false
|
SpaceInEmptyParentheses: false
|
||||||
SpacesBeforeTrailingComments: 0
|
SpacesBeforeTrailingComments: 1
|
||||||
SpacesInAngles: false
|
SpacesInAngles: false
|
||||||
SpacesInCStyleCastParentheses: false
|
SpacesInCStyleCastParentheses: false
|
||||||
SpacesInContainerLiterals: false
|
SpacesInContainerLiterals: false
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
name: 'Set up dependency versions'
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- name: Set up dependency versions
|
||||||
|
shell: bash
|
||||||
|
run: cat ./build/common/versions >> $GITHUB_ENV
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
name: 'Get commit message'
|
||||||
|
outputs:
|
||||||
|
msg:
|
||||||
|
value: ${{ steps.action_output.outputs.msg }}
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- name: Find commit message (on push)
|
||||||
|
if: github.event_name == 'push'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
AUTHOR_NAME="${{ github.event.head_commit.author.name }}"
|
||||||
|
AUTHOR_EMAIL="${{ github.event.head_commit.author.email }}"
|
||||||
|
TSTAMP="${{ github.event.head_commit.timestamp }}"
|
||||||
|
echo "commit ${{ github.event.head_commit.id }}" >> /tmp/commit_msg.txt
|
||||||
|
echo "Author: ${AUTHOR_NAME}<${AUTHOR_EMAIL}>" >> /tmp/commit_msg.txt
|
||||||
|
echo "Date: ${TSTAMP}" >> /tmp/commit_msg.txt
|
||||||
|
echo "" >> /tmp/commit_msg.txt
|
||||||
|
echo "${{ github.event.head_commit.message }}" >> /tmp/commit_msg.txt
|
||||||
|
- name: Find commit message (PR)
|
||||||
|
shell: bash
|
||||||
|
id: checkout_code
|
||||||
|
if: github.event_name == 'pull_request'
|
||||||
|
run: |
|
||||||
|
echo "+++++ head commit message +++++"
|
||||||
|
echo "$(git log -1 --no-merges)"
|
||||||
|
echo "+++++++++++++++++++++++++++++++"
|
||||||
|
echo "hash=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT"
|
||||||
|
git checkout ${{ github.event.pull_request.head.sha }}
|
||||||
|
echo "$(git log -1 --no-merges)" >> /tmp/commit_msg.txt
|
||||||
|
- shell: bash
|
||||||
|
id: action_output
|
||||||
|
run: |
|
||||||
|
DELIMITER="EOF_FILE_CONTENT_$(date +%s)" # Using timestamp to make it more unique
|
||||||
|
echo "msg<<$DELIMITER" >> "$GITHUB_OUTPUT"
|
||||||
|
cat /tmp/commit_msg.txt >> "$GITHUB_OUTPUT"
|
||||||
|
echo "$DELIMITER" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "----- got commit message ---"
|
||||||
|
cat /tmp/commit_msg.txt
|
||||||
|
echo "----------------------------"
|
||||||
|
- name: Cleanup Find commit message (PR)
|
||||||
|
shell: bash
|
||||||
|
if: github.event_name == 'pull_request'
|
||||||
|
run: |
|
||||||
|
git checkout ${{ steps.checkout_code.outputs.hash }}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
name: 'Linux Preqrequisites'
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- uses: ./.github/actions/dep-versions
|
||||||
|
- name: Install Linux Prerequisites
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -xe
|
||||||
|
# See https://askubuntu.com/questions/272248/processing-triggers-for-man-db/1476024#1476024
|
||||||
|
echo "set man-db/auto-update false" | sudo debconf-communicate
|
||||||
|
sudo dpkg-reconfigure man-db
|
||||||
|
|
||||||
|
# Install ninja
|
||||||
|
source ./build/common/get-ninja.sh
|
||||||
|
|
||||||
|
# Install CMake
|
||||||
|
mkdir -p cmake
|
||||||
|
cd cmake
|
||||||
|
|
||||||
|
sudo wget https://github.com/Kitware/CMake/releases/download/v$GITHUB_CMAKE_VERSION/cmake-$GITHUB_CMAKE_VERSION-Linux-x86_64.sh
|
||||||
|
sudo chmod +x ./cmake-$GITHUB_CMAKE_VERSION-Linux-x86_64.sh
|
||||||
|
sudo ./cmake-$GITHUB_CMAKE_VERSION-Linux-x86_64.sh --skip-license > /dev/null
|
||||||
|
sudo update-alternatives --install /usr/bin/cmake cmake $(pwd)/bin/cmake 1000 --force
|
||||||
|
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
sudo wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install clang-$GITHUB_CLANG_VERSION libc++-$GITHUB_CLANG_VERSION-dev libc++abi-$GITHUB_CLANG_VERSION-dev
|
||||||
|
sudo apt-get install mesa-common-dev libxi-dev libxxf86vm-dev
|
||||||
|
|
||||||
|
# For dawn
|
||||||
|
sudo apt-get install libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libx11-xcb-dev
|
||||||
|
|
||||||
|
sudo update-alternatives --install /usr/bin/cc cc /usr/bin/clang-${GITHUB_CLANG_VERSION} 100
|
||||||
|
sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++-${GITHUB_CLANG_VERSION} 100
|
||||||
|
set +xe
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
name: 'Mac Preqrequisites'
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- uses: ./.github/actions/dep-versions
|
||||||
|
- name: Set up Homebrew
|
||||||
|
id: set-up-homebrew
|
||||||
|
uses: Homebrew/actions/setup-homebrew@master
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: '3.x'
|
||||||
|
- name: Cache Brew
|
||||||
|
id: brew-cache
|
||||||
|
uses: actions/cache@v4 # Use a specific version
|
||||||
|
with:
|
||||||
|
path: $HOME/Library/Caches/Homebrew
|
||||||
|
key: ${{ runner.os }}-brew-20250424
|
||||||
|
- name: Install Mac Prerequisites
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
# Install ninja
|
||||||
|
source ./build/common/get-ninja.sh
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
name: 'Web Preqrequisites'
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- uses: ./.github/actions/dep-versions
|
||||||
|
- name: Cache EMSDK
|
||||||
|
id: emsdk-cache
|
||||||
|
uses: actions/cache@v4 # Use a specific version
|
||||||
|
with:
|
||||||
|
path: emsdk
|
||||||
|
key: ${{ runner.os }}-emsdk-${{ env.GITHUB_EMSDK_VERSION }}
|
||||||
|
- name: Install Web Prerequisites
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
bash ./build/common/get-emscripten.sh
|
||||||
|
echo "EMSDK=$PWD/emsdk" >> $GITHUB_ENV
|
||||||
@@ -16,6 +16,9 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.1.6
|
- uses: actions/checkout@v4.1.6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: ./.github/actions/linux-prereq
|
||||||
- name: Run Android Continuous
|
- name: Run Android Continuous
|
||||||
uses: ./.github/actions/android-continuous
|
uses: ./.github/actions/android-continuous
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -14,6 +14,9 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.1.6
|
- uses: actions/checkout@v4.1.6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: ./.github/actions/mac-prereq
|
||||||
- name: Run build script
|
- name: Run build script
|
||||||
run: |
|
run: |
|
||||||
cd build/ios && printf "y" | ./build.sh continuous
|
cd build/ios && printf "y" | ./build.sh continuous
|
||||||
|
|||||||
@@ -14,6 +14,9 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.1.6
|
- uses: actions/checkout@v4.1.6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: ./.github/actions/linux-prereq
|
||||||
- name: Run build script
|
- name: Run build script
|
||||||
run: |
|
run: |
|
||||||
cd build/linux && printf "y" | ./build.sh continuous
|
cd build/linux && printf "y" | ./build.sh continuous
|
||||||
|
|||||||
@@ -14,6 +14,9 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.1.6
|
- uses: actions/checkout@v4.1.6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: ./.github/actions/mac-prereq
|
||||||
- name: Run build script
|
- name: Run build script
|
||||||
run: |
|
run: |
|
||||||
cd build/mac && printf "y" | ./build.sh continuous
|
cd build/mac && printf "y" | ./build.sh continuous
|
||||||
@@ -23,4 +26,4 @@ jobs:
|
|||||||
path: out/filament-release-darwin.tgz
|
path: out/filament-release-darwin.tgz
|
||||||
- name: Check public headers
|
- name: Check public headers
|
||||||
run: |
|
run: |
|
||||||
build/common/check-headers.sh out/release/filament/include
|
test/check-headers/test.sh out/release/filament/include
|
||||||
|
|||||||
@@ -0,0 +1,57 @@
|
|||||||
|
name: 'Post-submit tasks'
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
update-renderdiff-goldens:
|
||||||
|
name: update-renderdiff-goldens
|
||||||
|
runs-on: 'ubuntu-24.04-4core'
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4.1.6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: ./.github/actions/linux-prereq
|
||||||
|
- id: get_commit_msg
|
||||||
|
uses: ./.github/actions/get-commit-msg
|
||||||
|
- name: Prerequisites
|
||||||
|
run: pip install tifffile numpy
|
||||||
|
- name: Run update script
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.FILAMENTBOT_TOKEN }}
|
||||||
|
run: |
|
||||||
|
GOLDEN_BRANCH=$(echo "${{ steps.get_commit_msg.outputs.msg }}" | python3 test/renderdiff/src/commit_msg.py)
|
||||||
|
COMMIT_HASH=$(echo "${{ steps.get_commit_msg.outputs.msg }}" | head -n 1 | sed "s/commit //g")
|
||||||
|
if [[ "${GOLDEN_BRANCH}" != "main" ]]; then
|
||||||
|
git config --global user.email "filament.bot@gmail.com"
|
||||||
|
git config --global user.name "Filament Bot"
|
||||||
|
git config --global credential.helper cache
|
||||||
|
echo "branch==${GOLDEN_BRANCH}"
|
||||||
|
echo "hash==${COMMIT_HASH}"
|
||||||
|
python3 test/renderdiff/src/update_golden.py --branch=${GOLDEN_BRANCH} \
|
||||||
|
--merge-to-main --filament-tag=${COMMIT_HASH} --golden-repo-token=${GH_TOKEN}
|
||||||
|
fi
|
||||||
|
|
||||||
|
update-docs:
|
||||||
|
name: update-docs
|
||||||
|
runs-on: 'ubuntu-24.04-4core'
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4.1.6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: ./.github/actions/linux-prereq
|
||||||
|
- id: get_commit_msg
|
||||||
|
uses: ./.github/actions/get-commit-msg
|
||||||
|
- name: Prerequisites
|
||||||
|
run: pip install selenium
|
||||||
|
- name: Run update script
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.FILAMENTBOT_TOKEN }}
|
||||||
|
run: |
|
||||||
|
COMMIT_HASH=$(echo "${{ steps.get_commit_msg.outputs.msg }}" | head -n 1 | sed "s/commit //g")
|
||||||
|
git config --global user.email "filament.bot@gmail.com"
|
||||||
|
git config --global user.name "Filament Bot"
|
||||||
|
git config --global credential.helper cache
|
||||||
|
bash docs_src/build/postsubmit.sh ${COMMIT_HASH} ${GH_TOKEN}
|
||||||
@@ -3,36 +3,49 @@ name: Presubmit
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-desktop:
|
build-desktop-mac:
|
||||||
name: build-desktop
|
name: build-mac
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: macos-14-xlarge
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
os: [macos-14-xlarge, ubuntu-22.04-16core]
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.1.6
|
- uses: actions/checkout@v4.1.6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: ./.github/actions/mac-prereq
|
||||||
- name: Run build script
|
- name: Run build script
|
||||||
run: |
|
run: |
|
||||||
WORKFLOW_OS=`echo \`uname\` | sed "s/Darwin/mac/" | tr [:upper:] [:lower:]`
|
cd build/mac && printf "y" | ./build.sh presubmit
|
||||||
cd build/$WORKFLOW_OS && printf "y" | ./build.sh presubmit
|
- name: Test material parser
|
||||||
|
run: |
|
||||||
|
out/cmake-release/filament/test/test_material_parser
|
||||||
|
|
||||||
|
build-desktop-linux:
|
||||||
|
name: build-linux
|
||||||
|
runs-on: ubuntu-22.04-16core
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4.1.6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: ./.github/actions/linux-prereq
|
||||||
|
- name: Run build script
|
||||||
|
run: |
|
||||||
|
cd build/linux && printf "y" | ./build.sh presubmit
|
||||||
- name: Test material parser
|
- name: Test material parser
|
||||||
run: |
|
run: |
|
||||||
out/cmake-release/filament/test/test_material_parser
|
out/cmake-release/filament/test/test_material_parser
|
||||||
|
|
||||||
build-windows:
|
build-windows:
|
||||||
name: build-windows
|
name: build-windows
|
||||||
runs-on: win-2019-16core
|
runs-on: windows-2022-32core
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.1.6
|
- uses: actions/checkout@v4.1.6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
- name: Run build script
|
- name: Run build script
|
||||||
run: |
|
run: |
|
||||||
build\windows\build-github.bat presubmit
|
build\windows\build-github.bat presubmit
|
||||||
@@ -41,9 +54,11 @@ jobs:
|
|||||||
build-android:
|
build-android:
|
||||||
name: build-android
|
name: build-android
|
||||||
runs-on: 'ubuntu-24.04-16core'
|
runs-on: 'ubuntu-24.04-16core'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.1.6
|
- uses: actions/checkout@v4.1.6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: ./.github/actions/linux-prereq
|
||||||
- uses: actions/setup-java@v3
|
- uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
@@ -57,9 +72,11 @@ jobs:
|
|||||||
build-ios:
|
build-ios:
|
||||||
name: build-iOS
|
name: build-iOS
|
||||||
runs-on: macos-14-xlarge
|
runs-on: macos-14-xlarge
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.1.6
|
- uses: actions/checkout@v4.1.6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: ./.github/actions/mac-prereq
|
||||||
- name: Run build script
|
- name: Run build script
|
||||||
run: |
|
run: |
|
||||||
cd build/ios && printf "y" | ./build.sh presubmit
|
cd build/ios && printf "y" | ./build.sh presubmit
|
||||||
@@ -70,9 +87,12 @@ jobs:
|
|||||||
build-web:
|
build-web:
|
||||||
name: build-web
|
name: build-web
|
||||||
runs-on: 'ubuntu-24.04-16core'
|
runs-on: 'ubuntu-24.04-16core'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.1.6
|
- uses: actions/checkout@v4.1.6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: ./.github/actions/linux-prereq
|
||||||
|
- uses: ./.github/actions/web-prereq
|
||||||
- name: Run build script
|
- name: Run build script
|
||||||
run: |
|
run: |
|
||||||
cd build/web && printf "y" | ./build.sh presubmit
|
cd build/web && printf "y" | ./build.sh presubmit
|
||||||
@@ -84,41 +104,101 @@ jobs:
|
|||||||
- uses: actions/checkout@v4.1.6
|
- uses: actions/checkout@v4.1.6
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
- id: get_commit_msg
|
||||||
|
uses: ./.github/actions/get-commit-msg
|
||||||
- name: Check for manual edits to /docs
|
- name: Check for manual edits to /docs
|
||||||
run: |
|
run: |
|
||||||
echo "${{ github.event.pull_request.head.sha }} -- ${{ github.event.pull_request.head.sha }}"
|
COMMIT_ID=$(echo "${{ steps.get_commit_msg.outputs.msg }}" | head -n 1 | sed "s/commit //g")
|
||||||
# disable for now
|
bash docs_src/build/presubmit_check.sh ${COMMIT_ID}
|
||||||
# bash docs_src/build/presubmit_check.sh ${{ github.event.pull_request.head.sha }}
|
|
||||||
|
|
||||||
test-renderdiff:
|
test-renderdiff:
|
||||||
name: test-renderdiff
|
name: test-renderdiff
|
||||||
runs-on: macos-14-xlarge
|
runs-on: macos-14-xlarge
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.1.6
|
- uses: actions/checkout@v4.1.6
|
||||||
- name: Set up Homebrew
|
|
||||||
id: set-up-homebrew
|
|
||||||
uses: Homebrew/actions/setup-homebrew@master
|
|
||||||
- name: Set up Python
|
|
||||||
uses: actions/setup-python@v5
|
|
||||||
with:
|
with:
|
||||||
python-version: '3.x'
|
fetch-depth: 0
|
||||||
- name: Install python prereqs
|
- id: get_commit_msg
|
||||||
run: pip install mako setuptools pyyaml
|
uses: ./.github/actions/get-commit-msg
|
||||||
- name: Run script
|
- uses: ./.github/actions/mac-prereq
|
||||||
|
- name: Cache Mesa and deps
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: mesa
|
||||||
|
key: ${{ runner.os }}-mesa-deps-2-${{ vars.MESA_VERSION }}
|
||||||
|
- name: Prerequisites
|
||||||
run: |
|
run: |
|
||||||
bash test/renderdiff/test.sh
|
bash build/common/get-mesa.sh
|
||||||
|
pip install tifffile numpy
|
||||||
|
- name: Render
|
||||||
|
run: |
|
||||||
|
TEST_DIR=test/renderdiff
|
||||||
|
source ${TEST_DIR}/src/preamble.sh
|
||||||
|
start_
|
||||||
|
GOLDEN_BRANCH=$(echo "${{ steps.get_commit_msg.outputs.msg }}" | python3 ${TEST_DIR}/src/commit_msg.py)
|
||||||
|
bash ${TEST_DIR}/generate.sh && \
|
||||||
|
python3 ${TEST_DIR}/src/golden_manager.py \
|
||||||
|
--branch=${GOLDEN_BRANCH} \
|
||||||
|
--output=${GOLDEN_OUTPUT_DIR}
|
||||||
|
# Note that we need to upload the output even if comparison fails
|
||||||
- uses: actions/upload-artifact@v4
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: presubmit-renderdiff-result
|
name: presubmit-renderdiff-result
|
||||||
path: ./out/renderdiff_tests
|
path: ./out/renderdiff
|
||||||
|
- name: Compare output
|
||||||
|
run: |
|
||||||
|
TEST_DIR=test/renderdiff
|
||||||
|
source ${TEST_DIR}/src/preamble.sh
|
||||||
|
python3 ${TEST_DIR}/src/compare.py \
|
||||||
|
--src=${GOLDEN_OUTPUT_DIR} \
|
||||||
|
--dest=${RENDER_OUTPUT_DIR} \
|
||||||
|
--out=${DIFF_OUTPUT_DIR}
|
||||||
|
end_
|
||||||
|
|
||||||
validate-wgsl-webgpu:
|
validate-wgsl-webgpu:
|
||||||
name: validate-wgsl-webgpu
|
name: validate-wgsl-webgpu
|
||||||
runs-on: 'ubuntu-24.04-8core'
|
runs-on: 'ubuntu-24.04-8core'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.1.6
|
- uses: actions/checkout@v4.1.6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: ./.github/actions/linux-prereq
|
||||||
- name: Run build script
|
- name: Run build script
|
||||||
run: source ./build/linux/ci-common.sh && ./build.sh -W debug test_filamat filament
|
run: ./build.sh -W debug test_filamat filament
|
||||||
- name: Run test
|
- name: Run test
|
||||||
run: ./out/cmake-debug/libs/filamat/test_filamat --gtest_filter=MaterialCompiler.Wgsl*
|
run: ./out/cmake-debug/libs/filamat/test_filamat --gtest_filter=MaterialCompiler.Wgsl*
|
||||||
|
|
||||||
|
test-code-correctness:
|
||||||
|
name: test-code-correctness
|
||||||
|
runs-on: 'macos-14-xlarge'
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4.1.6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: ./.github/actions/mac-prereq
|
||||||
|
- name: Install clang-tidy and deps
|
||||||
|
run: |
|
||||||
|
pip install pyyaml
|
||||||
|
brew install llvm@${GITHUB_LLVM_VERSION}
|
||||||
|
sudo ln -s "$(brew --prefix llvm)@${GITHUB_LLVM_VERSION}/bin/clang-tidy" "/usr/local/bin/clang-tidy"
|
||||||
|
- name: Run build script
|
||||||
|
# We need to build before clang-tidy can run analysis
|
||||||
|
run: |
|
||||||
|
# This will build for all three desktop backends on mac
|
||||||
|
./build.sh -p desktop debug gltf_viewer
|
||||||
|
- name: Run test
|
||||||
|
run: bash test/code-correctness/test.sh
|
||||||
|
|
||||||
|
test-mdbook:
|
||||||
|
name: test-mdbook
|
||||||
|
runs-on: 'ubuntu-24.04-4core'
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4.1.6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: ./.github/actions/linux-prereq
|
||||||
|
- name: Run build script
|
||||||
|
run: |
|
||||||
|
bash docs_src/build/install_mdbook.sh && source ~/.bashrc
|
||||||
|
mdbook --version
|
||||||
|
|
||||||
|
|||||||
@@ -29,15 +29,11 @@ on:
|
|||||||
types: [created]
|
types: [created]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-desktop:
|
build-linux:
|
||||||
name: build-desktop
|
name: build-linux
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ubuntu-22.04-32core
|
||||||
if: github.event_name == 'release' || github.event.inputs.platform == 'desktop'
|
if: github.event_name == 'release' || github.event.inputs.platform == 'desktop'
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
os: [macos-14-xlarge, ubuntu-22.04-32core]
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Decide Git ref
|
- name: Decide Git ref
|
||||||
id: git_ref
|
id: git_ref
|
||||||
@@ -49,15 +45,48 @@ jobs:
|
|||||||
- uses: actions/checkout@v4.1.6
|
- uses: actions/checkout@v4.1.6
|
||||||
with:
|
with:
|
||||||
ref: ${{ steps.git_ref.outputs.ref }}
|
ref: ${{ steps.git_ref.outputs.ref }}
|
||||||
|
- uses: ./.github/actions/linux-prereq
|
||||||
- name: Run build script
|
- name: Run build script
|
||||||
env:
|
env:
|
||||||
TAG: ${{ steps.git_ref.outputs.tag }}
|
TAG: ${{ steps.git_ref.outputs.tag }}
|
||||||
run: |
|
run: |
|
||||||
WORKFLOW_OS=`echo \`uname\` | sed "s/Darwin/mac/" | tr [:upper:] [:lower:]`
|
cd build/linux && printf "y" | ./build.sh release
|
||||||
cd build/$WORKFLOW_OS && printf "y" | ./build.sh release
|
|
||||||
cd ../..
|
cd ../..
|
||||||
if [ -f out/filament-release-darwin.tgz ]; then mv out/filament-release-darwin.tgz out/filament-${TAG}-mac.tgz; fi;
|
mv out/filament-release-linux.tgz out/filament-${TAG}-linux.tgz
|
||||||
if [ -f out/filament-release-linux.tgz ]; then mv out/filament-release-linux.tgz out/filament-${TAG}-linux.tgz; fi;
|
- uses: actions/github-script@v6
|
||||||
|
env:
|
||||||
|
TAG: ${{ steps.git_ref.outputs.tag }}
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const upload = require('./build/common/upload-release-assets');
|
||||||
|
const { TAG } = process.env;
|
||||||
|
const globber = await glob.create('out/*.tgz');
|
||||||
|
await upload({ github, context }, await globber.glob(), TAG);
|
||||||
|
|
||||||
|
build-mac:
|
||||||
|
name: build-mac
|
||||||
|
runs-on: macos-14-xlarge
|
||||||
|
if: github.event_name == 'release' || github.event.inputs.platform == 'desktop'
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Decide Git ref
|
||||||
|
id: git_ref
|
||||||
|
run: |
|
||||||
|
REF=${RELEASE_TAG:-${GITHUB_REF}}
|
||||||
|
TAG=${REF##*/}
|
||||||
|
echo "ref=${REF}" >> $GITHUB_OUTPUT
|
||||||
|
echo "tag=${TAG}" >> $GITHUB_OUTPUT
|
||||||
|
- uses: actions/checkout@v4.1.6
|
||||||
|
with:
|
||||||
|
ref: ${{ steps.git_ref.outputs.ref }}
|
||||||
|
- uses: ./.github/actions/mac-prereq
|
||||||
|
- name: Run build script
|
||||||
|
env:
|
||||||
|
TAG: ${{ steps.git_ref.outputs.tag }}
|
||||||
|
run: |
|
||||||
|
cd build/mac && printf "y" | ./build.sh release
|
||||||
|
cd ../..
|
||||||
|
mv out/filament-release-darwin.tgz out/filament-${TAG}-mac.tgz
|
||||||
- uses: actions/github-script@v6
|
- uses: actions/github-script@v6
|
||||||
env:
|
env:
|
||||||
TAG: ${{ steps.git_ref.outputs.tag }}
|
TAG: ${{ steps.git_ref.outputs.tag }}
|
||||||
@@ -84,6 +113,8 @@ jobs:
|
|||||||
- uses: actions/checkout@v4.1.6
|
- uses: actions/checkout@v4.1.6
|
||||||
with:
|
with:
|
||||||
ref: ${{ steps.git_ref.outputs.ref }}
|
ref: ${{ steps.git_ref.outputs.ref }}
|
||||||
|
- uses: ./.github/actions/linux-prereq
|
||||||
|
- uses: ./.github/actions/web-prereq
|
||||||
- name: Run build script
|
- name: Run build script
|
||||||
env:
|
env:
|
||||||
TAG: ${{ steps.git_ref.outputs.tag }}
|
TAG: ${{ steps.git_ref.outputs.tag }}
|
||||||
@@ -121,6 +152,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
java-version: '17'
|
java-version: '17'
|
||||||
|
- uses: ./.github/actions/linux-prereq
|
||||||
- name: Run build script
|
- name: Run build script
|
||||||
env:
|
env:
|
||||||
TAG: ${{ steps.git_ref.outputs.tag }}
|
TAG: ${{ steps.git_ref.outputs.tag }}
|
||||||
@@ -131,6 +163,9 @@ jobs:
|
|||||||
mv out/filamat-android-release.aar out/filamat-${TAG}-android.aar
|
mv out/filamat-android-release.aar out/filamat-${TAG}-android.aar
|
||||||
mv out/gltfio-android-release.aar out/gltfio-${TAG}-android.aar
|
mv out/gltfio-android-release.aar out/gltfio-${TAG}-android.aar
|
||||||
mv out/filament-utils-android-release.aar out/filament-utils-${TAG}-android.aar
|
mv out/filament-utils-android-release.aar out/filament-utils-${TAG}-android.aar
|
||||||
|
cd out/android-release/filament
|
||||||
|
tar -czf ../../filament-${TAG}-android-native.tgz .
|
||||||
|
cd ../../..
|
||||||
- name: Sign sample-gltf-viewer
|
- name: Sign sample-gltf-viewer
|
||||||
run: |
|
run: |
|
||||||
echo "${APK_KEYSTORE_BASE64}" > filament.jks.base64
|
echo "${APK_KEYSTORE_BASE64}" > filament.jks.base64
|
||||||
@@ -152,7 +187,7 @@ jobs:
|
|||||||
script: |
|
script: |
|
||||||
const upload = require('./build/common/upload-release-assets');
|
const upload = require('./build/common/upload-release-assets');
|
||||||
const { TAG } = process.env;
|
const { TAG } = process.env;
|
||||||
const globber = await glob.create(['out/*.aar', 'out/*.apk'].join('\n'));
|
const globber = await glob.create(['out/*.aar', 'out/*.apk', 'out/*.tgz'].join('\n'));
|
||||||
await upload({ github, context }, await globber.glob(), TAG);
|
await upload({ github, context }, await globber.glob(), TAG);
|
||||||
|
|
||||||
build-ios:
|
build-ios:
|
||||||
@@ -171,6 +206,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v4.1.6
|
- uses: actions/checkout@v4.1.6
|
||||||
with:
|
with:
|
||||||
ref: ${{ steps.git_ref.outputs.ref }}
|
ref: ${{ steps.git_ref.outputs.ref }}
|
||||||
|
- uses: ./.github/actions/mac-prereq
|
||||||
- name: Run build script
|
- name: Run build script
|
||||||
env:
|
env:
|
||||||
TAG: ${{ steps.git_ref.outputs.tag }}
|
TAG: ${{ steps.git_ref.outputs.tag }}
|
||||||
@@ -190,7 +226,7 @@ jobs:
|
|||||||
|
|
||||||
build-windows:
|
build-windows:
|
||||||
name: build-windows
|
name: build-windows
|
||||||
runs-on: windows-2019-32core
|
runs-on: windows-2022-32core
|
||||||
if: github.event_name == 'release' || github.event.inputs.platform == 'windows'
|
if: github.event_name == 'release' || github.event.inputs.platform == 'windows'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|||||||
@@ -14,6 +14,10 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.1.6
|
- uses: actions/checkout@v4.1.6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: ./.github/actions/linux-prereq
|
||||||
|
- uses: ./.github/actions/web-prereq
|
||||||
- name: Run build script
|
- name: Run build script
|
||||||
run: |
|
run: |
|
||||||
cd build/web && printf "y" | ./build.sh continuous
|
cd build/web && printf "y" | ./build.sh continuous
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
build-windows:
|
build-windows:
|
||||||
name: build-windows
|
name: build-windows
|
||||||
runs-on: windows-2019-32core
|
runs-on: windows-2022-32core
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.1.6
|
- uses: actions/checkout@v4.1.6
|
||||||
|
|||||||
@@ -97,6 +97,10 @@ Make sure you've installed the following dependencies:
|
|||||||
- `libxcomposite-dev` (`libXcomposite-devel` on Fedora)
|
- `libxcomposite-dev` (`libXcomposite-devel` on Fedora)
|
||||||
- `libxxf86vm-dev` (`libXxf86vm-devel` on Fedora)
|
- `libxxf86vm-dev` (`libXxf86vm-devel` on Fedora)
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo apt install clang-14 libglu1-mesa-dev libc++-14-dev libc++abi-14-dev ninja-build libxi-dev libxcomposite-dev libxxf86vm-dev -y
|
||||||
|
```
|
||||||
|
|
||||||
After dependencies have been installed, we highly recommend using the [easy build](#easy-build)
|
After dependencies have been installed, we highly recommend using the [easy build](#easy-build)
|
||||||
script.
|
script.
|
||||||
|
|
||||||
@@ -363,6 +367,8 @@ python ./emsdk.py activate latest
|
|||||||
source ./emsdk_env.sh
|
source ./emsdk_env.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Alternatively, you can try running the script `build/common/get-emscripten.sh`.
|
||||||
|
|
||||||
After this you can invoke the [easy build](#easy-build) script as follows:
|
After this you can invoke the [easy build](#easy-build) script as follows:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
|||||||
@@ -41,6 +41,8 @@ option(FILAMENT_ENABLE_ASAN_UBSAN "Enable Address and Undefined Behavior Sanitiz
|
|||||||
|
|
||||||
option(FILAMENT_ENABLE_TSAN "Enable Thread Sanitizer" OFF)
|
option(FILAMENT_ENABLE_TSAN "Enable Thread Sanitizer" OFF)
|
||||||
|
|
||||||
|
option(FILAMENT_ENABLE_COVERAGE "Enable LLVM code coverage" OFF)
|
||||||
|
|
||||||
option(FILAMENT_ENABLE_FEATURE_LEVEL_0 "Enable Feature Level 0" ON)
|
option(FILAMENT_ENABLE_FEATURE_LEVEL_0 "Enable Feature Level 0" ON)
|
||||||
|
|
||||||
option(FILAMENT_ENABLE_MULTIVIEW "Enable multiview for Filament" OFF)
|
option(FILAMENT_ENABLE_MULTIVIEW "Enable multiview for Filament" OFF)
|
||||||
@@ -49,6 +51,12 @@ option(FILAMENT_SUPPORTS_OSMESA "Enable OSMesa (headless GL context) for Filamen
|
|||||||
|
|
||||||
option(FILAMENT_ENABLE_FGVIEWER "Enable the frame graph viewer" OFF)
|
option(FILAMENT_ENABLE_FGVIEWER "Enable the frame graph viewer" OFF)
|
||||||
|
|
||||||
|
option(FILAMENT_USE_ABSEIL_LOGGING "Use Abseil to log, may increase binary size" OFF)
|
||||||
|
|
||||||
|
# This is to disable GTAO for the short-term while we investigate a way to better manage size increases.
|
||||||
|
# On the regular filament build (where size is of less concern), we enable GTAO by default.
|
||||||
|
option(FILAMENT_DISABLE_GTAO "Disable GTAO" OFF)
|
||||||
|
|
||||||
set(FILAMENT_NDK_VERSION "" CACHE STRING
|
set(FILAMENT_NDK_VERSION "" CACHE STRING
|
||||||
"Android NDK version or version prefix to be used when building for Android."
|
"Android NDK version or version prefix to be used when building for Android."
|
||||||
)
|
)
|
||||||
@@ -454,6 +462,10 @@ if (NOT MSVC AND NOT WEBGL)
|
|||||||
endif()
|
endif()
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${EXTRA_SANITIZE_OPTIONS}")
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${EXTRA_SANITIZE_OPTIONS}")
|
||||||
|
|
||||||
|
if (FILAMENT_ENABLE_COVERAGE)
|
||||||
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fprofile-instr-generate -fcoverage-mapping")
|
||||||
|
endif()
|
||||||
|
|
||||||
# Disable the stack check for macOS to workaround a known issue in clang 11.0.0.
|
# Disable the stack check for macOS to workaround a known issue in clang 11.0.0.
|
||||||
# See: https://forums.developer.apple.com/thread/121887
|
# See: https://forums.developer.apple.com/thread/121887
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
@@ -587,6 +599,10 @@ if (CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT FILAMENT_BACKEND_DEBUG_FLAG STREQU
|
|||||||
unset(FILAMENT_BACKEND_DEBUG_FLAG)
|
unset(FILAMENT_BACKEND_DEBUG_FLAG)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (FILAMENT_USE_ABSEIL_LOGGING)
|
||||||
|
add_definitions(-DFILAMENT_USE_ABSEIL_LOGGING)
|
||||||
|
endif()
|
||||||
|
|
||||||
# ==================================================================================================
|
# ==================================================================================================
|
||||||
# Material compilation flags
|
# Material compilation flags
|
||||||
# ==================================================================================================
|
# ==================================================================================================
|
||||||
@@ -776,6 +792,7 @@ add_subdirectory(${LIBRARIES}/filabridge)
|
|||||||
add_subdirectory(${LIBRARIES}/filaflat)
|
add_subdirectory(${LIBRARIES}/filaflat)
|
||||||
add_subdirectory(${LIBRARIES}/filagui)
|
add_subdirectory(${LIBRARIES}/filagui)
|
||||||
add_subdirectory(${LIBRARIES}/filameshio)
|
add_subdirectory(${LIBRARIES}/filameshio)
|
||||||
|
add_subdirectory(${LIBRARIES}/generatePrefilterMipmap)
|
||||||
add_subdirectory(${LIBRARIES}/gltfio)
|
add_subdirectory(${LIBRARIES}/gltfio)
|
||||||
add_subdirectory(${LIBRARIES}/ibl)
|
add_subdirectory(${LIBRARIES}/ibl)
|
||||||
add_subdirectory(${LIBRARIES}/iblprefilter)
|
add_subdirectory(${LIBRARIES}/iblprefilter)
|
||||||
@@ -801,6 +818,7 @@ add_subdirectory(${EXTERNAL}/draco/tnt)
|
|||||||
add_subdirectory(${EXTERNAL}/jsmn/tnt)
|
add_subdirectory(${EXTERNAL}/jsmn/tnt)
|
||||||
add_subdirectory(${EXTERNAL}/stb/tnt)
|
add_subdirectory(${EXTERNAL}/stb/tnt)
|
||||||
add_subdirectory(${EXTERNAL}/getopt)
|
add_subdirectory(${EXTERNAL}/getopt)
|
||||||
|
add_subdirectory(${EXTERNAL}/perfetto/tnt)
|
||||||
|
|
||||||
# Note that this has to be placed after mikktspace in order for combine_static_libs to work.
|
# Note that this has to be placed after mikktspace in order for combine_static_libs to work.
|
||||||
add_subdirectory(${LIBRARIES}/geometry)
|
add_subdirectory(${LIBRARIES}/geometry)
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
# Filament Release Notes log
|
# Filament Release Notes log
|
||||||
|
|
||||||
**If you are merging a PR into main**: please add the release note below, under the *Release notes
|
**If you are merging a PR into main**: please add the release note below, under the *Release notes
|
||||||
for next branch cut* header.
|
We are chaning the way Vulkan buffers are handled. We need to switch over to a managed (or view-based) model where the data stored inside the object is a proxy to a Vulkan object that can dynamically be swapped around.
|
||||||
|
|
||||||
**If you are cherry-picking a commit into an rc/ branch**: add the release note under the
|
**If you are cherry-picking a commit into an rc/ branch**: add the release note under the
|
||||||
appropriate header in [RELEASE_NOTES.md](./RELEASE_NOTES.md).
|
appropriate header in [RELEASE_NOTES.md](./RELEASE_NOTES.md).
|
||||||
|
|
||||||
## Release notes for next branch cut
|
## Release notes for next branch cut
|
||||||
|
|
||||||
- Fix build/compile errors when upgrading to MacOS 15.4
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ repositories {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'com.google.android.filament:filament-android:1.59.0'
|
implementation 'com.google.android.filament:filament-android:1.62.1'
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -51,7 +51,7 @@ Here are all the libraries available in the group `com.google.android.filament`:
|
|||||||
iOS projects can use CocoaPods to install the latest release:
|
iOS projects can use CocoaPods to install the latest release:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
pod 'Filament', '~> 1.59.0'
|
pod 'Filament', '~> 1.62.1'
|
||||||
```
|
```
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|||||||
@@ -7,6 +7,56 @@ A new header is inserted each time a *tag* is created.
|
|||||||
Instead, if you are authoring a PR for the main branch, add your release note to
|
Instead, if you are authoring a PR for the main branch, add your release note to
|
||||||
[NEW_RELEASE_NOTES.md](./NEW_RELEASE_NOTES.md).
|
[NEW_RELEASE_NOTES.md](./NEW_RELEASE_NOTES.md).
|
||||||
|
|
||||||
|
## v1.62.2
|
||||||
|
|
||||||
|
- Metal: fix, respect alpha to coverage rasterization
|
||||||
|
- engine: removed `Texture::generatePrefilterMipmap`, a new `libfilament-generatePrefilterMipmap` library can be used in its stead [⚠️ **API BREAKAGE**]
|
||||||
|
|
||||||
|
## v1.62.1
|
||||||
|
|
||||||
|
- Add new shader define `VARIANT_DEPTH`, defined when a material is compiled for depth variants
|
||||||
|
(e.g., shadows) [**Requires recompiling materials**]
|
||||||
|
|
||||||
|
## v1.62.0
|
||||||
|
|
||||||
|
- Add new `unfilterable` field to Filament Material's `sampler` [⚠️ **New Material Version**]
|
||||||
|
|
||||||
|
## v1.61.2
|
||||||
|
|
||||||
|
- samples: samples now have a CLI to select backend api
|
||||||
|
|
||||||
|
## v1.61.1
|
||||||
|
|
||||||
|
|
||||||
|
## v1.61.0
|
||||||
|
|
||||||
|
- materials: sampler now export their type in the material binary [⚠️ **New Material Version**]
|
||||||
|
- samples/texturedquad.cpp now has CLI to select backend api
|
||||||
|
- samples/hellopbr.cpp CLI now allows for selecting webgpu
|
||||||
|
|
||||||
|
## v1.60.1
|
||||||
|
|
||||||
|
|
||||||
|
## v1.60.0
|
||||||
|
|
||||||
|
- materials: remove dependence on per-view descset layout from filamat. [⚠️ **New Material Version**]
|
||||||
|
- matc non-functional change: Update GLSL postprocessor to
|
||||||
|
isolate calls to SPVRemap from calls to SPIRV-Cross.
|
||||||
|
|
||||||
|
|
||||||
|
## v1.59.5
|
||||||
|
|
||||||
|
|
||||||
|
## v1.59.4
|
||||||
|
|
||||||
|
|
||||||
|
## v1.59.3
|
||||||
|
|
||||||
|
|
||||||
|
## v1.59.2
|
||||||
|
|
||||||
|
- Fix build/compile errors when upgrading to MacOS 15.4
|
||||||
|
|
||||||
## v1.59.1
|
## v1.59.1
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -142,16 +142,13 @@ abstract class MaterialCompiler extends TaskWithBinary {
|
|||||||
if (!exclude_vulkan) {
|
if (!exclude_vulkan) {
|
||||||
matcArgs += ['-a', 'vulkan']
|
matcArgs += ['-a', 'vulkan']
|
||||||
}
|
}
|
||||||
|
|
||||||
def include_webgpu = providers
|
def include_webgpu = providers
|
||||||
.gradleProperty("com.google.android.filament.include-webgpu")
|
.gradleProperty("com.google.android.filament.include-webgpu")
|
||||||
.forUseAtConfigurationTime().present
|
.forUseAtConfigurationTime().present
|
||||||
|
if (include_webgpu) {
|
||||||
if (!include_webgpu) {
|
matcArgs += ['-a', 'webgpu', '--variant-filter=skinning,stereo']
|
||||||
matcArgs += ['-a', 'webgpu']
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def mat_no_opt = providers
|
def mat_no_opt = providers
|
||||||
.gradleProperty("com.google.android.filament.matnopt")
|
.gradleProperty("com.google.android.filament.matnopt")
|
||||||
.forUseAtConfigurationTime().present
|
.forUseAtConfigurationTime().present
|
||||||
|
|||||||
@@ -26,6 +26,10 @@ add_library(utils STATIC IMPORTED)
|
|||||||
set_target_properties(utils PROPERTIES IMPORTED_LOCATION
|
set_target_properties(utils PROPERTIES IMPORTED_LOCATION
|
||||||
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libutils.a)
|
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libutils.a)
|
||||||
|
|
||||||
|
add_library(perfetto STATIC IMPORTED)
|
||||||
|
set_target_properties(perfetto PROPERTIES IMPORTED_LOCATION
|
||||||
|
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libperfetto.a)
|
||||||
|
|
||||||
add_library(filabridge STATIC IMPORTED)
|
add_library(filabridge STATIC IMPORTED)
|
||||||
set_target_properties(filabridge PROPERTIES IMPORTED_LOCATION
|
set_target_properties(filabridge PROPERTIES IMPORTED_LOCATION
|
||||||
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libfilabridge.a)
|
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libfilabridge.a)
|
||||||
@@ -40,6 +44,7 @@ set_target_properties(shaders PROPERTIES IMPORTED_LOCATION
|
|||||||
|
|
||||||
set(FILAMAT_INCLUDE_DIRS
|
set(FILAMAT_INCLUDE_DIRS
|
||||||
../../libs/utils/include
|
../../libs/utils/include
|
||||||
|
../../third_party/perfetto
|
||||||
)
|
)
|
||||||
|
|
||||||
include_directories(${FILAMENT_DIR}/include)
|
include_directories(${FILAMENT_DIR}/include)
|
||||||
@@ -55,6 +60,7 @@ target_link_libraries(filamat-jni
|
|||||||
filabridge
|
filabridge
|
||||||
shaders
|
shaders
|
||||||
utils
|
utils
|
||||||
|
perfetto
|
||||||
log
|
log
|
||||||
smol-v
|
smol-v
|
||||||
$<$<STREQUAL:${FILAMENT_SUPPORTS_WEBGPU},ON>:tint>
|
$<$<STREQUAL:${FILAMENT_SUPPORTS_WEBGPU},ON>:tint>
|
||||||
|
|||||||
@@ -13,6 +13,10 @@ add_library(filament STATIC IMPORTED)
|
|||||||
set_target_properties(filament PROPERTIES IMPORTED_LOCATION
|
set_target_properties(filament PROPERTIES IMPORTED_LOCATION
|
||||||
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libfilament.a)
|
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libfilament.a)
|
||||||
|
|
||||||
|
add_library(filament-generatePrefilterMipmap STATIC IMPORTED)
|
||||||
|
set_target_properties(filament-generatePrefilterMipmap PROPERTIES IMPORTED_LOCATION
|
||||||
|
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libfilament-generatePrefilterMipmap.a)
|
||||||
|
|
||||||
add_library(backend STATIC IMPORTED)
|
add_library(backend STATIC IMPORTED)
|
||||||
set_target_properties(backend PROPERTIES IMPORTED_LOCATION
|
set_target_properties(backend PROPERTIES IMPORTED_LOCATION
|
||||||
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libbackend.a)
|
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libbackend.a)
|
||||||
@@ -21,6 +25,10 @@ add_library(utils STATIC IMPORTED)
|
|||||||
set_target_properties(utils PROPERTIES IMPORTED_LOCATION
|
set_target_properties(utils PROPERTIES IMPORTED_LOCATION
|
||||||
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libutils.a)
|
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libutils.a)
|
||||||
|
|
||||||
|
add_library(perfetto STATIC IMPORTED)
|
||||||
|
set_target_properties(perfetto PROPERTIES IMPORTED_LOCATION
|
||||||
|
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libperfetto.a)
|
||||||
|
|
||||||
add_library(ibl-lite STATIC IMPORTED)
|
add_library(ibl-lite STATIC IMPORTED)
|
||||||
set_target_properties(ibl-lite PROPERTIES IMPORTED_LOCATION
|
set_target_properties(ibl-lite PROPERTIES IMPORTED_LOCATION
|
||||||
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libibl-lite.a)
|
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libibl-lite.a)
|
||||||
@@ -55,6 +63,10 @@ add_library(smol-v STATIC IMPORTED)
|
|||||||
set_target_properties(smol-v PROPERTIES IMPORTED_LOCATION
|
set_target_properties(smol-v PROPERTIES IMPORTED_LOCATION
|
||||||
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libsmol-v.a)
|
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libsmol-v.a)
|
||||||
|
|
||||||
|
add_library(abseil STATIC IMPORTED)
|
||||||
|
set_target_properties(abseil PROPERTIES IMPORTED_LOCATION
|
||||||
|
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libabseil.a)
|
||||||
|
|
||||||
if (FILAMENT_ENABLE_FGVIEWER)
|
if (FILAMENT_ENABLE_FGVIEWER)
|
||||||
add_library(fgviewer STATIC IMPORTED)
|
add_library(fgviewer STATIC IMPORTED)
|
||||||
set_target_properties(fgviewer PROPERTIES IMPORTED_LOCATION
|
set_target_properties(fgviewer PROPERTIES IMPORTED_LOCATION
|
||||||
@@ -112,6 +124,7 @@ add_library(filament-jni SHARED
|
|||||||
|
|
||||||
# Ordering is significant in the following list. The PRIVATE qualifier prevents transitive deps.
|
# Ordering is significant in the following list. The PRIVATE qualifier prevents transitive deps.
|
||||||
target_link_libraries(filament-jni
|
target_link_libraries(filament-jni
|
||||||
|
PRIVATE filament-generatePrefilterMipmap
|
||||||
PRIVATE filament
|
PRIVATE filament
|
||||||
PRIVATE backend
|
PRIVATE backend
|
||||||
PRIVATE filaflat
|
PRIVATE filaflat
|
||||||
@@ -123,6 +136,8 @@ target_link_libraries(filament-jni
|
|||||||
PRIVATE android
|
PRIVATE android
|
||||||
PRIVATE jnigraphics
|
PRIVATE jnigraphics
|
||||||
PRIVATE utils
|
PRIVATE utils
|
||||||
|
PRIVATE perfetto
|
||||||
|
PRIVATE abseil
|
||||||
|
|
||||||
# libgeometry is PUBLIC because gltfio uses it.
|
# libgeometry is PUBLIC because gltfio uses it.
|
||||||
PUBLIC geometry
|
PUBLIC geometry
|
||||||
@@ -141,6 +156,7 @@ target_include_directories(filament-jni PRIVATE
|
|||||||
${FILAMENT_DIR}/include
|
${FILAMENT_DIR}/include
|
||||||
../../filament/backend/include
|
../../filament/backend/include
|
||||||
../../third_party/robin-map
|
../../third_party/robin-map
|
||||||
|
../../third_party/perfetto
|
||||||
../../libs/utils/include)
|
../../libs/utils/include)
|
||||||
|
|
||||||
# Force a relink when the version script is changed:
|
# Force a relink when the version script is changed:
|
||||||
|
|||||||
@@ -556,7 +556,8 @@ extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_Engine_nSetBu
|
|||||||
jlong resourceAllocatorCacheSizeMB, jlong resourceAllocatorCacheMaxAge,
|
jlong resourceAllocatorCacheSizeMB, jlong resourceAllocatorCacheMaxAge,
|
||||||
jboolean disableHandleUseAfterFreeCheck,
|
jboolean disableHandleUseAfterFreeCheck,
|
||||||
jint preferredShaderLanguage,
|
jint preferredShaderLanguage,
|
||||||
jboolean forceGLES2Context, jboolean assertNativeWindowIsValid) {
|
jboolean forceGLES2Context, jboolean assertNativeWindowIsValid,
|
||||||
|
jint gpuContextPriority) {
|
||||||
Engine::Builder* builder = (Engine::Builder*) nativeBuilder;
|
Engine::Builder* builder = (Engine::Builder*) nativeBuilder;
|
||||||
Engine::Config config = {
|
Engine::Config config = {
|
||||||
.commandBufferSizeMB = (uint32_t) commandBufferSizeMB,
|
.commandBufferSizeMB = (uint32_t) commandBufferSizeMB,
|
||||||
@@ -574,6 +575,7 @@ extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_Engine_nSetBu
|
|||||||
.preferredShaderLanguage = (Engine::Config::ShaderLanguage) preferredShaderLanguage,
|
.preferredShaderLanguage = (Engine::Config::ShaderLanguage) preferredShaderLanguage,
|
||||||
.forceGLES2Context = (bool) forceGLES2Context,
|
.forceGLES2Context = (bool) forceGLES2Context,
|
||||||
.assertNativeWindowIsValid = (bool) assertNativeWindowIsValid,
|
.assertNativeWindowIsValid = (bool) assertNativeWindowIsValid,
|
||||||
|
.gpuContextPriority = (Engine::GpuContextPriority) gpuContextPriority,
|
||||||
};
|
};
|
||||||
builder->config(&config);
|
builder->config(&config);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,16 +23,20 @@
|
|||||||
#include <android/bitmap.h>
|
#include <android/bitmap.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <backend/BufferDescriptor.h>
|
|
||||||
#include <filament/Engine.h>
|
#include <filament/Engine.h>
|
||||||
#include <filament/Stream.h>
|
#include <filament/Stream.h>
|
||||||
#include <filament/Texture.h>
|
#include <filament/Texture.h>
|
||||||
|
|
||||||
|
#include <filament-generatePrefilterMipmap/generatePrefilterMipmap.h>
|
||||||
|
|
||||||
|
#include <backend/BufferDescriptor.h>
|
||||||
|
|
||||||
#include "common/CallbackUtils.h"
|
#include "common/CallbackUtils.h"
|
||||||
#include "common/NioUtils.h"
|
#include "common/NioUtils.h"
|
||||||
|
|
||||||
#include "private/backend/VirtualMachineEnv.h"
|
#include "private/backend/VirtualMachineEnv.h"
|
||||||
|
|
||||||
|
|
||||||
using namespace filament;
|
using namespace filament;
|
||||||
using namespace backend;
|
using namespace backend;
|
||||||
|
|
||||||
@@ -421,7 +425,7 @@ Java_com_google_android_filament_Texture_nGeneratePrefilterMipmap(JNIEnv *env, j
|
|||||||
Engine *engine = (Engine *) nativeEngine;
|
Engine *engine = (Engine *) nativeEngine;
|
||||||
|
|
||||||
jint *faceOffsetsInBytes = env->GetIntArrayElements(faceOffsetsInBytes_, nullptr);
|
jint *faceOffsetsInBytes = env->GetIntArrayElements(faceOffsetsInBytes_, nullptr);
|
||||||
Texture::FaceOffsets faceOffsets;
|
filament::FaceOffsets faceOffsets;
|
||||||
std::copy_n(faceOffsetsInBytes, 6, faceOffsets.offsets);
|
std::copy_n(faceOffsetsInBytes, 6, faceOffsets.offsets);
|
||||||
env->ReleaseIntArrayElements(faceOffsetsInBytes_, faceOffsetsInBytes, JNI_ABORT);
|
env->ReleaseIntArrayElements(faceOffsetsInBytes_, faceOffsetsInBytes, JNI_ABORT);
|
||||||
|
|
||||||
@@ -444,10 +448,11 @@ Java_com_google_android_filament_Texture_nGeneratePrefilterMipmap(JNIEnv *env, j
|
|||||||
(uint32_t) left, (uint32_t) top, (uint32_t) stride,
|
(uint32_t) left, (uint32_t) top, (uint32_t) stride,
|
||||||
callback->getHandler(), &JniBufferCallback::postToJavaAndDestroy, callback);
|
callback->getHandler(), &JniBufferCallback::postToJavaAndDestroy, callback);
|
||||||
|
|
||||||
Texture::PrefilterOptions options;
|
filament::PrefilterOptions options;
|
||||||
options.sampleCount = sampleCount;
|
options.sampleCount = sampleCount;
|
||||||
options.mirror = mirror;
|
options.mirror = mirror;
|
||||||
texture->generatePrefilterMipmap(*engine, std::move(desc), faceOffsets, &options);
|
|
||||||
|
filament::generatePrefilterMipmap(texture, *engine, std::move(desc), faceOffsets, &options);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -175,6 +175,36 @@ public class Engine {
|
|||||||
MULTIVIEW,
|
MULTIVIEW,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This controls the priority level for GPU work scheduling, which helps prioritize the
|
||||||
|
* submitted GPU work and enables preemption.
|
||||||
|
*/
|
||||||
|
public enum GpuContextPriority {
|
||||||
|
/**
|
||||||
|
* Backend default GPU context priority (typically MEDIUM)
|
||||||
|
*/
|
||||||
|
DEFAULT,
|
||||||
|
/**
|
||||||
|
* For non-interactive, deferrable workloads. This should not interfere with standard
|
||||||
|
* applications.
|
||||||
|
*/
|
||||||
|
LOW,
|
||||||
|
/**
|
||||||
|
* The default priority level for standard applications.
|
||||||
|
*/
|
||||||
|
MEDIUM,
|
||||||
|
/**
|
||||||
|
* For high-priority, latency-sensitive workloads that are more important than standard
|
||||||
|
* applications.
|
||||||
|
*/
|
||||||
|
HIGH,
|
||||||
|
/**
|
||||||
|
* The highest priority, intended for system-critical, real-time applications where missing
|
||||||
|
* deadlines is unacceptable (e.g., VR/AR compositors or other system-critical tasks).
|
||||||
|
*/
|
||||||
|
REALTIME,
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs <code>Engine</code> objects using a builder pattern.
|
* Constructs <code>Engine</code> objects using a builder pattern.
|
||||||
*/
|
*/
|
||||||
@@ -233,7 +263,8 @@ public class Engine {
|
|||||||
config.resourceAllocatorCacheSizeMB, config.resourceAllocatorCacheMaxAge,
|
config.resourceAllocatorCacheSizeMB, config.resourceAllocatorCacheMaxAge,
|
||||||
config.disableHandleUseAfterFreeCheck,
|
config.disableHandleUseAfterFreeCheck,
|
||||||
config.preferredShaderLanguage.ordinal(),
|
config.preferredShaderLanguage.ordinal(),
|
||||||
config.forceGLES2Context, config.assertNativeWindowIsValid);
|
config.forceGLES2Context, config.assertNativeWindowIsValid,
|
||||||
|
config.gpuContextPriority.ordinal());
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -489,6 +520,11 @@ public class Engine {
|
|||||||
* @Deprecated use "backend.opengl.assert_native_window_is_valid" feature flag instead
|
* @Deprecated use "backend.opengl.assert_native_window_is_valid" feature flag instead
|
||||||
*/
|
*/
|
||||||
public boolean assertNativeWindowIsValid = false;
|
public boolean assertNativeWindowIsValid = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GPU context priority level. Controls GPU work scheduling and preemption.
|
||||||
|
*/
|
||||||
|
public GpuContextPriority gpuContextPriority = GpuContextPriority.DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Engine(long nativeEngine, Config config) {
|
private Engine(long nativeEngine, Config config) {
|
||||||
@@ -1492,7 +1528,8 @@ public class Engine {
|
|||||||
long resourceAllocatorCacheSizeMB, long resourceAllocatorCacheMaxAge,
|
long resourceAllocatorCacheSizeMB, long resourceAllocatorCacheMaxAge,
|
||||||
boolean disableHandleUseAfterFreeCheck,
|
boolean disableHandleUseAfterFreeCheck,
|
||||||
int preferredShaderLanguage,
|
int preferredShaderLanguage,
|
||||||
boolean forceGLES2Context, boolean assertNativeWindowIsValid);
|
boolean forceGLES2Context, boolean assertNativeWindowIsValid,
|
||||||
|
int gpuContextPriority);
|
||||||
private static native void nSetBuilderFeatureLevel(long nativeBuilder, int ordinal);
|
private static native void nSetBuilderFeatureLevel(long nativeBuilder, int ordinal);
|
||||||
private static native void nSetBuilderSharedContext(long nativeBuilder, long sharedContext);
|
private static native void nSetBuilderSharedContext(long nativeBuilder, long sharedContext);
|
||||||
private static native void nSetBuilderPaused(long nativeBuilder, boolean paused);
|
private static native void nSetBuilderPaused(long nativeBuilder, boolean paused);
|
||||||
|
|||||||
@@ -1390,8 +1390,8 @@ public class View {
|
|||||||
*
|
*
|
||||||
* \note
|
* \note
|
||||||
* Dynamic resolution is only supported on platforms where the time to render
|
* Dynamic resolution is only supported on platforms where the time to render
|
||||||
* a frame can be measured accurately. Dynamic resolution is currently only
|
* a frame can be measured accurately. On platform where this is not supported,
|
||||||
* supported on Android.
|
* Dynamic Resolution can't be enabled unless minScale == maxScale.
|
||||||
*
|
*
|
||||||
* @see Renderer::FrameRateOptions
|
* @see Renderer::FrameRateOptions
|
||||||
*
|
*
|
||||||
@@ -1801,6 +1801,22 @@ public class View {
|
|||||||
* @see setAmbientOcclusionOptions()
|
* @see setAmbientOcclusionOptions()
|
||||||
*/
|
*/
|
||||||
public static class AmbientOcclusionOptions {
|
public static class AmbientOcclusionOptions {
|
||||||
|
public enum AmbientOcclusionType {
|
||||||
|
/**
|
||||||
|
* use Scalable Ambient Occlusion
|
||||||
|
*/
|
||||||
|
SAO,
|
||||||
|
/**
|
||||||
|
* use Ground Truth-Based Ambient Occlusion
|
||||||
|
*/
|
||||||
|
GTAO,
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type of ambient occlusion algorithm.
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
public AmbientOcclusionOptions.AmbientOcclusionType aoType = AmbientOcclusionOptions.AmbientOcclusionType.SAO;
|
||||||
/**
|
/**
|
||||||
* Ambient Occlusion radius in meters, between 0 and ~10.
|
* Ambient Occlusion radius in meters, between 0 and ~10.
|
||||||
*/
|
*/
|
||||||
@@ -1810,7 +1826,8 @@ public class View {
|
|||||||
*/
|
*/
|
||||||
public float power = 1.0f;
|
public float power = 1.0f;
|
||||||
/**
|
/**
|
||||||
* Self-occlusion bias in meters. Use to avoid self-occlusion. Between 0 and a few mm.
|
* Self-occlusion bias in meters. Use to avoid self-occlusion.
|
||||||
|
* Between 0 and a few mm. No effect when aoType set to GTAO
|
||||||
*/
|
*/
|
||||||
public float bias = 0.0005f;
|
public float bias = 0.0005f;
|
||||||
/**
|
/**
|
||||||
@@ -1826,12 +1843,12 @@ public class View {
|
|||||||
*/
|
*/
|
||||||
public float bilateralThreshold = 0.05f;
|
public float bilateralThreshold = 0.05f;
|
||||||
/**
|
/**
|
||||||
* affects # of samples used for AO.
|
* affects # of samples used for AO and params for filtering
|
||||||
*/
|
*/
|
||||||
@NonNull
|
@NonNull
|
||||||
public QualityLevel quality = QualityLevel.LOW;
|
public QualityLevel quality = QualityLevel.LOW;
|
||||||
/**
|
/**
|
||||||
* affects AO smoothness
|
* affects AO smoothness. Recommend setting to HIGH when aoType set to GTAO.
|
||||||
*/
|
*/
|
||||||
@NonNull
|
@NonNull
|
||||||
public QualityLevel lowPassFilter = QualityLevel.MEDIUM;
|
public QualityLevel lowPassFilter = QualityLevel.MEDIUM;
|
||||||
@@ -1849,7 +1866,7 @@ public class View {
|
|||||||
*/
|
*/
|
||||||
public boolean bentNormals = false;
|
public boolean bentNormals = false;
|
||||||
/**
|
/**
|
||||||
* min angle in radian to consider
|
* min angle in radian to consider. No effect when aoType set to GTAO.
|
||||||
*/
|
*/
|
||||||
public float minHorizonAngleRad = 0.0f;
|
public float minHorizonAngleRad = 0.0f;
|
||||||
/**
|
/**
|
||||||
@@ -1904,6 +1921,19 @@ public class View {
|
|||||||
*/
|
*/
|
||||||
public boolean ssctEnabled = false;
|
public boolean ssctEnabled = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ground Truth-base Ambient Occlusion (GTAO) options
|
||||||
|
*/
|
||||||
|
public int gtaoSampleSliceCount = 4;
|
||||||
|
/**
|
||||||
|
* Ground Truth-base Ambient Occlusion (GTAO) options
|
||||||
|
*/
|
||||||
|
public int gtaoSampleStepsPerSlice = 3;
|
||||||
|
/**
|
||||||
|
* Ground Truth-base Ambient Occlusion (GTAO) options
|
||||||
|
*/
|
||||||
|
public float gtaoThicknessHeuristic = 0.004f;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1980,7 +2010,7 @@ public class View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* reconstruction filter width typically between 0.2 (sharper, aliased) and 1.5 (smoother)
|
* reconstruction filter width typically between 1 (sharper) and 2 (smoother)
|
||||||
*/
|
*/
|
||||||
public float filterWidth = 1.0f;
|
public float filterWidth = 1.0f;
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -35,6 +35,10 @@ add_library(utils STATIC IMPORTED)
|
|||||||
set_target_properties(utils PROPERTIES IMPORTED_LOCATION
|
set_target_properties(utils PROPERTIES IMPORTED_LOCATION
|
||||||
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libutils.a)
|
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libutils.a)
|
||||||
|
|
||||||
|
add_library(perfetto STATIC IMPORTED)
|
||||||
|
set_target_properties(perfetto PROPERTIES IMPORTED_LOCATION
|
||||||
|
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libperfetto.a)
|
||||||
|
|
||||||
add_library(uberzlib STATIC IMPORTED)
|
add_library(uberzlib STATIC IMPORTED)
|
||||||
set_target_properties(uberzlib PROPERTIES IMPORTED_LOCATION
|
set_target_properties(uberzlib PROPERTIES IMPORTED_LOCATION
|
||||||
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libuberzlib.a)
|
${FILAMENT_DIR}/lib/${ANDROID_ABI}/libuberzlib.a)
|
||||||
@@ -121,6 +125,7 @@ set(GLTFIO_INCLUDE_DIRS
|
|||||||
../../third_party/meshoptimizer/src
|
../../third_party/meshoptimizer/src
|
||||||
../../third_party/robin-map
|
../../third_party/robin-map
|
||||||
../../third_party/stb
|
../../third_party/stb
|
||||||
|
../../third_party/perfetto
|
||||||
../../libs/utils/include
|
../../libs/utils/include
|
||||||
../../libs/ktxreader/include
|
../../libs/ktxreader/include
|
||||||
)
|
)
|
||||||
@@ -129,7 +134,7 @@ add_library(gltfio-jni SHARED ${GLTFIO_SRCS})
|
|||||||
target_include_directories(gltfio-jni PRIVATE ${GLTFIO_INCLUDE_DIRS})
|
target_include_directories(gltfio-jni PRIVATE ${GLTFIO_INCLUDE_DIRS})
|
||||||
set_target_properties(gltfio-jni PROPERTIES LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/libgltfio-jni.symbols)
|
set_target_properties(gltfio-jni PROPERTIES LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/libgltfio-jni.symbols)
|
||||||
set_target_properties(gltfio-jni PROPERTIES LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/libgltfio-jni.map)
|
set_target_properties(gltfio-jni PROPERTIES LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/libgltfio-jni.map)
|
||||||
target_link_libraries(gltfio-jni filament-jni utils uberzlib log stb ktxreader basis_transcoder zstd uberarchive)
|
target_link_libraries(gltfio-jni filament-jni utils perfetto uberzlib log stb ktxreader basis_transcoder zstd uberarchive)
|
||||||
target_link_libraries(gltfio-jni dracodec meshoptimizer)
|
target_link_libraries(gltfio-jni dracodec meshoptimizer)
|
||||||
target_compile_definitions(gltfio-jni PUBLIC GLTFIO_DRACO_SUPPORTED=1)
|
target_compile_definitions(gltfio-jni PUBLIC GLTFIO_DRACO_SUPPORTED=1)
|
||||||
target_include_directories(gltfio-jni PRIVATE ${DRACO_DIR}/src)
|
target_include_directories(gltfio-jni PRIVATE ${DRACO_DIR}/src)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
GROUP=com.google.android.filament
|
GROUP=com.google.android.filament
|
||||||
VERSION_NAME=1.59.0
|
VERSION_NAME=1.62.1
|
||||||
|
|
||||||
POM_DESCRIPTION=Real-time physically based rendering engine for Android.
|
POM_DESCRIPTION=Real-time physically based rendering engine for Android.
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#Wed Nov 17 10:40:18 PST 2021
|
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
|
||||||
|
networkTimeout=10000
|
||||||
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env sh
|
#!/bin/sh
|
||||||
|
|
||||||
#
|
#
|
||||||
# Copyright 2015 the original author or authors.
|
# Copyright © 2015-2021 the original authors.
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
# you may not use this file except in compliance with the License.
|
# you may not use this file except in compliance with the License.
|
||||||
@@ -17,67 +17,99 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
##
|
#
|
||||||
## Gradle start up script for UN*X
|
# Gradle start up script for POSIX generated by Gradle.
|
||||||
##
|
#
|
||||||
|
# Important for running:
|
||||||
|
#
|
||||||
|
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
|
||||||
|
# noncompliant, but you have some other compliant shell such as ksh or
|
||||||
|
# bash, then to run this script, type that shell name before the whole
|
||||||
|
# command line, like:
|
||||||
|
#
|
||||||
|
# ksh Gradle
|
||||||
|
#
|
||||||
|
# Busybox and similar reduced shells will NOT work, because this script
|
||||||
|
# requires all of these POSIX shell features:
|
||||||
|
# * functions;
|
||||||
|
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
|
||||||
|
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
|
||||||
|
# * compound commands having a testable exit status, especially «case»;
|
||||||
|
# * various built-in commands including «command», «set», and «ulimit».
|
||||||
|
#
|
||||||
|
# Important for patching:
|
||||||
|
#
|
||||||
|
# (2) This script targets any POSIX shell, so it avoids extensions provided
|
||||||
|
# by Bash, Ksh, etc; in particular arrays are avoided.
|
||||||
|
#
|
||||||
|
# The "traditional" practice of packing multiple parameters into a
|
||||||
|
# space-separated string is a well documented source of bugs and security
|
||||||
|
# problems, so this is (mostly) avoided, by progressively accumulating
|
||||||
|
# options in "$@", and eventually passing that to Java.
|
||||||
|
#
|
||||||
|
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
|
||||||
|
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
|
||||||
|
# see the in-line comments for details.
|
||||||
|
#
|
||||||
|
# There are tweaks for specific operating systems such as AIX, CygWin,
|
||||||
|
# Darwin, MinGW, and NonStop.
|
||||||
|
#
|
||||||
|
# (3) This script is generated from the Groovy template
|
||||||
|
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||||
|
# within the Gradle project.
|
||||||
|
#
|
||||||
|
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||||
|
#
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
# Attempt to set APP_HOME
|
# Attempt to set APP_HOME
|
||||||
|
|
||||||
# Resolve links: $0 may be a link
|
# Resolve links: $0 may be a link
|
||||||
PRG="$0"
|
app_path=$0
|
||||||
# Need this for relative symlinks.
|
|
||||||
while [ -h "$PRG" ] ; do
|
# Need this for daisy-chained symlinks.
|
||||||
ls=`ls -ld "$PRG"`
|
while
|
||||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
|
||||||
if expr "$link" : '/.*' > /dev/null; then
|
[ -h "$app_path" ]
|
||||||
PRG="$link"
|
do
|
||||||
else
|
ls=$( ls -ld "$app_path" )
|
||||||
PRG=`dirname "$PRG"`"/$link"
|
link=${ls#*' -> '}
|
||||||
fi
|
case $link in #(
|
||||||
|
/*) app_path=$link ;; #(
|
||||||
|
*) app_path=$APP_HOME$link ;;
|
||||||
|
esac
|
||||||
done
|
done
|
||||||
SAVED="`pwd`"
|
|
||||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
|
||||||
APP_HOME="`pwd -P`"
|
|
||||||
cd "$SAVED" >/dev/null
|
|
||||||
|
|
||||||
APP_NAME="Gradle"
|
# This is normally unused
|
||||||
APP_BASE_NAME=`basename "$0"`
|
# shellcheck disable=SC2034
|
||||||
|
APP_BASE_NAME=${0##*/}
|
||||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
|
||||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
|
||||||
|
|
||||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||||
MAX_FD="maximum"
|
MAX_FD=maximum
|
||||||
|
|
||||||
warn () {
|
warn () {
|
||||||
echo "$*"
|
echo "$*"
|
||||||
}
|
} >&2
|
||||||
|
|
||||||
die () {
|
die () {
|
||||||
echo
|
echo
|
||||||
echo "$*"
|
echo "$*"
|
||||||
echo
|
echo
|
||||||
exit 1
|
exit 1
|
||||||
}
|
} >&2
|
||||||
|
|
||||||
# OS specific support (must be 'true' or 'false').
|
# OS specific support (must be 'true' or 'false').
|
||||||
cygwin=false
|
cygwin=false
|
||||||
msys=false
|
msys=false
|
||||||
darwin=false
|
darwin=false
|
||||||
nonstop=false
|
nonstop=false
|
||||||
case "`uname`" in
|
case "$( uname )" in #(
|
||||||
CYGWIN* )
|
CYGWIN* ) cygwin=true ;; #(
|
||||||
cygwin=true
|
Darwin* ) darwin=true ;; #(
|
||||||
;;
|
MSYS* | MINGW* ) msys=true ;; #(
|
||||||
Darwin* )
|
NONSTOP* ) nonstop=true ;;
|
||||||
darwin=true
|
|
||||||
;;
|
|
||||||
MINGW* )
|
|
||||||
msys=true
|
|
||||||
;;
|
|
||||||
NONSTOP* )
|
|
||||||
nonstop=true
|
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
|
|
||||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||||
@@ -87,9 +119,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
|||||||
if [ -n "$JAVA_HOME" ] ; then
|
if [ -n "$JAVA_HOME" ] ; then
|
||||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||||
# IBM's JDK on AIX uses strange locations for the executables
|
# IBM's JDK on AIX uses strange locations for the executables
|
||||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
JAVACMD=$JAVA_HOME/jre/sh/java
|
||||||
else
|
else
|
||||||
JAVACMD="$JAVA_HOME/bin/java"
|
JAVACMD=$JAVA_HOME/bin/java
|
||||||
fi
|
fi
|
||||||
if [ ! -x "$JAVACMD" ] ; then
|
if [ ! -x "$JAVACMD" ] ; then
|
||||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||||
@@ -98,88 +130,120 @@ Please set the JAVA_HOME variable in your environment to match the
|
|||||||
location of your Java installation."
|
location of your Java installation."
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
JAVACMD="java"
|
JAVACMD=java
|
||||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
if ! command -v java >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
|
||||||
Please set the JAVA_HOME variable in your environment to match the
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
location of your Java installation."
|
location of your Java installation."
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Increase the maximum file descriptors if we can.
|
# Increase the maximum file descriptors if we can.
|
||||||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||||
MAX_FD_LIMIT=`ulimit -H -n`
|
case $MAX_FD in #(
|
||||||
if [ $? -eq 0 ] ; then
|
max*)
|
||||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
||||||
MAX_FD="$MAX_FD_LIMIT"
|
# shellcheck disable=SC2039,SC3045
|
||||||
fi
|
MAX_FD=$( ulimit -H -n ) ||
|
||||||
ulimit -n $MAX_FD
|
warn "Could not query maximum file descriptor limit"
|
||||||
if [ $? -ne 0 ] ; then
|
esac
|
||||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
case $MAX_FD in #(
|
||||||
fi
|
'' | soft) :;; #(
|
||||||
else
|
*)
|
||||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
||||||
fi
|
# shellcheck disable=SC2039,SC3045
|
||||||
fi
|
ulimit -n "$MAX_FD" ||
|
||||||
|
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||||
# For Darwin, add options to specify how the application appears in the dock
|
|
||||||
if $darwin; then
|
|
||||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
|
||||||
fi
|
|
||||||
|
|
||||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
|
||||||
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
|
||||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
|
||||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
|
||||||
|
|
||||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
|
||||||
|
|
||||||
# We build the pattern for arguments to be converted via cygpath
|
|
||||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
|
||||||
SEP=""
|
|
||||||
for dir in $ROOTDIRSRAW ; do
|
|
||||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
|
||||||
SEP="|"
|
|
||||||
done
|
|
||||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
|
||||||
# Add a user-defined pattern to the cygpath arguments
|
|
||||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
|
||||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
|
||||||
fi
|
|
||||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
|
||||||
i=0
|
|
||||||
for arg in "$@" ; do
|
|
||||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
|
||||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
|
||||||
|
|
||||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
|
||||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
|
||||||
else
|
|
||||||
eval `echo args$i`="\"$arg\""
|
|
||||||
fi
|
|
||||||
i=`expr $i + 1`
|
|
||||||
done
|
|
||||||
case $i in
|
|
||||||
0) set -- ;;
|
|
||||||
1) set -- "$args0" ;;
|
|
||||||
2) set -- "$args0" "$args1" ;;
|
|
||||||
3) set -- "$args0" "$args1" "$args2" ;;
|
|
||||||
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
|
||||||
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
|
||||||
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
|
||||||
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
|
||||||
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
|
||||||
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Escape application args
|
# Collect all arguments for the java command, stacking in reverse order:
|
||||||
save () {
|
# * args from the command line
|
||||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
# * the main class name
|
||||||
echo " "
|
# * -classpath
|
||||||
}
|
# * -D...appname settings
|
||||||
APP_ARGS=`save "$@"`
|
# * --module-path (only if needed)
|
||||||
|
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
|
||||||
|
|
||||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
if "$cygwin" || "$msys" ; then
|
||||||
|
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||||
|
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
|
||||||
|
|
||||||
|
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
||||||
|
|
||||||
|
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||||
|
for arg do
|
||||||
|
if
|
||||||
|
case $arg in #(
|
||||||
|
-*) false ;; # don't mess with options #(
|
||||||
|
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
|
||||||
|
[ -e "$t" ] ;; #(
|
||||||
|
*) false ;;
|
||||||
|
esac
|
||||||
|
then
|
||||||
|
arg=$( cygpath --path --ignore --mixed "$arg" )
|
||||||
|
fi
|
||||||
|
# Roll the args list around exactly as many times as the number of
|
||||||
|
# args, so each arg winds up back in the position where it started, but
|
||||||
|
# possibly modified.
|
||||||
|
#
|
||||||
|
# NB: a `for` loop captures its iteration list before it begins, so
|
||||||
|
# changing the positional parameters here affects neither the number of
|
||||||
|
# iterations, nor the values presented in `arg`.
|
||||||
|
shift # remove old arg
|
||||||
|
set -- "$@" "$arg" # push replacement arg
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||||
|
|
||||||
|
# Collect all arguments for the java command:
|
||||||
|
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
||||||
|
# and any embedded shellness will be escaped.
|
||||||
|
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
|
||||||
|
# treated as '${Hostname}' itself on the command line.
|
||||||
|
|
||||||
|
set -- \
|
||||||
|
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||||
|
-classpath "$CLASSPATH" \
|
||||||
|
org.gradle.wrapper.GradleWrapperMain \
|
||||||
|
"$@"
|
||||||
|
|
||||||
|
# Stop when "xargs" is not available.
|
||||||
|
if ! command -v xargs >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
die "xargs is not available"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Use "xargs" to parse quoted args.
|
||||||
|
#
|
||||||
|
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||||
|
#
|
||||||
|
# In Bash we could simply go:
|
||||||
|
#
|
||||||
|
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
|
||||||
|
# set -- "${ARGS[@]}" "$@"
|
||||||
|
#
|
||||||
|
# but POSIX shell has neither arrays nor command substitution, so instead we
|
||||||
|
# post-process each arg (as a line of input to sed) to backslash-escape any
|
||||||
|
# character that might be a shell metacharacter, then use eval to reverse
|
||||||
|
# that process (while maintaining the separation between arguments), and wrap
|
||||||
|
# the whole thing up as a single "set" statement.
|
||||||
|
#
|
||||||
|
# This will of course break if any of these variables contains a newline or
|
||||||
|
# an unmatched quote.
|
||||||
|
#
|
||||||
|
|
||||||
|
eval "set -- $(
|
||||||
|
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
|
||||||
|
xargs -n1 |
|
||||||
|
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
|
||||||
|
tr '\n' ' '
|
||||||
|
)" '"$@"'
|
||||||
|
|
||||||
exec "$JAVACMD" "$@"
|
exec "$JAVACMD" "$@"
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
@rem limitations under the License.
|
@rem limitations under the License.
|
||||||
@rem
|
@rem
|
||||||
|
|
||||||
@if "%DEBUG%" == "" @echo off
|
@if "%DEBUG%"=="" @echo off
|
||||||
@rem ##########################################################################
|
@rem ##########################################################################
|
||||||
@rem
|
@rem
|
||||||
@rem Gradle startup script for Windows
|
@rem Gradle startup script for Windows
|
||||||
@@ -25,7 +25,8 @@
|
|||||||
if "%OS%"=="Windows_NT" setlocal
|
if "%OS%"=="Windows_NT" setlocal
|
||||||
|
|
||||||
set DIRNAME=%~dp0
|
set DIRNAME=%~dp0
|
||||||
if "%DIRNAME%" == "" set DIRNAME=.
|
if "%DIRNAME%"=="" set DIRNAME=.
|
||||||
|
@rem This is normally unused
|
||||||
set APP_BASE_NAME=%~n0
|
set APP_BASE_NAME=%~n0
|
||||||
set APP_HOME=%DIRNAME%
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
@@ -40,13 +41,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome
|
|||||||
|
|
||||||
set JAVA_EXE=java.exe
|
set JAVA_EXE=java.exe
|
||||||
%JAVA_EXE% -version >NUL 2>&1
|
%JAVA_EXE% -version >NUL 2>&1
|
||||||
if "%ERRORLEVEL%" == "0" goto execute
|
if %ERRORLEVEL% equ 0 goto execute
|
||||||
|
|
||||||
echo.
|
echo. 1>&2
|
||||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
|
||||||
echo.
|
echo. 1>&2
|
||||||
echo Please set the JAVA_HOME variable in your environment to match the
|
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||||
echo location of your Java installation.
|
echo location of your Java installation. 1>&2
|
||||||
|
|
||||||
goto fail
|
goto fail
|
||||||
|
|
||||||
@@ -56,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
|||||||
|
|
||||||
if exist "%JAVA_EXE%" goto execute
|
if exist "%JAVA_EXE%" goto execute
|
||||||
|
|
||||||
echo.
|
echo. 1>&2
|
||||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
|
||||||
echo.
|
echo. 1>&2
|
||||||
echo Please set the JAVA_HOME variable in your environment to match the
|
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||||
echo location of your Java installation.
|
echo location of your Java installation. 1>&2
|
||||||
|
|
||||||
goto fail
|
goto fail
|
||||||
|
|
||||||
@@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
|||||||
|
|
||||||
:end
|
:end
|
||||||
@rem End local scope for the variables with windows NT shell
|
@rem End local scope for the variables with windows NT shell
|
||||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
if %ERRORLEVEL% equ 0 goto mainEnd
|
||||||
|
|
||||||
:fail
|
:fail
|
||||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||||
rem the _cmd.exe /c_ return code!
|
rem the _cmd.exe /c_ return code!
|
||||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
set EXIT_CODE=%ERRORLEVEL%
|
||||||
exit /b 1
|
if %EXIT_CODE% equ 0 set EXIT_CODE=1
|
||||||
|
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
|
||||||
|
exit /b %EXIT_CODE%
|
||||||
|
|
||||||
:mainEnd
|
:mainEnd
|
||||||
if "%OS%"=="Windows_NT" endlocal
|
if "%OS%"=="Windows_NT" endlocal
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package com.google.android.filament.gltf
|
|||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.view.*
|
import android.view.*
|
||||||
@@ -50,6 +51,7 @@ class MainActivity : Activity() {
|
|||||||
// Load the library for the utility layer, which in turn loads gltfio and the Filament core.
|
// Load the library for the utility layer, which in turn loads gltfio and the Filament core.
|
||||||
init { Utils.init() }
|
init { Utils.init() }
|
||||||
private const val TAG = "gltf-viewer"
|
private const val TAG = "gltf-viewer"
|
||||||
|
private const val STATIC_MODEL_TAG = "use-static-model"
|
||||||
}
|
}
|
||||||
|
|
||||||
private lateinit var surfaceView: SurfaceView
|
private lateinit var surfaceView: SurfaceView
|
||||||
@@ -69,6 +71,7 @@ class MainActivity : Activity() {
|
|||||||
private var loadStartTime = 0L
|
private var loadStartTime = 0L
|
||||||
private var loadStartFence: Fence? = null
|
private var loadStartFence: Fence? = null
|
||||||
private val viewerContent = AutomationEngine.ViewerContent()
|
private val viewerContent = AutomationEngine.ViewerContent()
|
||||||
|
private var useStaticModel = false
|
||||||
|
|
||||||
@SuppressLint("ClickableViewAccessibility")
|
@SuppressLint("ClickableViewAccessibility")
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
@@ -83,6 +86,12 @@ class MainActivity : Activity() {
|
|||||||
doubleTapDetector = GestureDetector(applicationContext, doubleTapListener)
|
doubleTapDetector = GestureDetector(applicationContext, doubleTapListener)
|
||||||
singleTapDetector = GestureDetector(applicationContext, singleTapListener)
|
singleTapDetector = GestureDetector(applicationContext, singleTapListener)
|
||||||
|
|
||||||
|
val intent: Intent = intent
|
||||||
|
val bundle: Bundle? = intent.extras
|
||||||
|
bundle?.let {
|
||||||
|
useStaticModel = it.getBoolean(STATIC_MODEL_TAG, false)
|
||||||
|
}
|
||||||
|
|
||||||
modelViewer = ModelViewer(surfaceView)
|
modelViewer = ModelViewer(surfaceView)
|
||||||
viewerContent.view = modelViewer.view
|
viewerContent.view = modelViewer.view
|
||||||
viewerContent.sunlight = modelViewer.light
|
viewerContent.sunlight = modelViewer.light
|
||||||
@@ -141,7 +150,16 @@ class MainActivity : Activity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun createDefaultRenderables() {
|
private fun createDefaultRenderables() {
|
||||||
val buffer = assets.open("models/scene.gltf").use { input ->
|
// Sometimes it's useful to set to the default model to something static. You can enable
|
||||||
|
// the static model by launching the app from adb, as in
|
||||||
|
// `adb shell am start -n com.google.android.filament.gltf/.MainActivity --ez "use-static-model" true`
|
||||||
|
val modelPath = if (useStaticModel) {
|
||||||
|
"models/helmet.glb"
|
||||||
|
} else {
|
||||||
|
"models/scene.gltf"
|
||||||
|
}
|
||||||
|
|
||||||
|
val buffer = assets.open(modelPath).use { input ->
|
||||||
val bytes = ByteArray(input.available())
|
val bytes = ByteArray(input.available())
|
||||||
input.read(bytes)
|
input.read(bytes)
|
||||||
ByteBuffer.wrap(bytes)
|
ByteBuffer.wrap(bytes)
|
||||||
|
|||||||
@@ -63,6 +63,9 @@ function print_help {
|
|||||||
echo " -b"
|
echo " -b"
|
||||||
echo " Enable Address and Undefined Behavior Sanitizers (asan/ubsan) for debugging."
|
echo " Enable Address and Undefined Behavior Sanitizers (asan/ubsan) for debugging."
|
||||||
echo " This is only for the desktop build."
|
echo " This is only for the desktop build."
|
||||||
|
echo " -V"
|
||||||
|
echo " Enable LLVM code coverage for debug builds."
|
||||||
|
echo " This is only for the desktop build."
|
||||||
echo " -x value"
|
echo " -x value"
|
||||||
echo " Define a preprocessor flag FILAMENT_BACKEND_DEBUG_FLAG with [value]. This is useful for"
|
echo " Define a preprocessor flag FILAMENT_BACKEND_DEBUG_FLAG with [value]. This is useful for"
|
||||||
echo " enabling debug paths in the backend from the build script. For example, make a"
|
echo " enabling debug paths in the backend from the build script. For example, make a"
|
||||||
@@ -151,7 +154,7 @@ function print_fgviewer_help {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Unless explicitly specified, NDK version will be selected as highest available version within same major release chain
|
# Unless explicitly specified, NDK version will be selected as highest available version within same major release chain
|
||||||
FILAMENT_NDK_VERSION=${FILAMENT_NDK_VERSION:-$(cat `dirname $0`/build/android/ndk.version | cut -f 1 -d ".")}
|
FILAMENT_NDK_VERSION=${FILAMENT_NDK_VERSION:-$(cat `dirname $0`/build/common/versions | grep GITHUB_NDK_VERSION | sed s/GITHUB_NDK_VERSION=//g | cut -f 1 -d ".")}
|
||||||
|
|
||||||
# Requirements
|
# Requirements
|
||||||
CMAKE_MAJOR=3
|
CMAKE_MAJOR=3
|
||||||
@@ -208,6 +211,7 @@ MATOPT_OPTION=""
|
|||||||
MATOPT_GRADLE_OPTION=""
|
MATOPT_GRADLE_OPTION=""
|
||||||
|
|
||||||
ASAN_UBSAN_OPTION=""
|
ASAN_UBSAN_OPTION=""
|
||||||
|
COVERAGE_OPTION=""
|
||||||
|
|
||||||
BACKEND_DEBUG_FLAG_OPTION=""
|
BACKEND_DEBUG_FLAG_OPTION=""
|
||||||
|
|
||||||
@@ -275,6 +279,7 @@ function build_desktop_target {
|
|||||||
${MATDBG_OPTION} \
|
${MATDBG_OPTION} \
|
||||||
${MATOPT_OPTION} \
|
${MATOPT_OPTION} \
|
||||||
${ASAN_UBSAN_OPTION} \
|
${ASAN_UBSAN_OPTION} \
|
||||||
|
${COVERAGE_OPTION} \
|
||||||
${BACKEND_DEBUG_FLAG_OPTION} \
|
${BACKEND_DEBUG_FLAG_OPTION} \
|
||||||
${STEREOSCOPIC_OPTION} \
|
${STEREOSCOPIC_OPTION} \
|
||||||
${OSMESA_OPTION} \
|
${OSMESA_OPTION} \
|
||||||
@@ -463,16 +468,6 @@ function ensure_android_build {
|
|||||||
echo "Error: Android NDK side-by-side version ${FILAMENT_NDK_VERSION} or compatible must be installed, exiting"
|
echo "Error: Android NDK side-by-side version ${FILAMENT_NDK_VERSION} or compatible must be installed, exiting"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local cmake_version=$(cmake --version)
|
|
||||||
if [[ "${cmake_version}" =~ ([0-9]+)\.([0-9]+)\.[0-9]+ ]]; then
|
|
||||||
if [[ "${BASH_REMATCH[1]}" -lt "${CMAKE_MAJOR}" ]] || \
|
|
||||||
[[ "${BASH_REMATCH[2]}" -lt "${CMAKE_MINOR}" ]]; then
|
|
||||||
echo "Error: cmake version ${CMAKE_MAJOR}.${CMAKE_MINOR}+ is required," \
|
|
||||||
"${BASH_REMATCH[1]}.${BASH_REMATCH[2]} installed, exiting"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function build_android {
|
function build_android {
|
||||||
@@ -845,7 +840,7 @@ function check_debug_release_build {
|
|||||||
|
|
||||||
pushd "$(dirname "$0")" > /dev/null
|
pushd "$(dirname "$0")" > /dev/null
|
||||||
|
|
||||||
while getopts ":hacCfgimp:q:uvWslwedtk:bx:S:X:" opt; do
|
while getopts ":hacCfgimp:q:uvWslwedtk:bVx:S:X:" opt; do
|
||||||
case ${opt} in
|
case ${opt} in
|
||||||
h)
|
h)
|
||||||
print_help
|
print_help
|
||||||
@@ -993,6 +988,9 @@ while getopts ":hacCfgimp:q:uvWslwedtk:bx:S:X:" opt; do
|
|||||||
b) ASAN_UBSAN_OPTION="-DFILAMENT_ENABLE_ASAN_UBSAN=ON"
|
b) ASAN_UBSAN_OPTION="-DFILAMENT_ENABLE_ASAN_UBSAN=ON"
|
||||||
echo "Enabled ASAN/UBSAN"
|
echo "Enabled ASAN/UBSAN"
|
||||||
;;
|
;;
|
||||||
|
V) COVERAGE_OPTION="-DFILAMENT_ENABLE_COVERAGE=ON"
|
||||||
|
echo "Enabled coverage"
|
||||||
|
;;
|
||||||
x) BACKEND_DEBUG_FLAG_OPTION="-DFILAMENT_BACKEND_DEBUG_FLAG=${OPTARG}"
|
x) BACKEND_DEBUG_FLAG_OPTION="-DFILAMENT_BACKEND_DEBUG_FLAG=${OPTARG}"
|
||||||
;;
|
;;
|
||||||
S) case $(echo "${OPTARG}" | tr '[:upper:]' '[:lower:]') in
|
S) case $(echo "${OPTARG}" | tr '[:upper:]' '[:lower:]') in
|
||||||
|
|||||||
@@ -1,28 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Usage: the first argument selects the build type:
|
source `dirname $0`/../common/ci-check.sh
|
||||||
# - release, to build release only
|
|
||||||
# - debug, to build debug only
|
|
||||||
# - continuous, to build release and debug
|
|
||||||
# - presubmit, for presubmit builds
|
|
||||||
#
|
|
||||||
# The default is release
|
|
||||||
|
|
||||||
echo "This script is intended to run in a CI environment and may modify your current environment."
|
|
||||||
echo "Please refer to BUILDING.md for more information."
|
|
||||||
|
|
||||||
read -r -p "Do you wish to proceed (y/n)? " choice
|
|
||||||
case "${choice}" in
|
|
||||||
y|Y)
|
|
||||||
echo "Build will proceed..."
|
|
||||||
;;
|
|
||||||
n|N)
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
set -x
|
set -x
|
||||||
@@ -30,30 +8,22 @@ set -x
|
|||||||
UNAME=`echo $(uname)`
|
UNAME=`echo $(uname)`
|
||||||
LC_UNAME=`echo $UNAME | tr '[:upper:]' '[:lower:]'`
|
LC_UNAME=`echo $UNAME | tr '[:upper:]' '[:lower:]'`
|
||||||
|
|
||||||
FILAMENT_ANDROID_CI_BUILD=true
|
|
||||||
|
|
||||||
# build-common.sh will generate the following variables:
|
|
||||||
# $GENERATE_ARCHIVES
|
|
||||||
# $BUILD_DEBUG
|
|
||||||
# $BUILD_RELEASE
|
|
||||||
source `dirname $0`/../common/ci-common.sh
|
|
||||||
if [[ "$LC_UNAME" == "linux" ]]; then
|
|
||||||
source `dirname $0`/../linux/ci-common.sh
|
|
||||||
elif [[ "$LC_UNAME" == "darwin" ]]; then
|
|
||||||
source `dirname $0`/../mac/ci-common.sh
|
|
||||||
fi
|
|
||||||
source `dirname $0`/../common/build-common.sh
|
source `dirname $0`/../common/build-common.sh
|
||||||
|
|
||||||
if [[ "$GITHUB_WORKFLOW" ]]; then
|
if [[ "$GITHUB_WORKFLOW" ]]; then
|
||||||
java_version=$(java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1)
|
java_version=$(java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1)
|
||||||
if [[ "$java_version" < 17 ]]; then
|
if [[ "$java_version" < 17 ]]; then
|
||||||
echo "Android builds require Java 17, found version ${java_version} instead"
|
echo "Android builds require Java 17, found version ${java_version} instead"
|
||||||
exit 0
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Unless explicitly specified, NDK version will be set to match exactly the required one
|
# Unless explicitly specified, NDK version will be set to match exactly the required one
|
||||||
FILAMENT_NDK_VERSION=${FILAMENT_NDK_VERSION:-$(cat `dirname $0`/ndk.version)}
|
FILAMENT_NDK_VERSION=${GITHUB_NDK_VERSION:-27.0.11718014}
|
||||||
|
|
||||||
|
(! grep "${FILAMENT_NDK_VERSION}" `dirname $0`/../../android/build.gradle > /dev/null) &&
|
||||||
|
echo "Mismatch of NDK versions: want ${FILAMENT_NDK_VERSION} and not found in android/build.gradle" &&
|
||||||
|
exit 1
|
||||||
|
|
||||||
# Install the required NDK version specifically (if not present)
|
# Install the required NDK version specifically (if not present)
|
||||||
if [[ ! -d "${ANDROID_HOME}/ndk/$FILAMENT_NDK_VERSION" ]]; then
|
if [[ ! -d "${ANDROID_HOME}/ndk/$FILAMENT_NDK_VERSION" ]]; then
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
27.0.11718014
|
|
||||||
@@ -1,5 +1,20 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
# build-common.sh will generate the following variables:
|
||||||
|
# $GENERATE_ARCHIVES
|
||||||
|
# $BUILD_DEBUG
|
||||||
|
# $BUILD_RELEASE
|
||||||
|
|
||||||
|
# Typically a build script (build.sh) would source this script. For example,
|
||||||
|
# source `dirname $0`/../common/build-common.sh
|
||||||
|
|
||||||
|
# Usage: the first argument selects the build type:
|
||||||
|
# - release, to build release only
|
||||||
|
# - debug, to build debug only
|
||||||
|
# - continuous, to build release and debug
|
||||||
|
# - presubmit, for presubmit builds
|
||||||
|
#
|
||||||
|
# The default is release
|
||||||
if [[ ! "$TARGET" ]]; then
|
if [[ ! "$TARGET" ]]; then
|
||||||
if [[ "$1" ]]; then
|
if [[ "$1" ]]; then
|
||||||
TARGET=$1
|
TARGET=$1
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
echo "This script is intended to run in a CI environment and may modify your current environment."
|
||||||
|
echo "Please refer to BUILDING.md for more information."
|
||||||
|
|
||||||
|
read -r -p "Do you wish to proceed (y/n)? " choice
|
||||||
|
case "${choice}" in
|
||||||
|
y|Y)
|
||||||
|
echo "Build will proceed..."
|
||||||
|
;;
|
||||||
|
n|N)
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [[ "$GITHUB_WORKFLOW" ]]; then
|
||||||
|
echo "Running workflow $GITHUB_WORKFLOW (event: $GITHUB_EVENT_NAME, action: $GITHUB_ACTION)"
|
||||||
|
fi
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
if [[ "$GITHUB_WORKFLOW" ]]; then
|
|
||||||
echo "Running workflow $GITHUB_WORKFLOW (event: $GITHUB_EVENT_NAME, action: $GITHUB_ACTION)"
|
|
||||||
CONTINUOUS_INTEGRATION=true
|
|
||||||
fi
|
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ -d "./emsdk" ]; then
|
||||||
|
echo "emsdk folder found. Assume emsdk has been installed."
|
||||||
|
cd emsdk
|
||||||
|
./emsdk activate latest
|
||||||
|
source ./emsdk_env.sh
|
||||||
|
export EMSDK="$PWD"
|
||||||
|
cd ..
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install emscripten.
|
||||||
|
EMSDK_VERSION=${GITHUB_EMSDK_VERSION-3.1.60}
|
||||||
|
curl -L https://github.com/emscripten-core/emsdk/archive/refs/tags/${EMSDK_VERSION}.zip > emsdk.zip
|
||||||
|
unzip emsdk.zip ; mv emsdk-* emsdk ; cd emsdk
|
||||||
|
./emsdk install latest
|
||||||
|
./emsdk activate latest
|
||||||
|
source ./emsdk_env.sh
|
||||||
|
|
||||||
|
export EMSDK="$PWD"
|
||||||
|
cd ..
|
||||||
@@ -14,14 +14,37 @@
|
|||||||
|
|
||||||
#!/usr/bin/bash
|
#!/usr/bin/bash
|
||||||
|
|
||||||
set -xe
|
set -e
|
||||||
|
if [[ "$GITHUB_WORKFLOW" ]]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
|
||||||
# GITHUB_CLANG_VERSION is set in build/linux/ci-common.sh
|
OS_NAME=$(uname -s)
|
||||||
os_name=$(uname -s)
|
LLVM_VERSION=${GITHUB_LLVM_VERSION-16}
|
||||||
LLVM_VERSION=16
|
MESA_VERSION=${GITHUB_MESA_VERSION-24.2.1}
|
||||||
MESA_DIR=$(pwd)/mesa
|
ORIG_DIR=$(pwd)
|
||||||
|
MESA_DIR=${MESA_DIR-${ORIG_DIR}/mesa}
|
||||||
|
|
||||||
if [[ "$os_name" == "Linux" ]]; then
|
if [[ "$OS_NAME" == "Linux" ]]; then
|
||||||
|
sudo apt install python3-venv
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install python deps
|
||||||
|
python3 -m venv ${ORIG_DIR}/venv
|
||||||
|
source ${ORIG_DIR}/venv/bin/activate
|
||||||
|
|
||||||
|
NEEDED_PYTHON_DEPS=("mako" "setuptools" "pyyaml")
|
||||||
|
for cmd in "${NEEDED_PYTHON_DEPS[@]}"; do
|
||||||
|
if ! python3 -m pip show -q "${cmd}" >/dev/null 2>&1; then
|
||||||
|
python3 -m pip install ${cmd}
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
deactivate
|
||||||
|
|
||||||
|
LOCAL_PKG_CONFIG_PATH=
|
||||||
|
|
||||||
|
# Install system deps
|
||||||
|
if [[ "$OS_NAME" == "Linux" ]]; then
|
||||||
if [[ "$GITHUB_WORKFLOW" ]]; then
|
if [[ "$GITHUB_WORKFLOW" ]]; then
|
||||||
# We only want to do this if it is a CI machine.
|
# We only want to do this if it is a CI machine.
|
||||||
sudo apt-get -y remove llvm-*
|
sudo apt-get -y remove llvm-*
|
||||||
@@ -43,29 +66,32 @@ if [[ "$os_name" == "Linux" ]]; then
|
|||||||
sudo apt -y remove llvm-18 llvm-18-* llvm-19 llvm-19-*
|
sudo apt -y remove llvm-18 llvm-18-* llvm-19 llvm-19-*
|
||||||
set -e
|
set -e
|
||||||
CURRENT_CLANG_VERSION=$(clang --version | head -n 1 | awk '{ print $4 }' | awk 'BEGIN { FS="\\." } { print $1 }')
|
CURRENT_CLANG_VERSION=$(clang --version | head -n 1 | awk '{ print $4 }' | awk 'BEGIN { FS="\\." } { print $1 }')
|
||||||
GITHUB_CLANG_VERSION=${GITHUB_CLANG_VERSION:-${CURRENT_CLANG_VERSION}}
|
CLANG_VERSION=${CURRENT_CLANG_VERSION:-${LLVM_VERSION}}
|
||||||
sudo apt-get -y install clang-${GITHUB_CLANG_VERSION} \
|
sudo apt-get -y install clang-${CLANG_VERSION} \
|
||||||
libc++-${GITHUB_CLANG_VERSION}-dev \
|
libc++-${CLANG_VERSION}-dev \
|
||||||
libc++abi-${GITHUB_CLANG_VERSION}-dev \
|
libc++abi-${CLANG_VERSION}-dev \
|
||||||
llvm-${LLVM_VERSION} \
|
llvm-${LLVM_VERSION} \
|
||||||
llvm-${LLVM_VERSION}-{dev,tools,runtime}
|
llvm-${LLVM_VERSION}-{dev,tools,runtime}
|
||||||
fi # [[ "$GITHUB_WORKFLOW" ]]
|
! command -v clang > /dev/null 2>&1 && \
|
||||||
elif [[ "$os_name" == "Darwin" ]]; then
|
sudo ln -s /usr/bin/clang-${CLANG_VERSION} /usr/bin/clang && \
|
||||||
if [[ ! "$GITHUB_WORKFLOW" ]]; then
|
sudo ln -s /usr/bin/clang++-${CLANG_VERSION} /usr/bin/clang++
|
||||||
if [ ! command -v brew > /dev/null 2>&1 ]; then
|
fi # [[ "$GITHUB_WORKFLOW" ]]
|
||||||
echo "Error: need to install homebrew to continue"
|
elif [[ "$OS_NAME" == "Darwin" ]]; then
|
||||||
exit 1
|
if command -v brew > /dev/null 2>&1; then
|
||||||
fi
|
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=true brew install autoconf automake libx11 libxext libxrandr \
|
||||||
|
llvm@${LLVM_VERSION} ninja meson pkg-config libxshmfence
|
||||||
|
# For reasons unknown, this is necessary for pkg-config to find homebrew's packages
|
||||||
|
LOCAL_PKG_CONFIG_PATH="/opt/homebrew/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||||
|
elif command -v port > /dev/null 2>&1; then
|
||||||
|
sudo port install autoconf automake libx11 libXext libXrandr llvm-${LLVM_VERSION} \
|
||||||
|
ninja meson pkgconfig libxshmfence
|
||||||
|
# For reasons unknown, this is necessary for pkg-config to find macport's packages
|
||||||
|
LOCAL_PKG_CONFIG_PATH="/opt/local/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||||
|
else
|
||||||
|
echo "Error: need to install homebrew or macports to continue"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
brew install autoconf automake libx11 libxext libxrandr llvm@${LLVM_VERSION} ninja meson pkg-config libxshmfence
|
fi # [[ "$OS_NAME" == x ]]
|
||||||
|
|
||||||
NEEDED_PYTHON_DEPS=("mako" "setuptools")
|
|
||||||
for cmd in "${NEEDED_PYTHON_DEPS[@]}"; do
|
|
||||||
if ! pip3 show "${cmd}" >/dev/null 2>&1; then
|
|
||||||
sudo pip3 install ${cmd}
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi # [[ "$os_name" == x ]]
|
|
||||||
|
|
||||||
LOCAL_LDFLAGS=${LDFLAGS}
|
LOCAL_LDFLAGS=${LDFLAGS}
|
||||||
LOCAL_CPPFLAGS=${CPPFLAGS}
|
LOCAL_CPPFLAGS=${CPPFLAGS}
|
||||||
@@ -88,10 +114,8 @@ fi
|
|||||||
if [[ "$CHECKOUT_MESA" = "true" ]]; then
|
if [[ "$CHECKOUT_MESA" = "true" ]]; then
|
||||||
rm -rf ${MESA_DIR}
|
rm -rf ${MESA_DIR}
|
||||||
|
|
||||||
#git clone https://gitlab.freedesktop.org/mesa/mesa.git
|
git clone https://gitlab.freedesktop.org/mesa/mesa.git
|
||||||
git clone git://anongit.freedesktop.org/mesa/mesa
|
if [[ "${MESA_DIR}" != "${ORIG_DIR}/mesa" ]]; then
|
||||||
# Due to gitlab mesa outage.
|
|
||||||
if [[ "${MESA_DIR}" != "$(pwd)/mesa" ]]; then
|
|
||||||
mv mesa ${MESA_DIR}
|
mv mesa ${MESA_DIR}
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -100,11 +124,13 @@ pushd .
|
|||||||
cd ${MESA_DIR}
|
cd ${MESA_DIR}
|
||||||
|
|
||||||
# Need >= 24 to have llvmpipe for swrast. llvmpipe is needed for GL >= 4.1.
|
# Need >= 24 to have llvmpipe for swrast. llvmpipe is needed for GL >= 4.1.
|
||||||
git checkout mesa-24.2.1
|
git checkout mesa-${MESA_VERSION}
|
||||||
|
|
||||||
mkdir -p out
|
mkdir -p out
|
||||||
|
|
||||||
if [[ "$os_name" == "Darwin" ]]; then
|
source ${ORIG_DIR}/venv/bin/activate
|
||||||
|
|
||||||
|
if [[ "$OS_NAME" == "Darwin" ]]; then
|
||||||
LOCAL_LDFLAGS="-L/opt/homebrew/opt/llvm@${LLVM_VERSION}/lib"
|
LOCAL_LDFLAGS="-L/opt/homebrew/opt/llvm@${LLVM_VERSION}/lib"
|
||||||
LOCAL_CPPFLAGS="-I/opt/homebrew/opt/llvm@${LLVM_VERSION}/include -I/opt/homebrew/include"
|
LOCAL_CPPFLAGS="-I/opt/homebrew/opt/llvm@${LLVM_VERSION}/include -I/opt/homebrew/include"
|
||||||
LOCAL_PATH=${PATH}:/opt/homebrew/opt/llvm@${LLVM_VERSION}/bin
|
LOCAL_PATH=${PATH}:/opt/homebrew/opt/llvm@${LLVM_VERSION}/bin
|
||||||
@@ -117,9 +143,19 @@ fi
|
|||||||
# -Dgallium-drivers=swrast => builds GL software rasterizer
|
# -Dgallium-drivers=swrast => builds GL software rasterizer
|
||||||
# -Dvulkan-drivers=swrast => builds VK software rasterizer
|
# -Dvulkan-drivers=swrast => builds VK software rasterizer
|
||||||
# -Dgallium-drivers=llvmpipe is needed for GL >= 4.1 pipe-screen (see src/gallium/auxiliary/target-helpers/inline_sw_helper.h)
|
# -Dgallium-drivers=llvmpipe is needed for GL >= 4.1 pipe-screen (see src/gallium/auxiliary/target-helpers/inline_sw_helper.h)
|
||||||
CXX=${LOCAL_CXX} CC=${LOCAL_CC} PATH=${LOCAL_PATH} LDFLAGS=${LOCAL_LDFLAGS} CPPFLAGS=${LOCAL_CPPFLAGS} \
|
PKG_CONFIG_PATH=${LOCAL_PKG_CONFIG_PATH} PATH=${LOCAL_PATH} \
|
||||||
meson setup --wipe builddir/ -Dprefix="$(pwd)/out" -Dglx=xlib -Dosmesa=true -Dgallium-drivers=llvmpipe,swrast -Dvulkan-drivers=swrast
|
CXX=${LOCAL_CXX} CC=${LOCAL_CC} LDFLAGS=${LOCAL_LDFLAGS} CPPFLAGS=${LOCAL_CPPFLAGS} \
|
||||||
CXX=${LOCAL_CXX} CC=${LOCAL_CC} PATH=${LOCAL_PATH} LDFLAGS=${LOCAL_LDFLAGS} CPPFLAGS=${LOCAL_CPPFLAGS} \
|
meson setup --wipe builddir/ -Dprefix="${MESA_DIR}/out" -Dglx=xlib -Dosmesa=true -Dgallium-drivers=llvmpipe,swrast -Dvulkan-drivers=swrast
|
||||||
|
PKG_CONFIG_PATH=${LOCAL_PKG_CONFIG_PATH} PATH=${LOCAL_PATH} \
|
||||||
|
CXX=${LOCAL_CXX} CC=${LOCAL_CC} LDFLAGS=${LOCAL_LDFLAGS} CPPFLAGS=${LOCAL_CPPFLAGS} \
|
||||||
meson install -C builddir/
|
meson install -C builddir/
|
||||||
|
|
||||||
|
# Disable python venv
|
||||||
|
deactivate
|
||||||
|
|
||||||
popd
|
popd
|
||||||
|
|
||||||
|
if [[ "$GITHUB_WORKFLOW" ]]; then
|
||||||
|
set +x
|
||||||
|
fi
|
||||||
|
set +e
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [[ "$GITHUB_WORKFLOW" ]]; then
|
||||||
|
OS_NAME=$(uname -s)
|
||||||
|
NINJA_DL_DIR=/tmp/ninja-dl
|
||||||
|
NINJA_PLATFORM=
|
||||||
|
if [[ "$OS_NAME" == "Linux" ]]; then
|
||||||
|
NINJA_PLATFORM=linux
|
||||||
|
elif [[ "$OS_NAME" == "Darwin" ]]; then
|
||||||
|
NINJA_PLATFORM=mac
|
||||||
|
fi
|
||||||
|
curl -L -o /tmp/ninja-dl.zip https://github.com/ninja-build/ninja/releases/download/v${GITHUB_NINJA_VERSION}/ninja-${NINJA_PLATFORM}.zip
|
||||||
|
mkdir -p $NINJA_DL_DIR
|
||||||
|
unzip -q /tmp/ninja-dl.zip -d $NINJA_DL_DIR
|
||||||
|
chmod +x ${NINJA_DL_DIR}/ninja
|
||||||
|
# Install ninja globally for AGP
|
||||||
|
sudo cp ${NINJA_DL_DIR}/ninja /usr/local/bin/
|
||||||
|
fi
|
||||||
@@ -204,9 +204,10 @@
|
|||||||
"license": "Apache-2.0"
|
"license": "Apache-2.0"
|
||||||
},
|
},
|
||||||
"node_modules/brace-expansion": {
|
"node_modules/brace-expansion": {
|
||||||
"version": "1.1.11",
|
"version": "1.1.12",
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
|
||||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"balanced-match": "^1.0.0",
|
"balanced-match": "^1.0.0",
|
||||||
"concat-map": "0.0.1"
|
"concat-map": "0.0.1"
|
||||||
@@ -409,9 +410,9 @@
|
|||||||
"integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A=="
|
"integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A=="
|
||||||
},
|
},
|
||||||
"brace-expansion": {
|
"brace-expansion": {
|
||||||
"version": "1.1.11",
|
"version": "1.1.12",
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
|
||||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"balanced-match": "^1.0.0",
|
"balanced-match": "^1.0.0",
|
||||||
"concat-map": "0.0.1"
|
"concat-map": "0.0.1"
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
GITHUB_CLANG_VERSION=14
|
||||||
|
GITHUB_CMAKE_VERSION=3.19.5
|
||||||
|
GITHUB_NINJA_VERSION=1.10.2
|
||||||
|
GITHUB_MESA_VERSION=24.2.1
|
||||||
|
GITHUB_LLVM_VERSION=16
|
||||||
|
GITHUB_NDK_VERSION=27.0.11718014
|
||||||
|
GITHUB_EMSDK_VERSION=3.1.60
|
||||||
@@ -1,36 +1,11 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Usage: the first argument selects the build type:
|
source `dirname $0`/../common/ci-check.sh
|
||||||
# - release, to build release only
|
|
||||||
# - debug, to build debug only
|
|
||||||
# - continuous, to build release and debug
|
|
||||||
# - presubmit, for presubmit builds
|
|
||||||
#
|
|
||||||
# The default is release
|
|
||||||
|
|
||||||
echo "This script is intended to run in a CI environment and may modify your current environment."
|
|
||||||
echo "Please refer to BUILDING.md for more information."
|
|
||||||
|
|
||||||
read -r -p "Do you wish to proceed (y/n)? " choice
|
|
||||||
case "${choice}" in
|
|
||||||
y|Y)
|
|
||||||
echo "Build will proceed..."
|
|
||||||
;;
|
|
||||||
n|N)
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
set -x
|
set -x
|
||||||
|
|
||||||
source `dirname $0`/../common/ci-common.sh
|
|
||||||
source `dirname $0`/ci-common.sh
|
|
||||||
source `dirname $0`/../common/build-common.sh
|
source `dirname $0`/../common/build-common.sh
|
||||||
|
|
||||||
pushd `dirname $0`/../.. > /dev/null
|
pushd `dirname $0`/../.. > /dev/null
|
||||||
|
|
||||||
# If we're generating an archive for release or continuous builds, then we'll also build for the
|
# If we're generating an archive for release or continuous builds, then we'll also build for the
|
||||||
@@ -41,4 +16,3 @@ if [[ "${GENERATE_ARCHIVES}" ]]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
./build.sh -i -p ios -c $BUILD_SIMULATOR $GENERATE_ARCHIVES $BUILD_DEBUG $BUILD_RELEASE
|
./build.sh -i -p ios -c $BUILD_SIMULATOR $GENERATE_ARCHIVES $BUILD_DEBUG $BUILD_RELEASE
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
curl -OL https://github.com/ninja-build/ninja/releases/download/v1.10.2/ninja-mac.zip
|
|
||||||
unzip -q ninja-mac.zip
|
|
||||||
chmod +x ninja
|
|
||||||
export PATH="$PWD:$PATH"
|
|
||||||
@@ -1,39 +1,11 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Usage: the first argument selects the build type:
|
source `dirname $0`/../common/ci-check.sh
|
||||||
# - release, to build release only
|
|
||||||
# - debug, to build debug only
|
|
||||||
# - continuous, to build release and debug
|
|
||||||
# - presubmit, for presubmit builds
|
|
||||||
#
|
|
||||||
# The default is release
|
|
||||||
|
|
||||||
echo "This script is intended to run in a CI environment and may modify your current environment."
|
|
||||||
echo "Please refer to BUILDING.md for more information."
|
|
||||||
|
|
||||||
read -r -p "Do you wish to proceed (y/n)? " choice
|
|
||||||
case "${choice}" in
|
|
||||||
y|Y)
|
|
||||||
echo "Build will proceed..."
|
|
||||||
;;
|
|
||||||
n|N)
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
set -x
|
set -x
|
||||||
|
|
||||||
# build-common.sh will generate the following variables:
|
|
||||||
# $GENERATE_ARCHIVES
|
|
||||||
# $BUILD_DEBUG
|
|
||||||
# $BUILD_RELEASE
|
|
||||||
source `dirname $0`/../common/ci-common.sh
|
|
||||||
source `dirname $0`/ci-common.sh
|
|
||||||
source `dirname $0`/../common/build-common.sh
|
source `dirname $0`/../common/build-common.sh
|
||||||
|
|
||||||
pushd `dirname $0`/../.. > /dev/null
|
pushd `dirname $0`/../.. > /dev/null
|
||||||
|
|
||||||
./build.sh -c $RUN_TESTS $GENERATE_ARCHIVES $BUILD_DEBUG $BUILD_RELEASE
|
./build.sh -c $RUN_TESTS $GENERATE_ARCHIVES $BUILD_DEBUG $BUILD_RELEASE
|
||||||
|
|||||||
@@ -1,38 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# version of clang we want to use
|
|
||||||
export GITHUB_CLANG_VERSION=14
|
|
||||||
# version of CMake to use instead of the default one
|
|
||||||
export GITHUB_CMAKE_VERSION=3.19.5
|
|
||||||
# version of ninja to use
|
|
||||||
export GITHUB_NINJA_VERSION=1.10.2
|
|
||||||
|
|
||||||
# Steps for GitHub Workflows
|
|
||||||
if [[ "$GITHUB_WORKFLOW" ]]; then
|
|
||||||
# Install ninja
|
|
||||||
wget -q https://github.com/ninja-build/ninja/releases/download/v$GITHUB_NINJA_VERSION/ninja-linux.zip
|
|
||||||
unzip -q ninja-linux.zip
|
|
||||||
export PATH="$PWD:$PATH"
|
|
||||||
|
|
||||||
# Install CMake
|
|
||||||
mkdir -p cmake
|
|
||||||
cd cmake
|
|
||||||
|
|
||||||
sudo wget https://github.com/Kitware/CMake/releases/download/v$GITHUB_CMAKE_VERSION/cmake-$GITHUB_CMAKE_VERSION-Linux-x86_64.sh
|
|
||||||
sudo chmod +x ./cmake-$GITHUB_CMAKE_VERSION-Linux-x86_64.sh
|
|
||||||
sudo ./cmake-$GITHUB_CMAKE_VERSION-Linux-x86_64.sh --skip-license > /dev/null
|
|
||||||
sudo update-alternatives --install /usr/bin/cmake cmake $(pwd)/bin/cmake 1000 --force
|
|
||||||
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
sudo wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install clang-$GITHUB_CLANG_VERSION libc++-$GITHUB_CLANG_VERSION-dev libc++abi-$GITHUB_CLANG_VERSION-dev
|
|
||||||
sudo apt-get install mesa-common-dev libxi-dev libxxf86vm-dev
|
|
||||||
|
|
||||||
# For dawn
|
|
||||||
sudo apt-get install libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libx11-xcb-dev
|
|
||||||
|
|
||||||
sudo update-alternatives --install /usr/bin/cc cc /usr/bin/clang-${GITHUB_CLANG_VERSION} 100
|
|
||||||
sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++-${GITHUB_CLANG_VERSION} 100
|
|
||||||
fi
|
|
||||||
@@ -1,35 +1,11 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Usage: the first argument selects the build type:
|
source `dirname $0`/../common/ci-check.sh
|
||||||
# - release, to build release only
|
|
||||||
# - debug, to build debug only
|
|
||||||
# - continuous, to build release and debug
|
|
||||||
# - presubmit, for presubmit builds
|
|
||||||
#
|
|
||||||
# The default is release
|
|
||||||
|
|
||||||
echo "This script is intended to run in a CI environment and may modify your current environment."
|
|
||||||
echo "Please refer to BUILDING.md for more information."
|
|
||||||
|
|
||||||
read -r -p "Do you wish to proceed (y/n)? " choice
|
|
||||||
case "${choice}" in
|
|
||||||
y|Y)
|
|
||||||
echo "Build will proceed..."
|
|
||||||
;;
|
|
||||||
n|N)
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
set -x
|
set -x
|
||||||
|
|
||||||
source `dirname $0`/../common/ci-common.sh
|
|
||||||
source `dirname $0`/ci-common.sh
|
|
||||||
source `dirname $0`/../common/build-common.sh
|
source `dirname $0`/../common/build-common.sh
|
||||||
|
|
||||||
pushd `dirname $0`/../.. > /dev/null
|
pushd `dirname $0`/../.. > /dev/null
|
||||||
|
|
||||||
./build.sh -c $RUN_TESTS $GENERATE_ARCHIVES $BUILD_DEBUG $BUILD_RELEASE
|
./build.sh -c $RUN_TESTS $GENERATE_ARCHIVES $BUILD_DEBUG $BUILD_RELEASE
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
curl -OL https://github.com/ninja-build/ninja/releases/download/v1.10.2/ninja-mac.zip
|
|
||||||
unzip -q ninja-mac.zip
|
|
||||||
chmod +x ninja
|
|
||||||
# Install ninja globally for AGP
|
|
||||||
cp ninja /usr/local/bin
|
|
||||||
export PATH="$PWD:$PATH"
|
|
||||||
@@ -31,10 +31,16 @@ set(DIST_ARCH arm64-v8a)
|
|||||||
string(TOLOWER ${CMAKE_HOST_SYSTEM_NAME} HOST_NAME_L)
|
string(TOLOWER ${CMAKE_HOST_SYSTEM_NAME} HOST_NAME_L)
|
||||||
file(TO_CMAKE_PATH $ENV{ANDROID_HOME} ANDROID_HOME_UNIX)
|
file(TO_CMAKE_PATH $ENV{ANDROID_HOME} ANDROID_HOME_UNIX)
|
||||||
|
|
||||||
|
message(STATUS "Try using NDK \'${FILAMENT_NDK_VERSION}\'")
|
||||||
if (NOT FILAMENT_NDK_VERSION)
|
if (NOT FILAMENT_NDK_VERSION)
|
||||||
file(READ "${CMAKE_CURRENT_LIST_DIR}/android/ndk.version" FILAMENT_NDK_VERSION)
|
file(READ "${CMAKE_CURRENT_LIST_DIR}/common/versions" VERSIONS_STR)
|
||||||
string(REGEX MATCH "^\\d+" FILAMENT_NDK_VERSION ${FILAMENT_NDK_VERSION})
|
string(REGEX MATCH "GITHUB_NDK_VERSION=(\\d+)" _UNUSED ${VERSIONS_STR})
|
||||||
|
if(CMAKE_MATCH_1)
|
||||||
|
set(FILAMENT_NDK_VERSION "${CMAKE_MATCH_1}")
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
message(STATUS "Using NDK \'${FILAMENT_NDK_VERSION}\'")
|
||||||
|
|
||||||
file(GLOB NDK_VERSIONS LIST_DIRECTORIES true ${ANDROID_HOME_UNIX}/ndk/${FILAMENT_NDK_VERSION}*)
|
file(GLOB NDK_VERSIONS LIST_DIRECTORIES true ${ANDROID_HOME_UNIX}/ndk/${FILAMENT_NDK_VERSION}*)
|
||||||
list(SORT NDK_VERSIONS)
|
list(SORT NDK_VERSIONS)
|
||||||
list(GET NDK_VERSIONS -1 NDK_VERSION)
|
list(GET NDK_VERSIONS -1 NDK_VERSION)
|
||||||
|
|||||||
@@ -32,10 +32,16 @@ set(DIST_ARCH armeabi-v7a)
|
|||||||
string(TOLOWER ${CMAKE_HOST_SYSTEM_NAME} HOST_NAME_L)
|
string(TOLOWER ${CMAKE_HOST_SYSTEM_NAME} HOST_NAME_L)
|
||||||
file(TO_CMAKE_PATH $ENV{ANDROID_HOME} ANDROID_HOME_UNIX)
|
file(TO_CMAKE_PATH $ENV{ANDROID_HOME} ANDROID_HOME_UNIX)
|
||||||
|
|
||||||
|
message(STATUS "Try using NDK \'${FILAMENT_NDK_VERSION}\'")
|
||||||
if (NOT FILAMENT_NDK_VERSION)
|
if (NOT FILAMENT_NDK_VERSION)
|
||||||
file(READ "${CMAKE_CURRENT_LIST_DIR}/android/ndk.version" FILAMENT_NDK_VERSION)
|
file(READ "${CMAKE_CURRENT_LIST_DIR}/common/versions" VERSIONS_STR)
|
||||||
string(REGEX MATCH "^\\d+" FILAMENT_NDK_VERSION ${FILAMENT_NDK_VERSION})
|
string(REGEX MATCH "GITHUB_NDK_VERSION=(\\d+)" _UNUSED ${VERSIONS_STR})
|
||||||
|
if(CMAKE_MATCH_1)
|
||||||
|
set(FILAMENT_NDK_VERSION "${CMAKE_MATCH_1}")
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
message(STATUS "Using NDK \'${FILAMENT_NDK_VERSION}\'")
|
||||||
|
|
||||||
file(GLOB NDK_VERSIONS LIST_DIRECTORIES true ${ANDROID_HOME_UNIX}/ndk/${FILAMENT_NDK_VERSION}*)
|
file(GLOB NDK_VERSIONS LIST_DIRECTORIES true ${ANDROID_HOME_UNIX}/ndk/${FILAMENT_NDK_VERSION}*)
|
||||||
list(SORT NDK_VERSIONS)
|
list(SORT NDK_VERSIONS)
|
||||||
list(GET NDK_VERSIONS -1 NDK_VERSION)
|
list(GET NDK_VERSIONS -1 NDK_VERSION)
|
||||||
|
|||||||
@@ -31,10 +31,16 @@ set(DIST_ARCH x86)
|
|||||||
string(TOLOWER ${CMAKE_HOST_SYSTEM_NAME} HOST_NAME_L)
|
string(TOLOWER ${CMAKE_HOST_SYSTEM_NAME} HOST_NAME_L)
|
||||||
file(TO_CMAKE_PATH $ENV{ANDROID_HOME} ANDROID_HOME_UNIX)
|
file(TO_CMAKE_PATH $ENV{ANDROID_HOME} ANDROID_HOME_UNIX)
|
||||||
|
|
||||||
|
message(STATUS "Try using NDK \'${FILAMENT_NDK_VERSION}\'")
|
||||||
if (NOT FILAMENT_NDK_VERSION)
|
if (NOT FILAMENT_NDK_VERSION)
|
||||||
file(READ "${CMAKE_CURRENT_LIST_DIR}/android/ndk.version" FILAMENT_NDK_VERSION)
|
file(READ "${CMAKE_CURRENT_LIST_DIR}/common/versions" VERSIONS_STR)
|
||||||
string(REGEX MATCH "^\\d+" FILAMENT_NDK_VERSION ${FILAMENT_NDK_VERSION})
|
string(REGEX MATCH "GITHUB_NDK_VERSION=(\\d+)" _UNUSED ${VERSIONS_STR})
|
||||||
|
if(CMAKE_MATCH_1)
|
||||||
|
set(FILAMENT_NDK_VERSION "${CMAKE_MATCH_1}")
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
message(STATUS "Using NDK \'${FILAMENT_NDK_VERSION}\'")
|
||||||
|
|
||||||
file(GLOB NDK_VERSIONS LIST_DIRECTORIES true ${ANDROID_HOME_UNIX}/ndk/${FILAMENT_NDK_VERSION}*)
|
file(GLOB NDK_VERSIONS LIST_DIRECTORIES true ${ANDROID_HOME_UNIX}/ndk/${FILAMENT_NDK_VERSION}*)
|
||||||
list(SORT NDK_VERSIONS)
|
list(SORT NDK_VERSIONS)
|
||||||
list(GET NDK_VERSIONS -1 NDK_VERSION)
|
list(GET NDK_VERSIONS -1 NDK_VERSION)
|
||||||
|
|||||||
@@ -31,10 +31,16 @@ set(DIST_ARCH x86_64)
|
|||||||
string(TOLOWER ${CMAKE_HOST_SYSTEM_NAME} HOST_NAME_L)
|
string(TOLOWER ${CMAKE_HOST_SYSTEM_NAME} HOST_NAME_L)
|
||||||
file(TO_CMAKE_PATH $ENV{ANDROID_HOME} ANDROID_HOME_UNIX)
|
file(TO_CMAKE_PATH $ENV{ANDROID_HOME} ANDROID_HOME_UNIX)
|
||||||
|
|
||||||
|
message(STATUS "Try using NDK \'${FILAMENT_NDK_VERSION}\'")
|
||||||
if (NOT FILAMENT_NDK_VERSION)
|
if (NOT FILAMENT_NDK_VERSION)
|
||||||
file(READ "${CMAKE_CURRENT_LIST_DIR}/android/ndk.version" FILAMENT_NDK_VERSION)
|
file(READ "${CMAKE_CURRENT_LIST_DIR}/common/versions" VERSIONS_STR)
|
||||||
string(REGEX MATCH "^\\d+" FILAMENT_NDK_VERSION ${FILAMENT_NDK_VERSION})
|
string(REGEX MATCH "GITHUB_NDK_VERSION=(\\d+)" _UNUSED ${VERSIONS_STR})
|
||||||
|
if(CMAKE_MATCH_1)
|
||||||
|
set(FILAMENT_NDK_VERSION "${CMAKE_MATCH_1}")
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
message(STATUS "Using NDK \'${FILAMENT_NDK_VERSION}\'")
|
||||||
|
|
||||||
file(GLOB NDK_VERSIONS LIST_DIRECTORIES true ${ANDROID_HOME_UNIX}/ndk/${FILAMENT_NDK_VERSION}*)
|
file(GLOB NDK_VERSIONS LIST_DIRECTORIES true ${ANDROID_HOME_UNIX}/ndk/${FILAMENT_NDK_VERSION}*)
|
||||||
list(SORT NDK_VERSIONS)
|
list(SORT NDK_VERSIONS)
|
||||||
list(GET NDK_VERSIONS -1 NDK_VERSION)
|
list(GET NDK_VERSIONS -1 NDK_VERSION)
|
||||||
|
|||||||
@@ -1,34 +1,10 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Usage: the first argument selects the build type:
|
source `dirname $0`/../common/ci-check.sh
|
||||||
# - release, to build release only
|
|
||||||
# - debug, to build debug only
|
|
||||||
# - continuous, to build release and debug
|
|
||||||
# - presubmit, for presubmit builds
|
|
||||||
#
|
|
||||||
# The default is release
|
|
||||||
|
|
||||||
echo "This script is intended to run in a CI environment and may modify your current environment."
|
|
||||||
echo "Please refer to BUILDING.md for more information."
|
|
||||||
|
|
||||||
read -r -p "Do you wish to proceed (y/n)? " choice
|
|
||||||
case "${choice}" in
|
|
||||||
y|Y)
|
|
||||||
echo "Build will proceed..."
|
|
||||||
;;
|
|
||||||
n|N)
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
set -x
|
set -x
|
||||||
|
|
||||||
source `dirname $0`/../common/ci-common.sh
|
|
||||||
source `dirname $0`/ci-common.sh
|
|
||||||
source `dirname $0`/../common/build-common.sh
|
source `dirname $0`/../common/build-common.sh
|
||||||
pushd `dirname $0`/../.. > /dev/null
|
pushd `dirname $0`/../.. > /dev/null
|
||||||
|
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
if [ `uname` == "Linux" ];then
|
|
||||||
source `dirname $0`/../linux/ci-common.sh
|
|
||||||
elif [ `uname` == "Darwin" ];then
|
|
||||||
curl -OL https://github.com/ninja-build/ninja/releases/download/v1.10.2/ninja-mac.zip
|
|
||||||
unzip -q ninja-mac.zip
|
|
||||||
else
|
|
||||||
echo "Unsupported OS"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
chmod +x ninja
|
|
||||||
export PATH="$PWD:$PATH"
|
|
||||||
|
|
||||||
# Install emscripten.
|
|
||||||
curl -L https://github.com/emscripten-core/emsdk/archive/refs/tags/3.1.60.zip > emsdk.zip
|
|
||||||
unzip emsdk.zip ; mv emsdk-* emsdk ; cd emsdk
|
|
||||||
./emsdk install latest
|
|
||||||
./emsdk activate latest
|
|
||||||
source ./emsdk_env.sh
|
|
||||||
|
|
||||||
export EMSDK="$PWD"
|
|
||||||
cd ..
|
|
||||||
@@ -47,7 +47,11 @@ if "%RUNNING_LOCALLY%" == "1" (
|
|||||||
set "PATH=%PATH%;C:\Program Files\7-Zip"
|
set "PATH=%PATH%;C:\Program Files\7-Zip"
|
||||||
)
|
)
|
||||||
|
|
||||||
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\%VISUAL_STUDIO_VERSION%\VC\Auxiliary\Build\vcvars64.bat"
|
:: Outdated windows-2019 pattern
|
||||||
|
:: call "C:\Program Files (x86)\Microsoft Visual Studio\2019\%VISUAL_STUDIO_VERSION%\VC\Auxiliary\Build\vcvars64.bat"
|
||||||
|
|
||||||
|
call "C:\Program Files\Microsoft Visual Studio\2022\%VISUAL_STUDIO_VERSION%\VC\Auxiliary\Build\vcvars64.bat"
|
||||||
|
echo Passed vcvars64.bat
|
||||||
if errorlevel 1 exit /b %errorlevel%
|
if errorlevel 1 exit /b %errorlevel%
|
||||||
|
|
||||||
msbuild /version
|
msbuild /version
|
||||||
@@ -107,7 +111,7 @@ cd out\cmake-%variant%
|
|||||||
if errorlevel 1 exit /b %errorlevel%
|
if errorlevel 1 exit /b %errorlevel%
|
||||||
|
|
||||||
cmake ..\.. ^
|
cmake ..\.. ^
|
||||||
-G "Visual Studio 16 2019" ^
|
-G "Visual Studio 17 2022" ^
|
||||||
-A x64 ^
|
-A x64 ^
|
||||||
%flag% ^
|
%flag% ^
|
||||||
-DCMAKE_INSTALL_PREFIX=..\%variant% ^
|
-DCMAKE_INSTALL_PREFIX=..\%variant% ^
|
||||||
|
|||||||
@@ -166,7 +166,7 @@ This document is part of the <a href="https://github.com/google/filament">Filame
|
|||||||
</p><ul>
|
</p><ul>
|
||||||
<li class="minus"><a href="https://github.com/romainguy">Romain Guy</a>, <a href="https://twitter.com/romainguy">@romainguy</a>
|
<li class="minus"><a href="https://github.com/romainguy">Romain Guy</a>, <a href="https://twitter.com/romainguy">@romainguy</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="minus"><a href="https://github.com/pixelflinger">Mathias Agopian</a>, <a href="https://twitter.com/darthmoosious">@darthmoosious</a></li></ul>
|
<li class="minus"><a href="https://github.com/pixelflinger">Mathias Agopian</a>, <a href="https://bsky.app/profile/pixelflinger.bsky.social">@pixelflinger</a></li></ul>
|
||||||
|
|
||||||
<p></p>
|
<p></p>
|
||||||
<a class="target" name="overview"> </a><a class="target" name="overview"> </a><a class="target" name="toc2"> </a><h1>Overview</h1>
|
<a class="target" name="overview"> </a><a class="target" name="overview"> </a><a class="target" name="toc2"> </a><h1>Overview</h1>
|
||||||
@@ -259,26 +259,27 @@ in <a href="#table_standardproperties">table 1</a>.
|
|||||||
</p><div class="table">
|
</p><div class="table">
|
||||||
<table class="table"><tbody><tr><th style="text-align:right"> Property </th><th style="text-align:left"> Definition </th></tr>
|
<table class="table"><tbody><tr><th style="text-align:right"> Property </th><th style="text-align:left"> Definition </th></tr>
|
||||||
<tr><td style="text-align:right"> <strong class="asterisk">baseColor</strong> </td><td style="text-align:left"> Diffuse albedo for non-metallic surfaces, and specular color for metallic surfaces </td></tr>
|
<tr><td style="text-align:right"> <strong class="asterisk">baseColor</strong> </td><td style="text-align:left"> Diffuse albedo for non-metallic surfaces, and specular color for metallic surfaces </td></tr>
|
||||||
<tr><td style="text-align:right"> <strong class="asterisk">metallic</strong> </td><td style="text-align:left"> Whether a surface appears to be dielectric (0.0) or conductor (1.0). Often used as a binary value (0 or 1) </td></tr>
|
|
||||||
<tr><td style="text-align:right"> <strong class="asterisk">roughness</strong> </td><td style="text-align:left"> Perceived smoothness (1.0) or roughness (0.0) of a surface. Smooth surfaces exhibit sharp reflections </td></tr>
|
<tr><td style="text-align:right"> <strong class="asterisk">roughness</strong> </td><td style="text-align:left"> Perceived smoothness (1.0) or roughness (0.0) of a surface. Smooth surfaces exhibit sharp reflections </td></tr>
|
||||||
|
<tr><td style="text-align:right"> <strong class="asterisk">metallic</strong> </td><td style="text-align:left"> Whether a surface appears to be dielectric (0.0) or conductor (1.0). Often used as a binary value (0 or 1) </td></tr>
|
||||||
<tr><td style="text-align:right"> <strong class="asterisk">reflectance</strong> </td><td style="text-align:left"> Fresnel reflectance at normal incidence for dielectric surfaces. This directly controls the strength of the reflections </td></tr>
|
<tr><td style="text-align:right"> <strong class="asterisk">reflectance</strong> </td><td style="text-align:left"> Fresnel reflectance at normal incidence for dielectric surfaces. This directly controls the strength of the reflections </td></tr>
|
||||||
<tr><td style="text-align:right"> <strong class="asterisk">sheenColor</strong> </td><td style="text-align:left"> Strength of the sheen layer </td></tr>
|
<tr><td style="text-align:right"> <strong class="asterisk">ambientOcclusion</strong> </td><td style="text-align:left"> Defines how much of the ambient light is accessible to a surface point. It is a per-pixel shadowing factor between 0.0 and 1.0 </td></tr>
|
||||||
<tr><td style="text-align:right"> <strong class="asterisk">sheenRoughness</strong> </td><td style="text-align:left"> Perceived smoothness or roughness of the sheen layer </td></tr>
|
|
||||||
<tr><td style="text-align:right"> <strong class="asterisk">clearCoat</strong> </td><td style="text-align:left"> Strength of the clear coat layer </td></tr>
|
<tr><td style="text-align:right"> <strong class="asterisk">clearCoat</strong> </td><td style="text-align:left"> Strength of the clear coat layer </td></tr>
|
||||||
<tr><td style="text-align:right"> <strong class="asterisk">clearCoatRoughness</strong> </td><td style="text-align:left"> Perceived smoothness or roughness of the clear coat layer </td></tr>
|
<tr><td style="text-align:right"> <strong class="asterisk">clearCoatRoughness</strong> </td><td style="text-align:left"> Perceived smoothness or roughness of the clear coat layer </td></tr>
|
||||||
|
<tr><td style="text-align:right"> <strong class="asterisk">clearCoatNormal</strong> </td><td style="text-align:left"> A detail normal used to perturb the clear coat layer using <em class="underscore">bump mapping</em> (<em class="underscore">normal mapping</em>) </td></tr>
|
||||||
<tr><td style="text-align:right"> <strong class="asterisk">anisotropy</strong> </td><td style="text-align:left"> Amount of anisotropy in either the tangent or bitangent direction </td></tr>
|
<tr><td style="text-align:right"> <strong class="asterisk">anisotropy</strong> </td><td style="text-align:left"> Amount of anisotropy in either the tangent or bitangent direction </td></tr>
|
||||||
<tr><td style="text-align:right"> <strong class="asterisk">anisotropyDirection</strong> </td><td style="text-align:left"> Local surface direction in tangent space </td></tr>
|
<tr><td style="text-align:right"> <strong class="asterisk">anisotropyDirection</strong> </td><td style="text-align:left"> Local surface direction in tangent space </td></tr>
|
||||||
<tr><td style="text-align:right"> <strong class="asterisk">ambientOcclusion</strong> </td><td style="text-align:left"> Defines how much of the ambient light is accessible to a surface point. It is a per-pixel shadowing factor between 0.0 and 1.0 </td></tr>
|
|
||||||
<tr><td style="text-align:right"> <strong class="asterisk">normal</strong> </td><td style="text-align:left"> A detail normal used to perturb the surface using <em class="underscore">bump mapping</em> (<em class="underscore">normal mapping</em>) </td></tr>
|
|
||||||
<tr><td style="text-align:right"> <strong class="asterisk">bentNormal</strong> </td><td style="text-align:left"> A normal pointing in the average unoccluded direction. Can be used to improve indirect lighting quality </td></tr>
|
|
||||||
<tr><td style="text-align:right"> <strong class="asterisk">clearCoatNormal</strong> </td><td style="text-align:left"> A detail normal used to perturb the clear coat layer using <em class="underscore">bump mapping</em> (<em class="underscore">normal mapping</em>) </td></tr>
|
|
||||||
<tr><td style="text-align:right"> <strong class="asterisk">emissive</strong> </td><td style="text-align:left"> Additional diffuse albedo to simulate emissive surfaces (such as neons, etc.) This property is mostly useful in an HDR pipeline with a bloom pass </td></tr>
|
|
||||||
<tr><td style="text-align:right"> <strong class="asterisk">postLightingColor</strong> </td><td style="text-align:left"> Additional color that can be blended with the result of the lighting computations. See <code>postLightingBlending</code> </td></tr>
|
|
||||||
<tr><td style="text-align:right"> <strong class="asterisk">ior</strong> </td><td style="text-align:left"> Index of refraction, either for refractive objects or as an alternative to reflectance </td></tr>
|
|
||||||
<tr><td style="text-align:right"> <strong class="asterisk">transmission</strong> </td><td style="text-align:left"> Defines how much of the diffuse light of a dielectric is transmitted through the object, in other words this defines how transparent an object is </td></tr>
|
|
||||||
<tr><td style="text-align:right"> <strong class="asterisk">absorption</strong> </td><td style="text-align:left"> Absorption factor for refractive objects </td></tr>
|
|
||||||
<tr><td style="text-align:right"> <strong class="asterisk">microThickness</strong> </td><td style="text-align:left"> Thickness of the thin layer of refractive objects </td></tr>
|
|
||||||
<tr><td style="text-align:right"> <strong class="asterisk">thickness</strong> </td><td style="text-align:left"> Thickness of the solid volume of refractive objects </td></tr>
|
<tr><td style="text-align:right"> <strong class="asterisk">thickness</strong> </td><td style="text-align:left"> Thickness of the solid volume of refractive objects </td></tr>
|
||||||
|
<tr><td style="text-align:right"> <strong class="asterisk">sheenColor</strong> </td><td style="text-align:left"> Strength of the sheen layer </td></tr>
|
||||||
|
<tr><td style="text-align:right"> <strong class="asterisk">sheenRoughness</strong> </td><td style="text-align:left"> Perceived smoothness or roughness of the sheen layer </td></tr>
|
||||||
|
<tr><td style="text-align:right"> <strong class="asterisk">emissive</strong> </td><td style="text-align:left"> Additional diffuse albedo to simulate emissive surfaces (such as neons, etc.) This property is mostly useful in an HDR pipeline with a bloom pass </td></tr>
|
||||||
|
<tr><td style="text-align:right"> <strong class="asterisk">normal</strong> </td><td style="text-align:left"> A detail normal used to perturb the surface using <em class="underscore">bump mapping</em> (<em class="underscore">normal mapping</em>) </td></tr>
|
||||||
|
<tr><td style="text-align:right"> <strong class="asterisk">postLightingColor</strong> </td><td style="text-align:left"> Additional color that can be blended with the result of the lighting computations. See <code>postLightingBlending</code> </td></tr>
|
||||||
|
<tr><td style="text-align:right"> <strong class="asterisk">absorption</strong> </td><td style="text-align:left"> Absorption factor for refractive objects </td></tr>
|
||||||
|
<tr><td style="text-align:right"> <strong class="asterisk">transmission</strong> </td><td style="text-align:left"> Defines how much of the diffuse light of a dielectric is transmitted through the object, in other words this defines how transparent an object is </td></tr>
|
||||||
|
<tr><td style="text-align:right"> <strong class="asterisk">ior</strong> </td><td style="text-align:left"> Index of refraction, either for refractive objects or as an alternative to reflectance </td></tr>
|
||||||
|
<tr><td style="text-align:right"> <strong class="asterisk">microThickness</strong> </td><td style="text-align:left"> Thickness of the thin layer of refractive objects </td></tr>
|
||||||
|
<tr><td style="text-align:right"> <strong class="asterisk">bentNormal</strong> </td><td style="text-align:left"> A normal pointing in the average unoccluded direction. Can be used to improve indirect lighting quality </td></tr>
|
||||||
|
<tr><td style="text-align:right"> <strong class="asterisk">shadowStrength</strong> </td><td style="text-align:left"> Strength factor between 0 and 1 for all shadows received by this material </td></tr>
|
||||||
</tbody></table><center><div class="tablecaption"><a class="target" name="table_standardproperties"> </a><b style="font-style:normal;">Table 1:</b> Properties of the standard model</div></center></div>
|
</tbody></table><center><div class="tablecaption"><a class="target" name="table_standardproperties"> </a><b style="font-style:normal;">Table 1:</b> Properties of the standard model</div></center></div>
|
||||||
|
|
||||||
<p></p><p>
|
<p></p><p>
|
||||||
@@ -1486,10 +1487,13 @@ non-shader data.
|
|||||||
</p><dl><dt>Type</dt><dd><p> array of parameter objects
|
</p><dl><dt>Type</dt><dd><p> array of parameter objects
|
||||||
|
|
||||||
</p></dd><dt>Value</dt><dd><p> Each entry is an object with the properties <code>name</code> and <code>type</code>, both of <code>string</code> type. The
|
</p></dd><dt>Value</dt><dd><p> Each entry is an object with the properties <code>name</code> and <code>type</code>, both of <code>string</code> type. The
|
||||||
name must be a valid GLSL identifier. Entries also have an optional <code>precision</code>, which can be
|
name must be a valid GLSL identifier. Entries have an optional <code>precision</code>, which can be
|
||||||
one of <code>default</code> (best precision for the platform, typically <code>high</code> on desktop, <code>medium</code> on
|
one of <code>default</code> (best precision for the platform, typically <code>high</code> on desktop, <code>medium</code> on
|
||||||
mobile), <code>low</code>, <code>medium</code>, <code>high</code>. The type must be one of the types described in
|
mobile), <code>low</code>, <code>medium</code>, <code>high</code>. The type must be one of the types described in
|
||||||
<a href="#table_materialparamstypes">table 14</a>.
|
<a href="#table_materialparamstypes">table 14</a>. For Android external textures, entries also have an optional
|
||||||
|
transformName parameter to specify the name of the material parameter that will be
|
||||||
|
used to expose the transform matrix associated with the external sampler. In iOS and Vulkan,
|
||||||
|
this will always be identity.
|
||||||
|
|
||||||
</p></dd></dl><div class="table">
|
</p></dd></dl><div class="table">
|
||||||
<table class="table"><tbody><tr><th style="text-align:left"> Type </th><th style="text-align:left"> Description </th></tr>
|
<table class="table"><tbody><tr><th style="text-align:left"> Type </th><th style="text-align:left"> Description </th></tr>
|
||||||
@@ -1752,7 +1756,13 @@ non-shader data.
|
|||||||
when selecting any shading model that is not <code>unlit</code>. See the shader sections of this document
|
when selecting any shading model that is not <code>unlit</code>. See the shader sections of this document
|
||||||
for more information on how to access these attributes from the shaders.
|
for more information on how to access these attributes from the shaders.
|
||||||
|
|
||||||
</p></dd></dl><p></p><pre class="listing tilde"><code><span class="line">material {</span>
|
</p></dd></dl><div class="admonition note"><div class="admonition-title"> Interaction with custom variables</div>
|
||||||
|
|
||||||
|
<p></p><p>
|
||||||
|
|
||||||
|
When the <code>color</code> attribute is specified, only four custom variables are available instead of five.</p></div>
|
||||||
|
|
||||||
|
<p></p><pre class="listing tilde"><code><span class="line">material {</span>
|
||||||
<span class="line"> parameters : [</span>
|
<span class="line"> parameters : [</span>
|
||||||
<span class="line"> {</span>
|
<span class="line"> {</span>
|
||||||
<span class="line"> type : sampler2d,</span>
|
<span class="line"> type : sampler2d,</span>
|
||||||
@@ -1779,7 +1789,7 @@ non-shader data.
|
|||||||
|
|
||||||
</p><dl><dt>Type</dt><dd><p> array of <code>string</code>
|
</p><dl><dt>Type</dt><dd><p> array of <code>string</code>
|
||||||
|
|
||||||
</p></dd><dt>Value</dt><dd><p> Up to 4 strings, each must be a valid GLSL identifier.
|
</p></dd><dt>Value</dt><dd><p> Up to 5 strings, each must be a valid GLSL identifier.
|
||||||
|
|
||||||
</p></dd><dt>Description</dt><dd><p> Defines custom interpolants (or variables) that are output by the material's vertex shader.
|
</p></dd><dt>Description</dt><dd><p> Defines custom interpolants (or variables) that are output by the material's vertex shader.
|
||||||
Each entry of the array defines the name of an interpolant. The full name in the fragment
|
Each entry of the array defines the name of an interpolant. The full name in the fragment
|
||||||
@@ -1794,7 +1804,14 @@ non-shader data.
|
|||||||
particular if <code>default</code> is specified the default precision is used is the fragment shader
|
particular if <code>default</code> is specified the default precision is used is the fragment shader
|
||||||
(<code>mediump</code>) and in the vertex shader (<code>highp</code>).
|
(<code>mediump</code>) and in the vertex shader (<code>highp</code>).
|
||||||
|
|
||||||
</p></dd></dl><p></p><pre class="listing tilde"><code><span class="line">material {</span>
|
</p></dd></dl><div class="admonition warning"><div class="admonition-title"> Interaction with required attributes</div>
|
||||||
|
|
||||||
|
<p></p><p>
|
||||||
|
|
||||||
|
If the <code>color</code> attribute is specified in the <code>required</code> list, then only four variables can be used
|
||||||
|
instead of five.</p></div>
|
||||||
|
|
||||||
|
<p></p><pre class="listing tilde"><code><span class="line">material {</span>
|
||||||
<span class="line"> name : Skybox,</span>
|
<span class="line"> name : Skybox,</span>
|
||||||
<span class="line"> parameters : [</span>
|
<span class="line"> parameters : [</span>
|
||||||
<span class="line"> {</span>
|
<span class="line"> {</span>
|
||||||
|
|||||||
@@ -1027,8 +1027,11 @@ samplerCubemap | Cubemap texture
|
|||||||
[Table [materialParamsTypes]: Material parameter types]
|
[Table [materialParamsTypes]: Material parameter types]
|
||||||
|
|
||||||
Samplers
|
Samplers
|
||||||
: Sampler types can also specify a `format` which can be either `int` or `float` (defaults to
|
: Sampler types can have the following fields:
|
||||||
`float`).
|
- `format` : which can be either `int` or `float` (defaults to `float`).
|
||||||
|
- `multisample` : a boolean to indicate whether the sampler is meant for multisampling (defaults to `false`)
|
||||||
|
- `unfilterable` : a boolean to indicate whether the sampling is not filtered (defaults to `false`)
|
||||||
|
|
||||||
|
|
||||||
Arrays
|
Arrays
|
||||||
: A parameter can define an array of values by appending `[size]` after the type name, where
|
: A parameter can define an array of values by appending `[size]` after the type name, where
|
||||||
|
|||||||
@@ -49,7 +49,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="left"><a href="#EntityManager">EntityManager</a></td>
|
<td align="left"><a href="#EntityManager">EntityManager</a></td>
|
||||||
<td align="left">Singleton used for constructing entities in Filament's ECS.</td>
|
<td align="left">Singleton used for constructing entities in Filament's ECS.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="left"><a href="#Frustum">Frustum</a></td>
|
<td align="left"><a href="#Frustum">Frustum</a></td>
|
||||||
@@ -89,7 +89,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="left"><a href="#Renderer">Renderer</a></td>
|
<td align="left"><a href="#Renderer">Renderer</a></td>
|
||||||
<td align="left">Represents the platform's native window.</td>
|
<td align="left">Represents the platform's native window.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="left"><a href="#Scene">Scene</a></td>
|
<td align="left"><a href="#Scene">Scene</a></td>
|
||||||
@@ -97,7 +97,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="left"><a href="#SwapChain">SwapChain</a></td>
|
<td align="left"><a href="#SwapChain">SwapChain</a></td>
|
||||||
<td align="left">Represents the platform's native rendering surface.</td>
|
<td align="left">Represents the platform's native rendering surface.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="left"><a href="#Texture">Texture</a></td>
|
<td align="left"><a href="#Texture">Texture</a></td>
|
||||||
@@ -604,11 +604,11 @@
|
|||||||
</ul>
|
</ul>
|
||||||
<p>To create an entity with no components, use <a href="#EntityManager">EntityManager</a>.
|
<p>To create an entity with no components, use <a href="#EntityManager">EntityManager</a>.
|
||||||
TODO: It would be better to expose these as JS numbers rather than as JS objects.
|
TODO: It would be better to expose these as JS numbers rather than as JS objects.
|
||||||
This would also be more consistent with Filament's Java bindings.</p>
|
This would also be more consistent with Filament's Java bindings.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class='classdoc'>
|
<div class='classdoc'>
|
||||||
<h2>class <a id='EntityManager' href='#EntityManager'>EntityManager</a></h2>
|
<h2>class <a id='EntityManager' href='#EntityManager'>EntityManager</a></h2>
|
||||||
<p>Singleton used for constructing entities in Filament's ECS.</p>
|
<p>Singleton used for constructing entities in Filament's ECS.</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li><strong>entityManager.create()</strong>
|
<li><strong>entityManager.create()</strong>
|
||||||
<ul>
|
<ul>
|
||||||
@@ -742,7 +742,7 @@ properties.</p>
|
|||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>Be sure to call the instance's <code>delete</code> method when you're done with it.</p>
|
<p>Be sure to call the instance's <code>delete</code> method when you're done with it.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class='classdoc'>
|
<div class='classdoc'>
|
||||||
<h2>class <a id='PixelBufferDescriptor' href='#PixelBufferDescriptor'>PixelBufferDescriptor</a></h2>
|
<h2>class <a id='PixelBufferDescriptor' href='#PixelBufferDescriptor'>PixelBufferDescriptor</a></h2>
|
||||||
@@ -780,11 +780,11 @@ properties.</p>
|
|||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>Be sure to call the instance's <code>delete</code> method when you're done with it.</p>
|
<p>Be sure to call the instance's <code>delete</code> method when you're done with it.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class='classdoc'>
|
<div class='classdoc'>
|
||||||
<h2>class <a id='Renderer' href='#Renderer'>Renderer</a></h2>
|
<h2>class <a id='Renderer' href='#Renderer'>Renderer</a></h2>
|
||||||
<p>Represents the platform's native window.</p>
|
<p>Represents the platform's native window.</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li><strong>renderer.render(swapChain, view)</strong>
|
<li><strong>renderer.render(swapChain, view)</strong>
|
||||||
<ul>
|
<ul>
|
||||||
@@ -803,7 +803,7 @@ properties.</p>
|
|||||||
</div>
|
</div>
|
||||||
<div class='classdoc'>
|
<div class='classdoc'>
|
||||||
<h2>class <a id='SwapChain' href='#SwapChain'>SwapChain</a></h2>
|
<h2>class <a id='SwapChain' href='#SwapChain'>SwapChain</a></h2>
|
||||||
<p>Represents the platform's native rendering surface.</p>
|
<p>Represents the platform's native rendering surface.</p>
|
||||||
<p>See also the <a href="#Engine">Engine</a> methods <code>createSwapChain</code> and <code>destroySwapChain</code>.</p>
|
<p>See also the <a href="#Engine">Engine</a> methods <code>createSwapChain</code> and <code>destroySwapChain</code>.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class='classdoc'>
|
<div class='classdoc'>
|
||||||
@@ -847,7 +847,7 @@ properties.</p>
|
|||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>Be sure to call the instance's <code>delete</code> method when you're done with it.</p>
|
<p>Be sure to call the instance's <code>delete</code> method when you're done with it.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class='classdoc'>
|
<div class='classdoc'>
|
||||||
<h2>class <a id='VertexBuffer' href='#VertexBuffer'>VertexBuffer</a></h2>
|
<h2>class <a id='VertexBuffer' href='#VertexBuffer'>VertexBuffer</a></h2>
|
||||||
@@ -944,7 +944,7 @@ See also the <a href="#Engine">Engine</a> methods <code>createView</code> and <c
|
|||||||
<ul>
|
<ul>
|
||||||
<li><strong>assets</strong>
|
<li><strong>assets</strong>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Array of strings containing URL's of required assets.</li>
|
<li>Array of strings containing URL's of required assets.</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><strong>onDone</strong>
|
<li><strong>onDone</strong>
|
||||||
@@ -954,7 +954,7 @@ See also the <a href="#Engine">Engine</a> methods <code>createView</code> and <c
|
|||||||
</li>
|
</li>
|
||||||
<li><strong>onFetched</strong>
|
<li><strong>onFetched</strong>
|
||||||
<ul>
|
<ul>
|
||||||
<li>optional callback that's invoked after each asset is downloaded.</li>
|
<li>optional callback that's invoked after each asset is downloaded.</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -1001,7 +1001,7 @@ useful for compressed textures. For example, some platforms accept ETC and other
|
|||||||
<ul>
|
<ul>
|
||||||
<li><strong>assets</strong>
|
<li><strong>assets</strong>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Array of strings containing URL's of required assets.</li>
|
<li>Array of strings containing URL's of required assets.</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><strong>onready</strong>
|
<li><strong>onready</strong>
|
||||||
@@ -1010,12 +1010,12 @@ useful for compressed textures. For example, some platforms accept ETC and other
|
|||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>All JavaScript clients must call the init function, passing in a list of asset URL's and a
|
<p>All JavaScript clients must call the init function, passing in a list of asset URL's and a
|
||||||
callback. This callback gets invoked only after all assets have been downloaded and the Filament
|
callback. This callback gets invoked only after all assets have been downloaded and the Filament
|
||||||
WebAssembly module has been loaded. Clients should only pass asset URL's that absolutely must
|
WebAssembly module has been loaded. Clients should only pass asset URL's that absolutely must
|
||||||
be ready at initialization time.
|
be ready at initialization time.
|
||||||
When the callback is called, each downloaded asset is available in the <code>Filament.assets</code> global
|
When the callback is called, each downloaded asset is available in the <code>Filament.assets</code> global
|
||||||
object, which contains a mapping from URL's to Uint8Array objects.</p>
|
object, which contains a mapping from URL's to Uint8Array objects.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class='funcdoc'>
|
<div class='funcdoc'>
|
||||||
<h2>function <a id='loadMathExtensions' href='#loadMathExtensions'>loadMathExtensions</a>()</h2>
|
<h2>function <a id='loadMathExtensions' href='#loadMathExtensions'>loadMathExtensions</a>()</h2>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
textures.</p>
|
textures.</p>
|
||||||
<p>For starters, create a text file called <code>redball.html</code> and copy over the HTML that we used in the
|
<p>For starters, create a text file called <code>redball.html</code> and copy over the HTML that we used in the
|
||||||
<a href="tutorial_triangle.html">previous tutorial</a>. Change the last script tag from <code>triangle.js</code> to <code>redball.js</code>.</p>
|
<a href="tutorial_triangle.html">previous tutorial</a>. Change the last script tag from <code>triangle.js</code> to <code>redball.js</code>.</p>
|
||||||
<p>Next you'll need to get a couple command-line tools: <code>matc</code> and <code>cmgen</code>. You can find these in the
|
<p>Next you'll need to get a couple command-line tools: <code>matc</code> and <code>cmgen</code>. You can find these in the
|
||||||
appropriate <a href="//github.com/google/filament/releases">Filament release</a>. You should choose the
|
appropriate <a href="//github.com/google/filament/releases">Filament release</a>. You should choose the
|
||||||
archive that corresponds to your development machine rather than the one for web, and the version
|
archive that corresponds to your development machine rather than the one for web, and the version
|
||||||
that matches the <code>unpkg.com/filament@x.x.x</code> url in the script tag of <code>redball.html</code> (you may check
|
that matches the <code>unpkg.com/filament@x.x.x</code> url in the script tag of <code>redball.html</code> (you may check
|
||||||
@@ -19,7 +19,7 @@ out the last available release of <a href="https://www.npmjs.com/package/filamen
|
|||||||
<p>The <code>matc</code> tool consumes a text file containing a high-level description of a PBR material, and
|
<p>The <code>matc</code> tool consumes a text file containing a high-level description of a PBR material, and
|
||||||
produces a binary material package that contains shader code and associated metadata. For more
|
produces a binary material package that contains shader code and associated metadata. For more
|
||||||
information, see the official document describing the <a href="https://google.github.io/filament/Materials.md.html">Filament Material System</a>.</p>
|
information, see the official document describing the <a href="https://google.github.io/filament/Materials.md.html">Filament Material System</a>.</p>
|
||||||
<p>Let's try out <code>matc</code>. Create the following file in your favorite text editor and call it
|
<p>Let's try out <code>matc</code>. Create the following file in your favorite text editor and call it
|
||||||
<code>plastic.mat</code>.</p>
|
<code>plastic.mat</code>.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>material {
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>material {
|
||||||
name : Lit,
|
name : Lit,
|
||||||
@@ -44,16 +44,16 @@ fragment {
|
|||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>Next, invoke <code>matc</code> as follows.</p>
|
<p>Next, invoke <code>matc</code> as follows.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>matc -a opengl -p mobile -o plastic.filamat plastic.mat
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>matc<span style="color: #BBB"> </span>-a<span style="color: #BBB"> </span>opengl<span style="color: #BBB"> </span>-p<span style="color: #BBB"> </span>mobile<span style="color: #BBB"> </span>-o<span style="color: #BBB"> </span>plastic.filamat<span style="color: #BBB"> </span>plastic.mat
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>You should now have a material archive in your working directory, which we'll use later in the
|
<p>You should now have a material archive in your working directory, which we'll use later in the
|
||||||
tutorial.</p>
|
tutorial.</p>
|
||||||
<h2>Bake environment map</h2>
|
<h2>Bake environment map</h2>
|
||||||
<p>Next we'll use Filament's <code>cmgen</code> tool to consume a HDR environment map in latlong format, and
|
<p>Next we'll use Filament's <code>cmgen</code> tool to consume a HDR environment map in latlong format, and
|
||||||
produce two cubemap files: a mipmapped IBL and a blurry skybox.</p>
|
produce two cubemap files: a mipmapped IBL and a blurry skybox.</p>
|
||||||
<p>Download <a href="//github.com/google/filament/blob/main/third_party/environments/pillars_2k.hdr">pillars_2k.hdr</a>, then invoke the following command in your terminal.</p>
|
<p>Download <a href="//github.com/google/filament/blob/main/third_party/environments/pillars_2k.hdr">pillars_2k.hdr</a>, then invoke the following command in your terminal.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>cmgen -x pillars_2k --format<span style="color: #666666">=</span>ktx --size<span style="color: #666666">=256</span> --extract-blur<span style="color: #666666">=0</span>.1 pillars_2k.hdr
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>cmgen<span style="color: #BBB"> </span>-x<span style="color: #BBB"> </span>pillars_2k<span style="color: #BBB"> </span>--format<span style="color: #666">=</span>ktx<span style="color: #BBB"> </span>--size<span style="color: #666">=256</span><span style="color: #BBB"> </span>--extract-blur<span style="color: #666">=0</span>.1<span style="color: #BBB"> </span>pillars_2k.hdr
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>You should now have a <code>pillars_2k</code> folder containing a couple KTX files for the IBL and skybox, as
|
<p>You should now have a <code>pillars_2k</code> folder containing a couple KTX files for the IBL and skybox, as
|
||||||
@@ -61,84 +61,84 @@ well as a text file with spherical harmonics coefficients. You can discard the t
|
|||||||
IBL KTX contains these coefficients in its metadata.</p>
|
IBL KTX contains these coefficients in its metadata.</p>
|
||||||
<h2>Create JavaScript</h2>
|
<h2>Create JavaScript</h2>
|
||||||
<p>Next, create <code>redball.js</code> with the following content.</p>
|
<p>Next, create <code>redball.js</code> with the following content.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>environ<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #BA2121">'pillars_2k'</span>;<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>environ<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #BA2121">'pillars_2k'</span>;
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>ibl_url<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #BA2121">`</span><span style="color: #A45A77; font-weight: bold">${</span>environ<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">/</span><span style="color: #A45A77; font-weight: bold">${</span>environ<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">_ibl.ktx`</span>;<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>ibl_url<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #BA2121">`</span><span style="color: #A45A77; font-weight: bold">${</span>environ<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">/</span><span style="color: #A45A77; font-weight: bold">${</span>environ<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">_ibl.ktx`</span>;
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>sky_url<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #BA2121">`</span><span style="color: #A45A77; font-weight: bold">${</span>environ<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">/</span><span style="color: #A45A77; font-weight: bold">${</span>environ<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">_skybox.ktx`</span>;<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>sky_url<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #BA2121">`</span><span style="color: #A45A77; font-weight: bold">${</span>environ<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">/</span><span style="color: #A45A77; font-weight: bold">${</span>environ<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">_skybox.ktx`</span>;
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>filamat_url<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #BA2121">'plastic.filamat'</span><span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>filamat_url<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #BA2121">'plastic.filamat'</span>
|
||||||
|
|
||||||
Filament.init([<span style="color: #bbbbbb"> </span>filamat_url,<span style="color: #bbbbbb"> </span>ibl_url,<span style="color: #bbbbbb"> </span>sky_url<span style="color: #bbbbbb"> </span>],<span style="color: #bbbbbb"> </span>()<span style="color: #bbbbbb"> </span>=><span style="color: #bbbbbb"> </span>{<span style="color: #bbbbbb"></span>
|
Filament.init([<span style="color: #BBB"> </span>filamat_url,<span style="color: #BBB"> </span>ibl_url,<span style="color: #BBB"> </span>sky_url<span style="color: #BBB"> </span>],<span style="color: #BBB"> </span>()<span style="color: #BBB"> </span>=><span style="color: #BBB"> </span>{
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #3D7B7B; font-style: italic">// Create some global aliases to enums for convenience.</span><span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// Create some global aliases to enums for convenience.</span>
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.VertexAttribute<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.VertexAttribute;<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000">window</span>.VertexAttribute<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.VertexAttribute;
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.AttributeType<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.VertexBuffer$AttributeType;<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000">window</span>.AttributeType<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.VertexBuffer$AttributeType;
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.PrimitiveType<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.RenderableManager$PrimitiveType;<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000">window</span>.PrimitiveType<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.RenderableManager$PrimitiveType;
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.IndexType<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.IndexBuffer$IndexType;<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000">window</span>.IndexType<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.IndexBuffer$IndexType;
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.Fov<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.Camera$Fov;<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000">window</span>.Fov<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.Camera$Fov;
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.LightType<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.LightManager$Type;<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000">window</span>.LightType<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.LightManager$Type;
|
||||||
|
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #3D7B7B; font-style: italic">// Obtain the canvas DOM object and pass it to the App.</span><span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// Obtain the canvas DOM object and pass it to the App.</span>
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>canvas<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000">document</span>.getElementsByTagName(<span style="color: #BA2121">'canvas'</span>)[<span style="color: #666666">0</span>];<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>canvas<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000">document</span>.getElementsByTagName(<span style="color: #BA2121">'canvas'</span>)[<span style="color: #666">0</span>];
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.app<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #AA22FF; font-weight: bold">new</span><span style="color: #bbbbbb"> </span>App(canvas);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000">window</span>.app<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #A2F; font-weight: bold">new</span><span style="color: #BBB"> </span>App(canvas);
|
||||||
}<span style="color: #bbbbbb"> </span>);<span style="color: #bbbbbb"></span>
|
}<span style="color: #BBB"> </span>);
|
||||||
|
|
||||||
<span style="color: #008000; font-weight: bold">class</span><span style="color: #bbbbbb"> </span>App<span style="color: #bbbbbb"> </span>{<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">class</span><span style="color: #BBB"> </span>App<span style="color: #BBB"> </span>{
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">constructor</span>(canvas)<span style="color: #bbbbbb"> </span>{<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">constructor</span>(canvas)<span style="color: #BBB"> </span>{
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.canvas<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>canvas;<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.canvas<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>canvas;
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>engine<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.engine<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.Engine.create(canvas);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>engine<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.engine<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.Engine.create(canvas);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>scene<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>engine.createScene();<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>scene<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>engine.createScene();
|
||||||
|
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: create material</span><span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: create material</span>
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: create sphere</span><span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: create sphere</span>
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: create lights</span><span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: create lights</span>
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: create IBL</span><span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: create IBL</span>
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: create skybox</span><span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: create skybox</span>
|
||||||
|
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.swapChain<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>engine.createSwapChain();<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.swapChain<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>engine.createSwapChain();
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.renderer<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>engine.createRenderer();<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.renderer<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>engine.createRenderer();
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.camera<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>engine.createCamera(Filament.EntityManager.get().create());<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.camera<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>engine.createCamera(Filament.EntityManager.get().create());
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.view<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>engine.createView();<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.view<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>engine.createView();
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.view.setCamera(<span style="color: #008000; font-weight: bold">this</span>.camera);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.view.setCamera(<span style="color: #008000; font-weight: bold">this</span>.camera);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.view.setScene(scene);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.view.setScene(scene);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.resize();<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.resize();
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.render<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.render.bind(<span style="color: #008000; font-weight: bold">this</span>);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.render<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.render.bind(<span style="color: #008000; font-weight: bold">this</span>);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.resize<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.resize.bind(<span style="color: #008000; font-weight: bold">this</span>);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.resize<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.resize.bind(<span style="color: #008000; font-weight: bold">this</span>);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.addEventListener(<span style="color: #BA2121">'resize'</span>,<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.resize);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000">window</span>.addEventListener(<span style="color: #BA2121">'resize'</span>,<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.resize);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.requestAnimationFrame(<span style="color: #008000; font-weight: bold">this</span>.render);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000">window</span>.requestAnimationFrame(<span style="color: #008000; font-weight: bold">this</span>.render);
|
||||||
<span style="color: #bbbbbb"> </span>}<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>}
|
||||||
|
|
||||||
<span style="color: #bbbbbb"> </span>render()<span style="color: #bbbbbb"> </span>{<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>render()<span style="color: #BBB"> </span>{
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>eye<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>[<span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">4</span>],<span style="color: #bbbbbb"> </span>center<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>[<span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>],<span style="color: #bbbbbb"> </span>up<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>[<span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">1</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>];<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>eye<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>[<span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">4</span>],<span style="color: #BBB"> </span>center<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>[<span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">0</span>],<span style="color: #BBB"> </span>up<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>[<span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">1</span>,<span style="color: #BBB"> </span><span style="color: #666">0</span>];
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>radians<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000">Date</span>.now()<span style="color: #bbbbbb"> </span><span style="color: #666666">/</span><span style="color: #bbbbbb"> </span><span style="color: #666666">10000</span>;<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>radians<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000">Date</span>.now()<span style="color: #BBB"> </span><span style="color: #666">/</span><span style="color: #BBB"> </span><span style="color: #666">10000</span>;
|
||||||
<span style="color: #bbbbbb"> </span>vec3.rotateY(eye,<span style="color: #bbbbbb"> </span>eye,<span style="color: #bbbbbb"> </span>center,<span style="color: #bbbbbb"> </span>radians);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>vec3.rotateY(eye,<span style="color: #BBB"> </span>eye,<span style="color: #BBB"> </span>center,<span style="color: #BBB"> </span>radians);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.camera.lookAt(eye,<span style="color: #bbbbbb"> </span>center,<span style="color: #bbbbbb"> </span>up);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.camera.lookAt(eye,<span style="color: #BBB"> </span>center,<span style="color: #BBB"> </span>up);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.renderer.render(<span style="color: #008000; font-weight: bold">this</span>.swapChain,<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.view);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.renderer.render(<span style="color: #008000; font-weight: bold">this</span>.swapChain,<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.view);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.requestAnimationFrame(<span style="color: #008000; font-weight: bold">this</span>.render);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000">window</span>.requestAnimationFrame(<span style="color: #008000; font-weight: bold">this</span>.render);
|
||||||
<span style="color: #bbbbbb"> </span>}<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>}
|
||||||
|
|
||||||
<span style="color: #bbbbbb"> </span>resize()<span style="color: #bbbbbb"> </span>{<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>resize()<span style="color: #BBB"> </span>{
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>dpr<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.devicePixelRatio;<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>dpr<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000">window</span>.devicePixelRatio;
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>width<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.canvas.width<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.innerWidth<span style="color: #bbbbbb"> </span><span style="color: #666666">*</span><span style="color: #bbbbbb"> </span>dpr;<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>width<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.canvas.width<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000">window</span>.innerWidth<span style="color: #BBB"> </span><span style="color: #666">*</span><span style="color: #BBB"> </span>dpr;
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>height<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.canvas.height<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.innerHeight<span style="color: #bbbbbb"> </span><span style="color: #666666">*</span><span style="color: #bbbbbb"> </span>dpr;<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>height<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.canvas.height<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000">window</span>.innerHeight<span style="color: #BBB"> </span><span style="color: #666">*</span><span style="color: #BBB"> </span>dpr;
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.view.setViewport([<span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span>width,<span style="color: #bbbbbb"> </span>height]);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.view.setViewport([<span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">0</span>,<span style="color: #BBB"> </span>width,<span style="color: #BBB"> </span>height]);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.camera.setProjectionFov(<span style="color: #666666">45</span>,<span style="color: #bbbbbb"> </span>width<span style="color: #bbbbbb"> </span><span style="color: #666666">/</span><span style="color: #bbbbbb"> </span>height,<span style="color: #bbbbbb"> </span><span style="color: #666666">1.0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">10.0</span>,<span style="color: #bbbbbb"> </span>Fov.VERTICAL);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.camera.setProjectionFov(<span style="color: #666">45</span>,<span style="color: #BBB"> </span>width<span style="color: #BBB"> </span><span style="color: #666">/</span><span style="color: #BBB"> </span>height,<span style="color: #BBB"> </span><span style="color: #666">1.0</span>,<span style="color: #BBB"> </span><span style="color: #666">10.0</span>,<span style="color: #BBB"> </span>Fov.VERTICAL);
|
||||||
<span style="color: #bbbbbb"> </span>}<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>}
|
||||||
}<span style="color: #bbbbbb"></span>
|
}
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>The above boilerplate should be familiar to you from the previous tutorial, although it loads in a
|
<p>The above boilerplate should be familiar to you from the previous tutorial, although it loads in a
|
||||||
new set of assets. We also added some animation to the camera.</p>
|
new set of assets. We also added some animation to the camera.</p>
|
||||||
<p>Next let's create a material instance from the package that we built at the beginning the tutorial.
|
<p>Next let's create a material instance from the package that we built at the beginning the tutorial.
|
||||||
Replace the <strong>create material</strong> comment with the following snippet.</p>
|
Replace the <strong>create material</strong> comment with the following snippet.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>material<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>engine.createMaterial(filamat_url);<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>material<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>engine.createMaterial(filamat_url);
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>matinstance<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>material.createInstance();<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>matinstance<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>material.createInstance();
|
||||||
|
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>red<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>[<span style="color: #666666">0.8</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0.0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0.0</span>];<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>red<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>[<span style="color: #666">0.8</span>,<span style="color: #BBB"> </span><span style="color: #666">0.0</span>,<span style="color: #BBB"> </span><span style="color: #666">0.0</span>];
|
||||||
matinstance.setColor3Parameter(<span style="color: #BA2121">'baseColor'</span>,<span style="color: #bbbbbb"> </span>Filament.RgbType.sRGB,<span style="color: #bbbbbb"> </span>red);<span style="color: #bbbbbb"></span>
|
matinstance.setColor3Parameter(<span style="color: #BA2121">'baseColor'</span>,<span style="color: #BBB"> </span>Filament.RgbType.sRGB,<span style="color: #BBB"> </span>red);
|
||||||
matinstance.setFloatParameter(<span style="color: #BA2121">'roughness'</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0.5</span>);<span style="color: #bbbbbb"></span>
|
matinstance.setFloatParameter(<span style="color: #BA2121">'roughness'</span>,<span style="color: #BBB"> </span><span style="color: #666">0.5</span>);
|
||||||
matinstance.setFloatParameter(<span style="color: #BA2121">'clearCoat'</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">1.0</span>);<span style="color: #bbbbbb"></span>
|
matinstance.setFloatParameter(<span style="color: #BA2121">'clearCoat'</span>,<span style="color: #BBB"> </span><span style="color: #666">1.0</span>);
|
||||||
matinstance.setFloatParameter(<span style="color: #BA2121">'clearCoatRoughness'</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0.3</span>);<span style="color: #bbbbbb"></span>
|
matinstance.setFloatParameter(<span style="color: #BA2121">'clearCoatRoughness'</span>,<span style="color: #BBB"> </span><span style="color: #666">0.3</span>);
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>The next step is to create a renderable for the sphere. To help with this, we'll use the <code>IcoSphere</code>
|
<p>The next step is to create a renderable for the sphere. To help with this, we'll use the <code>IcoSphere</code>
|
||||||
utility class, whose constructor takes a LOD. Its job is to subdivide an icosadedron, producing
|
utility class, whose constructor takes a LOD. Its job is to subdivide an icosadedron, producing
|
||||||
three arrays:</p>
|
three arrays:</p>
|
||||||
<ul>
|
<ul>
|
||||||
@@ -147,137 +147,137 @@ three arrays:</p>
|
|||||||
as quaternions.</li>
|
as quaternions.</li>
|
||||||
<li><code>icosphere.triangles</code> Uint16Array with triangle indices.</li>
|
<li><code>icosphere.triangles</code> Uint16Array with triangle indices.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>Let's go ahead use these arrays to build the vertex buffer and index buffer. Replace <strong>create
|
<p>Let's go ahead use these arrays to build the vertex buffer and index buffer. Replace <strong>create
|
||||||
sphere</strong> with the following snippet.</p>
|
sphere</strong> with the following snippet.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>renderable<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.EntityManager.get().create();<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>renderable<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.EntityManager.get().create();
|
||||||
scene.addEntity(renderable);<span style="color: #bbbbbb"></span>
|
scene.addEntity(renderable);
|
||||||
|
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>icosphere<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #AA22FF; font-weight: bold">new</span><span style="color: #bbbbbb"> </span>Filament.IcoSphere(<span style="color: #666666">5</span>);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>icosphere<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #A2F; font-weight: bold">new</span><span style="color: #BBB"> </span>Filament.IcoSphere(<span style="color: #666">5</span>);
|
||||||
|
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>vb<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.VertexBuffer.Builder()<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>vb<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.VertexBuffer.Builder()
|
||||||
<span style="color: #bbbbbb"> </span>.vertexCount(icosphere.vertices.length<span style="color: #bbbbbb"> </span><span style="color: #666666">/</span><span style="color: #bbbbbb"> </span><span style="color: #666666">3</span>)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.vertexCount(icosphere.vertices.length<span style="color: #BBB"> </span><span style="color: #666">/</span><span style="color: #BBB"> </span><span style="color: #666">3</span>)
|
||||||
<span style="color: #bbbbbb"> </span>.bufferCount(<span style="color: #666666">2</span>)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.bufferCount(<span style="color: #666">2</span>)
|
||||||
<span style="color: #bbbbbb"> </span>.attribute(VertexAttribute.POSITION,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span>AttributeType.FLOAT3,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.attribute(VertexAttribute.POSITION,<span style="color: #BBB"> </span><span style="color: #666">0</span>,<span style="color: #BBB"> </span>AttributeType.FLOAT3,<span style="color: #BBB"> </span><span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">0</span>)
|
||||||
<span style="color: #bbbbbb"> </span>.attribute(VertexAttribute.TANGENTS,<span style="color: #bbbbbb"> </span><span style="color: #666666">1</span>,<span style="color: #bbbbbb"> </span>AttributeType.SHORT4,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.attribute(VertexAttribute.TANGENTS,<span style="color: #BBB"> </span><span style="color: #666">1</span>,<span style="color: #BBB"> </span>AttributeType.SHORT4,<span style="color: #BBB"> </span><span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">0</span>)
|
||||||
<span style="color: #bbbbbb"> </span>.normalized(VertexAttribute.TANGENTS)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.normalized(VertexAttribute.TANGENTS)
|
||||||
<span style="color: #bbbbbb"> </span>.build(engine);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.build(engine);
|
||||||
|
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>ib<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.IndexBuffer.Builder()<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>ib<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.IndexBuffer.Builder()
|
||||||
<span style="color: #bbbbbb"> </span>.indexCount(icosphere.triangles.length)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.indexCount(icosphere.triangles.length)
|
||||||
<span style="color: #bbbbbb"> </span>.bufferType(IndexType.USHORT)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.bufferType(IndexType.USHORT)
|
||||||
<span style="color: #bbbbbb"> </span>.build(engine);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.build(engine);
|
||||||
|
|
||||||
vb.setBufferAt(engine,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span>icosphere.vertices);<span style="color: #bbbbbb"></span>
|
vb.setBufferAt(engine,<span style="color: #BBB"> </span><span style="color: #666">0</span>,<span style="color: #BBB"> </span>icosphere.vertices);
|
||||||
vb.setBufferAt(engine,<span style="color: #bbbbbb"> </span><span style="color: #666666">1</span>,<span style="color: #bbbbbb"> </span>icosphere.tangents);<span style="color: #bbbbbb"></span>
|
vb.setBufferAt(engine,<span style="color: #BBB"> </span><span style="color: #666">1</span>,<span style="color: #BBB"> </span>icosphere.tangents);
|
||||||
ib.setBuffer(engine,<span style="color: #bbbbbb"> </span>icosphere.triangles);<span style="color: #bbbbbb"></span>
|
ib.setBuffer(engine,<span style="color: #BBB"> </span>icosphere.triangles);
|
||||||
|
|
||||||
Filament.RenderableManager.Builder(<span style="color: #666666">1</span>)<span style="color: #bbbbbb"></span>
|
Filament.RenderableManager.Builder(<span style="color: #666">1</span>)
|
||||||
<span style="color: #bbbbbb"> </span>.boundingBox({<span style="color: #bbbbbb"> </span>center<span style="color: #666666">:</span><span style="color: #bbbbbb"> </span>[<span style="color: #666666">-1</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">-1</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">-1</span>],<span style="color: #bbbbbb"> </span>halfExtent<span style="color: #666666">:</span><span style="color: #bbbbbb"> </span>[<span style="color: #666666">1</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">1</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">1</span>]<span style="color: #bbbbbb"> </span>})<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.boundingBox({<span style="color: #BBB"> </span>center<span style="color: #666">:</span><span style="color: #BBB"> </span>[<span style="color: #666">-1</span>,<span style="color: #BBB"> </span><span style="color: #666">-1</span>,<span style="color: #BBB"> </span><span style="color: #666">-1</span>],<span style="color: #BBB"> </span>halfExtent<span style="color: #666">:</span><span style="color: #BBB"> </span>[<span style="color: #666">1</span>,<span style="color: #BBB"> </span><span style="color: #666">1</span>,<span style="color: #BBB"> </span><span style="color: #666">1</span>]<span style="color: #BBB"> </span>})
|
||||||
<span style="color: #bbbbbb"> </span>.material(<span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span>matinstance)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.material(<span style="color: #666">0</span>,<span style="color: #BBB"> </span>matinstance)
|
||||||
<span style="color: #bbbbbb"> </span>.geometry(<span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span>PrimitiveType.TRIANGLES,<span style="color: #bbbbbb"> </span>vb,<span style="color: #bbbbbb"> </span>ib)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.geometry(<span style="color: #666">0</span>,<span style="color: #BBB"> </span>PrimitiveType.TRIANGLES,<span style="color: #BBB"> </span>vb,<span style="color: #BBB"> </span>ib)
|
||||||
<span style="color: #bbbbbb"> </span>.build(engine,<span style="color: #bbbbbb"> </span>renderable);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.build(engine,<span style="color: #BBB"> </span>renderable);
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>At this point, the app is rendering a sphere, but it is black so it doesn't show up. To prove that
|
<p>At this point, the app is rendering a sphere, but it is black so it doesn't show up. To prove that
|
||||||
the sphere is there, you can try changing the background color to blue via <code>setClearColor</code>, like we
|
the sphere is there, you can try changing the background color to blue via <code>setClearColor</code>, like we
|
||||||
did in the first tutorial.</p>
|
did in the first tutorial.</p>
|
||||||
<h2>Add lighting</h2>
|
<h2>Add lighting</h2>
|
||||||
<p>In this section we will create some directional light sources, as well as an image-based light (IBL)
|
<p>In this section we will create some directional light sources, as well as an image-based light (IBL)
|
||||||
defined by one of the KTX files we built at the start of the demo. First, replace the <strong>create
|
defined by one of the KTX files we built at the start of the demo. First, replace the <strong>create
|
||||||
lights</strong> comment with the following snippet.</p>
|
lights</strong> comment with the following snippet.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>sunlight<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.EntityManager.get().create();<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>sunlight<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.EntityManager.get().create();
|
||||||
scene.addEntity(sunlight);<span style="color: #bbbbbb"></span>
|
scene.addEntity(sunlight);
|
||||||
Filament.LightManager.Builder(LightType.SUN)<span style="color: #bbbbbb"></span>
|
Filament.LightManager.Builder(LightType.SUN)
|
||||||
<span style="color: #bbbbbb"> </span>.color([<span style="color: #666666">0.98</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0.92</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0.89</span>])<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.color([<span style="color: #666">0.98</span>,<span style="color: #BBB"> </span><span style="color: #666">0.92</span>,<span style="color: #BBB"> </span><span style="color: #666">0.89</span>])
|
||||||
<span style="color: #bbbbbb"> </span>.intensity(<span style="color: #666666">110000.0</span>)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.intensity(<span style="color: #666">110000.0</span>)
|
||||||
<span style="color: #bbbbbb"> </span>.direction([<span style="color: #666666">0.6</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">-1.0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">-0.8</span>])<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.direction([<span style="color: #666">0.6</span>,<span style="color: #BBB"> </span><span style="color: #666">-1.0</span>,<span style="color: #BBB"> </span><span style="color: #666">-0.8</span>])
|
||||||
<span style="color: #bbbbbb"> </span>.sunAngularRadius(<span style="color: #666666">1.9</span>)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.sunAngularRadius(<span style="color: #666">1.9</span>)
|
||||||
<span style="color: #bbbbbb"> </span>.sunHaloSize(<span style="color: #666666">10.0</span>)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.sunHaloSize(<span style="color: #666">10.0</span>)
|
||||||
<span style="color: #bbbbbb"> </span>.sunHaloFalloff(<span style="color: #666666">80.0</span>)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.sunHaloFalloff(<span style="color: #666">80.0</span>)
|
||||||
<span style="color: #bbbbbb"> </span>.build(engine,<span style="color: #bbbbbb"> </span>sunlight);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.build(engine,<span style="color: #BBB"> </span>sunlight);
|
||||||
|
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>backlight<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.EntityManager.get().create();<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>backlight<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.EntityManager.get().create();
|
||||||
scene.addEntity(backlight);<span style="color: #bbbbbb"></span>
|
scene.addEntity(backlight);
|
||||||
Filament.LightManager.Builder(LightType.DIRECTIONAL)<span style="color: #bbbbbb"></span>
|
Filament.LightManager.Builder(LightType.DIRECTIONAL)
|
||||||
<span style="color: #bbbbbb"> </span>.direction([<span style="color: #666666">-1</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">1</span>])<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.direction([<span style="color: #666">-1</span>,<span style="color: #BBB"> </span><span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">1</span>])
|
||||||
<span style="color: #bbbbbb"> </span>.intensity(<span style="color: #666666">50000.0</span>)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.intensity(<span style="color: #666">50000.0</span>)
|
||||||
<span style="color: #bbbbbb"> </span>.build(engine,<span style="color: #bbbbbb"> </span>backlight);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.build(engine,<span style="color: #BBB"> </span>backlight);
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>The <code>SUN</code> light source is similar to the <code>DIRECTIONAL</code> light source, but has some extra
|
<p>The <code>SUN</code> light source is similar to the <code>DIRECTIONAL</code> light source, but has some extra
|
||||||
parameters because Filament will automatically draw a disk into the skybox.</p>
|
parameters because Filament will automatically draw a disk into the skybox.</p>
|
||||||
<p>Next we need to create an <code>IndirectLight</code> object from the KTX IBL. One way of doing this is the
|
<p>Next we need to create an <code>IndirectLight</code> object from the KTX IBL. One way of doing this is the
|
||||||
following (don't type this out, there's an easier way).</p>
|
following (don't type this out, there's an easier way).</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>format<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.PixelDataFormat.RGB;<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>format<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.PixelDataFormat.RGB;
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>datatype<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.PixelDataType.UINT_10F_11F_11F_REV;<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>datatype<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.PixelDataType.UINT_10F_11F_11F_REV;
|
||||||
|
|
||||||
<span style="color: #3D7B7B; font-style: italic">// Create a Texture object for the mipmapped cubemap.</span><span style="color: #bbbbbb"></span>
|
<span style="color: #3D7B7B; font-style: italic">// Create a Texture object for the mipmapped cubemap.</span>
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>ibl_package<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.Buffer(Filament.assets[ibl_url]);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>ibl_package<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.Buffer(Filament.assets[ibl_url]);
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>iblktx<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #AA22FF; font-weight: bold">new</span><span style="color: #bbbbbb"> </span>Filament.Ktx1Bundle(ibl_package);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>iblktx<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #A2F; font-weight: bold">new</span><span style="color: #BBB"> </span>Filament.Ktx1Bundle(ibl_package);
|
||||||
|
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>ibltex<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.Texture.Builder()<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>ibltex<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.Texture.Builder()
|
||||||
<span style="color: #bbbbbb"> </span>.width(iblktx.info().pixelWidth)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.width(iblktx.info().pixelWidth)
|
||||||
<span style="color: #bbbbbb"> </span>.height(iblktx.info().pixelHeight)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.height(iblktx.info().pixelHeight)
|
||||||
<span style="color: #bbbbbb"> </span>.levels(iblktx.getNumMipLevels())<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.levels(iblktx.getNumMipLevels())
|
||||||
<span style="color: #bbbbbb"> </span>.sampler(Filament.Texture$Sampler.SAMPLER_CUBEMAP)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.sampler(Filament.Texture$Sampler.SAMPLER_CUBEMAP)
|
||||||
<span style="color: #bbbbbb"> </span>.format(Filament.Texture$InternalFormat.RGBA8)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.format(Filament.Texture$InternalFormat.RGBA8)
|
||||||
<span style="color: #bbbbbb"> </span>.build(engine);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.build(engine);
|
||||||
|
|
||||||
<span style="color: #008000; font-weight: bold">for</span><span style="color: #bbbbbb"> </span>(<span style="color: #008000; font-weight: bold">let</span><span style="color: #bbbbbb"> </span>level<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>;<span style="color: #bbbbbb"> </span>level<span style="color: #bbbbbb"> </span><span style="color: #666666"><</span><span style="color: #bbbbbb"> </span>iblktx.getNumMipLevels();<span style="color: #bbbbbb"> </span><span style="color: #666666">++</span>level)<span style="color: #bbbbbb"> </span>{<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">for</span><span style="color: #BBB"> </span>(<span style="color: #008000; font-weight: bold">let</span><span style="color: #BBB"> </span>level<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #666">0</span>;<span style="color: #BBB"> </span>level<span style="color: #BBB"> </span><span style="color: #666"><</span><span style="color: #BBB"> </span>iblktx.getNumMipLevels();<span style="color: #BBB"> </span><span style="color: #666">++</span>level)<span style="color: #BBB"> </span>{
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>uint8array<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>iblktx.getCubeBlob(level).getBytes();<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>uint8array<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>iblktx.getCubeBlob(level).getBytes();
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>pixelbuffer<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.PixelBuffer(uint8array,<span style="color: #bbbbbb"> </span>format,<span style="color: #bbbbbb"> </span>datatype);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>pixelbuffer<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.PixelBuffer(uint8array,<span style="color: #BBB"> </span>format,<span style="color: #BBB"> </span>datatype);
|
||||||
<span style="color: #bbbbbb"> </span>ibltex.setImageCube(engine,<span style="color: #bbbbbb"> </span>level,<span style="color: #bbbbbb"> </span>pixelbuffer);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>ibltex.setImageCube(engine,<span style="color: #BBB"> </span>level,<span style="color: #BBB"> </span>pixelbuffer);
|
||||||
}<span style="color: #bbbbbb"></span>
|
}
|
||||||
|
|
||||||
<span style="color: #3D7B7B; font-style: italic">// Parse the spherical harmonics metadata.</span><span style="color: #bbbbbb"></span>
|
<span style="color: #3D7B7B; font-style: italic">// Parse the spherical harmonics metadata.</span>
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>shstring<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>iblktx.getMetadata(<span style="color: #BA2121">'sh'</span>);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>shstring<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>iblktx.getMetadata(<span style="color: #BA2121">'sh'</span>);
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>shfloats<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>shstring.split(<span style="color: #A45A77">/\s/</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">9</span><span style="color: #bbbbbb"> </span><span style="color: #666666">*</span><span style="color: #bbbbbb"> </span><span style="color: #666666">3</span>).map(<span style="color: #008000">parseFloat</span>);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>shfloats<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>shstring.split(<span style="color: #A45A77">/\s/</span>,<span style="color: #BBB"> </span><span style="color: #666">9</span><span style="color: #BBB"> </span><span style="color: #666">*</span><span style="color: #BBB"> </span><span style="color: #666">3</span>).map(<span style="color: #008000">parseFloat</span>);
|
||||||
|
|
||||||
<span style="color: #3D7B7B; font-style: italic">// Build the IBL object and insert it into the scene.</span><span style="color: #bbbbbb"></span>
|
<span style="color: #3D7B7B; font-style: italic">// Build the IBL object and insert it into the scene.</span>
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>indirectLight<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.IndirectLight.Builder()<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>indirectLight<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.IndirectLight.Builder()
|
||||||
<span style="color: #bbbbbb"> </span>.reflections(ibltex)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.reflections(ibltex)
|
||||||
<span style="color: #bbbbbb"> </span>.irradianceSh(<span style="color: #666666">3</span>,<span style="color: #bbbbbb"> </span>shfloats)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.irradianceSh(<span style="color: #666">3</span>,<span style="color: #BBB"> </span>shfloats)
|
||||||
<span style="color: #bbbbbb"> </span>.intensity(<span style="color: #666666">50000.0</span>)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.intensity(<span style="color: #666">50000.0</span>)
|
||||||
<span style="color: #bbbbbb"> </span>.build(engine);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.build(engine);
|
||||||
|
|
||||||
scene.setIndirectLight(indirectLight);<span style="color: #bbbbbb"></span>
|
scene.setIndirectLight(indirectLight);
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>Filament provides a JavaScript utility to make this simpler,
|
<p>Filament provides a JavaScript utility to make this simpler,
|
||||||
simply replace the <strong>create IBL</strong> comment with the following snippet.</p>
|
simply replace the <strong>create IBL</strong> comment with the following snippet.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>indirectLight<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>engine.createIblFromKtx1(ibl_url);<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>indirectLight<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>engine.createIblFromKtx1(ibl_url);
|
||||||
indirectLight.setIntensity(<span style="color: #666666">50000</span>);<span style="color: #bbbbbb"></span>
|
indirectLight.setIntensity(<span style="color: #666">50000</span>);
|
||||||
scene.setIndirectLight(indirectLight);<span style="color: #bbbbbb"></span>
|
scene.setIndirectLight(indirectLight);
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<h2>Add background</h2>
|
<h2>Add background</h2>
|
||||||
<p>At this point you can run the demo and you should see a red plastic ball against a black background.
|
<p>At this point you can run the demo and you should see a red plastic ball against a black background.
|
||||||
Without a skybox, the reflections on the ball are not representative of its surroundings.
|
Without a skybox, the reflections on the ball are not representative of its surroundings.
|
||||||
Here's one way to create a texture for the skybox:</p>
|
Here's one way to create a texture for the skybox:</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>sky_package<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.Buffer(Filament.assets[sky_url]);<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>sky_package<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.Buffer(Filament.assets[sky_url]);
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>skyktx<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #AA22FF; font-weight: bold">new</span><span style="color: #bbbbbb"> </span>Filament.Ktx1Bundle(sky_package);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>skyktx<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #A2F; font-weight: bold">new</span><span style="color: #BBB"> </span>Filament.Ktx1Bundle(sky_package);
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>skytex<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.Texture.Builder()<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>skytex<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.Texture.Builder()
|
||||||
<span style="color: #bbbbbb"> </span>.width(skyktx.info().pixelWidth)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.width(skyktx.info().pixelWidth)
|
||||||
<span style="color: #bbbbbb"> </span>.height(skyktx.info().pixelHeight)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.height(skyktx.info().pixelHeight)
|
||||||
<span style="color: #bbbbbb"> </span>.levels(<span style="color: #666666">1</span>)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.levels(<span style="color: #666">1</span>)
|
||||||
<span style="color: #bbbbbb"> </span>.sampler(Filament.Texture$Sampler.SAMPLER_CUBEMAP)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.sampler(Filament.Texture$Sampler.SAMPLER_CUBEMAP)
|
||||||
<span style="color: #bbbbbb"> </span>.format(Filament.Texture$InternalFormat.RGBA8)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.format(Filament.Texture$InternalFormat.RGBA8)
|
||||||
<span style="color: #bbbbbb"> </span>.build(engine);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.build(engine);
|
||||||
|
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>uint8array<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>skyktx.getCubeBlob(<span style="color: #666666">0</span>).getBytes();<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>uint8array<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>skyktx.getCubeBlob(<span style="color: #666">0</span>).getBytes();
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>pixelbuffer<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.PixelBuffer(uint8array,<span style="color: #bbbbbb"> </span>format,<span style="color: #bbbbbb"> </span>datatype);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>pixelbuffer<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.PixelBuffer(uint8array,<span style="color: #BBB"> </span>format,<span style="color: #BBB"> </span>datatype);
|
||||||
skytex.setImageCube(engine,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span>pixelbuffer);<span style="color: #bbbbbb"></span>
|
skytex.setImageCube(engine,<span style="color: #BBB"> </span><span style="color: #666">0</span>,<span style="color: #BBB"> </span>pixelbuffer);
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>Filament provides a Javascript utility to make this easier.
|
<p>Filament provides a Javascript utility to make this easier.
|
||||||
Replace <strong>create skybox</strong> with the following.</p>
|
Replace <strong>create skybox</strong> with the following.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>skybox<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>engine.createSkyFromKtx1(sky_url);<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>skybox<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>engine.createSkyFromKtx1(sky_url);
|
||||||
scene.setSkybox(skybox);<span style="color: #bbbbbb"></span>
|
scene.setSkybox(skybox);
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>That's it, we now have a shiny red ball floating in an environment! The complete JavaScript file is
|
<p>That's it, we now have a shiny red ball floating in an environment! The complete JavaScript file is
|
||||||
available <a href="tutorial_redball.js">here</a>.</p>
|
available <a href="tutorial_redball.js">here</a>.</p>
|
||||||
<p>In the <a href="tutorial_suzanne.html">next tutorial</a>, we'll take a closer look at textures and interaction.</p>
|
<p>In the <a href="tutorial_suzanne.html">next tutorial</a>, we'll take a closer look at textures and interaction.</p>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -8,58 +8,58 @@
|
|||||||
<div class="demo_frame"><iframe src="demo_suzanne.html"></iframe><a href="demo_suzanne.html">🔗</a></div>
|
<div class="demo_frame"><iframe src="demo_suzanne.html"></iframe><a href="demo_suzanne.html">🔗</a></div>
|
||||||
<p>This tutorial will describe how to create the <strong>suzanne</strong> demo, introducing you to compressed
|
<p>This tutorial will describe how to create the <strong>suzanne</strong> demo, introducing you to compressed
|
||||||
textures, mipmap generation, asynchronous texture loading, and trackball rotation.</p>
|
textures, mipmap generation, asynchronous texture loading, and trackball rotation.</p>
|
||||||
<p>Much like the <a href="tutorial_redball.html">previous tutorial</a>, you'll need to use the command-line tools that can be found in
|
<p>Much like the <a href="tutorial_redball.html">previous tutorial</a>, you'll need to use the command-line tools that can be found in
|
||||||
the appropriate <a href="//github.com/google/filament/releases">Filament release</a> for your development machine. In addition to <code>matc</code> and <code>cmgen</code>,
|
the appropriate <a href="//github.com/google/filament/releases">Filament release</a> for your development machine. In addition to <code>matc</code> and <code>cmgen</code>,
|
||||||
we'll also be using <code>filamesh</code> and <code>mipgen</code>.</p>
|
we'll also be using <code>filamesh</code> and <code>mipgen</code>.</p>
|
||||||
<h2>Create filamesh file</h2>
|
<h2>Create filamesh file</h2>
|
||||||
<p>Filament does not have an asset loading system, but it does provide a binary mesh format
|
<p>Filament does not have an asset loading system, but it does provide a binary mesh format
|
||||||
called <code>filamesh</code> for simple use cases. Let's create a compressed filamesh file for suzanne by
|
called <code>filamesh</code> for simple use cases. Let's create a compressed filamesh file for suzanne by
|
||||||
converting <a href="https://github.com/google/filament/blob/main/assets/models/monkey/monkey.obj">this OBJ file</a>:</p>
|
converting <a href="https://github.com/google/filament/blob/main/assets/models/monkey/monkey.obj">this OBJ file</a>:</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>filamesh --compress monkey.obj suzanne.filamesh
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>filamesh<span style="color: #BBB"> </span>--compress<span style="color: #BBB"> </span>monkey.obj<span style="color: #BBB"> </span>suzanne.filamesh
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<h2>Create mipmapped textures</h2>
|
<h2>Create mipmapped textures</h2>
|
||||||
<p>Next, let's create mipmapped KTX files using filament's <code>mipgen</code> tool. We'll create compressed and
|
<p>Next, let's create mipmapped KTX files using filament's <code>mipgen</code> tool. We'll create compressed and
|
||||||
non-compressed variants for each texture, since not all platforms support the same compression
|
non-compressed variants for each texture, since not all platforms support the same compression
|
||||||
formats. First copy over the PNG files from the <a href="https://github.com/google/filament/blob/main/assets/models/monkey">monkey folder</a>, then do:</p>
|
formats. First copy over the PNG files from the <a href="https://github.com/google/filament/blob/main/assets/models/monkey">monkey folder</a>, then do:</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #3D7B7B; font-style: italic"># Create mipmaps for base color</span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #3D7B7B; font-style: italic"># Create mipmaps for base color</span>
|
||||||
mipgen albedo.png albedo.ktx2
|
mipgen<span style="color: #BBB"> </span>albedo.png<span style="color: #BBB"> </span>albedo.ktx2
|
||||||
mipgen --compression<span style="color: #666666">=</span>uastc albedo.png albedo.ktx2
|
mipgen<span style="color: #BBB"> </span>--compression<span style="color: #666">=</span>uastc<span style="color: #BBB"> </span>albedo.png<span style="color: #BBB"> </span>albedo.ktx2
|
||||||
|
|
||||||
<span style="color: #3D7B7B; font-style: italic"># Create mipmaps for the normal map and a compressed variant.</span>
|
<span style="color: #3D7B7B; font-style: italic"># Create mipmaps for the normal map and a compressed variant.</span>
|
||||||
mipgen --strip-alpha --kernel<span style="color: #666666">=</span>NORMALS --linear normal.png normal.ktx
|
mipgen<span style="color: #BBB"> </span>--strip-alpha<span style="color: #BBB"> </span>--kernel<span style="color: #666">=</span>NORMALS<span style="color: #BBB"> </span>--linear<span style="color: #BBB"> </span>normal.png<span style="color: #BBB"> </span>normal.ktx
|
||||||
mipgen --strip-alpha --kernel<span style="color: #666666">=</span>NORMALS --linear --compression<span style="color: #666666">=</span>uastc_normals <span style="color: #AA5D1F; font-weight: bold">\</span>
|
mipgen<span style="color: #BBB"> </span>--strip-alpha<span style="color: #BBB"> </span>--kernel<span style="color: #666">=</span>NORMALS<span style="color: #BBB"> </span>--linear<span style="color: #BBB"> </span>--compression<span style="color: #666">=</span>uastc_normals<span style="color: #BBB"> </span><span style="color: #AA5D1F; font-weight: bold">\</span>
|
||||||
normal.png normal.ktx2
|
<span style="color: #BBB"> </span>normal.png<span style="color: #BBB"> </span>normal.ktx2
|
||||||
|
|
||||||
<span style="color: #3D7B7B; font-style: italic"># Create mipmaps for the single-component roughness map and a compressed variant.</span>
|
<span style="color: #3D7B7B; font-style: italic"># Create mipmaps for the single-component roughness map and a compressed variant.</span>
|
||||||
mipgen --grayscale roughness.png roughness.ktx
|
mipgen<span style="color: #BBB"> </span>--grayscale<span style="color: #BBB"> </span>roughness.png<span style="color: #BBB"> </span>roughness.ktx
|
||||||
mipgen --grayscale --compression<span style="color: #666666">=</span>uastc roughness.png roughness.ktx2
|
mipgen<span style="color: #BBB"> </span>--grayscale<span style="color: #BBB"> </span>--compression<span style="color: #666">=</span>uastc<span style="color: #BBB"> </span>roughness.png<span style="color: #BBB"> </span>roughness.ktx2
|
||||||
|
|
||||||
<span style="color: #3D7B7B; font-style: italic"># Create mipmaps for the single-component metallic map and a compressed variant.</span>
|
<span style="color: #3D7B7B; font-style: italic"># Create mipmaps for the single-component metallic map and a compressed variant.</span>
|
||||||
mipgen --grayscale metallic.png metallic.ktx
|
mipgen<span style="color: #BBB"> </span>--grayscale<span style="color: #BBB"> </span>metallic.png<span style="color: #BBB"> </span>metallic.ktx
|
||||||
mipgen --grayscale --compression<span style="color: #666666">=</span>uastc metallic.png metallic.ktx2
|
mipgen<span style="color: #BBB"> </span>--grayscale<span style="color: #BBB"> </span>--compression<span style="color: #666">=</span>uastc<span style="color: #BBB"> </span>metallic.png<span style="color: #BBB"> </span>metallic.ktx2
|
||||||
|
|
||||||
<span style="color: #3D7B7B; font-style: italic"># Create mipmaps for the single-component occlusion map and a compressed variant.</span>
|
<span style="color: #3D7B7B; font-style: italic"># Create mipmaps for the single-component occlusion map and a compressed variant.</span>
|
||||||
mipgen --grayscale ao.png ao.ktx
|
mipgen<span style="color: #BBB"> </span>--grayscale<span style="color: #BBB"> </span>ao.png<span style="color: #BBB"> </span>ao.ktx
|
||||||
mipgen --grayscale --compression<span style="color: #666666">=</span>uastc ao.png ao.ktx2
|
mipgen<span style="color: #BBB"> </span>--grayscale<span style="color: #BBB"> </span>--compression<span style="color: #666">=</span>uastc<span style="color: #BBB"> </span>ao.png<span style="color: #BBB"> </span>ao.ktx2
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>For more information on mipgen's arguments and supported formats, do <code>mipgen --help</code>.</p>
|
<p>For more information on mipgen's arguments and supported formats, do <code>mipgen --help</code>.</p>
|
||||||
<p>In a production setting, you'd want to invoke these commands with a script or build system.</p>
|
<p>In a production setting, you'd want to invoke these commands with a script or build system.</p>
|
||||||
<h2>Bake environment map</h2>
|
<h2>Bake environment map</h2>
|
||||||
<p>Much like the <a href="tutorial_redball.html">previous tutorial</a> we need to use Filament's <code>cmgen</code> tool to produce cubemap files.</p>
|
<p>Much like the <a href="tutorial_redball.html">previous tutorial</a> we need to use Filament's <code>cmgen</code> tool to produce cubemap files.</p>
|
||||||
<p>Download <a href="//github.com/google/filament/blob/main/third_party/environments/venetian_crossroads_2k.hdr">venetian_crossroads_2k.hdr</a>, then invoke the following commands in your terminal.</p>
|
<p>Download <a href="//github.com/google/filament/blob/main/third_party/environments/venetian_crossroads_2k.hdr">venetian_crossroads_2k.hdr</a>, then invoke the following commands in your terminal.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>cmgen -x . --format<span style="color: #666666">=</span>ktx --size<span style="color: #666666">=64</span> --extract-blur<span style="color: #666666">=0</span>.1 venetian_crossroads_2k.hdr
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>cmgen<span style="color: #BBB"> </span>-x<span style="color: #BBB"> </span>.<span style="color: #BBB"> </span>--format<span style="color: #666">=</span>ktx<span style="color: #BBB"> </span>--size<span style="color: #666">=64</span><span style="color: #BBB"> </span>--extract-blur<span style="color: #666">=0</span>.1<span style="color: #BBB"> </span>venetian_crossroads_2k.hdr
|
||||||
<span style="color: #008000">cd</span> venetian* ; mv venetian*_ibl.ktx venetian_crossroads_2k_skybox_tiny.ktx ; <span style="color: #008000">cd</span> -
|
<span style="color: #008000">cd</span><span style="color: #BBB"> </span>venetian*<span style="color: #BBB"> </span>;<span style="color: #BBB"> </span>mv<span style="color: #BBB"> </span>venetian*_ibl.ktx<span style="color: #BBB"> </span>venetian_crossroads_2k_skybox_tiny.ktx<span style="color: #BBB"> </span>;<span style="color: #BBB"> </span><span style="color: #008000">cd</span><span style="color: #BBB"> </span>-
|
||||||
|
|
||||||
cmgen -x . --format<span style="color: #666666">=</span>ktx --size<span style="color: #666666">=256</span> --extract-blur<span style="color: #666666">=0</span>.1 venetian_crossroads_2k.hdr
|
cmgen<span style="color: #BBB"> </span>-x<span style="color: #BBB"> </span>.<span style="color: #BBB"> </span>--format<span style="color: #666">=</span>ktx<span style="color: #BBB"> </span>--size<span style="color: #666">=256</span><span style="color: #BBB"> </span>--extract-blur<span style="color: #666">=0</span>.1<span style="color: #BBB"> </span>venetian_crossroads_2k.hdr
|
||||||
cmgen -x . --format<span style="color: #666666">=</span>ktx --size<span style="color: #666666">=256</span> --extract-blur<span style="color: #666666">=0</span>.1 venetian_crossroads_2k.hdr
|
cmgen<span style="color: #BBB"> </span>-x<span style="color: #BBB"> </span>.<span style="color: #BBB"> </span>--format<span style="color: #666">=</span>ktx<span style="color: #BBB"> </span>--size<span style="color: #666">=256</span><span style="color: #BBB"> </span>--extract-blur<span style="color: #666">=0</span>.1<span style="color: #BBB"> </span>venetian_crossroads_2k.hdr
|
||||||
cmgen -x . --format<span style="color: #666666">=</span>ktx --size<span style="color: #666666">=256</span> --extract-blur<span style="color: #666666">=0</span>.1 venetian_crossroads_2k.hdr
|
cmgen<span style="color: #BBB"> </span>-x<span style="color: #BBB"> </span>.<span style="color: #BBB"> </span>--format<span style="color: #666">=</span>ktx<span style="color: #BBB"> </span>--size<span style="color: #666">=256</span><span style="color: #BBB"> </span>--extract-blur<span style="color: #666">=0</span>.1<span style="color: #BBB"> </span>venetian_crossroads_2k.hdr
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<h2>Define textured material</h2>
|
<h2>Define textured material</h2>
|
||||||
<p>You might recall the <code>filamat</code> file we generated in the previous tutorial for red plastic. For this
|
<p>You might recall the <code>filamat</code> file we generated in the previous tutorial for red plastic. For this
|
||||||
demo, we'll create a material that uses textures for several parameters.</p>
|
demo, we'll create a material that uses textures for several parameters.</p>
|
||||||
<p>Create the following text file and call it <code>textured.mat</code>. Note that our material definition now
|
<p>Create the following text file and call it <code>textured.mat</code>. Note that our material definition now
|
||||||
requires a <code>uv0</code> attribute.</p>
|
requires a <code>uv0</code> attribute.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>material {
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>material {
|
||||||
@@ -90,7 +90,7 @@ fragment {
|
|||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>Next, invoke <code>matc</code> as follows.</p>
|
<p>Next, invoke <code>matc</code> as follows.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>matc -a opengl -p mobile -o textured.filamat textured.mat
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>matc<span style="color: #BBB"> </span>-a<span style="color: #BBB"> </span>opengl<span style="color: #BBB"> </span>-p<span style="color: #BBB"> </span>mobile<span style="color: #BBB"> </span>-o<span style="color: #BBB"> </span>textured.filamat<span style="color: #BBB"> </span>textured.mat
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>You should now have a material archive in your working directory. For the suzanne asset, the normal
|
<p>You should now have a material archive in your working directory. For the suzanne asset, the normal
|
||||||
@@ -100,65 +100,65 @@ materials, consult the official document describing the <a href="https://google.
|
|||||||
<p>Create a text file called <code>suzanne.html</code> and copy over the HTML that we used in the <a href="tutorial_redball.html">previous
|
<p>Create a text file called <code>suzanne.html</code> and copy over the HTML that we used in the <a href="tutorial_redball.html">previous
|
||||||
tutorial</a>. Change the last script tag from <code>redball.js</code> to <code>suzanne.js</code>. Next, create <code>suzanne.js</code>
|
tutorial</a>. Change the last script tag from <code>redball.js</code> to <code>suzanne.js</code>. Next, create <code>suzanne.js</code>
|
||||||
with the following content.</p>
|
with the following content.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #3D7B7B; font-style: italic">// TODO: declare asset URLs</span><span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #3D7B7B; font-style: italic">// TODO: declare asset URLs</span>
|
||||||
|
|
||||||
Filament.init([<span style="color: #bbbbbb"> </span>filamat_url,<span style="color: #bbbbbb"> </span>filamesh_url,<span style="color: #bbbbbb"> </span>sky_small_url,<span style="color: #bbbbbb"> </span>ibl_url<span style="color: #bbbbbb"> </span>],<span style="color: #bbbbbb"> </span>()<span style="color: #bbbbbb"> </span>=><span style="color: #bbbbbb"> </span>{<span style="color: #bbbbbb"></span>
|
Filament.init([<span style="color: #BBB"> </span>filamat_url,<span style="color: #BBB"> </span>filamesh_url,<span style="color: #BBB"> </span>sky_small_url,<span style="color: #BBB"> </span>ibl_url<span style="color: #BBB"> </span>],<span style="color: #BBB"> </span>()<span style="color: #BBB"> </span>=><span style="color: #BBB"> </span>{
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.app<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #AA22FF; font-weight: bold">new</span><span style="color: #bbbbbb"> </span>App(<span style="color: #008000">document</span>.getElementsByTagName(<span style="color: #BA2121">'canvas'</span>)[<span style="color: #666666">0</span>]);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000">window</span>.app<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #A2F; font-weight: bold">new</span><span style="color: #BBB"> </span>App(<span style="color: #008000">document</span>.getElementsByTagName(<span style="color: #BA2121">'canvas'</span>)[<span style="color: #666">0</span>]);
|
||||||
});<span style="color: #bbbbbb"></span>
|
});
|
||||||
|
|
||||||
<span style="color: #008000; font-weight: bold">class</span><span style="color: #bbbbbb"> </span>App<span style="color: #bbbbbb"> </span>{<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">class</span><span style="color: #BBB"> </span>App<span style="color: #BBB"> </span>{
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">constructor</span>(canvas)<span style="color: #bbbbbb"> </span>{<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">constructor</span>(canvas)<span style="color: #BBB"> </span>{
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.canvas<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>canvas;<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.canvas<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>canvas;
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.engine<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.Engine.create(canvas);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.engine<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.Engine.create(canvas);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.scene<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createScene();<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.scene<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createScene();
|
||||||
|
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>material<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createMaterial(filamat_url);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>material<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createMaterial(filamat_url);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.matinstance<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>material.createInstance();<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.matinstance<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>material.createInstance();
|
||||||
|
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>filamesh<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.loadFilamesh(filamesh_url,<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.matinstance);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>filamesh<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.loadFilamesh(filamesh_url,<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.matinstance);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.suzanne<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>filamesh.renderable;<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.suzanne<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>filamesh.renderable;
|
||||||
|
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: create sky box and IBL</span><span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: create sky box and IBL</span>
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: initialize gltumble</span><span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: initialize gltumble</span>
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: fetch larger assets</span><span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: fetch larger assets</span>
|
||||||
|
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.swapChain<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createSwapChain();<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.swapChain<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createSwapChain();
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.renderer<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createRenderer();<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.renderer<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createRenderer();
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.camera<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createCamera(Filament.EntityManager.get().create());<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.camera<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createCamera(Filament.EntityManager.get().create());
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.view<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createView();<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.view<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createView();
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.view.setCamera(<span style="color: #008000; font-weight: bold">this</span>.camera);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.view.setCamera(<span style="color: #008000; font-weight: bold">this</span>.camera);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.view.setScene(<span style="color: #008000; font-weight: bold">this</span>.scene);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.view.setScene(<span style="color: #008000; font-weight: bold">this</span>.scene);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.render<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.render.bind(<span style="color: #008000; font-weight: bold">this</span>);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.render<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.render.bind(<span style="color: #008000; font-weight: bold">this</span>);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.resize<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.resize.bind(<span style="color: #008000; font-weight: bold">this</span>);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.resize<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.resize.bind(<span style="color: #008000; font-weight: bold">this</span>);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.addEventListener(<span style="color: #BA2121">'resize'</span>,<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.resize);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000">window</span>.addEventListener(<span style="color: #BA2121">'resize'</span>,<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.resize);
|
||||||
|
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>eye<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>[<span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">4</span>],<span style="color: #bbbbbb"> </span>center<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>[<span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>],<span style="color: #bbbbbb"> </span>up<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>[<span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">1</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>];<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>eye<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>[<span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">4</span>],<span style="color: #BBB"> </span>center<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>[<span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">0</span>],<span style="color: #BBB"> </span>up<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>[<span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">1</span>,<span style="color: #BBB"> </span><span style="color: #666">0</span>];
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.camera.lookAt(eye,<span style="color: #bbbbbb"> </span>center,<span style="color: #bbbbbb"> </span>up);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.camera.lookAt(eye,<span style="color: #BBB"> </span>center,<span style="color: #BBB"> </span>up);
|
||||||
|
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.resize();<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.resize();
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.requestAnimationFrame(<span style="color: #008000; font-weight: bold">this</span>.render);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000">window</span>.requestAnimationFrame(<span style="color: #008000; font-weight: bold">this</span>.render);
|
||||||
<span style="color: #bbbbbb"> </span>}<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>}
|
||||||
|
|
||||||
<span style="color: #bbbbbb"> </span>render()<span style="color: #bbbbbb"> </span>{<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>render()<span style="color: #BBB"> </span>{
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: apply gltumble matrix</span><span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: apply gltumble matrix</span>
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.renderer.render(<span style="color: #008000; font-weight: bold">this</span>.swapChain,<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.view);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.renderer.render(<span style="color: #008000; font-weight: bold">this</span>.swapChain,<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.view);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.requestAnimationFrame(<span style="color: #008000; font-weight: bold">this</span>.render);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000">window</span>.requestAnimationFrame(<span style="color: #008000; font-weight: bold">this</span>.render);
|
||||||
<span style="color: #bbbbbb"> </span>}<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>}
|
||||||
|
|
||||||
<span style="color: #bbbbbb"> </span>resize()<span style="color: #bbbbbb"> </span>{<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>resize()<span style="color: #BBB"> </span>{
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>dpr<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.devicePixelRatio;<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>dpr<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000">window</span>.devicePixelRatio;
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>width<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.canvas.width<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.innerWidth<span style="color: #bbbbbb"> </span><span style="color: #666666">*</span><span style="color: #bbbbbb"> </span>dpr;<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>width<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.canvas.width<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000">window</span>.innerWidth<span style="color: #BBB"> </span><span style="color: #666">*</span><span style="color: #BBB"> </span>dpr;
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>height<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.canvas.height<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.innerHeight<span style="color: #bbbbbb"> </span><span style="color: #666666">*</span><span style="color: #bbbbbb"> </span>dpr;<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>height<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.canvas.height<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000">window</span>.innerHeight<span style="color: #BBB"> </span><span style="color: #666">*</span><span style="color: #BBB"> </span>dpr;
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.view.setViewport([<span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span>width,<span style="color: #bbbbbb"> </span>height]);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.view.setViewport([<span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">0</span>,<span style="color: #BBB"> </span>width,<span style="color: #BBB"> </span>height]);
|
||||||
|
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>aspect<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>width<span style="color: #bbbbbb"> </span><span style="color: #666666">/</span><span style="color: #bbbbbb"> </span>height;<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>aspect<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>width<span style="color: #BBB"> </span><span style="color: #666">/</span><span style="color: #BBB"> </span>height;
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>Fov<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.Camera$Fov,<span style="color: #bbbbbb"> </span>fov<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>aspect<span style="color: #bbbbbb"> </span><span style="color: #666666"><</span><span style="color: #bbbbbb"> </span><span style="color: #666666">1</span><span style="color: #bbbbbb"> </span><span style="color: #666666">?</span><span style="color: #bbbbbb"> </span>Fov.HORIZONTAL<span style="color: #bbbbbb"> </span><span style="color: #666666">:</span><span style="color: #bbbbbb"> </span>Fov.VERTICAL;<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>Fov<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.Camera$Fov,<span style="color: #BBB"> </span>fov<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>aspect<span style="color: #BBB"> </span><span style="color: #666"><</span><span style="color: #BBB"> </span><span style="color: #666">1</span><span style="color: #BBB"> </span><span style="color: #666">?</span><span style="color: #BBB"> </span>Fov.HORIZONTAL<span style="color: #BBB"> </span><span style="color: #666">:</span><span style="color: #BBB"> </span>Fov.VERTICAL;
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.camera.setProjectionFov(<span style="color: #666666">45</span>,<span style="color: #bbbbbb"> </span>aspect,<span style="color: #bbbbbb"> </span><span style="color: #666666">1.0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">10.0</span>,<span style="color: #bbbbbb"> </span>fov);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.camera.setProjectionFov(<span style="color: #666">45</span>,<span style="color: #BBB"> </span>aspect,<span style="color: #BBB"> </span><span style="color: #666">1.0</span>,<span style="color: #BBB"> </span><span style="color: #666">10.0</span>,<span style="color: #BBB"> </span>fov);
|
||||||
<span style="color: #bbbbbb"> </span>}<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>}
|
||||||
}<span style="color: #bbbbbb"></span>
|
}
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>Our app will only require a subset of assets to be present for <code>App</code> construction. We'll download
|
<p>Our app will only require a subset of assets to be present for <code>App</code> construction. We'll download
|
||||||
the other assets after construction. By using a progressive loading strategy, we can reduce the
|
the other assets after construction. By using a progressive loading strategy, we can reduce the
|
||||||
perceived load time.</p>
|
perceived load time.</p>
|
||||||
<p>Next we need to supply the URLs for various assets. This is actually a bit tricky, because different
|
<p>Next we need to supply the URLs for various assets. This is actually a bit tricky, because different
|
||||||
@@ -171,85 +171,85 @@ string -- which might be empty.</p>
|
|||||||
<p>In our case, we know that our web server will have <code>astc</code> and <code>s3tc</code> variants for albedo, and <code>etc</code>
|
<p>In our case, we know that our web server will have <code>astc</code> and <code>s3tc</code> variants for albedo, and <code>etc</code>
|
||||||
variants for the other textures. The uncompressed variants (empty string) are always available as a
|
variants for the other textures. The uncompressed variants (empty string) are always available as a
|
||||||
last resort. Go ahead and replace the <strong>declare asset URLs</strong> comment with the following snippet.</p>
|
last resort. Go ahead and replace the <strong>declare asset URLs</strong> comment with the following snippet.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>albedo_suffix<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.getSupportedFormatSuffix(<span style="color: #BA2121">'astc s3tc_srgb'</span>);<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>albedo_suffix<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.getSupportedFormatSuffix(<span style="color: #BA2121">'astc s3tc_srgb'</span>);
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>texture_suffix<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.getSupportedFormatSuffix(<span style="color: #BA2121">'etc'</span>);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>texture_suffix<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.getSupportedFormatSuffix(<span style="color: #BA2121">'etc'</span>);
|
||||||
|
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>environ<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #BA2121">'venetian_crossroads_2k'</span><span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>environ<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #BA2121">'venetian_crossroads_2k'</span>
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>ibl_url<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #BA2121">`</span><span style="color: #A45A77; font-weight: bold">${</span>environ<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">/</span><span style="color: #A45A77; font-weight: bold">${</span>environ<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">_ibl.ktx`</span>;<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>ibl_url<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #BA2121">`</span><span style="color: #A45A77; font-weight: bold">${</span>environ<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">/</span><span style="color: #A45A77; font-weight: bold">${</span>environ<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">_ibl.ktx`</span>;
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>sky_small_url<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #BA2121">`</span><span style="color: #A45A77; font-weight: bold">${</span>environ<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">/</span><span style="color: #A45A77; font-weight: bold">${</span>environ<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">_skybox_tiny.ktx`</span>;<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>sky_small_url<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #BA2121">`</span><span style="color: #A45A77; font-weight: bold">${</span>environ<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">/</span><span style="color: #A45A77; font-weight: bold">${</span>environ<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">_skybox_tiny.ktx`</span>;
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>sky_large_url<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #BA2121">`</span><span style="color: #A45A77; font-weight: bold">${</span>environ<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">/</span><span style="color: #A45A77; font-weight: bold">${</span>environ<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">_skybox.ktx`</span>;<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>sky_large_url<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #BA2121">`</span><span style="color: #A45A77; font-weight: bold">${</span>environ<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">/</span><span style="color: #A45A77; font-weight: bold">${</span>environ<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">_skybox.ktx`</span>;
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>albedo_url<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #BA2121">`albedo</span><span style="color: #A45A77; font-weight: bold">${</span>albedo_suffix<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">.ktx`</span>;<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>albedo_url<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #BA2121">`albedo</span><span style="color: #A45A77; font-weight: bold">${</span>albedo_suffix<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">.ktx`</span>;
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>ao_url<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #BA2121">`ao</span><span style="color: #A45A77; font-weight: bold">${</span>texture_suffix<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">.ktx`</span>;<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>ao_url<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #BA2121">`ao</span><span style="color: #A45A77; font-weight: bold">${</span>texture_suffix<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">.ktx`</span>;
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>metallic_url<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #BA2121">`metallic</span><span style="color: #A45A77; font-weight: bold">${</span>texture_suffix<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">.ktx`</span>;<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>metallic_url<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #BA2121">`metallic</span><span style="color: #A45A77; font-weight: bold">${</span>texture_suffix<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">.ktx`</span>;
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>normal_url<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #BA2121">`normal</span><span style="color: #A45A77; font-weight: bold">${</span>texture_suffix<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">.ktx`</span>;<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>normal_url<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #BA2121">`normal</span><span style="color: #A45A77; font-weight: bold">${</span>texture_suffix<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">.ktx`</span>;
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>roughness_url<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #BA2121">`roughness</span><span style="color: #A45A77; font-weight: bold">${</span>texture_suffix<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">.ktx`</span>;<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>roughness_url<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #BA2121">`roughness</span><span style="color: #A45A77; font-weight: bold">${</span>texture_suffix<span style="color: #A45A77; font-weight: bold">}</span><span style="color: #BA2121">.ktx`</span>;
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>filamat_url<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #BA2121">'textured.filamat'</span>;<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>filamat_url<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #BA2121">'textured.filamat'</span>;
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>filamesh_url<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #BA2121">'suzanne.filamesh'</span>;<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>filamesh_url<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #BA2121">'suzanne.filamesh'</span>;
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<h2>Create skybox and IBL</h2>
|
<h2>Create skybox and IBL</h2>
|
||||||
<p>Next, let's create the low-resolution skybox and IBL in the <code>App</code> constructor.</p>
|
<p>Next, let's create the low-resolution skybox and IBL in the <code>App</code> constructor.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">this</span>.skybox<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createSkyFromKtx1(sky_small_url);<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">this</span>.skybox<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createSkyFromKtx1(sky_small_url);
|
||||||
<span style="color: #008000; font-weight: bold">this</span>.scene.setSkybox(<span style="color: #008000; font-weight: bold">this</span>.skybox);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">this</span>.scene.setSkybox(<span style="color: #008000; font-weight: bold">this</span>.skybox);
|
||||||
<span style="color: #008000; font-weight: bold">this</span>.indirectLight<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createIblFromKtx1(ibl_url);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">this</span>.indirectLight<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createIblFromKtx1(ibl_url);
|
||||||
<span style="color: #008000; font-weight: bold">this</span>.indirectLight.setIntensity(<span style="color: #666666">100000</span>);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">this</span>.indirectLight.setIntensity(<span style="color: #666">100000</span>);
|
||||||
<span style="color: #008000; font-weight: bold">this</span>.scene.setIndirectLight(<span style="color: #008000; font-weight: bold">this</span>.indirectLight);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">this</span>.scene.setIndirectLight(<span style="color: #008000; font-weight: bold">this</span>.indirectLight);
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>This allows users to see a reasonable background fairly quickly, before larger assets have finished
|
<p>This allows users to see a reasonable background fairly quickly, before larger assets have finished
|
||||||
loading in.</p>
|
loading in.</p>
|
||||||
<h2>Fetch assets asychronously</h2>
|
<h2>Fetch assets asychronously</h2>
|
||||||
<p>Next we'll invoke the <code>Filament.fetch</code> function from within the app constructor. This function is
|
<p>Next we'll invoke the <code>Filament.fetch</code> function from within the app constructor. This function is
|
||||||
very similar to <code>Filament.init</code>. It takes a list of asset URLs and a callback function that triggers
|
very similar to <code>Filament.init</code>. It takes a list of asset URLs and a callback function that triggers
|
||||||
when the assets have finished downloading.</p>
|
when the assets have finished downloading.</p>
|
||||||
<p>In our callback, we'll make several <code>setTextureParameter</code> calls on the material instance, then we'll
|
<p>In our callback, we'll make several <code>setTextureParameter</code> calls on the material instance, then we'll
|
||||||
recreate the skybox using a higher-resolution texture. As a last step we unhide the renderable that
|
recreate the skybox using a higher-resolution texture. As a last step we unhide the renderable that
|
||||||
was created in the app constructor.</p>
|
was created in the app constructor.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>Filament.fetch([sky_large_url,<span style="color: #bbbbbb"> </span>albedo_url,<span style="color: #bbbbbb"> </span>roughness_url,<span style="color: #bbbbbb"> </span>metallic_url,<span style="color: #bbbbbb"> </span>normal_url,<span style="color: #bbbbbb"> </span>ao_url],<span style="color: #bbbbbb"> </span>()<span style="color: #bbbbbb"> </span>=><span style="color: #bbbbbb"> </span>{<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>Filament.fetch([sky_large_url,<span style="color: #BBB"> </span>albedo_url,<span style="color: #BBB"> </span>roughness_url,<span style="color: #BBB"> </span>metallic_url,<span style="color: #BBB"> </span>normal_url,<span style="color: #BBB"> </span>ao_url],<span style="color: #BBB"> </span>()<span style="color: #BBB"> </span>=><span style="color: #BBB"> </span>{
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>albedo<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createTextureFromKtx2(albedo_url,<span style="color: #bbbbbb"> </span>{srgb<span style="color: #666666">:</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">true</span>});<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>albedo<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createTextureFromKtx2(albedo_url,<span style="color: #BBB"> </span>{srgb<span style="color: #666">:</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">true</span>});
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>roughness<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createTextureFromKtx2(roughness_url);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>roughness<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createTextureFromKtx2(roughness_url);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>metallic<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createTextureFromKtx2(metallic_url);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>metallic<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createTextureFromKtx2(metallic_url);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>normal<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createTextureFromKtx2(normal_url);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>normal<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createTextureFromKtx2(normal_url);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>ao<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createTextureFromKtx2(ao_url);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>ao<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createTextureFromKtx2(ao_url);
|
||||||
|
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>sampler<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #AA22FF; font-weight: bold">new</span><span style="color: #bbbbbb"> </span>Filament.TextureSampler(<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>sampler<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #A2F; font-weight: bold">new</span><span style="color: #BBB"> </span>Filament.TextureSampler(
|
||||||
<span style="color: #bbbbbb"> </span>Filament.MinFilter.LINEAR_MIPMAP_LINEAR,<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>Filament.MinFilter.LINEAR_MIPMAP_LINEAR,
|
||||||
<span style="color: #bbbbbb"> </span>Filament.MagFilter.LINEAR,<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>Filament.MagFilter.LINEAR,
|
||||||
<span style="color: #bbbbbb"> </span>Filament.WrapMode.CLAMP_TO_EDGE);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>Filament.WrapMode.CLAMP_TO_EDGE);
|
||||||
|
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.matinstance.setTextureParameter(<span style="color: #BA2121">'albedo'</span>,<span style="color: #bbbbbb"> </span>albedo,<span style="color: #bbbbbb"> </span>sampler);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.matinstance.setTextureParameter(<span style="color: #BA2121">'albedo'</span>,<span style="color: #BBB"> </span>albedo,<span style="color: #BBB"> </span>sampler);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.matinstance.setTextureParameter(<span style="color: #BA2121">'roughness'</span>,<span style="color: #bbbbbb"> </span>roughness,<span style="color: #bbbbbb"> </span>sampler);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.matinstance.setTextureParameter(<span style="color: #BA2121">'roughness'</span>,<span style="color: #BBB"> </span>roughness,<span style="color: #BBB"> </span>sampler);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.matinstance.setTextureParameter(<span style="color: #BA2121">'metallic'</span>,<span style="color: #bbbbbb"> </span>metallic,<span style="color: #bbbbbb"> </span>sampler);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.matinstance.setTextureParameter(<span style="color: #BA2121">'metallic'</span>,<span style="color: #BBB"> </span>metallic,<span style="color: #BBB"> </span>sampler);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.matinstance.setTextureParameter(<span style="color: #BA2121">'normal'</span>,<span style="color: #bbbbbb"> </span>normal,<span style="color: #bbbbbb"> </span>sampler);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.matinstance.setTextureParameter(<span style="color: #BA2121">'normal'</span>,<span style="color: #BBB"> </span>normal,<span style="color: #BBB"> </span>sampler);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.matinstance.setTextureParameter(<span style="color: #BA2121">'ao'</span>,<span style="color: #bbbbbb"> </span>ao,<span style="color: #bbbbbb"> </span>sampler);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.matinstance.setTextureParameter(<span style="color: #BA2121">'ao'</span>,<span style="color: #BBB"> </span>ao,<span style="color: #BBB"> </span>sampler);
|
||||||
|
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #3D7B7B; font-style: italic">// Replace low-res skybox with high-res skybox.</span><span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// Replace low-res skybox with high-res skybox.</span>
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.destroySkybox(<span style="color: #008000; font-weight: bold">this</span>.skybox);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.destroySkybox(<span style="color: #008000; font-weight: bold">this</span>.skybox);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.skybox<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createSkyFromKtx1(sky_large_url);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.skybox<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.createSkyFromKtx1(sky_large_url);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.scene.setSkybox(<span style="color: #008000; font-weight: bold">this</span>.skybox);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.scene.setSkybox(<span style="color: #008000; font-weight: bold">this</span>.skybox);
|
||||||
|
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.scene.addEntity(<span style="color: #008000; font-weight: bold">this</span>.suzanne);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.scene.addEntity(<span style="color: #008000; font-weight: bold">this</span>.suzanne);
|
||||||
});<span style="color: #bbbbbb"></span>
|
});
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<h2>Introduce trackball rotation</h2>
|
<h2>Introduce trackball rotation</h2>
|
||||||
<p>Add the following script tag to your HTML file. This imports a small third-party library that
|
<p>Add the following script tag to your HTML file. This imports a small third-party library that
|
||||||
listens for drag events and computes a rotation matrix.</p>
|
listens for drag events and computes a rotation matrix.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><<span style="color: #008000; font-weight: bold">script</span> <span style="color: #687822">src</span><span style="color: #666666">=</span><span style="color: #BA2121">"//unpkg.com/gltumble"</span>></<span style="color: #008000; font-weight: bold">script</span>>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><<span style="color: #008000; font-weight: bold">script</span> <span style="color: #687822">src</span><span style="color: #666">=</span><span style="color: #BA2121">"//unpkg.com/gltumble"</span>></<span style="color: #008000; font-weight: bold">script</span>>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>Next, replace the <strong>initialize gltumble</strong> and <strong>apply gltumble matrix</strong> comments with the following
|
<p>Next, replace the <strong>initialize gltumble</strong> and <strong>apply gltumble matrix</strong> comments with the following
|
||||||
two code snippets.</p>
|
two code snippets.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">this</span>.trackball<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #AA22FF; font-weight: bold">new</span><span style="color: #bbbbbb"> </span>Trackball(canvas,<span style="color: #bbbbbb"> </span>{startSpin<span style="color: #666666">:</span><span style="color: #bbbbbb"> </span><span style="color: #666666">0.035</span>});<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">this</span>.trackball<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #A2F; font-weight: bold">new</span><span style="color: #BBB"> </span>Trackball(canvas,<span style="color: #BBB"> </span>{startSpin<span style="color: #666">:</span><span style="color: #BBB"> </span><span style="color: #666">0.035</span>});
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>tcm<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.getTransformManager();<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>tcm<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.getTransformManager();
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>inst<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>tcm.getInstance(<span style="color: #008000; font-weight: bold">this</span>.suzanne);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>inst<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>tcm.getInstance(<span style="color: #008000; font-weight: bold">this</span>.suzanne);
|
||||||
tcm.setTransform(inst,<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.trackball.getMatrix());<span style="color: #bbbbbb"></span>
|
tcm.setTransform(inst,<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.trackball.getMatrix());
|
||||||
inst.<span style="color: #AA22FF; font-weight: bold">delete</span>();<span style="color: #bbbbbb"></span>
|
inst.<span style="color: #A2F; font-weight: bold">delete</span>();
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>That's it, we now have a fast-loading interactive demo. The complete JavaScript file is available
|
<p>That's it, we now have a fast-loading interactive demo. The complete JavaScript file is available
|
||||||
<a href="tutorial_suzanne.js">here</a>.</p>
|
<a href="tutorial_suzanne.js">here</a>.</p>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -8,30 +8,30 @@
|
|||||||
<div class="demo_frame"><iframe src="demo_triangle.html"></iframe><a href="demo_triangle.html">🔗</a></div>
|
<div class="demo_frame"><iframe src="demo_triangle.html"></iframe><a href="demo_triangle.html">🔗</a></div>
|
||||||
<h2>Literate programming</h2>
|
<h2>Literate programming</h2>
|
||||||
<p>The markdown source for this tutorial is not only used to generate this
|
<p>The markdown source for this tutorial is not only used to generate this
|
||||||
web page, it's also used to generate the JavaScript for the above demo.
|
web page, it's also used to generate the JavaScript for the above demo.
|
||||||
We use a small Python script for weaving (generating HTML) and tangling
|
We use a small Python script for weaving (generating HTML) and tangling
|
||||||
(generating JS). In the code samples, you'll often see
|
(generating JS). In the code samples, you'll often see
|
||||||
<code>// TODO: <some task></code>. These are special markers that get replaced by
|
<code>// TODO: <some task></code>. These are special markers that get replaced by
|
||||||
subsequent code blocks.</p>
|
subsequent code blocks.</p>
|
||||||
<h2>Start your project</h2>
|
<h2>Start your project</h2>
|
||||||
<p>First, create a text file called <code>triangle.html</code> and fill it with the following HTML. This creates
|
<p>First, create a text file called <code>triangle.html</code> and fill it with the following HTML. This creates
|
||||||
a mobile-friendly page with a full-screen canvas.</p>
|
a mobile-friendly page with a full-screen canvas.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #9C6500"><!DOCTYPE html></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #9C6500"><!DOCTYPE html></span>
|
||||||
<<span style="color: #008000; font-weight: bold">html</span> <span style="color: #687822">lang</span><span style="color: #666666">=</span><span style="color: #BA2121">"en"</span>>
|
<<span style="color: #008000; font-weight: bold">html</span> <span style="color: #687822">lang</span><span style="color: #666">=</span><span style="color: #BA2121">"en"</span>>
|
||||||
<<span style="color: #008000; font-weight: bold">head</span>>
|
<<span style="color: #008000; font-weight: bold">head</span>>
|
||||||
<<span style="color: #008000; font-weight: bold">title</span>>Filament Tutorial</<span style="color: #008000; font-weight: bold">title</span>>
|
<<span style="color: #008000; font-weight: bold">title</span>>Filament Tutorial</<span style="color: #008000; font-weight: bold">title</span>>
|
||||||
<<span style="color: #008000; font-weight: bold">meta</span> <span style="color: #687822">charset</span><span style="color: #666666">=</span><span style="color: #BA2121">"utf-8"</span>>
|
<<span style="color: #008000; font-weight: bold">meta</span> <span style="color: #687822">charset</span><span style="color: #666">=</span><span style="color: #BA2121">"utf-8"</span>>
|
||||||
<<span style="color: #008000; font-weight: bold">meta</span> <span style="color: #687822">name</span><span style="color: #666666">=</span><span style="color: #BA2121">"viewport"</span> <span style="color: #687822">content</span><span style="color: #666666">=</span><span style="color: #BA2121">"width=device-width,user-scalable=no,initial-scale=1"</span>>
|
<<span style="color: #008000; font-weight: bold">meta</span> <span style="color: #687822">name</span><span style="color: #666">=</span><span style="color: #BA2121">"viewport"</span> <span style="color: #687822">content</span><span style="color: #666">=</span><span style="color: #BA2121">"width=device-width,user-scalable=no,initial-scale=1"</span>>
|
||||||
<<span style="color: #008000; font-weight: bold">style</span>><span style="color: #bbbbbb"></span>
|
<<span style="color: #008000; font-weight: bold">style</span>>
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">body</span><span style="color: #bbbbbb"> </span>{<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">margin</span>:<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>;<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">overflow</span>:<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">hidden</span>;<span style="color: #bbbbbb"> </span>}<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">body</span><span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">margin</span>:<span style="color: #BBB"> </span><span style="color: #666">0</span>;<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">overflow</span>:<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">hidden</span>;<span style="color: #BBB"> </span>}
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">canvas</span><span style="color: #bbbbbb"> </span>{<span style="color: #bbbbbb"> </span>touch-action:<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">none</span>;<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">width</span>:<span style="color: #bbbbbb"> </span><span style="color: #666666">100</span><span style="color: #B00040">%</span>;<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">height</span>:<span style="color: #bbbbbb"> </span><span style="color: #666666">100</span><span style="color: #B00040">%</span>;<span style="color: #bbbbbb"> </span>}<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">canvas</span><span style="color: #BBB"> </span>{<span style="color: #BBB"> </span>touch-action:<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">none</span>;<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">width</span>:<span style="color: #BBB"> </span><span style="color: #666">100</span><span style="color: #B00040">%</span>;<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">height</span>:<span style="color: #BBB"> </span><span style="color: #666">100</span><span style="color: #B00040">%</span>;<span style="color: #BBB"> </span>}
|
||||||
<span style="color: #bbbbbb"> </span></<span style="color: #008000; font-weight: bold">style</span>>
|
<span style="color: #BBB"> </span></<span style="color: #008000; font-weight: bold">style</span>>
|
||||||
</<span style="color: #008000; font-weight: bold">head</span>>
|
</<span style="color: #008000; font-weight: bold">head</span>>
|
||||||
<<span style="color: #008000; font-weight: bold">body</span>>
|
<<span style="color: #008000; font-weight: bold">body</span>>
|
||||||
<<span style="color: #008000; font-weight: bold">canvas</span>></<span style="color: #008000; font-weight: bold">canvas</span>>
|
<<span style="color: #008000; font-weight: bold">canvas</span>></<span style="color: #008000; font-weight: bold">canvas</span>>
|
||||||
<<span style="color: #008000; font-weight: bold">script</span> <span style="color: #687822">src</span><span style="color: #666666">=</span><span style="color: #BA2121">"filament.js"</span>></<span style="color: #008000; font-weight: bold">script</span>>
|
<<span style="color: #008000; font-weight: bold">script</span> <span style="color: #687822">src</span><span style="color: #666">=</span><span style="color: #BA2121">"filament.js"</span>></<span style="color: #008000; font-weight: bold">script</span>>
|
||||||
<<span style="color: #008000; font-weight: bold">script</span> <span style="color: #687822">src</span><span style="color: #666666">=</span><span style="color: #BA2121">"//unpkg.com/gl-matrix@2.8.1"</span>></<span style="color: #008000; font-weight: bold">script</span>>
|
<<span style="color: #008000; font-weight: bold">script</span> <span style="color: #687822">src</span><span style="color: #666">=</span><span style="color: #BA2121">"//unpkg.com/gl-matrix@2.8.1"</span>></<span style="color: #008000; font-weight: bold">script</span>>
|
||||||
<<span style="color: #008000; font-weight: bold">script</span> <span style="color: #687822">src</span><span style="color: #666666">=</span><span style="color: #BA2121">"triangle.js"</span>></<span style="color: #008000; font-weight: bold">script</span>>
|
<<span style="color: #008000; font-weight: bold">script</span> <span style="color: #687822">src</span><span style="color: #666">=</span><span style="color: #BA2121">"triangle.js"</span>></<span style="color: #008000; font-weight: bold">script</span>>
|
||||||
</<span style="color: #008000; font-weight: bold">body</span>>
|
</<span style="color: #008000; font-weight: bold">body</span>>
|
||||||
</<span style="color: #008000; font-weight: bold">html</span>>
|
</<span style="color: #008000; font-weight: bold">html</span>>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
@@ -48,63 +48,63 @@ a mobile-friendly page with a full-screen canvas.</p>
|
|||||||
<li><code>triangle.js</code> will contain your application code.</li>
|
<li><code>triangle.js</code> will contain your application code.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>Go ahead and create <code>triangle.js</code> with the following content.</p>
|
<p>Go ahead and create <code>triangle.js</code> with the following content.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">class</span><span style="color: #bbbbbb"> </span>App<span style="color: #bbbbbb"> </span>{<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">class</span><span style="color: #BBB"> </span>App<span style="color: #BBB"> </span>{
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">constructor</span>()<span style="color: #bbbbbb"> </span>{<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">constructor</span>()<span style="color: #BBB"> </span>{
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: create entities</span><span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: create entities</span>
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.render<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.render.bind(<span style="color: #008000; font-weight: bold">this</span>);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.render<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.render.bind(<span style="color: #008000; font-weight: bold">this</span>);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.resize<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.resize.bind(<span style="color: #008000; font-weight: bold">this</span>);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.resize<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.resize.bind(<span style="color: #008000; font-weight: bold">this</span>);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.addEventListener(<span style="color: #BA2121">'resize'</span>,<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.resize);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000">window</span>.addEventListener(<span style="color: #BA2121">'resize'</span>,<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.resize);
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.requestAnimationFrame(<span style="color: #008000; font-weight: bold">this</span>.render);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000">window</span>.requestAnimationFrame(<span style="color: #008000; font-weight: bold">this</span>.render);
|
||||||
<span style="color: #bbbbbb"> </span>}<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>}
|
||||||
<span style="color: #bbbbbb"> </span>render()<span style="color: #bbbbbb"> </span>{<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>render()<span style="color: #BBB"> </span>{
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: render scene</span><span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: render scene</span>
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.requestAnimationFrame(<span style="color: #008000; font-weight: bold">this</span>.render);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000">window</span>.requestAnimationFrame(<span style="color: #008000; font-weight: bold">this</span>.render);
|
||||||
<span style="color: #bbbbbb"> </span>}<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>}
|
||||||
<span style="color: #bbbbbb"> </span>resize()<span style="color: #bbbbbb"> </span>{<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>resize()<span style="color: #BBB"> </span>{
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: adjust viewport and canvas</span><span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: adjust viewport and canvas</span>
|
||||||
<span style="color: #bbbbbb"> </span>}<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>}
|
||||||
}<span style="color: #bbbbbb"></span>
|
}
|
||||||
|
|
||||||
Filament.init([<span style="color: #BA2121">'triangle.filamat'</span>],<span style="color: #bbbbbb"> </span>()<span style="color: #bbbbbb"> </span>=><span style="color: #bbbbbb"> </span>{<span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.app<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #AA22FF; font-weight: bold">new</span><span style="color: #bbbbbb"> </span>App()<span style="color: #bbbbbb"> </span>}<span style="color: #bbbbbb"> </span>);<span style="color: #bbbbbb"></span>
|
Filament.init([<span style="color: #BA2121">'triangle.filamat'</span>],<span style="color: #BBB"> </span>()<span style="color: #BBB"> </span>=><span style="color: #BBB"> </span>{<span style="color: #BBB"> </span><span style="color: #008000">window</span>.app<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #A2F; font-weight: bold">new</span><span style="color: #BBB"> </span>App()<span style="color: #BBB"> </span>}<span style="color: #BBB"> </span>);
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>The two calls to <code>bind()</code> allow us to pass instance methods as callbacks for animation and resize
|
<p>The two calls to <code>bind()</code> allow us to pass instance methods as callbacks for animation and resize
|
||||||
events.</p>
|
events.</p>
|
||||||
<p><code>Filament.init()</code> consumes two things: a list of asset URLs and a callback.</p>
|
<p><code>Filament.init()</code> consumes two things: a list of asset URLs and a callback.</p>
|
||||||
<p>The callback will be triggered only after all assets finish downloading and the Filament module has
|
<p>The callback will be triggered only after all assets finish downloading and the Filament module has
|
||||||
become ready. In our callback, we simply instantiated the <code>App</code> object, since we'll do most of the
|
become ready. In our callback, we simply instantiated the <code>App</code> object, since we'll do most of the
|
||||||
work in its constructor. We also set the app instance into a <code>Window</code> property to make it accessible
|
work in its constructor. We also set the app instance into a <code>Window</code> property to make it accessible
|
||||||
from the developer console.</p>
|
from the developer console.</p>
|
||||||
<p>Go ahead and download <a href="triangle.filamat">triangle.filamat</a> and place it in your project folder.
|
<p>Go ahead and download <a href="triangle.filamat">triangle.filamat</a> and place it in your project folder.
|
||||||
This is a <em>material package</em>, which is a binary file that contains shaders and other bits of data
|
This is a <em>material package</em>, which is a binary file that contains shaders and other bits of data
|
||||||
that define a PBR material. We'll learn more about material packages in the next tutorial.</p>
|
that define a PBR material. We'll learn more about material packages in the next tutorial.</p>
|
||||||
<h2>Spawn a local server</h2>
|
<h2>Spawn a local server</h2>
|
||||||
<p>Because of CORS restrictions, your web app cannot fetch the material package directly from the
|
<p>Because of CORS restrictions, your web app cannot fetch the material package directly from the
|
||||||
file system. One way around this is to create a temporary server using Python or node:</p>
|
file system. One way around this is to create a temporary server using Python or node:</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>python3 -m http.server <span style="color: #3D7B7B; font-style: italic"># Python 3</span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>python3<span style="color: #BBB"> </span>-m<span style="color: #BBB"> </span>http.server<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic"># Python 3</span>
|
||||||
python -m SimpleHTTPServer <span style="color: #3D7B7B; font-style: italic"># Python 2.7</span>
|
python<span style="color: #BBB"> </span>-m<span style="color: #BBB"> </span>SimpleHTTPServer<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic"># Python 2.7</span>
|
||||||
npx http-server -p <span style="color: #666666">8000</span> <span style="color: #3D7B7B; font-style: italic"># nodejs</span>
|
npx<span style="color: #BBB"> </span>http-server<span style="color: #BBB"> </span>-p<span style="color: #BBB"> </span><span style="color: #666">8000</span><span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic"># nodejs</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>To see if this works, navigate to <a href="http://localhost:8000">http://localhost:8000</a> and check if you
|
<p>To see if this works, navigate to <a href="http://localhost:8000">http://localhost:8000</a> and check if you
|
||||||
can load the page without any errors appearing in the developer console.</p>
|
can load the page without any errors appearing in the developer console.</p>
|
||||||
<p>Take care not to use Python's simple server in production since it does not serve WebAssembly files
|
<p>Take care not to use Python's simple server in production since it does not serve WebAssembly files
|
||||||
with the correct MIME type.</p>
|
with the correct MIME type.</p>
|
||||||
<h2>Create the Engine and Scene</h2>
|
<h2>Create the Engine and Scene</h2>
|
||||||
<p>We now have a basic skeleton that can respond to paint and resize events. Let's start adding
|
<p>We now have a basic skeleton that can respond to paint and resize events. Let's start adding
|
||||||
Filament objects to the app. Insert the following code into the top of the app constructor.</p>
|
Filament objects to the app. Insert the following code into the top of the app constructor.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">this</span>.canvas<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000">document</span>.getElementsByTagName(<span style="color: #BA2121">'canvas'</span>)[<span style="color: #666666">0</span>];<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">this</span>.canvas<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000">document</span>.getElementsByTagName(<span style="color: #BA2121">'canvas'</span>)[<span style="color: #666">0</span>];
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>engine<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.engine<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.Engine.create(<span style="color: #008000; font-weight: bold">this</span>.canvas);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>engine<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.engine<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.Engine.create(<span style="color: #008000; font-weight: bold">this</span>.canvas);
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>The above snippet creates the <code>Engine</code> by passing it a canvas DOM object. The engine needs the
|
<p>The above snippet creates the <code>Engine</code> by passing it a canvas DOM object. The engine needs the
|
||||||
canvas in order to create a WebGL 2.0 context in its contructor.</p>
|
canvas in order to create a WebGL 2.0 context in its contructor.</p>
|
||||||
<p>The engine is a factory for many Filament entities, including <code>Scene</code>, which is a flat container of
|
<p>The engine is a factory for many Filament entities, including <code>Scene</code>, which is a flat container of
|
||||||
entities. Let's go ahead and create a scene, then add a blank entity called <code>triangle</code> into the
|
entities. Let's go ahead and create a scene, then add a blank entity called <code>triangle</code> into the
|
||||||
scene.</p>
|
scene.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">this</span>.scene<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>engine.createScene();<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">this</span>.scene<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>engine.createScene();
|
||||||
<span style="color: #008000; font-weight: bold">this</span>.triangle<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.EntityManager.get().create();<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">this</span>.triangle<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.EntityManager.get().create();
|
||||||
<span style="color: #008000; font-weight: bold">this</span>.scene.addEntity(<span style="color: #008000; font-weight: bold">this</span>.triangle);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">this</span>.scene.addEntity(<span style="color: #008000; font-weight: bold">this</span>.triangle);
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>Filament uses an <a href="//en.wikipedia.org/wiki/Entity-component-system">Entity-Component System</a>.
|
<p>Filament uses an <a href="//en.wikipedia.org/wiki/Entity-component-system">Entity-Component System</a>.
|
||||||
@@ -112,30 +112,30 @@ The triangle entity in the above snippet does not yet have an associated compone
|
|||||||
tutorial we will make it into a <em>renderable</em>. Renderables are entities that have associated draw
|
tutorial we will make it into a <em>renderable</em>. Renderables are entities that have associated draw
|
||||||
calls.</p>
|
calls.</p>
|
||||||
<h2>Construct typed arrays</h2>
|
<h2>Construct typed arrays</h2>
|
||||||
<p>Next we'll create two typed arrays: a positions array with XY coordinates for each vertex, and a
|
<p>Next we'll create two typed arrays: a positions array with XY coordinates for each vertex, and a
|
||||||
colors array with a 32-bit word for each vertex.</p>
|
colors array with a 32-bit word for each vertex.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>TRIANGLE_POSITIONS<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #AA22FF; font-weight: bold">new</span><span style="color: #bbbbbb"> </span><span style="color: #008000">Float32Array</span>([<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>TRIANGLE_POSITIONS<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #A2F; font-weight: bold">new</span><span style="color: #BBB"> </span><span style="color: #008000">Float32Array</span>([
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #666666">1</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>,<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #666">1</span>,<span style="color: #BBB"> </span><span style="color: #666">0</span>,
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000">Math</span>.cos(<span style="color: #008000">Math</span>.PI<span style="color: #bbbbbb"> </span><span style="color: #666666">*</span><span style="color: #bbbbbb"> </span><span style="color: #666666">2</span><span style="color: #bbbbbb"> </span><span style="color: #666666">/</span><span style="color: #bbbbbb"> </span><span style="color: #666666">3</span>),<span style="color: #bbbbbb"> </span><span style="color: #008000">Math</span>.sin(<span style="color: #008000">Math</span>.PI<span style="color: #bbbbbb"> </span><span style="color: #666666">*</span><span style="color: #bbbbbb"> </span><span style="color: #666666">2</span><span style="color: #bbbbbb"> </span><span style="color: #666666">/</span><span style="color: #bbbbbb"> </span><span style="color: #666666">3</span>),<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000">Math</span>.cos(<span style="color: #008000">Math</span>.PI<span style="color: #BBB"> </span><span style="color: #666">*</span><span style="color: #BBB"> </span><span style="color: #666">2</span><span style="color: #BBB"> </span><span style="color: #666">/</span><span style="color: #BBB"> </span><span style="color: #666">3</span>),<span style="color: #BBB"> </span><span style="color: #008000">Math</span>.sin(<span style="color: #008000">Math</span>.PI<span style="color: #BBB"> </span><span style="color: #666">*</span><span style="color: #BBB"> </span><span style="color: #666">2</span><span style="color: #BBB"> </span><span style="color: #666">/</span><span style="color: #BBB"> </span><span style="color: #666">3</span>),
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000">Math</span>.cos(<span style="color: #008000">Math</span>.PI<span style="color: #bbbbbb"> </span><span style="color: #666666">*</span><span style="color: #bbbbbb"> </span><span style="color: #666666">4</span><span style="color: #bbbbbb"> </span><span style="color: #666666">/</span><span style="color: #bbbbbb"> </span><span style="color: #666666">3</span>),<span style="color: #bbbbbb"> </span><span style="color: #008000">Math</span>.sin(<span style="color: #008000">Math</span>.PI<span style="color: #bbbbbb"> </span><span style="color: #666666">*</span><span style="color: #bbbbbb"> </span><span style="color: #666666">4</span><span style="color: #bbbbbb"> </span><span style="color: #666666">/</span><span style="color: #bbbbbb"> </span><span style="color: #666666">3</span>),<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000">Math</span>.cos(<span style="color: #008000">Math</span>.PI<span style="color: #BBB"> </span><span style="color: #666">*</span><span style="color: #BBB"> </span><span style="color: #666">4</span><span style="color: #BBB"> </span><span style="color: #666">/</span><span style="color: #BBB"> </span><span style="color: #666">3</span>),<span style="color: #BBB"> </span><span style="color: #008000">Math</span>.sin(<span style="color: #008000">Math</span>.PI<span style="color: #BBB"> </span><span style="color: #666">*</span><span style="color: #BBB"> </span><span style="color: #666">4</span><span style="color: #BBB"> </span><span style="color: #666">/</span><span style="color: #BBB"> </span><span style="color: #666">3</span>),
|
||||||
]);<span style="color: #bbbbbb"></span>
|
]);
|
||||||
|
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>TRIANGLE_COLORS<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #AA22FF; font-weight: bold">new</span><span style="color: #bbbbbb"> </span><span style="color: #008000">Uint32Array</span>([<span style="color: #666666">0xffff0000</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0xff00ff00</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0xff0000ff</span>]);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>TRIANGLE_COLORS<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #A2F; font-weight: bold">new</span><span style="color: #BBB"> </span><span style="color: #008000">Uint32Array</span>([<span style="color: #666">0xffff0000</span>,<span style="color: #BBB"> </span><span style="color: #666">0xff00ff00</span>,<span style="color: #BBB"> </span><span style="color: #666">0xff0000ff</span>]);
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>Next we'll use the positions and colors buffers to create a single <code>VertexBuffer</code> object.</p>
|
<p>Next we'll use the positions and colors buffers to create a single <code>VertexBuffer</code> object.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>VertexAttribute<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.VertexAttribute;<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>VertexAttribute<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.VertexAttribute;
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>AttributeType<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.VertexBuffer$AttributeType;<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>AttributeType<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.VertexBuffer$AttributeType;
|
||||||
<span style="color: #008000; font-weight: bold">this</span>.vb<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.VertexBuffer.Builder()<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">this</span>.vb<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.VertexBuffer.Builder()
|
||||||
<span style="color: #bbbbbb"> </span>.vertexCount(<span style="color: #666666">3</span>)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.vertexCount(<span style="color: #666">3</span>)
|
||||||
<span style="color: #bbbbbb"> </span>.bufferCount(<span style="color: #666666">2</span>)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.bufferCount(<span style="color: #666">2</span>)
|
||||||
<span style="color: #bbbbbb"> </span>.attribute(VertexAttribute.POSITION,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span>AttributeType.FLOAT2,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">8</span>)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.attribute(VertexAttribute.POSITION,<span style="color: #BBB"> </span><span style="color: #666">0</span>,<span style="color: #BBB"> </span>AttributeType.FLOAT2,<span style="color: #BBB"> </span><span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">8</span>)
|
||||||
<span style="color: #bbbbbb"> </span>.attribute(VertexAttribute.COLOR,<span style="color: #bbbbbb"> </span><span style="color: #666666">1</span>,<span style="color: #bbbbbb"> </span>AttributeType.UBYTE4,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">4</span>)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.attribute(VertexAttribute.COLOR,<span style="color: #BBB"> </span><span style="color: #666">1</span>,<span style="color: #BBB"> </span>AttributeType.UBYTE4,<span style="color: #BBB"> </span><span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">4</span>)
|
||||||
<span style="color: #bbbbbb"> </span>.normalized(VertexAttribute.COLOR)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.normalized(VertexAttribute.COLOR)
|
||||||
<span style="color: #bbbbbb"> </span>.build(engine);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.build(engine);
|
||||||
|
|
||||||
<span style="color: #008000; font-weight: bold">this</span>.vb.setBufferAt(engine,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span>TRIANGLE_POSITIONS);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">this</span>.vb.setBufferAt(engine,<span style="color: #BBB"> </span><span style="color: #666">0</span>,<span style="color: #BBB"> </span>TRIANGLE_POSITIONS);
|
||||||
<span style="color: #008000; font-weight: bold">this</span>.vb.setBufferAt(engine,<span style="color: #bbbbbb"> </span><span style="color: #666666">1</span>,<span style="color: #bbbbbb"> </span>TRIANGLE_COLORS);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">this</span>.vb.setBufferAt(engine,<span style="color: #BBB"> </span><span style="color: #666">1</span>,<span style="color: #BBB"> </span>TRIANGLE_COLORS);
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>The above snippet first creates aliases for two enum types, then constructs the vertex buffer using
|
<p>The above snippet first creates aliases for two enum types, then constructs the vertex buffer using
|
||||||
@@ -147,74 +147,74 @@ self-documenting.</p>
|
|||||||
<p>Our app sets up two buffer slots in the vertex buffer, and each slot is associated with a single
|
<p>Our app sets up two buffer slots in the vertex buffer, and each slot is associated with a single
|
||||||
attribute. Alternatively, we could have interleaved or concatenated these attributes into a single
|
attribute. Alternatively, we could have interleaved or concatenated these attributes into a single
|
||||||
buffer slot.</p>
|
buffer slot.</p>
|
||||||
<p>Next we'll construct an index buffer. The index buffer for our triangle is trivial: it simply holds
|
<p>Next we'll construct an index buffer. The index buffer for our triangle is trivial: it simply holds
|
||||||
the integers 0,1,2.</p>
|
the integers 0,1,2.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">this</span>.ib<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.IndexBuffer.Builder()<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">this</span>.ib<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.IndexBuffer.Builder()
|
||||||
<span style="color: #bbbbbb"> </span>.indexCount(<span style="color: #666666">3</span>)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.indexCount(<span style="color: #666">3</span>)
|
||||||
<span style="color: #bbbbbb"> </span>.bufferType(Filament.IndexBuffer$IndexType.USHORT)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.bufferType(Filament.IndexBuffer$IndexType.USHORT)
|
||||||
<span style="color: #bbbbbb"> </span>.build(engine);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.build(engine);
|
||||||
|
|
||||||
<span style="color: #008000; font-weight: bold">this</span>.ib.setBuffer(engine,<span style="color: #bbbbbb"> </span><span style="color: #AA22FF; font-weight: bold">new</span><span style="color: #bbbbbb"> </span><span style="color: #008000">Uint16Array</span>([<span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">1</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">2</span>]));<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">this</span>.ib.setBuffer(engine,<span style="color: #BBB"> </span><span style="color: #A2F; font-weight: bold">new</span><span style="color: #BBB"> </span><span style="color: #008000">Uint16Array</span>([<span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">1</span>,<span style="color: #BBB"> </span><span style="color: #666">2</span>]));
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>Note that constructing an index buffer is similar to constructing a vertex buffer, but it only has
|
<p>Note that constructing an index buffer is similar to constructing a vertex buffer, but it only has
|
||||||
one buffer slot, and it can only contain two types of data (USHORT or UINT).</p>
|
one buffer slot, and it can only contain two types of data (USHORT or UINT).</p>
|
||||||
<h2>Finish up initialization</h2>
|
<h2>Finish up initialization</h2>
|
||||||
<p>Next let's construct an actual <code>Material</code> from the material package that was downloaded (the
|
<p>Next let's construct an actual <code>Material</code> from the material package that was downloaded (the
|
||||||
material is an object; the package is just a binary blob), then extract the default
|
material is an object; the package is just a binary blob), then extract the default
|
||||||
<code>MaterialInstance</code> from the material object. Material instances have concrete values for their
|
<code>MaterialInstance</code> from the material object. Material instances have concrete values for their
|
||||||
parameters, and they can be bound to renderables. We'll learn more about material instances in the
|
parameters, and they can be bound to renderables. We'll learn more about material instances in the
|
||||||
next tutorial.</p>
|
next tutorial.</p>
|
||||||
<p>After extracting the material instance, we can finally create a renderable component for the
|
<p>After extracting the material instance, we can finally create a renderable component for the
|
||||||
triangle by setting up a bounding box and passing in the vertex and index buffers.</p>
|
triangle by setting up a bounding box and passing in the vertex and index buffers.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>mat<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>engine.createMaterial(<span style="color: #BA2121">'triangle.filamat'</span>);<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>mat<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>engine.createMaterial(<span style="color: #BA2121">'triangle.filamat'</span>);
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>matinst<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>mat.getDefaultInstance();<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>matinst<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>mat.getDefaultInstance();
|
||||||
Filament.RenderableManager.Builder(<span style="color: #666666">1</span>)<span style="color: #bbbbbb"></span>
|
Filament.RenderableManager.Builder(<span style="color: #666">1</span>)
|
||||||
<span style="color: #bbbbbb"> </span>.boundingBox({<span style="color: #bbbbbb"> </span>center<span style="color: #666666">:</span><span style="color: #bbbbbb"> </span>[<span style="color: #666666">-1</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">-1</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">-1</span>],<span style="color: #bbbbbb"> </span>halfExtent<span style="color: #666666">:</span><span style="color: #bbbbbb"> </span>[<span style="color: #666666">1</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">1</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">1</span>]<span style="color: #bbbbbb"> </span>})<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.boundingBox({<span style="color: #BBB"> </span>center<span style="color: #666">:</span><span style="color: #BBB"> </span>[<span style="color: #666">-1</span>,<span style="color: #BBB"> </span><span style="color: #666">-1</span>,<span style="color: #BBB"> </span><span style="color: #666">-1</span>],<span style="color: #BBB"> </span>halfExtent<span style="color: #666">:</span><span style="color: #BBB"> </span>[<span style="color: #666">1</span>,<span style="color: #BBB"> </span><span style="color: #666">1</span>,<span style="color: #BBB"> </span><span style="color: #666">1</span>]<span style="color: #BBB"> </span>})
|
||||||
<span style="color: #bbbbbb"> </span>.material(<span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span>matinst)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.material(<span style="color: #666">0</span>,<span style="color: #BBB"> </span>matinst)
|
||||||
<span style="color: #bbbbbb"> </span>.geometry(<span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span>Filament.RenderableManager$PrimitiveType.TRIANGLES,<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.vb,<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.ib)<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.geometry(<span style="color: #666">0</span>,<span style="color: #BBB"> </span>Filament.RenderableManager$PrimitiveType.TRIANGLES,<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.vb,<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.ib)
|
||||||
<span style="color: #bbbbbb"> </span>.build(engine,<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.triangle);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span>.build(engine,<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.triangle);
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>Next let's wrap up the initialization routine by creating the swap chain, renderer, camera, and
|
<p>Next let's wrap up the initialization routine by creating the swap chain, renderer, camera, and
|
||||||
view.</p>
|
view.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">this</span>.swapChain<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>engine.createSwapChain();<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">this</span>.swapChain<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>engine.createSwapChain();
|
||||||
<span style="color: #008000; font-weight: bold">this</span>.renderer<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>engine.createRenderer();<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">this</span>.renderer<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>engine.createRenderer();
|
||||||
<span style="color: #008000; font-weight: bold">this</span>.camera<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>engine.createCamera(Filament.EntityManager.get().create());<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">this</span>.camera<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>engine.createCamera(Filament.EntityManager.get().create());
|
||||||
<span style="color: #008000; font-weight: bold">this</span>.view<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>engine.createView();<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">this</span>.view<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>engine.createView();
|
||||||
<span style="color: #008000; font-weight: bold">this</span>.view.setCamera(<span style="color: #008000; font-weight: bold">this</span>.camera);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">this</span>.view.setCamera(<span style="color: #008000; font-weight: bold">this</span>.camera);
|
||||||
<span style="color: #008000; font-weight: bold">this</span>.view.setScene(<span style="color: #008000; font-weight: bold">this</span>.scene);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">this</span>.view.setScene(<span style="color: #008000; font-weight: bold">this</span>.scene);
|
||||||
|
|
||||||
<span style="color: #3D7B7B; font-style: italic">// Set up a blue-green background:</span><span style="color: #bbbbbb"></span>
|
<span style="color: #3D7B7B; font-style: italic">// Set up a blue-green background:</span>
|
||||||
<span style="color: #008000; font-weight: bold">this</span>.renderer.setClearOptions({clearColor<span style="color: #666666">:</span><span style="color: #bbbbbb"> </span>[<span style="color: #666666">0.0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0.1</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0.2</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">1.0</span>],<span style="color: #bbbbbb"> </span>clear<span style="color: #666666">:</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">true</span>});<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">this</span>.renderer.setClearOptions({clearColor<span style="color: #666">:</span><span style="color: #BBB"> </span>[<span style="color: #666">0.0</span>,<span style="color: #BBB"> </span><span style="color: #666">0.1</span>,<span style="color: #BBB"> </span><span style="color: #666">0.2</span>,<span style="color: #BBB"> </span><span style="color: #666">1.0</span>],<span style="color: #BBB"> </span>clear<span style="color: #666">:</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">true</span>});
|
||||||
|
|
||||||
<span style="color: #3D7B7B; font-style: italic">// Adjust the initial viewport:</span><span style="color: #bbbbbb"></span>
|
<span style="color: #3D7B7B; font-style: italic">// Adjust the initial viewport:</span>
|
||||||
<span style="color: #008000; font-weight: bold">this</span>.resize();<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">this</span>.resize();
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>At this point, we're done creating all Filament entities, and the code should run without errors.
|
<p>At this point, we're done creating all Filament entities, and the code should run without errors.
|
||||||
However the canvas is still blank!</p>
|
However the canvas is still blank!</p>
|
||||||
<h2>Render and resize handlers</h2>
|
<h2>Render and resize handlers</h2>
|
||||||
<p>Recall that our App class has a skeletal render method, which the browser calls every time it needs
|
<p>Recall that our App class has a skeletal render method, which the browser calls every time it needs
|
||||||
to repaint. Often this is 60 times a second.</p>
|
to repaint. Often this is 60 times a second.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>render()<span style="color: #bbbbbb"> </span>{<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>render()<span style="color: #BBB"> </span>{
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: render scene</span><span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #3D7B7B; font-style: italic">// TODO: render scene</span>
|
||||||
<span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.requestAnimationFrame(<span style="color: #008000; font-weight: bold">this</span>.render);<span style="color: #bbbbbb"></span>
|
<span style="color: #BBB"> </span><span style="color: #008000">window</span>.requestAnimationFrame(<span style="color: #008000; font-weight: bold">this</span>.render);
|
||||||
}<span style="color: #bbbbbb"></span>
|
}
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>Let's flesh this out by rotating the triangle and invoking the Filament renderer. Add the following
|
<p>Let's flesh this out by rotating the triangle and invoking the Filament renderer. Add the following
|
||||||
code to the top of the render method.</p>
|
code to the top of the render method.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #3D7B7B; font-style: italic">// Rotate the triangle.</span><span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #3D7B7B; font-style: italic">// Rotate the triangle.</span>
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>radians<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000">Date</span>.now()<span style="color: #bbbbbb"> </span><span style="color: #666666">/</span><span style="color: #bbbbbb"> </span><span style="color: #666666">1000</span>;<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>radians<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000">Date</span>.now()<span style="color: #BBB"> </span><span style="color: #666">/</span><span style="color: #BBB"> </span><span style="color: #666">1000</span>;
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>transform<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>mat4.fromRotation(mat4.create(),<span style="color: #bbbbbb"> </span>radians,<span style="color: #bbbbbb"> </span>[<span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">1</span>]);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>transform<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>mat4.fromRotation(mat4.create(),<span style="color: #BBB"> </span>radians,<span style="color: #BBB"> </span>[<span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">1</span>]);
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>tcm<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.getTransformManager();<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>tcm<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.engine.getTransformManager();
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>inst<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>tcm.getInstance(<span style="color: #008000; font-weight: bold">this</span>.triangle);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>inst<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>tcm.getInstance(<span style="color: #008000; font-weight: bold">this</span>.triangle);
|
||||||
tcm.setTransform(inst,<span style="color: #bbbbbb"> </span>transform);<span style="color: #bbbbbb"></span>
|
tcm.setTransform(inst,<span style="color: #BBB"> </span>transform);
|
||||||
inst.<span style="color: #AA22FF; font-weight: bold">delete</span>();<span style="color: #bbbbbb"></span>
|
inst.<span style="color: #A2F; font-weight: bold">delete</span>();
|
||||||
|
|
||||||
<span style="color: #3D7B7B; font-style: italic">// Render the frame.</span><span style="color: #bbbbbb"></span>
|
<span style="color: #3D7B7B; font-style: italic">// Render the frame.</span>
|
||||||
<span style="color: #008000; font-weight: bold">this</span>.renderer.render(<span style="color: #008000; font-weight: bold">this</span>.swapChain,<span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.view);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">this</span>.renderer.render(<span style="color: #008000; font-weight: bold">this</span>.swapChain,<span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.view);
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>The first half of our render method obtains the transform component of the triangle entity and uses
|
<p>The first half of our render method obtains the transform component of the triangle entity and uses
|
||||||
@@ -225,19 +225,19 @@ that it wants to skip a frame, hence the <code>if</code> statement.</p>
|
|||||||
<p>One last step. Add the following code to the resize method. This adjusts the resolution of the
|
<p>One last step. Add the following code to the resize method. This adjusts the resolution of the
|
||||||
rendering surface when the window size changes, taking <code>devicePixelRatio</code> into account for high-DPI
|
rendering surface when the window size changes, taking <code>devicePixelRatio</code> into account for high-DPI
|
||||||
displays. It also adjusts the camera frustum accordingly.</p>
|
displays. It also adjusts the camera frustum accordingly.</p>
|
||||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>dpr<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.devicePixelRatio;<span style="color: #bbbbbb"></span>
|
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span><span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>dpr<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000">window</span>.devicePixelRatio;
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>width<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.canvas.width<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.innerWidth<span style="color: #bbbbbb"> </span><span style="color: #666666">*</span><span style="color: #bbbbbb"> </span>dpr;<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>width<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.canvas.width<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000">window</span>.innerWidth<span style="color: #BBB"> </span><span style="color: #666">*</span><span style="color: #BBB"> </span>dpr;
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>height<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000; font-weight: bold">this</span>.canvas.height<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span><span style="color: #008000">window</span>.innerHeight<span style="color: #bbbbbb"> </span><span style="color: #666666">*</span><span style="color: #bbbbbb"> </span>dpr;<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>height<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000; font-weight: bold">this</span>.canvas.height<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span><span style="color: #008000">window</span>.innerHeight<span style="color: #BBB"> </span><span style="color: #666">*</span><span style="color: #BBB"> </span>dpr;
|
||||||
<span style="color: #008000; font-weight: bold">this</span>.view.setViewport([<span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span>width,<span style="color: #bbbbbb"> </span>height]);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">this</span>.view.setViewport([<span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">0</span>,<span style="color: #BBB"> </span>width,<span style="color: #BBB"> </span>height]);
|
||||||
|
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>aspect<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>width<span style="color: #bbbbbb"> </span><span style="color: #666666">/</span><span style="color: #bbbbbb"> </span>height;<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>aspect<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>width<span style="color: #BBB"> </span><span style="color: #666">/</span><span style="color: #BBB"> </span>height;
|
||||||
<span style="color: #008000; font-weight: bold">const</span><span style="color: #bbbbbb"> </span>Projection<span style="color: #bbbbbb"> </span><span style="color: #666666">=</span><span style="color: #bbbbbb"> </span>Filament.Camera$Projection;<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">const</span><span style="color: #BBB"> </span>Projection<span style="color: #BBB"> </span><span style="color: #666">=</span><span style="color: #BBB"> </span>Filament.Camera$Projection;
|
||||||
<span style="color: #008000; font-weight: bold">this</span>.camera.setProjection(Projection.ORTHO,<span style="color: #bbbbbb"> </span><span style="color: #666666">-</span>aspect,<span style="color: #bbbbbb"> </span>aspect,<span style="color: #bbbbbb"> </span><span style="color: #666666">-1</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">1</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">0</span>,<span style="color: #bbbbbb"> </span><span style="color: #666666">1</span>);<span style="color: #bbbbbb"></span>
|
<span style="color: #008000; font-weight: bold">this</span>.camera.setProjection(Projection.ORTHO,<span style="color: #BBB"> </span><span style="color: #666">-</span>aspect,<span style="color: #BBB"> </span>aspect,<span style="color: #BBB"> </span><span style="color: #666">-1</span>,<span style="color: #BBB"> </span><span style="color: #666">1</span>,<span style="color: #BBB"> </span><span style="color: #666">0</span>,<span style="color: #BBB"> </span><span style="color: #666">1</span>);
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>You should now have a spinning triangle! The completed JavaScript is available
|
<p>You should now have a spinning triangle! The completed JavaScript is available
|
||||||
<a href="tutorial_triangle.js">here</a>.</p>
|
<a href="tutorial_triangle.js">here</a>.</p>
|
||||||
<p>In the <a href="tutorial_redball.html">next tutorial</a>, we'll take a closer look at Filament materials and 3D rendering.</p>
|
<p>In the <a href="tutorial_redball.html">next tutorial</a>, we'll take a closer look at Filament materials and 3D rendering.</p>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -1,2 +1,5 @@
|
|||||||
book
|
build/__pycache__
|
||||||
src/dup/*.md
|
src_mdbook/book
|
||||||
|
src_mdbook/src/dup/*.md
|
||||||
|
src_mdbook/src/main/filament.md
|
||||||
|
src_mdbook/src/main/materials.md
|
||||||
|
|||||||
@@ -30,21 +30,23 @@ from utils import execute, ArgParseImpl
|
|||||||
CUR_DIR = os.path.dirname(os.path.abspath(__file__))
|
CUR_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||||
ROOT_DIR = os.path.join(CUR_DIR, '../../')
|
ROOT_DIR = os.path.join(CUR_DIR, '../../')
|
||||||
|
|
||||||
def get_last_commit_hash():
|
DOCS_SRC_DIR = os.path.abspath(os.path.join(CUR_DIR, '../'))
|
||||||
res, ret = execute('git rev-parse HEAD', cwd=ROOT_DIR)
|
MARKDEEP_SRC_DIR = os.path.join(DOCS_SRC_DIR, 'src_markdeep')
|
||||||
assert res == 0, 'Failed to get the last commit hash'
|
MDBOOK_SRC_DIR = os.path.join(DOCS_SRC_DIR, 'src_mdbook')
|
||||||
return ret.strip()
|
RAW_SRC_DIR = os.path.join(DOCS_SRC_DIR, 'src_raw')
|
||||||
|
|
||||||
|
SRC_SRC_DIRS = [MARKDEEP_SRC_DIR, MDBOOK_SRC_DIR, RAW_SRC_DIR]
|
||||||
|
|
||||||
def get_edited_files(commit_hash):
|
def get_edited_files(commit_hash):
|
||||||
INSERT = '#####?????'
|
INSERT = '#####?????'
|
||||||
res, ret = execute(f'git show --name-only --pretty=%b{INSERT} {commit_hash}')
|
res, ret = execute(f'git show --name-only --pretty=%b{INSERT} {commit_hash}')
|
||||||
assert res == 0, 'Failed to get edited filed'
|
assert res == 0, f'Failed to get edited filed {res}: ' + ret
|
||||||
files = []
|
files = []
|
||||||
_, after = ret.split(INSERT)
|
_, after = ret.split(INSERT)
|
||||||
for r in filter(lambda a: len(a) > 0, after.split('\n')):
|
for r in filter(lambda a: len(a) > 0, after.split('\n')):
|
||||||
if r.startswith('commit'):
|
if r.startswith('commit'):
|
||||||
break
|
break
|
||||||
files.append(r)
|
files.append(os.path.abspath(os.path.join(ROOT_DIR, r)))
|
||||||
return files
|
return files
|
||||||
|
|
||||||
# Returns True if there were no direct edits to '/docs'
|
# Returns True if there were no direct edits to '/docs'
|
||||||
@@ -59,12 +61,19 @@ def check_has_source_edits(commit_hash, printing=True):
|
|||||||
config = {}
|
config = {}
|
||||||
with open(f'{CUR_DIR}/duplicates.json') as config_txt:
|
with open(f'{CUR_DIR}/duplicates.json') as config_txt:
|
||||||
config = json.loads(config_txt.read())
|
config = json.loads(config_txt.read())
|
||||||
source_files = set(config.keys())
|
source_files = set(os.path.abspath(os.path.join(ROOT_DIR, k)) for k in config.keys())
|
||||||
edited_files = set(get_edited_files(commit_hash))
|
edited_files = set(get_edited_files(commit_hash))
|
||||||
overlap = [f'\t{f}' for f in list(source_files & edited_files)]
|
|
||||||
if printing and len(overlap) > 0:
|
# find any changes to docs_src sources
|
||||||
print(f'Found edited source files:\n' + '\n'.join(overlap))
|
is_docs_src_edit = lambda f: any(f.startswith(prefix) for prefix in SRC_SRC_DIRS)
|
||||||
return len(overlap) > 0
|
|
||||||
|
final_edited = [f'\t{f}' for f in \
|
||||||
|
list(source_files & edited_files) + \
|
||||||
|
list(filter(is_docs_src_edit, edited_files))]
|
||||||
|
|
||||||
|
if printing and len(final_edited) > 0:
|
||||||
|
print(f'Found edited source files:\n' + '\n'.join(final_edited))
|
||||||
|
return len(final_edited) > 0
|
||||||
|
|
||||||
# Returns true in a given TAG is found in the commit msg
|
# Returns true in a given TAG is found in the commit msg
|
||||||
def commit_msg_has_tag(commit_hash, tag, printing=True):
|
def commit_msg_has_tag(commit_hash, tag, printing=True):
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ LINUX_ARM=4
|
|||||||
|
|
||||||
function add_cargo_path() {
|
function add_cargo_path() {
|
||||||
local BASH_P="${HOME}/.bashrc"
|
local BASH_P="${HOME}/.bashrc"
|
||||||
local PATH_LINE='export PATH=${PATH}:~/.cargo/bin'
|
local PATH_LINE='export PATH=${PATH}:${HOME}/.cargo/bin'
|
||||||
local TYPE=$1
|
local TYPE=$1
|
||||||
if [ ${TYPE} == ${DARWIN_ARM} ] || [ ${TYPE} == ${DARWIN_X86} ]; then
|
if [ ${TYPE} == ${DARWIN_ARM} ] || [ ${TYPE} == ${DARWIN_X86} ]; then
|
||||||
BASH_P="${HOME}/.bash_profile"
|
BASH_P="${HOME}/.bash_profile"
|
||||||
@@ -39,13 +39,13 @@ function download_mdbook() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
local CHECK_UNAME="
|
local CHECK_UNAME="
|
||||||
import sys;
|
import sys
|
||||||
parts=[a.lower() for a in sys.stdin.read().strip().split(' ')];
|
parts=[a.lower() for a in sys.stdin.read().strip().split(' ')]
|
||||||
def get_type():
|
def get_type():
|
||||||
if 'darwin' in parts:
|
if 'darwin' in parts:
|
||||||
if 'x86_64' in parts:
|
if 'x86_64' in parts:
|
||||||
return ${DARWIN_X86}
|
return ${DARWIN_X86}
|
||||||
elif 'aarch' in parts:
|
elif 'aarch' in parts or 'arm64' in parts:
|
||||||
return ${DARWIN_ARM}
|
return ${DARWIN_ARM}
|
||||||
elif 'linux' in parts:
|
elif 'linux' in parts:
|
||||||
if 'x86_64' in parts:
|
if 'x86_64' in parts:
|
||||||
@@ -63,11 +63,12 @@ print(get_type())
|
|||||||
echo "*** Need to install Rust ***"
|
echo "*** Need to install Rust ***"
|
||||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
||||||
fi
|
fi
|
||||||
|
source "${HOME}/.cargo/env"
|
||||||
if ! (command -v cargo >/dev/null 2>&1); then
|
if ! (command -v cargo >/dev/null 2>&1); then
|
||||||
echo "*** Still cannot find `cargo` ***"
|
echo "*** Still cannot find cargo ***"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
cargo install mdbook
|
cargo install --force mdbook
|
||||||
else
|
else
|
||||||
# Download prebuilts from github
|
# Download prebuilts from github
|
||||||
mkdir -p ${HOME}/.cargo/bin
|
mkdir -p ${HOME}/.cargo/bin
|
||||||
@@ -76,10 +77,10 @@ print(get_type())
|
|||||||
if [ ${TYPE} == ${LINUX_X86} ]; then
|
if [ ${TYPE} == ${LINUX_X86} ]; then
|
||||||
DL_URL='https://github.com/rust-lang/mdBook/releases/download/v0.4.43/mdbook-v0.4.43-x86_64-unknown-linux-gnu.tar.gz'
|
DL_URL='https://github.com/rust-lang/mdBook/releases/download/v0.4.43/mdbook-v0.4.43-x86_64-unknown-linux-gnu.tar.gz'
|
||||||
fi
|
fi
|
||||||
curl -L -o ~/Downloads/mdbook.tar.gz ${DL_URL}
|
curl -L -o /tmp/mdbook.tar.gz ${DL_URL}
|
||||||
mkdir -p /tmp/mdbook
|
mkdir -p /tmp/mdbook
|
||||||
tar -xvzf ~/Downloads/mdbook.tar.gz -C /tmp/mdbook >/dev/null 2>&1
|
tar -xvzf /tmp/mdbook.tar.gz -C /tmp/mdbook >/dev/null 2>&1
|
||||||
mv /tmp/mdbook/mdbook ~/.cargo/bin/
|
mv /tmp/mdbook/mdbook ${HOME}/.cargo/bin/
|
||||||
fi
|
fi
|
||||||
add_cargo_path ${TYPE}
|
add_cargo_path ${TYPE}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,51 @@
|
|||||||
|
#!/usr/bin/bash
|
||||||
|
|
||||||
|
# Copyright (C) 2025 The Android Open Source Project
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
FILAMENT_BOT_TOKEN=$2
|
||||||
|
|
||||||
|
function update_to_main() {
|
||||||
|
python3 docs_src/build/run.py
|
||||||
|
mkdir -p tmp
|
||||||
|
pushd .
|
||||||
|
cd tmp
|
||||||
|
git clone https://x-access-token:${FILAMENT_BOT_TOKEN}@github.com/google/filament.git
|
||||||
|
cd filament
|
||||||
|
rm -rf docs/*
|
||||||
|
cp -r ../../docs_src/src_mdbook/book/* docs
|
||||||
|
git add -A docs/*
|
||||||
|
git commit -a \
|
||||||
|
-m "[automated] Updating /docs due to commit ${COMMIT_HASH:0:7}" \
|
||||||
|
-m "" \
|
||||||
|
-m "Full commit hash is ${COMMIT_HASH}" \
|
||||||
|
-m "" \
|
||||||
|
-m "DOCS_ALLOW_DIRECT_EDITS"
|
||||||
|
|
||||||
|
git push origin main
|
||||||
|
popd
|
||||||
|
}
|
||||||
|
|
||||||
|
COMMIT_HASH=$1
|
||||||
|
HAS_EDITS=$((python3 docs_src/build/checks.py --do-or="source_edits,commit_docs_force" $COMMIT_HASH > /dev/null && echo "true") || echo "false")
|
||||||
|
DO_BYPASS=$((python3 docs_src/build/checks.py --do-and="commit_docs_bypass" $COMMIT_HASH && echo "true") || echo "false")
|
||||||
|
|
||||||
|
if [[ "${HAS_EDITS}" == "true" && "${DO_BYPASS}" == "false" ]]; then
|
||||||
|
# Run again to output the edited files:
|
||||||
|
python3 docs_src/build/checks.py --do-or="source_edits,commit_docs_force" $COMMIT_HASH
|
||||||
|
update_to_main
|
||||||
|
else
|
||||||
|
echo "has edits (to /docs_src): ${HAS_EDITS}"
|
||||||
|
echo "bypass: ${DO_BYPASS}"
|
||||||
|
fi
|
||||||
@@ -16,12 +16,18 @@ import json
|
|||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
from utils import execute, ArgParseImpl
|
from utils import execute, ArgParseImpl
|
||||||
|
import shutil
|
||||||
|
|
||||||
CUR_DIR = os.path.dirname(os.path.abspath(__file__))
|
CUR_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||||
DOCS_SRC_DIR = os.path.join(CUR_DIR, '../')
|
DOCS_SRC_DIR = os.path.join(CUR_DIR, '../')
|
||||||
ROOT_DIR = os.path.join(CUR_DIR, '../../')
|
ROOT_DIR = os.path.join(CUR_DIR, '../../')
|
||||||
SRC_DIR = os.path.join(CUR_DIR, '../src')
|
|
||||||
MARKDEEP_DIR = os.path.join(CUR_DIR, '../markdeep')
|
MDBOOK_DIR = os.path.join(CUR_DIR, '../src_mdbook')
|
||||||
|
BOOK_OUPUT_DIR = os.path.join(MDBOOK_DIR, 'book')
|
||||||
|
SRC_DIR = os.path.join(MDBOOK_DIR, 'src')
|
||||||
|
|
||||||
|
MARKDEEP_DIR = os.path.join(CUR_DIR, '../src_markdeep')
|
||||||
|
RAW_COPIES_DIR = os.path.join(CUR_DIR, '../src_raw')
|
||||||
DUP_DIR = os.path.join(SRC_DIR, 'dup')
|
DUP_DIR = os.path.join(SRC_DIR, 'dup')
|
||||||
MAIN_DIR = os.path.join(SRC_DIR, 'main')
|
MAIN_DIR = os.path.join(SRC_DIR, 'main')
|
||||||
|
|
||||||
@@ -124,5 +130,7 @@ if __name__ == "__main__":
|
|||||||
pull_duplicates()
|
pull_duplicates()
|
||||||
pull_markdeep_docs()
|
pull_markdeep_docs()
|
||||||
|
|
||||||
res, err = execute('mdbook build', cwd=DOCS_SRC_DIR)
|
res, err = execute('mdbook build', cwd=MDBOOK_DIR)
|
||||||
assert res == 0, f"failed to execute `mdbook`. return-code={res} err=\"{err}\""
|
assert res == 0, f"failed to execute `mdbook`. return-code={res} err=\"{err}\""
|
||||||
|
|
||||||
|
shutil.copytree(RAW_COPIES_DIR, BOOK_OUPUT_DIR, dirs_exist_ok=True)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ This document is part of the [Filament project](https://github.com/google/filame
|
|||||||
## Authors
|
## Authors
|
||||||
|
|
||||||
- [Romain Guy](https://github.com/romainguy), [@romainguy](https://twitter.com/romainguy)
|
- [Romain Guy](https://github.com/romainguy), [@romainguy](https://twitter.com/romainguy)
|
||||||
- [Mathias Agopian](https://github.com/pixelflinger), [@darthmoosious](https://twitter.com/darthmoosious)
|
- [Mathias Agopian](https://github.com/pixelflinger), [@pixelflinger](https://bsky.app/profile/pixelflinger.bsky.social)
|
||||||
|
|
||||||
# Overview
|
# Overview
|
||||||
|
|
||||||
@@ -78,26 +78,27 @@ in table [standardProperties].
|
|||||||
Property | Definition
|
Property | Definition
|
||||||
-----------------------:|:---------------------
|
-----------------------:|:---------------------
|
||||||
**baseColor** | Diffuse albedo for non-metallic surfaces, and specular color for metallic surfaces
|
**baseColor** | Diffuse albedo for non-metallic surfaces, and specular color for metallic surfaces
|
||||||
**metallic** | Whether a surface appears to be dielectric (0.0) or conductor (1.0). Often used as a binary value (0 or 1)
|
|
||||||
**roughness** | Perceived smoothness (1.0) or roughness (0.0) of a surface. Smooth surfaces exhibit sharp reflections
|
**roughness** | Perceived smoothness (1.0) or roughness (0.0) of a surface. Smooth surfaces exhibit sharp reflections
|
||||||
|
**metallic** | Whether a surface appears to be dielectric (0.0) or conductor (1.0). Often used as a binary value (0 or 1)
|
||||||
**reflectance** | Fresnel reflectance at normal incidence for dielectric surfaces. This directly controls the strength of the reflections
|
**reflectance** | Fresnel reflectance at normal incidence for dielectric surfaces. This directly controls the strength of the reflections
|
||||||
**sheenColor** | Strength of the sheen layer
|
**ambientOcclusion** | Defines how much of the ambient light is accessible to a surface point. It is a per-pixel shadowing factor between 0.0 and 1.0
|
||||||
**sheenRoughness** | Perceived smoothness or roughness of the sheen layer
|
|
||||||
**clearCoat** | Strength of the clear coat layer
|
**clearCoat** | Strength of the clear coat layer
|
||||||
**clearCoatRoughness** | Perceived smoothness or roughness of the clear coat layer
|
**clearCoatRoughness** | Perceived smoothness or roughness of the clear coat layer
|
||||||
|
**clearCoatNormal** | A detail normal used to perturb the clear coat layer using _bump mapping_ (_normal mapping_)
|
||||||
**anisotropy** | Amount of anisotropy in either the tangent or bitangent direction
|
**anisotropy** | Amount of anisotropy in either the tangent or bitangent direction
|
||||||
**anisotropyDirection** | Local surface direction in tangent space
|
**anisotropyDirection** | Local surface direction in tangent space
|
||||||
**ambientOcclusion** | Defines how much of the ambient light is accessible to a surface point. It is a per-pixel shadowing factor between 0.0 and 1.0
|
|
||||||
**normal** | A detail normal used to perturb the surface using _bump mapping_ (_normal mapping_)
|
|
||||||
**bentNormal** | A normal pointing in the average unoccluded direction. Can be used to improve indirect lighting quality
|
|
||||||
**clearCoatNormal** | A detail normal used to perturb the clear coat layer using _bump mapping_ (_normal mapping_)
|
|
||||||
**emissive** | Additional diffuse albedo to simulate emissive surfaces (such as neons, etc.) This property is mostly useful in an HDR pipeline with a bloom pass
|
|
||||||
**postLightingColor** | Additional color that can be blended with the result of the lighting computations. See `postLightingBlending`
|
|
||||||
**ior** | Index of refraction, either for refractive objects or as an alternative to reflectance
|
|
||||||
**transmission** | Defines how much of the diffuse light of a dielectric is transmitted through the object, in other words this defines how transparent an object is
|
|
||||||
**absorption** | Absorption factor for refractive objects
|
|
||||||
**microThickness** | Thickness of the thin layer of refractive objects
|
|
||||||
**thickness** | Thickness of the solid volume of refractive objects
|
**thickness** | Thickness of the solid volume of refractive objects
|
||||||
|
**sheenColor** | Strength of the sheen layer
|
||||||
|
**sheenRoughness** | Perceived smoothness or roughness of the sheen layer
|
||||||
|
**emissive** | Additional diffuse albedo to simulate emissive surfaces (such as neons, etc.) This property is mostly useful in an HDR pipeline with a bloom pass
|
||||||
|
**normal** | A detail normal used to perturb the surface using _bump mapping_ (_normal mapping_)
|
||||||
|
**postLightingColor** | Additional color that can be blended with the result of the lighting computations. See `postLightingBlending`
|
||||||
|
**absorption** | Absorption factor for refractive objects
|
||||||
|
**transmission** | Defines how much of the diffuse light of a dielectric is transmitted through the object, in other words this defines how transparent an object is
|
||||||
|
**ior** | Index of refraction, either for refractive objects or as an alternative to reflectance
|
||||||
|
**microThickness** | Thickness of the thin layer of refractive objects
|
||||||
|
**bentNormal** | A normal pointing in the average unoccluded direction. Can be used to improve indirect lighting quality
|
||||||
|
**shadowStrength** | Strength factor between 0 and 1 for all shadows received by this material
|
||||||
[Table [standardProperties]: Properties of the standard model]
|
[Table [standardProperties]: Properties of the standard model]
|
||||||
|
|
||||||
The type and range of each property is described in table [standardPropertiesTypes].
|
The type and range of each property is described in table [standardPropertiesTypes].
|
||||||
@@ -991,10 +992,13 @@ Type
|
|||||||
|
|
||||||
Value
|
Value
|
||||||
: Each entry is an object with the properties `name` and `type`, both of `string` type. The
|
: Each entry is an object with the properties `name` and `type`, both of `string` type. The
|
||||||
name must be a valid GLSL identifier. Entries also have an optional `precision`, which can be
|
name must be a valid GLSL identifier. Entries have an optional `precision`, which can be
|
||||||
one of `default` (best precision for the platform, typically `high` on desktop, `medium` on
|
one of `default` (best precision for the platform, typically `high` on desktop, `medium` on
|
||||||
mobile), `low`, `medium`, `high`. The type must be one of the types described in
|
mobile), `low`, `medium`, `high`. The type must be one of the types described in
|
||||||
table [materialParamsTypes].
|
table [materialParamsTypes]. For Android external textures, entries also have an optional
|
||||||
|
transformName parameter to specify the name of the material parameter that will be
|
||||||
|
used to expose the transform matrix associated with the external sampler. In iOS and Vulkan,
|
||||||
|
this will always be identity.
|
||||||
|
|
||||||
Type | Description
|
Type | Description
|
||||||
:----------------------|:---------------------------------
|
:----------------------|:---------------------------------
|
||||||
@@ -1023,8 +1027,11 @@ samplerCubemap | Cubemap texture
|
|||||||
[Table [materialParamsTypes]: Material parameter types]
|
[Table [materialParamsTypes]: Material parameter types]
|
||||||
|
|
||||||
Samplers
|
Samplers
|
||||||
: Sampler types can also specify a `format` which can be either `int` or `float` (defaults to
|
: Sampler types can have the following fields:
|
||||||
`float`).
|
- `format` : which can be either `int` or `float` (defaults to `float`).
|
||||||
|
- `multisample` : a boolean to indicate whether the sampler is meant for multisampling (defaults to `false`)
|
||||||
|
- `unfilterable` : a boolean to indicate whether the sampling is not filtered (defaults to `false`)
|
||||||
|
|
||||||
|
|
||||||
Arrays
|
Arrays
|
||||||
: A parameter can define an array of values by appending `[size]` after the type name, where
|
: A parameter can define an array of values by appending `[size]` after the type name, where
|
||||||
@@ -1269,6 +1276,9 @@ Description
|
|||||||
when selecting any shading model that is not `unlit`. See the shader sections of this document
|
when selecting any shading model that is not `unlit`. See the shader sections of this document
|
||||||
for more information on how to access these attributes from the shaders.
|
for more information on how to access these attributes from the shaders.
|
||||||
|
|
||||||
|
!!! Note: Interaction with custom variables
|
||||||
|
When the `color` attribute is specified, only four custom variables are available instead of five.
|
||||||
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON
|
||||||
material {
|
material {
|
||||||
parameters : [
|
parameters : [
|
||||||
@@ -1299,7 +1309,7 @@ Type
|
|||||||
: array of `string`
|
: array of `string`
|
||||||
|
|
||||||
Value
|
Value
|
||||||
: Up to 4 strings, each must be a valid GLSL identifier.
|
: Up to 5 strings, each must be a valid GLSL identifier.
|
||||||
|
|
||||||
Description
|
Description
|
||||||
: Defines custom interpolants (or variables) that are output by the material's vertex shader.
|
: Defines custom interpolants (or variables) that are output by the material's vertex shader.
|
||||||
@@ -1315,6 +1325,10 @@ Description
|
|||||||
particular if `default` is specified the default precision is used is the fragment shader
|
particular if `default` is specified the default precision is used is the fragment shader
|
||||||
(`mediump`) and in the vertex shader (`highp`).
|
(`mediump`) and in the vertex shader (`highp`).
|
||||||
|
|
||||||
|
!!! Warning: Interaction with required attributes
|
||||||
|
If the `color` attribute is specified in the `required` list, then only four variables can be used
|
||||||
|
instead of five.
|
||||||
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON
|
||||||
material {
|
material {
|
||||||
name : Skybox,
|
name : Skybox,
|
||||||
@@ -10,8 +10,8 @@ create-missing = false
|
|||||||
|
|
||||||
[output.html]
|
[output.html]
|
||||||
mathjax-support = true
|
mathjax-support = true
|
||||||
default-theme = "light"
|
default-theme = "ayu"
|
||||||
preferred-dark-theme = "light"
|
preferred-dark-theme = "ayu"
|
||||||
|
|
||||||
[output.html.print]
|
[output.html.print]
|
||||||
enable = false
|
enable = false
|
||||||
@@ -18,6 +18,8 @@
|
|||||||
- [Metal](./notes/metal_debugging.md)
|
- [Metal](./notes/metal_debugging.md)
|
||||||
- [Vulkan](./notes/vulkan_debugging.md)
|
- [Vulkan](./notes/vulkan_debugging.md)
|
||||||
- [SPIR-V](./notes/spirv_debugging.md)
|
- [SPIR-V](./notes/spirv_debugging.md)
|
||||||
|
- [Running with ASAN and UBSAN](./notes/asan_ubsan.md)
|
||||||
|
- [Using Instruments on macOS](./notes/instruments.md)
|
||||||
- [Libraries](./notes/libs.md)
|
- [Libraries](./notes/libs.md)
|
||||||
- [bluegl](./dup/bluegl.md)
|
- [bluegl](./dup/bluegl.md)
|
||||||
- [bluevk](./dup/bluevk.md)
|
- [bluevk](./dup/bluevk.md)
|
||||||
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 236 KiB After Width: | Height: | Size: 236 KiB |
|
Before Width: | Height: | Size: 199 KiB After Width: | Height: | Size: 199 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 158 KiB After Width: | Height: | Size: 158 KiB |
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 322 KiB After Width: | Height: | Size: 322 KiB |