Add common CLI Args parser for the samples (#8819)

This commit is contained in:
Juan Caldas
2025-06-05 14:18:41 -04:00
committed by GitHub
parent 7dc0f2cc86
commit ad8c9ce4e0
33 changed files with 342 additions and 274 deletions

View File

@@ -7,3 +7,5 @@ We are chaning the way Vulkan buffers are handled. We need to switch over to a m
appropriate header in [RELEASE_NOTES.md](./RELEASE_NOTES.md).
## Release notes for next branch cut
- samples: samples now have a CLI to select backend api

View File

@@ -216,6 +216,21 @@ endif()
target_sources(gltf-demo-resources PRIVATE ${RESGEN_SOURCE})
# ==================================================================================================
# Common Sample Utilities
# ==================================================================================================
add_library(samples-common STATIC
common/arguments.cpp
)
target_include_directories(samples-common PRIVATE
${ROOT_DIR}/third_party/getopt/include
)
target_link_libraries(samples-common filament)
set_target_properties(samples-common PROPERTIES FOLDER Samples/Common)
# ==================================================================================================
# Compiler flags
# ==================================================================================================
@@ -234,7 +249,7 @@ endif()
function(add_demo NAME)
include_directories(${GENERATION_ROOT})
add_executable(${NAME} ${NAME}.cpp)
target_link_libraries(${NAME} PRIVATE sample-resources filamentapp)
target_link_libraries(${NAME} PRIVATE sample-resources filamentapp samples-common)
target_compile_options(${NAME} PRIVATE ${COMPILER_FLAGS})
set_target_properties(${NAME} PROPERTIES FOLDER Samples)

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filament/Camera.h>
#include <filament/Engine.h>
#include <filament/IndexBuffer.h>
@@ -65,6 +67,7 @@ static constexpr uint16_t TRIANGLE_INDICES[3] = { 0, 1, 2 };
int main(int argc, char** argv) {
Config config;
config.title = "animation";
config.backend = samples::parseArgumentsForBackend(argc, argv);
App app;
auto setup = [&app](Engine* engine, View* view, Scene* scene) {

View File

@@ -0,0 +1,97 @@
/*
* 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.
*/
#include <filament/Engine.h>
#include <utils/Path.h>
#include <getopt/getopt.h>
#include <iostream>
#include <string>
namespace samples {
std::string getBackendAPIArgumentsUsage() {
return " --api, -a\n"
" Specify the backend API: opengl, vulkan, metal, or webgpu\n\n";
}
static void printUsage(char* name) {
std::string exec_name(utils::Path(name).getName());
std::string usage("EXEC_NAME\n"
"Usage:\n"
" EXEC_NAME [options]\n"
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
"API_USAGE");
const std::string from("EXEC_NAME");
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos;
pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
filament::Engine::Backend parseArgumentsForBackend(const std::string& backend) {
if (backend == "metal") {
return filament::Engine::Backend::METAL;
} else if (backend == "opengl") {
return filament::Engine::Backend::OPENGL;
} else if (backend == "vulkan") {
return filament::Engine::Backend::VULKAN;
} else if (backend == "webgpu") {
return filament::Engine::Backend::WEBGPU;
} else {
std::cerr << "Unrecognized target API. Must be 'opengl'|'vulkan'|'metal'|'webgpu'."
<< std::endl;
exit(1);
}
}
filament::Engine::Backend parseArgumentsForBackend(int argc, char* argv[]) {
// The first colon in OPTSTR turns on silent error reporting. This is important, as the
// arguments may also contain gtest parameters we don't know about.
static constexpr const char* OPTSTR = "ha:";
static const struct option OPTIONS[] = {
{ "help", no_argument, nullptr, 'h' },
{ "api", required_argument, nullptr, 'a' },
{ nullptr, 0, nullptr, 0 }
};
int opt;
int optionIndex = 0;
while ((opt = getopt_long(argc, argv, OPTSTR, OPTIONS, &optionIndex)) >= 0) {
std::string arg(optarg ? optarg : "");
switch (opt) {
default:
case 'h':
printUsage(argv[0]);
exit(0);
case 'a':
return parseArgumentsForBackend(arg);
}
}
// if no args were provided return DEFAULT
return filament::Engine::Backend::DEFAULT;
}
} // namespace samples

View File

@@ -0,0 +1,29 @@
/*
* 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.
*/
#ifndef TNT_SAMPLES_ARGUMENTS_H
#define TNT_SAMPLES_ARGUMENTS_H
#include <filament/Engine.h>
#include <string>
namespace samples {
filament::Engine::Backend parseArgumentsForBackend(int argc, char* argv[]);
filament::Engine::Backend parseArgumentsForBackend(const std::string& backend);
std::string getBackendAPIArgumentsUsage();
}
#endif //TNT_SAMPLES_ARGUMENTS_H

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filament/Camera.h>
#include <filament/Engine.h>
#include <filament/IndexBuffer.h>
@@ -69,6 +71,7 @@ static constexpr uint16_t TRIANGLE_INDICES[3] = { 0, 1, 2 };
int main(int argc, char** argv) {
Config config;
config.title = "depthtesting";
config.backend = samples::parseArgumentsForBackend(argc, argv);
App app;
auto setup = [&app](Engine* engine, View* view, Scene* scene) {

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <atomic>
#include <fstream>
#include <iomanip>
@@ -111,8 +113,7 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: opengl (default) or vulkan\n\n"
"API_USAGE"
" --ibl=<path to cmgen IBL>, -i <path>\n"
" Applies an IBL generated by cmgen's deploy option\n\n"
" --scale=[number], -s [number]\n"
@@ -137,6 +138,10 @@ static void printUsage(char* name) {
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -166,13 +171,7 @@ static int handleCommandLineArgments(int argc, char* argv[], Config* config) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
config->backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
config->backend = Engine::Backend::VULKAN;
} else {
std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'." << std::endl;
}
config->backend = samples::parseArgumentsForBackend(arg);
break;
case 'i':
config->iblDirectory = arg;

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filamentapp/Config.h>
#include <filamentapp/FilamentApp.h>
#include <filamentapp/IBL.h>
@@ -85,8 +87,7 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: opengl (default), vulkan, or metal\n\n"
"API_USAGE"
" --ibl=<path to cmgen IBL>, -i <path>\n"
" Override the built-in IBL\n\n"
" --num=<number of initial instances>, -n <num>\n"
@@ -100,6 +101,10 @@ static void printUsage(char* name) {
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -124,15 +129,7 @@ static int handleCommandLineArguments(int argc, char* argv[], App* app) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
app->config.backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
app->config.backend = Engine::Backend::VULKAN;
} else if (arg == "metal") {
app->config.backend = Engine::Backend::METAL;
} else {
std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'.\n";
}
app->config.backend = samples::parseArgumentsForBackend(arg);
break;
case 'm':
app->instanceToAnimate = atoi(arg.c_str());

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filamentapp/Config.h>
#include <filamentapp/FilamentApp.h>
#include <filamentapp/IBL.h>
@@ -155,19 +157,7 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: "
// Matches logic in filament/backend/src/PlatformFactory.cpp for Backend::DEFAULT
#if defined(FILAMENT_IOS) || defined(__APPLE__)
"opengl, vulkan, or metal (default)"
#elif defined(FILAMENT_DRIVER_SUPPORTS_VULKAN)
"opengl, vulkan (default), or metal"
#else
"opengl (default), vulkan, or metal"
#endif
"\n\n"
"API_USAGE"
" --feature-level=<1|2|3>, -f <1|2|3>\n"
" Specify the feature level to use. The default is the highest supported feature level.\n\n"
" --batch=<path to JSON file or 'default'>, -b\n"
@@ -211,6 +201,10 @@ static void printUsage(char* name) {
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -249,15 +243,7 @@ static int handleCommandLineArguments(int argc, char* argv[], App* app) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
app->config.backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
app->config.backend = Engine::Backend::VULKAN;
} else if (arg == "metal") {
app->config.backend = Engine::Backend::METAL;
} else {
std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'.\n";
}
app->config.backend = samples::parseArgumentsForBackend(arg);
break;
case 'f':
if (arg == "1") {

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filament/Engine.h>
#include <filament/IndexBuffer.h>
#include <filament/LightManager.h>
@@ -106,13 +108,16 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: opengl (default), vulkan, or metal\n\n"
"API_USAGE"
);
const std::string from("HEIGHTFIELD");
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -133,16 +138,7 @@ static int handleCommandLineArgments(int argc, char* argv[], Config* config) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
config->backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
config->backend = Engine::Backend::VULKAN;
} else if (arg == "metal") {
config->backend = Engine::Backend::METAL;
} else {
std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'."
<< std::endl;
}
config->backend = samples::parseArgumentsForBackend(arg);
break;
}
}

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filament/Camera.h>
#include <filament/Engine.h>
#include <filament/IndexBuffer.h>
@@ -96,13 +98,16 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: opengl (default), vulkan, or metal\n\n"
"API_USAGE"
);
const std::string from("SAMPLE");
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -123,16 +128,7 @@ static int handleCommandLineArgments(int argc, char* argv[], Config* config) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
config->backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
config->backend = Engine::Backend::VULKAN;
} else if (arg == "metal") {
config->backend = Engine::Backend::METAL;
} else {
std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'."
<< std::endl;
}
config->backend = samples::parseArgumentsForBackend(arg);
break;
}
}

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filament/Engine.h>
#include <filament/LightManager.h>
#include <filament/Material.h>
@@ -63,14 +65,16 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: opengl, vulkan, metal, or webgpu\n"
" NOTE that webgpu is not yet functional (it is in development).\n"
"API_USAGE"
);
const std::string from("EXEC");
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -91,19 +95,7 @@ static int handleCommandLineArguments(int argc, char* argv[], App* app) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
app->config.backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
app->config.backend = Engine::Backend::VULKAN;
} else if (arg == "metal") {
app->config.backend = Engine::Backend::METAL;
} else if (arg == "webgpu") {
app->config.backend = Engine::Backend::WEBGPU;
} else {
std::cerr << "Unrecognized backend. Must be "
"'opengl'|'vulkan'|'metal'|'webgpu'.\n";
exit(1);
}
app->config.backend = samples::parseArgumentsForBackend(arg);
break;
}
}

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filament/Camera.h>
#include <filament/Engine.h>
#include <filament/IndexBuffer.h>
@@ -72,13 +74,16 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: opengl (default), vulkan, or metal\n\n"
"API_USAGE"
);
const std::string from("SAMPLE");
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -99,16 +104,7 @@ static int handleCommandLineArgments(int argc, char* argv[], Config* config) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
config->backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
config->backend = Engine::Backend::VULKAN;
} else if (arg == "metal") {
config->backend = Engine::Backend::METAL;
} else {
std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'."
<< std::endl;
}
config->backend = samples::parseArgumentsForBackend(arg);
break;
}
}

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filament/Camera.h>
#include <filament/Engine.h>
#include <filament/IndexBuffer.h>
@@ -99,13 +101,16 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: opengl (default), vulkan, or metal\n\n"
"API_USAGE"
);
const std::string from("SAMPLE");
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -126,16 +131,7 @@ static int handleCommandLineArgments(int argc, char* argv[], Config* config) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
config->backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
config->backend = Engine::Backend::VULKAN;
} else if (arg == "metal") {
config->backend = Engine::Backend::METAL;
} else {
std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'."
<< std::endl;
}
config->backend = samples::parseArgumentsForBackend(arg);
break;
}
}

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filament/Camera.h>
#include <filament/Engine.h>
#include <filament/IndexBuffer.h>
@@ -91,13 +93,16 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: opengl (default), vulkan, or metal\n\n"
"API_USAGE"
);
const std::string from("SAMPLE");
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -118,16 +123,7 @@ static int handleCommandLineArgments(int argc, char* argv[], Config* config) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
config->backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
config->backend = Engine::Backend::VULKAN;
} else if (arg == "metal") {
config->backend = Engine::Backend::METAL;
} else {
std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'."
<< std::endl;
}
config->backend = samples::parseArgumentsForBackend(arg);
break;
}
}

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filament/Camera.h>
#include <filament/Engine.h>
#include <filament/IndexBuffer.h>
@@ -86,8 +88,7 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: opengl (default), vulkan, or metal\n"
"API_USAGE"
" --eyes=<stereoscopic eyes>, -y <stereoscopic eyes>\n"
" Sets the number of stereoscopic eyes (default: 2) when stereoscopic rendering is\n"
" enabled.\n"
@@ -98,6 +99,10 @@ static void printUsage(char* name) {
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -120,16 +125,7 @@ static int handleCommandLineArguments(int argc, char* argv[], App* app) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
app->config.backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
app->config.backend = Engine::Backend::VULKAN;
} else if (arg == "metal") {
app->config.backend = Engine::Backend::METAL;
} else {
std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'.\n";
exit(1);
}
app->config.backend = samples::parseArgumentsForBackend(arg);
break;
case 'y': {
int eyeCount = 0;

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filament/Camera.h>
#include <filament/Engine.h>
#include <filament/IndexBuffer.h>
@@ -77,13 +79,16 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: opengl, vulkan, metal, or webgpu\n"
"API_USAGE"
);
const std::string from("HELLOTRIANGLE");
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -104,19 +109,7 @@ static int handleCommandLineArguments(int argc, char* argv[], App* app) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
app->config.backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
app->config.backend = Engine::Backend::VULKAN;
} else if (arg == "metal") {
app->config.backend = Engine::Backend::METAL;
} else if (arg == "webgpu") {
app->config.backend = Engine::Backend::WEBGPU;
} else {
std::cerr << "Unrecognized backend. Must be "
"'opengl'|'vulkan'|'metal'|'webgpu'.\n";
exit(1);
}
app->config.backend = samples::parseArgumentsForBackend(arg);
break;
}
}

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filamentapp/Config.h>
#include <filamentapp/FilamentApp.h>
@@ -94,8 +96,7 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: opengl (default), vulkan, or metal\n\n"
"API_USAGE"
" --camera=<camera mode>, -c <camera mode>\n"
" Set the camera mode: orbit (default) or flight\n"
" Flight mode uses the following controls:\n"
@@ -109,6 +110,10 @@ static void printUsage(char* name) {
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -130,15 +135,7 @@ static int handleCommandLineArguments(int argc, char* argv[], App* app) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
app->config.backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
app->config.backend = Engine::Backend::VULKAN;
} else if (arg == "metal") {
app->config.backend = Engine::Backend::METAL;
} else {
std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'.\n";
}
app->config.backend = samples::parseArgumentsForBackend(arg);
break;
case 'c':
if (arg == "flight") {

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <iostream>
#include <string>
#include <map>
@@ -80,8 +82,7 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: opengl (default), vulkan, or metal\n\n"
"API_USAGE"
" --ibl=<path>, -i <path>\n"
" Applies an IBL\n\n"
" path can either be a directory containing IBL data files generated by cmgen,\n"
@@ -101,6 +102,10 @@ static void printUsage(char* name) {
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -128,15 +133,7 @@ static int handleCommandLineArgments(int argc, char* argv[], Config* config) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
config->backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
config->backend = Engine::Backend::VULKAN;
} else if (arg == "metal") {
config->backend = Engine::Backend::METAL;
} else {
std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'." << std::endl;
}
config->backend = samples::parseArgumentsForBackend(arg);
break;
case 'i':
config->iblDirectory = arg;

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <iostream>
#include <string>
#include <map>
@@ -88,8 +90,7 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: opengl (default), vulkan, or metal\n\n"
"API_USAGE"
" --ibl=<path>, -i <path>\n"
" Applies an IBL\n\n"
" path can either be a directory containing IBL data files generated by cmgen,\n"
@@ -117,6 +118,10 @@ static void printUsage(char* name) {
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -144,15 +149,7 @@ static int handleCommandLineArgments(int argc, char* argv[], Config* config) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
config->backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
config->backend = Engine::Backend::VULKAN;
} else if (arg == "metal") {
config->backend = Engine::Backend::METAL;
} else {
std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'." << std::endl;
}
config->backend = samples::parseArgumentsForBackend(arg);
break;
case 'c':
if (arg == "flight") {

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <SDL.h>
#include <filament/Camera.h>
@@ -45,7 +47,7 @@
using namespace filament;
namespace {
static constexpr Engine::Backend kBackend = Engine::Backend::OPENGL;
Engine::Backend kBackend = Engine::Backend::NOOP;
static constexpr int kWidth = 640;
static constexpr int kHeight = 480;
static constexpr double kFieldOfViewDeg = 60.0;
@@ -94,6 +96,7 @@ int main(int argc, char *argv[]) {
// ---- initialize ----
FILAMENT_CHECK_POSTCONDITION(SDL_Init(SDL_INIT_EVENTS) == 0) << "SDL_Init Failure";
kBackend = samples::parseArgumentsForBackend(argc, argv);
std::vector<Window> windows = { Window(), Window() };
uint32_t windowFlags = SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI
| SDL_WINDOW_RESIZABLE;

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filament/Camera.h>
#include <filament/Engine.h>
#include <filament/IndexBuffer.h>
@@ -189,6 +191,7 @@ void animate(App& app, Engine* engine, View* view, double now) {
int main(int argc, char** argv) {
Config config;
config.title = "point_sprites";
config.backend = samples::parseArgumentsForBackend(argc, argv);
App app;
FilamentApp::get().animate([&app](Engine* e, View* v, double now) { animate(app, e, v, now); });

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filament/Camera.h>
#include <filament/Engine.h>
#include <filament/IndexBuffer.h>
@@ -130,8 +132,7 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: opengl (default), vulkan, or metal\n"
"API_USAGE"
" --mode, -m\n"
" Specify the reflection mode: camera (default), or renderables\n\n"
);
@@ -139,6 +140,10 @@ static void printUsage(char* name) {
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -160,16 +165,7 @@ static int handleCommandLineArguments(int argc, char* argv[], App* app) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
app->config.backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
app->config.backend = Engine::Backend::VULKAN;
} else if (arg == "metal") {
app->config.backend = Engine::Backend::METAL;
} else {
std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'.\n";
exit(1);
}
app->config.backend = samples::parseArgumentsForBackend(arg);
break;
case 'm':
if (arg == "camera") {

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <iostream>
#include <string>
#include <map>
@@ -72,8 +74,7 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: opengl (default), vulkan, or metal\n\n"
"API_USAGE"
" --ibl=<path to cmgen IBL>, -i <path>\n"
" Applies an IBL generated by cmgen's deploy option\n\n"
" --split-view, -v\n"
@@ -85,6 +86,10 @@ static void printUsage(char* name) {
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -108,15 +113,7 @@ static int handleCommandLineArgments(int argc, char* argv[], Config* config) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
config->backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
config->backend = Engine::Backend::VULKAN;
} else if (arg == "metal") {
config->backend = Engine::Backend::METAL;
} else {
std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'." << std::endl;
}
config->backend = samples::parseArgumentsForBackend(arg);
break;
case 'i':
config->iblDirectory = arg;

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filamentapp/Config.h>
#include <filamentapp/FilamentApp.h>
#include <filamentapp/MeshAssimp.h>
@@ -102,8 +104,7 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: opengl (default), vulkan, or metal\n\n"
"API_USAGE"
" --ibl=<path to cmgen IBL>, -i <path>\n"
" Applies an IBL generated by cmgen's deploy option\n\n"
" --split-view, -v\n"
@@ -130,6 +131,10 @@ static void printUsage(char* name) {
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -156,15 +161,7 @@ static int handleCommandLineArgments(int argc, char* argv[], Config* config) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
config->backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
config->backend = Engine::Backend::VULKAN;
} else if (arg == "metal") {
config->backend = Engine::Backend::METAL;
} else {
std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'." << std::endl;
}
config->backend = samples::parseArgumentsForBackend(arg);
break;
case 'i':
config->iblDirectory = arg;

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <iostream>
#include <string>
#include <map>
@@ -78,8 +80,7 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: opengl (default), vulkan, or metal\n\n"
"API_USAGE"
" --ibl=<path to cmgen IBL>, -i <path>\n"
" Applies an IBL generated by cmgen's deploy option\n\n"
" --split-view, -v\n"
@@ -97,6 +98,10 @@ static void printUsage(char* name) {
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -123,15 +128,7 @@ static int handleCommandLineArgments(int argc, char* argv[], Config* config) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
config->backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
config->backend = Engine::Backend::VULKAN;
} else if (arg == "metal") {
config->backend = Engine::Backend::METAL;
} else {
std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'." << std::endl;
}
config->backend = samples::parseArgumentsForBackend(arg);
break;
case 'i':
config->iblDirectory = arg;

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filament/Engine.h>
#include <filament/IndexBuffer.h>
#include <filament/LightManager.h>
@@ -70,6 +72,7 @@ static const Config config {
int main(int argc, char** argv) {
App app;
config.backend = samples::parseArgumentsForBackend(argc, argv);
auto setup = [&app](Engine* engine, View* view, Scene* scene) {
auto& tcm = engine->getTransformManager();

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filament/Camera.h>
#include <filament/Engine.h>
#include <filament/IndexBuffer.h>
@@ -143,13 +145,16 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: opengl (default), vulkan, or metal\n\n"
"API_USAGE"
);
const std::string from("SAMPLE");
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -170,16 +175,7 @@ static int handleCommandLineArgments(int argc, char* argv[], Config* config) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
config->backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
config->backend = Engine::Backend::VULKAN;
} else if (arg == "metal") {
config->backend = Engine::Backend::METAL;
} else {
std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'."
<< std::endl;
}
config->backend = samples::parseArgumentsForBackend(arg);
break;
}
}

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filament/Engine.h>
#include <filament/View.h>
#include <filament/Scene.h>
@@ -29,6 +31,7 @@ using namespace filament;
int main(int argc, char** argv) {
Config config;
config.title = "strobecolor";
config.backend = samples::parseArgumentsForBackend(argc, argv);
Skybox* skybox;
auto setup = [&skybox](Engine* engine, View* view, Scene* scene) {

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filament/Engine.h>
#include <filament/IndirectLight.h>
#include <filament/LightManager.h>
@@ -73,13 +75,16 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: opengl (default), vulkan, or metal\n"
"API_USAGE"
);
const std::string from("SHOWCASE");
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -100,15 +105,7 @@ static int handleCommandLineArguments(int argc, char* argv[], Config* config) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
config->backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
config->backend = Engine::Backend::VULKAN;
} else if (arg == "metal") {
config->backend = Engine::Backend::METAL;
} else {
std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'.\n";
}
config->backend = samples::parseArgumentsForBackend(arg);
break;
}
}

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filament/Camera.h>
#include <filament/Engine.h>
#include <filament/IndexBuffer.h>
@@ -87,12 +89,15 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: opengl, vulkan, metal, or webgpu\n");
"API_USAGE");
const std::string from("TEXTUREDQUAD");
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -113,19 +118,7 @@ static int handleCommandLineArguments(int argc, char* argv[], Config& config) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
config.backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
config.backend = Engine::Backend::VULKAN;
} else if (arg == "metal") {
config.backend = Engine::Backend::METAL;
} else if (arg == "webgpu") {
config.backend = Engine::Backend::WEBGPU;
} else {
std::cerr << "Unrecognized backend. Must be "
"'opengl'|'vulkan'|'metal'|'webgpu'.\n";
exit(1);
}
config.backend = samples::parseArgumentsForBackend(arg);
break;
}
}

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filament/IndexBuffer.h>
#include <filament/Material.h>
#include <filament/RenderableManager.h>
@@ -45,6 +47,7 @@ static constexpr uint16_t TRIANGLE_INDICES[] { 0, 1, 2 };
int main(int argc, char** argv) {
Config config;
config.title = "vbotest";
config.backend = samples::parseArgumentsForBackend(argc, argv);
// Aggregate positions and colors into a single buffer without interleaving.
std::vector<uint8_t> vbo(sizeof(POSITIONS) + sizeof(COLORS));

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "common/arguments.h"
#include <filament/IndexBuffer.h>
#include <filament/RenderableManager.h>
#include <filament/Scene.h>
@@ -55,13 +57,16 @@ static void printUsage(char* name) {
"Options:\n"
" --help, -h\n"
" Prints this message\n\n"
" --api, -a\n"
" Specify the backend API: opengl (default), vulkan, or metal\n\n"
"API_USAGE"
);
const std::string from("SHOWCASE");
for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) {
usage.replace(pos, from.length(), exec_name);
}
const std::string apiUsage("API_USAGE");
for (size_t pos = usage.find(apiUsage); pos != std::string::npos; pos = usage.find(apiUsage, pos)) {
usage.replace(pos, apiUsage.length(), samples::getBackendAPIArgumentsUsage());
}
std::cout << usage;
}
@@ -82,15 +87,7 @@ static int handleCommandLineArguments(int argc, char* argv[], App* app) {
printUsage(argv[0]);
exit(0);
case 'a':
if (arg == "opengl") {
app->config.backend = Engine::Backend::OPENGL;
} else if (arg == "vulkan") {
app->config.backend = Engine::Backend::VULKAN;
} else if (arg == "metal") {
app->config.backend = Engine::Backend::METAL;
} else {
std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'.\n";
}
app->config.backend = samples::parseArgumentsForBackend(arg);
break;
}
}