more work getting checks and preflights up and running

This commit is contained in:
Eric Froemling 2019-10-06 04:37:44 -07:00
parent c003b83246
commit be322f8a28
15 changed files with 440 additions and 2070 deletions

View File

@ -1,6 +1,9 @@
<component name="ProjectDictionaryState">
<dictionary name="ericf">
<words>
<w>spacelen</w>
<w>plines</w>
<w>formatmakefile</w>
<w>nosynctools</w>
<w>nosyncdir</w>
<w>nosyncdirs</w>

438
Makefile
View File

@ -5,7 +5,7 @@
# add that argument to subprocesses as needed.
# Default is to build/run the mac version.
all: mac
all: cmake
# We often want one job per core, so try to determine our logical core count.
ifeq ($(wildcard /proc),/proc) # Linux
@ -29,9 +29,8 @@ DOCPREFIX = "ballisticacore_"
# Prerequisites that should be in place before running most any other build;
# things like tool config files, etc.
PREREQS = .dir-locals.el .mypy.ini .pycheckers .pylintrc \
.style.yapf .clang-format ballisticacore-cmake/.clang-format \
.irony/compile_commands.json
PREREQS = .dir-locals.el .mypy.ini .pycheckers \
.pylintrc .style.yapf .clang-format
# List the targets in this Makefile and basic descriptions for them.
list:
@ -92,29 +91,10 @@ cleanlist:
@${CHECK_CLEAN_SAFETY}
@git clean -dnx ${ROOT_CLEAN_IGNORES}
# For spinoff projects: pull in the newest parent project
# and sync changes into ourself.
spinoff-upgrade:
@echo Pulling latest parent project...
@cd submodules/ballistica && git checkout master && git pull
@echo Syncing parent into current project...
@tools/spinoff update
@echo spinoff upgrade successful!
# Shortcut to run a spinoff upgrade and push to git.
spinoff-upgrade-push: spinoff-upgrade
git add .
git commit -m "spinoff upgrade"
git push
# Force regenerate the dummy module.
dummymodule:
./tools/gendummymodule.py --force
# Tell make which of these targets don't represent files.
.PHONY: list prereqs prereqs-clean assets assets-desktop assets-ios\
assets-android assets-clean resources resources-clean code code-clean\
clean cleanlist spinoff-upgrade spinoff-upgrade-push dummymodule
clean cleanlist
################################################################################
@ -293,58 +273,6 @@ preflightfull2:
preflightfull preflightfull2
################################################################################
# #
# CMake #
# #
################################################################################
# Build and run the cmake build.
cmake: cmake-build
@cd ballisticacore-cmake/build/debug && ./ballisticacore
# Build but don't run it.
cmake-build: assets-desktop resources code
@${STAGE_ASSETS} -cmake ballisticacore-cmake/build/debug
@cd ballisticacore-cmake/build/debug && test -f Makefile \
|| cmake -DCMAKE_BUILD_TYPE=Debug ../..
@cd ballisticacore-cmake/build/debug && make -j${JOBS}
# Build and run it with an immediate quit command.
# Tests if the game is able to bootstrap itself.
cmake-launchtest: cmake-build
@cd ballisticacore-cmake/build/debug \
&& ./ballisticacore -exec "ba.quit()"
# Build, sync to homebook fro, and run there.
cmake-hometest: cmake-build
@rsync --verbose --recursive --links --checksum --delete -e "ssh -p 49136" \
ballisticacore-cmake/build/ballisticacore/ \
efro.duckdns.org:/Users/ericf/Documents/remote_ballisticacore_test
# Note: use -t so the game sees a terminal and we get prompts & log output.
@ssh -t -p 49136 efro.duckdns.org \
cd /Users/ericf/Documents/remote_ballisticacore_test \&\& ./ballisticacore
cmake-clean:
rm -rf ballisticacore-cmake/build/debug
cmake-server: cmake-server-build
@cd ballisticacore-cmake/build/server-debug && ./ballisticacore
cmake-server-build: assets-desktop resources code
@${STAGE_ASSETS} -cmake-server ballisticacore-cmake/build/server-debug
@cd ballisticacore-cmake/build/server-debug && test -f Makefile \
|| cmake -DCMAKE_BUILD_TYPE=Debug -DHEADLESS=true ../..
@cd ballisticacore-cmake/build/server-debug && make -j${JOBS}
cmake-server-clean:
rm -rf ballisticacore-cmake/build/server-debug
# Tell make which of these targets don't represent files.
.PHONY: cmake cmake-build cmake-launchtest cmake-hometest cmake-clean \
cmake-server cmake-server-build cmake-server-clean
################################################################################
# #
# Auxiliary #
@ -362,286 +290,6 @@ ROOT_CLEAN_IGNORES = --exclude=assets/src_master \
--exclude=.spinoffdata
CHECK_CLEAN_SAFETY = ${ROOT_DIR}/tools/snippets check_clean_safety
ASSET_CACHE_DIR = ${shell ${ROOT_DIR}/tools/convert_util --get-asset-cache-dir}
ASSET_CACHE_NAME = ${shell ${ROOT_DIR}/tools/convert_util \
--get-asset-cache-name}
RPI_SERVER_PACKAGE_NAME = BallisticaCore_Server_RaspberryPi_${VERSION}
MAC_PACKAGE_NAME = BallisticaCore_Mac_${VERSION}
MAC_SERVER_PACKAGE_NAME = BallisticaCore_Server_Mac_${VERSION}
MAC_DIST_BUILD_DIR = ${shell ${ROOT_DIR}/tools/xc_build_path \
${ROOT_DIR}/ballisticacore-mac.xcodeproj Release}
MAC_DEBUG_BUILD_DIR = ${shell ${ROOT_DIR}/tools/xc_build_path \
${ROOT_DIR}/ballisticacore-mac.xcodeproj Debug}
STAGE_ASSETS = ${ROOT_DIR}/tools/stage_assets
# Eww; no way to do multi-line constants in make without spaces :-(
_WMSBE_1 = \"C:\\Program Files \(x86\)\\Microsoft Visual Studio\\2019
_WMSBE_2 = \\Community\\MSBuild\\Current\\Bin\\MSBuild.exe\"
WIN_INTERNAL_HOME = $(shell tools/vmshell win7 GET_INTERNAL_HOME)
WIN_MSBUILD_EXE = ${_WMSBE_1}${_WMSBE_2}
VISUAL_STUDIO_VERSION = /p:VisualStudioVersion=16
WIN_SERVER_PACKAGE_NAME = BallisticaCore_Server_Windows_${VERSION}
WIN_PACKAGE_NAME = BallisticaCore_Windows_${VERSION}
WIN_OCULUS_PACKAGE_NAME = BallisticaCore_Windows_Oculus
WINPRJ = $(WINDOWS_PROJECT)
WINPLT = $(WINDOWS_PLATFORM)
WINCFG = $(WINDOWS_CONFIGURATION)
# Assemble a package for a standard desktop build
_windows-package: windows-rebuild
@mkdir -p ${DIST_DIR} && cd ${DIST_DIR} && \
rm -rf ${WIN_PACKAGE_NAME}.zip ${WIN_PACKAGE_NAME} \
&& mkdir ${WIN_PACKAGE_NAME}
@cd ${ROOT_DIR}/ballisticacore-windows/Build/$(WINCFG)_$(WINPLT) \
&& cp -r DLLs Lib data BallisticaCore$(WINPRJ).exe \
VC_redist.*.exe *.dll ${DIST_DIR}/${WIN_PACKAGE_NAME}
@cd ${DIST_DIR} && zip -rq ${WIN_PACKAGE_NAME}.zip \
${WIN_PACKAGE_NAME} && rm -rf ${WIN_PACKAGE_NAME}
@echo SUCCESS! - created ${WIN_PACKAGE_NAME}.zip
# Assemble a package containing server components.
_windows-server-package: windows-rebuild
@mkdir -p ${DIST_DIR} && cd ${DIST_DIR} && \
rm -rf ${WIN_SERVER_PACKAGE_NAME}.zip ${WIN_SERVER_PACKAGE_NAME} \
&& mkdir ${WIN_SERVER_PACKAGE_NAME}
@cd ${ROOT_DIR}/ballisticacore-windows/Build/$(WINCFG)_$(WINPLT) \
&& mv BallisticaCore$(WINPRJ).exe bs_headless.exe \
&& cp -r DLLs Lib data bs_headless.exe \
python.exe VC_redist.*.exe python37.dll \
${DIST_DIR}/${WIN_SERVER_PACKAGE_NAME}/
@cd ${DIST_DIR}/${WIN_SERVER_PACKAGE_NAME} \
&& cp ${ROOT_DIR}/assets/src/server/server.py \
./ballisticacore_server.py \
&& cp ${ROOT_DIR}/assets/src/server/server.bat \
./launch_ballisticacore_server.bat \
&& cp ${ROOT_DIR}/assets/src/server/README.txt ./README.txt \
&& cp ${ROOT_DIR}/CHANGELOG.md ./CHANGELOG.txt \
&& cp ${ROOT_DIR}/assets/src/server/config.py ./config.py
@cd ${DIST_DIR}/${WIN_SERVER_PACKAGE_NAME} && unix2dos CHANGELOG.txt \
README.txt config.py
@cd ${DIST_DIR} && zip -rq ${WIN_SERVER_PACKAGE_NAME}.zip \
${WIN_SERVER_PACKAGE_NAME} && rm -rf ${WIN_SERVER_PACKAGE_NAME}
@echo SUCCESS! - created ${WIN_SERVER_PACKAGE_NAME}.zip
# Assemble a package for uploading to the oculus store.
_windows-oculus-package: windows-rebuild
@mkdir -p ${DIST_DIR} && cd ${DIST_DIR} && \
rm -rf ${WIN_OCULUS_PACKAGE_NAME}.zip ${WIN_OCULUS_PACKAGE_NAME} \
&& mkdir ${WIN_OCULUS_PACKAGE_NAME}
@cd ${ROOT_DIR}/ballisticacore-windows/Build/$(WINCFG)_$(WINPLT)\
&& cp -r DLLs Lib data BallisticaCore$(WINPRJ).exe *.dll \
${DIST_DIR}/${WIN_OCULUS_PACKAGE_NAME}
@cd ${DIST_DIR} && zip -rq ${WIN_OCULUS_PACKAGE_NAME}.zip \
${WIN_OCULUS_PACKAGE_NAME} && rm -rf ${WIN_OCULUS_PACKAGE_NAME}
@echo SUCCESS! - created ${WIN_OCULUS_PACKAGE_NAME}.zip
ANDROID_ADB = ${shell tools/android_sdk_utils get-adb-path}
ANDROID_FILTERED_LOGCAT = ${ANDROID_ADB} logcat -v color SDL:V \
BallisticaCore:V VrLib:V VrApi:V VrApp:V TimeWarp:V EyeBuf:V GlUtils:V \
DirectRender:V HmdInfo:V IabHelper:V CrashAnrDetector:V DEBUG:V *:S
AN_STRT = am start -a android.intent.action.MAIN -n
AN_BLD_OUT_DIR = ballisticacore-android/BallisticaCore/build/outputs
AN_BLDTP = $(ANDROID_BUILDTYPE)
AN_BLDTP_C = $(shell $(ROOT_DIR)/tools/snippets capitalize $(ANDROID_BUILDTYPE))
AN_PLAT = $(ANDROID_PLATFORM)
AN_PLAT_C = $(shell $(ROOT_DIR)/tools/snippets capitalize $(ANDROID_PLATFORM))
AN_MODE = $(ANDROID_MODE)
AN_MODE_C = $(shell $(ROOT_DIR)/tools/snippets capitalize $(ANDROID_MODE))
AN_ASSEMBLE_CMD = ./gradlew assemble$(AN_PLAT_C)$(AN_MODE_C)$(AN_BLDTP_C)
AN_PLATFORM_DIR = ballisticacore-android/BallisticaCore/src/${ANDROID_PLATFORM}
# (public facing name; doesn't reflect build settings)
ANDROID_PACKAGE_NAME = BallisticaCore_Android_Generic_$(VERSION)
AN_APK_DIR = ${AN_BLD_OUT_DIR}/apk/$(AN_PLAT)$(AN_MODE_C)/$(AN_BLDTP)
AN_APK = $(AN_APK_DIR)/BallisticaCore-$(AN_PLAT)-$(AN_MODE)-$(AN_BLDTP).apk
AN_BNDL_DIR = $(AN_BLD_OUT_DIR)/bundle/$(AN_PLAT)$(AN_MODE_C)$(AN_BLDTP_C)
AN_BNDL = $(AN_BNDL_DIR)/BallisticaCore-$(AN_PLAT)-$(AN_MODE)-$(AN_BLDTP).aab
BA_ARCHIVE_ROOT ?= $(HOME)/build_archives
AN_ARCHIVE_ROOT = $(BA_ARCHIVE_ROOT)/ballisticacore/android
AN_ARCHIVE_DIR = $(AN_ARCHIVE_ROOT)/$(AN_PLAT)/$(VERSION)_$(BUILD_NUMBER)
ARCH ?= $(shell uname -m)
ifeq ($(ARCH),x86_64)
ARCH_NAME?=64bit
ARCH_NAME_SHORT?=linux64
ARCH_NAME_SERVER_SHORT?=linux64_server
else
ARCH_NAME?=32bit
ARCH_NAME_SHORT?=linux32
ARCH_NAME_SERVER_SHORT?=linux32_server
endif
# For our ssh/scp/rsh stuff we want to rely on public key auth
# and just fail if anything is off instead of prompting.
SSH_BATCH_ARGS = -oBatchMode=yes -oStrictHostKeyChecking=yes
# Target run from within linux vm to build and run.
_linux: _linux-build
cd build/${ARCH_NAME_SHORT}/ballisticacore && \
DISPLAY=:0 ./ballisticacore
# Build only.
_linux-build:
@mkdir -p build/${ARCH_NAME_SHORT} && cd build/${ARCH_NAME_SHORT} \
&& test -f Makefile || cmake -DCMAKE_BUILD_TYPE=Debug \
${PWD}/ballisticacore-cmake
cd build/${ARCH_NAME_SHORT} && make -j${JOBS}
# Target used from within linux vm to build a package.
# NOTE: building in place from linux over hgfs seems slightly flaky
# (for instance, have seen tar complain source changing under it
# when assembling a package).. so when possible we build on the local
# disk and then copy the results back over hgfs.
# We just need to make sure we only launch one build at a time per VM,
# but that should already be the case.
LINUX_BUILD_BASE = ~/ballisticacore_builds
LINUX_PACKAGE_BASE_NAME = BallisticaCore_Linux
LINUX_PACKAGE_NAME = ${LINUX_PACKAGE_BASE_NAME}_${ARCH_NAME}_${VERSION}
LINUX_BUILD_DIR = ${LINUX_BUILD_BASE}/${LINUX_PACKAGE_NAME}_build
LINUX_PACKAGE_DIR = build/${LINUX_PACKAGE_NAME}
# Build for linux package (to be run under vm).
_linux-package-build:
@rm -rf ${DIST_DIR}/${LINUX_PACKAGE_NAME}.tar.gz ${LINUX_BUILD_DIR} \
${LINUX_PACKAGE_DIR} ${LINUX_PACKAGE_DIR}.tar.gz
@mkdir -p ${LINUX_BUILD_DIR} ${LINUX_PACKAGE_DIR} ${DIST_DIR}
@cd ${LINUX_BUILD_DIR} && cmake -DCMAKE_BUILD_TYPE=Release -DTEST_BUILD=true \
${ROOT_DIR}/ballisticacore-cmake && make -j${JOBS}
@cd ${LINUX_PACKAGE_DIR} && \
cp ${LINUX_BUILD_DIR}/ballisticacore .
@rm -rf ${LINUX_BUILD_DIR}
# Complete linux package (to be run on mac).
_linux-package-assemble:
@cd ${LINUX_PACKAGE_DIR} && ${STAGE_ASSETS} -cmake .
@cd build && tar -zcf ${LINUX_PACKAGE_NAME}.tar.gz ${LINUX_PACKAGE_NAME}
@rm -rf ${LINUX_PACKAGE_DIR}
@echo SUCCESS! - created ${LINUX_PACKAGE_NAME}.tar.gz
# Build only.
_linux-server-build:
@mkdir -p build/${ARCH_NAME_SERVER_SHORT} \
&& cd build/${ARCH_NAME_SERVER_SHORT} \
&& test -f Makefile || cmake -DCMAKE_BUILD_TYPE=Debug -DHEADLESS=true \
${PWD}/ballisticacore-cmake
cd build/${ARCH_NAME_SERVER_SHORT} && make -j${JOBS}
# Used from within linux vm to build a server package.
LINUX_SERVER_PACKAGE_BASE_NAME = BallisticaCore_Server_Linux
LINUX_SERVER_PACKAGE_NAME = \
${LINUX_SERVER_PACKAGE_BASE_NAME}_${ARCH_NAME}_${VERSION}
LINUX_SERVER_BUILD_DIR = ${LINUX_BUILD_BASE}/${LINUX_SERVER_PACKAGE_NAME}_build
LINUX_SERVER_PACKAGE_DIR = build/${LINUX_SERVER_PACKAGE_NAME}
_linux-server-package-build:
@rm -rf ${DIST_DIR}/${LINUX_SERVER_PACKAGE_NAME}.tar.gz \
${LINUX_SERVER_BUILD_DIR} ${LINUX_SERVER_PACKAGE_DIR} \
${LINUX_SERVER_PACKAGE_DIR}.tar.gz
@mkdir -p ${LINUX_SERVER_BUILD_DIR} ${LINUX_SERVER_PACKAGE_DIR} ${DIST_DIR}
@cd ${LINUX_SERVER_BUILD_DIR} && cmake -DCMAKE_BUILD_TYPE=Release \
-DHEADLESS=true ${ROOT_DIR}/ballisticacore-cmake && make -j${JOBS}
@cd ${LINUX_SERVER_PACKAGE_DIR} \
&& cp ${LINUX_SERVER_BUILD_DIR}/ballisticacore \
./bs_headless
@rm -rf ${LINUX_SERVER_BUILD_DIR}
_linux-server-package-assemble:
@cd ${LINUX_SERVER_PACKAGE_DIR} \
&& cp ${ROOT_DIR}/assets/src/server/server.py \
./ballisticacore_server \
&& cp ${ROOT_DIR}/assets/src/server/README.txt ./README.txt \
&& cp ${ROOT_DIR}/assets/src/server/config.py ./config.py \
&& cp ${ROOT_DIR}/CHANGELOG.md ./CHANGELOG.txt \
&& ${STAGE_ASSETS} -cmake-server .
@cd ${LINUX_SERVER_PACKAGE_DIR}/.. && tar -zcf \
${LINUX_SERVER_PACKAGE_NAME}.tar.gz ${LINUX_SERVER_PACKAGE_NAME}
@rm -rf ${LINUX_SERVER_PACKAGE_DIR}
@echo SUCCESS! - created ${LINUX_SERVER_PACKAGE_NAME}.tar.gz
# This target attempts to verify that we have a valid android sdk setup going
# and creates our local.properties file if need be so gradle builds will go
# through.
_android-sdk:
@tools/android_sdk_utils check
# FIXME: needs updating to find unstripped libs for new cmake setup
_android-archive: android-build
make android-fullclean
tools/spinoff update
rm -rf $(AN_ARCHIVE_DIR)
mkdir -p $(AN_ARCHIVE_DIR)
mkdir -p $(AN_ARCHIVE_DIR)/unstripped_libs
make android-build
cp $(AN_APK) $(AN_ARCHIVE_DIR)
git log -n 5 > $(AN_ARCHIVE_DIR)/gitlog.txt
test -e submodules/ballistica && cd submodules/ballistica \
&& git log -n 5 > $(AN_ARCHIVE_DIR)/gitlogcore.txt || true
cp ballisticacore-android/BallisticaCore/build/outputs/\
mapping/$(AN_PLAT)$(AN_MODE_C)/$(AN_BLDTP)/mapping.txt $(AN_ARCHIVE_DIR)
open $(AN_ARCHIVE_DIR)
# FIXME: needs updating to find unstripped libs for new cmake setup
_android-bundle-archive:
make android-fullclean
tools/spinoff update
rm -rf $(AN_ARCHIVE_DIR)
mkdir -p $(AN_ARCHIVE_DIR)
mkdir -p $(AN_ARCHIVE_DIR)/unstripped_libs
make android-staging
cd ballisticacore-android\
&& ./gradlew bundle$(AN_PLAT_C)$(AN_MODE_C)$(AN_BLDTP_C)
cp $(AN_BNDL) $(AN_ARCHIVE_DIR)
git log -n 5 > $(AN_ARCHIVE_DIR)/gitlog.txt
test -e submodules/ballistica && cd submodules/ballistica \
&& git log -n 5 > $(AN_ARCHIVE_DIR)/gitlogcore.txt || true
cp ballisticacore-android/BallisticaCore/build/outputs/\
mapping/$(AN_PLAT)$(AN_MODE_C)/$(AN_BLDTP)/mapping.txt $(AN_ARCHIVE_DIR)
open $(AN_ARCHIVE_DIR)
_android-package:
make android-fullclean
tools/spinoff update
@rm -f ${DIST_DIR}/${ANDROID_PACKAGE_NAME}.apk
make android-build
@mkdir -p ${DIST_DIR}
@cp ballisticacore-android/BallisticaCore/build/outputs/\
apk/$(AN_PLAT)$(AN_MODE_C)/$(AN_BLDTP)/\
BallisticaCore-$(AN_PLAT)-$(AN_MODE)-$(AN_BLDTP).apk \
${DIST_DIR}/${ANDROID_PACKAGE_NAME}.apk
@echo SUCCESS! - created ${ANDROID_PACKAGE_NAME}.apk
# Efro specific: runs spinoff upgrade on a few local projects.
# (ideally should pull this out of here or abstract it ala syncall).
spinoff-upgrade-push-all:
@echo UPGRADING SPINOFF TEMPLATE
@cd ~/Documents/spinoff-template && make spinoff-upgrade-push
@echo UPGRADING BOMBSQUAD
@cd ~/Documents/bombsquad && make spinoff-upgrade-push
# Generate and push our changelog to the staging server.
pushchangelog:
@echo GENERATING CHANGELOG HTML...
@mkdir -p ${DIST_DIR}
@./tools/gen_changelog
@echo UPLOADING CHANGELOG...
@scp ${SSH_BATCH_ARGS} ${DIST_DIR}/changelog.html \
${BLOG_SERVER}:blog_code/${DOCPREFIX}changelog.html\
# Generate docs.
docs:
@echo GENERATING DOCS HTML...
@mkdir -p ${DIST_DIR}
@./tools/gendocs.py
# Generate and push docs to the staging server.
pushdocs: docs
@echo UPLOADING DOCS...
@scp ${SSH_BATCH_ARGS} ${DIST_DIR}/docs.html \
${BLOG_SERVER}:blog_code/${DOCPREFIX}docs.html
# Some tool configs that need filtering (mainly injecting projroot path).
TOOL_CFG_INST = tools/snippets tool_config_install
@ -652,10 +300,6 @@ TOOL_CFG_SRC = tools/efrotools/snippets.py config/config.json
.clang-format: config/toolconfigsrc/clang-format ${TOOL_CFG_SRC}
${TOOL_CFG_INST} $< $@
# When using CLion, our cmake dir is root. Expose .clang-format there too.
ballisticacore-cmake/.clang-format: .clang-format
cd ballisticacore-cmake && ln -sf ../.clang-format .
.style.yapf: config/toolconfigsrc/style.yapf ${TOOL_CFG_SRC}
${TOOL_CFG_INST} $< $@
@ -671,77 +315,5 @@ ballisticacore-cmake/.clang-format: .clang-format
.pycheckers: config/toolconfigsrc/pycheckers ${TOOL_CFG_SRC}
${TOOL_CFG_INST} $< $@
# Irony in emacs requires us to use cmake to generate a full
# list of compile commands for all files; lets keep it up to date
# whenever CMakeLists changes.
.irony/compile_commands.json: ballisticacore-cmake/CMakeLists.txt
@echo Generating Irony compile-commands-list...
@mkdir -p .irony
@cd .irony \
&& cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Debug \
../ballisticacore-cmake
@mv .irony/compile_commands.json . && rm -rf .irony && mkdir .irony \
&& mkdir .irony/ballisticacore .irony/make_bob .irony/ode \
&& mv compile_commands.json .irony
@echo Created $@
# Clear and build our assets to update cache timestamps.
# files, and then prune non-recent cache files which should pretty much limit
# it to the current set which we then package and upload as a 'starter-pack'
# for new builds to use (takes full asset builds from an hour down to a
# minute or so).
asset_cache_refresh:
@echo REFRESHING ASSET CACHE: ${ASSET_CACHE_NAME}
@echo REBUILDING ASSETS...
@make assets-clean && make assets
@test -d "${ASSET_CACHE_DIR}" && echo ARCHIVING ASSET CACHE FROM \
${ASSET_CACHE_DIR}...
@${ROOT_DIR}/tools/convert_util --prune-to-recent-assets
@mkdir -p ${DIST_DIR}
@cd ${ASSET_CACHE_DIR} && tar -zcf \
${DIST_DIR}/${ASSET_CACHE_NAME}.tar.gz *
@echo UPLOADING ASSET CACHE...
@scp ${SSH_BATCH_ARGS} ${DIST_DIR}/${ASSET_CACHE_NAME}.tar.gz \
${STAGING_SERVER}:files.ballistica.net/misc/\
${ASSET_CACHE_NAME}.tar.gz.new
@ssh ${SSH_BATCH_ARGS} ${STAGING_SERVER} mv \
files.ballistica.net/misc/${ASSET_CACHE_NAME}.tar.gz.new \
files.ballistica.net/misc/${ASSET_CACHE_NAME}.tar.gz
@echo SUCCESSFULLY UPDATED ASSET CACHE: ${ASSET_CACHE_NAME}
STAGING_SERVER ?= ubuntu@ballistica.net
STAGING_SERVER_BUILDS_DIR = files.ballistica.net/ballisticacore/builds
BLOG_SERVER ?= ecfroeml@froemling.net
# Ensure we can sign in to staging server.
# Handy to do before starting lengthy operations instead of failing
# after wasting a bunch of time.
verify_staging_server_auth:
@echo -n Verifying staging server auth...
@ssh ${SSH_BATCH_ARGS} ${STAGING_SERVER} true
@echo ok.
ARCHIVE_OLD_PUBLIC_BUILDS = \
${ROOT_DIR}/tools/snippets archive_old_builds ${STAGING_SERVER} \
${STAGING_SERVER_BUILDS_DIR} ${SSH_BATCH_ARGS}
ALL_TEST_PACKAGE_FILES = \
${DIST_DIR}/${LINUX_PACKAGE_BASE_NAME}_64bit_${VERSION}.tar.gz \
${DIST_DIR}/${WIN_PACKAGE_NAME}.zip \
${DIST_DIR}/${MAC_PACKAGE_NAME}.zip \
${DIST_DIR}/${ANDROID_PACKAGE_NAME}.apk
# Note: currently not including rpi until we figure out the py3.7 situation.
ALL_SERVER_PACKAGE_FILES = \
${DIST_DIR}/${LINUX_SERVER_PACKAGE_BASE_NAME}_64bit_${VERSION}.tar.gz \
${DIST_DIR}/${WIN_SERVER_PACKAGE_NAME}.zip \
${DIST_DIR}/${MAC_SERVER_PACKAGE_NAME}.zip \
${DIST_DIR}/${RPI_SERVER_PACKAGE_NAME}.tar.gz
# Tell make which of these targets don't represent files.
.PHONY: _windows-package _windows-server-package _windows-oculus-package \
_linux _linux-build _linux-package-build _linux-package-assemble \
_android-sdk _android-archive _android-bundle-archive _android-package \
_linux-server-build _linux-server-package-build \
_linux-server-package-assemble spinoff-upgrade-push-all pushchangelog \
docs pushdocs asset_cache_refresh verify_staging_server_auth
.PHONY:

View File

@ -1,3 +0,0 @@
# Default ignored files
/workspace.xml

View File

@ -1 +0,0 @@
BallisticaCore

View File

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="CMake" type="CPP_MODULE" version="4" />

View File

@ -1,8 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<option name="LINE_SEPARATOR" value="&#10;" />
<clangFormatSettings>
<option name="ENABLED" value="true" />
</clangFormatSettings>
</code_scheme>
</component>

View File

@ -1,5 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

View File

@ -1,807 +0,0 @@
<component name="ProjectDictionaryState">
<dictionary name="ericf">
<words>
<w>NOMINMAX</w>
<w>aabb</w>
<w>abcdefghijklmnopqrstuvwxyz</w>
<w>accel</w>
<w>achs</w>
<w>acinstance</w>
<w>ack'ed</w>
<w>acked</w>
<w>acks</w>
<w>aclass</w>
<w>aclass's</w>
<w>addrs</w>
<w>adjoint</w>
<w>adreno</w>
<w>affx</w>
<w>affy</w>
<w>affz</w>
<w>aftx</w>
<w>afty</w>
<w>aftz</w>
<w>aint</w>
<w>airborn</w>
<w>alext</w>
<w>alibaba</w>
<w>allocs</w>
<w>alot</w>
<w>alphaimg</w>
<w>alphapixels</w>
<w>alsa</w>
<w>alsoft</w>
<w>animcurve</w>
<w>aniso</w>
<w>apientry</w>
<w>appconfig</w>
<w>asci</w>
<w>athome</w>
<w>attrobj</w>
<w>automagically</w>
<w>autoselect</w>
<w>avel</w>
<w>avels</w>
<w>axismotion</w>
<w>backgrounded</w>
<w>backgrounding</w>
<w>backtraces</w>
<w>ballistica</w>
<w>ballisticacore</w>
<w>barebones</w>
<w>basetype</w>
<w>basicsize</w>
<w>bastd</w>
<w>bbbb</w>
<w>bbbbb</w>
<w>bbbbbb</w>
<w>bbbbbbb</w>
<w>bcfn</w>
<w>bezanson</w>
<w>bgra</w>
<w>bigendian</w>
<w>bilinear</w>
<w>binpow</w>
<w>bitcount</w>
<w>bitdepth</w>
<w>bitlength</w>
<w>bitmask</w>
<w>bitpos</w>
<w>bitval</w>
<w>blitters</w>
<w>blitting</w>
<w>blockadr</w>
<w>blockheight</w>
<w>blockwidth</w>
<w>bluetooth</w>
<w>blurscale</w>
<w>bodyid</w>
<w>bodypart</w>
<w>bodyptr</w>
<w>bookmarkable</w>
<w>bools</w>
<w>boolval</w>
<w>boostrapping</w>
<w>bootstrappy</w>
<w>bouyancy</w>
<w>bppv</w>
<w>bresult</w>
<w>bridgit</w>
<w>broadcom</w>
<w>bsac</w>
<w>bscfg</w>
<w>bsgaps</w>
<w>bsgdps</w>
<w>bsivu</w>
<w>bsmhi</w>
<w>bsstd</w>
<w>bsuuid</w>
<w>bufs</w>
<w>buildconfig</w>
<w>buildnumber</w>
<w>buttondown</w>
<w>buttonmouse</w>
<w>buttonup</w>
<w>buttonwidget</w>
<w>bwst</w>
<w>calced</w>
<w>calcs</w>
<w>caled</w>
<w>callargs</w>
<w>callbackobj</w>
<w>camalign</w>
<w>camelback</w>
<w>camerashake</w>
<w>capitan</w>
<w>cargs</w>
<w>ccontext</w>
<w>centiseconds</w>
<w>cfgdir</w>
<w>changeme</w>
<w>charn</w>
<w>charnum</w>
<w>charstr</w>
<w>checkboxwidget</w>
<w>chrono</w>
<w>cjief</w>
<w>classdict</w>
<w>clientinfo</w>
<w>cmath</w>
<w>cmds</w>
<w>cmdvals</w>
<w>codewarrior</w>
<w>codewarrior's</w>
<w>cofnodes</w>
<w>collapseable</w>
<w>collidable</w>
<w>columnwidget</w>
<w>connectattr</w>
<w>containerwidget</w>
<w>controlfp</w>
<w>cooldown</w>
<w>coreaudio</w>
<w>coulda</w>
<w>cout</w>
<w>cpel</w>
<w>cpplint</w>
<w>cptr</w>
<w>cpuid</w>
<w>crom</w>
<w>crosswire</w>
<w>crvel</w>
<w>cspr</w>
<w>cstdint</w>
<w>cstdlib</w>
<w>cstring</w>
<w>ctargetref</w>
<w>cubemap</w>
<w>curtime</w>
<w>cutef</w>
<w>cvar</w>
<w>data</w>
<w>datadata</w>
<w>dataout</w>
<w>datas</w>
<w>datav</w>
<w>datavec</w>
<w>dbias</w>
<w>dcol</w>
<w>ddcaps</w>
<w>ddpf</w>
<w>ddpixelformat</w>
<w>ddscaps</w>
<w>ddsd</w>
<w>ddsx</w>
<w>deallocated</w>
<w>deallocation</w>
<w>deek</w>
<w>deinit</w>
<w>demangle</w>
<w>demangled</w>
<w>demangling</w>
<w>denom</w>
<w>dernit</w>
<w>dets</w>
<w>dfff</w>
<w>dfmt</w>
<w>diffbit</w>
<w>dirslash</w>
<w>dlfcn</w>
<w>dlife</w>
<w>dname</w>
<w>dncm</w>
<w>dobell</w>
<w>doraise</w>
<w>dosomething</w>
<w>dout</w>
<w>downsample</w>
<w>dpad</w>
<w>dpads</w>
<w>drpt</w>
<w>dsize</w>
<w>dsound</w>
<w>dstattr</w>
<w>dstnode</w>
<w>dstr</w>
<w>dtest</w>
<w>dummyvalid</w>
<w>dxgi</w>
<w>dynamicdata</w>
<w>echidna</w>
<w>edef</w>
<w>elems</w>
<w>elevenbase</w>
<w>elevenbits</w>
<w>emitfx</w>
<w>emojis</w>
<w>endcall</w>
<w>endl</w>
<w>endline</w>
<w>endtime</w>
<w>entrypoint</w>
<w>ericf</w>
<w>ericsson</w>
<w>erroring</w>
<w>etcdec</w>
<w>etcpack</w>
<w>evals</w>
<w>ewww</w>
<w>ewwww</w>
<w>ewwwww</w>
<w>execinfo</w>
<w>expbool</w>
<w>expl</w>
<w>extrahash</w>
<w>extrascale</w>
<w>exts</w>
<w>facepts</w>
<w>farval</w>
<w>fbos</w>
<w>fdata</w>
<w>fdirx</w>
<w>fdiry</w>
<w>fdirz</w>
<w>fenv</w>
<w>fesetround</w>
<w>ffff</w>
<w>ffffff</w>
<w>fffffff</w>
<w>fffffffffifff</w>
<w>fgets</w>
<w>fifteenbits</w>
<w>fjco</w>
<w>fjcoiwef</w>
<w>flipbit</w>
<w>flopsy</w>
<w>fname</w>
<w>fnode</w>
<w>fnumc</w>
<w>fopen</w>
<w>fourcc</w>
<w>fovs</w>
<w>fovx</w>
<w>fovy</w>
<w>framebuffers</w>
<w>framedef</w>
<w>frameldefs</w>
<w>framerates</w>
<w>fread</w>
<w>freeform</w>
<w>freeifaddrs</w>
<w>freqs</w>
<w>froemling</w>
<w>frompos</w>
<w>frontmost</w>
<w>ftos</w>
<w>ftou</w>
<w>funcname</w>
<w>fval</w>
<w>fvals</w>
<w>gamecenter</w>
<w>gamedata</w>
<w>gamepacket</w>
<w>gamepackets</w>
<w>gameplay</w>
<w>gapless</w>
<w>gasmsg</w>
<w>gbus</w>
<w>gcc's</w>
<w>gearvr</w>
<w>getactivity</w>
<w>getattro</w>
<w>getattrofunc</w>
<w>getbasetime</w>
<w>getbit</w>
<w>getbits</w>
<w>getbitshigh</w>
<w>getcollidemodel</w>
<w>getdata</w>
<w>getifaddrs</w>
<w>getline</w>
<w>getmodel</w>
<w>getnodes</w>
<w>getnodetype</w>
<w>getsession</w>
<w>getsound</w>
<w>gettexture</w>
<w>gettotalrefcount</w>
<w>gles</w>
<w>glext</w>
<w>gpgs</w>
<w>gqualstr</w>
<w>grav</w>
<w>gstate</w>
<w>gthm</w>
<w>guiddef</w>
<w>gusl</w>
<w>gvrrts</w>
<w>hacky</w>
<w>haha</w>
<w>halign</w>
<w>handlemessage</w>
<w>hatmotion</w>
<w>havn't</w>
<w>havnt</w>
<w>healthcare</w>
<w>hexval</w>
<w>highp</w>
<w>highquality</w>
<w>hitchy</w>
<w>hmmm</w>
<w>hostcmd</w>
<w>hostinfo</w>
<w>hotkeys</w>
<w>hotplug</w>
<w>hscrollwidget</w>
<w>htonf</w>
<w>htonl</w>
<w>htons</w>
<w>ibuf</w>
<w>icloud</w>
<w>iconscale</w>
<w>ieeefp</w>
<w>ifaddr</w>
<w>ifaddrs</w>
<w>ifdebug</w>
<w>iiiiisss</w>
<w>ilock</w>
<w>imagewidget</w>
<w>incentivized</w>
<w>inet</w>
<w>initguid</w>
<w>inittab</w>
<w>intercollide</w>
<w>internalformat</w>
<w>interuptions</w>
<w>invote</w>
<w>iserverget</w>
<w>iserverput</w>
<w>isn'</w>
<w>isutf</w>
<w>itemsize</w>
<w>itsclass</w>
<w>itunes</w>
<w>ival</w>
<w>ivals</w>
<w>ized</w>
<w>jacobian</w>
<w>janktastic</w>
<w>janky</w>
<w>jaxis</w>
<w>jcjwf</w>
<w>jmessage</w>
<w>keepalives</w>
<w>keycode</w>
<w>keysyms</w>
<w>keywds</w>
<w>khronos</w>
<w>kickable</w>
<w>kickee</w>
<w>killable</w>
<w>killcount</w>
<w>kmod</w>
<w>kronk</w>
<w>kwds</w>
<w>kxyz</w>
<w>lantinga</w>
<w>largeish</w>
<w>lasti</w>
<w>lastline</w>
<w>leaderboard</w>
<w>leaderboards</w>
<w>lgui</w>
<w>lhalf</w>
<w>libutf</w>
<w>lightshad</w>
<w>linearsize</w>
<w>listobj</w>
<w>llock</w>
<w>logpath</w>
<w>logput</w>
<w>lorient</w>
<w>lowp</w>
<w>lpos</w>
<w>lpsockaddr</w>
<w>lrintf</w>
<w>lscope</w>
<w>lstr</w>
<w>lsync</w>
<w>lvec</w>
<w>lvoid</w>
<w>macos</w>
<w>magoogan</w>
<w>magua</w>
<w>mainmenu</w>
<w>mallocs</w>
<w>maskhigh</w>
<w>maskuv</w>
<w>maximus</w>
<w>maxwidth</w>
<w>mediump</w>
<w>memalign</w>
<w>memchr</w>
<w>memcpy</w>
<w>meshdata</w>
<w>meth</w>
<w>mikirog</w>
<w>millisecs</w>
<w>minelem</w>
<w>minsdl</w>
<w>mipmapcount</w>
<w>mipmaps</w>
<w>mmdevapi</w>
<w>modder</w>
<w>modelview</w>
<w>moduletype</w>
<w>momemtary</w>
<w>msaa</w>
<w>mult</w>
<w>multing</w>
<w>multipass</w>
<w>multisample</w>
<w>mutli</w>
<w>mybuf</w>
<w>mycallback</w>
<w>mynode</w>
<w>mywidget</w>
<w>ndebug</w>
<w>nearval</w>
<w>needwindow</w>
<w>negativex</w>
<w>negativey</w>
<w>negativez</w>
<w>nemanja</w>
<w>ness</w>
<w>netclient</w>
<w>netplay</w>
<w>newchild</w>
<w>newimg</w>
<w>newitem</w>
<w>newnode</w>
<w>nextchar</w>
<w>nitpicky</w>
<w>nlpos</w>
<w>nmemb</w>
<w>nodetype</w>
<w>nominmax</w>
<w>noninfringement</w>
<w>nonlint</w>
<w>noone</w>
<w>nothin</w>
<w>nptr</w>
<w>nsize</w>
<w>ntoa</w>
<w>ntohl</w>
<w>numargs</w>
<w>numc</w>
<w>numentries</w>
<w>nvidia</w>
<w>nyffenegger</w>
<w>objexists</w>
<w>objid</w>
<w>obvs</w>
<w>oculus</w>
<w>oiffsss</w>
<w>oooo</w>
<w>ooooooo</w>
<w>ooooooooo</w>
<w>oooooooooooo</w>
<w>ooooooooooooo</w>
<w>ooooooooooooooo</w>
<w>oooooooooooooooooo</w>
<w>ooooooooooooooooooooooooooooooo</w>
<w>ooooooooooooooooooooooooooooooooooo</w>
<w>ooooooooooooooooooooooooooooooooooooo</w>
<w>openal</w>
<w>opengl</w>
<w>opensl</w>
<w>opmode</w>
<w>ortho</w>
<w>osis</w>
<w>osssssssssss</w>
<w>ostype</w>
<w>ourself</w>
<w>ourstanding</w>
<w>ouya</w>
<w>parameteriv</w>
<w>passcode</w>
<w>pausable</w>
<w>pdst</w>
<w>persp</w>
<w>pflag</w>
<w>pflags</w>
<w>pgmout</w>
<w>pixelformat</w>
<w>playpause</w>
<w>playsound</w>
<w>plen</w>
<w>pname</w>
<w>podcast</w>
<w>podcasts</w>
<w>portaudio</w>
<w>positivex</w>
<w>positivey</w>
<w>positivez</w>
<w>powerup</w>
<w>precalc</w>
<w>predeclare</w>
<w>prefs</w>
<w>preloaded</w>
<w>preloads</w>
<w>premult</w>
<w>printf</w>
<w>printnodes</w>
<w>printobjects</w>
<w>priv</w>
<w>profilers</w>
<w>prog</w>
<w>proj</w>
<w>prolly</w>
<w>psmx</w>
<w>pspec</w>
<w>psps</w>
<w>psrc</w>
<w>pton</w>
<w>ptrs</w>
<w>ptype</w>
<w>pulseaudio</w>
<w>punchmomentumlinear</w>
<w>punchthrough</w>
<w>pushcall</w>
<w>putbits</w>
<w>putbitshigh</w>
<w>pval</w>
<w>pvrtc</w>
<w>pycommand</w>
<w>pyconfig</w>
<w>pycontext</w>
<w>pyhome</w>
<w>pylib</w>
<w>pyobj</w>
<w>pyobjs</w>
<w>qerr</w>
<w>qrcode</w>
<w>qrel</w>
<w>qual</w>
<w>qualcomm</w>
<w>radiusm</w>
<w>raii</w>
<w>rasterizer</w>
<w>reaaaly</w>
<w>readset</w>
<w>realloc</w>
<w>reallocations</w>
<w>realtimers</w>
<w>recalc</w>
<w>recvfrom</w>
<w>redundants</w>
<w>refcounted</w>
<w>refl</w>
<w>rehel</w>
<w>rendererdata</w>
<w>renormalize</w>
<w>rené</w>
<w>reprfunc</w>
<w>resends</w>
<w>resync</w>
<w>retval</w>
<w>rezing</w>
<w>rgui</w>
<w>richcompare</w>
<w>rigth</w>
<w>rootwidget</w>
<w>rowwidget</w>
<w>rresult</w>
<w>rsgc</w>
<w>runnables</w>
<w>rvec</w>
<w>rvel</w>
<w>safecolor</w>
<w>scenetime</w>
<w>screenmessage</w>
<w>scrollwidget</w>
<w>sdl's</w>
<w>sdlk</w>
<w>seqlen</w>
<w>serv</w>
<w>serverget</w>
<w>serverput</w>
<w>sessiondata</w>
<w>sessionglobals</w>
<w>sessiontype</w>
<w>setattro</w>
<w>setattrofunc</w>
<w>setschedparam</w>
<w>sgis</w>
<w>sharedobj</w>
<w>shifthigh</w>
<w>shouldnt</w>
<w>shufflable</w>
<w>signsubscale</w>
<w>simd</w>
<w>sisssssssss</w>
<w>sixteenbits</w>
<w>smoothering</w>
<w>smoothstep</w>
<w>sndio</w>
<w>snorm</w>
<w>sockaddr</w>
<w>soffs</w>
<w>solaris</w>
<w>spaz</w>
<w>spead</w>
<w>sphrand</w>
<w>srcattr</w>
<w>srcsz</w>
<w>sresult</w>
<w>sscanf</w>
<w>ssize</w>
<w>sssi</w>
<w>sssisisis</w>
<w>sssissss</w>
<w>ssss</w>
<w>sssss</w>
<w>sssssi</w>
<w>sssssss</w>
<w>sssssssd</w>
<w>sssssssi</w>
<w>ssssssssssss</w>
<w>standin</w>
<w>startpos</w>
<w>starttime</w>
<w>startx</w>
<w>starty</w>
<w>staticdata</w>
<w>stdint</w>
<w>stephane</w>
<w>stepnum</w>
<w>stepsize</w>
<w>strcasecmp</w>
<w>strchr</w>
<w>strcpy</w>
<w>strdup</w>
<w>stringi</w>
<w>strlen</w>
<w>strtof</w>
<w>subclsssing</w>
<w>subentities</w>
<w>subitems</w>
<w>subplatform</w>
<w>subscale</w>
<w>sval</w>
<w>symbolification</w>
<w>syscalls</w>
<w>talloc</w>
<w>tegra</w>
<w>telefonaktiebolaget</w>
<w>teleported</w>
<w>teleporting</w>
<w>tempvec</w>
<w>texel</w>
<w>texqualstr</w>
<w>textcolor</w>
<w>textwidget</w>
<w>thang</w>
<w>thecommand</w>
<w>theres</w>
<w>threadname</w>
<w>threadtype</w>
<w>tiltage</w>
<w>timedisplay</w>
<w>timeformat</w>
<w>timerlist</w>
<w>timestep</w>
<w>timetype</w>
<w>timetypes</w>
<w>tmpmat</w>
<w>tomer</w>
<w>topos</w>
<w>touchpad</w>
<w>toucs</w>
<w>toutf</w>
<w>trackpad</w>
<w>trackpads</w>
<w>tradeoff</w>
<w>trailcolor</w>
<w>transobj</w>
<w>treturn</w>
<w>trifunovic</w>
<w>trilinear</w>
<w>trimesh</w>
<w>trimeshes</w>
<w>tval</w>
<w>tvos</w>
<w>tweakage</w>
<w>twotimer</w>
<w>twst</w>
<w>typeobj</w>
<w>typestr</w>
<w>uber</w>
<w>uibounds</w>
<w>uiid</w>
<w>uncas</w>
<w>unchecking</w>
<w>underrun</w>
<w>unformatted</w>
<w>unichar</w>
<w>unichars</w>
<w>uninited</w>
<w>unmanaged</w>
<w>unpaused</w>
<w>unplayed</w>
<w>unpremultiply</w>
<w>unsignaled</w>
<w>unstuff</w>
<w>unsynchronized</w>
<w>userspace</w>
<w>uther</w>
<w>uuids</w>
<w>uxxxx</w>
<w>uxxxxxxxx</w>
<w>valign</w>
<w>valobj</w>
<w>vals</w>
<w>valtab</w>
<w>valuedouble</w>
<w>valueint</w>
<w>valuestring</w>
<w>varyings</w>
<w>vbos</w>
<w>vbuf</w>
<w>vdynamic</w>
<w>verts</w>
<w>vidia</w>
<w>vmag</w>
<w>vorbis</w>
<w>vparallel</w>
<w>vprintf</w>
<w>vsync</w>
<w>vsyncing</w>
<w>vtable</w>
<w>vtangential</w>
<w>vulkan</w>
<w>waaah</w>
<w>wack</w>
<w>wakeups</w>
<w>walisser</w>
<w>wasdebug</w>
<w>watte</w>
<w>wdeprecated</w>
<w>weakref</w>
<w>welp</w>
<w>whaaaaaaa</w>
<w>wheee</w>
<w>wheeee</w>
<w>wiimote</w>
<w>wiimotes</w>
<w>windowshade</w>
<w>winmm</w>
<w>winsock</w>
<w>wofocj</w>
<w>wonkiness</w>
<w>worldspace</w>
<w>wunused</w>
<w>xclamped</w>
<w>xdiff</w>
<w>xdist</w>
<w>xinput</w>
<w>xmax</w>
<w>xmin</w>
<w>xmmintrin</w>
<w>xoffset</w>
<w>yclamped</w>
<w>ydiff</w>
<w>ydist</w>
<w>ymax</w>
<w>ymin</w>
<w>yoffs</w>
<w>yooooooo</w>
<w>zmax</w>
<w>zmin</w>
<w>zoffset</w>
<w>zomg</w>
<w>zoomable</w>
<w>zrot</w>
</words>
</dictionary>
</component>

View File

@ -1,23 +0,0 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="CannotResolve" enabled="false" level="ERROR" enabled_by_default="false" />
<inspection_tool class="ClangTidy" enabled="true" level="WARNING" enabled_by_default="true">
<option name="clangTidyChecks" value="*,-android-*,-bugprone-bool-pointer-implicit-conversion,-bugprone-exception-escape,-cert-dcl16-c,-cert-dcl50-cpp,-cert-dcl59-cpp,-cert-env33-c,-clang-analyzer-*,-clang-diagnostic-*,-cppcoreguidelines-avoid-c-arrays,-cppcoreguidelines-avoid-goto,-cppcoreguidelines-avoid-magic-numbers,-cppcoreguidelines-macro-usage,-cppcoreguidelines-no-malloc,-cppcoreguidelines-non-private-member-variables-in-classes,-cppcoreguidelines-owning-memory,-cppcoreguidelines-pro-bounds-array-to-pointer-decay,-cppcoreguidelines-pro-bounds-constant-array-index,-cppcoreguidelines-pro-bounds-pointer-arithmetic,-cppcoreguidelines-pro-type-const-cast,-cppcoreguidelines-pro-type-cstyle-cast,-cppcoreguidelines-pro-type-reinterpret-cast,-cppcoreguidelines-pro-type-union-access,-cppcoreguidelines-pro-type-vararg,-cppcoreguidelines-special-member-functions,-fuchsia-*,-google-*,-hicpp-avoid-c-arrays,-hicpp-avoid-goto,-hicpp-braces-around-statements,-hicpp-function-size,-hicpp-named-parameter,-hicpp-no-array-decay,-hicpp-no-assembler,-hicpp-no-malloc,-hicpp-special-member-functions,-hicpp-uppercase-literal-suffix,-hicpp-vararg,-llvm-*,-misc-bool-pointer-implicit-conversion,-misc-definitions-in-headers,-misc-non-private-member-variables-in-classes,-misc-unused-alias-decls,-misc-unused-parameters,-misc-unused-using-decls,-modernize-avoid-c-arrays,-modernize-use-default-member-init,-modernize-use-using,-objc-*,-openmp-exception-escape,-readability-braces-around-statements,-readability-else-after-return,-readability-function-size,-readability-identifier-naming,-readability-implicit-bool-conversion,-readability-isolate-declaration,-readability-magic-numbers,-readability-named-parameter,-readability-redundant-member-init,-readability-redundant-preprocessor,-readability-simplify-boolean-expr,-readability-uppercase-literal-suffix,-zircon-*,google-default-arguments,google-explicit-constructor,google-runtime-operator,-cppcoreguidelines-pro-type-static-cast-downcast,-cert-err58-cpp,-bugprone-lambda-function-name" />
</inspection_tool>
<inspection_tool class="DuplicateSwitchCase" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="InterfaceHasNoImplementation" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="MemberFunctionCanBeStatic" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="MemberVisibility" enabled="false" level="ERROR" enabled_by_default="false" />
<inspection_tool class="OCDFA" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="OCLoopDoesntUseConditionVariable" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="OCUnusedGlobalDeclaration" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="OCUnusedMacro" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="OCUnusedStruct" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="OtherCpp" enabled="false" level="ERROR" enabled_by_default="false" />
<inspection_tool class="OtherObjC" enabled="false" level="ERROR" enabled_by_default="false" />
<inspection_tool class="PointerTypeRequired" enabled="false" level="ERROR" enabled_by_default="false" />
<inspection_tool class="StaticnessMismatch" enabled="false" level="ERROR" enabled_by_default="false" />
<inspection_tool class="UnusedParameter" enabled="false" level="WARNING" enabled_by_default="false" />
</profile>
</component>

View File

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
<component name="CidrRootsConfiguration">
<excludeRoots>
<file path="$PROJECT_DIR$/.idea" />
<file path="$PROJECT_DIR$/build" />
<file path="$PROJECT_DIR$/build-server" />
<file path="$PROJECT_DIR$/src/external" />
<file path="$PROJECT_DIR$/src/external/darwiinremote-ef" />
<file path="$PROJECT_DIR$/src/external/libogg-1.2.2" />
<file path="$PROJECT_DIR$/src/external/libvorbis-1.3.2" />
<file path="$PROJECT_DIR$/src/external/openal-soft-1.15.1" />
<file path="$PROJECT_DIR$/src/external/python-android" />
<file path="$PROJECT_DIR$/src/external/python-android-debug" />
<file path="$PROJECT_DIR$/src/external/python-apple" />
<file path="$PROJECT_DIR$/src/external/python-apple-debug" />
<file path="$PROJECT_DIR$/src/external/sdl-1.2.14_ef" />
<file path="$PROJECT_DIR$/src/external/sdl2-ef_android" />
<file path="$PROJECT_DIR$/src/external/sdl2-ef_ios" />
<file path="$PROJECT_DIR$/src/external/tremor" />
<file path="$PROJECT_DIR$/src/external/windows" />
<file path="$PROJECT_DIR$/src/generated" />
<file path="$PROJECT_DIR$/src/generated_src" />
</excludeRoots>
</component>
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
</project>

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/ballisticacore-cmake.iml" filepath="$PROJECT_DIR$/.idea/ballisticacore-cmake.iml" />
</modules>
</component>
</project>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

View File

@ -1,743 +0,0 @@
cmake_minimum_required(VERSION 3.5)
project(BallisticaCore)
include(CheckIncludeFile)
option(HEADLESS "build headless server" OFF)
option(TEST_BUILD "include testing features" OFF)
# Requiring minimum of C++14 currently.
set(CMAKE_CXX_STANDARD 14)
# Currently we need to nudge cmake a bit to get it to find homebrew python;
# Sounds like this is a known issue at the moment.
if (APPLE)
# NOTE: after installing mojave, cmake stopped building against homebrew
# stuff correctly (/usr/local/*). Xcode 10 release notes mention /usr/include
# is no longer filled in by the dev tools and perhaps this is related.
# see https://developer.apple.com/documentation
# /xcode_release_notes/xcode_10_release_notes
# anyway, forcing the issue for now; can keep an eye on developments..
include_directories("/usr/local/include")
link_directories("/usr/local/lib")
execute_process(COMMAND "python3-config" "--prefix"
OUTPUT_VARIABLE PYPREFIX
OUTPUT_STRIP_TRAILING_WHITESPACE)
# running into an oddity where python-libs linking reverts back
# to our system default after a while - trying cache-internal here to fix
set(PYTHON_LIBRARY "${PYPREFIX}/lib/libpython3.7m.dylib" CACHE INTERNAL "")
set(PYTHON_INCLUDE_DIR "${PYPREFIX}/include/python3.7m" CACHE INTERNAL "")
endif ()
# NOTE: we technically require 3.7 at this point, but leaving this
# at 3.5 in order to keep build pipeline functioning on things
# like raspberry pi even though the game won't function there until
# 3.7 comes down the pipe.
find_package(PythonLibs 3.5 REQUIRED)
if (NOT HEADLESS)
find_package(SDL2 QUIET)
if (SDL2_FOUND)
# getting complaint about space at the end of this on ubuntu16
string(STRIP ${SDL2_LIBRARIES} SDL2_LIBRARIES)
else ()
# some cmake systems don't have the SDL2 module; lets
# fall back to quasi-manual search if so..
# (enough to cover ubuntu 14 and raspbian)
message(STATUS "No SDL2 module present; searching manually")
find_library(SDL2_LIBRARIES SDL2)
if (NOT SDL2_LIBRARIES)
message(FATAL_ERROR "SDL2 library not found")
endif ()
set(SDL2_INCLUDE_DIRS "/usr/include/SDL2")
endif ()
find_package(OpenGL REQUIRED)
find_package(OpenAL REQUIRED)
if (APPLE)
# on mac this sets an include path that we don't need since
# we're using the system framework... clean it up
set(OPENAL_INCLUDE_DIR "")
endif ()
find_library(OGG_LIBRARY ogg)
find_library(VORBISFILE_LIBRARY vorbisfile)
if (NOT OGG_LIBRARY)
message(FATAL_ERROR "ogg library not found")
endif ()
if (NOT VORBISFILE_LIBRARY)
message(FATAL_ERROR "vorbisfile library not found")
endif ()
set(EXTRA_INCLUDE_DIRS ${OPENGL_INCLUDE_DIRS}
${OPENAL_INCLUDE_DIR} ${SDL2_INCLUDE_DIRS})
set(EXTRA_LIBRARIES ogg vorbisfile ${OPENGL_LIBRARIES} ${OPENAL_LIBRARY})
else ()
add_definitions(-DBA_HEADLESS_BUILD=1)
endif ()
if (TEST_BUILD)
add_definitions(-DBA_TEST_BUILD=1)
endif ()
# Currently seeing warnings about parateter order changing in GCC 7.1
# on Raspberry Pi builds. We never need to care about C++ abi compatability
# so silencing them. Can maybe remove this later if they stop.
if (CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -Wno-psabi")
endif()
# message("GOT LIBS ${PYTHON_LIBRARIES}")
# message("GOT INC DIRS ${PYTHON_INCLUDE_DIRS}")
# message("GOT SDL INC ${SDL2_INCLUDE_DIRS}")
# message(FATAL_ERROR "SO FAR SO GOOD")
# get_filename_component(BA_SRC_ROOT ../src ABSOLUTE )
# include_directories("src")
set(BA_SRC_ROOT src)
include_directories(${BA_SRC_ROOT})
add_compile_options(-include ballistica/config/config_cmake.h)
if (CMAKE_BUILD_TYPE MATCHES Debug)
add_definitions(-DBA_DEBUG_BUILD=1)
endif ()
set(ODE_SRC_ROOT ${BA_SRC_ROOT}/external/open_dynamics_engine-ef)
add_library(ode
${ODE_SRC_ROOT}/ode/IceAABB.cpp
${ODE_SRC_ROOT}/ode/IceContainer.cpp
${ODE_SRC_ROOT}/ode/IceHPoint.cpp
${ODE_SRC_ROOT}/ode/IceIndexedTriangle.cpp
${ODE_SRC_ROOT}/ode/IceMatrix3x3.cpp
${ODE_SRC_ROOT}/ode/IceMatrix4x4.cpp
${ODE_SRC_ROOT}/ode/IceOBB.cpp
${ODE_SRC_ROOT}/ode/IcePlane.cpp
${ODE_SRC_ROOT}/ode/IcePoint.cpp
${ODE_SRC_ROOT}/ode/IceRandom.cpp
${ODE_SRC_ROOT}/ode/IceRay.cpp
${ODE_SRC_ROOT}/ode/IceRevisitedRadix.cpp
${ODE_SRC_ROOT}/ode/IceSegment.cpp
${ODE_SRC_ROOT}/ode/IceTriangle.cpp
${ODE_SRC_ROOT}/ode/IceUtils.cpp
${ODE_SRC_ROOT}/ode/ode.cpp
${ODE_SRC_ROOT}/ode/ode_array.cpp
${ODE_SRC_ROOT}/ode/ode_collision_cylinder_box.cpp
${ODE_SRC_ROOT}/ode/ode_collision_cylinder_plane.cpp
${ODE_SRC_ROOT}/ode/ode_collision_cylinder_sphere.cpp
${ODE_SRC_ROOT}/ode/ode_collision_cylinder_trimesh.cpp
${ODE_SRC_ROOT}/ode/ode_collision_kernel.cpp
${ODE_SRC_ROOT}/ode/ode_collision_quadtreespace.cpp
${ODE_SRC_ROOT}/ode/ode_collision_sapspace.cpp
${ODE_SRC_ROOT}/ode/ode_collision_space.cpp
${ODE_SRC_ROOT}/ode/ode_collision_std.cpp
${ODE_SRC_ROOT}/ode/ode_collision_transform.cpp
${ODE_SRC_ROOT}/ode/ode_collision_trimesh.cpp
${ODE_SRC_ROOT}/ode/ode_collision_trimesh_box.cpp
${ODE_SRC_ROOT}/ode/ode_collision_trimesh_ccylinder.cpp
${ODE_SRC_ROOT}/ode/ode_collision_trimesh_distance.cpp
${ODE_SRC_ROOT}/ode/ode_collision_trimesh_plane.cpp
${ODE_SRC_ROOT}/ode/ode_collision_trimesh_ray.cpp
${ODE_SRC_ROOT}/ode/ode_collision_trimesh_sphere.cpp
${ODE_SRC_ROOT}/ode/ode_collision_trimesh_trimesh.cpp
${ODE_SRC_ROOT}/ode/ode_collision_util.cpp
${ODE_SRC_ROOT}/ode/ode_error.cpp
${ODE_SRC_ROOT}/ode/ode_export-diff.cpp
${ODE_SRC_ROOT}/ode/ode_fastdot.cpp
${ODE_SRC_ROOT}/ode/ode_fastldlt.cpp
${ODE_SRC_ROOT}/ode/ode_fastlsolve.cpp
${ODE_SRC_ROOT}/ode/ode_fastltsolve.cpp
${ODE_SRC_ROOT}/ode/ode_joint.cpp
${ODE_SRC_ROOT}/ode/ode_lcp.cpp
${ODE_SRC_ROOT}/ode/ode_mass.cpp
${ODE_SRC_ROOT}/ode/ode_mat.cpp
${ODE_SRC_ROOT}/ode/ode_math.cpp
${ODE_SRC_ROOT}/ode/ode_matrix.cpp
${ODE_SRC_ROOT}/ode/ode_memory.cpp
${ODE_SRC_ROOT}/ode/ode_misc.cpp
${ODE_SRC_ROOT}/ode/ode_obstack.cpp
${ODE_SRC_ROOT}/ode/ode_quickstep.cpp
${ODE_SRC_ROOT}/ode/ode_rotation.cpp
${ODE_SRC_ROOT}/ode/ode_step.cpp
${ODE_SRC_ROOT}/ode/ode_stepfast.cpp
${ODE_SRC_ROOT}/ode/ode_timer.cpp
${ODE_SRC_ROOT}/ode/ode_util.cpp
${ODE_SRC_ROOT}/ode/OPC_AABBCollider.cpp
${ODE_SRC_ROOT}/ode/OPC_AABBTree.cpp
${ODE_SRC_ROOT}/ode/OPC_BaseModel.cpp
${ODE_SRC_ROOT}/ode/OPC_BoxPruning.cpp
${ODE_SRC_ROOT}/ode/OPC_Collider.cpp
${ODE_SRC_ROOT}/ode/OPC_HybridModel.cpp
${ODE_SRC_ROOT}/ode/OPC_LSSCollider.cpp
${ODE_SRC_ROOT}/ode/OPC_MeshInterface.cpp
${ODE_SRC_ROOT}/ode/OPC_Model.cpp
${ODE_SRC_ROOT}/ode/OPC_OBBCollider.cpp
${ODE_SRC_ROOT}/ode/OPC_OptimizedTree.cpp
${ODE_SRC_ROOT}/ode/OPC_PlanesCollider.cpp
${ODE_SRC_ROOT}/ode/OPC_RayCollider.cpp
${ODE_SRC_ROOT}/ode/OPC_SphereCollider.cpp
${ODE_SRC_ROOT}/ode/OPC_SweepAndPrune.cpp
${ODE_SRC_ROOT}/ode/OPC_TreeBuilders.cpp
${ODE_SRC_ROOT}/ode/OPC_TreeCollider.cpp
${ODE_SRC_ROOT}/ode/OPC_VolumeCollider.cpp
${ODE_SRC_ROOT}/ode/Opcode.cpp
)
target_include_directories(ode PRIVATE ${ODE_SRC_ROOT})
# EWWW; GCC gives us bad mesh collisions with -O3 (and maybe -O2)
# need to finally get to the bottom of this but limiting to -01 for now.
# (-O2 might be safe??... or what about -Os? Should test again.)
if (CMAKE_BUILD_TYPE MATCHES Release)
target_compile_options(ode PRIVATE -O1)
endif ()
# MakeBob binary.
add_executable(make_bob
${BA_SRC_ROOT}/tools/make_bob/make_bob.cc
${BA_SRC_ROOT}/ballistica/core/exception.cc
${BA_SRC_ROOT}/tools/make_bob/tri_optimization/ls_vcache_opt.cc
)
target_include_directories(make_bob PRIVATE
${BA_SRC_ROOT}/tools/make_bob
${BA_SRC_ROOT}/external/open_dynamics_engine-ef)
# BallisticaCore binary.
add_executable(ballisticacore
${BA_SRC_ROOT}/external/qrencode-3.4.4/qrencode/bitstream.c
${BA_SRC_ROOT}/external/qrencode-3.4.4/qrencode/mask.c
${BA_SRC_ROOT}/external/qrencode-3.4.4/qrencode/mmask.c
${BA_SRC_ROOT}/external/qrencode-3.4.4/qrencode/mqrspec.c
${BA_SRC_ROOT}/external/qrencode-3.4.4/qrencode/qrencode.c
${BA_SRC_ROOT}/external/qrencode-3.4.4/qrencode/qrinput.c
${BA_SRC_ROOT}/external/qrencode-3.4.4/qrencode/qrspec.c
${BA_SRC_ROOT}/external/qrencode-3.4.4/qrencode/rscode.c
${BA_SRC_ROOT}/external/qrencode-3.4.4/qrencode/split.c
#AUTOGENERATED_BEGIN (this section is managed by the "update_project" tool)
${BA_SRC_ROOT}/ballistica/app/app.cc
${BA_SRC_ROOT}/ballistica/app/app.h
${BA_SRC_ROOT}/ballistica/app/app_config.cc
${BA_SRC_ROOT}/ballistica/app/app_config.h
${BA_SRC_ROOT}/ballistica/app/app_globals.cc
${BA_SRC_ROOT}/ballistica/app/app_globals.h
${BA_SRC_ROOT}/ballistica/app/headless_app.cc
${BA_SRC_ROOT}/ballistica/app/headless_app.h
${BA_SRC_ROOT}/ballistica/app/stress_test.cc
${BA_SRC_ROOT}/ballistica/app/stress_test.h
${BA_SRC_ROOT}/ballistica/audio/al_sys.cc
${BA_SRC_ROOT}/ballistica/audio/al_sys.h
${BA_SRC_ROOT}/ballistica/audio/audio.cc
${BA_SRC_ROOT}/ballistica/audio/audio.h
${BA_SRC_ROOT}/ballistica/audio/audio_server.cc
${BA_SRC_ROOT}/ballistica/audio/audio_server.h
${BA_SRC_ROOT}/ballistica/audio/audio_source.cc
${BA_SRC_ROOT}/ballistica/audio/audio_source.h
${BA_SRC_ROOT}/ballistica/audio/audio_streamer.cc
${BA_SRC_ROOT}/ballistica/audio/audio_streamer.h
${BA_SRC_ROOT}/ballistica/audio/ogg_stream.cc
${BA_SRC_ROOT}/ballistica/audio/ogg_stream.h
${BA_SRC_ROOT}/ballistica/ballistica.cc
${BA_SRC_ROOT}/ballistica/ballistica.h
${BA_SRC_ROOT}/ballistica/config/config_android_amazon.h
${BA_SRC_ROOT}/ballistica/config/config_android_cardboard.h
${BA_SRC_ROOT}/ballistica/config/config_android_common.h
${BA_SRC_ROOT}/ballistica/config/config_android_demo.h
${BA_SRC_ROOT}/ballistica/config/config_android_generic.h
${BA_SRC_ROOT}/ballistica/config/config_android_google.h
${BA_SRC_ROOT}/ballistica/config/config_android_oculus.h
${BA_SRC_ROOT}/ballistica/config/config_android_template.h
${BA_SRC_ROOT}/ballistica/config/config_cmake.h
${BA_SRC_ROOT}/ballistica/config/config_common.h
${BA_SRC_ROOT}/ballistica/config/config_windows_common.h
${BA_SRC_ROOT}/ballistica/config/config_windows_generic.h
${BA_SRC_ROOT}/ballistica/config/config_windows_headless.h
${BA_SRC_ROOT}/ballistica/config/config_windows_oculus.h
${BA_SRC_ROOT}/ballistica/config/config_xcode_common.h
${BA_SRC_ROOT}/ballistica/config/config_xcode_ios.h
${BA_SRC_ROOT}/ballistica/config/config_xcode_ios_legacy.h
${BA_SRC_ROOT}/ballistica/config/config_xcode_mac.h
${BA_SRC_ROOT}/ballistica/config/config_xcode_mac_headless_legacy.h
${BA_SRC_ROOT}/ballistica/config/config_xcode_mac_legacy.h
${BA_SRC_ROOT}/ballistica/config/config_xcode_tvos.h
${BA_SRC_ROOT}/ballistica/core/context.cc
${BA_SRC_ROOT}/ballistica/core/context.h
${BA_SRC_ROOT}/ballistica/core/exception.cc
${BA_SRC_ROOT}/ballistica/core/exception.h
${BA_SRC_ROOT}/ballistica/core/inline.cc
${BA_SRC_ROOT}/ballistica/core/inline.h
${BA_SRC_ROOT}/ballistica/core/logging.cc
${BA_SRC_ROOT}/ballistica/core/logging.h
${BA_SRC_ROOT}/ballistica/core/macros.cc
${BA_SRC_ROOT}/ballistica/core/macros.h
${BA_SRC_ROOT}/ballistica/core/module.cc
${BA_SRC_ROOT}/ballistica/core/module.h
${BA_SRC_ROOT}/ballistica/core/object.cc
${BA_SRC_ROOT}/ballistica/core/object.h
${BA_SRC_ROOT}/ballistica/core/thread.cc
${BA_SRC_ROOT}/ballistica/core/thread.h
${BA_SRC_ROOT}/ballistica/core/types.h
${BA_SRC_ROOT}/ballistica/dynamics/bg/bg_dynamics.cc
${BA_SRC_ROOT}/ballistica/dynamics/bg/bg_dynamics.h
${BA_SRC_ROOT}/ballistica/dynamics/bg/bg_dynamics_draw_snapshot.h
${BA_SRC_ROOT}/ballistica/dynamics/bg/bg_dynamics_fuse.cc
${BA_SRC_ROOT}/ballistica/dynamics/bg/bg_dynamics_fuse.h
${BA_SRC_ROOT}/ballistica/dynamics/bg/bg_dynamics_fuse_data.h
${BA_SRC_ROOT}/ballistica/dynamics/bg/bg_dynamics_height_cache.cc
${BA_SRC_ROOT}/ballistica/dynamics/bg/bg_dynamics_height_cache.h
${BA_SRC_ROOT}/ballistica/dynamics/bg/bg_dynamics_server.cc
${BA_SRC_ROOT}/ballistica/dynamics/bg/bg_dynamics_server.h
${BA_SRC_ROOT}/ballistica/dynamics/bg/bg_dynamics_shadow.cc
${BA_SRC_ROOT}/ballistica/dynamics/bg/bg_dynamics_shadow.h
${BA_SRC_ROOT}/ballistica/dynamics/bg/bg_dynamics_shadow_data.h
${BA_SRC_ROOT}/ballistica/dynamics/bg/bg_dynamics_volume_light.cc
${BA_SRC_ROOT}/ballistica/dynamics/bg/bg_dynamics_volume_light.h
${BA_SRC_ROOT}/ballistica/dynamics/bg/bg_dynamics_volume_light_data.h
${BA_SRC_ROOT}/ballistica/dynamics/collision.h
${BA_SRC_ROOT}/ballistica/dynamics/collision_cache.cc
${BA_SRC_ROOT}/ballistica/dynamics/collision_cache.h
${BA_SRC_ROOT}/ballistica/dynamics/dynamics.cc
${BA_SRC_ROOT}/ballistica/dynamics/dynamics.h
${BA_SRC_ROOT}/ballistica/dynamics/material/impact_sound_material_action.cc
${BA_SRC_ROOT}/ballistica/dynamics/material/impact_sound_material_action.h
${BA_SRC_ROOT}/ballistica/dynamics/material/material.cc
${BA_SRC_ROOT}/ballistica/dynamics/material/material.h
${BA_SRC_ROOT}/ballistica/dynamics/material/material_action.h
${BA_SRC_ROOT}/ballistica/dynamics/material/material_component.cc
${BA_SRC_ROOT}/ballistica/dynamics/material/material_component.h
${BA_SRC_ROOT}/ballistica/dynamics/material/material_condition_node.cc
${BA_SRC_ROOT}/ballistica/dynamics/material/material_condition_node.h
${BA_SRC_ROOT}/ballistica/dynamics/material/material_context.cc
${BA_SRC_ROOT}/ballistica/dynamics/material/material_context.h
${BA_SRC_ROOT}/ballistica/dynamics/material/node_message_material_action.cc
${BA_SRC_ROOT}/ballistica/dynamics/material/node_message_material_action.h
${BA_SRC_ROOT}/ballistica/dynamics/material/node_mod_material_action.cc
${BA_SRC_ROOT}/ballistica/dynamics/material/node_mod_material_action.h
${BA_SRC_ROOT}/ballistica/dynamics/material/node_user_message_material_action.cc
${BA_SRC_ROOT}/ballistica/dynamics/material/node_user_message_material_action.h
${BA_SRC_ROOT}/ballistica/dynamics/material/part_mod_material_action.cc
${BA_SRC_ROOT}/ballistica/dynamics/material/part_mod_material_action.h
${BA_SRC_ROOT}/ballistica/dynamics/material/python_call_material_action.cc
${BA_SRC_ROOT}/ballistica/dynamics/material/python_call_material_action.h
${BA_SRC_ROOT}/ballistica/dynamics/material/roll_sound_material_action.cc
${BA_SRC_ROOT}/ballistica/dynamics/material/roll_sound_material_action.h
${BA_SRC_ROOT}/ballistica/dynamics/material/skid_sound_material_action.cc
${BA_SRC_ROOT}/ballistica/dynamics/material/skid_sound_material_action.h
${BA_SRC_ROOT}/ballistica/dynamics/material/sound_material_action.cc
${BA_SRC_ROOT}/ballistica/dynamics/material/sound_material_action.h
${BA_SRC_ROOT}/ballistica/dynamics/part.cc
${BA_SRC_ROOT}/ballistica/dynamics/part.h
${BA_SRC_ROOT}/ballistica/dynamics/rigid_body.cc
${BA_SRC_ROOT}/ballistica/dynamics/rigid_body.h
${BA_SRC_ROOT}/ballistica/game/account.cc
${BA_SRC_ROOT}/ballistica/game/account.h
${BA_SRC_ROOT}/ballistica/game/client_controller_interface.h
${BA_SRC_ROOT}/ballistica/game/connection/connection.cc
${BA_SRC_ROOT}/ballistica/game/connection/connection.h
${BA_SRC_ROOT}/ballistica/game/connection/connection_to_client.cc
${BA_SRC_ROOT}/ballistica/game/connection/connection_to_client.h
${BA_SRC_ROOT}/ballistica/game/connection/connection_to_client_udp.cc
${BA_SRC_ROOT}/ballistica/game/connection/connection_to_client_udp.h
${BA_SRC_ROOT}/ballistica/game/connection/connection_to_host.cc
${BA_SRC_ROOT}/ballistica/game/connection/connection_to_host.h
${BA_SRC_ROOT}/ballistica/game/connection/connection_to_host_udp.cc
${BA_SRC_ROOT}/ballistica/game/connection/connection_to_host_udp.h
${BA_SRC_ROOT}/ballistica/game/friend_score_set.h
${BA_SRC_ROOT}/ballistica/game/game.cc
${BA_SRC_ROOT}/ballistica/game/game.h
${BA_SRC_ROOT}/ballistica/game/game_stream.cc
${BA_SRC_ROOT}/ballistica/game/game_stream.h
${BA_SRC_ROOT}/ballistica/game/host_activity.cc
${BA_SRC_ROOT}/ballistica/game/host_activity.h
${BA_SRC_ROOT}/ballistica/game/player.cc
${BA_SRC_ROOT}/ballistica/game/player.h
${BA_SRC_ROOT}/ballistica/game/player_spec.cc
${BA_SRC_ROOT}/ballistica/game/player_spec.h
${BA_SRC_ROOT}/ballistica/game/score_to_beat.h
${BA_SRC_ROOT}/ballistica/game/session/client_session.cc
${BA_SRC_ROOT}/ballistica/game/session/client_session.h
${BA_SRC_ROOT}/ballistica/game/session/host_session.cc
${BA_SRC_ROOT}/ballistica/game/session/host_session.h
${BA_SRC_ROOT}/ballistica/game/session/net_client_session.cc
${BA_SRC_ROOT}/ballistica/game/session/net_client_session.h
${BA_SRC_ROOT}/ballistica/game/session/replay_client_session.cc
${BA_SRC_ROOT}/ballistica/game/session/replay_client_session.h
${BA_SRC_ROOT}/ballistica/game/session/session.cc
${BA_SRC_ROOT}/ballistica/game/session/session.h
${BA_SRC_ROOT}/ballistica/generic/base64.cc
${BA_SRC_ROOT}/ballistica/generic/base64.h
${BA_SRC_ROOT}/ballistica/generic/buffer.h
${BA_SRC_ROOT}/ballistica/generic/huffman.cc
${BA_SRC_ROOT}/ballistica/generic/huffman.h
${BA_SRC_ROOT}/ballistica/generic/json.cc
${BA_SRC_ROOT}/ballistica/generic/json.h
${BA_SRC_ROOT}/ballistica/generic/lambda_runnable.h
${BA_SRC_ROOT}/ballistica/generic/real_timer.h
${BA_SRC_ROOT}/ballistica/generic/runnable.cc
${BA_SRC_ROOT}/ballistica/generic/runnable.h
${BA_SRC_ROOT}/ballistica/generic/timer.cc
${BA_SRC_ROOT}/ballistica/generic/timer.h
${BA_SRC_ROOT}/ballistica/generic/timer_list.cc
${BA_SRC_ROOT}/ballistica/generic/timer_list.h
${BA_SRC_ROOT}/ballistica/generic/utf8.cc
${BA_SRC_ROOT}/ballistica/generic/utf8.h
${BA_SRC_ROOT}/ballistica/generic/utils.cc
${BA_SRC_ROOT}/ballistica/generic/utils.h
${BA_SRC_ROOT}/ballistica/graphics/area_of_interest.cc
${BA_SRC_ROOT}/ballistica/graphics/area_of_interest.h
${BA_SRC_ROOT}/ballistica/graphics/camera.cc
${BA_SRC_ROOT}/ballistica/graphics/camera.h
${BA_SRC_ROOT}/ballistica/graphics/component/empty_component.h
${BA_SRC_ROOT}/ballistica/graphics/component/object_component.cc
${BA_SRC_ROOT}/ballistica/graphics/component/object_component.h
${BA_SRC_ROOT}/ballistica/graphics/component/post_process_component.cc
${BA_SRC_ROOT}/ballistica/graphics/component/post_process_component.h
${BA_SRC_ROOT}/ballistica/graphics/component/render_component.cc
${BA_SRC_ROOT}/ballistica/graphics/component/render_component.h
${BA_SRC_ROOT}/ballistica/graphics/component/shield_component.cc
${BA_SRC_ROOT}/ballistica/graphics/component/shield_component.h
${BA_SRC_ROOT}/ballistica/graphics/component/simple_component.cc
${BA_SRC_ROOT}/ballistica/graphics/component/simple_component.h
${BA_SRC_ROOT}/ballistica/graphics/component/smoke_component.cc
${BA_SRC_ROOT}/ballistica/graphics/component/smoke_component.h
${BA_SRC_ROOT}/ballistica/graphics/component/special_component.cc
${BA_SRC_ROOT}/ballistica/graphics/component/special_component.h
${BA_SRC_ROOT}/ballistica/graphics/component/sprite_component.cc
${BA_SRC_ROOT}/ballistica/graphics/component/sprite_component.h
${BA_SRC_ROOT}/ballistica/graphics/frame_def.cc
${BA_SRC_ROOT}/ballistica/graphics/frame_def.h
${BA_SRC_ROOT}/ballistica/graphics/framebuffer.h
${BA_SRC_ROOT}/ballistica/graphics/gl/gl_sys.cc
${BA_SRC_ROOT}/ballistica/graphics/gl/gl_sys.h
${BA_SRC_ROOT}/ballistica/graphics/gl/renderer_gl.cc
${BA_SRC_ROOT}/ballistica/graphics/gl/renderer_gl.h
${BA_SRC_ROOT}/ballistica/graphics/graphics.cc
${BA_SRC_ROOT}/ballistica/graphics/graphics.h
${BA_SRC_ROOT}/ballistica/graphics/graphics_server.cc
${BA_SRC_ROOT}/ballistica/graphics/graphics_server.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/image_mesh.cc
${BA_SRC_ROOT}/ballistica/graphics/mesh/image_mesh.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh_buffer.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh_buffer_base.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh_buffer_vertex_simple_full.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh_buffer_vertex_smoke_full.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh_buffer_vertex_sprite.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh_data.cc
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh_data.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh_data_client_handle.cc
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh_data_client_handle.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh_index_buffer_16.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh_index_buffer_32.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh_indexed.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh_indexed_base.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh_indexed_dual_texture_full.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh_indexed_object_split.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh_indexed_simple_full.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh_indexed_simple_split.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh_indexed_smoke_full.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh_indexed_static_dynamic.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh_non_indexed.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/mesh_renderer_data.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/sprite_mesh.h
${BA_SRC_ROOT}/ballistica/graphics/mesh/text_mesh.cc
${BA_SRC_ROOT}/ballistica/graphics/mesh/text_mesh.h
${BA_SRC_ROOT}/ballistica/graphics/net_graph.cc
${BA_SRC_ROOT}/ballistica/graphics/net_graph.h
${BA_SRC_ROOT}/ballistica/graphics/render_command_buffer.h
${BA_SRC_ROOT}/ballistica/graphics/render_pass.cc
${BA_SRC_ROOT}/ballistica/graphics/render_pass.h
${BA_SRC_ROOT}/ballistica/graphics/render_target.cc
${BA_SRC_ROOT}/ballistica/graphics/render_target.h
${BA_SRC_ROOT}/ballistica/graphics/renderer.cc
${BA_SRC_ROOT}/ballistica/graphics/renderer.h
${BA_SRC_ROOT}/ballistica/graphics/text/font_page_map_data.h
${BA_SRC_ROOT}/ballistica/graphics/text/text_graphics.cc
${BA_SRC_ROOT}/ballistica/graphics/text/text_graphics.h
${BA_SRC_ROOT}/ballistica/graphics/text/text_group.cc
${BA_SRC_ROOT}/ballistica/graphics/text/text_group.h
${BA_SRC_ROOT}/ballistica/graphics/text/text_packer.cc
${BA_SRC_ROOT}/ballistica/graphics/text/text_packer.h
${BA_SRC_ROOT}/ballistica/graphics/texture/dds.cc
${BA_SRC_ROOT}/ballistica/graphics/texture/dds.h
${BA_SRC_ROOT}/ballistica/graphics/texture/ktx.cc
${BA_SRC_ROOT}/ballistica/graphics/texture/ktx.h
${BA_SRC_ROOT}/ballistica/graphics/texture/pvr.cc
${BA_SRC_ROOT}/ballistica/graphics/texture/pvr.h
${BA_SRC_ROOT}/ballistica/input/device/client_input_device.cc
${BA_SRC_ROOT}/ballistica/input/device/client_input_device.h
${BA_SRC_ROOT}/ballistica/input/device/input_device.cc
${BA_SRC_ROOT}/ballistica/input/device/input_device.h
${BA_SRC_ROOT}/ballistica/input/device/joystick.cc
${BA_SRC_ROOT}/ballistica/input/device/joystick.h
${BA_SRC_ROOT}/ballistica/input/device/keyboard_input.cc
${BA_SRC_ROOT}/ballistica/input/device/keyboard_input.h
${BA_SRC_ROOT}/ballistica/input/device/test_input.cc
${BA_SRC_ROOT}/ballistica/input/device/test_input.h
${BA_SRC_ROOT}/ballistica/input/device/touch_input.cc
${BA_SRC_ROOT}/ballistica/input/device/touch_input.h
${BA_SRC_ROOT}/ballistica/input/input.cc
${BA_SRC_ROOT}/ballistica/input/input.h
${BA_SRC_ROOT}/ballistica/input/remote_app.cc
${BA_SRC_ROOT}/ballistica/input/remote_app.h
${BA_SRC_ROOT}/ballistica/input/std_input_module.cc
${BA_SRC_ROOT}/ballistica/input/std_input_module.h
${BA_SRC_ROOT}/ballistica/math/matrix44f.cc
${BA_SRC_ROOT}/ballistica/math/matrix44f.h
${BA_SRC_ROOT}/ballistica/math/point2d.h
${BA_SRC_ROOT}/ballistica/math/random.cc
${BA_SRC_ROOT}/ballistica/math/random.h
${BA_SRC_ROOT}/ballistica/math/rect.h
${BA_SRC_ROOT}/ballistica/math/vector2f.h
${BA_SRC_ROOT}/ballistica/math/vector3f.cc
${BA_SRC_ROOT}/ballistica/math/vector3f.h
${BA_SRC_ROOT}/ballistica/math/vector4f.h
${BA_SRC_ROOT}/ballistica/media/component/collide_model.cc
${BA_SRC_ROOT}/ballistica/media/component/collide_model.h
${BA_SRC_ROOT}/ballistica/media/component/cube_map_texture.cc
${BA_SRC_ROOT}/ballistica/media/component/cube_map_texture.h
${BA_SRC_ROOT}/ballistica/media/component/data.cc
${BA_SRC_ROOT}/ballistica/media/component/data.h
${BA_SRC_ROOT}/ballistica/media/component/media_component.cc
${BA_SRC_ROOT}/ballistica/media/component/media_component.h
${BA_SRC_ROOT}/ballistica/media/component/model.cc
${BA_SRC_ROOT}/ballistica/media/component/model.h
${BA_SRC_ROOT}/ballistica/media/component/sound.cc
${BA_SRC_ROOT}/ballistica/media/component/sound.h
${BA_SRC_ROOT}/ballistica/media/component/texture.cc
${BA_SRC_ROOT}/ballistica/media/component/texture.h
${BA_SRC_ROOT}/ballistica/media/data/collide_model_data.cc
${BA_SRC_ROOT}/ballistica/media/data/collide_model_data.h
${BA_SRC_ROOT}/ballistica/media/data/data_data.cc
${BA_SRC_ROOT}/ballistica/media/data/data_data.h
${BA_SRC_ROOT}/ballistica/media/data/media_component_data.cc
${BA_SRC_ROOT}/ballistica/media/data/media_component_data.h
${BA_SRC_ROOT}/ballistica/media/data/model_data.cc
${BA_SRC_ROOT}/ballistica/media/data/model_data.h
${BA_SRC_ROOT}/ballistica/media/data/model_renderer_data.h
${BA_SRC_ROOT}/ballistica/media/data/sound_data.cc
${BA_SRC_ROOT}/ballistica/media/data/sound_data.h
${BA_SRC_ROOT}/ballistica/media/data/texture_data.cc
${BA_SRC_ROOT}/ballistica/media/data/texture_data.h
${BA_SRC_ROOT}/ballistica/media/data/texture_preload_data.cc
${BA_SRC_ROOT}/ballistica/media/data/texture_preload_data.h
${BA_SRC_ROOT}/ballistica/media/data/texture_renderer_data.h
${BA_SRC_ROOT}/ballistica/media/media.cc
${BA_SRC_ROOT}/ballistica/media/media.h
${BA_SRC_ROOT}/ballistica/media/media_server.cc
${BA_SRC_ROOT}/ballistica/media/media_server.h
${BA_SRC_ROOT}/ballistica/networking/lag_sim.cc
${BA_SRC_ROOT}/ballistica/networking/lag_sim.h
${BA_SRC_ROOT}/ballistica/networking/master_server_config.h
${BA_SRC_ROOT}/ballistica/networking/network_reader.cc
${BA_SRC_ROOT}/ballistica/networking/network_reader.h
${BA_SRC_ROOT}/ballistica/networking/network_write_module.cc
${BA_SRC_ROOT}/ballistica/networking/network_write_module.h
${BA_SRC_ROOT}/ballistica/networking/networking.cc
${BA_SRC_ROOT}/ballistica/networking/networking.h
${BA_SRC_ROOT}/ballistica/networking/networking_sys.h
${BA_SRC_ROOT}/ballistica/networking/sockaddr.cc
${BA_SRC_ROOT}/ballistica/networking/sockaddr.h
${BA_SRC_ROOT}/ballistica/networking/telnet_server.cc
${BA_SRC_ROOT}/ballistica/networking/telnet_server.h
${BA_SRC_ROOT}/ballistica/platform/android/amazon/platform_android_amazon.cc
${BA_SRC_ROOT}/ballistica/platform/android/amazon/platform_android_amazon.h
${BA_SRC_ROOT}/ballistica/platform/android/android_context.cc
${BA_SRC_ROOT}/ballistica/platform/android/android_context.h
${BA_SRC_ROOT}/ballistica/platform/android/android_gl3.c
${BA_SRC_ROOT}/ballistica/platform/android/android_gl3.h
${BA_SRC_ROOT}/ballistica/platform/android/cardboard/platform_android_cardboard.cc
${BA_SRC_ROOT}/ballistica/platform/android/cardboard/platform_android_cardboard.h
${BA_SRC_ROOT}/ballistica/platform/android/google/connection_to_client_google_play.cc
${BA_SRC_ROOT}/ballistica/platform/android/google/connection_to_client_google_play.h
${BA_SRC_ROOT}/ballistica/platform/android/google/connection_to_host_google_play.cc
${BA_SRC_ROOT}/ballistica/platform/android/google/connection_to_host_google_play.h
${BA_SRC_ROOT}/ballistica/platform/android/google/platform_android_google.cc
${BA_SRC_ROOT}/ballistica/platform/android/google/platform_android_google.h
${BA_SRC_ROOT}/ballistica/platform/android/ifaddrs_android_ext.cc
${BA_SRC_ROOT}/ballistica/platform/android/ifaddrs_android_ext.h
${BA_SRC_ROOT}/ballistica/platform/android/platform_android.cc
${BA_SRC_ROOT}/ballistica/platform/android/platform_android.h
${BA_SRC_ROOT}/ballistica/platform/android/utf8/checked.h
${BA_SRC_ROOT}/ballistica/platform/android/utf8/core.h
${BA_SRC_ROOT}/ballistica/platform/android/utf8/unchecked.h
${BA_SRC_ROOT}/ballistica/platform/apple/app_delegate.h
${BA_SRC_ROOT}/ballistica/platform/apple/apple_utils.h
${BA_SRC_ROOT}/ballistica/platform/apple/platform_apple.cc
${BA_SRC_ROOT}/ballistica/platform/apple/platform_apple.h
${BA_SRC_ROOT}/ballistica/platform/apple/scripting_bridge_itunes.h
${BA_SRC_ROOT}/ballistica/platform/apple/sdl_main_mac.h
${BA_SRC_ROOT}/ballistica/platform/linux/platform_linux.cc
${BA_SRC_ROOT}/ballistica/platform/linux/platform_linux.h
${BA_SRC_ROOT}/ballistica/platform/min_sdl.h
${BA_SRC_ROOT}/ballistica/platform/oculus/main_rift.cc
${BA_SRC_ROOT}/ballistica/platform/oculus/oculus_utils.cc
${BA_SRC_ROOT}/ballistica/platform/oculus/oculus_utils.h
${BA_SRC_ROOT}/ballistica/platform/platform.cc
${BA_SRC_ROOT}/ballistica/platform/platform.h
${BA_SRC_ROOT}/ballistica/platform/sdl/sdl_app.cc
${BA_SRC_ROOT}/ballistica/platform/sdl/sdl_app.h
${BA_SRC_ROOT}/ballistica/platform/sdl/sdl_sys.cc
${BA_SRC_ROOT}/ballistica/platform/sdl/sdl_sys.h
${BA_SRC_ROOT}/ballistica/platform/windows/platform_windows.cc
${BA_SRC_ROOT}/ballistica/platform/windows/platform_windows.h
${BA_SRC_ROOT}/ballistica/platform/windows/platform_windows_oculus.cc
${BA_SRC_ROOT}/ballistica/platform/windows/platform_windows_oculus.h
${BA_SRC_ROOT}/ballistica/python/class/python_class.cc
${BA_SRC_ROOT}/ballistica/python/class/python_class.h
${BA_SRC_ROOT}/ballistica/python/class/python_class_activity_data.cc
${BA_SRC_ROOT}/ballistica/python/class/python_class_activity_data.h
${BA_SRC_ROOT}/ballistica/python/class/python_class_collide_model.cc
${BA_SRC_ROOT}/ballistica/python/class/python_class_collide_model.h
${BA_SRC_ROOT}/ballistica/python/class/python_class_context.cc
${BA_SRC_ROOT}/ballistica/python/class/python_class_context.h
${BA_SRC_ROOT}/ballistica/python/class/python_class_context_call.cc
${BA_SRC_ROOT}/ballistica/python/class/python_class_context_call.h
${BA_SRC_ROOT}/ballistica/python/class/python_class_data.cc
${BA_SRC_ROOT}/ballistica/python/class/python_class_data.h
${BA_SRC_ROOT}/ballistica/python/class/python_class_input_device.cc
${BA_SRC_ROOT}/ballistica/python/class/python_class_input_device.h
${BA_SRC_ROOT}/ballistica/python/class/python_class_material.cc
${BA_SRC_ROOT}/ballistica/python/class/python_class_material.h
${BA_SRC_ROOT}/ballistica/python/class/python_class_model.cc
${BA_SRC_ROOT}/ballistica/python/class/python_class_model.h
${BA_SRC_ROOT}/ballistica/python/class/python_class_node.cc
${BA_SRC_ROOT}/ballistica/python/class/python_class_node.h
${BA_SRC_ROOT}/ballistica/python/class/python_class_player.cc
${BA_SRC_ROOT}/ballistica/python/class/python_class_player.h
${BA_SRC_ROOT}/ballistica/python/class/python_class_session_data.cc
${BA_SRC_ROOT}/ballistica/python/class/python_class_session_data.h
${BA_SRC_ROOT}/ballistica/python/class/python_class_sound.cc
${BA_SRC_ROOT}/ballistica/python/class/python_class_sound.h
${BA_SRC_ROOT}/ballistica/python/class/python_class_texture.cc
${BA_SRC_ROOT}/ballistica/python/class/python_class_texture.h
${BA_SRC_ROOT}/ballistica/python/class/python_class_timer.cc
${BA_SRC_ROOT}/ballistica/python/class/python_class_timer.h
${BA_SRC_ROOT}/ballistica/python/class/python_class_vec3.cc
${BA_SRC_ROOT}/ballistica/python/class/python_class_vec3.h
${BA_SRC_ROOT}/ballistica/python/class/python_class_widget.cc
${BA_SRC_ROOT}/ballistica/python/class/python_class_widget.h
${BA_SRC_ROOT}/ballistica/python/methods/python_methods_account.cc
${BA_SRC_ROOT}/ballistica/python/methods/python_methods_account.h
${BA_SRC_ROOT}/ballistica/python/methods/python_methods_app.cc
${BA_SRC_ROOT}/ballistica/python/methods/python_methods_app.h
${BA_SRC_ROOT}/ballistica/python/methods/python_methods_gameplay.cc
${BA_SRC_ROOT}/ballistica/python/methods/python_methods_gameplay.h
${BA_SRC_ROOT}/ballistica/python/methods/python_methods_graphics.cc
${BA_SRC_ROOT}/ballistica/python/methods/python_methods_graphics.h
${BA_SRC_ROOT}/ballistica/python/methods/python_methods_input.cc
${BA_SRC_ROOT}/ballistica/python/methods/python_methods_input.h
${BA_SRC_ROOT}/ballistica/python/methods/python_methods_media.cc
${BA_SRC_ROOT}/ballistica/python/methods/python_methods_media.h
${BA_SRC_ROOT}/ballistica/python/methods/python_methods_networking.cc
${BA_SRC_ROOT}/ballistica/python/methods/python_methods_networking.h
${BA_SRC_ROOT}/ballistica/python/methods/python_methods_system.cc
${BA_SRC_ROOT}/ballistica/python/methods/python_methods_system.h
${BA_SRC_ROOT}/ballistica/python/methods/python_methods_ui.cc
${BA_SRC_ROOT}/ballistica/python/methods/python_methods_ui.h
${BA_SRC_ROOT}/ballistica/python/python.cc
${BA_SRC_ROOT}/ballistica/python/python.h
${BA_SRC_ROOT}/ballistica/python/python_command.cc
${BA_SRC_ROOT}/ballistica/python/python_command.h
${BA_SRC_ROOT}/ballistica/python/python_context_call.cc
${BA_SRC_ROOT}/ballistica/python/python_context_call.h
${BA_SRC_ROOT}/ballistica/python/python_context_call_runnable.h
${BA_SRC_ROOT}/ballistica/python/python_ref.cc
${BA_SRC_ROOT}/ballistica/python/python_ref.h
${BA_SRC_ROOT}/ballistica/python/python_sys.h
${BA_SRC_ROOT}/ballistica/scene/node/anim_curve_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/anim_curve_node.h
${BA_SRC_ROOT}/ballistica/scene/node/bomb_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/bomb_node.h
${BA_SRC_ROOT}/ballistica/scene/node/combine_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/combine_node.h
${BA_SRC_ROOT}/ballistica/scene/node/explosion_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/explosion_node.h
${BA_SRC_ROOT}/ballistica/scene/node/flag_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/flag_node.h
${BA_SRC_ROOT}/ballistica/scene/node/flash_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/flash_node.h
${BA_SRC_ROOT}/ballistica/scene/node/globals_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/globals_node.h
${BA_SRC_ROOT}/ballistica/scene/node/image_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/image_node.h
${BA_SRC_ROOT}/ballistica/scene/node/light_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/light_node.h
${BA_SRC_ROOT}/ballistica/scene/node/locator_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/locator_node.h
${BA_SRC_ROOT}/ballistica/scene/node/math_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/math_node.h
${BA_SRC_ROOT}/ballistica/scene/node/node.cc
${BA_SRC_ROOT}/ballistica/scene/node/node.h
${BA_SRC_ROOT}/ballistica/scene/node/node_attribute.cc
${BA_SRC_ROOT}/ballistica/scene/node/node_attribute.h
${BA_SRC_ROOT}/ballistica/scene/node/node_attribute_connection.cc
${BA_SRC_ROOT}/ballistica/scene/node/node_attribute_connection.h
${BA_SRC_ROOT}/ballistica/scene/node/node_type.h
${BA_SRC_ROOT}/ballistica/scene/node/null_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/null_node.h
${BA_SRC_ROOT}/ballistica/scene/node/player_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/player_node.h
${BA_SRC_ROOT}/ballistica/scene/node/prop_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/prop_node.h
${BA_SRC_ROOT}/ballistica/scene/node/region_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/region_node.h
${BA_SRC_ROOT}/ballistica/scene/node/scorch_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/scorch_node.h
${BA_SRC_ROOT}/ballistica/scene/node/session_globals_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/session_globals_node.h
${BA_SRC_ROOT}/ballistica/scene/node/shield_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/shield_node.h
${BA_SRC_ROOT}/ballistica/scene/node/sound_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/sound_node.h
${BA_SRC_ROOT}/ballistica/scene/node/spaz_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/spaz_node.h
${BA_SRC_ROOT}/ballistica/scene/node/terrain_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/terrain_node.h
${BA_SRC_ROOT}/ballistica/scene/node/text_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/text_node.h
${BA_SRC_ROOT}/ballistica/scene/node/texture_sequence_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/texture_sequence_node.h
${BA_SRC_ROOT}/ballistica/scene/node/time_display_node.cc
${BA_SRC_ROOT}/ballistica/scene/node/time_display_node.h
${BA_SRC_ROOT}/ballistica/scene/scene.cc
${BA_SRC_ROOT}/ballistica/scene/scene.h
${BA_SRC_ROOT}/ballistica/ui/console.cc
${BA_SRC_ROOT}/ballistica/ui/console.h
${BA_SRC_ROOT}/ballistica/ui/ui.cc
${BA_SRC_ROOT}/ballistica/ui/ui.h
${BA_SRC_ROOT}/ballistica/ui/widget/button_widget.cc
${BA_SRC_ROOT}/ballistica/ui/widget/button_widget.h
${BA_SRC_ROOT}/ballistica/ui/widget/check_box_widget.cc
${BA_SRC_ROOT}/ballistica/ui/widget/check_box_widget.h
${BA_SRC_ROOT}/ballistica/ui/widget/column_widget.cc
${BA_SRC_ROOT}/ballistica/ui/widget/column_widget.h
${BA_SRC_ROOT}/ballistica/ui/widget/container_widget.cc
${BA_SRC_ROOT}/ballistica/ui/widget/container_widget.h
${BA_SRC_ROOT}/ballistica/ui/widget/h_scroll_widget.cc
${BA_SRC_ROOT}/ballistica/ui/widget/h_scroll_widget.h
${BA_SRC_ROOT}/ballistica/ui/widget/image_widget.cc
${BA_SRC_ROOT}/ballistica/ui/widget/image_widget.h
${BA_SRC_ROOT}/ballistica/ui/widget/root_widget.cc
${BA_SRC_ROOT}/ballistica/ui/widget/root_widget.h
${BA_SRC_ROOT}/ballistica/ui/widget/row_widget.cc
${BA_SRC_ROOT}/ballistica/ui/widget/row_widget.h
${BA_SRC_ROOT}/ballistica/ui/widget/scroll_widget.cc
${BA_SRC_ROOT}/ballistica/ui/widget/scroll_widget.h
${BA_SRC_ROOT}/ballistica/ui/widget/stack_widget.cc
${BA_SRC_ROOT}/ballistica/ui/widget/stack_widget.h
${BA_SRC_ROOT}/ballistica/ui/widget/text_widget.cc
${BA_SRC_ROOT}/ballistica/ui/widget/text_widget.h
${BA_SRC_ROOT}/ballistica/ui/widget/widget.cc
${BA_SRC_ROOT}/ballistica/ui/widget/widget.h
#AUTOGENERATED_END
)
target_include_directories(ballisticacore PRIVATE
${PYTHON_INCLUDE_DIRS}
${BA_SRC_ROOT}/external/open_dynamics_engine-ef
${BA_SRC_ROOT}/external/qrencode-3.4.4
${EXTRA_INCLUDE_DIRS}
)
target_link_libraries(ballisticacore PRIVATE
ode pthread ${PYTHON_LIBRARIES}
${SDL2_LIBRARIES} ${EXTRA_LIBRARIES})

View File

@ -7,7 +7,7 @@ from dataclasses import dataclass
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from typing import Optional, List
from typing import Optional, List, Tuple
@dataclass
@ -22,6 +22,13 @@ class Paragraph:
"""Represents a continuous set of non-blank lines in a Makefile."""
contents: str
def get_logical_lines(self) -> List[str]:
"""Return contents broken into logical lines.
Lines joined by continuation chars are considered a single line.
"""
return self.contents.replace('\\\n', '').splitlines()
class Makefile:
"""Represents an entire Makefile."""
@ -72,6 +79,33 @@ class Makefile:
else:
section.paragraphs.append(paragraph)
def find_assigns(self, name: str) -> List[Tuple[Section, int]]:
"""Return section/index pairs for paragraphs containing an assign.
Note that the paragraph may contain other statements as well.
"""
found: List[Tuple[Section, int]] = []
for section in self.sections:
for i, paragraph in enumerate(section.paragraphs):
if any(
line.split('=')[0].strip() == name
for line in paragraph.get_logical_lines()):
found.append((section, i))
return found
def find_targets(self, name: str) -> List[Tuple[Section, int]]:
"""Return section/index pairs for paragraphs containing a target.
Note that the paragraph may contain other statements as well.
"""
found: List[Tuple[Section, int]] = []
for section in self.sections:
for i, paragraph in enumerate(section.paragraphs):
if any(line.split()[0] == name + ':'
for line in paragraph.get_logical_lines()):
found.append((section, i))
return found
def get_output(self) -> str:
"""Generate a Makefile from the current state."""

397
tools/update_project Executable file
View File

@ -0,0 +1,397 @@
#!/usr/bin/env python3
"""
This script acts as a 'meta' Makefile for the project. It is in charge
of generating Makefiles, IDE project files, procedurally generated source
files, etc. based on the current structure of the project.
It can also perform sanity checks or cleanup tasks.
Updating should be explicitly run by the user through commands such as
'make update', 'make check' or 'make preflight'. Other make targets should
avoid running this script as it can modify the project structure
arbitrarily which is not a good idea in the middle of a build.
If the script is invoked with a --check argument, it should not modify any
files but instead fail if any modifications *would* have been made.
(used in CI builds to make sure things are kosher).
"""
from __future__ import annotations
import os
import sys
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from typing import Optional, Tuple, List, Sequence, Dict, Set
CLRHDR = '\033[95m' # Header.
CLRGRN = '\033[92m' # Green.
CLRBLU = '\033[94m' # Glue.
CLRRED = '\033[91m' # Red.
CLREND = '\033[0m' # End.
def _find_files(scan_dir: str) -> Tuple[List[str], List[str]]:
src_files = set()
header_files = set()
exts = ['.c', '.cc', '.cpp', '.cxx', '.m', '.mm']
header_exts = ['.h']
# Gather all sources and headers.
for root, _dirs, files in os.walk(scan_dir):
for ftst in files:
if any(ftst.endswith(ext) for ext in exts):
src_files.add(os.path.join(root, ftst)[len(scan_dir):])
if any(ftst.endswith(ext) for ext in header_exts):
header_files.add(os.path.join(root, ftst)[len(scan_dir):])
return sorted(src_files), sorted(header_files)
def _check_files(src_files: Sequence[str]) -> None:
# A bit of sanity/lint-testing while we're here.
for fsrc in src_files:
if fsrc.endswith('.cpp') or fsrc.endswith('.cxx'):
raise Exception('please use .cc for c++ files; found ' + fsrc)
# Watch out for in-progress emacs edits.
# Could just ignore these but it probably means I intended
# to save something and forgot.
if '/.#' in fsrc:
print(f'{CLRRED}'
f'ERROR: Found an unsaved emacs file: "{fsrc}"'
f'{CLREND}')
sys.exit(255)
def _check_headers(header_files: Sequence[str], fixable_header_errors: Dict,
fix: bool) -> None:
for header_file_raw in header_files:
assert header_file_raw[0] == '/'
header_file = 'src/ballistica' + header_file_raw
# If its a header-file, lets make sure its define guard is correct.
if header_file.endswith('.h'):
guard = (
header_file[4:].upper().replace('/', '_').replace('.', '_') +
'_')
with open(header_file) as fhdr:
lines = fhdr.read().splitlines()
expected_lines = [(0, '// Copyright 2019 Eric Froemling'),
(2, '#ifndef ' + guard), (3, '#define ' + guard),
(-1, '#endif // ' + guard)]
errors_found = False
can_fix = True
for line, expected in expected_lines:
if lines[line] != expected:
errors_found = True
print("Incorrect line " + str(line) + " in " +
header_file + ":\n"
"Expected: " + expected + "\n"
"Found: " + lines[line])
# If the beginning of the line differs,
# don't attempt auto-fix.
if lines[line][:16] != expected[:16]:
can_fix = False
if errors_found:
if can_fix:
fixable_header_errors.setdefault(header_file, [])\
.append((line, expected))
else:
print(CLRRED + "Error found in '" + header_file +
"'. Not auto-fixable; please correct manually." +
CLREND)
sys.exit(255)
if fixable_header_errors and not fix:
print(CLRRED +
'Fixable header error(s) found; pass --fix to correct.' + CLREND)
sys.exit(255)
def _update_cmake_file(fname: str, src_files: List[str],
header_files: List[str],
files_to_write: Dict[str, str]) -> None:
with open(fname) as infile:
lines = infile.read().splitlines()
auto_start = lines.index(' #AUTOGENERATED_BEGIN (this section'
' is managed by the "update_project" tool)')
auto_end = lines.index(' #AUTOGENERATED_END')
our_lines = [
' ${BA_SRC_ROOT}/ballistica' + f
for f in sorted(src_files + header_files)
if not f.endswith('.mm') and not f.endswith('.m')
]
filtered = lines[:auto_start + 1] + our_lines + lines[auto_end:]
files_to_write[fname] = '\n'.join(filtered) + '\n'
def _update_visual_studio_project(fname: str, src_root: str,
src_files: List[str],
header_files: List[str],
files_to_write: Dict[str, str]) -> None:
# pylint: disable=too-many-locals
with open(fname) as infile:
lines = infile.read().splitlines()
# Hmm can we include headers in the project for easy access?
# Seems VS attempts to compile them if we do so here.
# all_files = sorted(src_files + header_files)
# del header_files # Unused.
all_files = sorted([
f for f in (src_files + header_files) if not f.endswith('.m')
and not f.endswith('.mm') and not f.endswith('.c')
])
# Find the ItemGroup containing stdafx.cpp. This is where we'll dump
# our stuff.
index = lines.index(' <ClCompile Include="stdafx.cpp">')
begin_index = end_index = index
while lines[begin_index] != ' <ItemGroup>':
begin_index -= 1
while lines[end_index] != ' </ItemGroup>':
end_index += 1
group_lines = lines[begin_index + 1:end_index]
# Strip out any existing files from src/ballistica.
group_lines = [
l for l in group_lines if src_root + '\\ballistica\\' not in l
]
# Now add in our own.
# Note: we can't use C files in this build at the moment; breaks
# precompiled header stuff. (shouldn't be a problem though).
group_lines = [
' <' +
('ClInclude' if src.endswith('.h') else 'ClCompile') + ' Include="' +
src_root + '\\ballistica' + src.replace('/', '\\') + '" />'
for src in all_files
] + group_lines
filtered = lines[:begin_index + 1] + group_lines + lines[end_index:]
files_to_write[fname] = '\r\n'.join(filtered) + '\r\n'
filterpaths: Set[str] = set()
filterlines: List[str] = [
'<?xml version="1.0" encoding="utf-8"?>',
'<Project ToolsVersion="4.0"'
' xmlns="http://schemas.microsoft.com/developer/msbuild/2003">',
' <ItemGroup>',
]
sourcelines = [l for l in filtered if 'Include="' + src_root in l]
for line in sourcelines:
entrytype = line.strip().split()[0][1:]
path = line.split('"')[1]
filterlines.append(' <' + entrytype + ' Include="' + path + '">')
# If we have a dir foo/bar/eep we need to create filters for
# each of foo, foo/bar, and foo/bar/eep
splits = path[len(src_root):].split('\\')
splits = [s for s in splits if s != '']
splits = splits[:-1]
for i in range(len(splits)):
filterpaths.add('\\'.join(splits[:(i + 1)]))
filterlines.append(' <Filter>' + '\\'.join(splits) + '</Filter>')
filterlines.append(' </' + entrytype + '>')
filterlines += [
' </ItemGroup>',
' <ItemGroup>',
]
for filterpath in sorted(filterpaths):
filterlines.append(' <Filter Include="' + filterpath + '" />')
filterlines += [
' </ItemGroup>',
'</Project>',
]
files_to_write[fname + '.filters'] = '\r\n'.join(filterlines) + '\r\n'
def main() -> None:
"""Main script entry point."""
# pylint: disable=too-many-locals
# pylint: disable=too-many-branches
# pylint: disable=too-many-statements
# Make sure we're operating from dist root.
os.chdir(os.path.join(os.path.dirname(sys.argv[0]), '..'))
check = ('--check' in sys.argv)
fix = ('--fix' in sys.argv)
checkarg = ' --check' if check else ''
# Update our python enums module.
# Should do this before updating asset deps since this is an asset.
if os.path.exists('tools/update_puthon_enums_module'):
if os.system('tools/update_python_enums_module' + checkarg) != 0:
print(CLRRED + 'Error checking/updating python enums module' +
CLREND)
sys.exit(255)
# Update our resources Makefile.
if os.path.exists('tools/update_resources_makefile'):
if os.system('tools/update_resources_makefile' + checkarg) != 0:
print(CLRRED + 'Error checking/updating resources Makefile' +
CLREND)
sys.exit(255)
# Update our generated-code Makefile.
if os.path.exists('tools/update_generated_code_makefile'):
if os.system('tools/update_generated_code_makefile' + checkarg) != 0:
print(CLRRED + 'Error checking/updating generated-code Makefile' +
CLREND)
sys.exit(255)
# Update our assets Makefile.
if os.path.exists('tools/update_assets_makefile'):
if os.system('tools/update_assets_makefile' + checkarg) != 0:
print(CLRRED + 'Error checking/updating assets Makefile' + CLREND)
sys.exit(255)
# Make sure all module dirs in python scripts contain an __init__.py
scripts_dir = 'assets/src/data/scripts'
for root, _dirs, files in os.walk(scripts_dir):
if (root != scripts_dir and '__pycache__' not in root
and os.path.basename(root) != '.vscode'):
if '__init__.py' not in files:
print(CLRRED + 'Error: no __init__.py in package dir: ' +
root + CLREND)
sys.exit(255)
# Make sure none of our sync targets have been mucked with since
# their last sync.
if os.system('tools/snippets sync check') != 0:
print(CLRRED + 'Sync check failed; you may need to run "sync".' +
CLREND)
sys.exit(255)
# Now go through and update our various build files
# (MSVC, CMake, Android NDK, etc) as well as sanity-testing/fixing
# various other files such as headers while we're at it.
files_to_write: Dict[str, str] = {}
# Grab sources/headers.
src_files, header_files = _find_files('src/ballistica')
# Run some checks on them.
_check_files(src_files)
fixable_header_errors: Dict[str, List[Tuple[int, str]]] = {}
_check_headers(header_files, fixable_header_errors, fix)
# Now update various builds.
# CMake
fname = 'ballisticacore-cmake/CMakeLists.txt'
if os.path.exists(fname):
_update_cmake_file(
fname,
src_files,
header_files,
files_to_write,
)
fname = 'ballisticacore-android/BallisticaCore/src/main/cpp/CMakeLists.txt'
if os.path.exists(fname):
_update_cmake_file(
fname,
src_files,
header_files,
files_to_write,
)
# Visual Studio
fname = 'ballisticacore-windows/BallisticaCore/BallisticaCore.vcxproj'
if os.path.exists(fname):
_update_visual_studio_project(
fname,
'..\\..\\src',
src_files,
header_files,
files_to_write,
)
fname = ('ballisticacore-windows/BallisticaCoreHeadless/'
'BallisticaCoreHeadless.vcxproj')
if os.path.exists(fname):
_update_visual_studio_project(
fname,
'..\\..\\src',
src_files,
header_files,
files_to_write,
)
fname = ('ballisticacore-windows/BallisticaCoreOculus'
'/BallisticaCoreOculus.vcxproj')
if os.path.exists(fname):
_update_visual_studio_project(
fname,
'..\\..\\src',
src_files,
header_files,
files_to_write,
)
# If we're all good to here, do the actual writes.
# First, write any header fixes.
if fixable_header_errors:
for filename, fixes in fixable_header_errors.items():
with open(filename, 'r') as infile:
lines = infile.read().splitlines()
for fix_line, fix_str in fixes:
lines[fix_line] = fix_str
with open(filename, 'w') as outfile:
outfile.write('\n'.join(lines) + '\n')
print(CLRBLU + 'Writing header: ' + filename + CLREND)
else:
print(f'All {len(header_files)} headers up to date.')
# Now write out any project files that have changed
# (or error if we're in check mode).
unchanged_project_count = 0
for fname, fcode in files_to_write.items():
f_orig: Optional[str]
if os.path.exists(fname):
with open(fname, 'r') as infile:
f_orig = infile.read()
else:
f_orig = None
if f_orig == fcode.replace('\r\n', '\n'):
unchanged_project_count += 1
else:
if check:
print(f'{CLRRED}ERROR: found out-of-date'
f' project file: {fname}{CLREND}')
sys.exit(255)
print(f'{CLRBLU}Writing project file: {fname}{CLREND}')
with open(fname, 'w') as outfile:
outfile.write(fcode)
if unchanged_project_count > 0:
print(f'All {unchanged_project_count} project files up to date.')
# Update our local compile-commands file based on any changes to
# our cmake stuff. Do this at end so cmake changes already happened.
if not check and os.path.exists('ballisticacore-cmake'):
if os.system('make .irony/compile_commands.json') != 0:
print(CLRRED + 'Error updating compile-commands.' + CLREND)
sys.exit(255)
# Lastly update our dummy _ba module.
# We need to do this very last because it may run the cmake build
# so its success may depend on the cmake build files having already
# been updated.
if os.path.exists('tools/gendummymodule.py'):
if os.system('tools/gendummymodule.py' + checkarg) != 0:
print(CLRRED + 'Error checking/updating dummy module' + CLREND)
sys.exit(255)
if check:
print('Check-Builds: Everything up to date.')
else:
print('Update-Builds: SUCCESS!')
if __name__ == '__main__':
main()