OpenSiv3D  v0.6.5
C++20 framework for creative coding
OpenSiv3D Documentation

Siv3D

Siv3D logo

Siv3D (OpenSiv3D) is a C++20 framework for creative coding (2D/3D games, media art, visualizers, and simulators). Siv3D applications run on Windows, macOS, Linux, and the Web.

Features

  • Graphics
    • Advanced 2D graphics
    • Basic 3D graphics (Wavefront OBJ, primitive shapes)
    • Custom vertex / pixel shaders (HLSL, GLSL)
    • Text rendering (Bitmap, SDF, MSDF)
    • PNG, JPEG, BMP, SVG, GIF, Animated GIF, TGA, PPM, WebP, TIFF
    • Unicode 14.0 emojis and 7,000+ icons
    • Image processing
    • Video rendering
  • Audio
    • WAVE, MP3, AAC, OggVorbis, Opus, MIDI, WMA*, FLAC*, AIFF*
    • Adjustable volume, pan, play speed and pitch
    • File streaming (WAVE, MP3, OggVorbis)
    • Fade in and fade out
    • Looping
    • Mixing busses
    • Filters (LPF, HPF, echo, reverb)
    • FFT
    • SoundFont rendering
    • Text to speech*
  • Input
    • Mouse
    • Keyboard
    • Gamepad
    • Webcam
    • Microphone
    • Joy-Con / Pro Controller
    • XInput*
    • Digital drawing tablet*
    • Leap Motion*
  • Window
    • Fullscreen mode
    • High DPI support
    • Window styles (sizable, borderless)
    • File dialog
    • Drag & drop
    • Message box
    • Toast notification*
  • Network and communication
    • HTTP client
    • Multiplayer (with Photon SDK)
    • TCP communication
    • Serial communication
    • Interprocess communication (pipe)
  • Math
    • Vector and matrix classes (Point, Float2, Vec2, Float3, Vec3, Float4, Vec4, Mat3x2, Mat3x3, Mat4x4, SIMD_Float4, Quaternion)
    • 2D shape classes (Line, Circle, Ellipse, Rect, RectF, Triangle, Quad, RoundRect, Polygon, MultiPolygon, LineString, Spline2D, Bezier2, Bezier3)
    • 3D shape classes (Plane, InfinitePlane, Sphere, Box, OrientedBox, Ray, Line3D, Triangle3D, ViewFrustum, Disc, Cylinder, Cone)
    • Color classes (Color, ColorF, HSV)
    • Polar / cylindrical / spherical coordinates system
    • 2D / 3D shape intersection
    • 2D / 3D geometry processing
    • Rectangle packing
    • Planar subdivisions
    • Linear and gamma color space
    • Pseudo random number generators
    • Interpolation, easing, and smoothing
    • Perlin noise
    • Math parser
    • Navigation mesh
    • Extended arithmetic types (HalfFloat, int128, uint128, BigInt, BigFloat)
  • String and Text Processing
    • Advanced String class (String, StringView)
    • Unicode conversion
    • Regular expression
    • {fmt} style text formatting
    • Text reader / writer classes
    • CSV / INI / JSON / XML / TOML reader classes
    • CSV / INI / JSON writer classes
  • Misc
    • Basic GUI (button, slider, radio buttons, checkbox, text box, color picker, list box)
    • Integrated 2D physics engine (Box2D)
    • Advanced array / 2D array classes (Array, Grid)
    • Kd-tree
    • Disjoint set
    • Asynchronous asset file streaming
    • Data compression (zlib, Zstandard)
    • Transitions between scenes
    • File system
    • Directory watcher
    • QR code reader / writer
    • GeoJSON
    • Date and time
    • Stopwatch and timer
    • Logging
    • Serialization
    • UUID
    • Child process
    • Clipboard
    • Power status
    • Scripting (AngelScript)

* Some features are limited to specific platforms

How to Install Siv3D + Tutorial

v0.6.5 | released 10 August 2022 | Release Notes

Platform SDK Requirements
Windows Download SDK /
SDK をダウンロード
- Windows 7 SP1 / 8.1 / 10 / 11 (64-bit)
- Microsoft Visual C++ 2022 17.3
- Windows 10 SDK
- Intel / AMD CPU
macOS Download SDK /
SDK をダウンロード
- macOS Mojave / Catalina / Big Sur / Monterey
- Xcode 11.3 or newer (Big Sur requires Xcode 12.5 or newer)
- Intel CPU / Apple Silicon (Rosetta mode)*
- OpenGL 4.1 compatible hardware
Linux Compiling for Linux /
Linux 版のビルド
- GCC 9.3.0 (with Boost 1.71.0) / GCC 11.2 (with Boost 1.74.0)
- Intel / AMD CPU
- OpenGL 4.1 compatible hardware
Web (experimental**) Compiling for Web /
Web 版のビルド
Web browser with WebAssembly and WebGL2 support

* Native Apple Silicon support will be added in the future release. You can build and run Siv3D in Rosetta mode
** Some functionality may be missing or limited

Community

Miscellaneous

  • Open Source Software used in Siv3D
  • Architecture
  • Roadmap

Supporting the Project

If you would like to support the project financially, visit my GitHub Sponsors page. Your support will accelerate the development of this exciting framework.

💗 https://github.com/sponsors/Reputeless

Examples

1. Hello, Siv3D!

Screenshot

# include <Siv3D.hpp>
void Main()
{
// Set background color to sky blue
Scene::SetBackground(ColorF{ 0.8, 0.9, 1.0 });
// Create a new font
const Font font{ 60 };
// Create a new emoji font
const Font emojiFont{ 60, Typeface::ColorEmoji };
// Set emojiFont as a fallback
font.addFallback(emojiFont);
// Create a texture from an image file
const Texture texture{ U"example/windmill.png" };
// Create a texture from an emoji
const Texture emoji{ U"🐈"_emoji };
// Coordinates of the emoji
Vec2 emojiPos{ 300, 150 };
// Print a text
Print << U"Push [A] key";
while (System::Update())
{
// Draw a texture
texture.draw(200, 200);
// Put a text in the middle of the screen
font(U"Hello, Siv3D!🚀").drawAt(Scene::Center(), Palette::Black);
// Draw a texture with animated size
emoji.resized(100 + Periodic::Sine0_1(1s) * 20).drawAt(emojiPos);
// Draw a red transparent circle that follows the mouse cursor
Circle{ Cursor::Pos(), 40 }.draw(ColorF{ 1, 0, 0, 0.5 });
// When [A] key is down
if (KeyA.down())
{
// Print a randomly selected text
Print << Sample({ U"Hello!", U"こんにちは", U"你好", U"안녕하세요?" });
}
// When [Button] is pushed
if (SimpleGUI::Button(U"Button", Vec2{ 640, 40 }))
{
// Move the coordinates to a random position in the screen
emojiPos = RandomVec2(Scene::Rect());
}
}
}

2. Breakout

Web Demo

Screenshot

# include <Siv3D.hpp>
void Main()
{
constexpr Size brickSize{ 40, 20 };
constexpr double speed = 480.0;
Vec2 ballVelocity{ 0, -speed };
Circle ball{ 400, 400, 8 };
Array<Rect> bricks;
for (auto p : step(Size{ (Scene::Width() / brickSize.x), 5 }))
{
bricks << Rect{ (p.x * brickSize.x), (60 + p.y * brickSize.y), brickSize };
}
while (System::Update())
{
const Rect paddle{ Arg::center(Cursor::Pos().x, 500), 60, 10 };
ball.moveBy(ballVelocity * Scene::DeltaTime());
for (auto it = bricks.begin(); it != bricks.end(); ++it)
{
if (it->intersects(ball))
{
(it->bottom().intersects(ball) || it->top().intersects(ball)
? ballVelocity.y : ballVelocity.x) *= -1;
bricks.erase(it);
break;
}
}
if (ball.y < 0 && ballVelocity.y < 0)
{
ballVelocity.y *= -1;
}
if ((ball.x < 0 && ballVelocity.x < 0)
|| (Scene::Width() < ball.x && 0 < ballVelocity.x))
{
ballVelocity.x *= -1;
}
if (0 < ballVelocity.y && paddle.intersects(ball))
{
ballVelocity = Vec2{ (ball.x - paddle.center().x) * 10, -ballVelocity.y }.setLength(speed);
}
for (const auto& brick : bricks)
{
brick.stretched(-1).draw(HSV{ brick.y - 40 });
}
ball.draw();
paddle.draw();
}
}

3. Hello, 3D world!

Web Demo

Screenshot

# include <Siv3D.hpp>
void Main()
{
// Resize the window and scene to 1280x720
Window::Resize(1280, 720);
// Background color (remove SRGB curve for a linear workflow)
const ColorF backgroundColor = ColorF{ 0.4, 0.6, 0.8 }.removeSRGBCurve();
// Texture for UV check (mipmapped. treat as SRGB texture in a linear workflow)
const Texture uvChecker{ U"example/texture/uv.png", TextureDesc::MippedSRGB };
// Multisample RenderTexture for a linear workflow
const MSRenderTexture renderTexture{ Scene::Size(), TextureFormat::R8G8B8A8_Unorm_SRGB, HasDepth::Yes };
// 3D debug camera (free camera)
// Vertical FOV: 30°, Eye position: (10, 16, -32)
// Move: [W][S][A][D][E][X], View: [arrow keys]
DebugCamera3D camera{ renderTexture.size(), 30_deg, Vec3{ 10, 16, -32 } };
while (System::Update())
{
// Update a camera
camera.update(2.0);
// Set up a camera in the current 3D scene
// [3D rendering]
{
// Clear renderTexture with the background color,
// then make renderTexture the render target for the current 3D scene
const ScopedRenderTarget3D target{ renderTexture.clear(backgroundColor) };
// Draw a floor
Plane{ 64 }.draw(uvChecker);
// Draw a box
Box{ -8,2,0,4 }.draw(ColorF{ 0.8, 0.6, 0.4 }.removeSRGBCurve());
// Draw a sphere
Sphere{ 0,2,0,2 }.draw(ColorF{ 0.4, 0.8, 0.6 }.removeSRGBCurve());
// Draw a cylinder
Cylinder{ 8, 2, 0, 2, 4 }.draw(ColorF{ 0.6, 0.4, 0.8 }.removeSRGBCurve());
}
// [2D rendering]
{
// Flush 3D rendering commands before multisample resolve
// Multisample resolve
renderTexture.resolve();
// Transfer renderTexture to the current 2D scene (default scene)
Shader::LinearToScreen(renderTexture);
}
}
}
s3d::Graphics2D::Flush
void Flush()
現在までの 2D 描画を実行します。
s3d::Vector2D::y
value_type y
ベクトルの Y 成分
Definition: Vector2D.hpp:36
Siv3D.hpp
s3d::SimpleGUI::Button
bool Button(StringView label, const Vec2 &pos, const Optional< double > &width=unspecified, bool enabled=true)
ボタンを表示します。
s3d::ColorSpace::sRGB::Palette::Black
constexpr Color Black
Definition: Palette.hpp:28
s3d::Cursor::Pos
Point Pos() noexcept
現在のフレームにおける、マウスカーソルのクライアント座標(ピクセル)を返します。
s3d::Scene::DeltaTime
double DeltaTime() noexcept
前回の System::Update() からの経過時間(秒)を、Scene::GetMaxDeltaTime() を超えない値で返します。
s3d::Input::down
bool down() const
入力オブジェクトが現在のフレームで押され始めたかを返します。
s3d::Graphics3D::SetCameraTransform
void SetCameraTransform(const Mat4x4 &matrix, const Float3 &eyePosition)
s3d::step
constexpr auto step(T a, N n, S s=1)
s3d::Geometry2D::Center
constexpr Vec2 Center(const Point &a) noexcept
s3d::Rect::moveBy
constexpr Rect & moveBy(value_type _x, value_type _y) noexcept
長方形を移動させます。
s3d::Shader::LinearToScreen
void LinearToScreen(const TextureRegion &src, TextureFilter textureFilter, const RectF &dst=RectF{ Graphics2D::GetRenderTargetSize() })
3D シーンを描画したリニア色空間のレンダーテクスチャを、メインのシーンに転送します。
s3d::KeyA
constexpr Input KeyA
A キー
Definition: Keyboard.hpp:135
s3d::Scene::Resize
void Resize(s3d::Size size)
シーンの幅と高さを変更します。
s3d::System::Update
bool Update()
描画や入力情報など、フレームを更新します。
s3d::Scene::Width
int32 Width() noexcept
現在のシーンの幅(ピクセル)を返します。
s3d::P2ShapeType::Circle
@ Circle
s3d::Periodic::Sine0_1
double Sine0_1(double periodSec, double t=Scene::Time()) noexcept
サインカーブに従って、周期的に [0.0, 1.0] の値を返します。
s3d::Scene::SetBackground
void SetBackground(const ColorF &color)
シーンの背景色を設定します。色のアルファ成分は無視されます。 @reamrk デフォルトは Scene::DefaultBackgroundColor です。
s3d::Vec2
Vector2D< double > Vec2
2 次元のベクトルを、double 型の要素 x, y で表現するクラスです。
Definition: 2DShapesFwd.hpp:22
s3d::Print
constexpr auto Print
画面にテキストをデバッグ出力するオブジェクトです。<< で値を送ります。
Definition: Print.hpp:142
s3d::Size
Point Size
2 次元のサイズベクトル(成分が int32 型)
Definition: 2DShapesFwd.hpp:17
s3d::Rect::y
value_type y
長方形の左上の点の Y 座標
Definition: Rect.hpp:58
s3d::RandomVec2
Vec2 RandomVec2()
長さが 1 のランダムな 2 次元ベクトルを返します。
s3d::Scene::Rect
s3d::Rect Rect() noexcept
左上が (0, 0) で現在のシーンと同じ大きさの Rect を返します。
s3d::Sample
auto Sample(Iterator begin, Iterator end, URBG &&urbg)
指定した範囲から 1 つの要素をランダムに返します。
s3d::Vec3
Vector3D< double > Vec3
Definition: 2DShapesFwd.hpp:25