Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
name: Build openFrameworks 0.12.1

on:
push:
branches: [master]
pull_request:
workflow_dispatch:

permissions:
contents: read

concurrency:
group: openframeworks-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
macos:
name: macOS
runs-on: macos-14
timeout-minutes: 45

env:
OF_URL: https://github.com/openframeworks/openFrameworks/releases/download/0.12.1/of_v0.12.1_osx_release.tar.gz
OF_SHA256: e4a2dd6e75805320aac905f9f82f7b85e67a8b799137d47f35d40f7c4c195c9b

steps:
- name: Check out repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Validate Xcode project structure
run: ./scripts/validate-xcode-projects.sh

- name: Cache openFrameworks 0.12.1
id: cache-openframeworks
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: ${{ runner.temp }}/of_v0.12.1_osx_release
key: openframeworks-0.12.1-macos-${{ runner.arch }}

- name: Download verified openFrameworks release
if: steps.cache-openframeworks.outputs.cache-hit != 'true'
shell: bash
run: |
OF_ARCHIVE="${RUNNER_TEMP}/of_v0.12.1_osx_release.tar.gz"
curl --fail --location --retry 3 --output "$OF_ARCHIVE" "$OF_URL"
echo "$OF_SHA256 $OF_ARCHIVE" | shasum --algorithm 256 --check
tar --extract --gzip --file "$OF_ARCHIVE" --directory "${RUNNER_TEMP}"

- name: Build all applications and run regression tests
run: ./scripts/build-all.sh "${RUNNER_TEMP}/of_v0.12.1_osx_release"
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
**/obj/
tests/**/bin/
.DS_Store
32 changes: 32 additions & 0 deletions CONTRIBUTORS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Contributors and attribution

This file complements, and does not replace, the repository's Git history and
the copyright and license notices in each project.

- **Daito Manabe** initiated the perfume-dev project and continues to steward
its repositories. For the Perfume “Global Site Project,” the Agency for
Cultural Affairs records his work in planning, direction, and programming.
- **Satoru Higa** created and maintained core parts of the original
openFrameworks examples and `ofxBvh`, as recorded in the 2012 commit history.
- **Atsushi Tadokoro** authored `motion-visualization` and `marching-cubes`.
His original README and MIT license notices are retained in both directories.
- **Perfume Dev Team** is the publication identity retained in the original
2012 commits and acknowledged in the first-party license files.
- **Morimasa Aketa** identified the end-of-motion out-of-range access and
proposed its correction in
[pull request #2](https://github.com/perfume-dev/example-openFrameworks/pull/2).
The maintained player includes that boundary fix and regression coverage.
- **Yung-Luen Lan** documented the historical data layout in
[pull request #1](https://github.com/perfume-dev/example-openFrameworks/pull/1).
The current setup guide carries that useful information forward for modern
openFrameworks without retaining obsolete Xcode instructions.
- **Rui Madeira** wrote the vendored `ofxMarchingCubes` implementation, which
**Greg Borenstein** adapted for openFrameworks. Their notices and LGPL terms
are retained with the source.

The official
[Agency for Cultural Affairs project record](https://www.bunka.go.jp/j-mediaarts-festival/award/single/perfume_global_site_project/index.html)
lists the broader creative and technical team behind the Perfume “Global Site
Project,” including MIKIKO, Yasutaka Nakata, Satoshi Horii, Hiroyasu Kimura,
2bit, Daisuke Nakahama, Kentaro Mito, Hiroyuki Hori, the planning organisations,
and the project's production and legal supporters.
26 changes: 26 additions & 0 deletions LICENSES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# License index

This repository contains separately licensed applications, an addon, and a
vendored dependency. This index is informational: it does not replace the
license text in each directory and does not relicense the repository as a
single combined work.

| Directory | License | Copyright notice |
| --- | --- | --- |
| `example-bvh` | [MIT](example-bvh/LICENSE) | Copyright (c) 2012 Daito Manabe; originally published under the Perfume Dev Team name |
| `example-sync-sound` | [MIT](example-sync-sound/LICENSE) | Copyright (c) 2012 Daito Manabe; originally published under the Perfume Dev Team name |
| `example-pen-graphics` | [MIT](example-pen-graphics/LICENSE) | Copyright (c) 2012 Daito Manabe; originally published under the Perfume Dev Team name |
| `particle-motion-example` | [MIT](particle-motion-example/LICENSE) | Copyright (c) 2012 Daito Manabe; originally published under the Perfume Dev Team name |
| `motion-visualization` | [MIT](motion-visualization/LICENSE) | Copyright (c) 2012 Atsushi Tadokoro |
| `marching-cubes` | [MIT](marching-cubes/LICENSE) | Copyright (c) 2012 Atsushi Tadokoro |
| `ofxBvh` | [MIT](ofxBvh/LICENSE) | Copyright (c) 2012 Daito Manabe; originally published under the Perfume Dev Team name |
| `scripts` | [MIT](scripts/LICENSE) | Copyright (c) 2026 Daito Manabe |
| `tests/ofxBvh-boundary` | [MIT](tests/ofxBvh-boundary/LICENSE) | Copyright (c) 2026 Daito Manabe |
| `third_party/ofxMarchingCubes` | [LGPL-2.1-or-later](third_party/ofxMarchingCubes/LICENSE.txt) | Copyright (c) 2009 Rui Madeira; adapted by Greg Borenstein |

Follow each linked `LICENSE` file for the complete MIT terms. The
vendored marching-cubes source retains notices in its source files and the
complete LGPL terms in
[`third_party/ofxMarchingCubes/LICENSE.txt`](third_party/ofxMarchingCubes/LICENSE.txt).
Files outside these component directories should not be assumed to inherit a
different component's license solely because they share this repository.
108 changes: 108 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
# Perfume Global Site — openFrameworks examples

[![Build openFrameworks 0.12.1](https://github.com/perfume-dev/example-openFrameworks/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/perfume-dev/example-openFrameworks/actions/workflows/build.yml)

This repository contains openFrameworks examples created around the 2012
Perfume “Global Site Project.” It is maintained for
[openFrameworks 0.12.1](https://openframeworks.cc/download/), the current
stable release. The original visual character and data formats are preserved
while the application lifecycle, APIs, project files, dependency handling, and
BVH playback safety have been updated.

## Stewardship

The [perfume-dev organization](https://github.com/perfume-dev) was founded by
Daito Manabe in 2012 and has remained under his stewardship since launch. He
continues to oversee maintenance of this repository with project collaborators.

Perfume is a Japanese artist group. Manabe's documented collaboration with
Perfume goes back to the
[2010 Tokyo Dome performance](https://daito.ws/archive/perfume_12345678910/),
which credits his programming. The later
[2020 “Time Warp” project](https://daito.ws/en/archive/perfume-imaginary-museum-time-warp-perfume-p-o-p-festival/)
credits him with creative and technical direction and sound-effect design.
Across multiple Perfume projects since 2010, his roles have included creative
direction, technical direction, programming, and sound-related design,
including sound-effect design. For the 2012 Global Site Project, the
[Agency for Cultural Affairs award record](https://www.bunka.go.jp/j-mediaarts-festival/award/single/perfume_global_site_project/index.html)
credits Manabe with planning, direction, and programming, and records the many
artists, choreographers, designers, programmers, engineers, producers, and
supporters who made the project possible.

This stewardship statement does not replace individual authorship. Historical
and third-party credits are preserved in [CONTRIBUTORS.md](CONTRIBUTORS.md),
the per-example README and LICENSE files, the Git history, and vendored source
notices.

## Included projects

| Directory | Purpose |
| --- | --- |
| `example-bvh` | Standalone BVH playback and three bundled sample motions |
| `example-sync-sound` | Synchronised BVH, audio, and motion-trail rendering |
| `example-pen-graphics` | Ribbon-like graphics generated from skeletal motion |
| `particle-motion-example` | Particle forces driven by tracked joints |
| `motion-visualization` | Long-exposure-style joint trajectories |
| `marching-cubes` | A metaball surface driven by skeletal endpoints |
| `ofxBvh` | The bundled BVH loader and player used by every example |

## Build with openFrameworks 0.12.1

Download the official
[openFrameworks 0.12.1 macOS release](https://github.com/openframeworks/openFrameworks/releases/tag/0.12.1),
then place this repository at the standard openFrameworks application depth:

```sh
export OF_ROOT=/absolute/path/to/of_v0.12.1_osx_release
git clone https://github.com/perfume-dev/example-openFrameworks.git \
"$OF_ROOT/apps/myApps/example-openFrameworks"
cd "$OF_ROOT/apps/myApps/example-openFrameworks"
./scripts/build-all.sh "$OF_ROOT"
```

The script builds all six applications in Release mode and runs the `ofxBvh`
boundary/malformed-input and marching-cubes lifecycle regression tests. An
individual application can be built with, for example:

```sh
make -C example-bvh Release OF_ROOT="$OF_ROOT"
open example-bvh/bin/example-bvh.app
```

The checked-in Xcode projects were regenerated from the openFrameworks 0.12.1
macOS template. They use relative paths and expect the repository layout shown
above. If you put the repository elsewhere, use the Makefiles with an explicit
`OF_ROOT`, or update the projects with the openFrameworks Project Generator.

## Motion and audio data

`example-bvh` is ready to run with its bundled `A_test.bvh`, `B_test.bvh`, and
`C_test.bvh` files. The other five applications first look for the historical
Perfume Global Site assets in each application's `bin/data` directory:

```text
bin/data/
├── Perfume_globalsite_sound.wav
└── bvhfiles/
├── aachan.bvh
├── kashiyuka.bvh
└── nocchi.bvh
```

Those original full assets are not duplicated in this repository. When they
are absent, the maintained examples fall back to the bundled A/B/C motion
samples and a silent internal clock, so every application can still be built
and explored from a clean checkout. Startup logs identify motion fallback, and
an on-screen notice identifies silent-clock mode.

## Dependencies and licenses

`ofxBvh` is kept in this repository and referenced as a local addon. The
historical `ofxMarchingCubes` source required by `marching-cubes` is vendored
with provenance and its LGPL-2.1-or-later notice under
[`third_party/ofxMarchingCubes`](third_party/ofxMarchingCubes/README.md).
Application and addon license terms remain in their respective directories;
the two examples by Atsushi Tadokoro retain their original copyright and MIT
license notices. See [LICENSES.md](LICENSES.md) for the component-by-component
license index; the repository does not apply one blanket license to every
directory.
4 changes: 3 additions & 1 deletion example-bvh/LICENSE
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
Copyright (c) 2012 Perfume Dev Team
Copyright (c) 2012 Daito Manabe

Originally published under the Perfume Dev Team name.

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
Expand Down
10 changes: 10 additions & 0 deletions example-bvh/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Attempt to load project-specific configuration.
ifneq ($(wildcard config.make),)
include config.make
endif

ifndef OF_ROOT
OF_ROOT=../../../..
endif

include $(OF_ROOT)/libs/openFrameworksCompiled/project/makefileCommon/compile.project.mk
85 changes: 82 additions & 3 deletions example-bvh/Project.xcconfig
Original file line number Diff line number Diff line change
@@ -1,9 +1,88 @@
//THE PATH TO THE ROOT OF OUR OF PATH RELATIVE TO THIS PROJECT.
//THIS NEEDS TO BE DEFINED BEFORE CoreOF.xcconfig IS INCLUDED
OF_PATH = ../../..
OF_PATH = ../../../..

//THIS HAS ALL THE HEADER AND LIBS FOR OF CORE
#include "../../../libs/openFrameworksCompiled/project/osx/CoreOF.xcconfig"
#include "../../../../libs/openFrameworksCompiled/project/osx/CoreOF.xcconfig"

OTHER_LDFLAGS = $(OF_CORE_LIBS)
//UNCOMMENT BELOW TO ENABLE C++ 17 and std::filesystem
CLANG_CXX_LANGUAGE_STANDARD = c++23
CLANG_C_LANGUAGE_STANDARD = c17
MACOSX_DEPLOYMENT_TARGET = 11.5

// App Settings
PRODUCT_NAME = $(TARGET_NAME)
PRODUCT_NAME[config=Debug] = $(TARGET_NAME)Debug
PRODUCT_BUNDLE_IDENTIFIER = cc.openFrameworks.${TARGET_NAME:rfc1034identifier}
//PRODUCT_BUNDLE_IDENTIFIER[config=Debug] = cc.openFrameworks.$(TARGET_NAME)Debug
DEVELOPMENT_LANGUAGE = English
CODE_SIGN_IDENTITY = -
INFOPLIST_FILE = openFrameworks-Info.plist
GENERATE_INFOPLIST_FILE = YES

// set application category to games, this is required to enable Game mode
// note: this sets the initial value in the Xcode UI
INFOPLIST_KEY_LSApplicationCategoryType = public.app-category.games

// VERSIONING - overridden if changed in Xcode UI

// this is "Version" in the Xcode target Identity UI
// suggested to use semantic versioning format ala #.#.#
MARKETING_VERSION = 0.1.0

// If users upgrade project to recommended settings it enables script sandboxing which breaks our post build script
ENABLE_USER_SCRIPT_SANDBOXING=NO

// this is "Build" in the Xcode target Identity UI, an incremental build number
// important for the App Store as new build submissions need a diff number even
// if MARKETING_VERSION is the same
CURRENT_PROJECT_VERSION = 1

// ICONS

// default oF app icon
ICON_NAME = of.icns
ICON_NAME[config=Debug] = of_debug.icns
ICON_FILE = $(OF_PATH)/libs/openFrameworksCompiled/project/osx/$(ICON_NAME)

// custom app icon, placed in main project folder
//ICON_NAME = MyApp.icns
//ICON_FILE = $(ICON_NAME)

// custom app icon with separate Release and Debug versions placed in bin/data
//ICON_NAME = icon.icns
//ICON_NAME[config=Debug] = icon-debug.icns
//ICON_FILE = bin/data/$(ICON_NAME)

// note: oF 0.7.2 - 0.11 used ICON_FILE_PATH which is no longer used in oF 0.12+
// ex. change ICON_FILE_PATH = bin/data/ -> ICON_FILE = bin/data/$(ICON_NAME) &
// in a custom openFrameworks-Info.plist, set CFBundleIconFile to ICON_NAME

//APPSTORE, uncomment next lines to bundle data folder and code sign
//OF_CODESIGN = 1
//OF_BUNDLE_DATA_FOLDER = 1
//OF_BUNDLE_DYLIBS = 1

HIGH_RESOLUTION_CAPABLE = NO

// Optional include to keep any permanent settings as CODE_SIGN_IDENTITY.
#include? "App.xcconfig"

//FOR AV ENGINE SOUND PLAYER UNCOMMENT THREE LINES BELOW
OF_NO_FMOD=1
USER_PREPROCESSOR_DEFINITIONS="OF_NO_FMOD=1"
LIB_FMOD=""
GCC_PREPROCESSOR_DEFINITIONS=$(inherited) $(USER_PREPROCESSOR_DEFINITIONS)

OTHER_CFLAGS = $(OF_CORE_CFLAGS)
OTHER_LDFLAGS = $(OF_CORE_LIBS) $(OF_CORE_FRAMEWORKS)
HEADER_SEARCH_PATHS = $(OF_CORE_HEADERS)

//THIS MAKES SURE THE APP BUILDS INSIDE THE BIN FOLDER
//If you comment this line out the app will be run from DerrivedData and your data/ files won't be accessible unless you uncomment OF_BUNDLE_DATA_FOLDER = 1 above
CONFIGURATION_BUILD_DIR = ${SRCROOT}/bin

//OF_CORE_BUILD_COMMAND = echo \"💾 Compiling openFrameworks\"\nxcodebuild -project \"$OF_PATH/libs/openFrameworksCompiled/project/osx/openFrameworksLib.xcodeproj\" -target openFrameworks -configuration \"${CONFIGURATION}\" CLANG_CXX_LANGUAGE_STANDARD=$CLANG_CXX_LANGUAGE_STANDARD MACOSX_DEPLOYMENT_TARGET=$MACOSX_DEPLOYMENT_TARGET GCC_PREPROCESSOR_DEFINITIONS='$USER_PREPROCESSOR_DEFINITIONS'


OF_CORE_BUILD_COMMAND = xcodebuild -project $OF_PATH/libs/openFrameworksCompiled/project/osx/openFrameworksLib.xcodeproj -target openFrameworks -configuration ${CONFIGURATION} CLANG_CXX_LANGUAGE_STANDARD=$CLANG_CXX_LANGUAGE_STANDARD MACOSX_DEPLOYMENT_TARGET=$MACOSX_DEPLOYMENT_TARGET GCC_PREPROCESSOR_DEFINITIONS=$USER_PREPROCESSOR_DEFINITIONS
1 change: 1 addition & 0 deletions example-bvh/addons.make
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
../ofxBvh
3 changes: 3 additions & 0 deletions example-bvh/config.make
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# This suite is designed to live at apps/myApps/example-openFrameworks.
# Override from any location with: make OF_ROOT=/path/to/openFrameworks
OF_ROOT ?= ../../../..
Loading