From 9441bd6e8cb8e25ce0fff24b1bc54ff9837e007c Mon Sep 17 00:00:00 2001 From: Laurent Gomila Date: Wed, 6 Jul 2011 23:10:53 +0200 Subject: [PATCH] Removed the D and Python bindings --- bindings/d/AUTHORS | 2 - bindings/d/LICENCE | 18 - bindings/d/import/dsfml/audio/all.d | 36 - bindings/d/import/dsfml/audio/listener.d | 185 ----- bindings/d/import/dsfml/audio/music.d | 188 ----- bindings/d/import/dsfml/audio/sound.d | 224 ----- bindings/d/import/dsfml/audio/soundbuffer.d | 205 ----- .../import/dsfml/audio/soundbufferrecorder.d | 109 --- bindings/d/import/dsfml/audio/soundrecorder.d | 316 ------- bindings/d/import/dsfml/audio/soundsource.d | 311 ------- bindings/d/import/dsfml/audio/soundstream.d | 384 --------- bindings/d/import/dsfml/graphics/all.d | 41 - bindings/d/import/dsfml/graphics/blendmode.d | 38 - bindings/d/import/dsfml/graphics/color.d | 123 --- .../d/import/dsfml/graphics/drawableimpl.d | 268 ------ bindings/d/import/dsfml/graphics/font.d | 193 ----- bindings/d/import/dsfml/graphics/idrawable.d | 283 ------- bindings/d/import/dsfml/graphics/image.d | 352 -------- .../d/import/dsfml/graphics/irendertarget.d | 138 ---- bindings/d/import/dsfml/graphics/rect.d | 149 ---- .../d/import/dsfml/graphics/renderimage.d | 316 ------- .../d/import/dsfml/graphics/renderwindow.d | 336 -------- bindings/d/import/dsfml/graphics/shader.d | 177 ---- bindings/d/import/dsfml/graphics/shape.d | 306 ------- bindings/d/import/dsfml/graphics/sprite.d | 238 ------ bindings/d/import/dsfml/graphics/text.d | 277 ------- bindings/d/import/dsfml/graphics/view.d | 347 -------- bindings/d/import/dsfml/network/all.d | 38 - bindings/d/import/dsfml/network/ftp.d | 602 -------------- bindings/d/import/dsfml/network/http.d | 398 --------- bindings/d/import/dsfml/network/ipaddress.d | 148 ---- bindings/d/import/dsfml/network/packet.d | 417 ---------- .../d/import/dsfml/network/socketselector.d | 153 ---- .../d/import/dsfml/network/socketstatus.d | 38 - bindings/d/import/dsfml/network/tcplistener.d | 49 -- bindings/d/import/dsfml/network/tcpsocket.d | 273 ------ bindings/d/import/dsfml/network/udpsocket.d | 241 ------ bindings/d/import/dsfml/system/all.d | 47 -- bindings/d/import/dsfml/system/alloc.d | 84 -- bindings/d/import/dsfml/system/common.d | 141 ---- bindings/d/import/dsfml/system/dllloader.d | 238 ------ bindings/d/import/dsfml/system/exception.d | 43 - bindings/d/import/dsfml/system/linkedlist.d | 103 --- bindings/d/import/dsfml/system/lock.d | 66 -- bindings/d/import/dsfml/system/stringutil.d | 82 -- bindings/d/import/dsfml/system/vector.d | 470 ----------- bindings/d/import/dsfml/window/all.d | 34 - bindings/d/import/dsfml/window/context.d | 68 -- bindings/d/import/dsfml/window/event.d | 326 -------- bindings/d/import/dsfml/window/input.d | 152 ---- bindings/d/import/dsfml/window/videomode.d | 105 --- bindings/d/import/dsfml/window/window.d | 454 ---------- bindings/d/import/dsfml/window/windowhandle.d | 47 -- bindings/d/import/dsss.conf | 46 -- .../d/samples/dsfml/bin/Data/background.jpg | Bin 157847 -> 0 bytes bindings/d/samples/dsfml/bin/Data/ball.tga | Bin 2891 -> 0 bytes bindings/d/samples/dsfml/bin/Data/ball.wav | Bin 15442 -> 0 bytes .../dsfml/bin/Data/bluerallyecarleft.bmp | Bin 27702 -> 0 bytes .../dsfml/bin/Data/bluerallyecarright.bmp | Bin 27702 -> 0 bytes bindings/d/samples/dsfml/bin/Data/blur.sfx | 16 - .../d/samples/dsfml/bin/Data/car_idle.wav | Bin 59291 -> 0 bytes .../d/samples/dsfml/bin/Data/cheeseburger.ttf | Bin 42020 -> 0 bytes .../d/samples/dsfml/bin/Data/colorize.sfx | 10 - .../d/samples/dsfml/bin/Data/crosshair.bmp | Bin 3126 -> 0 bytes .../d/samples/dsfml/bin/Data/crosshair.tga | Bin 1466 -> 0 bytes bindings/d/samples/dsfml/bin/Data/fisheye.sfx | 12 - bindings/d/samples/dsfml/bin/Data/nothing.sfx | 6 - .../dsfml/bin/Data/opengl/background.jpg | Bin 142959 -> 0 bytes .../samples/dsfml/bin/Data/opengl/texture.jpg | Bin 20550 -> 0 bytes bindings/d/samples/dsfml/bin/Data/paddle.tga | Bin 1943 -> 0 bytes bindings/d/samples/dsfml/bin/Data/wave.jpg | Bin 23249 -> 0 bytes bindings/d/samples/dsfml/bin/Data/wave.sfx | 12 - bindings/d/samples/dsfml/bin/libsndfile-1.dll | Bin 325120 -> 0 bytes bindings/d/samples/dsfml/bin/openal32.dll | Bin 294774 -> 0 bytes bindings/d/samples/dsfml/dfl/DFLSample.d | 230 ------ bindings/d/samples/dsfml/dsss.conf | 33 - bindings/d/samples/dsfml/opengl/opengl.d | 155 ---- bindings/d/samples/dsfml/pong/pong.d | 202 ----- bindings/d/samples/dsfml/postFX/postFX.d | 117 --- .../d/samples/dsfml/socket/socketclient.d | 66 -- .../d/samples/dsfml/socket/socketserver.d | 83 -- bindings/d/samples/dsfml/sound3d/sound3d.d | 185 ----- .../d/samples/dsfml/soundstream/soundstream.d | 97 --- bindings/d/samples/dsfml/view/view.d | 69 -- bindings/d/samples/dsfml/voip/client.d | 72 -- bindings/d/samples/dsfml/voip/entry.d | 46 -- bindings/d/samples/dsfml/voip/server.d | 162 ---- bindings/d/samples/dsfml/voip/util.d | 49 -- bindings/python/MANIFEST.in | 5 - bindings/python/PySFML/__init__.py | 2 - bindings/python/doc/style.css | 96 --- bindings/python/samples/data/apple.png | Bin 868 -> 0 bytes bindings/python/samples/data/cheeseburger.ttf | Bin 42020 -> 0 bytes bindings/python/samples/data/fart.wav | Bin 14962 -> 0 bytes bindings/python/samples/data/rond2.png | Bin 1167 -> 0 bytes bindings/python/samples/hellosfml.py | 98 --- bindings/python/samples/opengl.py | 165 ---- bindings/python/samples/sound.py | 43 - bindings/python/samples/sound_capture.py | 68 -- bindings/python/samples/sound_capture_py3.py | 67 -- bindings/python/samples/sound_stream.py | 49 -- bindings/python/samples/sound_stream_py3.py | 49 -- bindings/python/samples/worm.py | 272 ------ bindings/python/scripts/footer.htm | 7 - bindings/python/scripts/gen_doc.py | 118 --- bindings/python/scripts/header.htm | 11 - bindings/python/setup.py | 27 - bindings/python/src/Blend.cpp | 100 --- bindings/python/src/Blend.hpp | 39 - bindings/python/src/Clock.cpp | 110 --- bindings/python/src/Clock.hpp | 37 - bindings/python/src/Color.cpp | 198 ----- bindings/python/src/Color.hpp | 52 -- bindings/python/src/ContextSettings.cpp | 125 --- bindings/python/src/ContextSettings.hpp | 49 -- bindings/python/src/Drawable.cpp | 325 -------- bindings/python/src/Drawable.hpp | 53 -- bindings/python/src/Event.cpp | 780 ------------------ bindings/python/src/Event.hpp | 105 --- bindings/python/src/Font.cpp | 200 ----- bindings/python/src/Font.hpp | 42 - bindings/python/src/Glyph.cpp | 145 ---- bindings/python/src/Glyph.hpp | 53 -- bindings/python/src/Image.cpp | 410 --------- bindings/python/src/Image.hpp | 42 - bindings/python/src/Input.cpp | 134 --- bindings/python/src/Input.hpp | 40 - bindings/python/src/Joy.cpp | 114 --- bindings/python/src/Joy.hpp | 39 - bindings/python/src/Key.cpp | 385 --------- bindings/python/src/Key.hpp | 39 - bindings/python/src/Listener.cpp | 128 --- bindings/python/src/Listener.hpp | 37 - bindings/python/src/Mouse.cpp | 102 --- bindings/python/src/Mouse.hpp | 39 - bindings/python/src/Music.cpp | 140 ---- bindings/python/src/Music.hpp | 37 - bindings/python/src/Rect.cpp | 394 --------- bindings/python/src/Rect.hpp | 70 -- bindings/python/src/RenderQueue.cpp | 94 --- bindings/python/src/RenderQueue.hpp | 40 - bindings/python/src/RenderWindow.cpp | 286 ------- bindings/python/src/RenderWindow.hpp | 41 - bindings/python/src/Shader.cpp | 194 ----- bindings/python/src/Shader.hpp | 38 - bindings/python/src/Shape.cpp | 379 --------- bindings/python/src/Shape.hpp | 42 - bindings/python/src/Sleep.cpp | 33 - bindings/python/src/Sleep.hpp | 35 - bindings/python/src/Sound.cpp | 338 -------- bindings/python/src/Sound.hpp | 40 - bindings/python/src/SoundBuffer.cpp | 194 ----- bindings/python/src/SoundBuffer.hpp | 40 - bindings/python/src/SoundBufferRecorder.cpp | 106 --- bindings/python/src/SoundBufferRecorder.hpp | 37 - bindings/python/src/SoundRecorder.cpp | 166 ---- bindings/python/src/SoundRecorder.hpp | 46 -- bindings/python/src/SoundStream.cpp | 346 -------- bindings/python/src/SoundStream.hpp | 51 -- bindings/python/src/Sprite.cpp | 256 ------ bindings/python/src/Sprite.hpp | 43 - bindings/python/src/Text.cpp | 307 ------- bindings/python/src/Text.hpp | 43 - bindings/python/src/VideoMode.cpp | 197 ----- bindings/python/src/VideoMode.hpp | 43 - bindings/python/src/View.cpp | 168 ---- bindings/python/src/View.hpp | 43 - bindings/python/src/Window.cpp | 395 --------- bindings/python/src/Window.hpp | 41 - bindings/python/src/WindowStyle.cpp | 103 --- bindings/python/src/WindowStyle.hpp | 39 - bindings/python/src/compat.hpp | 72 -- bindings/python/src/main.cpp | 304 ------- bindings/python/src/main.hpp | 37 - bindings/python/src/offsetof.hpp | 32 - 175 files changed, 22354 deletions(-) delete mode 100644 bindings/d/AUTHORS delete mode 100644 bindings/d/LICENCE delete mode 100644 bindings/d/import/dsfml/audio/all.d delete mode 100644 bindings/d/import/dsfml/audio/listener.d delete mode 100644 bindings/d/import/dsfml/audio/music.d delete mode 100644 bindings/d/import/dsfml/audio/sound.d delete mode 100644 bindings/d/import/dsfml/audio/soundbuffer.d delete mode 100644 bindings/d/import/dsfml/audio/soundbufferrecorder.d delete mode 100644 bindings/d/import/dsfml/audio/soundrecorder.d delete mode 100644 bindings/d/import/dsfml/audio/soundsource.d delete mode 100644 bindings/d/import/dsfml/audio/soundstream.d delete mode 100644 bindings/d/import/dsfml/graphics/all.d delete mode 100644 bindings/d/import/dsfml/graphics/blendmode.d delete mode 100644 bindings/d/import/dsfml/graphics/color.d delete mode 100644 bindings/d/import/dsfml/graphics/drawableimpl.d delete mode 100644 bindings/d/import/dsfml/graphics/font.d delete mode 100644 bindings/d/import/dsfml/graphics/idrawable.d delete mode 100644 bindings/d/import/dsfml/graphics/image.d delete mode 100644 bindings/d/import/dsfml/graphics/irendertarget.d delete mode 100644 bindings/d/import/dsfml/graphics/rect.d delete mode 100644 bindings/d/import/dsfml/graphics/renderimage.d delete mode 100644 bindings/d/import/dsfml/graphics/renderwindow.d delete mode 100644 bindings/d/import/dsfml/graphics/shader.d delete mode 100644 bindings/d/import/dsfml/graphics/shape.d delete mode 100644 bindings/d/import/dsfml/graphics/sprite.d delete mode 100644 bindings/d/import/dsfml/graphics/text.d delete mode 100644 bindings/d/import/dsfml/graphics/view.d delete mode 100644 bindings/d/import/dsfml/network/all.d delete mode 100644 bindings/d/import/dsfml/network/ftp.d delete mode 100644 bindings/d/import/dsfml/network/http.d delete mode 100644 bindings/d/import/dsfml/network/ipaddress.d delete mode 100644 bindings/d/import/dsfml/network/packet.d delete mode 100644 bindings/d/import/dsfml/network/socketselector.d delete mode 100644 bindings/d/import/dsfml/network/socketstatus.d delete mode 100644 bindings/d/import/dsfml/network/tcplistener.d delete mode 100644 bindings/d/import/dsfml/network/tcpsocket.d delete mode 100644 bindings/d/import/dsfml/network/udpsocket.d delete mode 100644 bindings/d/import/dsfml/system/all.d delete mode 100644 bindings/d/import/dsfml/system/alloc.d delete mode 100644 bindings/d/import/dsfml/system/common.d delete mode 100644 bindings/d/import/dsfml/system/dllloader.d delete mode 100644 bindings/d/import/dsfml/system/exception.d delete mode 100644 bindings/d/import/dsfml/system/linkedlist.d delete mode 100644 bindings/d/import/dsfml/system/lock.d delete mode 100644 bindings/d/import/dsfml/system/stringutil.d delete mode 100644 bindings/d/import/dsfml/system/vector.d delete mode 100644 bindings/d/import/dsfml/window/all.d delete mode 100644 bindings/d/import/dsfml/window/context.d delete mode 100644 bindings/d/import/dsfml/window/event.d delete mode 100644 bindings/d/import/dsfml/window/input.d delete mode 100644 bindings/d/import/dsfml/window/videomode.d delete mode 100644 bindings/d/import/dsfml/window/window.d delete mode 100644 bindings/d/import/dsfml/window/windowhandle.d delete mode 100644 bindings/d/import/dsss.conf delete mode 100644 bindings/d/samples/dsfml/bin/Data/background.jpg delete mode 100644 bindings/d/samples/dsfml/bin/Data/ball.tga delete mode 100644 bindings/d/samples/dsfml/bin/Data/ball.wav delete mode 100644 bindings/d/samples/dsfml/bin/Data/bluerallyecarleft.bmp delete mode 100644 bindings/d/samples/dsfml/bin/Data/bluerallyecarright.bmp delete mode 100644 bindings/d/samples/dsfml/bin/Data/blur.sfx delete mode 100644 bindings/d/samples/dsfml/bin/Data/car_idle.wav delete mode 100644 bindings/d/samples/dsfml/bin/Data/cheeseburger.ttf delete mode 100644 bindings/d/samples/dsfml/bin/Data/colorize.sfx delete mode 100644 bindings/d/samples/dsfml/bin/Data/crosshair.bmp delete mode 100644 bindings/d/samples/dsfml/bin/Data/crosshair.tga delete mode 100644 bindings/d/samples/dsfml/bin/Data/fisheye.sfx delete mode 100644 bindings/d/samples/dsfml/bin/Data/nothing.sfx delete mode 100644 bindings/d/samples/dsfml/bin/Data/opengl/background.jpg delete mode 100644 bindings/d/samples/dsfml/bin/Data/opengl/texture.jpg delete mode 100644 bindings/d/samples/dsfml/bin/Data/paddle.tga delete mode 100644 bindings/d/samples/dsfml/bin/Data/wave.jpg delete mode 100644 bindings/d/samples/dsfml/bin/Data/wave.sfx delete mode 100644 bindings/d/samples/dsfml/bin/libsndfile-1.dll delete mode 100644 bindings/d/samples/dsfml/bin/openal32.dll delete mode 100644 bindings/d/samples/dsfml/dfl/DFLSample.d delete mode 100644 bindings/d/samples/dsfml/dsss.conf delete mode 100644 bindings/d/samples/dsfml/opengl/opengl.d delete mode 100644 bindings/d/samples/dsfml/pong/pong.d delete mode 100644 bindings/d/samples/dsfml/postFX/postFX.d delete mode 100644 bindings/d/samples/dsfml/socket/socketclient.d delete mode 100644 bindings/d/samples/dsfml/socket/socketserver.d delete mode 100644 bindings/d/samples/dsfml/sound3d/sound3d.d delete mode 100644 bindings/d/samples/dsfml/soundstream/soundstream.d delete mode 100644 bindings/d/samples/dsfml/view/view.d delete mode 100644 bindings/d/samples/dsfml/voip/client.d delete mode 100644 bindings/d/samples/dsfml/voip/entry.d delete mode 100644 bindings/d/samples/dsfml/voip/server.d delete mode 100644 bindings/d/samples/dsfml/voip/util.d delete mode 100644 bindings/python/MANIFEST.in delete mode 100644 bindings/python/PySFML/__init__.py delete mode 100644 bindings/python/doc/style.css delete mode 100644 bindings/python/samples/data/apple.png delete mode 100644 bindings/python/samples/data/cheeseburger.ttf delete mode 100644 bindings/python/samples/data/fart.wav delete mode 100644 bindings/python/samples/data/rond2.png delete mode 100644 bindings/python/samples/hellosfml.py delete mode 100644 bindings/python/samples/opengl.py delete mode 100644 bindings/python/samples/sound.py delete mode 100644 bindings/python/samples/sound_capture.py delete mode 100644 bindings/python/samples/sound_capture_py3.py delete mode 100755 bindings/python/samples/sound_stream.py delete mode 100755 bindings/python/samples/sound_stream_py3.py delete mode 100644 bindings/python/samples/worm.py delete mode 100644 bindings/python/scripts/footer.htm delete mode 100755 bindings/python/scripts/gen_doc.py delete mode 100644 bindings/python/scripts/header.htm delete mode 100644 bindings/python/setup.py delete mode 100644 bindings/python/src/Blend.cpp delete mode 100644 bindings/python/src/Blend.hpp delete mode 100644 bindings/python/src/Clock.cpp delete mode 100644 bindings/python/src/Clock.hpp delete mode 100644 bindings/python/src/Color.cpp delete mode 100644 bindings/python/src/Color.hpp delete mode 100644 bindings/python/src/ContextSettings.cpp delete mode 100644 bindings/python/src/ContextSettings.hpp delete mode 100644 bindings/python/src/Drawable.cpp delete mode 100644 bindings/python/src/Drawable.hpp delete mode 100644 bindings/python/src/Event.cpp delete mode 100644 bindings/python/src/Event.hpp delete mode 100644 bindings/python/src/Font.cpp delete mode 100644 bindings/python/src/Font.hpp delete mode 100644 bindings/python/src/Glyph.cpp delete mode 100644 bindings/python/src/Glyph.hpp delete mode 100644 bindings/python/src/Image.cpp delete mode 100644 bindings/python/src/Image.hpp delete mode 100644 bindings/python/src/Input.cpp delete mode 100644 bindings/python/src/Input.hpp delete mode 100644 bindings/python/src/Joy.cpp delete mode 100644 bindings/python/src/Joy.hpp delete mode 100644 bindings/python/src/Key.cpp delete mode 100644 bindings/python/src/Key.hpp delete mode 100644 bindings/python/src/Listener.cpp delete mode 100644 bindings/python/src/Listener.hpp delete mode 100644 bindings/python/src/Mouse.cpp delete mode 100644 bindings/python/src/Mouse.hpp delete mode 100644 bindings/python/src/Music.cpp delete mode 100644 bindings/python/src/Music.hpp delete mode 100644 bindings/python/src/Rect.cpp delete mode 100644 bindings/python/src/Rect.hpp delete mode 100644 bindings/python/src/RenderQueue.cpp delete mode 100644 bindings/python/src/RenderQueue.hpp delete mode 100644 bindings/python/src/RenderWindow.cpp delete mode 100644 bindings/python/src/RenderWindow.hpp delete mode 100644 bindings/python/src/Shader.cpp delete mode 100644 bindings/python/src/Shader.hpp delete mode 100644 bindings/python/src/Shape.cpp delete mode 100644 bindings/python/src/Shape.hpp delete mode 100644 bindings/python/src/Sleep.cpp delete mode 100644 bindings/python/src/Sleep.hpp delete mode 100644 bindings/python/src/Sound.cpp delete mode 100644 bindings/python/src/Sound.hpp delete mode 100644 bindings/python/src/SoundBuffer.cpp delete mode 100644 bindings/python/src/SoundBuffer.hpp delete mode 100644 bindings/python/src/SoundBufferRecorder.cpp delete mode 100644 bindings/python/src/SoundBufferRecorder.hpp delete mode 100644 bindings/python/src/SoundRecorder.cpp delete mode 100644 bindings/python/src/SoundRecorder.hpp delete mode 100644 bindings/python/src/SoundStream.cpp delete mode 100644 bindings/python/src/SoundStream.hpp delete mode 100644 bindings/python/src/Sprite.cpp delete mode 100644 bindings/python/src/Sprite.hpp delete mode 100644 bindings/python/src/Text.cpp delete mode 100644 bindings/python/src/Text.hpp delete mode 100644 bindings/python/src/VideoMode.cpp delete mode 100644 bindings/python/src/VideoMode.hpp delete mode 100644 bindings/python/src/View.cpp delete mode 100644 bindings/python/src/View.hpp delete mode 100644 bindings/python/src/Window.cpp delete mode 100644 bindings/python/src/Window.hpp delete mode 100644 bindings/python/src/WindowStyle.cpp delete mode 100644 bindings/python/src/WindowStyle.hpp delete mode 100644 bindings/python/src/compat.hpp delete mode 100644 bindings/python/src/main.cpp delete mode 100644 bindings/python/src/main.hpp delete mode 100644 bindings/python/src/offsetof.hpp diff --git a/bindings/d/AUTHORS b/bindings/d/AUTHORS deleted file mode 100644 index 266b2457..00000000 --- a/bindings/d/AUTHORS +++ /dev/null @@ -1,2 +0,0 @@ -SirJulio (Dagorn Julien) => sirjulio13@gmail.com -Insomniak => insomniak.fr@gmail.com diff --git a/bindings/d/LICENCE b/bindings/d/LICENCE deleted file mode 100644 index 48844753..00000000 --- a/bindings/d/LICENCE +++ /dev/null @@ -1,18 +0,0 @@ -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source - distribution. diff --git a/bindings/d/import/dsfml/audio/all.d b/bindings/d/import/dsfml/audio/all.d deleted file mode 100644 index 918cfb8d..00000000 --- a/bindings/d/import/dsfml/audio/all.d +++ /dev/null @@ -1,36 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.audio.all; - -public import - dsfml.audio.listener, - dsfml.audio.music, - dsfml.audio.sound, - dsfml.audio.soundbuffer, - dsfml.audio.soundbufferrecorder, - dsfml.audio.soundrecorder, - dsfml.audio.soundstream; diff --git a/bindings/d/import/dsfml/audio/listener.d b/bindings/d/import/dsfml/audio/listener.d deleted file mode 100644 index 408b4e7b..00000000 --- a/bindings/d/import/dsfml/audio/listener.d +++ /dev/null @@ -1,185 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.audio.listener; - -import dsfml.system.common; -import dsfml.system.vector; - -/** -* Listener is a global interface for defining the audio -* listener properties ; the audio listener is the point in -* the scene from where all the sounds are heard. -* -* See_Also: -* SFML Tutorial for sound spatialization example. -*/ -class Listener -{ - - /** - * Change the global volume of all the sounds. - * The default volume is 100 - * - * Params: - * volume = New global volume, in the range [0, 100] - */ - static void setGlobalVolume(float volume) - in - { - assert (volume >= 0.f && volume <= 100.f); - } - body - { - sfListener_SetGlobalVolume(volume); - } - - /** - * Get the current value of the global volume of all the sounds - * - * Returns: - * Current global volume, in the range [0, 100] - */ - static float getGlobalVolume() - { - return sfListener_GetGlobalVolume(); - } - - /** - * Change the position of the listener. - * The default position is (0, 0, 0) - * - * Params: - * posX = X position of the listener in the world - * posY = Y position of the listener in the world - * posZ = Z position of the listener in the world - */ - static void setPosition(float posX, float posY, float posZ) - { - sfListener_SetPosition(posX, posY, posZ); - } - - /** - * Change the position of the listener. - * The default position is (0, 0, 0) - * - * Params: - * position = new position - */ - static void setPosition(Vector3f position) - { - sfListener_SetPosition(position.x, position.y, position.z); - } - - - /** - * Get the current position of the listener - * - * Returns: - * Current position - */ - static Vector3f getPosition() - { - Vector3f ret; - sfListener_GetPosition(&ret.x, &ret.y, &ret.z); - return ret; - } - - /** - * Change the orientation of the listener - * The default direction is (0, 0, -1) - * - * Params: - * directionX = X component of the listener's direction - * directionY = Y component of the listener's direction - * directionZ = Z component of the listener's direction - */ - static void setDirection(float directionX, float directionY, float directionZ) - { - sfListener_SetDirection(directionX, directionY, directionZ); - } - - /** - * Change the orientation of the listener - * The default direction is (0, 0, -1) - * - * Params: - * direction = Position of the point the listener must look at - */ - static void setDirection(Vector3f position) - { - sfListener_SetDirection(position.x, position.y, position.z); - } - - /** - * Get the current orientation of the listener - * - * Returns: - * Position of the point the listener is looking at - */ - static Vector3f getDirection() - { - Vector3f ret; - sfListener_GetDirection(&ret.x, &ret.y, &ret.z); - return ret; - } - -private: - -// External ==================================================================== - - extern (C) - { - typedef void function(float) pf_sfListener_SetGlobalVolume; - typedef float function() pf_sfListener_GetGlobalVolume; - typedef void function(float, float, float) pf_sfListener_SetPosition; - typedef void function(float*, float*, float*) pf_sfListener_GetPosition; - typedef void function(float, float, float) pf_sfListener_SetDirection; - typedef void function(float*, float*, float*) pf_sfListener_GetDirection; - - static pf_sfListener_SetGlobalVolume sfListener_SetGlobalVolume; - static pf_sfListener_GetGlobalVolume sfListener_GetGlobalVolume; - static pf_sfListener_SetPosition sfListener_SetPosition; - static pf_sfListener_GetPosition sfListener_GetPosition; - static pf_sfListener_SetDirection sfListener_SetDirection; - static pf_sfListener_GetDirection sfListener_GetDirection; - } - - static this() - { - debug - DllLoader dll = DllLoader.load("csfml-audio-d-2"); - else - DllLoader dll = DllLoader.load("csfml-audio-2"); - - sfListener_SetGlobalVolume = cast(pf_sfListener_SetGlobalVolume)dll.getSymbol("sfListener_SetGlobalVolume"); - sfListener_GetGlobalVolume = cast(pf_sfListener_GetGlobalVolume)dll.getSymbol("sfListener_GetGlobalVolume"); - sfListener_SetPosition = cast(pf_sfListener_SetPosition)dll.getSymbol("sfListener_SetPosition"); - sfListener_GetPosition = cast(pf_sfListener_GetPosition)dll.getSymbol("sfListener_GetPosition"); - sfListener_SetDirection = cast(pf_sfListener_SetDirection)dll.getSymbol("sfListener_SetDirection"); - sfListener_GetDirection = cast(pf_sfListener_GetDirection)dll.getSymbol("sfListener_GetDirection"); - } -} diff --git a/bindings/d/import/dsfml/audio/music.d b/bindings/d/import/dsfml/audio/music.d deleted file mode 100644 index 39f64acf..00000000 --- a/bindings/d/import/dsfml/audio/music.d +++ /dev/null @@ -1,188 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.audio.music; - -import dsfml.audio.soundsource; - -import dsfml.system.common; -import dsfml.system.exception; -import dsfml.system.stringutil; -import dsfml.system.vector; - -/** -* Music defines a big sound played using streaming, -* so usually what we call a music :) -*/ -class Music : SoundSource!("sfMusic") -{ - /** - * Open a music file (doesn't play it -- call Play for that) - * - * Params: - * filename = Path of the file to open - * - */ - this(string filename) - { - if (filename is null || filename.length == 0) - throw new LoadingException("LoadingException : Filename is invalid."); - - m_ptr = sfMusic_CreateFromFile(toStringz(filename)); // TODO: this is a hack, should properly call the super constructor - } - - /** - * Open a music file from memory (doesn't play it -- call Play() for that) - * - * Params: - * data = file data in memory - * - */ - this(byte[] data) - { - if (data is null || data.length == 0) - throw new Exception("LoadingException : Memory stream is invalid."); - - m_ptr = sfMusic_CreateFromMemory(data.ptr, data.length); // TODO: ditto - } - - /** - * Start playing the audio stream - */ - void play() - { - sfMusic_Play(m_ptr); - } - - /** - * Stop playing the audio stream - */ - void stop() - { - sfMusic_Stop(m_ptr); - } - - /** - * Pause the audio stream - */ - void pause() - { - sfMusic_Pause(m_ptr); - } - - - /** - * Return the number of channels (1 = mono, 2 = stereo) - * - * Returns: - * Number of channels - */ - uint getChannelsCount() - { - return sfMusic_GetChannelsCount(m_ptr); - } - - /** - * Get the stream sample rate - * - * Returns: - * Stream frequency (number of samples per second) - */ - uint getSampleRate() - { - return sfMusic_GetSampleRate(m_ptr); - } - - - /** - * Get the music duration - * - * Returns: - * Music duration, in seconds - */ - float getDuration() - { - return sfMusic_GetDuration(m_ptr); - } - - /** - * Tell whether or not the music is looping - * - * Returns: - * True if the music is looping, false otherwise - */ - bool getLoop() - { - return cast(bool)sfMusic_GetLoop(m_ptr); - } - - /** - * Set the music loop state. - * This parameter is disabled by default - * - * Params: - * loop = True to play in loop, false to play once - */ - void setLoop(bool loop) - { - sfMusic_SetLoop(m_ptr, loop); - } -} - -private: - -extern(C) -{ -SFMLClass function(cchar*) sfMusic_CreateFromFile; -SFMLClass function(byte*, size_t) sfMusic_CreateFromMemory; -void function(SFMLClass, int) sfMusic_SetLoop; -bool function(SFMLClass) sfMusic_GetLoop; -float function(SFMLClass) sfMusic_GetDuration; -void function(SFMLClass) sfMusic_Play; -void function(SFMLClass) sfMusic_Pause; -void function(SFMLClass) sfMusic_Stop; -uint function(SFMLClass) sfMusic_GetChannelsCount; -uint function(SFMLClass) sfMusic_GetSampleRate; -} - -static this() -{ -debug - DllLoader dll = DllLoader.load("csfml-audio-d-2"); -else - DllLoader dll = DllLoader.load("csfml-audio-2"); - - mixin(loadFromSharedLib("sfMusic_CreateFromFile")); - mixin(loadFromSharedLib("sfMusic_CreateFromMemory")); - mixin(loadFromSharedLib("sfMusic_SetLoop")); - mixin(loadFromSharedLib("sfMusic_GetLoop")); - mixin(loadFromSharedLib("sfMusic_GetDuration")); - mixin(loadFromSharedLib("sfMusic_Play")); - mixin(loadFromSharedLib("sfMusic_Pause")); - mixin(loadFromSharedLib("sfMusic_Stop")); - mixin(loadFromSharedLib("sfMusic_GetChannelsCount")); - mixin(loadFromSharedLib("sfMusic_GetSampleRate")); -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/audio/sound.d b/bindings/d/import/dsfml/audio/sound.d deleted file mode 100644 index c13922ad..00000000 --- a/bindings/d/import/dsfml/audio/sound.d +++ /dev/null @@ -1,224 +0,0 @@ -/* - * DSFML - SFML Library wrapper for the D programming language. - * Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) - * Copyright (C) 2010 Andreas Hollandt - * - * This software is provided 'as-is', without any express or - * implied warranty. In no event will the authors be held - * liable for any damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute - * it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; - * you must not claim that you wrote the original software. - * If you use this software in a product, an acknowledgment - * in the product documentation would be appreciated but - * is not required. - * - * 2. Altered source versions must be plainly marked as such, - * and must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any - * source distribution. - */ - -module dsfml.audio.sound; - -import dsfml.audio.soundbuffer; -import dsfml.audio.soundsource; - -import dsfml.system.common; -import dsfml.system.exception; -import dsfml.system.vector; - -/** - * Sound defines the properties of the sound such as position, - * volume, pitch, etc. - */ -class Sound : SoundSource!("sfSound") -{ - /** - * Default constructor - */ - this() - { - super(); - } - - /** - * Construct the sound from its parameters - * - * Params: - * soundbuffer = Sound buffer to play - * loop = Loop flag (false by default) - * pitch = Value of the pitch (1 by default) - * volume = Volume (100 by default) - * x = X position (0 by default) - * y = Y position (0 by default) - * z = Z position (0 by default) - * - * Throws: - * NullParameterException if buffer is null - */ - this(SoundBuffer soundbuffer, bool loop = false, float pitch = 1.f, float volume = 100.f, float x = 0.f, float y = 0.f, float z = 0.f) - { - if (soundbuffer is null) - throw new NullParameterException("NullParameterException : SoundBuffer is null."); - - super(); - buffer = soundbuffer; - loop = loop; - pitch = pitch; - volume = volume; - setPosition(x, y, z); - } - - - /** - * Play the sound - */ - void play() - { - sfSound_Play(m_ptr); - } - - /** - * Pause the sound - */ - void pause() - { - sfSound_Pause(m_ptr); - } - - /** - * Stop the sound - */ - void stop() - { - sfSound_Stop(m_ptr); - } - -@property -{ - /** - * Set the source buffer - * - * Params: - * buffer = New sound buffer to bind to the sound - */ - void buffer(SoundBuffer buffer) - { - if (buffer is null) - throw new NullParameterException("NullParameterException : SoundBuffer is null."); - - m_buffer = buffer; - sfSound_SetBuffer(m_ptr, buffer.nativePointer); - } - - /** - * Set the sound loop state. - * This parameter is disabled by default - * - * Params: - * loop = True to play in loop, false to play once - */ - void loop(bool loop) - { - sfSound_SetLoop(m_ptr, loop); - } - - /** - * Set the current playing offset of a sound - * - * Params: - * offset = new playing position, expressed in seconds - */ - void playingOffset(float offset) - { - sfSound_SetPlayingOffset(m_ptr, offset); - } - - - /** - * Get the source buffer - * - * Returns: - * Sound buffer bound to the sound (can be NULL) - */ - SoundBuffer buffer() - { - return m_buffer; - } - - /** - * Tell whether or not the sound is looping - * - * Returns: - * True if the sound is looping, false otherwise - */ - bool loop() - { - - return cast(bool)(sfSound_GetLoop(m_ptr)); - } - - /** - * Get the current playing position of the sound - * - * Returns: - * Current playing position, expressed in seconds - */ - float playingOffset() - { - return sfSound_GetPlayingOffset(m_ptr); - } -} - -private: - SoundBuffer m_buffer; - -// External ==================================================================== - - extern (C) - { - typedef void function(SFMLClass) pf_sfSound_Play; - typedef void function(SFMLClass) pf_sfSound_Pause; - typedef void function(SFMLClass) pf_sfSound_Stop; - typedef void function(SFMLClass, SFMLClass) pf_sfSound_SetBuffer; - typedef SFMLClass function(SFMLClass) pf_sfSound_GetBuffer; - typedef void function(SFMLClass, int) pf_sfSound_SetLoop; - typedef int function(SFMLClass) pf_sfSound_GetLoop; - typedef float function(SFMLClass) pf_sfSound_GetPlayingOffset; - typedef void function(SFMLClass, float) pf_sfSound_SetPlayingOffset; - - static pf_sfSound_Play sfSound_Play; - static pf_sfSound_Pause sfSound_Pause; - static pf_sfSound_Stop sfSound_Stop; - static pf_sfSound_SetBuffer sfSound_SetBuffer; - static pf_sfSound_GetBuffer sfSound_GetBuffer; - static pf_sfSound_SetLoop sfSound_SetLoop; - static pf_sfSound_GetLoop sfSound_GetLoop; - static pf_sfSound_GetPlayingOffset sfSound_GetPlayingOffset; - static pf_sfSound_SetPlayingOffset sfSound_SetPlayingOffset; - } - - static this() - { - debug - DllLoader dll = DllLoader.load("csfml-audio-d-2"); - else - DllLoader dll = DllLoader.load("csfml-audio-2"); - - sfSound_Play = cast(pf_sfSound_Play)dll.getSymbol("sfSound_Play"); - sfSound_Pause = cast(pf_sfSound_Pause)dll.getSymbol("sfSound_Pause"); - sfSound_Stop = cast(pf_sfSound_Stop)dll.getSymbol("sfSound_Stop"); - sfSound_SetBuffer = cast(pf_sfSound_SetBuffer)dll.getSymbol("sfSound_SetBuffer"); - sfSound_GetBuffer = cast(pf_sfSound_GetBuffer)dll.getSymbol("sfSound_GetBuffer"); - sfSound_SetLoop = cast(pf_sfSound_SetLoop)dll.getSymbol("sfSound_SetLoop"); - sfSound_GetLoop = cast(pf_sfSound_GetLoop)dll.getSymbol("sfSound_GetLoop"); - sfSound_GetPlayingOffset = cast(pf_sfSound_GetPlayingOffset)dll.getSymbol("sfSound_GetPlayingOffset"); - sfSound_SetPlayingOffset = cast(pf_sfSound_SetPlayingOffset)dll.getSymbol("sfSound_SetPlayingOffset"); - } -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/audio/soundbuffer.d b/bindings/d/import/dsfml/audio/soundbuffer.d deleted file mode 100644 index b2793f7b..00000000 --- a/bindings/d/import/dsfml/audio/soundbuffer.d +++ /dev/null @@ -1,205 +0,0 @@ -/* - * DSFML - SFML Library wrapper for the D programming language. - * Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) - * Copyright (C) 2010 Andreas Hollandt - * - * This software is provided 'as-is', without any express or - * implied warranty. In no event will the authors be held - * liable for any damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute - * it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; - * you must not claim that you wrote the original software. - * If you use this software in a product, an acknowledgment - * in the product documentation would be appreciated but - * is not required. - * - * 2. Altered source versions must be plainly marked as such, - * and must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any - * source distribution. - */ - -module dsfml.audio.soundbuffer; - -import dsfml.system.common; -import dsfml.system.exception; -import dsfml.system.stringutil; - - -/** - * SoundBuffer is the low-level for loading and manipulating - * sound buffers - */ -class SoundBuffer : DSFMLObject -{ - /** - * Load the sound buffer from a file - * - * Params: - * filename = Path of the sound file to load - * - * Throws: - * LoadingException on failure - */ - this(string filename) - { - if (filename is null || filename.length == 0) - throw new LoadingException("LoadingException : Filename is invalid."); - - super(sfSoundBuffer_CreateFromFile(toStringz(filename))); - } - - /** - * Load the sound buffer from a file in memory - * - * Params: - * data = Array of file data in memory - * - * Throws: - * LoadingException on failure - */ - this(byte[] data) - { - if (data is null || data.length == 0) - throw new Exception("LoadingException : Memory stream is invalid."); - - super(sfSoundBuffer_CreateFromMemory(data.ptr, data.length)); - } - - /** - * Load the sound buffer from an array of samples - assumed format for - * samples is 16 bits signed integer - * - * Params: - * samples = Array of samples in memory - * channelsCount = Number of channels (1 = mono, 2 = stereo, ...) - * sampleRate = Frequency (number of samples to play per second) - * - * Throws: - * LoadingException on failure - */ - this(const(short)[] samples, uint channelsCount, uint sampleRate) - { - if (samples is null || samples.length == 0) - throw new Exception("LoadingException : Samples array is invalid."); - - super(sfSoundBuffer_CreateFromSamples(samples.ptr, samples.length, channelsCount, sampleRate)); - } - - override void dispose() - { - sfSoundBuffer_Destroy(m_ptr); - } - - - - /** - * Save the sound buffer to a file - * - * Params: - * filename = Path of the sound file to write - * - * Returns: - * True if saving has been successful - */ - bool saveToFile(string filename) - { - if (filename !is null && filename.length > 0 ) - { - return cast(bool)sfSoundBuffer_SaveToFile(m_ptr, toStringz(filename)); - } - return false; - } - -@property -{ - /** - * Return the sound samples - * - * Returns: - * Array of sound samples, in 16 bits signed integer format - */ - short[] samples() - { - short* temp = null; - temp = sfSoundBuffer_GetSamples(m_ptr); - - return temp is null ? null : temp[0..samplesCount()]; - } - - /** - * Return the samples count - * - * Returns: - * Number of samples - */ - size_t samplesCount() - { - return sfSoundBuffer_GetSamplesCount(m_ptr); - } - - /** - * Get the sample rate - * - * Returns: - * Sound frequency (number of samples per second) - */ - uint sampleRate() - { - return sfSoundBuffer_GetSampleRate(m_ptr); - } - - /** - * Return the number of channels (1 = mono, 2 = stereo, ...) - * - * Returns: - * Number of channels - */ - uint channelsCount() - { - return sfSoundBuffer_GetChannelsCount(m_ptr); - } - - /** - * Get the sound duration - * - * Returns: - * Sound duration, in seconds - */ - float duration() - { - return sfSoundBuffer_GetDuration(m_ptr); - } -} - -package: - this(SFMLClass ptr) - { - super(ptr, true); - } - -private: - - static extern(C) - { - SFMLClass function(cchar*) sfSoundBuffer_CreateFromFile; - SFMLClass function(const(byte)*, size_t) sfSoundBuffer_CreateFromMemory; - SFMLClass function(const(short)*, size_t, uint, uint) sfSoundBuffer_CreateFromSamples; - void function(SFMLClass) sfSoundBuffer_Destroy; - int function(SFMLClass, cchar*) sfSoundBuffer_SaveToFile; - short* function(SFMLClass) sfSoundBuffer_GetSamples; - size_t function(SFMLClass) sfSoundBuffer_GetSamplesCount; - uint function(SFMLClass) sfSoundBuffer_GetSampleRate; - uint function(SFMLClass) sfSoundBuffer_GetChannelsCount; - float function(SFMLClass) sfSoundBuffer_GetDuration; - } - - mixin(loadFromSharedLib2("csfml-audio", "sfSoundBuffer", - "CreateFromFile", "CreateFromMemory", "CreateFromSamples", "Destroy", "SaveToFile", "GetSamples", "GetSamplesCount", - "GetSampleRate", "GetChannelsCount", "GetDuration")); -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/audio/soundbufferrecorder.d b/bindings/d/import/dsfml/audio/soundbufferrecorder.d deleted file mode 100644 index caf1fc50..00000000 --- a/bindings/d/import/dsfml/audio/soundbufferrecorder.d +++ /dev/null @@ -1,109 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.audio.soundbufferrecorder; - -import dsfml.system.common; - -import dsfml.audio.soundbuffer; -import dsfml.audio.soundrecorder; - -/** -* Specialized sfSoundRecorder which saves the captured -* audio data into a sound buffer -*/ -class SoundBufferRecorder : SoundRecorder -{ - /** - * Constructor - */ - this() - { - super(sfSoundBufferRecorder_Create()); - } - - override void dispose() - { - sfSoundBufferRecorder_Destroy(m_ptr); - } - - /** - * Get the sound buffer containing the captured audio data - * - * Returns: - * SoundBuffer containing the captured audio data - * - */ - SoundBuffer getBuffer() - { - return new SoundBuffer(sfSoundBufferRecorder_GetBuffer(m_ptr)); - } - -protected: - - override bool onStart() - { - return true; - } - - override bool onProcessSamples(short[] s) - { - return true; - } - - override void onStop() - { - - } - -private: - -// External ==================================================================== - - extern (C) - { - typedef SFMLClass function() pf_sfSoundBufferRecorder_Create; - typedef void function(SFMLClass) pf_sfSoundBufferRecorder_Destroy; - typedef SFMLClass function(SFMLClass) pf_sfSoundBufferRecorder_GetBuffer; - - static pf_sfSoundBufferRecorder_Create sfSoundBufferRecorder_Create; - static pf_sfSoundBufferRecorder_Destroy sfSoundBufferRecorder_Destroy; - static pf_sfSoundBufferRecorder_GetBuffer sfSoundBufferRecorder_GetBuffer; - } - - static this() - { - debug - DllLoader dll = DllLoader.load("csfml-audio-d-2"); - else - DllLoader dll = DllLoader.load("csfml-audio-2"); - - sfSoundBufferRecorder_Create = cast(pf_sfSoundBufferRecorder_Create)dll.getSymbol("sfSoundBufferRecorder_Create"); - sfSoundBufferRecorder_Destroy = cast(pf_sfSoundBufferRecorder_Destroy)dll.getSymbol("sfSoundBufferRecorder_Destroy"); - sfSoundBufferRecorder_GetBuffer = cast(pf_sfSoundBufferRecorder_GetBuffer)dll.getSymbol("sfSoundBufferRecorder_GetBuffer"); - } -} - diff --git a/bindings/d/import/dsfml/audio/soundrecorder.d b/bindings/d/import/dsfml/audio/soundrecorder.d deleted file mode 100644 index 8a2562f1..00000000 --- a/bindings/d/import/dsfml/audio/soundrecorder.d +++ /dev/null @@ -1,316 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.audio.soundrecorder; - -import dsfml.audio.soundbuffer; - -import dsfml.system.alloc; -import dsfml.system.common; - -import dsfml.system.linkedlist; -import dsfml.system.lock; - -import core.thread; -import core.sync.mutex; - -/** -* SoundRecorder is an interface for capturing sound data. -* -* $(B onProcessSamples and onStop will be called by a different thread, take care of synchronization issues.) -* -* Examples: -* ------- -* class MySoundRecorder : SoundRecorder -* { -* this() -* { -* -* } -* -* protected bool onStart() -* { -* return true; -* } -* -* protected void onStop() -* { -* -* } -* -* protected bool onProcessSamples(out short[]) -* { -* // Process data here -* -* return true; //return true to continue capture, else return false -* } -* } -* ------- -*/ -abstract class SoundRecorder : DSFMLObject -{ - override void dispose() - { - if (m_flag) - stop(); - - m_instances.remove(m_id); - sfSoundRecorder_Destroy(m_ptr); - } - - - /** - * Start the capture. - * - * Only one capture can happen at the same time - * - * Params: - * sampleRate : Sound frequency (the more samples, the higher the quality) - * (44100 by default = CD quality) - */ - void start(uint sampleRate = 44100) - { - sfSoundRecorder_Start(m_ptr, sampleRate); - m_t = new Thread(&threadPoll); - m_t.start(); - } - - /** - * Stop the capture - */ - void stop() - { - sfSoundRecorder_Stop(m_ptr); - m_flag = false; - m_t.join(); - m_t = null; - } - - /** - * Get the sample rate - * - * Returns: - * Frequency, in samples per second - */ - uint getSampleRate() - { - return sfSoundRecorder_GetSampleRate(m_ptr); - } - - /** - * Tell if the system supports sound capture. - * If not, this class won't be usable - * - * Returns: - * True if audio capture is supported - * - */ - static bool isAvailable() - { - return cast(bool) sfSoundRecorder_IsAvailable(); - } - -protected: - /** - * Protected constructor - */ - this() - { - m_id = ++seed; - m_instances[m_id] = this; - super(sfSoundRecorder_Create(&internalOnStart, &internalCallback, &internalOnStop, &m_id)); - - init(true); - } - - this(SFMLClass ptr) - { - super(ptr); - - init(false); - } - - /** - * Start recording audio data - * - * Returns: - * False to abort recording audio data, true to start - */ - abstract bool onStart(); - - /** - * Stop recording audio data - */ - abstract void onStop(); - - /** - * callback function - * - * Parameters: - * samples = Array of samples - * - * Returns: - * true to continue recording, false to stop. - */ - abstract bool onProcessSamples(short[] samples); - - bool m_disposed; -private: - /* - * an init function to initialize id of the object. - */ - void init(bool flag) - { - if (flag) - { - m_list = new LinkedList!(Samples)(); - - m_flag = true; - m_continue = true; - - m_mutex = new Mutex(); - } - } - - void* m_userData; - int m_id; - - static int seed = 0; - static SoundRecorder[int] m_instances; - - /* - * Extern C callback function - * - * This function must be static for C interop. To retrieve the current - * instance, we retrieve id of the sender in the user data, and search associated instance - * in the associative array. - * - * We don't call delegate or derived class on that thread because GC is not aware of this thread - * instead we enqueue data informations in a queue and poll this queue with a managed thread. - */ - extern(C) static int internalCallback(short* s, size_t size, void* user) - { - int id; - // retrieve instance - if ((id = *cast(int*)(user)) in m_instances) - { - SoundRecorder temp = m_instances[id]; - scope Lock l = new Lock(temp.m_mutex); - if (temp.m_continue) - // this new is allowed because Samples is an custom alloc class. - temp.m_list.enqueue(new Samples(s, size)); - return temp.m_continue; - } - return false; - } - - extern(C) static int internalOnStart(void* user) - { - int id; - bool ret = false; - if ((id = *cast(int*)(user)) in m_instances) - { - SoundRecorder temp = m_instances[id]; - ret = temp.onStart(); - } - - return ret; - } - - extern(C) static void internalOnStop(void* user) - { - // Nothing to do - } - - /* - * Managed thread loop - */ - void threadPoll() - { - while (m_flag) - { - Thread.sleep(50_000_0); // 50ms - // if samples are available - if (!m_list.empty) - { - // Lock ressources - scope Lock l = new Lock(m_mutex); - - Samples s = m_list.dequeue; - m_continue = this.onProcessSamples(s.data[0..s.length].dup); - - delete s; - - if (!m_continue) - { - // delete all samples left - foreach(Samples dummy; m_list) - delete dummy; - break; - } - } - } - - onStop(); - } - - Mutex m_mutex; - - bool m_flag; - bool m_continue = true; - LinkedList!(Samples) m_list; - Thread m_t; - -// External ==================================================================== - - static extern (C) - { - SFMLClass function(int function(void*), int function(const(short)*, size_t, void*), void function(void*), void*) sfSoundRecorder_Create; - void function(SFMLClass) sfSoundRecorder_Destroy; - void function(SFMLClass, uint SampleRate) sfSoundRecorder_Start; - void function(SFMLClass) sfSoundRecorder_Stop; - uint function(SFMLClass) sfSoundRecorder_GetSampleRate; - int function() sfSoundRecorder_IsAvailable; - } - - mixin(loadFromSharedLib2("csfml-audio", "sfSoundRecorder", "Create", "Destroy", "Start", - "Stop", "GetSampleRate", "IsAvailable")); -} - -// Use explicit alloc to allow instaciation by C thread -private class Samples -{ - mixin Alloc; - - this(short* data, size_t length) - { - this.data = data; - this.length = length; - } - - public short* data; - public size_t length; -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/audio/soundsource.d b/bindings/d/import/dsfml/audio/soundsource.d deleted file mode 100644 index 64b9d2ba..00000000 --- a/bindings/d/import/dsfml/audio/soundsource.d +++ /dev/null @@ -1,311 +0,0 @@ -/* - * DSFML - SFML Library wrapper for the D programming language. - * Copyright (C) 2010 Andreas Hollandt - * - * This software is provided 'as-is', without any express or - * implied warranty. In no event will the authors be held - * liable for any damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute - * it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; - * you must not claim that you wrote the original software. - * If you use this software in a product, an acknowledgment - * in the product documentation would be appreciated but - * is not required. - * - * 2. Altered source versions must be plainly marked as such, - * and must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any - * source distribution. - */ - -module dsfml.audio.soundsource; - -import dsfml.system.vector; -import dsfml.system.common; - - -/// the sound's current status -enum SoundStatus -{ - Stopped, /// Sound is not playing - Paused, /// Sound is paused - Playing /// Sound is playing -} - -/// base class -package class SoundSource(alias derivedClassName) : DSFMLObject -{ -protected: - - /** - * Default constructor - * - * This constructor is meant ot be called by derived classes only. - * - */ - this() - { - super(sfSoundSource_Create()); - } - - this(SFMLClass ptr) - { - super(ptr); - } - - override void dispose() - { - sfSoundSource_Destroy(m_ptr); - } - -public: - - /** - * Set the 3D position of the sound in the audio scene - * - * Only sounds with one channel (mono sounds) can be spatialized. - * The default position of a sound is (0, 0, 0). - * - * Params: - * x = X coordinate of the position of the sound in the scene - * y = Y coordinate of the position of the sound in the scene - * z = Z coordinate of the position of the sound in the scene - */ - void setPosition(float x, float y, float z) - { - sfSoundSource_SetPosition(m_ptr, x, y, z); - } - -@property -{ - /** - * Get the current status of the sound (stopped, paused, playing) - * - * Returns: - * current status of the sound - */ - SoundStatus status() - { - return sfSoundSource_GetStatus(m_ptr); - } - - /** - * Set the pitch of the sound - * - * The pitch represents the perceived fundamental frequency - * of a sound; thus you can make a sound more acute or grave - * by changing its pitch. A side effect of changing the pitch - * is to modify the playing speed of the sound as well. - * The default value for the pitch is 1. - * - * Params: - * pitch = New pitch to apply to the sound - */ - void pitch(float pitch) - { - sfSoundSource_SetPitch(m_ptr, pitch); - } - - /** - * Get the pitch of the sound - * - * Returns: - * pitch of the sound - */ - float pitch() - { - return sfSoundSource_GetPitch(m_ptr); - } - - /** - * Set the volume of the sound - * - * The volume is a value between 0 (mute) and 100 (full volume). - * The default value for the volume is 100. - * - * Params: - * volume = volume of the sound - */ - void volume(float volume) - in - { - assert(volume >= 0 && volume <= 100); - } - body - { - sfSoundSource_SetVolume(m_ptr, volume); - } - - /** - * Get the volume of the sound - * - * Returns: - * Volume of the sound, in the range [0, 100] - */ - float volume() - { - return sfSoundSource_GetVolume(m_ptr); - } - - /** - * Set the 3D position of the sound in the audio scene - * - * Only sounds with one channel (mono sounds) can be - * spatialized. - * The default position of a sound is (0, 0, 0). - * - * Params: - * position = Position of the sound in the scene - */ - void position(Vector3f position) - { - sfSoundSource_SetPosition(m_ptr, position.x, position.y, position.z); - } - - /** - * Get the 3D position of the sound in the audio scene - * - * Returns: - * Position of the sound - */ - Vector3f position() - { - Vector3f ret; - sfSoundSource_GetPosition(m_ptr, &ret.x, &ret.y, &ret.z); - return ret; - } - - /** - * Make the sound's position relative to the listener or absolute - * - * Making a sound relative to the listener will ensure that it will always - * be played the same way regardless the position of the listener. - * This can be useful for non-spatialized sounds, sounds that are - * produced by the listener, or sounds attached to it. - * The default value is false (position is absolute). - * - * Params: - * relative = True to set the position relative, false to set it absolute - */ - void relativeToListener(bool relative) - { - sfSoundSource_SetRelativeToListener(m_ptr, relative); - } - - /** - * Tell whether the sound's position is relative to the listener or is absolute - * - * Returns: - * True if the position is relative, false if it's absolute - */ - bool relativeToListener() - { - return sfSoundSource_IsRelativeToListener(m_ptr); - } - - /** - * Set the minimum distance of the sound - * - * The "minimum distance" of a sound is the maximum - * distance at which it is heard at its maximum volume. Further - * than the minimum distance, it will start to fade out according - * to its attenuation factor. A value of 0 ("inside the head - * of the listener") is an invalid value and is forbidden. - * The default value of the minimum distance is 1. - * - * Params: - * distance = New minimum distance of the sound - * - * \see GetMinDistance, SetAttenuation - * - */ - void minDistance(float distance) - { - sfSoundSource_SetMinDistance(m_ptr, distance); - } - - /** - * Get the minimum distance of the sound - * - * Returns: - * Minimum distance of the sound - * - * \see SetMinDistance, GetAttenuation - * - */ - float minDistance() - { - return sfSoundSource_GetMinDistance(m_ptr); - } - - /** - * Set the attenuation factor of the sound - * - * The attenuation is a multiplicative factor which makes - * the sound more or less loud according to its distance - * from the listener. An attenuation of 0 will produce a - * non-attenuated sound, i.e. its volume will always be the same - * whether it is heard from near or from far. On the other hand, - * an attenuation value such as 100 will make the sound fade out - * very quickly as it gets further from the listener. - * The default value of the attenuation is 1. - * - * Params: - * attenuation = New attenuation factor of the sound - * - * \see GetAttenuation, SetMinDistance - * - */ - void attenuation(float attenuation) - { - sfSoundSource_SetAttenuation(m_ptr, attenuation); - } - - /** - * Get the attenuation factor of the sound - * - * Returns: - * Attenuation factor of the sound - * - * \see SetAttenuation, GetMinDistance - * - */ - float attenuation() - { - return sfSoundSource_GetAttenuation(m_ptr); - } -} // of @property - - -private: - - static extern(C) - { - SFMLClass function() sfSoundSource_Create; - void function(SFMLClass) sfSoundSource_Destroy; - - SoundStatus function(SFMLClass) sfSoundSource_GetStatus; - void function(SFMLClass, float) sfSoundSource_SetPitch; - void function(SFMLClass, float) sfSoundSource_SetVolume; - void function(SFMLClass, float, float, float) sfSoundSource_SetPosition; - float function(SFMLClass) sfSoundSource_GetPitch; - float function(SFMLClass) sfSoundSource_GetVolume; - void function(SFMLClass, float*, float*, float*) sfSoundSource_GetPosition; - float function(SFMLClass) sfSoundSource_GetMinDistance; - float function(SFMLClass) sfSoundSource_GetAttenuation; - void function(SFMLClass, float) sfSoundSource_SetMinDistance; - void function(SFMLClass, float) sfSoundSource_SetAttenuation; - - void function(SFMLClass, bool) sfSoundSource_SetRelativeToListener; - bool function(SFMLClass) sfSoundSource_IsRelativeToListener; - } - - mixin(loadDerivedFromSharedLib("csfml-audio", "sfSoundSource", derivedClassName, - "Create", "Destroy", "GetStatus", "GetPitch", "SetPitch", "GetVolume", "SetVolume", "GetPosition", "SetPosition", - "GetMinDistance", "SetMinDistance", "GetAttenuation", "SetAttenuation", "SetRelativeToListener", "IsRelativeToListener")); -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/audio/soundstream.d b/bindings/d/import/dsfml/audio/soundstream.d deleted file mode 100644 index 8fb4d060..00000000 --- a/bindings/d/import/dsfml/audio/soundstream.d +++ /dev/null @@ -1,384 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.audio.soundstream; - -import dsfml.system.alloc; -import dsfml.system.common; -import dsfml.system.vector; -import dsfml.system.linkedlist; -import dsfml.system.lock; - -import core.thread; -import core.sync.mutex; - -import dsfml.audio.sound; -import dsfml.audio.soundsource; - -/** -* SoundStream is a streamed sound, ie samples are acquired -* while the sound is playing. Use it for big sounds that would -* require hundreds of MB in memory, or for streaming sound from the network. -* -* SoundStream is a base class and cannot be instanciated directly. -* -* $(B onGetData override will be called by a different thread, take care of synchronization issues.) onStart is called by the thread which called .play(). -* -* ------------------------ -* class MySoundStream : SoundStream -* { -* this() -* { -* super(2, 44100); // you need to initialize the base class before any operation. -* } -* protected bool onGetData(out short[] data) -* { -* //You need to fill data array with some samples -* -* return true; //or false if you want to stop playback -* } -* -* protected bool onStart() -* { -* return true; -* } -* } -* ------------------------ -*/ -abstract class SoundStream : SoundSource!("sfSoundStream") -{ - override void dispose() - { - stop(); - sfSoundStream_Destroy(m_ptr); - s_instances.remove(m_id); - } - - /** - * Start playing the stream - */ - void play() - { - m_flag = true; - sfSoundStream_Play(m_ptr); - - if (status != SoundStatus.Paused) - { - m_t = new Thread(&threadPoll); - m_t.start(); - } - } - - /** - * Pause the stream - */ - void pause() - { - sfSoundStream_Pause(m_ptr); - } - - /** - * Stop the stream - */ - void stop() - { - m_flag = false; - sfSoundStream_Stop(m_ptr); - m_t.join(); - if (m_dummy !is null) - delete m_dummy; - } - -@property -{ - /** - * Get number of channels of the stream - * - * Returns: - * number of channels - */ - uint channelsCount() - { - return m_channelsCount; - } - - /** - * Get the sample rate of the stream - * - * Returns: - * sample rate - */ - uint sampleRate() - { - return m_sampleRate; - } - - /** - * Get the current playing offset of the stream - * - * Returns: - * current playing offset, in seconds. - */ - float playingOffset() - { - return sfSoundStream_GetPlayingOffset(m_ptr); - } - - /** - * Set the current playing position of a music - * - * Params: - * timeOffset = New playing position, expressed in seconds - */ - void playingOffset(float timeOffset) - { - sfSoundStream_SetPlayingOffset(m_ptr, timeOffset); - } - - /** - * Tell whether or not the stream is looping - * - * Returns: - * True if the music is looping, false otherwise - */ - bool loop() - { - if (m_ptr !is null) - return cast(bool)sfSoundStream_GetLoop(m_ptr); - return false; - } - - /** - * Set the stream loop state. - * - * Disabled by default. - * - * Params: - * loop = true to play in loop, false to play once - */ - void loop(bool loop) - { - if (m_ptr !is null) - sfSoundStream_SetLoop(m_ptr, loop); - } -} // of @property - -protected: - /** - * Protected constructor - * - * Params: - * channelsCount = number of channel - * sampleRate = sample rate of the stream - * - */ - this(uint channelsCount, uint sampleRate) - { - m_channelsCount = channelsCount; - m_sampleRate = sampleRate; - - super(sfSoundStream_Create(&externalOnGetData, &externalOnSeek, channelsCount, sampleRate, &m_id)); - - m_mutex = new Mutex(); - - m_samples = new LinkedList!(Data); - - m_t = new Thread(&this.threadPoll); - - m_id = ++s_seed; - s_instances[m_id] = this; - } - - /** - * Called each time the stream is seeked - */ - abstract void onSeek(float timeOffset); - - /** - * Called each time the stream needs new data. - * This method will be call by an other thread, take care of possible synchronisation issues. - * - * Params: - * data = array of samples to stream - * - * Returns: - * true to continue streaming, false to stop - */ - abstract bool onGetData(out short[] data); -private: - - // Called sync when user calling play() - // TODO: check if it's correct that way - extern(C) static void externalOnSeek(float t, void* user) - { - int id; - if ((id = *cast(int*) user) in s_instances) - { - SoundStream temp = s_instances[id]; - return (temp.onSeek(t)); - } - } - - // C Thread callback (no allocation can be done) - extern (C) static int externalOnGetData(sfSoundStreamChunk* data, void* user) - { - int id, flag = false; - // Get calling soundStream - if ((id = *cast(int*) user) in s_instances) - { - SoundStream temp = s_instances[id]; - //if no samples are available but streaming is not stopped, we sleep the thread - while (temp.m_samples.empty && temp.m_flag) - Thread.sleep(10_000_0); // 10ms - - scope Lock l = new Lock(temp.m_mutex); - if (!temp.m_samples.empty) - { - if (temp.m_dummy !is null) - delete temp.m_dummy; - - temp.m_dummy = temp.m_samples.dequeue; - - if ((flag = temp.m_dummy.Flag) == true) - { - data.Samples = temp.m_dummy.Samples.ptr; - data.NbSamples = temp.m_dummy.Samples.length; - } - else - { - data.Samples = null; - data.NbSamples = 0; - } - } - } - return flag; - } - - // Managed thread loop - void threadPoll() - { - short[] data; - bool ret = true; - // while streaming is active ... - while (ret && m_flag) - { - { - scope Lock l = new Lock(m_mutex); - // see how many samples are available (keep always 2 samples ready) - if (m_samples.getCount < 2) - { - // if we need new samples, lock and call derived class - ret = onGetData(data); - m_samples.enqueue(new Data(data, ret)); - } - } - Thread.sleep(100_000_0); // 100ms - } - } - - private class Data - { - short[] Samples; - bool Flag; - - mixin Alloc; - - this (short[] samples, bool flag) - { - this.Samples = samples; - this.Flag = flag; - } - } - - Thread m_t; - Mutex m_mutex; - LinkedList!(Data) m_samples; - Data m_dummy; - - bool m_flag; - - uint m_channelsCount; - uint m_sampleRate; - - int m_id; - static SoundStream[int] s_instances; - static int s_seed = 0; - -// External ==================================================================== - - extern (C) - { - struct sfSoundStreamChunk{ short* Samples; uint NbSamples; } - - alias void function(float, void*) sfSoundStreamSeekCallback; - alias int function (sfSoundStreamChunk*, void*) sfSoundStreamGetDataCallback; - - alias SFMLClass function(sfSoundStreamGetDataCallback, sfSoundStreamSeekCallback, uint, uint, void*) pf_sfSoundStream_Create; - alias void function(SFMLClass) pf_sfSoundStream_Destroy; - alias void function(SFMLClass) pf_sfSoundStream_Play; - alias void function(SFMLClass) pf_sfSoundStream_Pause; - alias void function(SFMLClass) pf_sfSoundStream_Stop; - alias uint function(SFMLClass) pf_sfSoundStream_GetChannelsCount; - alias uint function(SFMLClass) pf_sfSoundStream_GetSampleRate; - alias float function(SFMLClass) pf_sfSoundStream_GetPlayingOffset; - alias void function(SFMLClass, float) pf_sfSoundStream_SetPlayingOffset; - alias int function(SFMLClass) pf_sfSoundStream_GetLoop; - alias void function(SFMLClass, int) pf_sfSoundStream_SetLoop; - - - static pf_sfSoundStream_Create sfSoundStream_Create; - static pf_sfSoundStream_Destroy sfSoundStream_Destroy; - static pf_sfSoundStream_Play sfSoundStream_Play; - static pf_sfSoundStream_Pause sfSoundStream_Pause; - static pf_sfSoundStream_Stop sfSoundStream_Stop; - static pf_sfSoundStream_GetChannelsCount sfSoundStream_GetChannelsCount; - static pf_sfSoundStream_GetSampleRate sfSoundStream_GetSampleRate; - static pf_sfSoundStream_GetPlayingOffset sfSoundStream_GetPlayingOffset; - static pf_sfSoundStream_SetPlayingOffset sfSoundStream_SetPlayingOffset; - static pf_sfSoundStream_GetLoop sfSoundStream_GetLoop; - static pf_sfSoundStream_SetLoop sfSoundStream_SetLoop; - } - - static this() - { - debug - DllLoader dll = DllLoader.load("csfml-audio-d-2"); - else - DllLoader dll = DllLoader.load("csfml-audio-2"); - - sfSoundStream_Create = cast(pf_sfSoundStream_Create)dll.getSymbol("sfSoundStream_Create"); - sfSoundStream_Destroy = cast(pf_sfSoundStream_Destroy)dll.getSymbol("sfSoundStream_Destroy"); - sfSoundStream_Play = cast(pf_sfSoundStream_Play)dll.getSymbol("sfSoundStream_Play"); - sfSoundStream_Pause = cast(pf_sfSoundStream_Pause)dll.getSymbol("sfSoundStream_Pause"); - sfSoundStream_Stop = cast(pf_sfSoundStream_Stop)dll.getSymbol("sfSoundStream_Stop"); - sfSoundStream_GetChannelsCount = cast(pf_sfSoundStream_GetChannelsCount)dll.getSymbol("sfSoundStream_GetChannelsCount"); - sfSoundStream_GetSampleRate = cast(pf_sfSoundStream_GetSampleRate)dll.getSymbol("sfSoundStream_GetSampleRate"); - sfSoundStream_GetPlayingOffset = cast(pf_sfSoundStream_GetPlayingOffset)dll.getSymbol("sfSoundStream_GetPlayingOffset"); - sfSoundStream_SetPlayingOffset = cast(pf_sfSoundStream_SetPlayingOffset)dll.getSymbol("sfSoundStream_SetPlayingOffset"); - sfSoundStream_GetLoop = cast(pf_sfSoundStream_GetLoop)dll.getSymbol("sfSoundStream_GetLoop"); - sfSoundStream_SetLoop = cast(pf_sfSoundStream_SetLoop)dll.getSymbol("sfSoundStream_SetLoop"); - } -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/graphics/all.d b/bindings/d/import/dsfml/graphics/all.d deleted file mode 100644 index 9fc102ce..00000000 --- a/bindings/d/import/dsfml/graphics/all.d +++ /dev/null @@ -1,41 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.graphics.all; - -public import - dsfml.graphics.blendmode, - dsfml.graphics.color, - dsfml.graphics.font, - dsfml.graphics.idrawable, - dsfml.graphics.image, - dsfml.graphics.shader, - dsfml.graphics.rect, - dsfml.graphics.renderwindow, - dsfml.graphics.shape, - dsfml.graphics.sprite, - dsfml.graphics.text, - dsfml.graphics.view; diff --git a/bindings/d/import/dsfml/graphics/blendmode.d b/bindings/d/import/dsfml/graphics/blendmode.d deleted file mode 100644 index fcb91e74..00000000 --- a/bindings/d/import/dsfml/graphics/blendmode.d +++ /dev/null @@ -1,38 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.graphics.blendmode; - -/** -* Enumerate the blending modes for drawable objects. -*/ -enum BlendMode -{ - ALPHA, /// Pixel = Src * a + Dest * (1 - a) - ADD, /// Pixel = Src + Dest - MULTIPLY, /// Pixel = Src * Dest - NONE /// No blending -} diff --git a/bindings/d/import/dsfml/graphics/color.d b/bindings/d/import/dsfml/graphics/color.d deleted file mode 100644 index 8750fd7a..00000000 --- a/bindings/d/import/dsfml/graphics/color.d +++ /dev/null @@ -1,123 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.graphics.color; - -import std.string; - -alias RGBA Color; // standard Color is RGBA - -/** - * Color is an utility structure for manipulating colors - */ -struct RGBA -{ -align(1): - ubyte r; /// Red component - ubyte g; /// Green component - ubyte b; /// Blue component - ubyte a = 255; /// Alpha (transparency) component, 255 = opaque - - /** - * Operator == and != overload to compare two colors - */ - const bool opEquals(ref const(Color) color2) - { - return - (r == color2.r) - && (g == color2.g) - && (b == color2.b) - && (a == color2.a); - } - /** - * Operator + overload to add two colors - */ - Color opAdd(Color color2) - { - ubyte r = this.r + color2.r > 255 ? 255 : cast(ubyte) (this.r + color2.r); - ubyte g = this.g + color2.g > 255 ? 255 : cast(ubyte) (this.g + color2.g); - ubyte b = this.b + color2.b > 255 ? 255 : cast(ubyte) (this.b + color2.b); - ubyte a = this.a + color2.a > 255 ? 255 : cast(ubyte) (this.a + color2.a); - - return Color(r, g, b, a); - } - - /** - * Operator += overload - */ - Color opAddAssign(Color color2) - { - this.r = this.r + color2.r > 255 ? 255 : cast(ubyte) (this.r + color2.r); - this.g = this.g + color2.g > 255 ? 255 : cast(ubyte) (this.g + color2.g); - this.b = this.b + color2.b > 255 ? 255 : cast(ubyte) (this.b + color2.b); - this.a = this.a + color2.a > 255 ? 255 : cast(ubyte) (this.a + color2.a); - - return this; - } - - /** - * Operator * overload to modulate colors - */ - Color opMul(Color color2) - { - ubyte r = cast(ubyte) (this.r * color2.r / 255); - ubyte g = cast(ubyte) (this.g * color2.g / 255); - ubyte b = cast(ubyte) (this.b * color2.b / 255); - ubyte a = cast(ubyte) (this.a * color2.a / 255); - - return Color(r, g, b, a); - } - - /** - * Operator *= overload - */ - Color opMulAssign(Color color2) - { - this.r = cast(ubyte) (this.r * color2.r / 255); - this.g = cast(ubyte) (this.g * color2.g / 255); - this.b = cast(ubyte) (this.b * color2.b / 255); - this.a = cast(ubyte) (this.a * color2.a / 255); - - return this; - } - - string toString() - { - return std.string.format("(%d,%d,%d,%d)", r,g,b,a); - } - - static immutable - { - Color BLACK = Color(0, 0, 0); /// Black predefined color - Color WHITE = Color(255, 255, 255); /// White predefined color - Color RED = Color(255, 0, 0); /// Red predefined color - Color GREEN = Color(0, 255, 0); /// Green predefined color - Color BLUE = Color(0, 0, 255); /// Blue predefined color - Color YELLOW = Color(255, 0, 255); /// Yellow predefined color - Color MAGENTA = Color(255, 0, 255); /// Magenta predefined color - Color CYAN = Color(0, 255, 255); /// Cyan predefined color - } -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/graphics/drawableimpl.d b/bindings/d/import/dsfml/graphics/drawableimpl.d deleted file mode 100644 index 916876e9..00000000 --- a/bindings/d/import/dsfml/graphics/drawableimpl.d +++ /dev/null @@ -1,268 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.graphics.drawableimpl; - -public import dsfml.system.common; -import dsfml.system.vector; - -import dsfml.graphics.irendertarget; -import dsfml.graphics.idrawable, - dsfml.graphics.color, - dsfml.graphics.blendmode, - dsfml.graphics.renderwindow, - dsfml.graphics.renderimage, - dsfml.graphics.shader; - - -/* - * Package base class of all drawable. - * Provide implementation of IDrawable and functions aliases. - */ -package class DrawableImpl(string derivedClassName) : DSFMLObject, IDrawable -{ -protected: - this() - { - super(sfDrawable_Create()); - } - - this(SFMLClass ptr) - { - super(ptr, true); - } - - override void dispose() - { - sfDrawable_Destroy(m_ptr); - } - -public: - override void rotate(float angle) - { - sfDrawable_Rotate(m_ptr, angle); - } - - override void move(float offsetX, float offsetY) - { - sfDrawable_Move(m_ptr, offsetX, offsetY); - } - - override void move(Vector2f offset) - { - sfDrawable_Move(m_ptr, offset.x, offset.y); - } - - override Vector2f transformToLocal(Vector2f point) const - { - Vector2f ret; - sfDrawable_TransformToLocal(m_ptr, point.x, point.y, &ret.x, &ret.y); - return ret; - } - - override Vector2f transformToGlobal(Vector2f point) const - { - Vector2f ret; - sfDrawable_TransformToLocal(m_ptr, point.x, point.y, &ret.x, &ret.y); - return ret; - } - - override void render(IRenderTarget window) - { - sfRenderWindow_DrawThis((cast(DSFMLObject)window).nativePointer, m_ptr); - } - - override void renderWithShader(IRenderTarget window, Shader shader) - { - sfRenderWindow_DrawThisWithShader((cast(DSFMLObject)window).nativePointer, m_ptr, shader.nativePointer); - } - - override void setPosition(float x, float y) - { - sfDrawable_SetPosition(m_ptr, x, y); - } - - override void setScale(float scaleX, float scaleY) - { - sfDrawable_SetScale(m_ptr, scaleX, scaleY); - } - - override void setOrigin(float originX, float originY) - { - sfDrawable_SetOrigin(m_ptr, originX, originY); - } - -@property -{ - override void x(float x) - { - sfDrawable_SetX(m_ptr, x); - } - - override void y(float y) - { - sfDrawable_SetY(m_ptr, y); - } - - override void position(Vector2f vec) - { - sfDrawable_SetPosition(m_ptr, vec.x, vec.y); - } - - override void scaleX(float scale) - { - if (scale > 0) - sfDrawable_SetScaleX(m_ptr, scale); - } - - override void scaleY(float scale) - { - if (scale > 0) - sfDrawable_SetScaleY(m_ptr, scale); - } - - override void scale(Vector2f scale) - { - if (scale.x > 0 && scale.y > 0) - sfDrawable_SetScale(m_ptr, scale.x, scale.y); - } - - override void origin(Vector2f origin) - { - sfDrawable_SetOrigin(m_ptr, origin.x, origin.y); - } - - override void rotation(float angle) - { - sfDrawable_SetRotation(m_ptr, angle); - } - - override void color(Color c) - { - sfDrawable_SetColor(m_ptr, c); - } - - override void blendMode(BlendMode mode) - { - sfDrawable_SetBlendMode(m_ptr, mode); - } - - override Vector2f position() const - { - return Vector2f(sfDrawable_GetX(m_ptr), sfDrawable_GetY(m_ptr)); - } - - override Vector2f scale() const - { - return Vector2f(sfDrawable_GetScaleX(m_ptr), sfDrawable_GetScaleY(m_ptr)); - } - - override Vector2f origin() const - { - return Vector2f(sfDrawable_GetOriginX(m_ptr), sfDrawable_GetOriginY(m_ptr)); - } - - override float rotation() const - { - return sfDrawable_GetRotation(m_ptr); - } - - override Color color() const - { - return sfDrawable_GetColor(m_ptr); - } - - override BlendMode blendMode() const - { - return cast(BlendMode)(sfDrawable_GetBlendMode(m_ptr)); - } - - override void scale(Vector2f scale) - { - sfDrawable_SetScale(m_ptr, scale.x, scale.y); - } -} - -private: - - static extern(C) - { - SFMLClass function() sfDrawable_Create; - void function(SFMLClass) sfDrawable_Destroy; - void function(SFMLClass, float) sfDrawable_SetX; - void function(SFMLClass, float) sfDrawable_SetY; - void function(SFMLClass, float, float) sfDrawable_SetPosition; - void function(SFMLClass, float) sfDrawable_SetScaleX; - void function(SFMLClass, float) sfDrawable_SetScaleY; - void function(SFMLClass, float, float) sfDrawable_SetScale; - void function(SFMLClass, float) sfDrawable_SetRotation; - void function(SFMLClass, float, float) sfDrawable_SetOrigin; - void function(SFMLClass, Color) sfDrawable_SetColor; - void function(SFMLClass, BlendMode) sfDrawable_SetBlendMode; - float function(SFMLClass) sfDrawable_GetX; - float function(SFMLClass) sfDrawable_GetY; - float function(SFMLClass) sfDrawable_GetScaleX; - float function(SFMLClass) sfDrawable_GetScaleY; - float function(SFMLClass) sfDrawable_GetRotation; - float function(SFMLClass) sfDrawable_GetOriginX; - float function(SFMLClass) sfDrawable_GetOriginY; - Color function(SFMLClass) sfDrawable_GetColor; - BlendMode function(SFMLClass) sfDrawable_GetBlendMode; - void function(SFMLClass, float, float) sfDrawable_Move; - void function(SFMLClass, float, float) sfDrawable_Scale; - void function(SFMLClass, float) sfDrawable_Rotate; - void function(SFMLClass, float, float, float*, float*) sfDrawable_TransformToLocal; - void function(SFMLClass, float, float, float*, float*) sfDrawable_TransformToGlobal; - - typedef void function(SFMLClass, SFMLClass) pf_sfRenderWindow_DrawThis; - typedef void function(SFMLClass, SFMLClass, SFMLClass) pf_sfRenderWindow_DrawThisWithShader; - typedef void function(SFMLClass, SFMLClass) pf_sfRenderImage_DrawThis; - typedef void function(SFMLClass, SFMLClass, SFMLClass) pf_sfRenderImage_DrawThisWithShader; - - pf_sfRenderWindow_DrawThis sfRenderWindow_DrawThis; - pf_sfRenderWindow_DrawThisWithShader sfRenderWindow_DrawThisWithShader; - pf_sfRenderImage_DrawThis sfRenderImage_DrawThis; - pf_sfRenderImage_DrawThisWithShader sfRenderImage_DrawThisWithShader; - } - - mixin(loadDerivedFromSharedLib("csfml-graphics", "sfDrawable", derivedClassName, - "Create", "Destroy", "SetX", "SetY", "SetPosition", "SetScaleX", "SetScaleY", "SetScale", "SetRotation", "SetOrigin", "SetColor", "SetBlendMode", - "GetX", "GetY", "GetScaleX", "GetScaleY", "GetRotation", "GetOriginX", "GetOriginY", "GetColor", "GetBlendMode", "Move", - "Scale", "Rotate", "TransformToLocal", "TransformToGlobal")); - - static this() - { - debug - DllLoader dll = DllLoader.load("csfml-graphics-d-2"); - else - DllLoader dll = DllLoader.load("csfml-graphics-2"); - - sfRenderWindow_DrawThis = cast(pf_sfRenderWindow_DrawThis)dll.getSymbol("sfRenderWindow_Draw" ~ derivedClassName[2..$]); - sfRenderWindow_DrawThisWithShader = cast(pf_sfRenderWindow_DrawThisWithShader)dll.getSymbol("sfRenderWindow_Draw" ~ derivedClassName[2..$] ~ "WithShader"); - sfRenderImage_DrawThis = cast(pf_sfRenderImage_DrawThis)dll.getSymbol("sfRenderImage_Draw" ~ derivedClassName[2..$]); - sfRenderImage_DrawThisWithShader = cast(pf_sfRenderImage_DrawThisWithShader)dll.getSymbol("sfRenderImage_Draw" ~ derivedClassName[2..$] ~ "WithShader"); - } -} diff --git a/bindings/d/import/dsfml/graphics/font.d b/bindings/d/import/dsfml/graphics/font.d deleted file mode 100644 index 0cbfa045..00000000 --- a/bindings/d/import/dsfml/graphics/font.d +++ /dev/null @@ -1,193 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.graphics.font; - -import dsfml.system.common, - dsfml.system.exception, - dsfml.system.stringutil; - -import dsfml.graphics.rect, - dsfml.graphics.image; - - -/// Glyph describes a glyph (a visual character) -struct Glyph -{ - int Advance; /// Offset to move horizontically to the next character - IntRect Bounds; /// Bounding rectangle of the glyph, in coordinates relative to the baseline - IntRect SubRect; /// Texture coordinates of the glyph inside the font's image -} - -/** -* Font is the low-level class for loading and -* manipulating character fonts. -*/ -class Font : DSFMLObject -{ -private: - static Font s_default; -public: - - /** - * Get SFML default built-in font (Arial) - */ - static Font getDefaultFont() - { - if (s_default is null) - s_default = new Font(sfFont_GetDefaultFont()); - return s_default; - } - - /** - * construct the Font from a file - * - * Params: - * filename = font file to load - */ - this(string filename) - { - if (filename is null || filename.length == 0) - throw new LoadingException("LoadingException : Filename is invalid."); - - super(sfFont_CreateFromFile(toStringz(filename))); - } - - /** - * construct the Font from a file in memory - * - * Params: - * data = data to load - */ - this(ubyte[] data) - { - if (data is null || data.length == 0) - throw new Exception("LoadingException : Memory stream is invalid."); - - super(sfFont_CreateFromMemory(data.ptr, data.length)); - } - - - override void dispose() - { - sfFont_Destroy(m_ptr); - } - - /** - * get a glyph in a font - * - * Params: - * codePoint = Unicode code point of the character to get - * charSize = Reference character size - * bold = Retrieve the bold version or the regular one? - * Returns: - * The glyph corresponding to codePoint and charSize - */ - Glyph getGlyph(uint codePoint, uint charSize, bool bold) - { - return sfFont_GetGlyph(m_ptr, codePoint, charSize, bold); - } - - /** - * Get the kerning offset of two glyphs - * - * Params: - * first = Unicode code point of the first character - * second = Unicode code point of the second character - * charSize = Reference character size - * - * Returns: - * Kerning value for first and second, in pixels - */ - int getKerning(uint first, uint second, uint charSize) - { - return sfFont_GetKerning(m_ptr, first, second, charSize); - } - - /** - * Get the vertical offset to apply between two consecutive lines of text. - * - * Params: - * charSize = Reference character size - * - * Returns: - * Line spacing, in pixels - */ - int getLineSpacing(uint charSize) - { - return sfFont_GetLineSpacing(m_ptr, charSize); - } - - Image getImage(uint charSize) - { - return new Image(sfFont_GetImage(m_ptr, charSize)); - } - -package: - - this(SFMLClass ptr) - { - super(ptr, true); - } - -private: - static extern(C) - { - // sfFont - SFMLClass function() sfFont_Create; - SFMLClass function(cchar*) sfFont_CreateFromFile; - SFMLClass function(ubyte*, size_t) sfFont_CreateFromMemory; - void function(SFMLClass) sfFont_Destroy; - SFMLClass function() sfFont_GetDefaultFont; - - // DSFML2 - Glyph function(SFMLClass, uint, uint, bool) sfFont_GetGlyph; - int function(SFMLClass, uint, uint, uint) sfFont_GetKerning; - int function(SFMLClass, uint) sfFont_GetLineSpacing; - SFMLClass function(SFMLClass, uint) sfFont_GetImage; - } - - static this() - { - debug - DllLoader dll = DllLoader.load("csfml-graphics-d-2"); - else - DllLoader dll = DllLoader.load("csfml-graphics-2"); - - // sfFont - mixin(loadFromSharedLib("sfFont_CreateFromFile")); - mixin(loadFromSharedLib("sfFont_CreateFromMemory")); - mixin(loadFromSharedLib("sfFont_Destroy")); - mixin(loadFromSharedLib("sfFont_GetDefaultFont")); - - // DSFML2 - mixin(loadFromSharedLib("sfFont_GetGlyph")); - mixin(loadFromSharedLib("sfFont_GetKerning")); - mixin(loadFromSharedLib("sfFont_GetLineSpacing")); - mixin(loadFromSharedLib("sfFont_GetImage")); - - } -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/graphics/idrawable.d b/bindings/d/import/dsfml/graphics/idrawable.d deleted file mode 100644 index a96dbcbf..00000000 --- a/bindings/d/import/dsfml/graphics/idrawable.d +++ /dev/null @@ -1,283 +0,0 @@ -/* - * DSFML - SFML Library wrapper for the D programming language. - * Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) - * Copyright (C) 2010 Andreas Hollandt - * - * This software is provided 'as-is', without any express or - * implied warranty. In no event will the authors be held - * liable for any damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute - * it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; - * you must not claim that you wrote the original software. - * If you use this software in a product, an acknowledgment - * in the product documentation would be appreciated but - * is not required. - * - * 2. Altered source versions must be plainly marked as such, - * and must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any - * source distribution. - */ - -module dsfml.graphics.idrawable; - -import dsfml.system.vector; - -import dsfml.graphics.irendertarget; -import dsfml.graphics.color, - dsfml.graphics.blendmode, - dsfml.graphics.shader; - - -/** - * Interface for drawable object - * - * Shape, Text and Sprite implement IDrawable - */ -interface IDrawable -{ - /** - * Set the position of the object - * - * Params: - * x = New left coordinate - * y = New top coordinate - */ - void setPosition(float x, float y); - - /** - * Set the scale of the object - * - * Params: - * scaleX = New horizontal scale > 0 - * scaleY = New vertical scale > 0 - */ - void setScale(float scalex, float scaley); - // in {assert(scalex > 0 && scalex > 0);} // TODO: add in again when interface contracts work - - /** - * Set the origin of the object, in coordinates relative to the - * top-left of the object (take 2 values). - * The default origin is (0, 0) - * - * Params: - * originX : X coordinate of the origin - * originY : Y coordinate of the origin - */ - void setOrigin(float originX, float originY); - -@property -{ - /** - * Set the left position of the object - * - * Params: - * x = New left coordinate - */ - void x(float x); - - /** - * Set the top position of the object - * - * Params: - * y = New top coordinate - */ - void y(float y); - - /** - * Set the position of the object - * - * Params: - * vec = new position - */ - void position(Vector2f vec); - - /** - * Set the horizontal scale of the object - * - * Params: - * scale = New horizontal scale (Strictly positive) - */ - void scaleX(float scale); - - /** - * Set the vertical scale of the object - * - * Params: - * scale = New vertical scale (Strictly positive) - */ - void scaleY(float scale); - - /** - * Set the scale of the object - * - * Params: - * scale = new scale - */ - void scale(Vector2f scale); -// in {assert(scale.x > 0 && scale.y > 0);} // TODO - - /** - * Set the origin of the object, in coordinates relative to the - * top-left of the object (take a 2D vector). - * The default origin is (0, 0) - * - * Params: - * origin : New origin - */ - void origin(Vector2f origin); - - - /** - * Set the rotation of the object - * - * Params: - * angle = Angle of rotation, in degree - */ - void rotation(float angle); - - /** - * Set the color - * - * Params: - * c = New color - */ - void color(Color c); - - /** - * Set the blending mode for the object. - * The default blend mode is Blend.Alpha - * - * Params: - * mode = New blending mode - */ - void blendMode(BlendMode mode); - -const -{ - /** - * Get the position of the object - * - * Returns: - * Current position - * - */ - Vector2f position(); - - /** - * Get the current scale of the object - * - * Returns: - * Current scale - */ - Vector2f scale(); - - /** - * Get the origin of the object - * - * Returns: - * Current position of the origin - * - */ - Vector2f origin(); - - /** - * Get the rotation angle of the object - * - * Returns: - * Angle of rotation, in degree - */ - float rotation(); - - /** - * Get the color of the string - * - * Returns: - * Current color - */ - Color color(); - - /** - * Get the current blending mode - * - * Returns: - * Current blending mode - */ - BlendMode blendMode(); -} // const -} // @property - - /** - * Rotate the object - * Angle is added to the current orientation of the objet - * - * Params: - * angle = Angle of rotation in degree - */ - void rotate(float angle); - - /** - * Move the object - * New offset is added to object current position - * - * Params: - * offsetX = Offset on the X axis - * offsetY = Offset on the Y axis - */ - void move(float offsetX, float offsetY); - - /** - * Move the object - * New offset is added to object current position - * - * Params: - * offset = Amount of units to move the object of - */ - void move(Vector2f offset); - - /** - * Transform a point from global coordinates into local coordinates - * (ie it applies the inverse of object's origin, translation, rotation and scale to the point) - * - * Params: - * point = Point to transform - * - * Returns: - * Transformed point - */ - Vector2f transformToLocal(Vector2f point) const; - - /** - * Transform a point from local coordinates into global coordinates - * (ie it applies the inverse of object's origin, translation, rotation and scale to the point) - * - * Params: - * point = Point to transform - * - * Returns: - * Transformed point - */ - Vector2f transformToGlobal(Vector2f point) const; - - /** - * Render the specific geometry of the object - * - * Params: - * window = Target into which render the object - */ - void render(IRenderTarget window); - - /** - * Render the specific geometry of the object with a shader - * - * Params: - * window = Render target - * shader = Shader to use - */ - void renderWithShader(IRenderTarget window, Shader shader); -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/graphics/image.d b/bindings/d/import/dsfml/graphics/image.d deleted file mode 100644 index 42988acd..00000000 --- a/bindings/d/import/dsfml/graphics/image.d +++ /dev/null @@ -1,352 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - - -module dsfml.graphics.image; - -import dsfml.graphics.color, - dsfml.graphics.rect; -// dsfml.graphics.renderwindow; - -import dsfml.system.common, - dsfml.system.exception, - dsfml.system.stringutil; - - -/** - * Image is the low-level class for loading and - * manipulating images - */ -class Image : DSFMLObject -{ -package: - this(SFMLClass ptr) - { - super(ptr, true); - } - -public: - - /** - * Default constructor - */ - this() - { - super(sfImage_Create()); - } - - /** - * Construct an empty image - * - * Params: - * width = Image width - * height = Image height - * col = Image color (black by default) - */ - this(uint width, uint height, Color col = Color.BLACK) - { - super(sfImage_CreateFromColor(width, height, col)); - } - - /** - * Construct the image from a file - * - * Params: - * filename = Path of the image file to load - * - * Throws: - * LoadingException if filename is empty or null. - */ - this(string filename) - { - if (filename is null || filename.length == 0) - throw new LoadingException("LoadingException : Filename is invalid."); - - super(sfImage_CreateFromFile(toStringz(filename))); - } - - /** - * Construct the image from a file in memory - * - * Params: - * data = array of data in memory - * Throws: - * LoadingException if data is empty or null. - */ - this(ubyte[] data) - { - if (data is null || data.length == 0) - throw new LoadingException("Memory stream is invalid."); - - super(sfImage_CreateFromMemory(data.ptr, data.length)); - } - - /** - * Construct the image directly from an array of pixels - * - * Params: - * width = Image width - * height = Image height - * data = array of pixels in memory (assumed format is RGBA) - * - * Throws: - * LoadingException if data length doesn't match Width * Height * 4 - */ - this(uint width, uint height, ubyte[] data) - { - if (width * height * 4 != data.length) - throw new LoadingException("Pixels array length doesn't match the specified size."); - - super(sfImage_CreateFromPixels(width, height, data.ptr)); - } - - override void dispose() - { - sfImage_Destroy(m_ptr); - } - - /** - * Save the content of the image to a file - * - * Params: - * filename = Path of the file to save (overwritten if already exist) - * - * Returns: - * True if saving was successful - */ - bool saveToFile(string filename) - { - return cast(bool)sfImage_SaveToFile(m_ptr, toStringz(filename)); - } - - /** - * Create an empty image - * - * Params: - * width = Image width - * height = Image height - * col = Image color (black by default) - * - * Returns: - * True if creation was successful - */ - bool create(uint width, uint height, Color col = Color.BLACK) - { - m_ptr = sfImage_CreateFromColor(width, height, col); - return (m_ptr !is null); - } - - /** - * Create transparency mask from a specified colorkey - * - * Params: - * colorKey = Color to become transparent - * alpha = Alpha value to use for transparent pixels (0 by default) - */ - void createMaskFromColor(Color colorKey, ubyte alpha = 0) - { - sfImage_CreateMaskFromColor(m_ptr, colorKey, alpha); - } - -/+ - /** - * Create the image from the current contents of the - * given window - * - * Params: - * window = Window to capture - * sourceRect = Sub-rectangle of the screen to copy (empty by default - entire image) - * - * Returns: - * True if copy was successful - */ - bool copyScreen(RenderWindow window, IntRect sourceRect = IntRect()) - { - return cast(bool)sfImage_CopyScreen(m_ptr, window.nativePointer, sourceRect); - } -+/ - - /** - * Copy pixels from another image onto this one. - * This function does a slow pixel copy and should only - * be used at initialization time - * - * Params: - * source = Source image to copy - * destX = X coordinate of the destination position - * destY = Y coordinate of the destination position - * sourceRect = Sub-rectangle of the source image to copy - */ - void copyImage(Image source, uint destX, uint destY, IntRect sourceRect = IntRect()) - { - sfImage_CopyImage(m_ptr, source.nativePointer, destX, destY, sourceRect); - } - - /** - * Change the color of a pixel - * Don't forget to call Update when you end modifying pixels - * - * Params: - * x = X coordinate of pixel in the image - * y = Y coordinate of pixel in the image - * col = New color for pixel (X, Y) - */ - void setPixel(uint x, uint y, Color col) - { - sfImage_SetPixel(m_ptr, x, y, col); - } - - /** - * Get a pixel from the image - * - * Params: - * x = X coordinate of pixel in the image - * y = Y coordinate of pixel in the image - * - * Returns: - * Color of pixel (x, y) - */ - Color getPixel(uint x, uint y) - { - return sfImage_GetPixel(m_ptr, x, y); - } - - /** - * Get an array of pixels (8 bits integers RGBA) - * Array size is GetWidth() x GetHeight() x 4 - * This array becomes invalid if you reload or resize the image - * - * Returns: - * array of pixels - */ - ubyte[] getPixelsArray() - { - return sfImage_GetPixelsPtr(m_ptr)[0..width() * height() * 4]; - } - - /** - * Bind the image for rendering - */ - void bind() - { - sfImage_Bind(m_ptr); - } - - /** - * Update a sub-rectangle of the image from an array of pixels - * - * Warning: for performances reasons, this function doesn't - * perform any check; thus you're responsible of ensuring that - * rectangle does not exceed the image size, and that - * pixels contains enough elements. - * - * Params: - * rectangle = sub rectangle of the image to update - * pixels = array of pixels to write to the image - */ - void updatePixels(ubyte[] pixels, IntRect rectangle) - { - sfImage_UpdatePixels(m_ptr, pixels.ptr, rectangle); - } - -@property -{ - /** - * Enable or disable image smooth filter. - * This parameter is enabled by default - * - * Params: - * s = True to enable smoothing filter, false to disable it - */ - void smooth(bool s) - { - sfImage_SetSmooth(m_ptr, s); - } - - /** - * Return the width of the image - * - * Returns: - * Width in pixels - */ - uint width() - { - return sfImage_GetWidth(m_ptr); - } - - /** - * Return the height of the image - * - * Returns: - * Height in pixels - */ - uint height() - { - return sfImage_GetHeight(m_ptr); - } - - /** - * Tells whether the smooth filtering is enabled or not - * - * Returns: - * True if image smoothing is enabled - */ - bool smooth() - { - return cast(bool)sfImage_IsSmooth(m_ptr); - } -} - -private: - static extern (C) - { - SFMLClass function() sfImage_Create; - SFMLClass function(uint, uint, Color) sfImage_CreateFromColor; - SFMLClass function(uint, uint, ubyte*) sfImage_CreateFromPixels; - SFMLClass function(cchar*) sfImage_CreateFromFile; - SFMLClass function(ubyte* ,size_t) sfImage_CreateFromMemory; - void function(SFMLClass) sfImage_Destroy; - int function(SFMLClass, cchar*) sfImage_SaveToFile; - void function(SFMLClass, Color, ubyte) sfImage_CreateMaskFromColor; - SFMLClass function(SFMLClass) sfImage_Copy; - int function(SFMLClass, SFMLClass, IntRect) sfImage_CopyScreen; - void function(SFMLClass, SFMLClass, uint, uint, IntRect) sfImage_CopyImage; - void function(SFMLClass, uint, uint, Color) sfImage_SetPixel; - Color function(SFMLClass, uint, uint) sfImage_GetPixel; - ubyte* function(SFMLClass) sfImage_GetPixelsPtr; - void function(SFMLClass) sfImage_Bind; - void function(SFMLClass, int) sfImage_SetSmooth; - uint function(SFMLClass) sfImage_GetWidth; - uint function(SFMLClass) sfImage_GetHeight; - int function(SFMLClass) sfImage_IsSmooth; - void function(SFMLClass, ubyte*, IntRect) sfImage_UpdatePixels; - } - - mixin(loadFromSharedLib2("csfml-graphics", "sfImage", - "Create", "CreateFromColor", "CreateFromPixels", "CreateFromFile", "CreateFromMemory", "Destroy", "SaveToFile", - "CreateMaskFromColor", "Copy", "CopyScreen", "CopyImage", "SetPixel", "GetPixel", "GetPixelsPtr", "Bind", "SetSmooth", "GetWidth", - "GetHeight", "IsSmooth", "UpdatePixels")); -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/graphics/irendertarget.d b/bindings/d/import/dsfml/graphics/irendertarget.d deleted file mode 100644 index 719a2a48..00000000 --- a/bindings/d/import/dsfml/graphics/irendertarget.d +++ /dev/null @@ -1,138 +0,0 @@ -/* - * DSFML - SFML Library wrapper for the D programming language. - * Copyright (C) 2010 Andreas Hollandt - * - * This software is provided 'as-is', without any express or - * implied warranty. In no event will the authors be held - * liable for any damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute - * it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; - * you must not claim that you wrote the original software. - * If you use this software in a product, an acknowledgment - * in the product documentation would be appreciated but - * is not required. - * - * 2. Altered source versions must be plainly marked as such, - * and must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any - * source distribution. - */ - -module dsfml.graphics.irendertarget; - -import dsfml.system.vector; -import dsfml.graphics.idrawable; -import dsfml.graphics.rect; -import dsfml.graphics.shader; -import dsfml.graphics.view; -import dsfml.graphics.color; - -interface IRenderTarget -{ - /** - * Clear the entire target with a single color - * - * \param color : Color to use to clear the render target - * - */ - void clear(Color color = Color()); - - /** - * Draw something into the target - * - * \param object : Object to draw - * - */ - void draw(IDrawable object); - - /** - * Draw something into the target with a shader - * - * \param object : Object to draw - * \param shader : Shader to apply - * - */ - void draw(IDrawable object, Shader shader); - - /** - * Convert a point in target coordinates into view coordinates - * - * \param x : X coordinate of the point to convert, relative to the target - * \param y : Y coordinate of the point to convert, relative to the target - * \param view : Target view to convert the point to, null to use the currently associated view - * - * \return Converted point - * - */ - Vector2f convertCoords(uint x, uint y, View view = null); - - /** - * Save the current OpenGL render states and matrices - * - */ - void saveGLStates(); - - /** - * Restore the previously saved OpenGL render states and matrices - * - */ - void restoreGLStates(); - -@property -{ - /** - * Get the width of the rendering region of the target - * - * \return Width in pixels - * - */ - uint width(); - - /** - * Get the height of the rendering region of the target - * - * \return Height in pixels - * - */ - uint height(); - - /** - * Change the current active view. - * - * \param view : New view to use (pass GetDefaultView() to set the default view) - * - */ - void view(View view); - - /** - * Get the current view - * - * \return Current view active in the window - * - */ - View view(); - - /** - * Get the default view of the window - * - * \return Default view - * - */ - View defaultView(); - - /** - * Get the viewport of a view applied to this target - * - * \param view Target view - * - * \return Viewport rectangle, expressed in pixels in the current target - * - */ - IntRect viewport(View view); -} -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/graphics/rect.d b/bindings/d/import/dsfml/graphics/rect.d deleted file mode 100644 index 3e8b9df1..00000000 --- a/bindings/d/import/dsfml/graphics/rect.d +++ /dev/null @@ -1,149 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.graphics.rect; - -version (Tango) -{ - import tango.core.Traits; -} -else -{ - template isIntegerType(T) - { - const bool isIntegerType = - is (T == byte) || - is (T == short) || - is (T == int) || - is (T == long); - } - - template isRealType(T) - { - const bool isRealType = - is (T == float) || - is (T == double) || - is (T == real); - } -} - -/** - * Rect is an utility class for manipulating rectangles. - * Template parameter defines the type of coordinates (integer float, ...) - */ -struct Rect(T) -{ - T left; // Left coordinate of the rectangle - T top; // Top coordinate of the rectangle - T width; // width - T height; // height - - static if (!isIntegerType!(T) && !isRealType!(T)) - { - static assert (0, "This type is not supported by Rectangle"); - } - - T min(T)(T i, T j) - { - return i < j ? i : j; - } - - T max(T)(T i, T j) - { - return i > j ? i : j; - } - - /** - * Get the right coordinate of the rectangle - */ - T right() - { - return left + width; - } - - /** - * Get the bottom coordinate of the rectangle - */ - T bottom() - { - return top + height; - } - - /** - * Check if a point is inside the rectangle's area - * - * Params: - * x = X coordinate of the point to test - * y = Y coordinate of the point to test - * - * Returns: - * True if the point is inside - */ - bool contains(T x, T y) - { - return (x >= left) && (x < right) && (y >= top) && (y < bottom); - } - - /** - * Check intersection between two rectangles - * - * Params: - * rectangle = Rectangle to test - * overlappingRect = Rectangle to be filled with overlapping rect (NULL by default) - * - * Returns: - * True if rectangles overlap - */ - bool intersects(Rect!(T) rectangle, out Rect!(T) overlappingRect = Rect!(T)()) - { - // Compute overlapping rect - auto overlapping = Rect!(T)( - max(left, rectangle.left), - max(top, rectangle.top), - min(right, rectangle.right), - min(bottom, rectangle.bottom) - ); - - // If overlapping rect is valid, then there is intersection - if ((overlapping.left < overlapping.right) && (overlapping.top < overlapping.bottom)) - { - overlappingRect = overlapping; - return true; - } - else - { - overlappingRect = Rect!(T)(); - return false; - } - } - - //bool opEquals -} - -///Alias -alias Rect!(int) IntRect; -///ditto -alias Rect!(float) FloatRect; \ No newline at end of file diff --git a/bindings/d/import/dsfml/graphics/renderimage.d b/bindings/d/import/dsfml/graphics/renderimage.d deleted file mode 100644 index 76bdbe6c..00000000 --- a/bindings/d/import/dsfml/graphics/renderimage.d +++ /dev/null @@ -1,316 +0,0 @@ -/* - * DSFML - SFML Library wrapper for the D programming language. - * Copyright (C) 2010 Andreas Hollandt - * - * This software is provided 'as-is', without any express or - * implied warranty. In no event will the authors be held - * liable for any damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute - * it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; - * you must not claim that you wrote the original software. - * If you use this software in a product, an acknowledgment - * in the product documentation would be appreciated but - * is not required. - * - * 2. Altered source versions must be plainly marked as such, - * and must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any - * source distribution. - */ - - -module dsfml.graphics.renderimage; - -import dsfml.system.common, - dsfml.system.exception, - dsfml.system.stringutil, - dsfml.system.vector; - -import dsfml.graphics.idrawable, - dsfml.graphics.image, - dsfml.graphics.color, - dsfml.graphics.rect, - dsfml.graphics.shader, - dsfml.graphics.view, - dsfml.graphics.irendertarget; - - -/** - * Target for 2D rendering into an image that can be reused in a sprite - */ -class RenderImage : DSFMLObject, IRenderTarget -{ -private: - Image _image = null; - View _view = null; - View _defaultView = null; - -package: - this(SFMLClass ptr) - { - super(ptr, true); - } - - override void dispose() - { - sfRenderImage_Destroy(m_ptr); - } - -public: - - /** - * Construct a new renderimage - * - * Params: - * width = Width of the renderimage - * height = Height of the renderimage - * depthBuffer = Do you want a depth-buffer attached? (useful only if you're doing 3D OpenGL on the renderimage) - */ - this(uint width, uint height, bool depthBuffer = false) - { - super(sfRenderImage_Create(width, height, depthBuffer)); - } - - /** - * Update the contents of the target image - */ - void display() - { - sfRenderImage_Display(m_ptr); - } - - /** - * Draw something on a renderimage - * - * Params: - * drawable = object to draw - */ - void draw(IDrawable drawable) - { - drawable.render(this); - } - - /** - * - * Params: - * drawable = Object to draw - * shader = Shader to use - */ - void draw(IDrawable drawable, Shader shader) - { - drawable.renderWithShader(this, shader); - } - - /** - * Clear the renderimage with the given color - * - * Params: - * color = Fill color - */ - void clear(Color color) - { - sfRenderImage_Clear(m_ptr, color); - } - - /** - * Convert a point in image coordinates into view coordinates - * - * Params: - * imageX = X coordinate of the point to convert, relative to the image - * imageY = Y coordinate of the point to convert, relative to the image - * targetView = Target view to convert the point to (pass NULL to use the current view) - * - * Returns: - * Converted point - */ - Vector2f convertCoords(uint imageX, uint imageY, View targetView = null) - { - Vector2f vec; - sfRenderImage_ConvertCoords(m_ptr, imageX, imageY, &vec.x, &vec.y, targetView is null ? null : targetView.nativePointer); - return vec; - } - - - - /** - * Save the current OpenGL render states and matrices - */ - void saveGLStates() - { - sfRenderImage_SaveGLStates(m_ptr); - } - - /** - * Restore the previously saved OpenGL render states and matrices - */ - void restoreGLStates() - { - sfRenderImage_RestoreGLStates(m_ptr); - } - -@property -{ - /** - * Return the width of the rendering region of a renderimage - * - * Returns: - * Width in pixels - */ - uint width() - { - return sfRenderImage_GetWidth(m_ptr); - } - - /** - * Return the height of the rendering region of a renderimage - * - * Returns: - * Height in pixels - */ - uint height() - { - return sfRenderImage_GetHeight(m_ptr); - } - - /** - * Activate or deactivate a renderimage as the current target for rendering - * - * Params: - * active = true to activate, false to deactivate - * Returns: - * true if operation was successful, false otherwise - */ - bool active(bool activ) - { - return sfRenderImage_SetActive(m_ptr, activ); - } - - /** - * Change the current active view of a renderimage - * - * Params: - * view = Pointer to the new view - */ - void view(View v) - { - if (_view !is null) - { - _view.setHandled(false); - } - - sfRenderImage_SetView(m_ptr, v.nativePointer); - - _view = v; - _view.setHandled(true); - } - - /** - * Get the current active view rectangle - * - * Returns: - * current view rectangle, in global coordinates - */ - View view() - { - if (_view is null) - { - SFMLClass cView = sfRenderImage_GetView(m_ptr); - _view = new View(cView, true); - } - return _view; - } - - /** - * Get the default view - * - * Returns: - * default view - */ - View defaultView() - { - if (_defaultView is null) - { - SFMLClass cView = sfRenderImage_GetDefaultView(m_ptr); - _defaultView = new View(cView, true); - } - return _defaultView; - } - - - IntRect viewport(View v = null) // TODO: is there a need to accept other Views than the currently assigned one? - { - return sfRenderImage_GetViewport(m_ptr, v is null ? _view.nativePointer : v.nativePointer); - } - - /** - * Get the target image - * - * Returns: - * target image - */ - Image image() - { - if (_image is null) - { - SFMLClass cImage = sfRenderImage_GetImage(m_ptr); - _image = new Image(cImage); - } - return _image; - } - - /** - * Check whether the system supports render images or not - * - * Returns: - * true if the RenderImage class can be used - */ - bool isAvailable() - { - return sfRenderImage_IsAvailable(); - } -} - -private: - static extern(C) - { - SFMLClass function(uint, uint, bool) sfRenderImage_Create; - void function(SFMLClass) sfRenderImage_Destroy; - uint function(SFMLClass) sfRenderImage_GetWidth; - uint function(SFMLClass) sfRenderImage_GetHeight; - bool function(SFMLClass, bool) sfRenderImage_SetActive; - void function(SFMLClass) sfRenderImage_Display; - - void function(SFMLClass, void*) sfRenderImage_DrawSprite; - void function(SFMLClass, void*) sfRenderImage_DrawShape; - void function(SFMLClass, void*) sfRenderImage_DrawText; - - void function(SFMLClass, void*, void*) sfRenderImage_DrawSpriteWithShader; - void function(SFMLClass, void*, void*) sfRenderImage_DrawShapeWithShader; - void function(SFMLClass, void*, void*) sfRenderImage_DrawTextWithShader; - - void function(SFMLClass, Color) sfRenderImage_Clear; - void function(SFMLClass, SFMLClass) sfRenderImage_SetView; - SFMLClass function(SFMLClass) sfRenderImage_GetView; - SFMLClass function(SFMLClass) sfRenderImage_GetDefaultView; - IntRect function(SFMLClass, SFMLClass) sfRenderImage_GetViewport; - void function(SFMLClass, uint, uint, float*, float*, SFMLClass) sfRenderImage_ConvertCoords; - SFMLClass function(SFMLClass) sfRenderImage_GetImage; - bool function() sfRenderImage_IsAvailable; - - // DSFML2 - void function(SFMLClass) sfRenderImage_SaveGLStates; - void function(SFMLClass) sfRenderImage_RestoreGLStates; - } - - mixin(loadFromSharedLib2("csfml-graphics", "sfRenderImage", "Create", "Destroy", "GetWidth", "GetHeight", - "SetActive", "Display", "Clear", "SetView", "GetView", "GetDefaultView", "GetViewport", "ConvertCoords", - "GetImage", "IsAvailable", - // DSFML2 - "SaveGLStates", "RestoreGLStates")); - -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/graphics/renderwindow.d b/bindings/d/import/dsfml/graphics/renderwindow.d deleted file mode 100644 index fa23631c..00000000 --- a/bindings/d/import/dsfml/graphics/renderwindow.d +++ /dev/null @@ -1,336 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.graphics.renderwindow; - -import dsfml.graphics.color, - dsfml.graphics.rect, - dsfml.graphics.shader, - dsfml.graphics.view, - dsfml.graphics.idrawable, - dsfml.graphics.irendertarget; - -import dsfml.window.event, - dsfml.window.input, - dsfml.window.videomode, - dsfml.window.window, - dsfml.window.windowhandle; - -import dsfml.system.common, - dsfml.system.stringutil, - dsfml.system.vector; - -/** - * Simple wrapper for Window that allows easy 2D rendering. - */ -class RenderWindow : Window, IRenderTarget -{ -private: - View m_view = null; - View m_defaultView = null; - -public: - - /** - * Construct the window - * - * Params: - * mode = Video mode to use - * title = Title of the window - * windowStyle = Window style (Resize | Close by default) - * settings = Context settings (default is default ContextSettings values) - */ - this(VideoMode mode, string title, Style windowStyle = Style.Default, ContextSettings settings = ContextSettings()) - { - super(sfRenderWindow_Create(mode, toStringz(title), windowStyle, &settings)); - m_input = new Input(sfRenderWindow_GetInput(m_ptr)); - } - - /** - * Construct the window from an existing control - * - * Params: - * handle = Platform-specific handle of the control - * settings = Context settings (default is default ContextSettings values) - */ - this(WindowHandle handle, ContextSettings settings = ContextSettings()) - { - super(sfRenderWindow_CreateFromHandle(handle, &settings)); - m_input = new Input(sfRenderWindow_GetInput(m_ptr)); - } - - override void dispose() - { - sfRenderWindow_Destroy(m_ptr); - } - - /** - * Create (or recreate) the window - * - * Input created with getInput will become invalid. - * - * Params: - * mode = Video mode to use - * title = Title of the window - * windowStyle = Window style (Resize | Close by default) - * settings = Context settings (default is default ContextSettings values) - * - */ - override void create(VideoMode mode, string title, Style windowStyle = Style.Default, ContextSettings settings = ContextSettings()) - { - if (m_ptr !is null) - dispose(); - - m_ptr = sfRenderWindow_Create(mode, toStringz(title), windowStyle, &settings); - m_input = new Input(sfRenderWindow_GetInput(m_ptr)); - } - - /** - * Create (or recreate) the window from an existing control - * - * Input created with getInput become invalid. - * - * Params: - * handle = Platform-specific handle of the control - * settings = Context settings (default is default ContextSettings values) - * - */ - override void create(WindowHandle handle, ContextSettings settings = ContextSettings()) - { - if (m_ptr !is null) - dispose(); - - m_ptr = sfRenderWindow_CreateFromHandle(handle, &settings); - m_input = new Input(sfRenderWindow_GetInput(m_ptr)); - } - - /** - * Draw a sprite, shape or text on the window with a shader - * - * Params: - * drawable = IDrawable to draw - * shader = Shader to use - */ - void draw(IDrawable drawable, Shader shader) - { - drawable.renderWithShader(this, shader); - } - - /** - * Draw a sprite, shape or text - * - * Params: - * drawable = IDrawable to draw - */ - void draw(IDrawable drawable) - { - drawable.render(this); - } - - /** - * Clear the screen with the given color. - * - * Params: - * col = Fill color - */ - void clear(Color col = Color.BLACK) - { - sfRenderWindow_Clear(m_ptr, col); - } - - - - /** - * Convert a point in window coordinates into view coordinates - * - * Params: - * windowX = X coordinate of the point to convert, relative to the window - * windowY = Y coordinate of the point to convert, relative to the window - * targetView = Target view to convert the point to (pass NULL to use the current view) - * - * Returns: - * Converted point - */ - Vector2f convertCoords(uint windowX, uint windowY, View targetView = null) - { - Vector2f vec; - sfRenderWindow_ConvertCoords(m_ptr, windowX, windowY, &vec.x, &vec.y, targetView is null ? null : targetView.nativePointer); - return vec; - } - - /** - * Save the current OpenGL render states and matrices - */ - void saveGLStates() - { - sfRenderWindow_SaveGLStates(m_ptr); - } - - /** - * Restore the previously saved OpenGL render states and matrices - */ - void restoreGLStates() - { - sfRenderWindow_RestoreGLStates(m_ptr); - } - -@property -{ - /** - * Change the current active view. - * The current view is defined with the initial size of the window - * - * Params: - * newView = Pointer to the new view (pass getDefaultView to set the default view) - */ - void view(View newView) - { - if (m_view !is null) - { - m_view.setHandled(false); - } - - sfRenderWindow_SetView(m_ptr, newView.nativePointer); - - m_view = newView; - m_view.setHandled(true); - } - - /** - * Get the current view rectangle - * - * Returns: - * current view rectangle, in global coordinates - */ - View view() - { - if (m_view is null) - { - SFMLClass cView = sfRenderWindow_GetView(m_ptr); - m_view = new View(cView, true); - } - return m_view; - } - - /** - * Get the default view - * - * Returns: - * default view - */ - View defaultView() - { - if (m_defaultView is null) - { - SFMLClass cView = sfRenderWindow_GetDefaultView(m_ptr); - m_defaultView = new View(cView, true); - } - return m_defaultView; - } - - /** - * Return the width of the rendering region of a renderwindow - * - * Returns: - * Width in pixels - */ - override uint width() - { - return sfRenderWindow_GetWidth(m_ptr); - } - - /** - * Return the height of the rendering region of a renderwindow - * - * Returns: - * Height in pixels - */ - override uint height() - { - return sfRenderWindow_GetHeight(m_ptr); - } - - /** - * Get the viewport of a view applied to this target - * - * Params: - * view = Target view - * Returns: - * Viewport rectangle, expressed in pixels in the current target - */ - IntRect viewport(View v = null) // TODO: is there a need to accept other Views than the currently assigned one? - { - return sfRenderWindow_GetViewport(m_ptr, v is null ? m_view.nativePointer : v.nativePointer); - } -} - -private: - - static extern(C) - { - SFMLClass function(VideoMode, cchar*, Style, ContextSettings*)sfRenderWindow_Create; - SFMLClass function(WindowHandle, ContextSettings*) sfRenderWindow_CreateFromHandle; - void function(SFMLClass) sfRenderWindow_Destroy; - SFMLClass function(SFMLClass) sfRenderWindow_GetInput; - bool function(SFMLClass) sfRenderWindow_IsOpened; - uint function(SFMLClass) sfRenderWindow_GetWidth; - uint function(SFMLClass) sfRenderWindow_GetHeight; - - /* - void function(SFMLClass, SFMLClass) sfRenderWindow_DrawSprite; - void function(SFMLClass, SFMLClass) sfRenderWindow_DrawShape; - void function(SFMLClass, SFMLClass) sfRenderWindow_DrawText; - - void function(SFMLClass, SFMLClass, SFMLClass) sfRenderWindow_DrawSpriteWithShader; - void function(SFMLClass, SFMLClass, SFMLClass) sfRenderWindow_DrawShapeWithShader; - void function(SFMLClass, SFMLClass, SFMLClass) sfRenderWindow_DrawTextWithShader; - */ - - SFMLClass function(SFMLClass) sfRenderWindow_Capture; - void function(SFMLClass, Color) sfRenderWindow_Clear; - void function(SFMLClass, SFMLClass) sfRenderWindow_SetView; - SFMLClass function(SFMLClass) sfRenderWindow_GetView; - SFMLClass function(SFMLClass) sfRenderWindow_GetDefaultView; - void function(SFMLClass, uint, uint, float*, float*, SFMLClass) sfRenderWindow_ConvertCoords; - - // DSFML2 - void function(SFMLClass) sfRenderWindow_SaveGLStates; - void function(SFMLClass) sfRenderWindow_RestoreGLStates; - IntRect function(SFMLClass, SFMLClass) sfRenderWindow_GetViewport; - } - - mixin(loadFromSharedLib2("csfml-graphics", "sfRenderWindow", "Create", "CreateFromHandle", - "Destroy", "GetInput", "Clear", "SetView", "GetView", "GetDefaultView", "ConvertCoords", - "GetWidth", "GetHeight", - // DSFML2 - "SaveGLStates", "RestoreGLStates", "GetViewport")); - - - static ~this() - { - - } -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/graphics/shader.d b/bindings/d/import/dsfml/graphics/shader.d deleted file mode 100644 index ea7e07b7..00000000 --- a/bindings/d/import/dsfml/graphics/shader.d +++ /dev/null @@ -1,177 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.graphics.shader; - -import dsfml.graphics.image; - -import dsfml.system.common; -import dsfml.system.exception; -import dsfml.system.stringutil; - - -/** -* Define loading methods for effect -*/ -enum LoadingType -{ - FROMFILE, /// string represents a file path - FROMSTRING /// string represents effect code -} - -/** -* Shader is used to apply a post effect to a window -* -* See_Also: -* $(LINK2 http://www.sfml-dev.org/tutorials/graphics-postfx.php, SFML post FX tutorial) from more informations about Post effects and GLSL fragment shaders syntax. -*/ -class Shader : DSFMLObject -{ -private: - Image m_texture; - -public: - - /** - * construct the effect - * - * Params: - * effect = Path of a file or string containing the effect. - * type = type of the effect (default is FROMFILE) - */ - this(string effect, LoadingType type = LoadingType.FROMFILE) - { - if (effect is null || effect.length == 0) - throw new LoadingException("LoadingException : Effect is invalid."); - - if (type == LoadingType.FROMFILE) - super(sfShader_CreateFromFile(toStringz(effect))); - else - super(sfShader_CreateFromMemory(toStringz(effect))); - } - - override void dispose() - { - sfShader_Destroy(m_ptr); - } - - /** - * Change parameters of the effect - * - * Params: - * name = Parameter name in the effect - */ - void setParameter(string name, float x) - { - sfShader_SetParameter1(m_ptr, toStringz(name), x); - } - - /** - * ditto - */ - void setParameter(string name, float x, float y) - { - sfShader_SetParameter2(m_ptr, toStringz(name), x, y); - } - - /** - * ditto - */ - void setParameter(string name, float x, float y, float z) - { - sfShader_SetParameter3(m_ptr, toStringz(name), x, y, z); - } - - /** - * ditto - */ - void setParameter(string name, float x, float y, float z, float w) - { - sfShader_SetParameter4(m_ptr, toStringz(name), x, y, z, w); - } - - /** - * Set a texture parameter - * - * Params: - * name = Texture name in the effect - * texture = Image to set (pass NULL to use content of current framebuffer) - */ - void setTexture(string name, Image texture) - { - m_texture = texture; - sfShader_SetTexture(m_ptr, toStringz(name), texture is null ? null : texture.nativePointer); - } - - /** - * Tell whether or not the system supports shaders - * - * Returns: - * True if the system can use shaders - */ - static bool isAvailable() - { - return cast(bool)sfShader_IsAvailable(); - } - - -private: - - static extern(C) - { - SFMLClass function(cchar*) sfShader_CreateFromFile; - SFMLClass function(cchar*) sfShader_CreateFromMemory; - void function(SFMLClass) sfShader_Destroy; - void function(SFMLClass, cchar*, float) sfShader_SetParameter1; - void function(SFMLClass, cchar*, float, float) sfShader_SetParameter2; - void function(SFMLClass, cchar*, float, float, float) sfShader_SetParameter3; - void function(SFMLClass, cchar*, float, float, float, float) sfShader_SetParameter4; - void function(SFMLClass, cchar*, SFMLClass) sfShader_SetTexture; - int function() sfShader_IsAvailable; - void function(SFMLClass) sfShader_Bind; - void function(SFMLClass) sfShader_Unbind; - } - - static this() - { - debug - DllLoader dll = DllLoader.load("csfml-graphics-d-2"); - else - DllLoader dll = DllLoader.load("csfml-graphics-2"); - - mixin(loadFromSharedLib("sfShader_CreateFromFile")); - mixin(loadFromSharedLib("sfShader_CreateFromMemory")); - mixin(loadFromSharedLib("sfShader_Destroy")); - mixin(loadFromSharedLib("sfShader_SetParameter1")); - mixin(loadFromSharedLib("sfShader_SetParameter2")); - mixin(loadFromSharedLib("sfShader_SetParameter3")); - mixin(loadFromSharedLib("sfShader_SetParameter4")); - mixin(loadFromSharedLib("sfShader_SetTexture")); - mixin(loadFromSharedLib("sfShader_IsAvailable")); - mixin(loadFromSharedLib("sfShader_Bind")); - mixin(loadFromSharedLib("sfShader_Unbind")); - } -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/graphics/shape.d b/bindings/d/import/dsfml/graphics/shape.d deleted file mode 100644 index 87f40dc4..00000000 --- a/bindings/d/import/dsfml/graphics/shape.d +++ /dev/null @@ -1,306 +0,0 @@ -/* - * DSFML - SFML Library wrapper for the D programming language. - * Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) - * Copyright (C) 2010 Andreas Hollandt - * - * This software is provided 'as-is', without any express or - * implied warranty. In no event will the authors be held - * liable for any damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute - * it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; - * you must not claim that you wrote the original software. - * If you use this software in a product, an acknowledgment - * in the product documentation would be appreciated but - * is not required. - * - * 2. Altered source versions must be plainly marked as such, - * and must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any - * source distribution. - */ - -module dsfml.graphics.shape; - -import dsfml.system.vector; - -import dsfml.graphics.blendmode; -import dsfml.graphics.color; -import dsfml.graphics.drawableimpl; - -/** - * Shape defines a drawable convex shape ; it also defines - * helper functions to draw simple shapes like - * lines, rectangles, circles, etc. - */ -class Shape : DrawableImpl!("sfShape") -{ -private: - this (SFMLClass ptr) - { - super(ptr); - } - -public: - this() - { - super(); - } - - /** - * Add a point to the shape - * - * Params: - * x = X position of the point - * y = Y position of the point - * col = Color of the point (white by default) - * outlineCol = Outline color of the point (black by default) - */ - void addPoint(float x, float y, Color col = Color.WHITE, Color outlineCol = Color.BLACK) - { - sfShape_AddPoint(m_ptr, x, y, col, outlineCol); - } - - /** - * Add a point to the shape - * - * Params: - * position = position of the point - * col = Color of the point (white by default) - * outlineCol = Outline color of the point (black by default) - */ - void addPoint(Vector2f position, Color col = Color.WHITE, Color outlineCol = Color.BLACK) - { - sfShape_AddPoint(m_ptr, position.x, position.x, col, outlineCol); - } - -@property -{ - /** - * Enable or disable filling the shape. - * Fill is enabled by default. - * - * Params: - * enable = True to enable, false to disable - */ - void enableFill(bool enable) - { - sfShape_EnableFill(m_ptr, enable); - } - - /** - * Enable or disable drawing a shape outline. - * Outline is enabled by default - * - * Params: - * enable = True to enable, false to disable - */ - void enableOutline(bool enable) - { - sfShape_EnableOutline(m_ptr, enable); - } - - /** - * Change the thickness of a shape outline - * - * Params: - * thickness = New thickness - */ - void outlineThickness(float thickness) - { - sfShape_SetOutlineThickness(m_ptr, thickness); - } - - /** - * Get the thickness of the shape outline - * - * Returns: - * Current outline thickness - * - */ - float outlineThickness() - { - return sfShape_GetOutlineThickness(m_ptr); - } - - /** - * Get the number of points composing a shape - * - * Returns: - * Total number of points - */ - uint pointsCount() - { - return sfShape_GetPointsCount(m_ptr); - } -} - - /** - * Get a point of the shape - * - * Params: - * index = Index of the point - * - * Returns: - * position of the point - */ - Vector2f getPointPosition(uint index) - { - float x, y; - sfShape_GetPointPosition(m_ptr, index, &x, &y); - return Vector2f(x, y); - } - - /** - * Set the position of a shape point - * - * Params: - * index = Index of the point - * position = New position of the point - */ - void setPointPosition(uint index, Vector2f position) - { - sfShape_SetPointPosition(m_ptr, index, position.x, position.y); - } - - /** - * Get the color of a shape's point - * - * Params: - * index = Index of the point - * - * Returns: - * Color of the point - */ - Color getPointColor(uint index) - { - return sfShape_GetPointColor(m_ptr, index); - } - - /** - * Set the color of a shape's point - * - * Params: - * index = Index of the point - * color = new color of the point - */ - void setPointColor(uint index, Color color) - { - sfShape_SetPointColor(m_ptr, index, color); - } - - /** - * Get the outline color of a shape's point - * - * Params: - * index = Index of the point - * - * Returns: - * Color of the outline - */ - Color getPointOutlineColor(uint index) - { - return sfShape_GetPointOutlineColor(m_ptr, index); - } - - /** - * Set the outline color of a shape's point - * - * Params: - * index = Index of the point - * color = new color of the point - */ - void setPointOutlineColor(uint index, Color color) - { - sfShape_SetPointOutlineColor(m_ptr, index, color); - } - - - - /** - * Create a shape made of a single line - * - * Params: - * p1X, p1Y = Position of the first point - * p2X, p2Y = Position second point - * thickness = Line thickness - * col = Color used to draw the line - * outline = Outline thickness (0 by default) - * outlineCol = Color used to draw the outline (black by default) - * - * Returns: - * New line shape - */ - static Shape line(float p1X, float p1Y, float p2X, float p2Y, float thickness, Color col, float outline = 0.f, Color outlineCol = Color.BLACK) - { - - return new Shape(sfShape_CreateLine(p1X, p1Y, p2X, p2Y, thickness, col, outline, outlineCol)); - } - - /** - * Create a shape made of a single rectangle - * - * Params: - * left, top = Top-left corner of the rectangle - * width, height = Size of the rectangle - * col = Color used to fill the rectangle - * outline = Outline thickness (0 by default) - * outlineCol = Color used to draw the outline (black by default) - * - * Returns: - * new rectangle shape - */ - static Shape rectangle(float left, float top, float width, float height, Color col, float outline = 0.f, Color outlineCol = Color.BLACK) - { - return new Shape(sfShape_CreateRectangle(left, top, width, height, col, outline, outlineCol)); - } - - /** - * Create a shape made of a single circle - * - * Params: - * x = X position of the center - * y = Y position of the center - * radius = Radius - * col = Color used to fill the circle - * outline = Outline thickness (0 by default) - * outlineCol = Color used to draw the outline (black by default) - * - * Returns: - * new circle shape - */ - static Shape circle(float x, float y, float radius, Color col, float outline = 0.f, Color outlineCol = Color.BLACK) - { - return new Shape(sfShape_CreateCircle(x, y, radius, col, outline, outlineCol)); - } - -private: - - static extern(C) - { - SFMLClass function(float, float, float, float, float, Color, float, Color) sfShape_CreateLine; - SFMLClass function(float, float, float, float, Color, float, Color) sfShape_CreateRectangle; - SFMLClass function(float, float, float, Color, float, Color) sfShape_CreateCircle; - void function(SFMLClass, float, float, Color, Color) sfShape_AddPoint; - void function(SFMLClass, int) sfShape_EnableFill; - void function(SFMLClass, int) sfShape_EnableOutline; - void function(SFMLClass, float Width) sfShape_SetOutlineThickness; - float function(SFMLClass) sfShape_GetOutlineThickness; - uint function(SFMLClass) sfShape_GetPointsCount; - void function(SFMLClass, uint Index, float* X, float* Y) sfShape_GetPointPosition; - void function(SFMLClass, uint Index, float X, float Y) sfShape_SetPointPosition; - Color function(SFMLClass, uint index) sfShape_GetPointColor; - void function(SFMLClass, uint index, Color color) sfShape_SetPointColor; - Color function(SFMLClass, uint index) sfShape_GetPointOutlineColor; - void function(SFMLClass, uint index, Color color) sfShape_SetPointOutlineColor; - } - - mixin(loadFromSharedLib2("csfml-graphics", "sfShape", - "CreateLine", "CreateRectangle", "CreateCircle", "AddPoint", "EnableFill", "EnableOutline", "SetOutlineThickness", "GetOutlineThickness", - "GetPointsCount", "GetPointPosition", "SetPointPosition", "GetPointColor", "SetPointColor", "GetPointOutlineColor", - "SetPointOutlineColor")); -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/graphics/sprite.d b/bindings/d/import/dsfml/graphics/sprite.d deleted file mode 100644 index a8f32df5..00000000 --- a/bindings/d/import/dsfml/graphics/sprite.d +++ /dev/null @@ -1,238 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.graphics.sprite; - -import dsfml.graphics.blendmode; -import dsfml.graphics.color; -import dsfml.graphics.drawableimpl; -import dsfml.graphics.image; -import dsfml.graphics.rect; - -import dsfml.system.vector; - -/** -* Sprite defines a sprite : texture, transformations, -* color, and draw on screen -* See_Also: -* IDrawable -*/ -class Sprite : DrawableImpl!("sfSprite") -{ -private: - Image m_image; //< Image used to draw the sprite - IntRect m_subRect; //< Sub-rectangle of source image to assign to the sprite - -public: - - /** - * Default constructor - */ - this() - { - super(); - } - - /** - * Construct the sprite from a source image - * - * Params: - * img = Image of the sprite - * left = Left coordinate of the sprite (0 by default) - * top = Top coordinate of the sprite (0 by default) - * scalex = Horizontal scale (1 by default) - * scaley = Vertical scale (1 by default) - * rot = Orientation, in degrees (0 by default) - * col = Color of the sprite (white by default) - */ - this(Image img, float left = 0.f, float top = 0.f, float scalex = 1.f, float scaley = 1.f, float rot = 0.f, Color col = Color.WHITE) - { - super(); - m_image = img; - sfSprite_SetImage(m_ptr, img.nativePointer, true); - x = left; - y = top; - scaleX = scalex; - scaleY = scaley; - rotation = rot; - color = col; - } - - /** - * Change the image of the sprite - * - * Params: - * img = New image - * adjustToNewSize = adjust sprite subrect to new image size - */ - void setImage(Image img, bool adjustToNewSize = false) - { - assert(img !is null, "Trying to set a null image."); - sfSprite_SetImage(m_ptr, img.nativePointer, adjustToNewSize); - m_image = img; - } - - @property void image(Image img) - { - setImage(img, false); - } - - /** - * Resize the sprite (by changing its scale factors). - * The default size is defined by the subrect - * - * Params: - * width = New width (must be strictly positive) - * height = New height (must be strictly positive) - */ - void resize(float width, float height) - { - if (width > 0 && height > 0) - sfSprite_Resize(m_ptr, width, height); - } - - /** - * Resize the sprite (by changing its scale factors). - * The default size is defined by the subrect - * - * Params: - * size = New size (both coordinates must be strictly positive) - */ - void resize(Vector2f size) - { - if (size.x > 0 && size.y > 0) - sfSprite_Resize(m_ptr, size.x, size.y); - } - - - /** - * Flip the sprite horizontally - * - * Params: - * flipped = True to flip the sprite - */ - void flipX(bool flipped) - { - sfSprite_FlipX(m_ptr, flipped); - } - - /** - * Flip the sprite vertically - * - * Params: - * flipped = True to flip the sprite - */ - void flipY(bool flipped) - { - sfSprite_FlipY(m_ptr, flipped); - } - - /** - * Get the color of a given pixel in the sprite - * - * Params: - * x = X coordinate - * y = Y coordinate - * - * Returns: - * Color of pixel - */ - Color getPixel(uint x, uint y) const - { - return sfSprite_GetPixel(m_ptr, x, y); - } - -@property -{ - /** - * Set the sub-rectangle of a sprite inside the source image. - * - * Params: - * rect = New sub-rectangle - */ - void subRect(IntRect rect) - { - sfSprite_SetSubRect(m_ptr, rect); - m_subRect = rect; - } - - /** - * Get the source image of the sprite - * - * Returns: - * Pointer to the image (can be NULL) - */ - Image image() - { - return m_image; - } - - /** - * Get the sub-rectangle of the sprite inside the source image - * - * Returns: - * Sub-rectangle - */ - IntRect subRect() - { - if (m_subRect == IntRect()) - m_subRect = sfSprite_GetSubRect(m_ptr); - //m_subRect = IntRect(0, 0, m_image.getWidth(), m_image.getHeight()); - - return m_subRect; - } - - /** - * Get the sprite size - * - * Returns: - * Size of the sprite - */ - Vector2f size() const - { - return Vector2f(sfSprite_GetWidth(m_ptr), sfSprite_GetHeight(m_ptr)); - } -} - -private: - - static extern(C) - { - void function(SFMLClass, SFMLClass, bool) sfSprite_SetImage; - void function(SFMLClass, IntRect) sfSprite_SetSubRect; - void function(SFMLClass, float, float) sfSprite_Resize; - void function(SFMLClass, int) sfSprite_FlipX; - void function(SFMLClass, int) sfSprite_FlipY; - SFMLClass function(SFMLClass) sfSprite_GetImage; - IntRect function(SFMLClass) sfSprite_GetSubRect; - float function(SFMLClass) sfSprite_GetWidth; - float function(SFMLClass) sfSprite_GetHeight; - Color function(SFMLClass, uint, uint) sfSprite_GetPixel; - } - - mixin(loadFromSharedLib2("csfml-graphics", "sfSprite", - "SetImage", "SetSubRect", "Resize", "FlipX", "FlipY", "GetImage", "GetSubRect", "GetWidth", "GetHeight", "GetPixel")); -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/graphics/text.d b/bindings/d/import/dsfml/graphics/text.d deleted file mode 100644 index 72a65c45..00000000 --- a/bindings/d/import/dsfml/graphics/text.d +++ /dev/null @@ -1,277 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.graphics.text; - -import dsfml.graphics.blendmode; -import dsfml.graphics.color; -import dsfml.graphics.font; -import dsfml.graphics.drawableimpl; -import dsfml.graphics.rect; - -import dsfml.system.stringutil; -import dsfml.system.vector; - - -/** - * Enumerate the text drawing styles - */ -enum TextStyle -{ - REGULAR = 0, /// Regular characters, no style - BOLD = 1 << 0, /// Characters are bold - ITALIC = 1 << 1, /// Characters are in italic - UNDERLINED = 1 << 2 /// Characters are underlined -} - -/** -* Text defines a graphical 2D text, that can be drawn on screen -* -* All string litterals used must be prefixed with c for utf-8 -* and d for utf-32 string. -* -* Examples : -* --------------------------------------------------------------- -* Text s = new Text("Hello"c); -* //this(string, Font, float) -* s = new Text("Hello"d); -* //this(dstring, Font, float) -* --------------------------------------------------------------- -* -* See_Also: -* IDrawable -*/ -class Text : DrawableImpl!("sfText") -{ -private: - Font m_font; - -public: - /** - * Construct the string from a text - * - * Prefixs string litterals with c - * - * Params: - * s = Text assigned to the string - * f = Font used to draw the string (use default font) - * size = Characters size, in pixels (32 by default) - */ - this(string s, Font f = Font.getDefaultFont(), uint size = 30) - { - super(); - - font = f; - text = s; - characterSize = size; - } - - /** - * Construct the string from a unicode text - * - * Prefixs string litterals with d - * - * Params: - * s = Text assigned to the string - * f = Font used to draw the string (use default font) - * size = Characters size, in pixels (32 by default) - */ - this(dstring s, Font f = Font.getDefaultFont(), uint size = 30) - { - super(); - - font = f; - text = s; - characterSize = size; - } - -@property -{ - /** - * Set the text (from a multibyte string) - * - * Params: - * text = New text - */ - void text(string text) - { - sfText_SetString(m_ptr, toStringz(text)); - } - - /** - * Set the text (from a unicode string) - * - * Params: - * text = New text - */ - void text(dstring text) - { - sfText_SetUnicodeString(m_ptr, toStringz(text)); - } - - /** - * Get the text (returns a multibyte string) - * - * Returns: - * Text - */ - string text() - { - return fromStringz(sfText_GetString(m_ptr)); - } - - /** - * Set the font of the string - * - * Params: - * f = Font - */ - void font(Font f) - { - m_font = f; - sfText_SetFont(m_ptr, f.nativePointer); - } - - /** - * Set the size of the string - * - * Params: - * size = New size, in pixels - */ - void characterSize(uint size) - { - sfText_SetCharacterSize(m_ptr, size); - } - - /** - * Set the style of the text - * The default style is Regular - * - * Params: - * TextStyle = New text style, (combination of Style enum values) - * - */ - void style(TextStyle tstyle) - { - sfText_SetStyle(m_ptr, tstyle); - } - - /** - * Get the text (returns a unicode string) - * - * Returns: - * Text - */ - dstring unicodeText() - { - return fromStringz(sfText_GetUnicodeString(m_ptr)); - } - - /** - * Get the font used by the string - * - * Returns: - * Font name - */ - Font font() - { - return m_font; - } - - /** - * Get the size of the characters - * - * Returns: - * Size of the characters - */ - uint characterSize() - { - return sfText_GetCharacterSize(m_ptr); - } - - /** - * Get the current font style - * - * Returns: - * Font style - */ - TextStyle style() - { - return sfText_GetStyle(m_ptr); - } - - /** - * Get the string rectangle on screen - * - * Returns: - * Rectangle contaning the string in screen coordinates - */ - FloatRect rect() - { - return sfText_GetRect(m_ptr); - } -} - - /** - * Return the visual position of the Index-th character of the string, - * in coordinates relative to the string - * (note : translation, center, rotation and scale are not applied) - * - * Params: - * index = Index of the character - * - * Returns: - * Position of the Index-th character (end of string of Index is out of range) - */ - Vector2f getCharacterPos(size_t index) - { - Vector2f ret; - sfText_GetCharacterPos(m_ptr, index, &ret.x, &ret.y); - return ret; - } - -private: - - static extern(C) - { - void function(SFMLClass, cchar*) sfText_SetString; - void function(SFMLClass, cdchar*) sfText_SetUnicodeString; - void function(SFMLClass, SFMLClass) sfText_SetFont; - void function(SFMLClass, uint) sfText_SetCharacterSize; - void function(SFMLClass, TextStyle) sfText_SetStyle; - idchar* function(SFMLClass) sfText_GetUnicodeString; - ichar* function(SFMLClass) sfText_GetString; - SFMLClass function(SFMLClass) sfText_GetFont; - uint function(SFMLClass) sfText_GetCharacterSize; - TextStyle function (SFMLClass) sfText_GetStyle; - void function(SFMLClass, size_t, float*, float*) sfText_GetCharacterPos; - FloatRect function(SFMLClass) sfText_GetRect; - } - - mixin(loadFromSharedLib2("csfml-graphics", "sfText", - "SetString", "SetUnicodeString", "SetFont", "SetCharacterSize", "SetStyle", "GetUnicodeString", "GetString", "GetFont", - "GetCharacterSize", "GetStyle", "GetCharacterPos", "GetRect")); -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/graphics/view.d b/bindings/d/import/dsfml/graphics/view.d deleted file mode 100644 index c1357bb8..00000000 --- a/bindings/d/import/dsfml/graphics/view.d +++ /dev/null @@ -1,347 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.graphics.view; - -import dsfml.graphics.rect; - -import dsfml.system.common, - dsfml.system.vector; - -/** -* This class defines a view (position, size and zoom) ; -* you can consider it as a camera -*/ -class View : DSFMLObject -{ -private: - FloatRect _rect; // a view defines a source area of the scene to display, and a destination area into the rendertarget where to map the source area - FloatRect _viewport; // the viewport is the destination area in the rendertarget - bool m_isModified = true; - -public: - /** - * Constructor - * - * Default view (1000 x 1000) - */ - this() - { - super(sfView_Create()); - } - - /** - * Constructor - * - * Params: - * center = center of the view - * size = size of the view (width, height) - */ - this(Vector2f center, Vector2f size) - { - super(sfView_CreateFromRect(FloatRect(center.x - size.x / 2, center.y - size.y / 2, size.x, size.y) )); - } - - /** - * Constructor - * - * Params: - * rect = Rectangle defining the position and size of the view - */ - this(FloatRect rect) - { - super(sfView_CreateFromRect(rect)); - } - - override void dispose() - { - sfView_Destroy(m_ptr); - } - - /** - * Change the center of the view - * - * Params: - * x = X coordinates of the new center - * y = Y coordinates of the new center - */ - void setCenter(float x, float y) - { - sfView_SetCenter(m_ptr, x, y); - m_isModified = true; - } - - /** - * Change the center of the view - * - * Params: - * center = New center - */ - void setCenter(Vector2f center) - { - sfView_SetCenter(m_ptr, center.x, center.y); - m_isModified = true; - } - - /** - * Change the size of the view (take 2 values) - * - * Params: - * width = New width - * height = New height - */ - void setSize(float width, float height) - { - sfView_SetSize(m_ptr, width, height); - m_isModified = true; - } - - /** - * Change the size of the view (take 2 values) - * - * Params: - * size = New size - */ - void setSize(Vector2f size) - { - sfView_SetSize(m_ptr, size.x, size.y); - m_isModified = true; - } - - /** - * Rebuild the view from a rectangle - * - * Params: - * viewport : Rectangle defining the position and size of the view - */ - void setViewport(FloatRect viewport) - { - sfView_SetViewport(m_ptr, viewport); - _viewport = viewport; - } - - /** - * Get the center of the view - * - * Returns: - * Center of the view - */ - Vector2f getCenter() - { - return Vector2f(sfView_GetCenterX(m_ptr), sfView_GetCenterY(m_ptr)); - } - - /** - * Get the size of the view - * - * Returns: - * size of the view - */ - Vector2f getSize() - { - return Vector2f(sfView_GetWidth(m_ptr), sfView_GetHeight(m_ptr)); - } - - /** - * Get the width of the view - * - * Returns: - * width of the view - */ - float getWidth() - { - return sfView_GetWidth(m_ptr); - } - - /** - * Get the height of the view - * - * Returns: - * height of the view - */ - float getHeight() - { - return sfView_GetHeight(m_ptr); - } - - /** - * Get the bounding retangle of the view - */ - FloatRect getViewport() - { - if (m_isModified) - { - m_isModified = false; - _viewport = sfView_GetViewport(m_ptr); - } - return _viewport; - } - - /** - * Move the view - * - * Params: - * offsetX = Offset to move the view, on X axis - * offsetY = Offset to move the view, on Y axis - */ - View move(float offsetX, float offsetY) - { - sfView_Move(m_ptr, offsetX, offsetY); - m_isModified = true; - - return this; - } - - /** - * Move the view - * - * Params: - * offset = offsetto move the view - */ - View move(Vector2f offset) - { - sfView_Move(m_ptr, offset.x, offset.y); - m_isModified = true; - - return this; - } - - /** - * Resize the view rectangle to simulate a zoom / unzoom effect - * - * Params: - * factor = Zoom factor to apply, relative to the current zoom - */ - View zoom(float factor) - { - sfView_Zoom(m_ptr, factor); - m_isModified = true; - - return this; - } - - /** - * Rotate the view relatively to its current orientation. - * - * Params: - * angle = Angle to rotate, in degree - */ - View rotate(float angle) - { - sfView_Rotate(m_ptr, angle); - - return this; - } - - /** - * Set the orientation of the view - * The default rotation of a view is 0 degree - * - * Params: - * angle = New angle, in degrees - */ - View setRotation(float angle) - { - sfView_SetRotation(m_ptr, angle); - - return this; - } - - /** - * Get the current orientation of the view - * - * Returns: - * Rotation angle of the view, in degrees - */ - float getRotation() - { - return sfView_GetRotation(m_ptr); - } - - void reset(FloatRect rect) - { - sfView_Reset(m_ptr, rect); - _rect = rect; - } -package: - - this(SFMLClass ptr, bool preventDelete) - { - super(ptr, preventDelete); - } - -private: - static extern(C) - { - SFMLClass function() sfView_Create; - SFMLClass function(FloatRect) sfView_CreateFromRect; - void function(SFMLClass) sfView_Destroy; - void function(SFMLClass, float, float) sfView_SetCenter; - void function(SFMLClass, float, float) sfView_SetSize; - void function(SFMLClass, FloatRect) sfView_SetViewport; - float function(SFMLClass) sfView_GetCenterX; - float function(SFMLClass) sfView_GetCenterY; - float function(SFMLClass) sfView_GetWidth; - float function(SFMLClass) sfView_GetHeight; - FloatRect function(SFMLClass) sfView_GetViewport; - void function(SFMLClass, float, float) sfView_Move; - void function(SFMLClass, float) sfView_Zoom; - - // DSFML2 - void function(SFMLClass, float) sfView_SetRotation; - float function(SFMLClass) sfView_GetRotation; - void function(SFMLClass, float) sfView_Rotate; - void function(SFMLClass, FloatRect) sfView_Reset; - } - - static this() - { - debug - DllLoader dll = DllLoader.load("csfml-graphics-d-2"); - else - DllLoader dll = DllLoader.load("csfml-graphics-2"); - - mixin(loadFromSharedLib("sfView_Create")); - mixin(loadFromSharedLib("sfView_CreateFromRect")); - mixin(loadFromSharedLib("sfView_Destroy")); - mixin(loadFromSharedLib("sfView_SetCenter")); - mixin(loadFromSharedLib("sfView_SetSize")); - mixin(loadFromSharedLib("sfView_SetViewport")); - mixin(loadFromSharedLib("sfView_GetCenterX")); - mixin(loadFromSharedLib("sfView_GetCenterY")); - mixin(loadFromSharedLib("sfView_GetWidth")); - mixin(loadFromSharedLib("sfView_GetHeight")); - mixin(loadFromSharedLib("sfView_GetViewport")); - mixin(loadFromSharedLib("sfView_Move")); - mixin(loadFromSharedLib("sfView_Zoom")); - - // DSFML2 - mixin(loadFromSharedLib("sfView_SetRotation")); - mixin(loadFromSharedLib("sfView_GetRotation")); - mixin(loadFromSharedLib("sfView_Rotate")); - mixin(loadFromSharedLib("sfView_Reset")); - } -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/network/all.d b/bindings/d/import/dsfml/network/all.d deleted file mode 100644 index 4a310d8c..00000000 --- a/bindings/d/import/dsfml/network/all.d +++ /dev/null @@ -1,38 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.network.all; - -public import - dsfml.network.ftp, - dsfml.network.http, - dsfml.network.ipaddress, - dsfml.network.packet, - dsfml.network.socketselector, - dsfml.network.socketstatus, - dsfml.network.tcpsocket, - dsfml.network.udpsocket, - dsfml.network.tcplistener ; diff --git a/bindings/d/import/dsfml/network/ftp.d b/bindings/d/import/dsfml/network/ftp.d deleted file mode 100644 index 7fbc36cd..00000000 --- a/bindings/d/import/dsfml/network/ftp.d +++ /dev/null @@ -1,602 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.network.ftp; - -import dsfml.system.common; -import dsfml.system.stringutil; - -import dsfml.network.ipaddress; - - -/** -* Enumeration of transfer mode -*/ -enum FtpTransferMode -{ - BINARY, ///< Binary mode (file is transfered as a sequence of bytes) - ASCII, ///< Text mode using ASCII encoding - EBCDIC ///< Text mode using EBCDIC encoding -} - -/** -* Enumerate all the valid status codes returned in -* a FTP response -*/ -enum FtpStatus -{ - // 1xx: the requested action is being initiated, - // expect another reply before proceeding with a new command - RESTARTMARKERREPLY = 110, ///< Restart marker reply - SERVICEREADYSOON = 120, ///< Service ready in N minutes - DATACONNECTIONALREADYOPENED = 125, ///< Data connection already opened, transfer starting - OPENINGDATACONNECTION = 150, ///< File status ok, about to open data connection - - // 2xx: the requested action has been successfully completed - OK = 200, ///< Command ok - POINTLESSCOMMAND = 202, ///< Command not implemented - SYSTEMSTATUS = 211, ///< System status, or system help reply - DIRECTORYSTATUS = 212, ///< Directory status - FILESTATUS = 213, ///< File status - HELPMESSAGE = 214, ///< Help message - SYSTEMTYPE = 215, ///< NAME system type, where NAME is an official system name from the list in the Assigned Numbers document - SERVICEREADY = 220, ///< Service ready for new user - CLOSINGCONNECTION = 221, ///< Service closing control connection - DATACONNECTIONOPENED = 225, ///< Data connection open, no transfer in progress - CLOSINGDATACONNECTION = 226, ///< Closing data connection, requested file action successful - ENTERINGPASSIVEMODE = 227, ///< Entering passive mode - LOGGEDIN = 230, ///< User logged in, proceed. Logged out if appropriate - FILEACTIONOK = 250, ///< Requested file action ok - DIRECTORYOK = 257, ///< PATHNAME created - - // 3xx: the command has been accepted, but the requested action - // is dormant, pending receipt of further information - NEEDPASSWORD = 331, ///< User name ok, need password - NEEDACCOUNTTOLOGIN = 332, ///< Need account for login - NEEDINFORMATION = 350, ///< Requested file action pending further information - - // 4xx: the command was not accepted and the requested action did not take place, - // but the error condition is temporary and the action may be requested again - SERVICEUNAVAILABLE = 421, ///< Service not available, closing control connection - DATACONNECTIONUNAVAILABLE = 425, ///< Can't open data connection - TRANSFERABORTED = 426, ///< Connection closed, transfer aborted - FILEACTIONABORTED = 450, ///< Requested file action not taken - LOCALERROR = 451, ///< Requested action aborted, local error in processing - INSUFFICIENTSTORAGESPACE = 452, ///< Requested action not taken; insufficient storage space in system, file unavailable - - // 5xx: the command was not accepted and - // the requested action did not take place - COMMANDUNKNOWN = 500, ///< Syntax error, command unrecognized - PARAMETERSUNKNOWN = 501, ///< Syntax error in parameters or arguments - COMMANDNOTIMPLEMENTED = 502, ///< Command not implemented - BADCOMMANDSEQUENCE = 503, ///< Bad sequence of commands - PARAMETERNOTIMPLEMENTED = 504, ///< Command not implemented for that parameter - NOTLOGGEDIN = 530, ///< Not logged in - NEEDACCOUNTTOSTORE = 532, ///< Need account for storing files - FILEUNAVAILABLE = 550, ///< Requested action not taken, file unavailable - PAGETYPEUNKNOWN = 551, ///< Requested action aborted, page type unknown - NOTENOUGHMEMORY = 552, ///< Requested file action aborted, exceeded storage allocation - FILENAMENOTALLOWED = 553, ///< Requested action not taken, file name not allowed - - // 10xx: SFML custom codes - INVALIDRESPONSE = 1000, ///< Response is not a valid FTP one - CONNECTIONFAILED = 1001, ///< Connection with server failed - CONNECTIONCLOSED = 1002, ///< Connection with server closed - INVALIDFILE = 1003 ///< Invalid file to upload / download -} - - -/** -* This class provides methods for manipulating the FTP protocol (described in RFC 959). -* It provides easy access and transfers to remote directories and files on a FTP server. -*/ -class Ftp : DSFMLObject -{ - /** - * This class wraps a FTP response, which is basically : - * - a status code - * - a message - */ - static class FtpResponse : DSFMLObject - { - override void dispose() - { - sfFtpResponse_Destroy(m_ptr); - } - - /** - * Convenience function to check if the response status code - * means a success - * - * Returns: - * True if status is success (code < 400) - */ - bool isOk() - { - return cast(bool)sfFtpResponse_IsOk(m_ptr); - } - - /** - * Get the response status code - * - * Returns: - * Status code - */ - FtpStatus getStatus() - { - return sfFtpResponse_GetStatus(m_ptr); - } - - /** - * Get the full message contained in the response - * - * Returns: - * The response message - */ - string getMessage() - { - return fromStringz(sfFtpResponse_GetMessage(m_ptr)); - } - - private: - this(SFMLClass ptr) - { - super(ptr); - } - // External ================================================================ - - extern (C) - { - typedef void function(SFMLClass) pf_sfFtpResponse_Destroy; - typedef int function(SFMLClass) pf_sfFtpResponse_IsOk; - typedef FtpStatus function(SFMLClass) pf_sfFtpResponse_GetStatus; - typedef ichar* function(SFMLClass) pf_sfFtpResponse_GetMessage; - - static pf_sfFtpResponse_Destroy sfFtpResponse_Destroy; - static pf_sfFtpResponse_IsOk sfFtpResponse_IsOk; - static pf_sfFtpResponse_GetStatus sfFtpResponse_GetStatus; - static pf_sfFtpResponse_GetMessage sfFtpResponse_GetMessage; - } - static this() - { - DllLoader dll = DllLoader.load("csfml-network-2"); - - sfFtpResponse_Destroy = cast(pf_sfFtpResponse_Destroy)dll.getSymbol("sfFtpResponse_Destroy"); - sfFtpResponse_IsOk = cast(pf_sfFtpResponse_IsOk)dll.getSymbol("sfFtpResponse_IsOk"); - sfFtpResponse_GetStatus = cast(pf_sfFtpResponse_GetStatus)dll.getSymbol("sfFtpResponse_GetStatus"); - sfFtpResponse_GetMessage = cast(pf_sfFtpResponse_GetMessage)dll.getSymbol("sfFtpResponse_GetMessage"); - } - } - - /** - * Specialization of FTP response returning a directory - */ - static class FtpDirectoryResponse : FtpResponse - { - override void dispose() - { - sfFtpDirectoryResponse_Destroy(m_ptr); - } - - /** - * Get the directory returned in the response. - * - * Returns: - * Directory name - */ - string getDirectory() - { - return fromStringz(sfFtpDirectoryResponse_GetDirectory(m_ptr)); - } - - private: - this(SFMLClass ptr) - { - super(ptr); - } - // External ================================================================ - - extern (C) - { - typedef void function(SFMLClass) pf_sfFtpDirectoryResponse_Destroy; - typedef ichar* function(SFMLClass) pf_sfFtpDirectoryResponse_GetDirectory; - - static pf_sfFtpDirectoryResponse_Destroy sfFtpDirectoryResponse_Destroy; - static pf_sfFtpDirectoryResponse_GetDirectory sfFtpDirectoryResponse_GetDirectory; - } - static this() - { - DllLoader dll = DllLoader.load("csfml-network-2"); - - sfFtpDirectoryResponse_Destroy = cast(pf_sfFtpDirectoryResponse_Destroy)dll.getSymbol("sfFtpDirectoryResponse_Destroy"); - sfFtpDirectoryResponse_GetDirectory = cast(pf_sfFtpDirectoryResponse_GetDirectory)dll.getSymbol("sfFtpDirectoryResponse_GetDirectory"); - } - - } - - /** - * Specialization of FTP response returning a filename listing. - */ - static class FtpListingResponse : FtpResponse - { - override void dispose() - { - sfFtpListingResponse_Destroy(m_ptr); - } - - /** - * Get the number of files in the listing - * - * Returns: - * Total number of files - */ - size_t getCount() - { - return sfFtpListingResponse_GetCount(m_ptr); - } - - /** - * Get the index-th filename in the directory - * - * Params: - * index = Index of the filename to get - * - * Returns: - * Filename - */ - string opIndex(size_t index) - { - return fromStringz(sfFtpListingResponse_GetFilename(m_ptr, index)); - } - - /** - * Foreach implementation - */ - int opApply(int delegate(string) dg) - { - size_t count = getCount(); - int result; - - for(int i = 0; i < count; i++) - { - result = dg(this[i]); - if (result) - break; - } - - return result; - } - - private: - this(SFMLClass ptr) - { - super(ptr); - } - - // External ================================================================ - extern (C) - { - typedef void function(SFMLClass) pf_sfFtpListingResponse_Destroy; - typedef size_t function(SFMLClass) pf_sfFtpListingResponse_GetCount; - typedef ichar* function(SFMLClass, size_t) pf_sfFtpListingResponse_GetFilename; - - static pf_sfFtpListingResponse_Destroy sfFtpListingResponse_Destroy; - static pf_sfFtpListingResponse_GetCount sfFtpListingResponse_GetCount; - static pf_sfFtpListingResponse_GetFilename sfFtpListingResponse_GetFilename; - } - static this() - { - DllLoader dll = DllLoader.load("csfml-network-2"); - - sfFtpListingResponse_Destroy = cast(pf_sfFtpListingResponse_Destroy)dll.getSymbol("sfFtpListingResponse_Destroy"); - sfFtpListingResponse_GetCount = cast(pf_sfFtpListingResponse_GetCount)dll.getSymbol("sfFtpListingResponse_GetCount"); - sfFtpListingResponse_GetFilename = cast(pf_sfFtpListingResponse_GetFilename)dll.getSymbol("sfFtpListingResponse_GetFilename"); - } - } - - /** - * Default constructor - */ - this() - { - super(sfFtp_Create()); - } - - override void dispose() - { - sfFtp_Destroy(m_ptr); - } - - /** - * Connect to the specified FTP server - * - * Params: - * server = FTP server to connect to - * port = Port used for connection (21 by default, standard FTP port) - * timeout = Maximum time to wait, in seconds (0 by default, means no timeout) - * - * Returns: - * Server response to the request - */ - FtpResponse connect(IPAddress server, ushort port = 21, float timeout = 0.f) - { - return new FtpResponse(sfFtp_Connect(m_ptr, server, port, timeout)); - } - - /** - * Log in using anonymous account - * - * Returns: - * Server response to the request - */ - FtpResponse login() - { - return new FtpResponse(sfFtp_LoginAnonymous(m_ptr)); - } - - /** - * Log in using a username and a password - * - * Params: - * username = User name - * password = password - * - * Returns: - * Server response to the request - */ - FtpResponse login(string username, string password) - { - return new FtpResponse(sfFtp_Login(m_ptr, toStringz(username), toStringz(password))); - } - - /** - * Close the connection with FTP server - * - * Returns: - * Server response to the request - */ - FtpResponse disconnect() - { - return new FtpResponse(sfFtp_Disconnect(m_ptr)); - } - - /** - * Send a null command to prevent from being disconnected. - * - * Returns: - * Server response to the request - */ - FtpResponse keepAlive() - { - return new FtpResponse(sfFtp_KeepAlive(m_ptr)); - } - - /** - * Get the current working directory - * - * Returns: - * Server response to the request - */ - FtpDirectoryResponse getWorkingDirectory() - { - return new FtpDirectoryResponse(sfFtp_GetWorkingDirectory(m_ptr)); - } - - /** - * Get the content of the given directory (subdirectories and files). - * - * Params: - * directory = directory to list (null by default, the current one) - * - * Returns: - * Server response to the request - */ - FtpListingResponse getDirectoryListing(string directory = null) - { - return new FtpListingResponse(sfFtp_GetDirectoryListing(m_ptr, toStringz(directory))); - } - - /** - * Change the current working directory - * - * Params: - * directory = New directory, relative to the current one. - * - * Returns: - * Server response to the request - */ - FtpResponse changeDirectory(string directory) - { - return new FtpResponse(sfFtp_ChangeDirectory(m_ptr, toStringz(directory))); - } - - /** - * Go to the parent directory of the current one - * - * Returns: - * Server response to the request - */ - FtpResponse parentDirectory() - { - return new FtpResponse(sfFtp_ParentDirectory(m_ptr)); - } - - /** - * Create a new directory - * - * Params: - * name = name of the directory to create - * - * Returns: - * Server response to the request - */ - FtpResponse createDirectory(string name) - { - return new FtpResponse(sfFtp_CreateDirectory(m_ptr, toStringz(name))); - } - - /** - * remove an existing directory - * - * Params: - * name = name of the directory to remove - * - * Returns: - * Server response to the request - */ - FtpResponse deleteDirectory(string name) - { - return new FtpResponse(sfFtp_DeleteDirectory(m_ptr, toStringz(name))); - } - - /** - * Rename a file - * - * Params: - * name = file to rename - * newName = new name - * - * Returns: - * Server response to the request - */ - FtpResponse renameFile(string name, string newName) - { - return new FtpResponse(sfFtp_RenameFile(m_ptr, toStringz(name), toStringz(newName))); - } - - /** - * Remove an existing file - * - * Params: - * name = file to remove - * - * Returns: - * Server response to the request - */ - FtpResponse deleteFile(string name) - { - return new FtpResponse(sfFtp_DeleteFile(m_ptr, toStringz(name))); - } - - /** - * Download a file from the server - * - * Params: - * distantFile = Path of the distant file to download - * destFile = Where to put the file on the local computer - * mode = transfer mode (binary by default) - * - * Returns: - * Server response to the request - */ - FtpResponse download(string distantFile, string destFile, FtpTransferMode mode = FtpTransferMode.BINARY) - { - return new FtpResponse(sfFtp_Download(m_ptr, toStringz(distantFile), toStringz(destFile), mode)); - } - - /** - * Upload a file to the server - * - * Params: - * localFile = Path of the local file to upload - * destPath = Where to put the file on the server - * mode = transfer mode (binary by default) - * Returns: - * Server response to the request - */ - FtpResponse upload(string localFile, string destFile, FtpTransferMode mode = FtpTransferMode.BINARY) - { - return new FtpResponse(sfFtp_Upload(m_ptr, toStringz(localFile), toStringz(destFile), mode)); - } - -private: - -// External ==================================================================== - - extern (C) - { - typedef SFMLClass function() pf_sfFtp_Create; - typedef void function(SFMLClass) pf_sfFtp_Destroy; - typedef SFMLClass function(SFMLClass, IPAddress, ushort, float) pf_sfFtp_Connect; - typedef SFMLClass function(SFMLClass) pf_sfFtp_LoginAnonymous; - typedef SFMLClass function(SFMLClass, cchar*, cchar*) pf_sfFtp_Login; - typedef SFMLClass function(SFMLClass) pf_sfFtp_Disconnect; - typedef SFMLClass function(SFMLClass) pf_sfFtp_KeepAlive; - typedef SFMLClass function(SFMLClass) pf_sfFtp_GetWorkingDirectory; - typedef SFMLClass function(SFMLClass, cchar*) pf_sfFtp_GetDirectoryListing; - typedef SFMLClass function(SFMLClass, cchar*) pf_sfFtp_ChangeDirectory; - typedef SFMLClass function(SFMLClass) pf_sfFtp_ParentDirectory; - typedef SFMLClass function(SFMLClass, cchar*) pf_sfFtp_CreateDirectory; - typedef SFMLClass function(SFMLClass, cchar*) pf_sfFtp_DeleteDirectory; - typedef SFMLClass function(SFMLClass, cchar*, cchar*) pf_sfFtp_RenameFile; - typedef SFMLClass function(SFMLClass, cchar*) pf_sfFtp_DeleteFile; - typedef SFMLClass function(SFMLClass, cchar*, cchar*, FtpTransferMode) pf_sfFtp_Download; - typedef SFMLClass function(SFMLClass, cchar*, cchar*, FtpTransferMode) pf_sfFtp_Upload; - - static pf_sfFtp_Create sfFtp_Create; - static pf_sfFtp_Destroy sfFtp_Destroy; - static pf_sfFtp_Connect sfFtp_Connect; - static pf_sfFtp_LoginAnonymous sfFtp_LoginAnonymous; - static pf_sfFtp_Login sfFtp_Login; - static pf_sfFtp_Disconnect sfFtp_Disconnect; - static pf_sfFtp_KeepAlive sfFtp_KeepAlive; - static pf_sfFtp_GetWorkingDirectory sfFtp_GetWorkingDirectory; - static pf_sfFtp_GetDirectoryListing sfFtp_GetDirectoryListing; - static pf_sfFtp_ChangeDirectory sfFtp_ChangeDirectory; - static pf_sfFtp_ParentDirectory sfFtp_ParentDirectory; - static pf_sfFtp_CreateDirectory sfFtp_CreateDirectory; - static pf_sfFtp_DeleteDirectory sfFtp_DeleteDirectory; - static pf_sfFtp_RenameFile sfFtp_RenameFile; - static pf_sfFtp_DeleteFile sfFtp_DeleteFile; - static pf_sfFtp_Download sfFtp_Download; - static pf_sfFtp_Upload sfFtp_Upload; - } - static this() - { - debug - DllLoader dll = DllLoader.load("csfml-network-d-2"); - else - DllLoader dll = DllLoader.load("csfml-network-2"); - - sfFtp_Create = cast(pf_sfFtp_Create)dll.getSymbol("sfFtp_Create"); - sfFtp_Destroy = cast(pf_sfFtp_Destroy)dll.getSymbol("sfFtp_Destroy"); - sfFtp_Connect = cast(pf_sfFtp_Connect)dll.getSymbol("sfFtp_Connect"); - sfFtp_LoginAnonymous = cast(pf_sfFtp_LoginAnonymous)dll.getSymbol("sfFtp_LoginAnonymous"); - sfFtp_Login = cast(pf_sfFtp_Login)dll.getSymbol("sfFtp_Login"); - sfFtp_Disconnect = cast(pf_sfFtp_Disconnect)dll.getSymbol("sfFtp_Disconnect"); - sfFtp_KeepAlive = cast(pf_sfFtp_KeepAlive)dll.getSymbol("sfFtp_KeepAlive"); - sfFtp_GetWorkingDirectory = cast(pf_sfFtp_GetWorkingDirectory)dll.getSymbol("sfFtp_GetWorkingDirectory"); - sfFtp_GetDirectoryListing = cast(pf_sfFtp_GetDirectoryListing)dll.getSymbol("sfFtp_GetDirectoryListing"); - sfFtp_ChangeDirectory = cast(pf_sfFtp_ChangeDirectory)dll.getSymbol("sfFtp_ChangeDirectory"); - sfFtp_ParentDirectory = cast(pf_sfFtp_ParentDirectory)dll.getSymbol("sfFtp_ParentDirectory"); - sfFtp_sfFtp_CreateDirectoryDirectory = cast(pf_sfFtp_CreateDirectory)dll.getSymbol("sfFtp_CreateDirectory"); - sfFtp_DeleteDirectory = cast(pf_sfFtp_DeleteDirectory)dll.getSymbol("sfFtp_DeleteDirectory"); - sfFtp_RenameFile = cast(pf_sfFtp_RenameFile)dll.getSymbol("sfFtp_RenameFile"); - sfFtp_DeleteFile = cast(pf_sfFtp_DeleteFile)dll.getSymbol("sfFtp_DeleteFile"); - sfFtp_Download = cast(pf_sfFtp_Download)dll.getSymbol("sfFtp_Download"); - sfFtp_Upload = cast(pf_sfFtp_Upload)dll.getSymbol("sfFtp_Upload"); - } -} diff --git a/bindings/d/import/dsfml/network/http.d b/bindings/d/import/dsfml/network/http.d deleted file mode 100644 index 1ab94302..00000000 --- a/bindings/d/import/dsfml/network/http.d +++ /dev/null @@ -1,398 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.network.http; - -import dsfml.system.stringutil; -import dsfml.system.common; - -/** -* HTTP methods enumeration -*/ -enum HttpMethod -{ - GET, ///< Request in get mode, standard method to retrieve a page - POST, ///< Request in post mode, usually to send data to a page - HEAD ///< Request a page's header only -} - -/** -* HTTP response status code -*/ -enum HttpStatus -{ - // 2xx: success - OK = 200, ///< Most common code returned when operation was successful - CREATED = 201, ///< The resource has successfully been created - ACCEPTED = 202, ///< The request has been accepted, but will be processed later by the server - NOCONTENT = 204, ///< Sent when the server didn't send any data in return - - // 3xx: redirection - MULTIPLECHOICES = 300, ///< The requested page can be accessed from several locations - MOVEDPERMANENTLY = 301, ///< The requested page has permanently moved to a new location - MOVEDTEMPORARILY = 302, ///< The requested page has temporarily moved to a new location - NOTMODIFIED = 304, ///< For conditionnal requests, means the requested page hasn't changed and doesn't need to be refreshed - - // 4xx: client error - BADREQUEST = 400, ///< The server couldn't understand the request (syntax error) - UNAUTHORIZED = 401, ///< The requested page needs an authentification to be accessed - FORBIDDEN = 403, ///< The requested page cannot be accessed at all, even with authentification - NOTFOUND = 404, ///< The requested page doesn't exist - - // 5xx: server error - INTERNALSERVERERROR = 500, ///< The server encountered an unexpected error - NOTIMPLEMENTED = 501, ///< The server doesn't implement a requested feature - BADGATEWAY = 502, ///< The gateway server has received an error from the source server - SERVICENOTAVAILABLE = 503, ///< The server is temporarily unavailable (overloaded, in maintenance, ...) - - // 10xx: SFML custom codes - INVALIDRESPONSE = 1000, ///< Response is not a valid HTTP one - CONNECTIONFAILED = 1001 ///< Connection with server failed -} - -/** -* This class provides methods for manipulating the HTTP protocol (described in -* RFC 1945). -* It can connect to a website, get files, send requests -*/ -class Http : DSFMLObject -{ - /** - * Wrapper for a http request, which is basically : - * - a header with a method, a target URI and a set of field/value pairs - * - an optional body (for POST requests) - */ - static class Response : DSFMLObject - { - override void dispose() - { - sfHttpResponse_Destroy(m_ptr); - } - - /** - * Get the value of a field - * - * Params: - * field = Name of the field to get (case-insensitive) - * Returns: - * Value of the field, or enpty string if not found - */ - string getField(string field) - { - return fromStringz(sfHttpResponse_GetField(m_ptr, toStringz(field))); - } - - /** - * Get the header status code - * - * Returns: - * header status code - */ - HttpStatus getStatus() - { - return sfHttpResponse_GetStatus(m_ptr); - } - - /** - * Get the major HTTP version number of the response - * - * Returns: - * Major version number - */ - uint getMajorHTTPVersion() - { - return sfHttpResponse_GetMajorVersion(m_ptr); - } - - /** - * Get the minor HTTP version number of the response - * - * Returns: - * Minor version number - */ - uint getMinorHTTPVersion() - { - return sfHttpResponse_GetMinorVersion(m_ptr); - } - - /** - * Get the body of the response. The body can contain : - * - the requested page (for GET requests) - * - a response from the server (for POST requests) - * - nothing (for HEAD requests) - * - an error message (in case of an error) - * - * Returns: - * the response body - */ - string getBody() - { - return fromStringz(sfHttpResponse_GetBody(m_ptr)); - } - - private: - this(SFMLClass ptr) - { - super(ptr); - } - // External ================================================================ - extern (C) - { - typedef void function(SFMLClass) pf_sfHttpResponse_Destroy; - typedef ichar* function(SFMLClass, cchar*) pf_sfHttpResponse_GetField; - typedef HttpStatus function(SFMLClass) pf_sfHttpResponse_GetStatus; - typedef uint function(SFMLClass) pf_sfHttpResponse_GetMajorVersion; - typedef uint function(SFMLClass) pf_sfHttpResponse_GetMinorVersion; - typedef ichar* function(SFMLClass) pf_sfHttpResponse_GetBody; - - static pf_sfHttpResponse_Destroy sfHttpResponse_Destroy; - static pf_sfHttpResponse_GetField sfHttpResponse_GetField; - static pf_sfHttpResponse_GetStatus sfHttpResponse_GetStatus; - static pf_sfHttpResponse_GetMajorVersion sfHttpResponse_GetMajorVersion; - static pf_sfHttpResponse_GetMinorVersion sfHttpResponse_GetMinorVersion; - static pf_sfHttpResponse_GetBody sfHttpResponse_GetBody; - } - - static this() - { - DllLoader dll = DllLoader.load("csfml-network-2"); - - sfHttpResponse_Destroy = cast(pf_sfHttpResponse_Destroy)dll.getSymbol("sfHttpResponse_Destroy"); - sfHttpResponse_GetField = cast(pf_sfHttpResponse_GetField)dll.getSymbol("sfHttpResponse_GetField"); - sfHttpResponse_GetStatus = cast(pf_sfHttpResponse_GetStatus)dll.getSymbol("sfHttpResponse_GetStatus"); - sfHttpResponse_GetMajorVersion = cast(pf_sfHttpResponse_GetMajorVersion)dll.getSymbol("sfHttpResponse_GetMajorVersion"); - sfHttpResponse_GetMinorVersion = cast(pf_sfHttpResponse_GetMinorVersion)dll.getSymbol("sfHttpResponse_GetMinorVersion"); - sfHttpResponse_GetBody = cast(pf_sfHttpResponse_GetBody)dll.getSymbol("sfHttpResponse_GetBody"); - } - } - - /** - * Wrapper for a HTTP response which is basically : - * - a header with a status code and a set of field/value pairs - * - a body (the content of the requested resource) - */ - static class Request : DSFMLObject - { - /** - * Constructor - * - * Params: - * requestMethod = Method to use for the request (Get by default) - * uri = Target URI ("/" by default -- index page) - * requestBody = Content of the request's body (empty by default) - */ - this(HttpMethod requestMethod = HttpMethod.GET, string uri = "/", string requestBody = "") - { - super(sfHttpRequest_Create()); - sfHttpRequest_SetMethod(m_ptr, requestMethod); - sfHttpRequest_SetUri(m_ptr, toStringz(uri)); - sfHttpRequest_SetBody(m_ptr, toStringz(requestBody)); - } - - /** - * Set the value of a field. Field is created if it doesn't exists. - * - * Params: - * field = name of the field to set (case-insensitive) - * value = value of the field - */ - void setField(string field, string value) - { - sfHttpRequest_SetField(m_ptr, toStringz(field), toStringz(value)); - } - - /** - * Set the request method. - * - * Params: - * requestMethod = Method to use for the request. - */ - void setMethod(HttpMethod requestMethod) - { - sfHttpRequest_SetMethod(m_ptr, requestMethod); - } - - /** - * Set the target URI of the request. - * - * Params: - * uri = URI to request, local to the host. - * Returns: - */ - void setUri(string uri) - { - sfHttpRequest_SetUri(m_ptr, toStringz(uri)); - } - - /** - * Set the HTTP version of the request. - * - * Params: - * major = Major version number - * minor = Minor version number - */ - void setHttpVersion(uint major, uint minor) - { - sfHttpRequest_SetHttpVersion(m_ptr, major, minor); - } - - /** - * Set the body of the request. This parameter is optionnal and make sense - * only for POST requests. - * - * Params: - * requestBody = Content of the request body. - */ - void setBody(string requestBody) - { - sfHttpRequest_SetBody(m_ptr, toStringz(requestBody)); - } - - private: - - // External ================================================================ - extern (C) - { - typedef SFMLClass function() pf_sfHttpRequest_Create; - typedef void function(SFMLClass) pf_sfHttpRequest_Destroy; - typedef void function(SFMLClass, cchar*, cchar*) pf_sfHttpRequest_SetField; - typedef void function(SFMLClass, HttpMethod) pf_sfHttpRequest_SetMethod; - typedef void function(SFMLClass, cchar*) pf_sfHttpRequest_SetUri; - typedef void function(SFMLClass, uint, uint) pf_sfHttpRequest_SetHttpVersion; - typedef void function(SFMLClass, cchar*) pf_sfHttpRequest_SetBody; - - static pf_sfHttpRequest_Create sfHttpRequest_Create; - static pf_sfHttpRequest_Destroy sfHttpRequest_Destroy; - static pf_sfHttpRequest_SetField sfHttpRequest_SetField; - static pf_sfHttpRequest_SetMethod sfHttpRequest_SetMethod; - static pf_sfHttpRequest_SetUri sfHttpRequest_SetUri; - static pf_sfHttpRequest_SetHttpVersion sfHttpRequest_SetHttpVersion; - static pf_sfHttpRequest_SetBody sfHttpRequest_SetBody; - } - - static this() - { - DllLoader dll = DllLoader.load("csfml-network-2"); - - sfHttpRequest_Create = cast(pf_sfHttpRequest_Create)dll.getSymbol("sfHttpRequest_Create"); - sfHttpRequest_Destroy = cast(pf_sfHttpRequest_Destroy)dll.getSymbol("sfHttpRequest_Destroy"); - sfHttpRequest_SetField = cast(pf_sfHttpRequest_SetField)dll.getSymbol("sfHttpRequest_SetField"); - sfHttpRequest_SetMethod = cast(pf_sfHttpRequest_SetMethod)dll.getSymbol("sfHttpRequest_SetMethod"); - sfHttpRequest_SetUri = cast(pf_sfHttpRequest_SetUri)dll.getSymbol("sfHttpRequest_SetUri"); - sfHttpRequest_SetHttpVersion = cast(pf_sfHttpRequest_SetHttpVersion)dll.getSymbol("sfHttpRequest_SetHttpVersion"); - sfHttpRequest_SetBody = cast(pf_sfHttpRequest_SetBody)dll.getSymbol("sfHttpRequest_SetBody"); - } - } - - /** - * Constructor - */ - this() - { - super(sfHttp_Create()); - } - - /** - * Constructor - * - * Params: - * host = Web server to connect to - * port = port to use for connection (0 by default -- use the standard port of the protocol) - */ - this(string host, ushort port = 0) - { - super(sfHttp_Create()); - sfHttp_SetHost(m_ptr, toStringz(host), port); - } - - override void dispose() - { - sfHttp_Destroy(m_ptr); - } - - /** - * Set the target host. - * - * Params: - * host = Web server to connect to - * port = port to use for connection (0 by default -- use the standard port of the protocol) - */ - void setHost(string host, ushort port = 0) - { - sfHttp_SetHost(m_ptr, toStringz(host), port); - } - - /** - * Send a HTTP request and return the server's response. - * You must be connected to a host before sending requests. - * Any missing mandatory header field will be added with an appropriate value. - * - * Warning : this function waits for the server's response and may - * not return instantly; use a thread if you don't want to block your - * application. - * - * Params: - * req = Request to send - * - * Returns: - * Server's response - */ - - Response sendRequest(Request req) - { - return new Response( sfHttp_SendRequest(m_ptr, req.nativePointer) ); - } - -private: - -// External ==================================================================== - - extern (C) - { - typedef SFMLClass function() pf_sfHttp_Create; - typedef void function(SFMLClass) pf_sfHttp_Destroy; - typedef void function(SFMLClass, cchar*, ushort) pf_sfHttp_SetHost; - typedef SFMLClass function(SFMLClass, SFMLClass) pf_sfHttp_SendRequest; - - static pf_sfHttp_Create sfHttp_Create; - static pf_sfHttp_Destroy sfHttp_Destroy; - static pf_sfHttp_SetHost sfHttp_SetHost; - static pf_sfHttp_SendRequest sfHttp_SendRequest; - } - - static this() - { - debug - DllLoader dll = DllLoader.load("csfml-network-d-2"); - else - DllLoader dll = DllLoader.load("csfml-network-2"); - - sfHttp_Create = cast(pf_sfHttp_Create)dll.getSymbol("sfHttp_Create"); - sfHttp_Destroy = cast(pf_sfHttp_Destroy)dll.getSymbol("sfHttp_Destroy"); - sfHttp_SetHost = cast(pf_sfHttp_SetHost)dll.getSymbol("sfHttp_SetHost"); - sfHttp_SendRequest = cast(pf_sfHttp_SendRequest)dll.getSymbol("sfHttp_SendRequest"); - } -} diff --git a/bindings/d/import/dsfml/network/ipaddress.d b/bindings/d/import/dsfml/network/ipaddress.d deleted file mode 100644 index fd785c86..00000000 --- a/bindings/d/import/dsfml/network/ipaddress.d +++ /dev/null @@ -1,148 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.network.ipaddress; - -import dsfml.system.common; -import dsfml.system.stringutil; - -/** - * IPAddress provides easy manipulation of IP v4 addresses - */ -struct IPAddress -{ - byte[16] Address; - - /** - * Construct the address from a string - * - * Params: - * address = IP address ("xxx.xxx.xxx.xxx") or network name - * - */ - static opCall(string address) - { - return sfIpAddress_FromString(toStringz(address)); - } - - - /** - * Construct the address from 4 bytes - * - * Params: - * byte0 = First byte of the address - * byte1 = Second byte of the address - * byte2 = Third byte of the address - * byte3 = Fourth byte of the address - * - */ - static opCall(ubyte byte0, ubyte byte1, ubyte byte2, ubyte byte3) - { - return sfIpAddress_FromBytes(byte0, byte1, byte2, byte3); - } - - /** - * Construct the address from a 32 bits integer - * - * Params: - * address = 4 bytes of the address packed into a 32 bits integer - * - */ - static opCall(uint address) - { - return sfIpAddress_FromInteger(address); - } - - /** - * Get the empty/invalid address - * - * Returns: - * Empty object that represents invalid addresses - */ - static IPAddress None() - { - return sfIpAddress_None(); - } - -@property -{ - /** - * Get the computer's local IP address (from the LAN point of view) - * - * Returns: - * Local IP address - * - */ - static IPAddress localAddress() - { - return sfIpAddress_GetLocalAddress(); - } - - /** - * Get the computer's public IP address (from the web point of view). - * The only way to get a public address is to ask it to a - * distant website ; as a consequence, this function may be - * very slow -- use it as few as possible ! - * - * Returns: - * Public IP address - * - */ - static IPAddress publicAddress() - { - return sfIpAddress_GetPublicAddress(); - } - - /** - * Local host address (to connect to the same computer). - */ - static IPAddress localHost() - { - return sfIpAddress_LocalHost(); - } -} - - const bool opEquals(ref const(IPAddress) other) - { - return Address == other.Address; - } -} - -private: - -static extern(C) -{ - IPAddress function(cchar*) sfIpAddress_FromString; - IPAddress function(ubyte, ubyte, ubyte, ubyte)sfIpAddress_FromBytes; - IPAddress function(uint) sfIpAddress_FromInteger; - IPAddress function() sfIpAddress_None; - IPAddress function() sfIpAddress_GetLocalAddress; - IPAddress function() sfIpAddress_GetPublicAddress; - IPAddress function() sfIpAddress_LocalHost; -} - -mixin(loadFromSharedLib2("csfml-network", "sfIpAddress", - "FromBytes", "FromString", "FromInteger", "GetLocalAddress", "GetPublicAddress", "None", "LocalHost")); \ No newline at end of file diff --git a/bindings/d/import/dsfml/network/packet.d b/bindings/d/import/dsfml/network/packet.d deleted file mode 100644 index 9a09646a..00000000 --- a/bindings/d/import/dsfml/network/packet.d +++ /dev/null @@ -1,417 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.network.packet; - -import dsfml.system.common; -import dsfml.system.stringutil; - -/** -* Packet wraps data to send / to receive through the network -* -* The order of insertion and extraction must be the same. -* -* You can derive from Packet and override onSend and onReceive to do custom operations before send or after reception. -* -* Litterals integer are promoted to int. -* Litterals floating point are promoted to float. -* -* Extraction or insertion can be specified with explicit template. -* Examples: -* ------------------------------------------------------------ -* Packet p = new Packet(); -* -* int i = 32, j = 42; -* string k = hello; -* -* p.set(i, k, j); //Set the data in the packet -* -* int a, b; -* string c; -* p.get(a, c, b); //Get data from the packet -* -* //... -* -* Packet p = new Packet(); -* p.set!(byte)(5); // Litteral are inserted with byte type -* ------------------------------------------------------------ -* -* See_Also: -* $(LINK2 http://www.digitalmars.com/d/1.0/lex.html, D litterals Specification) for more informations. -*/ -class Packet : DSFMLObject -{ - /** - * Default constructor - * - */ - this() - { - super(sfPacket_Create()); - } - - override void dispose() - { - sfPacket_Destroy(m_ptr); - } - - /** - * Append data to the end of the packet. - * - * Params: - * data = Array of data to append - * - */ - void append(byte[] data) - { - if (data !is null) - sfPacket_Append(m_ptr, data.ptr, data.length); - } - - /** - * Clear the packet data - * - */ - void clear() - { - sfPacket_Clear(m_ptr); - } - - /** - * Get an array to the data contained in the packet - * $(B the returned array may be invalid after you - * append data to the packet) - * - * Returns: - * array of data - * - * Remarks: - * return an array of $(B all) data in the packet. - * - * ---------- - * Packet p = new Packet(); - * - * string str1 = "Hi"; - * string str2 = "Hello"; - * - * p.set(str1, str2); - * - * // Retrieve str1 from packet - * string str3; - * p.get(str3); - * - * // Returns an array containing str1 and str2. - * byte[] ptr = p.getData(); - * ---------- - */ - byte[] getData() - { - if (canRead) - return sfPacket_GetData(m_ptr)[0..getDataSize()]; - else - return null; - } - - - /** - * Get the size of the data contained in the packet - * - * Returns: - * Data size, in bytes - */ - uint getDataSize() - { - return sfPacket_GetDataSize(m_ptr); - } - - /** - * Tell if the reading position has reached the end of the packet - * - * Returns: - * true if all data have been read. - */ - bool endOfPacket() - { - return cast(bool)sfPacket_EndOfPacket(m_ptr); - } - /** - * Tell if the packet is valid for reading - * - * Returns: - * True if data can be extracted from the packet - * - */ - bool canRead() - { - return cast(bool)sfPacket_CanRead(m_ptr); - } - - - /** - * Add new variables to the packet - * Accept (u)byte, (u)short, (u)int, float, double, string and wstring types - */ - Packet set(T...)(T t) - { - foreach (v; t) - internalSet(t); - return this; - } - - /** - * Retrieve data from the packet - * Accept (u)byte, (u)short, (u)int, float, double, string and wstring types - */ - Packet get(T...)(ref T t) - { - foreach (v; t) - internalGet(t); - return this; - } - - /** - * Called before packet is send - * - * Params: - * size = Variable to fill with the size of the data to send - * Returns: - * Array of byte to send - */ - byte[] onSend() - { - return getData(); - } - - /** - * Called after a packet has been received - * - * Params: - * data = Array of byte received - */ - void onReceive(byte[] data) - { - append(data); - } - -private: - void internalGet(ref bool data) - { - data = cast(bool)sfPacket_ReadInt32(m_ptr); - } - void internalGet(ref byte data) - { - data = sfPacket_ReadInt8(m_ptr); - } - void internalGet(ref ubyte data) - { - data = sfPacket_ReadUint8(m_ptr); - } - void internalGet(ref short data) - { - data = sfPacket_ReadInt16(m_ptr); - } - void internalGet(ref ushort data) - { - data = sfPacket_ReadUint16(m_ptr); - } - void internalGet(ref int data) - { - data = sfPacket_ReadInt32(m_ptr); - } - void internalGet(ref uint data) - { - data = sfPacket_ReadUint32(m_ptr); - } - void internalGet(ref float data) - { - data = sfPacket_ReadFloat(m_ptr); - } - void internalGet(ref double data) - { - data = sfPacket_ReadDouble(m_ptr); - } - void internalGet(ref string data) - { - scope char[] temp = new char[sfPacket_GetDataSize(m_ptr)]; - sfPacket_ReadString(m_ptr, temp.ptr); - size_t l = fromStringz(temp.ptr).length; - data = cast(string) temp[0 .. l]; - } - - void internalGet(ref wstring data) - { - scope wchar[] temp = new wchar[sfPacket_GetDataSize(m_ptr)]; - sfPacket_ReadWideString(m_ptr, temp.ptr); - size_t l = fromStringz(temp.ptr).length; - data = cast(wstring) temp[0 .. l]; - } - - void internalSet(bool data) - { - sfPacket_WriteInt32(m_ptr, cast(int)data); - } - void internalSet(byte data) - { - sfPacket_WriteInt8(m_ptr, data); - } - void internalSet(ubyte data) - { - sfPacket_WriteUint8(m_ptr, data); - } - void internalSet(short data) - { - sfPacket_WriteInt16(m_ptr, data); - } - void internalSet(ushort data) - { - sfPacket_WriteUint16(m_ptr, data); - } - void internalSet(int data) - { - sfPacket_WriteInt32(m_ptr, data); - } - void internalSet(uint data) - { - sfPacket_WriteUint32(m_ptr, data); - } - void internalSet(float data) - { - sfPacket_WriteFloat(m_ptr, data); - } - void internalSet(double data) - { - sfPacket_WriteDouble(m_ptr, data); - } - void internalSet(string data) - { - sfPacket_WriteString(m_ptr, toStringz(data)); - } - - void internalSet(wstring data) - { - sfPacket_WriteWideString(m_ptr, toStringz(data)); - } - -// External ==================================================================== - - extern (C) - { - typedef SFMLClass function() pf_sfPacket_Create; - typedef void function(SFMLClass) pf_sfPacket_Destroy; - typedef void function(SFMLClass, const(void)*, size_t) pf_sfPacket_Append; - typedef void function(SFMLClass) pf_sfPacket_Clear; - typedef byte* function(SFMLClass) pf_sfPacket_GetData; - typedef uint function(SFMLClass) pf_sfPacket_GetDataSize; - typedef int function(SFMLClass) pf_sfPacket_EndOfPacket; - typedef int function(SFMLClass) pf_sfPacket_CanRead; - typedef byte function(SFMLClass) pf_sfPacket_ReadInt8; - typedef ubyte function(SFMLClass) pf_sfPacket_ReadUint8; - typedef short function(SFMLClass) pf_sfPacket_ReadInt16; - typedef ushort function(SFMLClass) pf_sfPacket_ReadUint16; - typedef int function(SFMLClass) pf_sfPacket_ReadInt32; - typedef uint function(SFMLClass) pf_sfPacket_ReadUint32; - typedef float function(SFMLClass) pf_sfPacket_ReadFloat; - typedef double function(SFMLClass) pf_sfPacket_ReadDouble; - typedef void function(SFMLClass, char*) pf_sfPacket_ReadString; - typedef void function(SFMLClass, wchar*) pf_sfPacket_ReadWideString; - typedef void function(SFMLClass, byte) pf_sfPacket_WriteInt8; - typedef void function(SFMLClass, ubyte) pf_sfPacket_WriteUint8; - typedef void function(SFMLClass, short) pf_sfPacket_WriteInt16; - typedef void function(SFMLClass, ushort) pf_sfPacket_WriteUint16; - typedef void function(SFMLClass, int) pf_sfPacket_WriteInt32; - typedef void function(SFMLClass, uint) pf_sfPacket_WriteUint32; - typedef void function(SFMLClass, float) pf_sfPacket_WriteFloat; - typedef void function(SFMLClass, double) pf_sfPacket_WriteDouble; - typedef void function(SFMLClass, cchar*) pf_sfPacket_WriteString; - typedef void function(SFMLClass, cwchar*) pf_sfPacket_WriteWideString; - - static pf_sfPacket_Create sfPacket_Create; - static pf_sfPacket_Destroy sfPacket_Destroy; - static pf_sfPacket_Append sfPacket_Append; - static pf_sfPacket_Clear sfPacket_Clear; - static pf_sfPacket_GetData sfPacket_GetData; - static pf_sfPacket_GetDataSize sfPacket_GetDataSize; - static pf_sfPacket_EndOfPacket sfPacket_EndOfPacket; - static pf_sfPacket_CanRead sfPacket_CanRead; - static pf_sfPacket_ReadInt8 sfPacket_ReadInt8; - static pf_sfPacket_ReadUint8 sfPacket_ReadUint8; - static pf_sfPacket_ReadInt16 sfPacket_ReadInt16; - static pf_sfPacket_ReadUint16 sfPacket_ReadUint16; - static pf_sfPacket_ReadInt32 sfPacket_ReadInt32; - static pf_sfPacket_ReadUint32 sfPacket_ReadUint32; - static pf_sfPacket_ReadFloat sfPacket_ReadFloat; - static pf_sfPacket_ReadDouble sfPacket_ReadDouble; - static pf_sfPacket_ReadString sfPacket_ReadString; - static pf_sfPacket_ReadWideString sfPacket_ReadWideString; - static pf_sfPacket_WriteInt8 sfPacket_WriteInt8; - static pf_sfPacket_WriteUint8 sfPacket_WriteUint8; - static pf_sfPacket_WriteInt16 sfPacket_WriteInt16; - static pf_sfPacket_WriteUint16 sfPacket_WriteUint16; - static pf_sfPacket_WriteInt32 sfPacket_WriteInt32; - static pf_sfPacket_WriteUint32 sfPacket_WriteUint32; - static pf_sfPacket_WriteFloat sfPacket_WriteFloat; - static pf_sfPacket_WriteDouble sfPacket_WriteDouble; - static pf_sfPacket_WriteString sfPacket_WriteString; - static pf_sfPacket_WriteWideString sfPacket_WriteWideString; - } - - static this() - { - debug - DllLoader dll = DllLoader.load("csfml-network-d-2"); - else - DllLoader dll = DllLoader.load("csfml-network-2"); - - sfPacket_Append = cast(pf_sfPacket_Append)dll.getSymbol("sfPacket_Append"); - sfPacket_CanRead = cast(pf_sfPacket_CanRead)dll.getSymbol("sfPacket_CanRead"); - sfPacket_Clear = cast(pf_sfPacket_Clear)dll.getSymbol("sfPacket_Clear"); - sfPacket_Create = cast(pf_sfPacket_Create)dll.getSymbol("sfPacket_Create"); - sfPacket_Destroy = cast(pf_sfPacket_Destroy)dll.getSymbol("sfPacket_Destroy"); - sfPacket_EndOfPacket = cast(pf_sfPacket_EndOfPacket)dll.getSymbol("sfPacket_EndOfPacket"); - sfPacket_GetData = cast(pf_sfPacket_GetData)dll.getSymbol("sfPacket_GetData"); - sfPacket_GetDataSize = cast(pf_sfPacket_GetDataSize)dll.getSymbol("sfPacket_GetDataSize"); - sfPacket_ReadDouble = cast(pf_sfPacket_ReadDouble)dll.getSymbol("sfPacket_ReadDouble"); - sfPacket_ReadFloat = cast(pf_sfPacket_ReadFloat)dll.getSymbol("sfPacket_ReadFloat"); - sfPacket_ReadInt16 = cast(pf_sfPacket_ReadInt16)dll.getSymbol("sfPacket_ReadInt16"); - sfPacket_ReadInt32 = cast(pf_sfPacket_ReadInt32)dll.getSymbol("sfPacket_ReadInt32"); - sfPacket_ReadInt8 = cast(pf_sfPacket_ReadInt8)dll.getSymbol("sfPacket_ReadInt8"); - sfPacket_ReadString = cast(pf_sfPacket_ReadString)dll.getSymbol("sfPacket_ReadString"); - sfPacket_ReadWideString = cast(pf_sfPacket_ReadWideString)dll.getSymbol("sfPacket_ReadWideString"); - sfPacket_ReadUint16 = cast(pf_sfPacket_ReadUint16)dll.getSymbol("sfPacket_ReadUint16"); - sfPacket_ReadUint32 = cast(pf_sfPacket_ReadUint32)dll.getSymbol("sfPacket_ReadUint32"); - sfPacket_ReadUint8 = cast(pf_sfPacket_ReadUint8)dll.getSymbol("sfPacket_ReadUint8"); - sfPacket_WriteDouble = cast(pf_sfPacket_WriteDouble)dll.getSymbol("sfPacket_WriteDouble"); - sfPacket_WriteFloat = cast(pf_sfPacket_WriteFloat)dll.getSymbol("sfPacket_WriteFloat"); - sfPacket_WriteInt16 = cast(pf_sfPacket_WriteInt16)dll.getSymbol("sfPacket_WriteInt16"); - sfPacket_WriteInt32 = cast(pf_sfPacket_WriteInt32)dll.getSymbol("sfPacket_WriteInt32"); - sfPacket_WriteInt8 = cast(pf_sfPacket_WriteInt8)dll.getSymbol("sfPacket_WriteInt8"); - sfPacket_WriteString = cast(pf_sfPacket_WriteString)dll.getSymbol("sfPacket_WriteString"); - sfPacket_WriteWideString = cast(pf_sfPacket_WriteWideString)dll.getSymbol("sfPacket_WriteWideString"); - sfPacket_WriteUint16 = cast(pf_sfPacket_WriteUint16)dll.getSymbol("sfPacket_WriteUint16"); - sfPacket_WriteUint32 = cast(pf_sfPacket_WriteUint32)dll.getSymbol("sfPacket_WriteUint32"); - sfPacket_WriteUint8 = cast(pf_sfPacket_WriteUint8)dll.getSymbol("sfPacket_WriteUint8"); - } -} diff --git a/bindings/d/import/dsfml/network/socketselector.d b/bindings/d/import/dsfml/network/socketselector.d deleted file mode 100644 index e85abc77..00000000 --- a/bindings/d/import/dsfml/network/socketselector.d +++ /dev/null @@ -1,153 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.network.socketselector; - -import dsfml.network.tcpsocket; -import dsfml.network.udpsocket; - -import dsfml.system.common; - -/** - * Multiplexer that allows to read from multiple sockets - */ -class SocketSelector : DSFMLObject -{ - /** - * Default constructor - */ - this() - { - super(sfSocketSelector_Create()); - } - - override void dispose() - { - sfSocketSelector_Destroy(m_ptr); - } - - /** - * Add a socket to watch - * - * Params: - * socket = A tcp or udp socket - */ - void add(T socket) - { - if (!(socket.nativePointer in m_watchedSockets)) - { - sfSocketSelector_Add(m_ptr, socket.nativePointer); - m_watchedSockets[socket.nativePointer] = socket; - m_numSocketsWatched++; - } - } - - /** - * Remove a previously added socket - * - * Params: - * socket = A tcp or udp socket - */ - void remove(T socket) - { - if (socket.nativePointer in m_watchedSockets) - { - sfSocketSelector_Remove(m_ptr, socket.nativePointer); - m_watchedSockets.remove(socket.nativePointer); - m_numSocketsWatched--; - } - } - - /** - * Clear all sockets being watched - */ - void clear() - { - sfSocketSelector_Clear(m_ptr); - foreach(key; m_watchedSockets.keys) - m_watchedSockets.remove(key); - m_numSocketsWatched = 0; - } - - /** - * Wait and collect sockets which are ready for reading. - * This functions will return either when at least one socket - * is ready, or when the given time is out - * - * Params: - * timeout = Maximum time to wait, in seconds (0 to disable timeout) - * - * Returns: - * Number of sockets ready - */ - uint wait(float timeout = 0.f) - { - return sfSocketSelector_Wait(m_ptr, timeout); - } - - /** - * After a call to Wait(), get the Index-th socket which is - * ready for reading. The total number of sockets ready - * is the integer returned by the previous call to Wait() - * - * Params: - * index = Index of the socket to get - * - * Returns: - * The Index-th socket - */ - T GetSocketsReady(uint index) - { - return m_watchedSockets[sfSocketSelector_GetSocketReady(m_ptr, index)]; - } - - -private: -// size_t m_numSocketsWatched; -// T[void*] m_watchedSockets; - -// External ==================================================================== - static extern(C) - { - SFMLClass function() sfSocketSelector_Create; - void function(SFMLClass) sfSocketSelector_Destroy; - void function(SFMLClass, SFMLClass) sfSocketSelector_AddTcpListener; - void function(SFMLClass, SFMLClass) sfSocketSelector_AddTcpSocket; - void function(SFMLClass, SFMLClass) sfSocketSelector_AddUdpSocket; - void function(SFMLClass, SFMLClass) sfSocketSelector_RemoveTcpListener; - void function(SFMLClass, SFMLClass) sfSocketSelector_RemoveTcpSocket; - void function(SFMLClass, SFMLClass) sfSocketSelector_RemoveUdpSocket; - void function(SFMLClass) sfSocketSelector_Clear; - bool function(SFMLClass, float) sfSocketSelector_Wait; - bool function(SFMLClass, SFMLClass) sfSocketSelector_IsTcpListenerReady; - bool function(SFMLClass, SFMLClass) sfSocketSelector_IsTcpSocketReady; - bool function(SFMLClass, SFMLClass) sfSocketSelector_IsUdpSocketReady; - } - - mixin(loadFromSharedLib2("csfml-network", "sfSocketSelector", - "Create", "Destroy", "AddTcpListener", "AddTcpSocket", "AddUdpSocket", "RemoveTcpListener", "RemoveTcpSocket", "RemoveUdpSocket", - "Clear", "Wait", "IsTcpListenerReady", "IsTcpSocketReady", "IsUdpSocketReady")); -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/network/socketstatus.d b/bindings/d/import/dsfml/network/socketstatus.d deleted file mode 100644 index ee7ec515..00000000 --- a/bindings/d/import/dsfml/network/socketstatus.d +++ /dev/null @@ -1,38 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.network.socketstatus; - -/** -* Enumeration of status returned by socket functions -*/ -enum SocketStatus -{ - DONE, /// - NOTREADY, /// - DISCONNECTED, /// - UNEXPECTEDERROR /// -} diff --git a/bindings/d/import/dsfml/network/tcplistener.d b/bindings/d/import/dsfml/network/tcplistener.d deleted file mode 100644 index a0b682ce..00000000 --- a/bindings/d/import/dsfml/network/tcplistener.d +++ /dev/null @@ -1,49 +0,0 @@ -/* - * DSFML - SFML Library wrapper for the D programming language. - * Copyright (C) 2010 Andreas Hollandt - * - * This software is provided 'as-is', without any express or - * implied warranty. In no event will the authors be held - * liable for any damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute - * it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; - * you must not claim that you wrote the original software. - * If you use this software in a product, an acknowledgment - * in the product documentation would be appreciated but - * is not required. - * - * 2. Altered source versions must be plainly marked as such, - * and must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any - * source distribution. - */ - -module dsfml.network.tcplistener; - -import dsfml.network.socketstatus; -import dsfml.system.common; - -class TcpListener : DSFMLObject -{ -private: -public: - -private: - static extern(C) - { - SFMLClass function() sfTcpListener_Create; - void function(SFMLClass) sfTcpListener_Destroy; - void function(SFMLClass, bool) sfTcpListener_SetBlocking; - bool function(SFMLClass) sfTcpListener_IsBlocking; - SocketStatus function(SFMLClass, ushort) sfTcpListener_Listen; - SocketStatus function(SFMLClass, SFMLClass*) sfTcpListener_Accept; - } - - mixin(loadFromSharedLib2("csfml-network", "sfTcpListener", - "Create", "Destroy", "SetBlocking", "IsBlocking", "Listen", "Accept")); -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/network/tcpsocket.d b/bindings/d/import/dsfml/network/tcpsocket.d deleted file mode 100644 index 71637444..00000000 --- a/bindings/d/import/dsfml/network/tcpsocket.d +++ /dev/null @@ -1,273 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.network.tcpsocket; - -import dsfml.network.ipaddress; -import dsfml.network.packet; -import dsfml.network.socketstatus; - -import dsfml.system.common; - -/** -* TcpSocket wraps a socket using TCP protocol to send data safely (but a bit slower) -*/ -class TcpSocket : DSFMLObject -{ - /** - * Default constructor - */ - this() - { - super(sfTcpSocket_Create()); - m_intermediatePacket = new Packet(); - } - - override void dispose() - { - sfTcpSocket_Destroy(m_ptr); - } - - /** - * Connect to another computer on a specified port - * - * Params: - * port = Port to use for transfers (warning : ports < 1024 are reserved) - * hostAddress = IP Address of the host to connect to - * timeout = Maximum time to wait in seconds (0 by default : no timeout) - * - * Returns: - * True if operation has been successful - */ - bool connect(ushort port, IPAddress hostAddress, float timeout = 0.f) - { - return cast(bool) !sfTcpSocket_Connect(m_ptr, port, hostAddress, timeout); - } - - /** - * Listen to a specified port for incoming data or connections - * - * Params: - * port = Port to listen to - * - * Returns: - * True if operation has been successful - */ - bool listen(ushort port) - { - return cast(bool)sfTcpSocket_Listen(m_ptr, port); - } - - /** - * Wait for a connection (must be listening to a port). - * This function is blocking. - * - * Params: - * connected = Socket containing the connection with the connected client - * - * Returns: - * Status code - */ - SocketStatus accept(TcpSocket connected) - { - SFMLClass temp = null; - SocketStatus ret = sfTcpSocket_Accept(m_ptr, &temp, null); - connected.m_ptr = temp; - return ret; - } - - /** - * Wait for a connection (must be listening to a port). - * This function is blocking. - * - * Params: - * connected = Socket containing the connection with the connected client - * address = Pointer to an address to fill with client infos - * - * Returns: - * Status code - */ - SocketStatus accept(TcpSocket connected, out IPAddress address) - { - SFMLClass temp = null; - SocketStatus ret = sfTcpSocket_Accept(m_ptr, &temp, &address); - connected.m_ptr = temp; - return ret; - } - - /** - * Send an array of bytes to the host (must be connected first) - * - * Params: - * data = array of bytes to send - * - * Returns: - * Status code - */ - SocketStatus send(byte[] data) - in - { - assert(data && data.length); - } - body - { - return cast(SocketStatus)sfTcpSocket_Send(m_ptr, data.ptr, data.length); - } - - /** - * Receive an array of bytes from the host (must be connected first). - * This function will block until a connection was accepted - * - * Params: - * data = array to fill (make sure it is big enough) - * sizeReceived = Number of bytes received - * - * Returns: - * Status code - * - * Remarks: - * Assert if data is null or length == 0 - * - */ - SocketStatus receive(byte[] data, out size_t sizeReceived) - in - { - assert(data && data.length); - } - body - { - return cast(SocketStatus)sfTcpSocket_Receive(m_ptr, data.ptr, data.length, &sizeReceived); - } - - - /** - * Send a packet of data to the host (must be connected first) - * - * Params: - * packetToSend = Packet to send - * - * Returns: - * Status code - * - */ - SocketStatus send(Packet packetToSend) - { - byte[] dataArray = packetToSend.onSend(); - m_intermediatePacket.append(dataArray); - SocketStatus stat = cast(SocketStatus)sfTcpSocket_SendPacket(m_ptr, m_intermediatePacket.nativePointer); - m_intermediatePacket.clear(); - return stat; - } - - /** - * Receive a packet from the host (must be connected first). - * This function will block if the socket is blocking - * - * Params: - * packetToReceive = Packet to fill with received data - * - * Returns: - * Status code - * - */ - SocketStatus receive(Packet packetToReceive) - { - SocketStatus stat = cast(SocketStatus)sfTcpSocket_ReceivePacket(m_ptr, m_intermediatePacket.nativePointer); - packetToReceive.onReceive(m_intermediatePacket.getData); - m_intermediatePacket.clear(); - return stat; - } - - /** - * Check if the socket is in a valid state ; this function - * can be called any time to check if the socket is OK - * - * Returns: - * True if the socket is valid - * - */ - bool isValid() - { - return cast(bool)sfTcpSocket_IsValid(m_ptr); - } - -package: - - this (SFMLClass ptr) - { - super(ptr); - m_intermediatePacket = new Packet(); - } - - -private: - Packet m_intermediatePacket; - -// External ==================================================================== - extern (C) - { - typedef SFMLClass function() pf_sfTcpSocket_Create; - typedef void function(SFMLClass) pf_sfTcpSocket_Destroy; - typedef int function(SFMLClass, ushort, IPAddress, float) pf_sfTcpSocket_Connect; - typedef int function(SFMLClass, ushort) pf_sfTcpSocket_Listen; - typedef SocketStatus function(SFMLClass, SFMLClass*, IPAddress*) pf_sfTcpSocket_Accept; - typedef SocketStatus function(SFMLClass, const(byte)*, size_t) pf_sfTcpSocket_Send; - typedef SocketStatus function(SFMLClass, byte*, size_t, size_t*) pf_sfTcpSocket_Receive; - typedef SocketStatus function(SFMLClass, SFMLClass) pf_sfTcpSocket_SendPacket; - typedef SocketStatus function(SFMLClass, SFMLClass) pf_sfTcpSocket_ReceivePacket; - typedef int function(SFMLClass) pf_sfTcpSocket_IsValid; - - static pf_sfTcpSocket_Create sfTcpSocket_Create; - static pf_sfTcpSocket_Destroy sfTcpSocket_Destroy; - static pf_sfTcpSocket_Connect sfTcpSocket_Connect; - static pf_sfTcpSocket_Listen sfTcpSocket_Listen; - static pf_sfTcpSocket_Accept sfTcpSocket_Accept; - static pf_sfTcpSocket_Send sfTcpSocket_Send; - static pf_sfTcpSocket_Receive sfTcpSocket_Receive; - static pf_sfTcpSocket_SendPacket sfTcpSocket_SendPacket; - static pf_sfTcpSocket_ReceivePacket sfTcpSocket_ReceivePacket; - static pf_sfTcpSocket_IsValid sfTcpSocket_IsValid; - } - - static this() - { - debug - DllLoader dll = DllLoader.load("csfml-network-d-2"); - else - DllLoader dll = DllLoader.load("csfml-network-2"); - - sfTcpSocket_Accept = cast(pf_sfTcpSocket_Accept)dll.getSymbol("sfTcpSocket_Accept"); - sfTcpSocket_Connect = cast(pf_sfTcpSocket_Connect)dll.getSymbol("sfTcpSocket_Connect"); - sfTcpSocket_Create = cast(pf_sfTcpSocket_Create)dll.getSymbol("sfTcpSocket_Create"); - sfTcpSocket_Destroy = cast(pf_sfTcpSocket_Destroy)dll.getSymbol("sfTcpSocket_Destroy"); - sfTcpSocket_IsValid = cast(pf_sfTcpSocket_IsValid)dll.getSymbol("sfTcpSocket_IsValid"); - sfTcpSocket_Listen = cast(pf_sfTcpSocket_Listen)dll.getSymbol("sfTcpSocket_Listen"); - sfTcpSocket_Receive = cast(pf_sfTcpSocket_Receive)dll.getSymbol("sfTcpSocket_Receive"); - sfTcpSocket_ReceivePacket = cast(pf_sfTcpSocket_ReceivePacket)dll.getSymbol("sfTcpSocket_ReceivePacket"); - sfTcpSocket_Send = cast(pf_sfTcpSocket_Send)dll.getSymbol("sfTcpSocket_Send"); - sfTcpSocket_SendPacket = cast(pf_sfTcpSocket_SendPacket)dll.getSymbol("sfTcpSocket_SendPacket"); - } -} diff --git a/bindings/d/import/dsfml/network/udpsocket.d b/bindings/d/import/dsfml/network/udpsocket.d deleted file mode 100644 index 2778df18..00000000 --- a/bindings/d/import/dsfml/network/udpsocket.d +++ /dev/null @@ -1,241 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.network.udpsocket; - -import dsfml.network.ipaddress; -import dsfml.network.packet; -import dsfml.network.socketstatus; - -import dsfml.system.common; - -/** - * UdpSocket wraps a socket using UDP protocol to - * send data fastly (but with less safety) - */ -class UdpSocket : DSFMLObject -{ - /** - * Default constructor - */ - this() - { - super(sfUdpSocket_Create()); - m_intermediatePacket = new Packet(); - } - - override void dispose() - { - sfUdpSocket_Destroy(m_ptr); - } - - /** - * Bind the socket to a specific port - * - * Params: - * port = Port to bind the socket to - * - * Returns: - * True if operation has been successful - * - */ - bool bind(ushort port) - { - m_port = port; - return cast(bool)sfUdpSocket_Bind(m_ptr, port); - } - - /** - * Unbind the socket from its previous port, if any - * - * Returns: True if operation has been successful - * - */ - bool unbind() - { - m_port = 0; - return cast(bool)sfUdpSocket_Unbind(m_ptr, m_port); - } - - /** - * Send an array of bytes - * - * Params: - * data = bytes array to send - * address = Address of the computer to send the packet to - * port = Port to send the data to - * - * Returns: - * Status code - * - */ - SocketStatus send(byte[] data, IPAddress address, ushort port) - { - return cast(SocketStatus) sfUdpSocket_Send(m_ptr, data.ptr, data.length, address, port); - } - - /** - * Receive an array of bytes. - * This function is blocking. - * - * Params: - * data = Pointer to a byte array to fill (make sure it is big enough) - * sizeReceived = Number of bytes received - * address = Address of the computer which sent the data - * - * Returns: - * Status code - * - * Remarks: - * Assert if data is null or length == 0 - * - */ - SocketStatus receive(byte[] data, out size_t sizeReceived, out IPAddress address) - { - SocketStatus ret = sfUdpSocket_Receive(m_ptr, data.ptr, data.length, &sizeReceived, &address); - return ret; - } - - /** - * Send a packet of data - * - * Params: - * packetToSend = Packet to send - * address = Address of the computer to send the packet to - * port = Port to send the data to - * - * Returns: - * Status code - * - */ - SocketStatus send(Packet packetToSend, IPAddress address, ushort port) - { - byte[] dataArray = packetToSend.onSend(); - m_intermediatePacket.append(dataArray); - SocketStatus stat = cast(SocketStatus)sfUdpSocket_SendPacket(m_ptr, m_intermediatePacket.nativePointer, address, port); - m_intermediatePacket.clear(); - return stat; - } - - /** - * Receive a packet. - * This function is blocking. - * - * Params: - * packetToReceive = Packet to fill with received data - * address = Address of the computer which sent the packet - * - * Returns: - * Status code - * - */ - SocketStatus receive(Packet packetToReceive, out IPAddress address) - { - SocketStatus ret = sfUdpSocket_ReceivePacket(m_ptr, m_intermediatePacket.nativePointer, &address); - packetToReceive.onReceive(m_intermediatePacket.getData); - m_intermediatePacket.clear(); - return ret; - - } - - /** - * Check if the socket is in a valid state ; this function - * can be called any time to check if the socket is OK - * - * Returns: - * True if the socket is valid - * - */ - bool isValid() - { - return cast(bool)sfUdpSocket_IsValid(m_ptr); - } - - /** - * Get the port the socket is currently bound to - * - * Returns: - * Current port (0 means the socket is not bound) - */ - ushort getPort() - { - return m_port; - } - -package: - this (SFMLClass ptr) - { - super(ptr); - m_intermediatePacket = new Packet(); - } - -private: - Packet m_intermediatePacket; - ushort m_port; - -// External ==================================================================== - - extern (C) - { - typedef SFMLClass function() pf_sfUdpSocket_Create; - typedef void function(SFMLClass) pf_sfUdpSocket_Destroy; - typedef int function(SFMLClass, ushort) pf_sfUdpSocket_Bind; - typedef int function(SFMLClass, ushort) pf_sfUdpSocket_Unbind; - typedef SocketStatus function(SFMLClass, byte*, size_t, IPAddress, ushort) pf_sfUdpSocket_Send; - typedef SocketStatus function(SFMLClass, byte*, size_t, size_t*, IPAddress*) pf_sfUdpSocket_Receive; - typedef SocketStatus function(SFMLClass, SFMLClass, IPAddress, ushort) pf_sfUdpSocket_SendPacket; - typedef SocketStatus function(SFMLClass, SFMLClass, IPAddress*) pf_sfUdpSocket_ReceivePacket; - typedef int function(SFMLClass) pf_sfUdpSocket_IsValid; - - static pf_sfUdpSocket_Create sfUdpSocket_Create; - static pf_sfUdpSocket_Destroy sfUdpSocket_Destroy; - static pf_sfUdpSocket_Bind sfUdpSocket_Bind; - static pf_sfUdpSocket_Unbind sfUdpSocket_Unbind; - static pf_sfUdpSocket_Send sfUdpSocket_Send; - static pf_sfUdpSocket_Receive sfUdpSocket_Receive; - static pf_sfUdpSocket_SendPacket sfUdpSocket_SendPacket; - static pf_sfUdpSocket_ReceivePacket sfUdpSocket_ReceivePacket; - static pf_sfUdpSocket_IsValid sfUdpSocket_IsValid; - } - - static this() - { - debug - DllLoader dll = DllLoader.load("csfml-network-d-2"); - else - DllLoader dll = DllLoader.load("csfml-network-2"); - - sfUdpSocket_Bind = cast(pf_sfUdpSocket_Bind)dll.getSymbol("sfUdpSocket_Bind"); - sfUdpSocket_Create = cast(pf_sfUdpSocket_Create)dll.getSymbol("sfUdpSocket_Create"); - sfUdpSocket_Destroy = cast(pf_sfUdpSocket_Destroy)dll.getSymbol("sfUdpSocket_Destroy"); - sfUdpSocket_IsValid = cast(pf_sfUdpSocket_IsValid)dll.getSymbol("sfUdpSocket_IsValid"); - sfUdpSocket_Receive = cast(pf_sfUdpSocket_Receive)dll.getSymbol("sfUdpSocket_Receive"); - sfUdpSocket_ReceivePacket = cast(pf_sfUdpSocket_ReceivePacket)dll.getSymbol("sfUdpSocket_ReceivePacket"); - sfUdpSocket_Send = cast(pf_sfUdpSocket_Send)dll.getSymbol("sfUdpSocket_Send"); - sfUdpSocket_SendPacket = cast(pf_sfUdpSocket_SendPacket)dll.getSymbol("sfUdpSocket_SendPacket"); - sfUdpSocket_Unbind = cast(pf_sfUdpSocket_Unbind)dll.getSymbol("sfUdpSocket_Unbind"); - } -} diff --git a/bindings/d/import/dsfml/system/all.d b/bindings/d/import/dsfml/system/all.d deleted file mode 100644 index 1de561bf..00000000 --- a/bindings/d/import/dsfml/system/all.d +++ /dev/null @@ -1,47 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.system.all; - -version (linux) -{ - version (build) - { - pragma(link, "dl"); //Link libdl.so (dlopen, dlsym) - } -} - -version (darwin) -{ - version (build) - { - pragma(link, "dl"); //Link libdl.dylib (dlopen, dlsym) - } -} - -public import - dsfml.system.lock, - dsfml.system.vector; \ No newline at end of file diff --git a/bindings/d/import/dsfml/system/alloc.d b/bindings/d/import/dsfml/system/alloc.d deleted file mode 100644 index b04c9f01..00000000 --- a/bindings/d/import/dsfml/system/alloc.d +++ /dev/null @@ -1,84 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.system.alloc; - -version (Tango) -{ - public import tango.core.Memory; -} -else -{ - public import core.memory; -} - -/* - struct GC - { - static void* malloc(uint size) - { - return std.c.stdlib.malloc(size); - } - - static void free(void* ptr) - { - std.c.stdlib.free(ptr); - } - - static void addRange(void* ptr, uint size) - { - std.gc.addRange(ptr, ptr + size); - } - - static void removeRange(void* ptr) - { - std.gc.removeRange(ptr); - } - } - -*/ - -/* -* Template for native non-GCed allocation for interaction between C and D threads. -*/ -template Alloc() -{ - new (size_t size) - { - void* p = GC.malloc(size); - if (!p) - assert(0, "Memory allocation failed"); - - GC.addRange(p, size); - return p; - } - - delete(void* p) - { - GC.removeRange(p); - GC.free(p); - } -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/system/common.d b/bindings/d/import/dsfml/system/common.d deleted file mode 100644 index 59f04f20..00000000 --- a/bindings/d/import/dsfml/system/common.d +++ /dev/null @@ -1,141 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.system.common; - -public import dsfml.system.dllloader; - -// type aliases for D2 -package -{ - alias const(char) cchar; - alias const(wchar) cwchar; - alias const(dchar) cdchar; - alias immutable(char) ichar; - alias immutable(wchar) iwchar; - alias immutable(dchar) idchar; - alias const(char)[] cstring; - -// alias immutable(void) ivoid; - alias const(void) cvoid; - typedef immutable(void)* SFMLClass; -} - -// used to mixin code function -string loadFromSharedLib(string fname) -{ - return fname ~ " = " ~ "cast(typeof(" ~ fname ~ ")) dll.getSymbol(\"" ~ fname ~ "\");"; -} - -//used to mixin code function -string loadFromSharedLib2(S...)(string lib, string className, S fnames) -{ - string res = `static this() -{ - debug - DllLoader dll = DllLoader.load("` ~ lib ~ `-d-2"); - else - DllLoader dll = DllLoader.load("` ~ lib ~ `-2"); - -`; - - foreach(fname; fnames) - { - res ~= "\t" ~ className ~ "_" ~ fname ~ " = " ~ "cast(typeof(" ~ className ~ "_" ~ fname ~ ")) dll.getSymbol(\"" ~ className ~ "_" ~ fname ~ "\");\n"; - } - return res ~ "}\n"; -} - -string loadDerivedFromSharedLib(S...)(string lib, string baseClass, string derivedClass, S fnames) -{ - string res = `static this() -{ - debug - DllLoader dll = DllLoader.load("` ~ lib ~ `-d-2"); - else - DllLoader dll = DllLoader.load("` ~ lib ~ `-2"); - -`; - - foreach(fname; fnames) - { - res ~= "\t" ~ baseClass ~ "_" ~ fname ~ " = " ~ "cast(typeof(" ~ baseClass ~ "_" ~ fname ~ ")) dll.getSymbol(\"" ~ derivedClass ~ "_" ~ fname ~ "\");\n"; - } - return res ~ "}\n"; -} - -/** - * Base class for all DSFML classes. - */ -class DSFMLObject -{ -private: - bool m_preventDelete; - -protected: - SFMLClass m_ptr; - - abstract void dispose(); - -public: - /// get the underlying C pointer - @property final SFMLClass nativePointer() - { - return m_ptr; - } - -public: - - this(SFMLClass ptr, bool preventDelete = false) - { - m_ptr = ptr; - m_preventDelete = preventDelete; - } - - ~this() - { - if (!m_preventDelete) - dispose(); - - m_ptr = m_ptr.init; - } - - - final void setHandled(bool handled) - { - m_preventDelete = handled; - } - - override bool opEquals(Object o) - { - return (m_ptr == (cast(DSFMLObject)o).nativePointer); - } - - protected invariant() - { - assert(m_ptr !is null, "Problem occurs with a null pointer in " ~ this.toString); - } -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/system/dllloader.d b/bindings/d/import/dsfml/system/dllloader.d deleted file mode 100644 index 9ffbcad8..00000000 --- a/bindings/d/import/dsfml/system/dllloader.d +++ /dev/null @@ -1,238 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.system.dllloader; - -import dsfml.system.stringutil; - -version (Tango) -{ - import tango.io.Console; - import tango.sys.SharedLib; -} -else -{ - import std.stdio; - - version (Windows) - { - import std.c.windows.windows; - import std.windows.syserror; // for error strings - alias HMODULE MODULEHANDLE; - } - else version (linux) - { - import std.c.linux.linux; - alias void* MODULEHANDLE; - - const int RTLD_NOW = 0x00002; - const int RTLD_GLOBAL = 0x00100; - } - else version (darwin) - { - alias void* MODULEHANDLE; - - const int RTLD_NOW = 0x2; - const int RTLD_GLOBAL = 0x8; - - extern (C) - { - void* dlopen(char* file, int mode); - int dlclose(void* handle); - void* dlsym(void* handle, char* name); - char* dlerror(); - } - } -} - -static this() -{ - version (Tango) - { - SharedLib.throwExceptions = false; - } -} - -static ~this() -{ -// DllLoader.closeAll(); -} - -private void report(string msg, string lib, string symb) -{ - string str = "Loading error. Reason : " ~ msg ~ " (library : " ~ lib ~ ", symbol : " ~ symb ~ ")"; - version (Tango) - { - Cerr(str).newline; - } - else - { - stderr.writeln(str); - } -} - - -/** -* Simple Dll loader. -*/ -class DllLoader -{ - static DllLoader load(string library) - { - version (Windows) - { - string libraryName = library ~ ".dll"; - } - else version (linux) - { - string libraryName = "lib" ~ library ~ ".so"; - } - else version (darwin) - { - string libraryName = "lib" ~ library ~ ".dylib"; - } - - if (libraryName in alreadyLoaded) - { - return alreadyLoaded[libraryName]; - } - else - { - DllLoader temp = new DllLoader(libraryName); - alreadyLoaded[libraryName] = temp; - return temp; - } - } - - void* getSymbol(string symbolName) - { - void* symb; - version (Tango) - { - symb = m_lib.getSymbol(toStringz(symbolName)); - } - else - { - version (Windows) - { - symb = GetProcAddress(m_lib, toStringz(symbolName)); - } - else version (linux) - { - symb = dlsym(m_lib, toStringz(symbolName)); - } - else version (darwin) - { - symb = dlsym(m_lib, toStringz(symbolName)); - } - } - - if (symb is null) - debug report( "Symbol cannot be found in specified library", m_libPath, symbolName); - - return symb; - } - - void close() - { - version (Tango) - { - m_lib.unload(); - } - else - { - version (Windows) - { - FreeLibrary(m_lib); - } - else version (linux) - { - dlclose(m_lib); - } - else version (darwin) - { - dlclose(m_lib); - } - alreadyLoaded.remove(this.m_libPath); - } - } - - static void closeAll() - { - foreach(lib; alreadyLoaded.values) - { - lib.close(); - } - } - -private: - this(string libraryPath) - { - m_libPath = libraryPath; - - version (Tango) - { - m_lib = SharedLib.load(libraryPath); - } - else - { - version (Windows) - { - m_lib = LoadLibraryA(toStringz(libraryPath)); - } - else version (linux) - { - m_lib = dlopen(toStringz(libraryPath), RTLD_NOW | RTLD_GLOBAL); - } - else version (darwin) - { - m_lib = dlopen(toStringz(libraryPath), RTLD_NOW | RTLD_GLOBAL); - if (m_lib is null) - m_lib = dlopen(toStringz("@executable_path/" ~ libraryPath), RTLD_NOW | RTLD_GLOBAL); - } - } - if (m_lib is null) - { - debug report("Cannot open library", m_libPath, null); - version (Windows) - { - debug report("Windows error message: " ~ sysErrorString(GetLastError()), m_libPath, null); - } - } - } - - version (Tango) - { - SharedLib m_lib; - } - else - { - MODULEHANDLE m_lib; - } - - static DllLoader[string] alreadyLoaded; - string m_libPath; -} diff --git a/bindings/d/import/dsfml/system/exception.d b/bindings/d/import/dsfml/system/exception.d deleted file mode 100644 index e996360c..00000000 --- a/bindings/d/import/dsfml/system/exception.d +++ /dev/null @@ -1,43 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.system.exception; - -class LoadingException : Exception -{ - this(string msg) - { - super(msg); - } -} - -class NullParameterException : Exception -{ - this(string msg) - { - super(msg); - } -} diff --git a/bindings/d/import/dsfml/system/linkedlist.d b/bindings/d/import/dsfml/system/linkedlist.d deleted file mode 100644 index 815e3783..00000000 --- a/bindings/d/import/dsfml/system/linkedlist.d +++ /dev/null @@ -1,103 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.system.linkedlist; - -/* -* Trivial implementation of Queue linked list (for internal use) -*/ -class LinkedList(T) -{ - Node!(T) head; - Node!(T) tail; - private size_t m_count; - - void enqueue(T object) - { - if (empty) - head = tail = new Node!(T)(object); - else - { - tail.Next = new Node!(T)(object); - tail = tail.Next; - } - m_count++; - } - - T dequeue() - { - T o; - if (empty) - o = T.init; - else - { - o = head.Data; - head = head.Next; - m_count--; - } - return o; - } - - bool empty() - { - return (head is null); - } - - size_t getCount() - { - return m_count; - } - - void clear() - { - T data; - while ((data = dequeue()) !is T.init) {} - } - - int opApply(int delegate(ref T) dg) - { - T data; - int result; - while ((data = dequeue) !is T.init) - { - if ((result = dg(data)) != 0) - break; - } - return result; - } -} - -private class Node(T) -{ - Node Next; - T Data; - - this(T data) - { - Data = data; - } -} - diff --git a/bindings/d/import/dsfml/system/lock.d b/bindings/d/import/dsfml/system/lock.d deleted file mode 100644 index 6c1e96f5..00000000 --- a/bindings/d/import/dsfml/system/lock.d +++ /dev/null @@ -1,66 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.system.lock; - -import core.sync.mutex; - -/** -* Encapsulation of an critical section. Unlocking is guaranteed when the Lock goes out of scope, even on exception. -* -* Remarks: -* Lock is a scope class, you need to mark Lock object as scope : -* -* ----------------- -* Mutex m = new Mutex; -* //.. -* { -* scope Lock l = new Lock(m); -* // Critical section -* } // End of critical (Destructor called and mutex unlocked) -* //.. -* -* ----------------- -*/ -scope class Lock -{ - /** - * Construct the lock and lock the mutex - */ - this(Mutex m) - { - m_mutex = m; - m_mutex.lock(); - } - - ~this() - { - m_mutex.unlock(); - } - -private: - Mutex m_mutex; -} diff --git a/bindings/d/import/dsfml/system/stringutil.d b/bindings/d/import/dsfml/system/stringutil.d deleted file mode 100644 index d3ff28c9..00000000 --- a/bindings/d/import/dsfml/system/stringutil.d +++ /dev/null @@ -1,82 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.system.stringutil; - -import std.traits; // for Unqual - -/* -version (Tango) -{ - public import tango.stdc.stringz; -} -else -{ - public import std.string; -} -*/ - - - T* toStringz(T)(T[] str) - { - if (str is null) - return null; - else if (str.length && str[$ - 1] is T.init) - return str.ptr; - - auto ret = new Unqual!(T)[str.length + 1]; - - ret[0 .. str.length] = str[0 .. $]; - ret[str.length] = 0; - - return cast(T*) ret.ptr; - } - - - size_t stringLength(T)(T* p) - { - if (p is null || *p == T.init) - return 0; - - size_t length; - - while (*(p + length)) - { - length++; - } - - return length; - } - - T[] fromStringz(T)(T* ptr) - { - auto ret = new Unqual!(T)[stringLength(ptr)]; - ret[0..$] = ptr[0..ret.length]; - - return cast(T[]) ret; - } - - \ No newline at end of file diff --git a/bindings/d/import/dsfml/system/vector.d b/bindings/d/import/dsfml/system/vector.d deleted file mode 100644 index 123a3d8c..00000000 --- a/bindings/d/import/dsfml/system/vector.d +++ /dev/null @@ -1,470 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ -module dsfml.system.vector; - -import std.conv; -import std.math; -import std.traits : isFloatingPoint; - -import std.typetuple; - -/** - * generic fixed-size Vector struct - * - * Params: - * T = element type - * dim = vector dimension - */ -struct Vector(T, uint dim) -{ - static assert (dim >= 2 && dim <= 4); - - // vectors of 3 floats are extended to 4 to make it possible to use SSE optimizations - private const realdim = (is(T == float) && dim == 3 && sseAvailable) ? 4 : dim; - // vectors of (3)4 floats or 2 doubles will use SSE - private const bool useSSE = (is(T == float) && realdim == 4 /* || is(T == double) && dim == 2 */ ) && sseAvailable; - - private alias LengthReturnType!(T) LengthType; // the type returned by length - union - { - /// normal struct element access - struct - { - static if (dim >= 1) T x; - static if (dim >= 2) T y; - static if (dim >= 3) T z; - static if (dim >= 4) T w; - } - - struct - { - static if (dim >= 1) T r; - static if (dim >= 2) T g; - static if (dim >= 3) T b; - static if (dim >= 4) T a; - } - - // only the array has the hidden 4th value in case of vec3f - // this is to be able to foreach over tuple without computing w unnecessarily - T[realdim] cell; /// array access - Repeat!(T, dim) tuple; /// for tuple access - } - - // zero vectors - static if (2 == dim) const static Vector zero = Vector(0, 0); - static if (3 == dim) const static Vector zero = Vector(0, 0, 0); - static if (4 == dim) const static Vector zero = Vector(0, 0, 0, 0); - - static if (2 == dim) const static Vector one = Vector(1, 1); - static if (3 == dim) const static Vector one = Vector(1, 1, 1); - static if (4 == dim) const static Vector one = Vector(1, 1, 1, 1); - - static if (2 == dim) const static Vector unitX = Vector(1, 0); - static if (3 == dim) const static Vector unitX = Vector(1, 0, 0); - static if (4 == dim) const static Vector unitX = Vector(1, 0, 0, 0); - - static if (2 == dim) const static Vector unitY = Vector(0, 1); - static if (3 == dim) const static Vector unitY = Vector(0, 1, 0); - static if (4 == dim) const static Vector unitY = Vector(0, 1, 0, 0); - - static if (3 == dim) const static Vector unitZ = Vector(0, 0, 1); - static if (4 == dim) const static Vector unitZ = Vector(0, 0, 1, 0); - - static if (4 == dim) const static Vector unitW = Vector(0, 0, 0, 1); - - - /// ensure that no component is a NaN - invariant() - { - assert(isValid()); - } - - // checks if the elements aren't NaNs - private bool isValid() const - { - static if (dim >= 1) if (isNaN(x)) return false; - static if (dim >= 2) if (isNaN(y)) return false; - static if (dim >= 3) if (isNaN(z)) return false; - static if (dim >= 4) if (isNaN(w)) return false; - return true; - } - - /************************************************************************************ - * Operator overloading - ***********************************************************************************/ - - /// negate the vector - Vector opUnary(string op : "-")() const - { - static if (dim == 2) return Vector(-x, -y); - else static if (dim == 3) return Vector(-x, -y, -z); - else static if (dim == 4) return Vector(-x, -y, -z, -w); - } - - /// dot product - T opBinary(string op : "*")(typeof(this) v) const - if (is(typeof(T+T)) && is(typeof(T*T))) - { - static if (dim == 2) return x*v.x + y*v.y; - else static if (dim == 3) return x*v.x + y*v.y + z*v.z; - else static if (dim == 4) return x*v.x + y*v.y + z*v.z + w*v.w; - } - - /// element-wise operations, +, -, - Vector opBinary(string op, U:typeof(this))(U v) const - // check if the operation is supported on the type T - if (op != "*" && (op == "+" && is(typeof(T+T)) || op == "-" && is(typeof(T-T)) || op == "*" && is(typeof(T*T)) - || op == "/" && is(typeof(T/T)) || op == "%" && is(typeof(T%T)))) - { - Vector res = void; - foreach (i, x; tuple) - mixin("res.tuple[i] = tuple[i] " ~ op ~ " v.tuple[i];"); - return res; - } - - /// operations with a scalar - Vector opBinary(string op, U)(U s) const - { - Vector res = void; - foreach(i, x; tuple) - mixin("res.tuple[i] = tuple[i] " ~ op ~ " s;"); - return res; - } - - /// element-wise assign operations, +=, -=, ... - Vector opOpAssign(string op, U:Vector)(U v) - { - foreach (i, _; tuple) - mixin("tuple[i] " ~ op ~ "= v.tuple[i];"); - - return this; - } - - /// (*=) overload - Vector opOpAssign(string op, U)(U s) - if (!is(U:typeof(this))) // TODO: there's some dmd bug about this - { - foreach (i, _; tuple) - mixin("tuple[i] " ~ op ~ "= s;"); - - return this; - } - - /// return length*length - @property LengthType sqLength() - { - static if (2 == dim) return (x * x + y * y); - else static if (3 == dim) return (x * x + y * y + z * z); - else static if (4 == dim) return (x * x + y * y + z * z + w * w); - else static assert (false); - } - - /// return the vector length - @property LengthType length() - { - static if (useSSE) - { - static if (is(t == float) && dim == 3) // make sure that w is 0 - assert(w == 0); - - float res; - auto p = cell.ptr; - asm - { -// movups XMM0, &cell; - mov EAX, p; - movups XMM0, [EAX]; - mulps XMM0, XMM0; // v0 = vec(x*x, y*y, z*z, w*w) - movaps XMM1, XMM0; // v1 = v0 - shufps XMM0, XMM1, 0x4e; // v0 = vec(z*z, w*w, x*x, y*y) - addps XMM0, XMM1; // v0 = vec(x*x + z*z, y*y + w*w, z*z + x*x, w*w + y*y) - movaps XMM1, XMM0; // v1 = v0 - shufps XMM1, XMM1, 0x11; // v1 = vec(w*w + y*y, z*z + x*x, w*w + y*y, z*z + x*x) - addps XMM0, XMM1; // v0 = |vec|^2 at all 4 positions - rsqrtss XMM0, XMM0; // v0 = 1/sqrt(v0) - rcpss XMM0, XMM0; // v= = 1/v0 - movss res, XMM0; - } - return res; - } - else - { - // compute squared length - auto ret = sqLength(); - - // compute sqrt - version(useFastSqrt) - { - static if (is(T == float)) - return fastSqrt(ret); - } - return sqrt(ret); - } - } - - void normalize() - { - static if (useSSE) - { - static if (is(t == float) && dim == 3) // make sure that w is 0 - assert (w == 0, "vector component w isn't 0!"); - - auto p = cell.ptr; - asm - { - mov EAX, p; - movups XMM0, [EAX]; - movaps XMM2, XMM0; // save it for later - - mulps XMM0, XMM0; // v0 = vec(x*x, y*y, z*z, w*w) - movaps XMM1, XMM0; // v1 = v0 - shufps XMM0, XMM1, 0x4e; // v0 = vec(z*z, w*w, x*x, y*y) - addps XMM0, XMM1; // v0 = vec(x*x + z*z, y*y + w*w, z*z + x*x, w*w + y*y) - movaps XMM1, XMM0; // v1 = v0 - shufps XMM1, XMM1, 0x11; // v1 = vec(w*w + y*y, z*z + x*x, w*w + y*y, z*z + x*x) - addps XMM0, XMM1; // v0 = |vec|^2 at all 4 positions - rsqrtps XMM0, XMM0; // v0 = 1/sqrt(v0) - mulps XMM2, XMM0; // v2 = vec * v0 - - movups [EAX], XMM0; - } - } - else - { - auto len = length(); - foreach(i, _; tuple) // bug 2411 workaround, foreach ref on tuples doesn't work - tuple[i] /= len; - } - } - - /// return normalized version of this vector - Vector normalized() - { - Vector res = this; - res.normalize(); - return res; - } - - /// - string toString() - { - string res = "["; - - res ~= to!(string)(x); - static if (dim >= 2) res ~= ", " ~ to!(string)(y); - static if (dim >= 3) res ~= ", " ~ to!(string)(z); - static if (dim >= 4) res ~= ", " ~ to!(string)(w); - - return res ~ "]"; - } - - static if (is(T == float)) - { - /// do a quick normalize using fast approximate inverse sqrt - void quickNormalize() - { - T inv = invSqrt(sqLength); - this *= inv; - } - - /// return a normalized version of this vector - Vector quickNormalized() - { - auto res = this; - res.quickNormalize(); - return res; - } - } - - /// return a pointer to the vector data - @property T* ptr() - { - return &x; - } - - /// calculate distance to other vector - LengthType distance(Vector other) - { - assert (isValid); - assert (other.isValid); - other -= this; // doable cause other is a struct not ref - return other.length; - } - - /// - bool opEquals(ref const Vector v) const - { - assert (isValid); - assert (v.isValid); - - static if (dim >= 1) if (x != v.x) return false; - static if (dim >= 2) if (y != v.y) return false; - static if (dim >= 3) if (z != v.z) return false; - static if (dim >= 4) if (w != v.w) return false; - return true; - } - - /// swizzling - @property Vector!(T,n.length) opDispatch(string n)() const - if (allCharsValid(n,"xyzw"[0..dim])) - { - static if (n.length == 2) return - Vector!(T,n.length)(cell[n[0]-'x'], cell[n[1]-'x']); - static if (n.length == 3) return - Vector!(T,n.length)(cell[n[0]-'x'], cell[n[1]-'x'], cell[n[2]-'x']); - static if (n.length == 4) return - Vector!(T,n.length)(cell[n[0]-'x'], cell[n[1]-'x'], cell[n[2]-'x'], cell[n[3]-'x']); - } - - // helper function - static private bool allCharsValid( string s, string valid ) - { - foreach ( e1; s ) - { - bool b = false; - foreach (e2; valid) - b |= e1 == e2; - if (!b) - return false; - } - return true; - } - - /// - bool isUnit() - { - real sql = cast(real)sqLength(); - return abs(sql - 1.0) < 0.001; - } - -} - -/******* useful alias declarations *******/ - -alias Vector!(float, 2) Vector2f; /// -alias Vector!(float, 3) Vector3f; /// -alias Vector!(float, 4) Vector4f; /// - -alias Vector!(double, 2) Vector2d; /// -alias Vector!(double, 3) Vector3d; /// -alias Vector!(double, 4) Vector4d; /// - -alias Vector!(int, 2) Vector2i; /// -alias Vector!(int, 3) Vector3i; /// -alias Vector!(int, 4) Vector4i; /// - -alias Vector!(uint, 2) Vector2ui; /// -alias Vector!(uint, 3) Vector3ui; /// -alias Vector!(uint, 4) Vector4ui; /// - -alias Vector!(ushort, 2) Vector2us; /// -alias Vector!(ushort, 3) Vector3us; /// -alias Vector!(ushort, 4) Vector4us; /// - -alias Vector!(ubyte, 2) Vector2ub; /// -alias Vector!(ubyte, 3) Vector3ub; /// -alias Vector!(ubyte, 4) Vector4ub; /// - - -// TODO: do all kinds of unittesting -import std.stdio; -unittest -{ - writeln("unittests running"); - Vector3f v = {1.5f, 1.f, 0.5f}; - Vector3f w = {-1.f, 2.f, -0.5f}; - - writefln("v: %f w: %f", v.length - sqrt(3.5f), w.length - sqrt(5.25f)); - // strangely calculating w.length is much less accurate - assert(v.length - sqrt(3.5f) < 0.001, sseAvailable ? "SSE length calculation failed" : "normal length calculation failed"); - assert(w.length - sqrt(5.25f) < 0.001, sseAvailable ? "SSE length calculation failed" : "normal length calculation failed"); - - assert(v+w == Vector3f(0.5f, 3.f, 0.f)); - assert(v-w == Vector3f(2.5f, -1.f, 1.f)); - - auto r = v.xy; - writeln(r); -} - -/** - * compute 1/sqrt(x) - * assumes x > 0 - * - * Copyright (C) 2002-2006 Chris Lomont - * explanation on www.lomont.org - */ -float invSqrt(float x) -{ - assert(x > 0); - - float xhalf = 0.5f * x; - int i = *cast(int*)&x; // get bits for floating value - i = 0x5f375a86 - (i >> 1); // gives initial guess y0 with magic number - x = *cast(float*)&i; // convert bits back to float - x = x*(1.5f - xhalf * x * x); // Newton step, repeating increases accuracy - return x; -} - - -/** - * compute sqrt(x) - * assumes x >= 0 - */ -float fastSqrt(float x) -{ - assert(x >= 0); - - int i = *cast(int*) &x; - if (0 == ((i >> 23)&255)) - return 0; // close - return x * invSqrt(x); -} - -// get the correct return type for the length function -private template LengthReturnType(T) -{ - static if (is(T == float) || is(T == double) || is(T == real)) - alias T LengthReturnType; - else - alias float LengthReturnType; -} - -/// repeat a type count times -template Repeat(T, int count) -{ - static if (!count) - alias TypeTuple!() Repeat; - else - alias TypeTuple!(T, Repeat!(T, count-1)) Repeat; -} - -// determine SSE usability -// TODO: make more sophisticated -version(X86) - version(D_InlineAsm_X86) - const bool sseAvailable = is(typeof({void* foo; asm { mov EAX, foo; movups XMM0, [EAX]; } })); -version(X86_64) - version(D_InlineAsm_X86_64) - const bool sseAvailable = false; // TODO: add this \ No newline at end of file diff --git a/bindings/d/import/dsfml/window/all.d b/bindings/d/import/dsfml/window/all.d deleted file mode 100644 index e6d809b6..00000000 --- a/bindings/d/import/dsfml/window/all.d +++ /dev/null @@ -1,34 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.window.all; - -public import - dsfml.window.event, - dsfml.window.input, - dsfml.window.videomode, - dsfml.window.window, - dsfml.window.windowhandle; diff --git a/bindings/d/import/dsfml/window/context.d b/bindings/d/import/dsfml/window/context.d deleted file mode 100644 index 40c09dde..00000000 --- a/bindings/d/import/dsfml/window/context.d +++ /dev/null @@ -1,68 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.window.context; - -import dsfml.system.common; - -/** - * - */ -class Context : DSFMLObject -{ - /** - * - */ - this() - { - super(sfContext_Create()); - } - - override void dispose() - { - sfContext_Destroy(m_ptr); - } - - /** - * - * Params: - * active = - */ - void setActive(bool active) - { - sfContext_SetActive(m_ptr, active); - } - -private: - static extern(C) - { - SFMLClass function() sfContext_Create; - void function(SFMLClass) sfContext_Destroy; - void function(SFMLClass, bool) sfContext_SetActive; - } - - mixin(loadFromSharedLib2("csfml-window", "sfContext", - "Create", "Destroy", "SetActive")); -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/window/event.d b/bindings/d/import/dsfml/window/event.d deleted file mode 100644 index e878ecf0..00000000 --- a/bindings/d/import/dsfml/window/event.d +++ /dev/null @@ -1,326 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.window.event; - -/** -* Definition of key codes for keyboard events -* -* $(B Possibles values:)$(BR) -* Except letters and numbers, you can use :$(BR) -* * LCONTROL, LSHIFT, LALT, LSYSTEM, RCONTROL, RSHIFT, RALT, RSYSTEM.$(BR) -* * LBRACKET, RBRACKET, SEMICOLON, COMMA, PERIOD, QUOTE, SLASH, BACKSLASH, TILDE, EQUAL, DASH.$(BR) -* * SPACE, RETURN, BACK, TAB, PAGEUP, PAGEDOWN, END, HOME, INSERT, DELETE.$(BR) -* * ADD, SUBTRACT, MULTIPLY, DIVIDE, LEFT, RIGHT, UP, DOWN.$(BR) -* * Numpad0, Numpad1, Numpad2, Numpad3, Numpad4, Numpad5, Numpad6, Numpad7, Numpad8, Numpad9.$(BR) -* * F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15.$(BR) -*/ -enum KeyCode -{ - A = 'a', - B = 'b', - C = 'c', - D = 'd', - E = 'e', - F = 'f', - G = 'g', - H = 'h', - I = 'i', - J = 'j', - K = 'k', - L = 'l', - M = 'm', - N = 'n', - O = 'o', - P = 'p', - Q = 'q', - R = 'r', - S = 's', - T = 't', - U = 'u', - V = 'v', - W = 'w', - X = 'x', - Y = 'y', - Z = 'z', - Num0 = '0', - Num1 = '1', - Num2 = '2', - Num3 = '3', - Num4 = '4', - Num5 = '5', - Num6 = '6', - Num7 = '7', - Num8 = '8', - Num9 = '9', - Escape = 256, - LControl, - LShift, - LAlt, - LSystem, - RControl, - RShist, - RAlt, - RSystem, - Menu, - LBracket, - RBracket, - Semicolon, - Comma, - Period, - Quote, - Slash, - Backslash, - Tilde, - Equal, - Dash, - Space, - Return, - Back, - Tab, - PageUp, - PageDown, - End, - Home, - Insert, - Delete, - Add, - Subtract, - Multiply, - Divide, - Left, - Right, - Up, - Down, - Numpad0, - Numpad1, - Numpad2, - Numpad3, - Numpad4, - Numpad5, - Numpad6, - Numpad7, - Numpad8, - Numpad9, - F1, - F2, - F3, - F4, - F5, - F6, - F7, - F8, - F9, - F10, - F11, - F12, - F13, - F14, - F15, - Pause, -} - - -/** -* Definition of button codes for mouse events -*/ -enum MouseButtons -{ - Left, /// - Right, /// - Middle, /// - XButton1, /// - XButton2 /// -} - - - -/** -* Definition of joystick axis for joystick events -*/ -enum JoyAxis -{ - AxisX, /// - AxisY, /// - AxisZ, /// - AxisR, /// - AxisU, /// - AxisV, /// - AxisPOV /// -} - - -/// EventType -enum EventType -{ - Closed, - Resized, - LostFocus, - GainedFocus, - TextEntered, - KeyPressed, - KeyReleased, - MouseWheelMoved, - MouseButtonPressed, - MouseButtonReleased, - MouseMoved, - MouseEntered, - MouseLeft, - JoyButtonPressed, - JoyButtonReleased, - JoyMoved - -} - -/** -* Event defines a system event and its parameters -*/ -align(1) struct Event -{ - /** - * Enumeration of the different types of events. Accessing a value of another event that the one received (e.g. Event.Size.Width when receiving an KEYPRESSED event) will result in undefined behavior. - * $(UL - * $(LI CLOSED) - * $(LI LOSTFOCUS) - * $(LI GAINEDFOCUS) - * $(LI RESIZED - * $(UL - * $(LI Event.Size.Width : new Width, in pixels.) - * $(LI Event.Size.Height : new height, in pixels.) - * ) - * ) - * $(LI TEXTENTERED - * $(UL - * $(LI Event.Text.Unicode : dchar entered.) - * ) - * ) - * $(LI KEYPRESSED, KEYRELEASED - * $(UL - * $(LI Event.Key.Code : Key code of the key.) - * $(LI Event.Key.Alt : Alt pressed ?) - * $(LI Event.Key.Control : Control pressed ?) - * $(LI Event.Key.Shift : Shift pressed ?) - * ) - * ) - * $(LI MOUSEWHEELMOVED - * $(UL - * $(LI Event.MouseWheel.Delta : Wheel move (positive if forward, negative else.) ) - * ) - * ) - * $(LI MOUSEBUTTONPRESSED, MOUSEBUTTONRELEASED - * $(UL - * $(LI Event.MouseButton.Button : Mouse button pressed.) - * $(LI Event.MouseButton.X : Cursor X position.) - * $(LI Event.MouseButton.Y : Cursor X position.) - * ) - * ) - * $(LI MOUSEMOVED - * $(UL - * $(LI Event.MouseMove.X : Cursor X position. Local coordinates.) - * $(LI Event.MouseMove.Y : Cursor Y position. Local coordinates.) - * ) - * ) - * $(LI MOUSEENTERED) - * $(LI MOUSELEFT) - * $(LI JOYBUTTONPRESSED, JOYBUTTONRELEASED - * $(UL - * $(LI Event.JoyButton.JoystickId : Id of the joystick.) - * $(LI Event.JoyButton.Button : Joystick button pressed.) - * ) - * ) - * $(LI JOYMOVED - * $(UL - * $(LI Event.JoyMove.JoystickId : Id of the joystick.) - * $(LI Event.JoyMove.Axis : Moved axis.) - * $(LI Event.JoyMove.Position : Actual position of the axis [-100, 100], except for POV [0, 360].) - * ) - * ) - * ) - */ - EventType Type; - - union - { - struct SText - { - dchar Unicode; - } - SText Text; - - struct SKey - { - align(4): // cause bool is size 1 - KeyCode Code; - bool Alt; - bool Control; - bool Shift; - } - SKey Key; - - struct SMouseMove - { - int X; - int Y; - } - SMouseMove MouseMove; - - struct SMouseButton - { - MouseButtons Button; - int X; - int Y; - } - SMouseButton MouseButton; - - struct SMouseWheel - { - int Delta; - } - SMouseWheel MouseWheel; - - struct SJoyMove - { - uint JoystickId; - JoyAxis Axis; - float Position; - } - SJoyMove JoyMove; - - struct SJoyButton - { - uint JoystickId; - uint Button; - } - SJoyButton JoyButton; - - struct SSize - { - uint Width; - uint Height; - } - SSize Size; - } -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/window/input.d b/bindings/d/import/dsfml/window/input.d deleted file mode 100644 index 00abf966..00000000 --- a/bindings/d/import/dsfml/window/input.d +++ /dev/null @@ -1,152 +0,0 @@ -/* - * DSFML - SFML Library wrapper for the D programming language. - * Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) - * Copyright (C) 2010 Andreas Hollandt - * - * This software is provided 'as-is', without any express or - * implied warranty. In no event will the authors be held - * liable for any damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute - * it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; - * you must not claim that you wrote the original software. - * If you use this software in a product, an acknowledgment - * in the product documentation would be appreciated but - * is not required. - * - * 2. Altered source versions must be plainly marked as such, - * and must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any - * source distribution. - */ - -module dsfml.window.input; - -import dsfml.system.common; - -import dsfml.window.event; - -/** - * Input handles real-time input from keyboard and mouse. - * Use it instead of events to handle continuous moves and more - * game-friendly inputs - */ -class Input : DSFMLObject -{ -public: // TODO: try to fix this, doesn't work with package - this(SFMLClass input) - { - super(input, true); - } - - override void dispose() - { - // nothing to do - } - -public: - /** - * Get the state of a key - * - * Params: - * key = Key to check - * - * Returns: - * True if key is down, false if key is up - */ - bool isKeyDown(KeyCode key) - { - return cast(bool)sfInput_IsKeyDown(m_ptr, key); - } - - /** - * Get the state of a mouse button - * - * Params: - * button = Button to check - * - * Returns: - * True if button is down, false if button is up - */ - bool isMouseButtonDown(MouseButtons button) - { - return cast(bool)sfInput_IsMouseButtonDown(m_ptr, button); - } - - /** - * Get the state of a joystick button - * - * Params: - * joyId = Identifier of the joystick to check (0 or 1) - * button = Button to check - * - * Returns: - * True if button is down, false if button is up - */ - bool isJoystickButtonDown(uint joyId, uint button) - { - return cast(bool)sfInput_IsJoystickButtonDown(m_ptr, joyId, button); - } - - /** - * Get a joystick axis position - * - * Params: - * joyId = Identifier of the joystick to check (0 or 1) - * axis = Axis to get - * - * Returns: - * Current axis position, in the range [-100, 100] (except for POV, which is [0, 360]) - */ - float getJoystickAxis(uint joyId, JoyAxis axis) - { - return sfInput_GetJoystickAxis(m_ptr, joyId, axis); - } - -@property -{ - /** - * Get the mouse X position - * - * Returns: - * Current mouse left position, relative to owner window - */ - int mouseX() - { - return sfInput_GetMouseX(m_ptr); - } - - /** - * Get the mouse Y position - * - * Returns: - * Current mouse top position, relative to owner window - * - */ - int mouseY() - { - return sfInput_GetMouseY(m_ptr); - } -} - -private: - -// External ==================================================================== - - static extern (C) - { - int function(SFMLClass, KeyCode) sfInput_IsKeyDown; - int function(SFMLClass, MouseButtons) sfInput_IsMouseButtonDown; - int function(SFMLClass, uint, uint) sfInput_IsJoystickButtonDown; - int function(SFMLClass) sfInput_GetMouseX; - int function(SFMLClass) sfInput_GetMouseY; - float function(SFMLClass, uint, JoyAxis) sfInput_GetJoystickAxis; - } - - mixin(loadFromSharedLib2("csfml-window", "sfInput", - "IsKeyDown", "IsMouseButtonDown", "IsJoystickButtonDown", "GetMouseX", "GetMouseY", "GetJoystickAxis")); -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/window/videomode.d b/bindings/d/import/dsfml/window/videomode.d deleted file mode 100644 index 6d3e391a..00000000 --- a/bindings/d/import/dsfml/window/videomode.d +++ /dev/null @@ -1,105 +0,0 @@ -/* - * DSFML - SFML Library wrapper for the D programming language. - * Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) - * Copyright (C) 2010 Andreas Hollandt - * - * This software is provided 'as-is', without any express or - * implied warranty. In no event will the authors be held - * liable for any damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute - * it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; - * you must not claim that you wrote the original software. - * If you use this software in a product, an acknowledgment - * in the product documentation would be appreciated but - * is not required. - * - * 2. Altered source versions must be plainly marked as such, - * and must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any - * source distribution. - */ - -module dsfml.window.videomode; - -import dsfml.system.common; - -/** - * VideoMode defines a video mode (width, height, bpp, frequency) - * and provides static functions for getting modes supported - * by the display device - */ -struct VideoMode -{ - uint Width; /// Video mode width, in pixels - uint Height; /// Video mode height, in pixels - uint BitsPerPixel = 32; /// Video mode pixel depth, in bits per pixels - - -@property -{ - /** - * Get the current desktop video mode - * - * Returns: - * Current desktop video mode - */ - static VideoMode getDesktopMode() - { - return sfVideoMode_GetDesktopMode(); - } - - /** - * Get all the supported video modes for fullscreen mode. - * Modes are sorted from best to worst. - * - * Returns: - * video mode array - */ - static VideoMode[] getFullscreenModes() - { - size_t arraySize; - VideoMode* array = sfVideoMode_GetFullscreenModes(&arraySize); // TODO: check pointer? - return array[0 .. arraySize]; - } - - /** - * Tell whether or not the video mode is supported - * - * Returns: - * True if video mode is supported, false otherwise - */ - bool isValid() - { - return cast(bool)sfVideoMode_IsValid(this); - } -} - - /** - * Comparison operator overload -- tell if two video modes are equal - * - * Params: - * Other : Video mode to compare - * - * Returns: - * True if modes are equal - */ - const bool opEquals(ref const(VideoMode) other) - { - return ((other.Width == Width) && (other.Height == Height) && (other.BitsPerPixel == BitsPerPixel)); - } -} - -extern (C) -{ - VideoMode function() sfVideoMode_GetDesktopMode; - VideoMode* function(size_t*) sfVideoMode_GetFullscreenModes; - int function(VideoMode) sfVideoMode_IsValid; -} - -mixin(loadFromSharedLib2("csfml-window", "sfVideoMode", - "GetDesktopMode", "GetFullscreenModes", "IsValid")); \ No newline at end of file diff --git a/bindings/d/import/dsfml/window/window.d b/bindings/d/import/dsfml/window/window.d deleted file mode 100644 index c25fd4d3..00000000 --- a/bindings/d/import/dsfml/window/window.d +++ /dev/null @@ -1,454 +0,0 @@ -/* - * DSFML - SFML Library wrapper for the D programming language. - * Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) - * Copyright (C) 2010 Andreas Hollandt - * - * This software is provided 'as-is', without any express or - * implied warranty. In no event will the authors be held - * liable for any damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute - * it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; - * you must not claim that you wrote the original software. - * If you use this software in a product, an acknowledgment - * in the product documentation would be appreciated but - * is not required. - * - * 2. Altered source versions must be plainly marked as such, - * and must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any - * source distribution. - */ - -module dsfml.window.window; - -import dsfml.window.event; -import dsfml.window.input; -import dsfml.window.videomode; -import dsfml.window.windowhandle; - -import dsfml.system.common; -import dsfml.system.stringutil; - - -/** - * Window style - */ -enum Style : uint -{ - None = 0, /// No border / title bar (this flag and all others are mutually exclusive) - Titlebar = 1 << 0, /// Title bar + fixed border - Resize = 1 << 1, /// Titlebar + resizable border + maximize button - Close = 1 << 2, /// Titlebar + close button - Fullscreen = 1 << 3, /// Fullscreen mode (this flag and all others are mutually exclusive) - - Default = Titlebar | Resize | Close /// Default window style -} - - -/** - * Structure defining the creation settings of windows - */ -struct ContextSettings -{ - uint DepthBits = 24; /// Bits of the depth buffer - uint StencilBits = 8; /// Bits of the stencil buffer - uint AntialiasingLevel = 0; /// Level of antialiasing - uint MajorVersion = 3; /// Major number of the context version to create - uint MinorVersion = 0; /// Minor number of the context version to create -} - - -/** - * Window is a rendering window ; it can create a new window - * or connect to an existing one - */ -class Window : DSFMLObject -{ -protected: - this(SFMLClass ptr) - { - super(ptr); - } - - Input m_input; - - override void dispose() - { - m_input = null; - sfWindow_Destroy(m_ptr); - } - -public: - /** - * Construct a new window - * - * Params: - * mode = Video mode to use - * title = Title of the window - * windowStyle = Window style (Resize | Close by default) - * settings = Context settings (default is default ContextSettings values) - */ - this(VideoMode mode, string title, Style windowStyle = Style.Default, ContextSettings settings = ContextSettings()) - { - super(sfWindow_Create(mode, toStringz(title), windowStyle, &settings)); - } - - /** - * Construct the window from an existing control - * - * Params: - * handle = Platform-specific handle of the control - * settings = Context settings (default is default ContextSettings values) - */ - this(WindowHandle handle, ContextSettings settings = ContextSettings()) - { - super(sfWindow_CreateFromHandle(handle, &settings)); - } - - /** - * Create (or recreate) the window - * - * Input created with getInput becomes invalid. - * - * Params: - * mode = Video mode to use - * title = Title of the window - * windowStyle = Window style (Resize | Close by default) - * settings = Context settings (default is default ContextSettings values) - */ - void create(VideoMode mode, string title, Style windowStyle = Style.Default, ContextSettings settings = ContextSettings()) - { - if (m_ptr !is null) - dispose(); - - m_ptr = sfWindow_Create(mode, toStringz(title), windowStyle, &settings); - } - - /** - * Create (or recreate) the window from an existing control - * - * Input created with getInput becomes invalid. - * - * Params: - * handle = Platform-specific handle of the control - * settings = Context settings (default is default ContextSettings values) - */ - void create(WindowHandle handle, ContextSettings settings = ContextSettings()) - { - if (m_ptr !is null) - dispose(); - - m_ptr = sfWindow_CreateFromHandle(handle, &settings); - } - - /** - * Close (destroy) the window. - * You can call create to recreate a valid window - */ - void close() - { - sfWindow_Close(m_ptr); - } - - - /** - * Get the event on top of events stack, if any, and pop it - * - * Params: - * eventReceived = Event to fill, if any - * - * Returns: - * True if an event was returned, false if events stack was empty - */ - bool getEvent(out Event eventReceived) - { - return cast(bool) sfWindow_GetEvent(m_ptr, &eventReceived); - } - - /** - * Wait for an event and return it - * - * This function is blocking: if there's no pending event then it will wait until an event is received. - * After this function returns (and no error occured), the \a event object is always valid and filled properly. - * This function is typically used when you have a thread that is dedicated to events handling: you want to make this thread - * sleep as long as no new event is received. - * - * Params: - * e Event to be returned - * - * Returns: - * false if any error occured - */ - bool waitEvent(out Event e) - { - return sfWindow_WaitEvent(m_ptr, &e); - } - - /** - * Show or hide the window - * - * Params: - * state = True to show, false to hide - * - */ - void show(bool state) - { - sfWindow_Show(m_ptr, state); - } - - /** - * Display the window on screen - */ - void display() - { - sfWindow_Display(m_ptr); - } - - /** - * Enable / disable vertical synchronization - * - * Params: - * enabled : True to enable v-sync, false to deactivate - */ - void enableVerticalSync(bool enabled) - { - sfWindow_EnableVerticalSync(m_ptr, enabled); - } - -@property -{ - /** - * Tell whether or not a window is opened - * - * Returns: - * True if window is currently open. - */ - bool isOpened() - { - return cast(bool) sfWindow_IsOpened(m_ptr); - } - /** - * Get the width of the rendering region of the window - * - * Returns: - * Width in pixels - */ - uint width() - { - return sfWindow_GetWidth(m_ptr); - } - - /** - * Get the height of the rendering region of the window - * - * Returns: - * Height in pixels - */ - uint height() - { - return sfWindow_GetHeight(m_ptr); - } - - /** - * Get the creation settings of a window - * - * Returns: - * Settings used to create the window - */ - ContextSettings settings() - { - return sfWindow_GetSettings(m_ptr); - } - - /** - * Show or hide the mouse cursor - * - * Params: - * show : True to show, false to hide - */ - void showMouseCursor(bool show) - { - sfWindow_ShowMouseCursor(m_ptr, show); - } - - /** - * Enable or disable automatic key-repeat for keydown events. - * Automatic key-repeat is enabled by default. - * - * Params: - * enabled = true to enable, false to disable - */ - void enableKeyRepeat(bool enabled) - { - sfWindow_EnableKeyRepeat(m_ptr, enabled); - } - - /** - * Set the window as the current target for rendering - * - * Params: - * active = True to activate, false to deactivate - * Returns: - * True if operation was successful, false otherwise - */ - bool active(bool active) - { - return cast(bool)sfWindow_SetActive(m_ptr, active); - } - - /** - * Get the input manager of the window - * - * Returns: - * An input manager - * See_Also : - * Input - */ - Input input() - { - if (m_input is null) - m_input = new Input(sfWindow_GetInput(m_ptr)); - return m_input; - } - - /** - * Limit the framerate to a maximum fixed frequency - * - * Params: - * limit : Framerate limit, in frames per seconds (use 0 to disable limit) - */ - void framerateLimit(uint limit) - { - sfWindow_SetFramerateLimit(m_ptr, limit); - } - - /** - * Get the time the last frame took - * - * Returns: - * time in seconds - */ - float frameTime() - { - return sfWindow_GetFrameTime(m_ptr); - } - - /** - * Change the joystick threshold, ie. the value below which - * no move event will be generated - * - * Params: - * threshold : New threshold, in range [0, 100] - */ - void joystickThreshold(float threshold) - { - sfWindow_SetJoystickThreshold(m_ptr, threshold); - } - - /** - * Retrieve the Os-specific handle of a window - * - * Params: - * renderWindow = Renderwindow object - */ - WindowHandle windowHandle() - { - return sfWindow_GetSystemHandle(m_ptr); - } -} - - /** - * Change the position of the mouse cursor - * - * Params: - * left = Left coordinate of the cursor, relative to the window - * top = Top coordinate of the cursor, relative to the window - */ - void setCursorPosition(uint left, uint top) - { - sfWindow_SetCursorPosition(m_ptr, left, top); - } - - /** - * Change the position of the window on screen. - * Only works for top-level windows - * - * Params: - * left = Left position - * top = Top position - */ - void setPosition(int left, int top) - { - sfWindow_SetPosition(m_ptr, left, top); - } - - /** - * change the size of the rendering region of the window - * - * Params: - * width : new width - * height : new height - */ - void setSize(uint width, uint height) - { - sfWindow_SetSize(m_ptr, width, height); - } - - /** - * Change the window's icon - * - * Params: - * width = Icon's width, in pixels - * height = Icon's height, in pixels - * data = array of pixels in memory, format must be RGBA 32 bits - * - */ - void setIcon(size_t width, size_t height, ubyte[] data) - { - sfWindow_SetIcon(m_ptr, width, height, data.ptr); - } - -private: - -// External ==================================================================== - static extern(C) - { - SFMLClass function(VideoMode, cchar*, Style, ContextSettings*)sfWindow_Create; - SFMLClass function(WindowHandle, ContextSettings*) sfWindow_CreateFromHandle; - void function(SFMLClass) sfWindow_Destroy; - void function(SFMLClass) sfWindow_Close; - int function(SFMLClass) sfWindow_IsOpened; - uint function(SFMLClass) sfWindow_GetWidth; - uint function(SFMLClass) sfWindow_GetHeight; - ContextSettings function(SFMLClass Window) sfWindow_GetSettings; - int function(SFMLClass, Event*) sfWindow_GetEvent; - void function(SFMLClass, int) sfWindow_EnableVerticalSync; - void function(SFMLClass, int) sfWindow_ShowMouseCursor; - void function(SFMLClass, uint, uint) sfWindow_SetCursorPosition; - void function(SFMLClass, int, int) sfWindow_SetPosition; - void function(SFMLClass, uint, uint) sfWindow_SetSize; - void function(SFMLClass, int) sfWindow_Show; - void function(SFMLClass, int) sfWindow_EnableKeyRepeat; - void function(SFMLClass, size_t, size_t, ubyte*) sfWindow_SetIcon; - int function(SFMLClass, int) sfWindow_SetActive; - void function(SFMLClass) sfWindow_Display; - SFMLClass function(SFMLClass) sfWindow_GetInput; - void function(SFMLClass, uint) sfWindow_SetFramerateLimit; - float function(SFMLClass) sfWindow_GetFrameTime; - void function(SFMLClass, float) sfWindow_SetJoystickThreshold; - - // DSFML2 - bool function(SFMLClass, void*) sfWindow_WaitEvent; - WindowHandle function(SFMLClass) sfWindow_GetSystemHandle; - } - - mixin(loadFromSharedLib2("csfml-window", "sfWindow", - "Create", "CreateFromHandle", "Destroy", "Close", "IsOpened", "GetWidth", "GetHeight", "GetSettings", "GetEvent", "EnableVerticalSync", - "ShowMouseCursor", "SetCursorPosition", "SetPosition", "SetSize", "Show", "EnableKeyRepeat", "SetIcon", "SetActive", "Display", - "GetInput", "SetFramerateLimit", "GetFrameTime", "SetJoystickThreshold", "WaitEvent", "GetSystemHandle")); -} \ No newline at end of file diff --git a/bindings/d/import/dsfml/window/windowhandle.d b/bindings/d/import/dsfml/window/windowhandle.d deleted file mode 100644 index 19d30fd8..00000000 --- a/bindings/d/import/dsfml/window/windowhandle.d +++ /dev/null @@ -1,47 +0,0 @@ -/* -* DSFML - SFML Library wrapper for the D programming language. -* Copyright (C) 2008 Julien Dagorn (sirjulio13@gmail.com) -* Copyright (C) 2010 Andreas Hollandt -* -* This software is provided 'as-is', without any express or -* implied warranty. In no event will the authors be held -* liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute -* it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; -* you must not claim that you wrote the original software. -* If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but -* is not required. -* -* 2. Altered source versions must be plainly marked as such, -* and must not be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any -* source distribution. -*/ - -module dsfml.window.windowhandle; - -/** -* Define a low-level window handle type, specific to -* each platform -*/ -version(Windows) -{ - // Windows defines a void* handle (HWND) - typedef void* WindowHandle; -} -else version(linux) -{ - // Unix - X11 defines an unsigned integer handle (Window) - typedef ulong WindowHandle; -} -else version(darwin) -{ - // Mac OS X defines a void* handle (NSWindow) - typedef void* WindowHandle; -} \ No newline at end of file diff --git a/bindings/d/import/dsss.conf b/bindings/d/import/dsss.conf deleted file mode 100644 index e9ea3a76..00000000 --- a/bindings/d/import/dsss.conf +++ /dev/null @@ -1,46 +0,0 @@ -name=dsfml - -[dsfml/audio] -type = library -target = dsfml-audio -version (Windows){ - postbuild += copy "dsfml-audio.lib" "../lib/dsfml-audio.lib" -} else version (linux){ - postbuild += cp -f "libdsfml-audio.a" "../lib/libdsfml-audio.a" -} - -[dsfml/network] -type = library -target = dsfml-network -version (Windows){ - postbuild += copy "dsfml-network.lib" "../lib/dsfml-network.lib" -} else version (linux){ - postbuild += cp -f "libdsfml-network.a" "../lib/libdsfml-network.a" -} - -[dsfml/graphics] -type = library -target = dsfml-graphics -version (Windows){ - postbuild += copy "dsfml-graphics.lib" "../lib/dsfml-graphics.lib" -} else version (linux){ - postbuild += cp -f "libdsfml-graphics.a" "../lib/libdsfml-graphics.a" -} - -[dsfml/system] -type = library -target = dsfml-system -version (Windows){ - postbuild += copy "dsfml-system.lib" "../lib/dsfml-system.lib" -} else version (linux){ - postbuild += cp -f "libdsfml-system.a" "../lib/libdsfml-system.a" -} - -[dsfml/window] -type = library -target = dsfml-window -version (Windows){ - postbuild += copy "dsfml-window.lib" "../lib/dsfml-window.lib" -} else version (linux){ - postbuild += cp -f "libdsfml-window.a" "../lib/libdsfml-window.a" -} diff --git a/bindings/d/samples/dsfml/bin/Data/background.jpg b/bindings/d/samples/dsfml/bin/Data/background.jpg deleted file mode 100644 index c778e86bda0212b9823e6f0043c5dac1656da11f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157847 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 diff --git a/bindings/d/samples/dsfml/bin/Data/ball.wav b/bindings/d/samples/dsfml/bin/Data/ball.wav deleted file mode 100644 index 8b3cfbadc0de7ce350152aa1ba96b80d5846ff9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15442 zcmdU#+i#m!cE#1A4}IuUpZZh`=I%aW_($Z!i8~8WR;_zp;YV~J# z{eRxEQaL>2=jXOx()Z^+^Z(MX`h7Foir30zerSuYrBbn2DCF}8Ud!jp6ngREv(G;I=s&&oo8Nr=@zbYkYw>ukc7FcHKYsV!U;p~2 zKfQZ*cQ>0&CZo|{(C_zpoldLOXq3z8bRh8T+2@}>di3PU^XI#}nM}1h9>0G5=Rg1L zZ`i$kdwY9%xoB6fmrCjM#>Q7)VfXau%1S7d%T=q#$J6QS*MIl}qkZ$u-5oO=j|YRJ zqi&bcs?|avnG6KJ{POYR&p!L&i`CW5%}8W#uh~31ySe%O@87-q_S@I5Z*G|9aL6p% z?Pjx9E0_27qS5vB<>jYd`{IiiFSfRl$wHyoJU%`JU>4@Jvr(3 zJDp~;S}m3K_cNJzd}n8E?b)*@Pd@$hlTRK!`tr+_mCem$lHGa#{=4t~@|XAT@9w74 z(dhVC`_gRI>xYMhLOi~*^61gWAAkDklPAxf1p^$B%#ayOkB@n$Oqk{r+Tv<=eO4e1qNP<;4ZFJvwT) zwZ?dSYio7&Yp=a{vA({w6^&*x#bTquDladuuW!6|eLb7Wj#bv{>#ZL`VVCXa}=0mC9!K_wnPsy=*p<$>s9-!^3uaG@8xcym|Zf{d=Ke zHak1(_Zy93F`bS^x3@Xfm6g@iKwxJl9?#`UrADLQKRvy?yt#n|*e7-w400-!%HCcg zvAesm@zQJS>l+)}+mQ&nTdj7x!{Pb))sg%r!g_%sDP_OrTqtV61)fKA+ zNrnfVN;tf^iRJU>cOxLj^Dy4}Hm9hpq<)6oe3Zna>q zY}T;5;WeEoCzH+Yc`Y|@`}@V>;bE)Q@7w6-=ZlCCmR46m;o2H35sSetpjTF`mXnp& zfWd=%pLKh|e_|z23l&m=WnrCI1GOAR`$s3S}oXYJf2L>y*8Pgp2A`5Z>5sYvro}zI2;P? z?uJ6)a4eQe;h*Jlt=4MwddJ704ithzeuGKcaCm&&ZkNlMjG^Mii`7+QZV=Jw;5oC| z&CQ+H@SWLAQM+2r=hJEJ()zmd)#RMfK+@?cjE1)w7jiP44wjirEVjG5xw)|s4B~U4 zP&}T^YLASUuCHHt&EkbP6g;I;(P${Ny{%n}L=p+xT`Y+f7HJgs@fo68CX+}+BJ2}9 zs9h=)4i8~p&hz5p@)9qf&5V0{y=L?9uvpyN%VbiiL?RwfBw)gWgHowlZ8Tb5Yc|mZ zsG(Y|*#sG9XVa;kV{Ac`J2=Q>lF4{H8jVC?)MPT7<&5wEjn2GjL^{JFez3QfPRmY~ zoUZ1r(G(wHaG}^dhkHwP7OlE(d=qNm~VwjEb@K}p*%r%>3y)myb(@bV>4?k-* zyIuU8cnT8nHH*lsk-4%{$z&ptOr}!U<@4IBUa#L54uw7a9?zS+o(QR^v9Yo4HS;;* zRii3uXrlN-S*LLarTzm*a zj7I%FYKOfAheTFIjr;yO9G;%~{T%$l5QanI22D{zSg6-w2t1t~My+UPq?7RURLT$( zizO22H2YgFSF3feRjcK4v6%N-p}>2_8d5!|*jB4r6)JcNd;w!bqltteLkxvxLNMuc zwPGPSk#Ke}jZmz3cYMs6L53^`gI=%Is?|(Ofc&u6@ICD0MfePs(rV-JaEM*IU9YoO z4#DO%%oHp(8tpcgg8`^IIZ;-C9Ui;C?+|Pl&gBjcu&mcxtxl)cJ38vmo4xWZf;6+P zRQC6YTU%R!0Ne%^!(o`FSTtRFetvn0_lPZEQt|_-5cognHE|meXMf*CI}k-voFsCH zpU^L;5F*FcmLdnpFg+pdK%8Ws6aip}TrQQ85JIrUz5=4OnFwD8YNwJvD z1uNn!n5tC3Vy}mSk&m*+{XQ7RGM~@ouoWjJlSF0hZmrhvn$TGC^1o84T;{aULyA6V zA!fh{7YcS#ajzx3mQHg{aE90h6>l?O=FEW1=-?oiOQ#oS05UZ5qa)26{g2{zb1#=c zRW_SW!&9l0^aLIQe|NjGWK7d-ppm?YRWsX6ChfIM21P9I6Bf~XwnEU@?XpJZid`<3 z^%_>W9CpkUzjasye>}l8o`UZa^`wP}dT<8O3ob{;qn|*O%aUMnVJe#?=I!pnH1c(M zEVv+gz){ja)4AG%rO>uSD}3ElMI<6*5O;`J=ooyRCNwfr^oT!R$=AhG_zhXvV1TE? zFJiYvJ0hePbmmb9Bxrv*7pJCmF6?is1%`@6u)vAxT)>YQuwDm=wOXYD5(|Z55ng2F z(wxGE@syC^B0Z>H#G-i-D>gp@8OArv9t>OLa|+B^IuA5Ua10h{&X44OXg5Fp%>(5* z_@Gt|s_?%`1r)<>pb4!9pW<&+6tolIUuXo8dwcAb(1@ZjW;8VF8OmVLL*zY*5Y#Nv)&O3FfKLiD(}AcB~#FrG3rqHu{=@D!OA9w1baMR205 z*!TsWLdg(&9!3yZnjV%ND7F)YU*ILveT*nI!!Gsv+9TUv&?uHrj_mM=zn4l>@KB27 za;a39H^ZaQjo*tmh?-7KnGR#kaE_uMbCw4`dJRbwd+5RUPH z{e5G{#Z^<^GF0J%(tfFV6RWan;%&3pZg;!v7!3|rT@1ezH)gyh?=?gcHHamxR=a&4 zleXi2W;7k9?A^FgYSl0$jf)B*W)k_rVe)>s5mY%f)Ae+&Q#05RZQ)dlwhwVEG)k4= zwKT(&#Vm3)i?;cH$ey&HzJkQ(1wO7!en4r(p>; z$f(e=R&4?u8L#GqontCP6f@PDRih;$Fk7)4R*JXM$%e(F?;GRcxz#FYq*}fI_eRwk zkH>StBDS3l<1%Mf>gFwuBP#$^%w{VQ`K@>qsRrWT#El;J|rk2v6> zrnH~bj64>vQ(oy6>gIW+L&n3nDMcYP!i|hd#C4dGueVxolJSeQ1(5M@OT8&lXg;ulraWwXN;zr>S&2n&Ha1{X1q;70^m*O;4 z2fvE@@tB1&hpWV?Iv1y|?OfnS@e63g2IXbC-0_P;qs1P)9hNXGVkO-O8kNJ4$JA;< zq+&PPN(|8TT4#O(a8)8&pOh#c-bg&^r5GDKmKJ(fO1KUt*_Jlc&b zC#I;xr>aD9!j|pWDI0ItN%1t!iAL-LQOv>YxaAS&@RzbCd_wae{uwriw-z~tD%sv2 z(Nvs9v@uN!!*aqEh*HHsYhy&M9UDfIN1A5AP7OJ2mM9x$3nH=7T5Z-^vsH=2b3{(7 zk2-a2wGUHqR=rw9Rc5>{$vTx&1=}h{m`FrcE zI4}4HJPMKCR|-770wLCH6d}^im~)n`jfSRmmi)!D95%32vw52KKnc%HydkJHq-Hm-)h%YErILwN$qRS?;cZYK_ZPsfM{67iEr)6GLKW)d$tk+&v^U z3-Uy(uBuwE3L18*^DAewEWoj&)w5iNtC|JKGM3{^96N$yQ*E##xt`^Scnvyrv1WmK z@>`KXkO%wo04Xo2M)<*$7dZ#`6`NuMi;0Oi3r^5Z;6vwb-(2A&X`DHYED1DHVYddx zKntAdx8pzA+_w;-{Z{lCj%K)s^0^n@YNw3=gKr!)OIkJO|T zJX%Tk#Z#1tI&}w%VH8dd_HY{1DLYxYC~UFRsRWqDc-tbkbe;H>NNQ1(kwCjK6|e9z zIA$a~#Q4t7k+OnO)vy3&AyT(s{+JE#_^W`rH?z7UwQQ;` zWHb6M3t5mqv$k6T)eWhCt8PdhBh6`*H<%dYt1fDM3Z{(R(2NfEoSLyI?1uIu3o%4l zeFhvlCIwOWqtzJ}ZTwnMC^YOcJBKLCB`pU9yFZj?C{-}cuc$6vrW}JTS*(lZGz3cB z6M1D}TF#i4sB7BM@b_W;=g16al7eYjlpkOn5w0(SuiKOLg=Qi zsY_uMWc!t+tBWn_EY$(4z7ckBM!T4mL` zmEgYCZs}rP6ME5%F85LWm;Q?imAr+RZg&_Ch4(S2tOZs>?TJ6BtSh>b%UKqO2Pz`F z%oAMbl>Is%&Lp#N87C3hACK+KIAy2%#4ac(6d%vF3`FspIHmJaW~%oS(b zSPm@qV)w)>iiE}z7CX)Bg*b5pn3h%-o;f{o5{FJ=n)P+@Qkk*ESNaQ^I%i=`PgeeY zAIE;p%2U-8e+|QoY?u(oNk=KEw>{2cA(YFiO(>cP|GcfG8WwefYQG!cDV zU6GwMJtSoK6_A~b%Q4t}cY^eN$P)BXFaJqfKX-aMWyh4vOK9+)@U^v)Mh zg+uiZ^`Rf5@VP}&J%j&wf3flIVq5&&{`2=?Z|q0!TQ9xpJ^%b4j%?4vf*H@Z=lfq; z0Xu1TJk(m1^4Et((sOwVyC}s;tWg#y?sCkfPb_i>9YUM%267n1p@t_3PkP_~iQ7jT z-*BW|60Ug9&g8>ucWdzPhTeU+SK0*|!CCy+`}ET1_SD5!_Z0V+Tlf7rxF`90^Tb6Y V>eI!M>_3~2|J6RzE7tn!e*uus=a>Kh diff --git a/bindings/d/samples/dsfml/bin/Data/bluerallyecarleft.bmp b/bindings/d/samples/dsfml/bin/Data/bluerallyecarleft.bmp deleted file mode 100644 index afd8c94ac49fe6282602672deccca0aacfb2403c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27702 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 N6W|H(1pdDe_#f$&no$4% diff --git a/bindings/d/samples/dsfml/bin/Data/bluerallyecarright.bmp b/bindings/d/samples/dsfml/bin/Data/bluerallyecarright.bmp deleted file mode 100644 index 07d839b971d16d17e02ae4426a8f9eb4e58385fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27702 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 G;Qs(qs2K(T diff --git a/bindings/d/samples/dsfml/bin/Data/blur.sfx b/bindings/d/samples/dsfml/bin/Data/blur.sfx deleted file mode 100644 index 04bfec53..00000000 --- a/bindings/d/samples/dsfml/bin/Data/blur.sfx +++ /dev/null @@ -1,16 +0,0 @@ -texture framebuffer -float offset - -effect -{ - vec2 offx = vec2(offset, 0.0); - vec2 offy = vec2(0.0, offset); - - vec4 c0 = framebuffer(_in); - vec4 c1 = framebuffer(_in - offy); - vec4 c2 = framebuffer(_in + offy); - vec4 c3 = framebuffer(_in - offx); - vec4 c4 = framebuffer(_in + offx); - - _out = c0 * 0.2 + c1 * 0.2 + c2 * 0.2 + c3 * 0.2 + c4 * 0.2; -} diff --git a/bindings/d/samples/dsfml/bin/Data/car_idle.wav b/bindings/d/samples/dsfml/bin/Data/car_idle.wav deleted file mode 100644 index 51a55f891137010a62818023994fb9b4b7327d86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59291 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 NOzj}wM$Q#0{tuYio(KQ{ diff --git a/bindings/d/samples/dsfml/bin/Data/cheeseburger.ttf b/bindings/d/samples/dsfml/bin/Data/cheeseburger.ttf deleted file mode 100644 index 47704266ef288293e6590a29d649eccbd85fa0b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42020 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 NV8xiE)h|##|Jjbt96JC2 diff --git a/bindings/d/samples/dsfml/bin/Data/opengl/texture.jpg b/bindings/d/samples/dsfml/bin/Data/opengl/texture.jpg deleted file mode 100644 index 6cf7528eb43f27054b98fd5a4a93bb8c47829b1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20550 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 diff --git a/bindings/d/samples/dsfml/bin/Data/paddle.tga b/bindings/d/samples/dsfml/bin/Data/paddle.tga deleted file mode 100644 index 34bd6b84d6f9f378c988733d05c57092e7f1204a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1943 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Μ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

#2fb?XtoN;am!m*Pio2YOSpSTBK4m!_Dg4 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 z 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

MMSjTHS&OkJG5Gt9wyX9aVG7>n8g)r}d&`e#o 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 sB_?;LR%ADwV1eyn9;L%Y__ZkLhr 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 z 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 z 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℞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 5.f)) - LeftPaddle.move(0.f, -LeftPaddleSpeed * app.frameTime); - if (i.isKeyDown(KeyCode.Down) && (LeftPaddle.position.y < app.view.getHeight() - LeftPaddle.size.y - 5.f)) - LeftPaddle.move(0.f, LeftPaddleSpeed * app.frameTime); - - // Move the computer's paddle - if (((RightPaddleSpeed < 0.f) && (RightPaddle.position.y > 5.f)) || - ((RightPaddleSpeed > 0.f) && (RightPaddle.position.y < app.view.getHeight() - RightPaddle.size.y - 5.f))) - { - RightPaddle.move(0.f, RightPaddleSpeed * app.frameTime); - } - - // Update the computer's paddle direction according to the ball position - AITimer.stop(); - if (AITimer.milliseconds > AITime) - { - AITimer.start(); - if ((RightPaddleSpeed < 0) && (Ball.position.y + Ball.size.y > RightPaddle.position.y + RightPaddle.size.y)) - RightPaddleSpeed = -RightPaddleSpeed; - if ((RightPaddleSpeed > 0) && (Ball.position.y < RightPaddle.position.y)) - RightPaddleSpeed = -RightPaddleSpeed; - } - - - - // Move the ball - float Factor = BallSpeed * app.frameTime; - Ball.move(cos(BallAngle) * Factor, sin(BallAngle) * Factor); - - // Check collisions between the ball and the screen - if (Ball.position.x < 0.f) - { - IsPlaying = false; - End.text("You lost !\n(press escape to exit)"c); - } - - if (Ball.position.x + Ball.size.x > app.view.getWidth()) - { - IsPlaying = false; - End.text("You won !\n(press escape to exit)"c); - } - - if (Ball.position.y < 0.f) - { - BallSound.play(); - BallAngle = -BallAngle; - Ball.y = 0.1f; - } - - if (Ball.position.y + Ball.size.y > app.view.getHeight()) - { - BallSound.play(); - BallAngle = -BallAngle; - Ball.y = app.view.getHeight() - Ball.size.y - 0.1f; - } - // Check the collisions between the ball and the paddles - // Left Paddle - if (Ball.position.x < LeftPaddle.position.x + LeftPaddle.size.x && - Ball.position.x > LeftPaddle.position.x + (LeftPaddle.size.x / 2.0f) && - Ball.position.y + Ball.size.y >= LeftPaddle.position.y && - Ball.position.y <= LeftPaddle.position.y + LeftPaddle.size.y) - { - BallSound.play(); - BallAngle = PI - BallAngle; - Ball.x = LeftPaddle.position.x + LeftPaddle.size.x + 0.1f; - } - - // Right Paddle - if (Ball.position.x + Ball.size.x > RightPaddle.position.x && - Ball.position.x + Ball.size.x < RightPaddle.position.x + (RightPaddle.size.x / 2.0f) && - Ball.position.y + Ball.size.y >= RightPaddle.position.y && - Ball.position.y <= RightPaddle.position.y + RightPaddle.size.y) - { - BallSound.play(); - BallAngle = PI - BallAngle; - Ball.x = RightPaddle.position.x - Ball.size.x - 0.1f; - } - } - - // Draw the background, paddles and ball sprites - - app.draw(LeftPaddle); - app.draw(RightPaddle); - app.draw(Ball); - - fpsClock.stop(); - if(fpsClock.seconds >= 1) - { - fps.text = std.string.format("%d fps", iFps); - iFps = 0; - fpsClock.start(); - } - ++iFps; - app.draw(fps); - // If the game is over, display the end message - if (!IsPlaying) - app.draw(End); - - // Display things on screen - app.display(); - } -} \ No newline at end of file diff --git a/bindings/d/samples/dsfml/postFX/postFX.d b/bindings/d/samples/dsfml/postFX/postFX.d deleted file mode 100644 index 0d6d864c..00000000 --- a/bindings/d/samples/dsfml/postFX/postFX.d +++ /dev/null @@ -1,117 +0,0 @@ -module postfx; - -import dsfml.graphics.all; -import dsfml.system.all; -import dsfml.window.all; - -const char[][5] EFFECTS = ["nothing", "blur", "colorize", "fisheye", "wave"]; - -void main() -{ - int actualIndex; - - // Check that the system can use post effects - if (PostFX.canUsePostFX() == false) - assert(0, "Your system doesn't support Post Effects."); - - // Create the main window - RenderWindow app = new RenderWindow(VideoMode(800, 600), "SFML PostFX"); - app.setFramerateLimit(100); - - // Load a cute background image to display :) - Sprite background = new Sprite(new Image("Data/background.jpg")); - - // Load the image needed for the wave effect - Image WaveImage = new Image("Data/wave.jpg"); - - // Load all effects - PostFX[char[]] Effects; - foreach(char[] c; EFFECTS) - { - Effects[c] = new PostFX("Data/" ~ c ~ ".sfx"); - } - PostFX currentEffect = Effects[EFFECTS[actualIndex]]; - - // Do specific initializations - Effects["nothing"].setTexture("framebuffer", null); - Effects["blur"].setTexture("framebuffer", null); - Effects["blur"].setParameter("offset", 0.f); - Effects["colorize"].setTexture("framebuffer", null); - Effects["colorize"].setParameter("color", 1.f, 1.f, 1.f); - Effects["fisheye"].setTexture("framebuffer", null); - Effects["wave"].setTexture("framebuffer", null); - Effects["wave"].setTexture("wave", WaveImage); - - Font f = new Font("Data/cheeseburger.ttf"); - - // Define a string for displaying current effect description - Text curFXStr = new Text("Current effect is " ~ EFFECTS[actualIndex]); - curFXStr.setFont(f); - curFXStr.setPosition(20.f, 0.f); - - // Define a string for displaying help - Text infoStr = new Text("Move your mouse to change the effect parameters\nPress numpad + and - to change effect\nWarning : some effects may not work\ndepending on your graphics card"c); - infoStr.setFont(f); - infoStr.setPosition(20.f, 460.f); - infoStr.setColor(Color(200, 100, 150)); - - // Start the game loop - while (app.isOpened()) - { - // Process events - Event evt; - while (app.getEvent(evt)) - { - // Close window : exit - if (evt.Type == Event.EventType.CLOSED || - evt.Type == Event.EventType.KEYPRESSED && evt.Key.Code == KeyCode.ESCAPE) - app.close(); - - if (evt.Type == Event.EventType.KEYPRESSED) - { - // Add key : next effect - if (evt.Key.Code == KeyCode.ADD) - { - if (actualIndex == 4) - actualIndex = 0; - else - actualIndex++; - currentEffect = Effects[EFFECTS[actualIndex]]; - curFXStr.setText("Current effect is " ~ EFFECTS[actualIndex]); - } - - // Subtract key : previous effect - if (evt.Key.Code == KeyCode.SUBTRACT) - { - if (actualIndex == 0) - actualIndex = 4; - else - actualIndex--; - currentEffect = Effects[EFFECTS[actualIndex]]; - curFXStr.setText("Current effect is " ~ EFFECTS[actualIndex]); - } - } - } - - // Get the mouse position in the range [0, 1] - float X = app.getInput().getMouseX() / cast(float) app.getWidth(); - float Y = app.getInput().getMouseY() / cast(float) app.getHeight(); - - // Update the current effect - if (EFFECTS[actualIndex] == "blur") currentEffect.setParameter("offset", X * Y * 0.1f); - else if (EFFECTS[actualIndex] == "colorize") currentEffect.setParameter("color", 0.3f, X, Y); - else if (EFFECTS[actualIndex] == "fisheye") currentEffect.setParameter("mouse", X, 1.f - Y); - else if (EFFECTS[actualIndex] == "wave") currentEffect.setParameter("offset", X, Y); - - // Draw background and apply the post-fx - app.draw(background); - app.draw(currentEffect); - - // Draw interface strings - app.draw(curFXStr); - app.draw(infoStr); - - // Finally, display the rendered frame on screen - app.display(); - } -} diff --git a/bindings/d/samples/dsfml/socket/socketclient.d b/bindings/d/samples/dsfml/socket/socketclient.d deleted file mode 100644 index 2a25114e..00000000 --- a/bindings/d/samples/dsfml/socket/socketclient.d +++ /dev/null @@ -1,66 +0,0 @@ -module socketclient; - -import dsfml.system.all; -import dsfml.network.all; - -version (Tango) -{ - import tango.io.Console; - import tango.io.Stdout; -} -else -{ - import std.stdio; -} - - -void main() -{ - //The TCP socket - SocketTCP client = new SocketTCP(); - //Try to connect to server (on localhost for this sample) - client.connect(9000, IPAddress.LOCALHOST); - - display("Connected to server."w); - - //Prepare a packet with a string - Packet p = new Packet(); - p.set("Hello from the client !"w); - if (client.send(p) != SocketStatus.DONE) // Assert on error - assert(0); - - //Clear the packet - p.clear(); - - //Wait for the response of the server and display it - if (client.receive(p) != SocketStatus.DONE) - assert(0); - wchar[] c; - p.get(c); - display("Packet received : "w ~ c); - read(); -} - -void display(wchar[] c) -{ - version (Tango) - { - Stdout(c).newline; - } - else - { - writefln("%s", c); - } -} - -void read() -{ - version (Tango) - { - Cin.get(); - } - else - { - readln(); - } -} diff --git a/bindings/d/samples/dsfml/socket/socketserver.d b/bindings/d/samples/dsfml/socket/socketserver.d deleted file mode 100644 index afab76fb..00000000 --- a/bindings/d/samples/dsfml/socket/socketserver.d +++ /dev/null @@ -1,83 +0,0 @@ -module socketserver; - -import dsfml.system.all; -import dsfml.network.all; - -version (Tango) -{ - import tango.io.Console; - import tango.io.Stdout; -} -else -{ - import std.stdio; -} - -void main() -{ - //We create a TCP socket for listening incomming client - SocketTCP listener = new SocketTCP(); - - //Set a random port for the listener - if (!listener.listen(9000)) - assert(0); - - //Creation of TCP socket - SocketTCP client = new SocketTCP(); - IPAddress ipClient; - - display("Waiting for client."w); - - if (listener.accept(client, ipClient) == SocketStatus.DONE) //This call blocks until client connection - { - display("New client connected."w); - //The packet for retrieving the client message - Packet p = new Packet(); - display("Waiting for data"w); - if (client.receive(p) != SocketStatus.DONE) //Assert on reception error - assert(0); - - - //Display the string send by the client - wchar[] c; - p.get(c); - display("Packet received : "w ~ c); - - //Clear the packet (We could use a new one) - p.clear(); - - //and send response to client - client.send(p.set("Hello from the server !"w)); - } - read(); -} - -/** -* Multilib string display -*/ -void display(wchar[] c) -{ - version (Tango) - { - Stdout(c).newline; - } - else - { - writefln("%s", c); - } -} - -/** -* Dummy function to prevent console closing on windows -*/ -void read() -{ - version (Tango) - { - Cin.get(); - } - else - { - readln(); - } -} diff --git a/bindings/d/samples/dsfml/sound3d/sound3d.d b/bindings/d/samples/dsfml/sound3d/sound3d.d deleted file mode 100644 index 17e0d08d..00000000 --- a/bindings/d/samples/dsfml/sound3d/sound3d.d +++ /dev/null @@ -1,185 +0,0 @@ -module sound3d; - -import dsfml.system.all; -import dsfml.window.all; -import dsfml.graphics.all; -import dsfml.audio.all; - -void main() -{ - //We create our window with a limit of 100 and a white backcolor. - RenderWindow app = new RenderWindow (VideoMode(800, 600, 32), "Sound Spatialization Sample"); - app.useVerticalSync(true); - - Font f = new Font("Data/cheeseburger.ttf"); - - //Some instructions - Text s = new Text("Click anywhere on screen to change listener position.\nPress + or - to modify the speed of the car."c, f); - - s.characterSize = 34; - s.setPosition(20, 30); - s.color = Color.BLACK; - - //We prepare our images and the sound - string[2] images = ["Data/bluerallyecarleft.bmp", "Data/bluerallyecarright.bmp"]; - Car c = new Car(images, "Data/car_idle.wav"); - - int carSpeed = 100; - - //Set default position for the car and the listener - c.position = Vector2f(0, 300); - SoundListener.position = Vector2f(400, 300); - - c.startPlaying(); - - //Start the main loop - while (app.isOpened()) - { - app.clear(Color.WHITE); - Event evt; - //The event loop - while (app.getEvent(evt)) - { - // if the window is closed, we can leave the game loop - if (evt.Type == EventType.Closed) - app.close(); - // we handle the click event to change listener position - else if (evt.Type == EventType.MouseButtonPressed && evt.MouseButton.Button == MouseButtons.Left) - { - Input i = app.input; - SoundListener.position = Vector2f(i.mouseX, i.mouseY); - } - // and eventual keys press - else if (evt.Type == EventType.KeyPressed) - { - //Change the car speed - if (evt.Key.Code == KeyCode.Add) - { - carSpeed += 25; - } - else if (evt.Key.Code == KeyCode.Substract) - { - carSpeed -= 25; - } - } - } - - //We move constantly our car. - c.move(Vector2f(app.frameTime * carSpeed, 0)); - - //Draw all the sprite and string on render window - app.draw(s); - app.draw(c.sprite); - app.draw(SoundListener.sprite); - - //And finally display the window - app.display(); - } - - -} - -// Encapsulate the listener position and the visor sprite. -// There is only one listener so all the methods are statics. -class SoundListener -{ - static Sprite s_crosshair; - static Vector2f s_p; - - static this() - { - Image crosshairImg = new Image("Data/crosshair.tga"); - crosshairImg.createMaskFromColor(Color.WHITE); - - s_crosshair = new Sprite(crosshairImg); - s_crosshair.setOrigin(s_crosshair.size.x / 2, s_crosshair.size.y / 2); - - //Listener.setTarget(1.f, 0.f, 0.f); - } - - // Adjust position of the listener - @property static void position(Vector2f p) - { - Listener.setPosition(p.x, p.y, 5.f); - s_crosshair.setPosition(p.x, p.y); - } - - @property static Sprite sprite() - { - return s_crosshair; - } -} - - -//! Class encapsulating all data for our car -class Car -{ - Vector2f m_actual; - Sprite m_sprite; - Sound m_sound; - bool reverse; - Image[2] imgs; - - //Constructor with with a fixed size string array of image path, and a string for the sound path - this (string[2] images, string soundFilename) - { - //load images and create filter - imgs[0] = new Image(images[0]); imgs[1] = new Image(images[1]); - - foreach(img; imgs) - img.createMaskFromColor(Color(97, 68, 43)); - - m_sprite = new Sprite(imgs[0]); - m_sprite.setOrigin(m_sprite.size.x / 2, m_sprite.size.y / 2); - - SoundBuffer buff = new SoundBuffer(soundFilename); - - //load our sound with loop enabled - m_sound = new Sound(buff, true); - m_sound.attenuation = .05f; - } - - // Begin the sound play - void startPlaying() - { - m_sound.play(); - } - - // Set the position of the car on the window - // Used to setup the begin car window and sound location - @property void position(Vector2f p) - { - m_sprite.setPosition(p.x, p.y); - m_sound.setPosition(p.x, 0, p.y); - } - - //Move the car (visual and sound position) - //If the car leave the screen, we change the sprite image and reverse moving - void move(Vector2f vec) - { - // if the car is beyond the right screen limit - if (!reverse && m_sprite.position.x > 850) - { - m_sprite.setImage(imgs[1]); - reverse = true; - } - // same as above but for left limit - else if (reverse && vec.x + m_sprite.position.x < -50) - { - m_sprite.setImage(imgs[0]); - reverse = false; - } - - if (reverse) - vec = -vec; - - m_sprite.move(vec); - Vector2f pos = m_sprite.position; - m_sound.setPosition(pos.x , pos.y, 0); - } - - @property Sprite sprite() - { - return m_sprite; - } -} \ No newline at end of file diff --git a/bindings/d/samples/dsfml/soundstream/soundstream.d b/bindings/d/samples/dsfml/soundstream/soundstream.d deleted file mode 100644 index 03ba555c..00000000 --- a/bindings/d/samples/dsfml/soundstream/soundstream.d +++ /dev/null @@ -1,97 +0,0 @@ -module soundstream; - -import dsfml.system.all; -import dsfml.audio.all; - -version (Tango) -{ - import tango.io.Console; - import tango.io.Stdout; -} -else -{ - import std.stdio; -} - -// SoundStream is an abstract class. -// You need to implement onStart() and onGetData() -// Don't forget to call initialize() before any usage or playback will fail. -class MySoundStream : SoundStream -{ - SoundBuffer m_buff; - short[] m_data; - size_t m_cursor; - - this() - { - // We initialize the stream with some sound informations - super(1, 11025); - - // We create a sound buffer to load samples from files - m_buff = new SoundBuffer("Data/car_idle.wav"); - m_data = m_buff.samples[0..m_buff.samplesCount]; - } - -protected: -/* - bool onStart() - { - // No specifics things to do, just return true. - return true; - } -*/ - override bool onGetData(out short[] data) - { - // We ensure that we have enough data to send - if (m_cursor + this.sampleRate > m_data.length) - return false; - - // Assign data in the buffer ... - data = m_data[m_cursor..m_cursor + this.sampleRate]; - // ... and increment the cursor - m_cursor += this.sampleRate; - return true; - } - - override void onSeek(float timeOffset) - { - - } -} - -void main() -{ - MySoundStream stream = new MySoundStream(); - - display("Playing sound !\n Press enter to stop playback."); - stream.play(); - read(); // prevent console from closing - stream.stop(); -} - -void display(string c) -{ - version (Tango) - { - Stdout(c).newline; - } - else - { - writeln(c); - } -} - -/** -* Dummy function to prevent console closing on windows -*/ -void read() -{ - version (Tango) - { - Cin.get(); - } - else - { - readln(); - } -} \ No newline at end of file diff --git a/bindings/d/samples/dsfml/view/view.d b/bindings/d/samples/dsfml/view/view.d deleted file mode 100644 index c100fc31..00000000 --- a/bindings/d/samples/dsfml/view/view.d +++ /dev/null @@ -1,69 +0,0 @@ -module view; - -import dsfml.system.all; -import dsfml.window.all; -import dsfml.graphics.all; - -void main() -{ - RenderWindow window = new RenderWindow(VideoMode(800, 600), "View sample"); - window.framerateLimit = 100; - Input input = window.input; - Vector2f top; - FloatRect bound; - Shape s; - bool mousePressed; - - Sprite background = new Sprite(new Image("Data/background.jpg")); - - Font f = new Font("Data/cheeseburger.ttf"); - Text str = new Text("Create a selection of the background with your mouse.\nPress Enter to zoom to this selection.\nPress Escape to return to the default view."c, f); - - while (window.isOpened()) - { - Event evt; - - while (window.getEvent(evt)) - { - if ( evt.Type == EventType.MouseButtonPressed && - evt.MouseButton.Button == MouseButtons.Left) - { - top = window.convertCoords(input.mouseX, input.mouseY); - mousePressed = true; - - } - else if ( evt.Type == EventType.MouseButtonReleased && - evt.MouseButton.Button == MouseButtons.Left) - { - mousePressed = false; - } - else if ( evt.Type == EventType.MouseMoved && - mousePressed) - { - Vector2f bottom = window.convertCoords(input.mouseX, input.mouseY); - bound = FloatRect(top.x, top.y, bottom.x-top.x, bottom.y-top.y); - s = Shape.rectangle(bound.left, bound.top, bound.width, bound.height, Color(0, 0, 0, 0), 1, Color.BLACK); - } - else if ( evt.Type == EventType.KeyPressed && - evt.Key.Code == KeyCode.Return) - { - if (bound != FloatRect()) - window.view = new View(bound); - s = null; - } - else if ( evt.Type == EventType.KeyPressed && - evt.Key.Code == KeyCode.Escape) - { - window.view = window.defaultView; - } - else if ( evt.Type == EventType.Closed) - window.close(); - - } - - window.draw(background); - window.draw(str); - if (s !is null) window.draw(s); - window.display(); - } -} \ No newline at end of file diff --git a/bindings/d/samples/dsfml/voip/client.d b/bindings/d/samples/dsfml/voip/client.d deleted file mode 100644 index f2dc4027..00000000 --- a/bindings/d/samples/dsfml/voip/client.d +++ /dev/null @@ -1,72 +0,0 @@ -module client; - -import util; - - -// Specialization of audio recorder for sending recorded audio -// data through the network -class NetworkRecorder : SoundRecorder -{ -public: - - // Constructor - this(SocketTCP Socket) - { - mySocket = Socket; - } - - ~this() - { - delete mySocket; - } -protected: - override bool onStart() - { - return true; - } - - override void onStop() - { - - } - - override bool onProcessSamples(short[] samples) - { - // Pack the audio samples into a network packet - Packet PacketOut = new Packet(); - PacketOut.set(AudioData); - PacketOut.append((cast(byte*)samples.ptr)[0..samples.length * short.sizeof]); - // Send the audio packet to the server - return mySocket.send(PacketOut) == SocketStatus.DONE; - } - - SocketTCP mySocket; ///< Socket used to communicate with the server -} - -void runClient(IPAddress adr, int port) -{ - // Create a TCP socket for communicating with server - SocketTCP Socket = new SocketTCP(); - - // Connect to the specified server - if (!Socket.connect(port, adr)) - return; - - // Wait for user input... - Cout("Press enter to start recording audio").newline; - Cin.get(); - - // Create a instance of our custom recorder - NetworkRecorder Recorder = new NetworkRecorder(Socket); - - // Start capturing audio data - Recorder.start(44100); - Cout("Press enter to stop recording audio").newline; - Cin.get(); - Recorder.stop(); - - // Send a "end-of-stream" packet - Packet PacketOut = new Packet(); - PacketOut.set(EndOfStream); - Socket.send(PacketOut); -} diff --git a/bindings/d/samples/dsfml/voip/entry.d b/bindings/d/samples/dsfml/voip/entry.d deleted file mode 100644 index 01c5c630..00000000 --- a/bindings/d/samples/dsfml/voip/entry.d +++ /dev/null @@ -1,46 +0,0 @@ -module entry; - -import util; -import server; -import client; - -int main(char[][] args) -{ - char[][] argc = args.dup; - if (argc.length > 1) - { - if ( argc[1] == "-c" && - argc.length == 4) - { - IPAddress adr = IPAddress(argc[2]); - - if (adr.isValid() && - parse(argc[3]) <= 60000 && - parse(argc[3]) >= 1000) - { - runClient(adr, parse(argc[3])); - } - else - printUsage(); - } - else if ( argc[1] == "-s" && - argc.length == 3 && - parse(argc[2]) <= 60000 && - parse(argc[2]) >= 1000) - { - runServer(parse(argc[2])); - - } - else - printUsage(); - } - else - printUsage(); - - return 0; -} - -void printUsage() -{ - Cout("Usage :\n voip.exe [-c [ip address] | -s] [port] \n -c = run as client\n -s = run as server\n ip address = address of the server\n port = port between 1000 and 65000\n").newline; -} diff --git a/bindings/d/samples/dsfml/voip/server.d b/bindings/d/samples/dsfml/voip/server.d deleted file mode 100644 index 41b182a0..00000000 --- a/bindings/d/samples/dsfml/voip/server.d +++ /dev/null @@ -1,162 +0,0 @@ -module server; - -import util; - -class NetworkAudioStream : SoundStream -{ -public: - static this() - { - s_sync = new Object(); - } - - // Default constructor - this() - { - myListener = new SocketTCP(); - myClient = new SocketTCP(); - // Set the sound parameters - super(1, 44100); - } - - // Destructor - ~this() - { - // Close the sockets - delete myClient; - delete myListener; - } - - // Run the server, stream audio data from the client - void start(int Port) - { - if (!myHasFinished) - { - // Listen to the given port for incoming connections - if (!myListener.listen(Port)) - return; - Cout("Listening").newline; - myListener.accept(myClient); - Cout("New Client").newline; - // Start playback - play(); - - // Start receiving audio data - receiveLoop(); - } - else - { - // Start playback - play(); - } - } - -protected: - - override bool onStart() - { - // Reset the playing offset - myOffset = 0; - - return true; - } - - override bool onGetData(out short[] data) - { - // We have reached the end of the buffer and all audio data have been played : we can stop playback - if ((myOffset == mySamples.length) && myHasFinished) - return false; - // No new data has arrived since last update : wait until we get some - while (myOffset == mySamples.length && !myHasFinished) - sleep(0.01f); - - synchronized(s_sync) - { - myTempBuffer = mySamples[myOffset..mySamples.length]; - // Update the playing offset - myOffset += myTempBuffer.length; - } - - data = myTempBuffer; - return true; - } - -private: - - void receiveLoop() - { - while (!myHasFinished) - { - // Get waiting audio data from the network - Packet PacketIn = new Packet(); - if (myClient.receive(PacketIn) != SocketStatus.DONE) - break; - - // Extract the message ID - ubyte Id; - PacketIn.get(Id); - - if (Id == AudioData) - { - // Extract audio samples from the packet, and append it to our samples buffer - - synchronized(s_sync) - { - byte* temp = PacketIn.getData().ptr; - temp++; - - mySamples ~= (cast(short*)temp)[0..(PacketIn.getDataSize - byte.sizeof ) / short.sizeof]; - } - } - else if (Id == EndOfStream) - { - // End of stream reached : we stop receiving audio data - myHasFinished = true; - } - else - { - // Something's wrong... - myHasFinished = true; - } - } - } - - SocketTCP myListener; - SocketTCP myClient; - short[] mySamples; - short[] myTempBuffer; - size_t myOffset; - bool myHasFinished; - - static Object s_sync; -}; - - - -// Launch a server and wait for incoming audio data from -// a connected client -void runServer(int Port) -{ - // Build an audio stream to play sound data as it is received through the network - NetworkAudioStream audioStream = new NetworkAudioStream; - audioStream.start(Port); - - // Loop until the sound playback is finished - while (audioStream.getStatus() != SoundStatus.STOPPED) - { - // Leave some CPU time for other threads - sleep(0.1f); - } - - Cout("Enter to replay").newline; - Cin.get(); - // Replay the sound (just to make sure replaying the received data is OK) - audioStream.play(); - - // Loop until the sound playback is finished - while (audioStream.getStatus() != SoundStatus.STOPPED) - { - // Leave some CPU time for other threads - sleep(0.1f); - } -} diff --git a/bindings/d/samples/dsfml/voip/util.d b/bindings/d/samples/dsfml/voip/util.d deleted file mode 100644 index ebf548b8..00000000 --- a/bindings/d/samples/dsfml/voip/util.d +++ /dev/null @@ -1,49 +0,0 @@ -module util; - -const ubyte AudioData = 1; -const ubyte EndOfStream = 2; - -public import dsfml.system.all; -public import dsfml.audio.all; -public import dsfml.network.all; - -version(Tango) -{ - public import tango.io.Console; - public import tango.text.convert.Integer; -} -else -{ - public import std.stdio; - - //simple abstraction of Cout & Cin for phobos - class Cout - { - static Cout s_c; - static this() - { - s_c = new Cout(); - } - - static Cout opCall(char[] str) - { - writefln("%s", str); - return s_c; - } - void newline() - { - - } - } - - class Cin - { - static char[] get() - { - return readln(); - } - } - - public import std.string : atoi; - alias atoi parse; -} diff --git a/bindings/python/MANIFEST.in b/bindings/python/MANIFEST.in deleted file mode 100644 index f58b8d26..00000000 --- a/bindings/python/MANIFEST.in +++ /dev/null @@ -1,5 +0,0 @@ -graft src -graft scripts -graft doc -graft samples - diff --git a/bindings/python/PySFML/__init__.py b/bindings/python/PySFML/__init__.py deleted file mode 100644 index 48163e52..00000000 --- a/bindings/python/PySFML/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -__all__ = ['sf'] - diff --git a/bindings/python/doc/style.css b/bindings/python/doc/style.css deleted file mode 100644 index 0a59e690..00000000 --- a/bindings/python/doc/style.css +++ /dev/null @@ -1,96 +0,0 @@ -div#logo -{ - margin-bottom : 1em; - background : url("http://www.sfml-dev.org/images/logo-bg.jpg") repeat-x; -} - -div#logo a -{ - display : block; -} - -div.class_desc -{ - margin-left:10px; - font-weight: bolder; - color:#168; -} - -div.base_class -{ - margin-top:8px; - margin-left:10px; - font-weight: bold; - color:#168; -} - -div.attr_name -{ - margin-top:20px; - margin-left:10px; - font-weight: bolder; -} - -div.inherited -{ - margin-left:20px; - font-size: smaller; -} - -div.desc -{ - margin-left:20px; -} - -div.event_member -{ - margin-left:30px; - font-weight: lighter; -} - -p#footer -{ - text-decoration : overline; - color : #606060; - padding-top : 1em; - text-align : center; - font-size : smaller; -} - -p#footer a -{ - color : #007298; - text-decoration : none; -} - -H1 { - text-align : center; - margin-top : 0px; - color : #2090B0; - font-size : 160%; -} -H2 { - font-size: 120%; -} -H3 { - font-size: 100%; -} - -a { - color: #2090B0; -} -a:visited { - color: #2090B0; -} -HR { height: 1px; - border: none; - border-top: 1px solid black; -} - -BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV { - font-family: Geneva, Arial, Helvetica, sans-serif; -} -BODY,TD { - font-size: 90%; -} - diff --git a/bindings/python/samples/data/apple.png b/bindings/python/samples/data/apple.png deleted file mode 100644 index 0cfb031dc5c8497c7c57fc52d4ec89c002c9f613..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 868 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 JxkhR?{tx_gjX?ka diff --git a/bindings/python/samples/data/rond2.png b/bindings/python/samples/data/rond2.png deleted file mode 100644 index 8d36b1d60ba9568444d96437b6df7833473669b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1167 zcmV;A1aSL_P)qjp@sh zNbh<~UjXg#jSNU7A(y)x04j)NAUOw;kVrwSfG&x27xXjJV23@8*a{-Hf*tnsGt*$V zx&vrItO<$a97qNth^STh9smVL8q=4@bfqNJYtTpZ^@NL{1T8^NxCkE6*K5#{P#@Ek zn7$Mo=|RP1Kpue)#4%T;)JSYqYQa3%1ic^%91qp;P%nsrP0)gQutIf#(-u=1 z)0IAj3`hkaOvt4mmL)qgC&jcD`rv;7xuw;${*1CRhDq$xE{WS0$EqzqtP<1uGaFqKO- zBw{XeBB@cA8g+U1;mz~u;{25}x9`mDPZ#H}-hFuU{3bppl8CunvLOXi8FMDAMgHYv z&6rCExT)#Y^5W(Fsk=E_a4nq*b2r{&D0(0Cf0?dl{$Fd+v?=TE18hX?*Y`m;XASB$ ztuS}vBl;FR$)4yQ4JU;v5Q|VSc75%H-==}U_|Ha!z ztyvn*>NqQD`X=WV(e_;)*a?_qmW7Zjq}r>-He?>$$gNg2a#__pqHZg$ZN<_Q^8w~d znl1!C0uQ-|)Q1VV6~wmW%w~l4h`?5Cdzb)lBPp$P9DsQ+hgpF6kgjiXVy8IkQd&f8 zF}a1+E;Y!l%lE#)F>4jtE%6Kyhya)YO|Ss75c4(EH*h{=&rkTxAhi+w^*&C>ZAff8 zOl(HS8U((E_c2X(3BJwJ1)TeUbKhp^F2Tn%T@CLW1b#-xc9__Z*b;IB5HsW_GO2ck z#`I-_uKdoiw&+NcmRvIXLZ_RwY|hMPOzm6t{1p=`7+Or>2c-5RnduslaR|gb^#wzF z&%{DXUk886&~MXrA@~sdHf?vx(AU9-l>YrK=~I7LaS0F_W`dA$$bgiD!jI@n#8UnQ zN$4=<_%`D)XMDw$4S*g?11zSn0Ru}pBm=wu=NZ6&)Dm(V@zDTZFtmuJzv~4<1N?}O hmXP21Ot~GDe*j?-_BvveAj<#%002ovPDHLkV1f*Q3S0mH diff --git a/bindings/python/samples/hellosfml.py b/bindings/python/samples/hellosfml.py deleted file mode 100644 index d52c99c5..00000000 --- a/bindings/python/samples/hellosfml.py +++ /dev/null @@ -1,98 +0,0 @@ -# coding=utf-8 -from PySFML import sf -import random - -# Simple class for an apple. -class Apple: - sprite = None - speed = (2, 2) - rotationstep = 1 - - def __init__( self, image ): - self.sprite = sf.Sprite( image ) - self.sprite.SetOrigin( image.GetWidth() / 2, image.GetHeight() / 2 ) - -# Set resolution and create the window. -Resolution = (800, 600) - -wnd = sf.RenderWindow( sf.VideoMode( Resolution[0], Resolution[1], 32 ), "Hello SFML!" ) -wnd.UseVerticalSync( True ) - -# Load a fancy font. -cheese = sf.Font() -cheese.LoadFromFile( "data/cheeseburger.ttf" ) - -# Create a text. -text = sf.Text( u"Hello SFML from Python!", cheese, 50 ) -text.SetOrigin( text.GetRect().GetSize()[0] / 2, text.GetRect().GetSize()[1] / 2 ) -text.SetPosition( 400, 300 ) -text.SetColor( sf.Color( 0, 100, 0, 100 ) ) - -# Create a text for FPS display. -fpstext = sf.Text( u"FPS: --", cheese ) -fpstext.SetColor( sf.Color( 0, 0, 0 ) ) -currentfps = 0 -fpsclock = sf.Clock() - -# Load apple image from file. -appleimage = sf.Image() -appleimage.LoadFromFile( "data/apple.png" ) - -# Create some apples with random position, speed, rotation and color. -apples = [Apple( appleimage ) for num in range( 0, 100 )] -for apple in apples: - apple.sprite.SetOrigin( appleimage.GetWidth() / 2, appleimage.GetHeight() / 2 ) - apple.sprite.SetPosition( - random.randint( apple.sprite.GetOrigin()[0], Resolution[0] - apple.sprite.GetOrigin()[0] ), - random.randint( apple.sprite.GetOrigin()[1], Resolution[1] - apple.sprite.GetOrigin()[1] ) - ) - apple.sprite.SetColor( sf.Color( random.randint( 100, 255 ), random.randint( 100, 255 ), random.randint( 100, 255 ) ) ) - - randx = random.randint( -3, 3 ) - randy = random.randint( -3, 3 ) - apple.speed = (1 if randx == 0 else randx, 1 if randy == 0 else randy) - - apple.rotationstep = random.uniform( 1.0, 20.0 ) - 10.0 - -event = sf.Event() - -# Main loop. -while wnd.IsOpened(): - # Fetch all pending events and process them. - while wnd.GetEvent( event ): - # Quit when window has been closed or Escape has been pressed. - if event.Type == sf.Event.Closed: - wnd.Close() - elif event.Type == sf.Event.KeyPressed and event.Key.Code == sf.Key.Escape: - wnd.Close() - - # Clear window to white color. - wnd.Clear( sf.Color( 255, 255, 255 ) ) - - # Draw all apples and texts. - for apple in apples: - wnd.Draw( apple.sprite ) - - wnd.Draw( text ) - wnd.Draw( fpstext ) - - wnd.Display() # Display everything. - - # Count FPS. - currentfps += 1 - if fpsclock.GetElapsedTime() >= 1.0: - fpsclock.Reset() - fpstext.SetString( u"FPS: " + unicode( currentfps ) ) - currentfps = 0 - - # Update apples (for the "bounce effect"). - for apple in apples: - apple.sprite.Move( apple.speed[0], apple.speed[1] ) - apple.sprite.Rotate( apple.rotationstep ) - - realpos = (apple.sprite.GetPosition()[0] - apple.sprite.GetOrigin()[0], apple.sprite.GetPosition()[1] - apple.sprite.GetOrigin()[1]) - if (apple.speed[0] > 0 and realpos[0] >= Resolution[0] - appleimage.GetWidth()) or (apple.speed[0] < 0 and realpos[0] <= 0): - apple.speed = (apple.speed[0] * -1, apple.speed[1]) - - if (apple.speed[1] > 0 and realpos[1] >= Resolution[1] - appleimage.GetWidth()) or (apple.speed[1] < 0 and realpos[1] <= 0): - apple.speed = (apple.speed[0], apple.speed[1] * -1) diff --git a/bindings/python/samples/opengl.py b/bindings/python/samples/opengl.py deleted file mode 100644 index 93ce04fe..00000000 --- a/bindings/python/samples/opengl.py +++ /dev/null @@ -1,165 +0,0 @@ -#!/usr/bin/python - -from PySFML import sf - -from OpenGL.GL import * -from OpenGL.GLUT import * -from OpenGL.GLU import * - - -def main(): - - # Create main window - App = sf.RenderWindow(sf.VideoMode(800, 600), "SFML OpenGL") - App.SetActive() - - # Create a sprite for the background - BackgroundImage = sf.Image() - if not BackgroundImage.LoadFromFile("../../samples/bin/datas/opengl/background.jpg"): - return - Background = sf.Sprite(BackgroundImage) - - # Load an OpenGL texture. - # We could directly use a sf.Image as an OpenGL texture (with its Bind() member function), - # but here we want more control on it (generate mipmaps, ...) so we create a new one - - Image = sf.Image() - if not Image.LoadFromFile("../../samples/bin/datas/opengl/texture.jpg"): - return - # The next line is a bit different from the C++ version - Texture = glGenTextures(1) # instead of glGenTextures(1, &Texture); - glBindTexture(GL_TEXTURE_2D, Texture) - # It is almost the same line there, except in C++, the last argument was Image.GetPixelsPtr(). - # In python, GetPixels simply returns a string. - gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, Image.GetWidth(), Image.GetHeight(), GL_RGBA, GL_UNSIGNED_BYTE, Image.GetPixels()) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR) - - - # Enable Z-buffer read and write - glEnable(GL_DEPTH_TEST) - glDepthMask(GL_TRUE) - glClearDepth(1.) - - # Setup a perspective projection - glMatrixMode(GL_PROJECTION) - glLoadIdentity() - gluPerspective(90., 1., 1., 500.) - - # Bind our texture - glEnable(GL_TEXTURE_2D) - glBindTexture(GL_TEXTURE_2D, Texture) - glColor4f(1., 1., 1., 1.) - - # Create a clock for measuring the time elapsed - Clock = sf.Clock() - - # Start game loop - while App.IsOpened(): - # Process events - Event = sf.Event() - while App.GetEvent(Event): - # Close window : exit - if Event.Type == sf.Event.Closed: - App.Close() - - # Escape key : exit - if (Event.Type == sf.Event.KeyPressed) and (Event.Key.Code == sf.Key.Escape): - App.Close() - - # Adjust the viewport when the window is resized - if Event.Type == sf.Event.Resized: - glViewport(0, 0, Event.Size.Width, Event.Size.Height) - - # Draw background - App.Draw(Background) - - # Active window to be able to perform OpenGL commands. - App.SetActive() - - # Clear depth buffer - glClear(GL_DEPTH_BUFFER_BIT) - - # Apply some transformations - glMatrixMode(GL_MODELVIEW) - glLoadIdentity() - glTranslatef(0, 0, -200) - glRotatef(Clock.GetElapsedTime() * 50, 1, 0, 0) - glRotatef(Clock.GetElapsedTime() * 30, 0, 1, 0) - glRotatef(Clock.GetElapsedTime() * 90, 0, 0, 1) - - # Draw a cube - glBegin(GL_QUADS) - - glTexCoord2f(0, 0) - glVertex3f(-50., -50., -50.) - glTexCoord2f(0, 1) - glVertex3f(-50., 50., -50.) - glTexCoord2f(1, 1) - glVertex3f( 50., 50., -50.) - glTexCoord2f(1, 0) - glVertex3f( 50., -50., -50.) - - glTexCoord2f(0, 0) - glVertex3f(-50., -50., 50.) - glTexCoord2f(0, 1) - glVertex3f(-50., 50., 50.) - glTexCoord2f(1, 1) - glVertex3f( 50., 50., 50.) - glTexCoord2f(1, 0) - glVertex3f( 50., -50., 50.) - - glTexCoord2f(0, 0) - glVertex3f(-50., -50., -50.) - glTexCoord2f(0, 1) - glVertex3f(-50., 50., -50.) - glTexCoord2f(1, 1) - glVertex3f(-50., 50., 50.) - glTexCoord2f(1, 0) - glVertex3f(-50., -50., 50.) - - glTexCoord2f(0, 0) - glVertex3f(50., -50., -50.) - glTexCoord2f(0, 1) - glVertex3f(50., 50., -50.) - glTexCoord2f(1, 1) - glVertex3f(50., 50., 50.) - glTexCoord2f(1, 0) - glVertex3f(50., -50., 50.) - - glTexCoord2f(0, 1) - glVertex3f(-50., -50., 50.) - glTexCoord2f(0, 0) - glVertex3f(-50., -50., -50.) - glTexCoord2f(1, 0) - glVertex3f( 50., -50., -50.) - glTexCoord2f(1, 1) - glVertex3f( 50., -50., 50.) - - glTexCoord2f(0, 1) - glVertex3f(-50., 50., 50.) - glTexCoord2f(0, 0) - glVertex3f(-50., 50., -50.) - glTexCoord2f(1, 0) - glVertex3f( 50., 50., -50.) - glTexCoord2f(1, 1) - glVertex3f( 50., 50., 50.) - - glEnd() - - # Draw some text on top of our OpenGL object - Text = sf.Text("This is a rotating cube") - Text.SetPosition(230., 300.) - Text.SetColor(sf.Color(128, 0, 128)) - App.Draw(Text) - - # Finally, display the rendered frame on screen - App.Display() - - # Don't forget to destroy our texture - # In C++, the call to this function was a bit different - glDeleteTextures(Texture) # instead of glDeleteTextures(1, &Texture); - - return -main() - diff --git a/bindings/python/samples/sound.py b/bindings/python/samples/sound.py deleted file mode 100644 index 8d91de68..00000000 --- a/bindings/python/samples/sound.py +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/python - -# You can notice that here we use PySFML.sf instead of just PySFML -# Therefore it won't be needed to put sf. in front of SFML classes - -from PySFML import sf - - -def Main(): - Buffer = sf.SoundBuffer() - if not Buffer.LoadFromFile("data/fart.wav"): # Loads the sound - return - Fart = sf.Sound(Buffer, False) - - WindowWidth, WindowHeight = 640, 480 - App = sf.RenderWindow(sf.VideoMode(WindowWidth,WindowHeight,32), "Sound with PySFML", sf.Style.Close, sf.ContextSettings(24,8,0)) - App.SetFramerateLimit(30) - - EventHandler = sf.Event() - InputHandler = App.GetInput() - - Text = sf.Text("Turn the sound on.\nClick anywhere on the screen.\nMove the mouse. Click again.\nTry clicking in the corners.") - Text.SetX(30.) - Text.SetY(20.) - Text.SetColor(sf.Color(150, 100, 10, 255)) - - while App.IsOpened(): # Main loop - while App.GetEvent(EventHandler): # Event Handler - if EventHandler.Type == sf.Event.Closed: - App.Close() - if EventHandler.Type == sf.Event.KeyPressed and EventHandler.Key.Code == sf.Key.Escape: - App.Close() - if EventHandler.Type == sf.Event.MouseButtonPressed and EventHandler.MouseButton.Button == sf.Mouse.Left: - Fart.SetPitch(1.5 - 1.*InputHandler.GetMouseY()/WindowHeight) - Fart.SetPosition( 1.*(InputHandler.GetMouseX() - WindowWidth/2)/(WindowWidth/20), 2., -2.) - Fart.Play() - App.Draw(Text) - App.Display() - App.Clear(sf.Color.Black) - - -Main() - diff --git a/bindings/python/samples/sound_capture.py b/bindings/python/samples/sound_capture.py deleted file mode 100644 index 9a496593..00000000 --- a/bindings/python/samples/sound_capture.py +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env python - -from PySFML import sf - -def Main(): - # Check that the device can capture audio - if sf.SoundRecorder.IsAvailable() == False: - print "Sorry, audio capture is not supported by your system" - return - - # Choose the sample rate - SampleRate = 0 - SampleRate = int(raw_input("Please choose the sample rate for sound capture (44100 is CD quality) : ")) - - # Wait for user input... - print "Press enter to start recording audio" - raw_input() - - # Here we'll use an integrated custom recorder, which saves the captured data into a sfSoundBuffer - Recorder = sf.SoundBufferRecorder() - - # Audio capture is done in a separate thread, so we can block the main thread while it is capturing - Recorder.Start(SampleRate) - print "Recording... press enter to stop" - raw_input() - Recorder.Stop() - - # Get the buffer containing the captured data - Buffer = Recorder.GetBuffer() - - # Display captured sound informations - print "Sound information :" - print " " + str(Buffer.GetDuration()) + " seconds" - print " " + str(Buffer.GetSampleRate()) + " samples / seconds" - print " " + str(Buffer.GetChannelsCount()) + " channels" - - # Choose what to do with the recorded sound data - Choice = str(raw_input("What do you want to do with captured sound (p = play, s = save) ? ")) - - if Choice == 's': - # Choose the filename - Filename = str(raw_input("Choose the file to create : ")) - - # Save the buffer - Buffer.SaveToFile(Filename); - else: - # Create a sound instance and play it - Sound = sf.Sound(Buffer) - Sound.Play() - - # Wait until finished - while Sound.GetStatus() == sf.Sound.Playing: - # Display the playing position - I don't know how to do this in python - # std::cout << "\rPlaying... " << std::fixed << std::setprecision(2) << Sound.GetPlayingOffset() << " sec"; - - # Leave some CPU time for other threads - sf.Sleep(0.1) - - # Finished ! - print "Done !" - - # Wait until the user presses 'enter' key - print "Press enter to exit..." - raw_input() - - return - -Main() diff --git a/bindings/python/samples/sound_capture_py3.py b/bindings/python/samples/sound_capture_py3.py deleted file mode 100644 index 2f2053da..00000000 --- a/bindings/python/samples/sound_capture_py3.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python - -from PySFML import sf - -def Main(): - # Check that the device can capture audio - if sf.SoundRecorder.CanCapture() == False: - print("Sorry, audio capture is not supported by your system") - return - - # Choose the sample rate - SampleRate = int(input("Please choose the sample rate for sound capture (44100 is CD quality) : ")) - - # Wait for user input... - print("Press enter to start recording audio") - input() - - # Here we'll use an integrated custom recorder, which saves the captured data into a sfSoundBuffer - Recorder = sf.SoundBufferRecorder() - - # Audio capture is done in a separate thread, so we can block the main thread while it is capturing - Recorder.Start(SampleRate) - print("Recording... press enter to stop") - input() - Recorder.Stop() - - # Get the buffer containing the captured data - Buffer = Recorder.GetBuffer() - - # Display captured sound informations - print("Sound information :") - print(" " + str(Buffer.GetDuration()) + " seconds") - print(" " + str(Buffer.GetSampleRate()) + " samples / seconds") - print(" " + str(Buffer.GetChannelsCount()) + " channels") - - # Choose what to do with the recorded sound data - Choice = str(input("What do you want to do with captured sound (p = play, s = save) ? ")) - - if Choice == 's': - # Choose the filename - Filename = str(input("Choose the file to create : ")) - - # Save the buffer - Buffer.SaveToFile(Filename); - else: - # Create a sound instance and play it - Sound = sf.Sound(Buffer) - Sound.Play() - - # Wait until finished - while Sound.GetStatus() == sf.Sound.Playing: - # Display the playing position - I don't know how to do this in python - # std::cout << "\rPlaying... " << std::fixed << std::setprecision(2) << Sound.GetPlayingOffset() << " sec"; - - # Leave some CPU time for other threads - sf.Sleep(0.1) - - # Finished ! - print("Done !") - - # Wait until the user presses 'enter' key - print("Press enter to exit...") - input() - - return - -Main() diff --git a/bindings/python/samples/sound_stream.py b/bindings/python/samples/sound_stream.py deleted file mode 100755 index a4e7a470..00000000 --- a/bindings/python/samples/sound_stream.py +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/python - -from PySFML import sf - -class MyCustomStream(sf.SoundStream): - - def Open(self, Filename): - # Load the sound data into a sound buffer - self.SoundData = sf.SoundBuffer() - if not self.SoundData.LoadFromFile(Filename): - return False - # Initialize the stream with the sound parameters - self.Initialize(self.SoundData.GetChannelsCount(), self.SoundData.GetSampleRate()) - # Copy the audio samples into our internal array - self.myBuffer = self.SoundData.GetSamples() - return True - - def OnStart(self): - self.myOffset = 0 - self.myBufferSize = 80000 - return True - - def OnGetData(self): - # Check if there is enough data to stream - if self.myOffset > len(self.myBuffer): - # Returning something else than a string means that we want to stop playing the stream - return "" - # Data contains the string of samples we will return - if self.myOffset + self.myBufferSize >= len(self.myBuffer): - print "End of audio data reached" - Data = self.myBuffer[self.myOffset:] - else: - Data = self.myBuffer[self.myOffset:self.myOffset+self.myBufferSize] - # Update the offset - self.myOffset = self.myBufferSize + self.myOffset - return Data - -def Main(): - Stream = MyCustomStream() - Stream.Open("./data/fart.wav") - Stream.Play() - print "Playing 5 seconds of audio data..." - sf.Sleep(5) - Stream.Stop() - print "Press enter to exit..." - raw_input() - -Main() - diff --git a/bindings/python/samples/sound_stream_py3.py b/bindings/python/samples/sound_stream_py3.py deleted file mode 100755 index bd1a73f8..00000000 --- a/bindings/python/samples/sound_stream_py3.py +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/python - -from PySFML import sf - -class MyCustomStream(sf.SoundStream): - - def Open(self, Filename): - # Load the sound data into a sound buffer - self.SoundData = sf.SoundBuffer() - if not self.SoundData.LoadFromFile(Filename): - return False - # Initialize the stream with the sound parameters - self.Initialize(self.SoundData.GetChannelsCount(), self.SoundData.GetSampleRate()) - # Copy the audio samples into our internal array - self.myBuffer = self.SoundData.GetSamples() - return True - - def OnStart(self): - self.myOffset = 0 - self.myBufferSize = 80000 - return True - - def OnGetData(self): - # Check if there is enough data to stream - if self.myOffset > len(self.myBuffer): - # Returning something else than a string means that we want to stop playing the stream - return "" - # Data contains the string of samples we will return - if self.myOffset + self.myBufferSize >= len(self.myBuffer): - print("End of audio data reached") - Data = self.myBuffer[self.myOffset:] - else: - Data = self.myBuffer[self.myOffset:self.myOffset+self.myBufferSize] - # Update the offset - self.myOffset = self.myBufferSize + self.myOffset - return Data - -def Main(): - Stream = MyCustomStream() - Stream.Open("./data/fart.wav") - Stream.Play() - print("Playing 5 seconds of audio data...") - sf.Sleep(5) - Stream.Stop() - print("Press enter to exit...") - input() - -Main() - diff --git a/bindings/python/samples/worm.py b/bindings/python/samples/worm.py deleted file mode 100644 index 49bb1085..00000000 --- a/bindings/python/samples/worm.py +++ /dev/null @@ -1,272 +0,0 @@ -#!/usr/bin/python - -from PySFML import sf -import math -import random - -class Menu: - def __init__(self, screen_width, screen_height): - self.selection = 0 - text_color = sf.Color(220, 220, 20, 255) - self.spacing = screen_height/7 - - self.title = sf.Text("PyWorm!") - self.title.SetColor(text_color) - self.title.SetPosition(screen_width/2-80., self.spacing) - - levels = ["Very Easy", "Easy", "Medium", "Hard"] - x_align = [-80., -50., -70., -50.] - self.strings = [] - for i in range(0, 4): - string = sf.Text(levels[i]) - string.SetColor(text_color) - string.SetPosition(screen_width/2+x_align[i], (2+i)*self.spacing+20) - self.strings.append(string) - - self.rectangle = sf.Shape.Rectangle(0, 0, screen_width, 40, sf.Color(50, 50, 10)) - - def next_frame(self, win): - self.rectangle.SetY(self.spacing*(2 + self.selection)+20) - win.Draw(self.rectangle) - win.Draw(self.title) - win.Draw(self.strings) - - def key_up(self, pressed): - if pressed: - self.selection = (self.selection - 1) % 4 - def key_down(self, pressed): - if pressed: - self.selection = (self.selection + 1) % 4 - - - -class Apple(sf.Sprite): - def __init__(self): - apple_img = sf.Image() # Apple's image - if not apple_img.LoadFromFile("./data/apple.png"): - pass - # print "Could not load data/apple.png" - sf.Sprite.__init__(self, apple_img) - self.SetOrigin(apple_img.GetWidth()/2, apple_img.GetHeight()/2) - self.size = apple_img.GetWidth() - - def random_move(self, arena): - self.SetPosition( \ - random.randrange(arena.arena_left+arena.border, arena.arena_right-arena.border), \ - random.randrange(arena.arena_top+arena.border, arena.arena_bottom-arena.border) \ - ) - - -class Arena(dict): - shrink_value, border, arena_top = 20, 30, 20 - def __init__(self, window_width, window_height): - self.window_width = window_width - self.arena_bottom, self.exit_left, self.exit_right = window_height-80, window_width/2 - 50, window_width/2 + 50 - self['level_str'] = sf.Text() - self['level_str'].SetColor(sf.Color.White) - self['level_str'].SetPosition(60., window_height-60) - self['score_str'] = sf.Text() - self['score_str'].SetColor(sf.Color.White) - self['score_str'].SetPosition(260., window_height-60) - self.exit_rect = sf.Shape.Rectangle(self.exit_left, 0, self.exit_right, self.arena_top, sf.Color.Black) - self.reset() - self.update_arena_rect() - - def update_arena_rect(self): - self['arena_rect'] = sf.Shape.Rectangle(self.arena_left, self.arena_top, self.arena_right, self.arena_bottom, sf.Color.Black) - - def reset(self): - self.level, self.score, self.arena_left, self.arena_right = 1, 0, self.shrink_value, self.window_width-self.shrink_value - self.update_arena_rect() - self['level_str'].SetString("Level: 1") - self['score_str'].SetString("Score: 0") - - def update_score(self): - self.score += 1 - self['score_str'].SetString("Score: " + str(self.score)) - - def next_level(self): - self.level += 1 - self['level_str'].SetString("Level: " + str(self.level)) - self.arena_left += self.shrink_value - self.arena_right -= self.shrink_value - self.update_arena_rect() - self.score += 4 - self.update_score() - -class Part(sf.Sprite): - def __init__(self, rond, x, y): - sf.Sprite.__init__(self, rond) - self.SetOrigin(rond.GetWidth()/2, rond.GetHeight()/2) - self.SetPosition(x, y) - -class Worm(list): - parts_spacing, turn_step, part_size, start_x, start_y, required_length, grow_length = 3, 0.15, 6.0, 50., 50., 300, 20 - - def __init__(self, difficulty): - self.parts_per_frame = 1 + difficulty - self.angle = 0 - self.direction = 0 # 0, 1 or -1 according to the key pressed - self.rond = sf.Image() - self.level_completed = False - if not self.rond.LoadFromFile("./data/rond2.png"): - pass - # print "Could not load data/rond2.png" - - def reset(self, arena): - self.targeted_length, self.angle, self.direction = 30, 0, 0 - self[:] = [Part(self.rond, arena.arena_left+self.start_x, arena.arena_top+self.start_y)] - - def left(self, pressed): - if pressed: - self.direction = -1 - elif self.direction == -1: - self.direction = 0 - def right(self, pressed): - if pressed: - self.direction = 1 - elif self.direction == 1: - self.direction = 0 - def restart(self, arena): - if self.targeted_length == 0 and not self.level_completed: - arena.reset() - self.reset(arena) - return True - else: - return False - - def crash(self): - self.targeted_length = 0 - - def move(self, arena, apple): - head_x, head_y = -1, -1 - if self.is_running(): # Create new parts and check collisions if the worm hasn't crashed yet - for i in range(self.parts_per_frame): # We create PartsPerFrame Worm's parts - self.angle += self.direction*self.turn_step - head_x, head_y = self[-1].GetPosition() - head_x += self.parts_spacing*math.cos(self.angle) - head_y += self.parts_spacing*math.sin(self.angle) - if self.is_running() and self.targeted_length <= self.required_length: # let's check if the worm ate the apple - if math.hypot(apple.GetPosition()[0] - head_x, apple.GetPosition()[1] - head_y) < apple.size/2 + self.part_size/2: # Yes it did - arena.update_score() - self.targeted_length += self.grow_length # The worm gets longer - apple.random_move(arena) - if head_xarena.arena_right-self.part_size/2 or head_yarena.arena_bottom-self.part_size/2: # Crash into a wall - if len(self) > self.required_length: - if head_yarena.exit_right-self.part_size/2: # Crash into the exit walls - self.crash() - elif head_y < 0: - self.level_completed = True - self.targeted_length = 0 - else: - self.crash() - elif self.is_running(): - self.crash() - if self.is_running(): - self.append(Part(self.rond, head_x, head_y)) - if len(self) > self.targeted_length: - if len(self) - self.targeted_length >= self.parts_per_frame: - del self[0:self.parts_per_frame] - else: - del self[0:len(self) - self.targeted_length] - - if (head_x, head_y) == (-1, -1) and len(self) > 0: - head_x, head_y = self[-1].GetPosition() - - if len(self) > self.part_size/self.parts_spacing + 1: - for i in range(len(self)): - if i < len(self) - self.part_size/self.parts_spacing - 1: - test_x, test_y = self[i].GetPosition() - if math.hypot(head_x-test_x, head_y-test_y) < self.part_size and self.is_running(): # Check for collision - self.crash() - - if len(self) == 0: - if self.level_completed: - self.level_completed = False - arena.next_level() - self.reset(arena) - - def is_running(self): - return (self.targeted_length > 0) and not self.level_completed - def draw_exit(self): - return self.targeted_length > self.required_length or self.level_completed - -class Game: - def __init__(self, difficulty, window_width, window_height): - self.arena = Arena(window_width, window_height) - self.worm = Worm(difficulty) - self.worm.reset(self.arena) - self.apple = Apple() - self.apple.random_move(self.arena) - self.pause = False - - def enter(self, pressed): - if pressed: - if not self.worm.restart(self.arena): - self.pause = not self.pause - - def next_frame(self, win): - win.Draw(self.arena.values()) - if not self.pause: - self.worm.move(self.arena, self.apple) - if self.worm.draw_exit(): - win.Draw(self.arena.exit_rect) - elif self.worm.is_running(): - win.Draw(self.apple) - win.Draw(self.worm) - - -class Main: - # Entry Point - def __init__(self): - # Initialize the window - self.win = sf.RenderWindow(sf.VideoMode(800, 600,32), "PyWorm", sf.Style.Close) # Creates the window - self.win.EnableKeyRepeat(False) - background_color = sf.Color(100, 100, 0, 255) - self.win.SetFramerateLimit(30) - event = sf.Event() - self.keys = {} # keys to watch - self.menu_begin() - - # Boucle principale - while self.win.IsOpened(): - while self.win.GetEvent(event): # Event Handler - if event.Type == sf.Event.Closed: - self.win.Close() - elif event.Type == sf.Event.KeyPressed or event.Type == sf.Event.KeyReleased: - if event.Key.Code in self.keys: - self.keys[event.Key.Code](event.Type == sf.Event.KeyPressed) - self.win.Display() - self.win.Clear(background_color) - self.next_frame(self.win) - - # Menu - def menu_begin(self): - self.menu = Menu(self.win.GetWidth(), self.win.GetHeight()) - self.keys = {sf.Key.Escape:self.close_window, sf.Key.Up:self.menu.key_up, sf.Key.Down:self.menu.key_down, sf.Key.Return:self.menu_end} - self.next_frame = self.menu.next_frame - - def close_window(self, pressed): - if pressed: - self.win.Close() - - def menu_end(self, pressed): - if pressed: - selection = self.menu.selection - del self.menu - self.game_begin(selection) - - # Game - def game_begin(self, selection): - self.game = Game(selection, self.win.GetWidth(), self.win.GetHeight()) - self.keys = {sf.Key.Left:self.game.worm.left, sf.Key.Right:self.game.worm.right, sf.Key.Return:self.game.enter, sf.Key.Escape:self.game_end} - self.next_frame = self.game.next_frame - - def game_end(self, pressed): - if pressed: - del self.game - self.menu_begin() - -Main() - diff --git a/bindings/python/scripts/footer.htm b/bindings/python/scripts/footer.htm deleted file mode 100644 index 77030f7c..00000000 --- a/bindings/python/scripts/footer.htm +++ /dev/null @@ -1,7 +0,0 @@ - -

- - - diff --git a/bindings/python/scripts/gen_doc.py b/bindings/python/scripts/gen_doc.py deleted file mode 100755 index 99e4721e..00000000 --- a/bindings/python/scripts/gen_doc.py +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/python -# coding=UTF-8 - -from PySFML import sf - -# Amélioration à faire : trouver les méthodes héritées, et de quelle classe - -def function_str(function, class_name=None): - string = '' - name = function.__name__ - doc = function.__doc__ - if not doc.startswith(name+'('): - string += name+"(...)"+'\n' - string += doc+'\n' - strings = string.split('\n') - strings[0] = '
'+strings[0]+'
\n
' - string = strings[0] - for s in strings[1:-1]: - string += s + '
' - string += strings[-1] - inherited = '' - if class_name != None: - try: - base_class_name = function.__objclass__.__name__ - if base_class_name != class_name: - inherited = '
Inherited
\n' - except AttributeError: - pass - return string.replace('\t', '    ')+'
\n'+inherited - -class FilesManager: - def __init__(self): - self.files = {} - f = open("header.htm") - self.header = f.read() - f.close() - f = open("footer.htm") - self.footer = f.read() - f.close() - - def add(self, filename, string): - if not self.files.has_key(filename): - self.files[filename] = open('../doc/' + filename + '.html', 'w') - self.files[filename].write(self.header.replace('TITLE', filename)) - self.files[filename].write(string) - - def __del__(self): - for filename in self.files: - self.files[filename].write(self.footer) - self.files[filename].close() - - -def Main(): - - fm = FilesManager() - - fm.add('index', '

PySFML index

\n') - - fm.add('index', '

Classes

\n') - - module_methods = "" - module_constants = "" - - for m in dir(sf): - if not m.startswith('__'): - if m == 'Event': - attr = sf.Event() - else: - attr = getattr(sf, m) - if type(attr) == str: - module_constants += '
'+m+'
\n
"'+attr+'"
\n' - elif str(type(attr)) == "" or str(type(attr)) == "": - module_methods += function_str(attr) - else: - fm.add('index', '
'+m+'
\n') - info = {'Attributes':'', 'Constants':'', 'Methods':'', 'Static methods':''} - members = "" - constants = "" - static_methods = "" - methods = "" - for n in dir(attr): - if not n.startswith('__'): - attr2 = getattr(attr, n) - if str(type(attr2)) == "": # member - info['Attributes'] += '
'+n+'
\n
'+attr2.__doc__+'
\n' - elif type(attr2) == long: - info['Attributes'] += '
'+n+'
\n' - elif type(attr2) == int or type(attr2) == sf.Color: # int or color (constant) - info['Constants'] += '
'+n+'
\n' - elif str(type(attr2)) == "": # static method - info['Static methods'] += function_str(attr2, m) - elif str(type(attr2)) == "": # method - info['Methods'] += function_str(attr2, m) - elif str(type(attr2)).startswith("\n
' + attr2.__doc__+'
\n' - for o in dir(attr2): - if not o.startswith('__'): - attr3 = getattr(attr2, o) - info['Attributes'] += '
> ' + o + '
\n' - else: - print "Warning : unknown type for " + n + " " + str(type(attr2)) - fm.add(m, '

sf.'+m+' Class Reference

\n') - fm.add(m, '
'+attr.__doc__.replace('\n', '
\n').replace('\t', '    ')+'
\n') - if m != 'Event': - base = attr.__base__.__name__ - if base != 'object': - fm.add(m, '
Base class: sf.'+base+'.
\n') - for t in info: - if info[t] != '': - fm.add(m, '

'+t+'

\n'+info[t]+'
\n') - fm.add(m, '
\n
\n') - - fm.add('index', '

Module methods

\n' + module_methods) - - fm.add('index', '

Module constants

\n' + module_constants) - -Main() - diff --git a/bindings/python/scripts/header.htm b/bindings/python/scripts/header.htm deleted file mode 100644 index f335b428..00000000 --- a/bindings/python/scripts/header.htm +++ /dev/null @@ -1,11 +0,0 @@ - - - - PySFML - Python binding for SFML (Simple and Fast Multimedia Library) - TITLE - - - - - diff --git a/bindings/python/setup.py b/bindings/python/setup.py deleted file mode 100644 index a263fbc2..00000000 --- a/bindings/python/setup.py +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env python -# coding=UTF-8 - -from distutils.core import setup, Extension - -setup(name='PySFML', - version='1.6', - description='Python binding for SFML (Simple and Fast Multimedia Library)', - author='Rémi Koenig', - author_email='remi.k2620@gmail.com', - url='http://www.sfml-dev.org/', - license='zlib/png', - ext_modules=[ Extension('PySFML.sf', - ['src/Clock.cpp', 'src/Color.cpp', 'src/Drawable.cpp', - 'src/Event.cpp', 'src/Image.cpp', 'src/Input.cpp', 'src/Key.cpp', 'src/main.cpp', 'src/Music.cpp', - 'src/Shader.cpp', 'src/Rect.cpp', 'src/RenderWindow.cpp', 'src/Sleep.cpp', - 'src/Sprite.cpp', 'src/Text.cpp', 'src/VideoMode.cpp', 'src/View.cpp', 'src/Window.cpp', - 'src/Joy.cpp', 'src/Mouse.cpp', 'src/WindowStyle.cpp', 'src/Blend.cpp', 'src/Sound.cpp', - 'src/SoundBuffer.cpp', 'src/Listener.cpp', 'src/SoundRecorder.cpp', 'src/SoundBufferRecorder.cpp', - 'src/SoundStream.cpp', 'src/Font.cpp', 'src/Glyph.cpp', 'src/Shape.cpp', 'src/ContextSettings.cpp'], - libraries=['sfml-graphics', 'sfml-window', 'sfml-audio', 'sfml-system'], - library_dirs=['../lib/mingw'], - include_dirs=['../include'] - )], - package_dir = {'PySFML':'PySFML'}, - packages=['PySFML'], - ) diff --git a/bindings/python/src/Blend.cpp b/bindings/python/src/Blend.cpp deleted file mode 100644 index dc43ca5c..00000000 --- a/bindings/python/src/Blend.cpp +++ /dev/null @@ -1,100 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Blend.hpp" - -#include "compat.hpp" - - -static PyObject * -PySfBlend_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfBlend *self; - self = (PySfBlend *)type->tp_alloc(type, 0); - return (PyObject *)self; -} - - -PyTypeObject PySfBlendType = { - head_init - "Blend", /*tp_name*/ - sizeof(PySfBlend), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - 0, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "Enumerate the blending modes for drawable objects.\n\ -Alpha Pixel = Src * a + Dest * (1 - a).\n\ -Add Pixel = Src + Dest.\n\ -Multiply Pixel = Src * Dest.\n\ -None No blending.", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfBlend_new, /* tp_new */ -}; - -void PySfBlend_InitConst() -{ - PyObject *obj; - obj = PyLong_FromLong(sf::Blend::Alpha); - PyDict_SetItemString(PySfBlendType.tp_dict, "Alpha", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Blend::Add); - PyDict_SetItemString(PySfBlendType.tp_dict, "Add", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Blend::Multiply); - PyDict_SetItemString(PySfBlendType.tp_dict, "Multiply", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Blend::None); - PyDict_SetItemString(PySfBlendType.tp_dict, "None", obj); - Py_DECREF(obj); -} - diff --git a/bindings/python/src/Blend.hpp b/bindings/python/src/Blend.hpp deleted file mode 100644 index f6108736..00000000 --- a/bindings/python/src/Blend.hpp +++ /dev/null @@ -1,39 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYBLEND_HPP -#define __PYBLEND_HPP - -#include - -#include - -typedef struct { - PyObject_HEAD -} PySfBlend; - -void -PySfBlend_InitConst(); - -#endif diff --git a/bindings/python/src/Clock.cpp b/bindings/python/src/Clock.cpp deleted file mode 100644 index c6ba6288..00000000 --- a/bindings/python/src/Clock.cpp +++ /dev/null @@ -1,110 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Clock.hpp" - -#include "compat.hpp" - - -static void -PySfClock_dealloc(PySfClock *self) -{ - delete self->obj; - free_object(self); -} - -static PyObject * -PySfClock_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfClock *self; - - self = (PySfClock *)type->tp_alloc(type, 0); - if (self != NULL) - self->obj = new sf::Clock(); - - return (PyObject *)self; -} - - -static PyObject* -PySfClock_GetElapsedTime(PySfClock *self) -{ - return PyFloat_FromDouble(self->obj->GetElapsedTime()); -} - -static PyObject* -PySfClock_Reset(PySfClock *self) -{ - self->obj->Reset(); - Py_RETURN_NONE; -} - -static PyMethodDef PySfClock_methods[] = { - {"GetElapsedTime", (PyCFunction)PySfClock_GetElapsedTime, METH_NOARGS, "GetElapsedTime()\nGet the time elapsed since last reset."}, - {"Reset", (PyCFunction)PySfClock_Reset, METH_NOARGS, "Reset()\nRestart the timer."}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfClockType = { - head_init - "Clock", /*tp_name*/ - sizeof(PySfClock), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfClock_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare (tp_reserved in py3k)*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "sf.Clock is an utility class for manipulating time.", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfClock_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfClock_new, /* tp_new */ -}; - - diff --git a/bindings/python/src/Clock.hpp b/bindings/python/src/Clock.hpp deleted file mode 100644 index d0a32f65..00000000 --- a/bindings/python/src/Clock.hpp +++ /dev/null @@ -1,37 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYCLOCK_HPP -#define __PYCLOCK_HPP - -#include - -#include - -typedef struct { - PyObject_HEAD - sf::Clock *obj; -} PySfClock; - -#endif diff --git a/bindings/python/src/Color.cpp b/bindings/python/src/Color.cpp deleted file mode 100644 index 567a2da9..00000000 --- a/bindings/python/src/Color.cpp +++ /dev/null @@ -1,198 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Color.hpp" - -#include "offsetof.hpp" -#include "compat.hpp" - -static PyMemberDef PySfColor_members[] = { - {(char *)"r", T_UBYTE, offsetof(PySfColor, r), 0, (char *)"Red component."}, - {(char *)"g", T_UBYTE, offsetof(PySfColor, g), 0, (char *)"Green component."}, - {(char *)"b", T_UBYTE, offsetof(PySfColor, b), 0, (char *)"Blue component."}, - {(char *)"a", T_UBYTE, offsetof(PySfColor, a), 0, (char *)"Alpha (transparency) component."}, - {NULL} /* Sentinel */ -}; - - - -static void -PySfColor_dealloc(PySfColor *self) -{ - delete self->obj; - free_object(self); -} - -void -PySfColorUpdate(PySfColor *self) -{ - self->obj->r = self->r; - self->obj->g = self->g; - self->obj->b = self->b; - self->obj->a = self->a; -} - -static PyObject * -PySfColor_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfColor *self; - self = (PySfColor *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->r = 0; - self->g = 0; - self->b = 0; - self->a = 255; - self->obj = new sf::Color(0, 0, 0, 255); - } - return (PyObject *)self; -} - -static int -PySfColor_init(PySfColor *self, PyObject *args, PyObject *kwds) -{ - const char *kwlist[] = {"r", "g", "b", "a", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "BBB|B:Color.__init__", (char **)kwlist, &(self->r), &(self->g), &(self->b), &(self->a))) - return -1; - PySfColorUpdate(self); - return 0; -} - -PyTypeObject PySfColorType = { - head_init - "Color", /*tp_name*/ - sizeof(PySfColor), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfColor_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "sf.Color is an utility class for manipulating 32-bits RGBA colors.", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - PySfColor_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)PySfColor_init, /* tp_init */ - 0, /* tp_alloc */ - PySfColor_new, /* tp_new */ -}; - -PySfColor * -GetNewPySfColor() -{ - return PyObject_New(PySfColor, &PySfColorType); -} - -void -PySfColor_InitConst() -{ - PySfColor *Black, *White, *Red, *Green, *Blue, *Yellow, *Magenta, *Cyan; - Black = GetNewPySfColor(); - Black->obj = (sf::Color *) &(sf::Color::Black); - Black->r = sf::Color::Black.r; - Black->g = sf::Color::Black.g; - Black->b = sf::Color::Black.b; - Black->a = sf::Color::Black.a; - PyDict_SetItemString(PySfColorType.tp_dict, "Black", (PyObject *)Black); - Py_DECREF(Black); - White = GetNewPySfColor(); - White->obj = (sf::Color *) &(sf::Color::White); - White->r = sf::Color::White.r; - White->g = sf::Color::White.g; - White->b = sf::Color::White.b; - White->a = sf::Color::White.a; - PyDict_SetItemString(PySfColorType.tp_dict, "White", (PyObject *)White); - Py_DECREF(White); - Red = GetNewPySfColor(); - Red->obj = (sf::Color *) &(sf::Color::Red); - Red->r = sf::Color::Red.r; - Red->g = sf::Color::Red.g; - Red->b = sf::Color::Red.b; - Red->a = sf::Color::Red.a; - PyDict_SetItemString(PySfColorType.tp_dict, "Red", (PyObject *)Red); - Py_DECREF(Red); - Green = GetNewPySfColor(); - Green->obj = (sf::Color *) &(sf::Color::Green); - Green->r = sf::Color::Green.r; - Green->g = sf::Color::Green.g; - Green->b = sf::Color::Green.b; - Green->a = sf::Color::Green.a; - PyDict_SetItemString(PySfColorType.tp_dict, "Green", (PyObject *)Green); - Py_DECREF(Green); - Blue = GetNewPySfColor(); - Blue->obj = (sf::Color *) &(sf::Color::Blue); - Blue->r = sf::Color::Blue.r; - Blue->g = sf::Color::Blue.g; - Blue->b = sf::Color::Blue.b; - Blue->a = sf::Color::Blue.a; - PyDict_SetItemString(PySfColorType.tp_dict, "Blue", (PyObject *)Blue); - Py_DECREF(Blue); - Yellow = GetNewPySfColor(); - Yellow->obj = (sf::Color *) &(sf::Color::Yellow); - Yellow->r = sf::Color::Yellow.r; - Yellow->g = sf::Color::Yellow.g; - Yellow->b = sf::Color::Yellow.b; - Yellow->a = sf::Color::Yellow.a; - PyDict_SetItemString(PySfColorType.tp_dict, "Yellow", (PyObject *)Yellow); - Py_DECREF(Yellow); - Magenta = GetNewPySfColor(); - Magenta->obj = (sf::Color *) &(sf::Color::Magenta); - Magenta->r = sf::Color::Magenta.r; - Magenta->g = sf::Color::Magenta.g; - Magenta->b = sf::Color::Magenta.b; - Magenta->a = sf::Color::Magenta.a; - PyDict_SetItemString(PySfColorType.tp_dict, "Magenta", (PyObject *)Magenta); - Py_DECREF(Magenta); - Cyan = GetNewPySfColor(); - Cyan->obj = (sf::Color *) &(sf::Color::Cyan); - Cyan->r = sf::Color::Cyan.r; - Cyan->g = sf::Color::Cyan.g; - Cyan->b = sf::Color::Cyan.b; - Cyan->a = sf::Color::Cyan.a; - PyDict_SetItemString(PySfColorType.tp_dict, "Cyan", (PyObject *)Cyan); - Py_DECREF(Cyan); -} - diff --git a/bindings/python/src/Color.hpp b/bindings/python/src/Color.hpp deleted file mode 100644 index d86ed7f4..00000000 --- a/bindings/python/src/Color.hpp +++ /dev/null @@ -1,52 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYCOLOR_HPP -#define __PYCOLOR_HPP - -#include -#include - -#include - - -typedef struct { - PyObject_HEAD - unsigned char r; - unsigned char g; - unsigned char b; - unsigned char a; - sf::Color *obj; -} PySfColor; - -PySfColor * -GetNewPySfColor(); - -void -PySfColorUpdate(PySfColor *self); - -void -PySfColor_InitConst(); - -#endif diff --git a/bindings/python/src/ContextSettings.cpp b/bindings/python/src/ContextSettings.cpp deleted file mode 100644 index 6537858d..00000000 --- a/bindings/python/src/ContextSettings.cpp +++ /dev/null @@ -1,125 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "ContextSettings.hpp" - -#include - -#include "offsetof.hpp" -#include "compat.hpp" - -static PyMemberDef PySfContextSettings_members[] = { - {(char *)"DepthBits", T_UINT, offsetof(PySfContextSettings, DepthBits), 0, (char *)"Depth buffer bits (24 by default)"}, - {(char *)"StencilBits", T_UINT, offsetof(PySfContextSettings, StencilBits), 0, (char *)"Stencil buffer bits (8 by default)"}, - {(char *)"AntialiasingLevel", T_UINT, offsetof(PySfContextSettings, AntialiasingLevel), 0, (char *)"Antialiasing level (0 by default)"}, - {(char *)"MajorVersion", T_UINT, offsetof(PySfContextSettings, MajorVersion), 0, (char *)"Major number of the context version to create. (2 by default)"}, - {(char *)"MinorVersion", T_UINT, offsetof(PySfContextSettings, MinorVersion), 0, (char *)"Minor number of the context version to create. (0 by default)"}, - {NULL} /* Sentinel */ -}; - - -static void -PySfContextSettings_dealloc(PySfContextSettings *self) -{ - delete self->obj; - free_object(self); -} - -void -PySfContextSettingsUpdate(PySfContextSettings *self) -{ - self->obj->DepthBits = self->DepthBits; - self->obj->StencilBits = self->StencilBits; - self->obj->AntialiasingLevel = self->AntialiasingLevel; - self->obj->MajorVersion = self->MajorVersion; - self->obj->MinorVersion = self->MinorVersion; -} - -static PyObject * -PySfContextSettings_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - const char *kwlist[] = {"DepthBits", "StencilBits", "AntialiasingLevel", "MajorVersion", "MinorVersion", NULL}; - PySfContextSettings *self; - self = (PySfContextSettings *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->DepthBits = 24; - self->StencilBits = 8; - self->AntialiasingLevel = 0; - self->MajorVersion = 2; - self->MinorVersion = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|IIIII:ContextSettings.__init__", (char **)kwlist, &(self->DepthBits), &(self->StencilBits), &(self->AntialiasingLevel), &(self->MajorVersion), &(self->MinorVersion))) - return NULL; - self->obj = new sf::ContextSettings(self->DepthBits, self->StencilBits, self->AntialiasingLevel, self->MajorVersion, self->MinorVersion); - } - return (PyObject *)self; -} - -PyTypeObject PySfContextSettingsType = { - head_init - "ContextSettings", /*tp_name*/ - sizeof(PySfContextSettings), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfContextSettings_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "Structure defining the creation settings of windows.", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - PySfContextSettings_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfContextSettings_new, /* tp_new */ -}; - -PySfContextSettings * -GetNewPySfContextSettings() -{ - return PyObject_New(PySfContextSettings, &PySfContextSettingsType); -} - diff --git a/bindings/python/src/ContextSettings.hpp b/bindings/python/src/ContextSettings.hpp deleted file mode 100644 index d8b09a1a..00000000 --- a/bindings/python/src/ContextSettings.hpp +++ /dev/null @@ -1,49 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYWINDOWSETTINGS_HPP -#define __PYWINDOWSETTINGS_HPP - -#include - -#include - - -typedef struct { - PyObject_HEAD - unsigned int DepthBits; - unsigned int StencilBits; - unsigned int AntialiasingLevel; - unsigned int MajorVersion; - unsigned int MinorVersion; - sf::ContextSettings *obj; -} PySfContextSettings; - -void -PySfContextSettingsUpdate(PySfContextSettings *self); - -PySfContextSettings * -GetNewPySfContextSettings(); - -#endif diff --git a/bindings/python/src/Drawable.cpp b/bindings/python/src/Drawable.cpp deleted file mode 100644 index 33b37eeb..00000000 --- a/bindings/python/src/Drawable.cpp +++ /dev/null @@ -1,325 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Drawable.hpp" -#include "Color.hpp" - -#include "compat.hpp" - - -extern PyTypeObject PySfColorType; - - -void CustomDrawable::Render(sf::RenderTarget& Target, sf::RenderQueue& Queue) const -{ - if (RenderFunction) - PyObject_CallFunction(RenderFunction, (char *)"OO", RenderWindow, Queue); - else - { - PyErr_SetString(PyExc_RuntimeError, "Custom drawables must have a render method defined"); - PyErr_Print(); - } -} - -static void -PySfDrawable_dealloc(PySfDrawable *self) -{ - delete self->obj; - free_object(self); -} - -static PyObject * -PySfDrawable_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfDrawable *self; - self = (PySfDrawable *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->IsCustom = true; - self->obj = new CustomDrawable(); - if (PyObject_HasAttrString((PyObject *)self, "Render")) - self->obj->RenderFunction = PyObject_GetAttrString((PyObject *)self, "Render"); - else - self->obj->RenderFunction = NULL; - self->obj->RenderWindow = NULL; - } - return (PyObject *)self; -} - -static PyObject * -PySfDrawable_SetX(PySfDrawable* self, PyObject *args) -{ - self->obj->SetX(PyFloat_AsDouble(args)); - Py_RETURN_NONE; -} -static PyObject * -PySfDrawable_SetY(PySfDrawable* self, PyObject *args) -{ - self->obj->SetY(PyFloat_AsDouble(args)); - Py_RETURN_NONE; -} -static PyObject * -PySfDrawable_SetScale(PySfDrawable* self, PyObject *args) -{ - float ScaleX, ScaleY; - if (!PyArg_ParseTuple(args, "ff:Drawable.SetScale", &ScaleX, &ScaleY) ) - return NULL; - self->obj->SetScale(ScaleX, ScaleY); - Py_RETURN_NONE; -} -static PyObject * -PySfDrawable_SetScaleX(PySfDrawable* self, PyObject *args) -{ - self->obj->SetScaleX(PyFloat_AsDouble(args)); - Py_RETURN_NONE; -} -static PyObject * -PySfDrawable_SetScaleY(PySfDrawable* self, PyObject *args) -{ - self->obj->SetScaleY(PyFloat_AsDouble(args)); - Py_RETURN_NONE; -} - -static PyObject * -PySfDrawable_SetRotation(PySfDrawable* self, PyObject *args) -{ - self->obj->SetRotation(PyFloat_AsDouble(args)); - Py_RETURN_NONE; -} -static PyObject * -PySfDrawable_SetOrigin(PySfDrawable* self, PyObject *args) -{ - float x, y; - if (!PyArg_ParseTuple(args, "ff:Drawable.SetOrigin", &x, &y) ) - return NULL; - self->obj->SetOrigin(x, y); - Py_RETURN_NONE; -} -static PyObject * -PySfDrawable_GetOrigin(PySfDrawable* self) -{ - sf::Vector2f Vect = self->obj->GetOrigin(); - return Py_BuildValue("ff", Vect.x, Vect.y); -} - -static PyObject * -PySfDrawable_SetColor(PySfDrawable* self, PyObject *args) -{ - PySfColor *Color = (PySfColor *)args; - if (!PyObject_TypeCheck(args, &PySfColorType)) - { - PyErr_SetString(PyExc_TypeError, "Drawable.SetColor() Argument is not a sf.Color"); - return NULL; - } - PySfColorUpdate(Color); - self->obj->SetColor(*(Color->obj)); - Py_RETURN_NONE; -} -static PyObject * -PySfDrawable_GetPosition(PySfDrawable* self) -{ - sf::Vector2f Vect = self->obj->GetPosition(); - return Py_BuildValue("ff", Vect.x, Vect.y); -} -static PyObject * -PySfDrawable_GetScale(PySfDrawable* self) -{ - sf::Vector2f Vect = self->obj->GetScale(); - return Py_BuildValue("ff", Vect.x, Vect.y); -} -static PyObject * -PySfDrawable_GetRotation(PySfDrawable* self) -{ - return PyFloat_FromDouble(self->obj->GetRotation()); -} - -static PyObject * -PySfDrawable_GetColor(PySfDrawable* self) -{ - PySfColor *Color; - - Color = GetNewPySfColor(); - Color->obj = new sf::Color( self->obj->GetColor() ); - Color->r = Color->obj->r; - Color->g = Color->obj->g; - Color->b = Color->obj->b; - Color->a = Color->obj->a; - - return (PyObject *)Color; -} -static PyObject * -PySfDrawable_Move(PySfDrawable* self, PyObject *args) -{ - float x, y; - if (!PyArg_ParseTuple(args, "ff:Drawable.Move", &x, &y) ) - return NULL; - self->obj->Move(x, y); - Py_RETURN_NONE; -} -static PyObject * -PySfDrawable_Rotate(PySfDrawable* self, PyObject *args) -{ - self->obj->Rotate(PyFloat_AsDouble(args)); - Py_RETURN_NONE; -} -static PyObject * -PySfDrawable_Scale(PySfDrawable* self, PyObject *args) -{ - float FactorX, FactorY; - if (!PyArg_ParseTuple(args, "ff:Drawable.Scale", &FactorX, &FactorY) ) - return NULL; - self->obj->Scale(FactorX, FactorY); - Py_RETURN_NONE; -} - -static PyObject * -PySfDrawable_SetBlendMode(PySfDrawable* self, PyObject *args) -{ - self->obj->SetBlendMode((sf::Blend::Mode)PyLong_AsUnsignedLong(args)); - Py_RETURN_NONE; -} - -static PyObject * -PySfDrawable_SetPosition(PySfDrawable* self, PyObject *args) -{ - float Left, Top; - if (!PyArg_ParseTuple(args, "ff:Drawable.SetPosition", &Left, &Top) ) - return NULL; - self->obj->SetPosition(Left, Top); - Py_RETURN_NONE; -} - -static PyObject * -PySfDrawable_TransformToLocal(PySfDrawable* self, PyObject *args) -{ - float X, Y; - if (!PyArg_ParseTuple(args, "ff:Drawable.TransformToLocal", &X, &Y) ) - return NULL; - sf::Vector2f result = self->obj->TransformToLocal(sf::Vector2f(X, Y)); - return Py_BuildValue("ff", result.x, result.y); -} - -static PyObject * -PySfDrawable_TransformToGlobal(PySfDrawable* self, PyObject *args) -{ - float X, Y; - if (!PyArg_ParseTuple(args, "ff:Drawable.TransformToGlobal", &X, &Y) ) - return NULL; - sf::Vector2f result = self->obj->TransformToGlobal(sf::Vector2f(X, Y)); - return Py_BuildValue("ff", result.x, result.y); -} - -int PySfDrawable_setattro(PyObject* self, PyObject *attr_name, PyObject *v) -{ -#ifdef IS_PY3K - PyObject *string = PyUnicode_AsUTF8String(attr_name); - if (string == NULL) return NULL; - std::string Name(PyBytes_AsString(string)); -#else - std::string Name(PyString_AsString(attr_name)); -#endif - if (Name == "Render") - { - Py_CLEAR(((PySfDrawable*)self)->obj->RenderFunction); - Py_INCREF(v); - ((PySfDrawable*)self)->obj->RenderFunction = v; - } -#ifdef IS_PY3K - Py_DECREF(string); -#endif - return PyObject_GenericSetAttr(self, attr_name, v); -} - -static PyMethodDef PySfDrawable_methods[] = { - {"TransformToLocal", (PyCFunction)PySfDrawable_TransformToLocal, METH_VARARGS, "TransformToLocal(X, Y)\n\ -Transform a point from global coordinates into local coordinates (ie it applies the inverse of object's origin, translation, rotation and scale to the point). Returns a tuple.\n\ - X : X coordinate of the point to transform\n\ - Y : Y coordinate of the point to transform"}, - {"TransformToGlobal", (PyCFunction)PySfDrawable_TransformToGlobal, METH_VARARGS, "TransformToGlobal(X, Y)\n\ -Transform a point from local coordinates into global coordinates (ie it applies the object's origin, translation, rotation and scale to the point). Returns a tuple.\n\ - X : X coordinate of the point to transform\n\ - Y : Y coordinate of the point to transform"}, - {"SetX", (PyCFunction)PySfDrawable_SetX, METH_O, "SetX(X)\nSet the X position of the object.\n X : New X coordinate"}, - {"SetY", (PyCFunction)PySfDrawable_SetY, METH_O, "SetY(Y)\nSet the Y position of the object.\n Y : New Y coordinate"}, - {"SetScale", (PyCFunction)PySfDrawable_SetScale, METH_VARARGS, "SetScale(ScaleX, ScaleY)\nSet the scale of the object.\n ScaleX : New horizontal scale (must be strictly positive)\n ScaleY : New vertical scale (must be strictly positive)"}, - {"SetScaleX", (PyCFunction)PySfDrawable_SetScaleX, METH_O, "SetScaleX(ScaleX)\nSet the X scale factor of the object.\n ScaleX : New horizontal scale (must be strictly positive)"}, - {"SetScaleY", (PyCFunction)PySfDrawable_SetScaleY, METH_O, "SetScaleY(ScaleY)\nSet the Y scale factor of the object.\n ScaleY : New vertical scale (must be strictly positive)"}, - {"SetRotation", (PyCFunction)PySfDrawable_SetRotation, METH_O, "SetRotation(Rotation)\nSet the orientation of the object.\n Rotation : Angle of rotation, in degrees"}, - {"SetOrigin", (PyCFunction)PySfDrawable_SetOrigin, METH_VARARGS, "SetOrigin(OriginX, OriginY)\nSet the origin of the object, in coordinates relative to the object.\n OriginX : X coordinate of the origin\n OriginY : Y coordinate of the origin"}, - {"GetOrigin", (PyCFunction)PySfDrawable_GetOrigin, METH_NOARGS, "GetOrigin()\nGet the origin of the object, in coordinates relative to the object."}, - {"SetColor", (PyCFunction)PySfDrawable_SetColor, METH_O, "SetColor(Color)\nSet the color of the object.\n Color : New color"}, - {"GetPosition", (PyCFunction)PySfDrawable_GetPosition, METH_NOARGS, "GetPosition()\nGet the position of the object."}, - {"GetScale", (PyCFunction)PySfDrawable_GetScale, METH_NOARGS, "GetScale()\nGet the scale of the object."}, - {"GetRotation", (PyCFunction)PySfDrawable_GetRotation, METH_NOARGS, "GetRotation()\nGet the orientation of the object."}, - {"GetColor", (PyCFunction)PySfDrawable_GetColor, METH_NOARGS, "GetColor()\nGet the color of the object."}, - {"Move", (PyCFunction)PySfDrawable_Move, METH_VARARGS, "Move(OffsetX, OffsetY)\nMove the object.\n OffsetX : X offset\n OffsetY : Y offset "}, - {"Scale", (PyCFunction)PySfDrawable_Scale, METH_VARARGS, "Scale(FactorX, FactorY)\nScale the object.\n FactorX : Scaling factor on X (must be strictly positive)\n FactorY : Scaling factor on Y (must be strictly positive)"}, - {"Rotate", (PyCFunction)PySfDrawable_Rotate, METH_O, "Rotate(Angle)\nRotate the object.\n Angle : Angle of rotation, in degrees"}, - {"SetBlendMode", (PyCFunction)PySfDrawable_SetBlendMode, METH_O, "SetBlendMode(Mode)\nSet the blending mode for the object. The default blend mode is sf.Blend.Alpha\n Mode : New blending mode"}, - {"SetPosition", (PyCFunction)PySfDrawable_SetPosition, METH_VARARGS, "SetPosition(X, Y)\nSet the position of the object.\n X : New X coordinate\n Y : New Y coordinate"}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfDrawableType = { - head_init - "Drawable", /*tp_name*/ - sizeof(PySfDrawable), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfDrawable_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - PySfDrawable_setattro, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "Abstract base class for every object that can be drawn into a render window.", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfDrawable_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfDrawable_new, /* tp_new */ -}; - - diff --git a/bindings/python/src/Drawable.hpp b/bindings/python/src/Drawable.hpp deleted file mode 100644 index 12af4fe6..00000000 --- a/bindings/python/src/Drawable.hpp +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYDRAWABLE_H -#define __PYDRAWABLE_H - -#include - -#include -#include - -#include "RenderWindow.hpp" -#include "RenderQueue.hpp" - -class CustomDrawable : public sf::Drawable -{ -protected : - virtual void Render(sf::RenderTarget& Target, sf::RenderQueue& Queue) const; -public : - PySfRenderWindow *RenderWindow; - PyObject *RenderFunction; -}; - - -typedef struct { - PyObject_HEAD - bool IsCustom; - CustomDrawable *obj; -} PySfDrawable; - -#endif - diff --git a/bindings/python/src/Event.cpp b/bindings/python/src/Event.cpp deleted file mode 100644 index 449295de..00000000 --- a/bindings/python/src/Event.cpp +++ /dev/null @@ -1,780 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Event.hpp" - -#include - -#include "compat.hpp" - -//////////////////////////////// -// Text Events Parameters -//////////////////////////////// - -PyMemberDef PySfEventText_members[] = { - {(char *)"Unicode", T_USHORT, offsetof(PySfEventText, Unicode), READONLY, (char *)""}, - {NULL} /* Sentinel */ -}; - -static PyObject * -PySfEventText_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfEventText *self; - - self = (PySfEventText *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->Unicode = 0; - } - - return (PyObject *)self; -} - -void -PySfEventText_dealloc(PySfEventText* self) -{ - free_object(self); -} - -PyTypeObject PySfEventTextType = { - head_init - "Event.Text", /*tp_name*/ - sizeof(PySfEventText), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfEventText_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - "Text Events Parameters", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - PySfEventText_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfEventText_new, /* tp_new */ -}; - - - -///////////////////////////////////// -// Keyboard Events Parameters -///////////////////////////////////// - -static PyObject * -PySfEventKey_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfEventKey *self; - - self = (PySfEventKey *)type->tp_alloc(type, 0); - if (self != NULL) - { - Py_INCREF(Py_False); - self->Alt = Py_False; - Py_INCREF(Py_False); - self->Control = Py_False; - Py_INCREF(Py_False); - self->Shift = Py_False; - } - - return (PyObject *)self; -} - -void -PySfEventKey_dealloc(PySfEventKey* self) -{ - free_object(self); -} - -PyMemberDef PySfEventKey_members[] = { - {(char *)"Alt", T_OBJECT, offsetof(PySfEventKey, Alt), READONLY, (char *)""}, - {(char *)"Control", T_OBJECT, offsetof(PySfEventKey, Control), READONLY, (char *)""}, - {(char *)"Shift", T_OBJECT, offsetof(PySfEventKey, Shift), READONLY, (char *)""}, - {(char *)"Code", T_UINT, offsetof(PySfEventKey, Code), READONLY, (char *)""}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfEventKeyType = { - head_init - "Event.Key", /*tp_name*/ - sizeof(PySfEventKey), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfEventKey_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - "Key Events Parameters", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - PySfEventKey_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfEventKey_new, /* tp_new */ -}; - - -//////////////////////////////////// -// MouseMove Events Parameters -//////////////////////////////////// - -static PyObject * -PySfEventMouseMove_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfEventMouseMove *self; - - self = (PySfEventMouseMove *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->X = 0; - self->Y = 0; - } - - return (PyObject *)self; -} - -void -PySfEventMouseMove_dealloc(PySfEventMouseMove *self) -{ - free_object(self); -} - - -PyMemberDef PySfEventMouseMove_members[] = { - {(char *)"X", T_INT, offsetof(PySfEventMouseMove, X), READONLY, (char *)""}, - {(char *)"Y", T_INT, offsetof(PySfEventMouseMove, Y), READONLY, (char *)""}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfEventMouseMoveType = { - head_init - "Event.MouseMove", /*tp_name*/ - sizeof(PySfEventMouseMove), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfEventMouseMove_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - "MouseMove Events Parameters", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - PySfEventMouseMove_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfEventMouseMove_new, /* tp_new */ -}; - - -//////////////////////////////////// -// MouseButton Events Parameters -//////////////////////////////////// - -static PyObject * -PySfEventMouseButton_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfEventMouseButton *self; - - self = (PySfEventMouseButton *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->Button = 0; - self->X = 0; - self->Y = 0; - } - - return (PyObject *)self; -} - -void -PySfEventMouseButton_dealloc(PySfEventMouseButton* self) -{ - free_object(self); -} - - -PyMemberDef PySfEventMouseButton_members[] = { - {(char *)"Button", T_UINT, offsetof(PySfEventMouseButton, Button), READONLY, (char *)""}, - {(char *)"X", T_INT, offsetof(PySfEventMouseButton, X), READONLY, (char *)""}, - {(char *)"Y", T_INT, offsetof(PySfEventMouseButton, Y), READONLY, (char *)""}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfEventMouseButtonType = { - head_init - "Event.MouseButton", /*tp_name*/ - sizeof(PySfEventMouseButton), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfEventMouseButton_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - "MouseButton Events Parameters", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - PySfEventMouseButton_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfEventMouseButton_new, /* tp_new */ -}; - - -//////////////////////////////// -// MouseWheel Events Parameters -//////////////////////////////// - -static PyObject * -PySfEventMouseWheel_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfEventMouseWheel *self; - - self = (PySfEventMouseWheel *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->Delta = 0; - } - - return (PyObject *)self; -} - -void -PySfEventMouseWheel_dealloc(PySfEventMouseWheel* self) -{ - free_object(self); -} - -PyMemberDef PySfEventMouseWheel_members[] = { - {(char *)"Delta", T_INT, offsetof(PySfEventMouseWheel,Delta), READONLY, (char *)""}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfEventMouseWheelType = { - head_init - "Event.MouseWheel", /*tp_name*/ - sizeof(PySfEventMouseWheel), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfEventMouseWheel_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - "MouseWheel Events Parameters", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - PySfEventMouseWheel_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfEventMouseWheel_new, /* tp_new */ -}; - - -//////////////////////////////////// -// JoyMove Events Parameters -//////////////////////////////////// - -static PyObject * -PySfEventJoyMove_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfEventJoyMove *self; - - self = (PySfEventJoyMove *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->JoystickId = 0; - self->Axis = 0; - self->Position = 0.f; - } - - return (PyObject *)self; -} - -void -PySfEventJoyMove_dealloc(PySfEventJoyMove* self) -{ - free_object(self); -} - - -PyMemberDef PySfEventJoyMove_members[] = { - {(char *)"JoystickId", T_UINT, offsetof(PySfEventJoyMove,JoystickId), READONLY, (char *)""}, - {(char *)"Axis", T_UINT, offsetof(PySfEventJoyMove,Axis), READONLY, (char *)""}, - {(char *)"Position", T_FLOAT, offsetof(PySfEventJoyMove,Position), READONLY, (char *)""}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfEventJoyMoveType = { - head_init - "Event.JoyMove", /*tp_name*/ - sizeof(PySfEventJoyMove), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfEventJoyMove_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - "JoyMove Events Parameters", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - PySfEventJoyMove_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfEventJoyMove_new, /* tp_new */ -}; - - -//////////////////////////////////// -// JoyButton Events Parameters -//////////////////////////////////// - -static PyObject * -PySfEventJoyButton_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfEventJoyButton *self; - - self = (PySfEventJoyButton *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->JoystickId = 0; - self->Button = 0; - } - - return (PyObject *)self; -} - -void -PySfEventJoyButton_dealloc(PySfEventJoyButton* self) -{ - free_object(self); -} - - -PyMemberDef PySfEventJoyButton_members[] = { - {(char *)"JoystickId", T_UINT, offsetof(PySfEventJoyButton, JoystickId), READONLY, (char *)""}, - {(char *)"Button", T_UINT, offsetof(PySfEventJoyButton, Button), READONLY, (char *)""}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfEventJoyButtonType = { - head_init - "Event.JoyButton", /*tp_name*/ - sizeof(PySfEventJoyButton), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfEventJoyButton_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - "JoyButton Events Parameters", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - PySfEventJoyButton_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfEventJoyButton_new, /* tp_new */ -}; - - -//////////////////////////////////// -// Size Events Parameters -//////////////////////////////////// - -static PyObject * -PySfEventSize_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfEventSize *self; - - self = (PySfEventSize *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->Width = 0; - self->Height = 0; - } - - return (PyObject *)self; -} - -void -PySfEventSize_dealloc(PySfEventSize* self) -{ - free_object(self); -} - -PyMemberDef PySfEventSize_members[] = { - {(char *)"Width", T_UINT, offsetof(PySfEventSize, Width), READONLY, (char *)""}, - {(char *)"Height", T_UINT, offsetof(PySfEventSize, Height), READONLY, (char *)""}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfEventSizeType = { - head_init - "Event.Size", /*tp_name*/ - sizeof(PySfEventSize), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfEventSize_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - "Size Events Parameters", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - PySfEventSize_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfEventSize_new, /* tp_new */ -}; - - - - - - -//////////////////////////////////// -// sf.Event -//////////////////////////////////// - - -static PyObject * -PySfEvent_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfEvent *self; - - self = (PySfEvent *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->Text = (PySfEventText *)PySfEventText_new(&PySfEventTextType, NULL, NULL); - self->Key = (PySfEventKey *)PySfEventKey_new(&PySfEventKeyType, NULL, NULL); - self->MouseMove = (PySfEventMouseMove *)PySfEventMouseMove_new(&PySfEventMouseMoveType, NULL, NULL); - self->MouseButton = (PySfEventMouseButton *)PySfEventMouseButton_new(&PySfEventMouseButtonType, NULL, NULL); - self->MouseWheel = (PySfEventMouseWheel *)PySfEventMouseWheel_new(&PySfEventMouseWheelType, NULL, NULL); - self->JoyMove = (PySfEventJoyMove *)PySfEventJoyMove_new(&PySfEventJoyMoveType, NULL, NULL); - self->JoyButton = (PySfEventJoyButton *)PySfEventJoyButton_new(&PySfEventJoyButtonType, NULL, NULL); - self->Size = (PySfEventSize *)PySfEventSize_new(&PySfEventSizeType, NULL, NULL); - self->obj = new sf::Event(); - } - - return (PyObject *)self; -} - -static void -PySfEvent_dealloc(PySfEvent* self) -{ - Py_DECREF(self->Text); - Py_DECREF(self->Key); - Py_DECREF(self->MouseMove); - Py_DECREF(self->MouseButton); - Py_DECREF(self->MouseWheel); - Py_DECREF(self->JoyMove); - Py_DECREF(self->JoyButton); - Py_DECREF(self->Size); - delete self->obj; - free_object(self); -} - -static PyMemberDef PySfEvent_members[] = { - {(char *)"Text", T_OBJECT, offsetof(PySfEvent, Text), READONLY, (char *)"Text Events Parameters"}, - {(char *)"Key", T_OBJECT, offsetof(PySfEvent, Key), READONLY, (char *)"Keyboard Events Parameters"}, - {(char *)"MouseMove", T_OBJECT, offsetof(PySfEvent, MouseMove), READONLY, (char *)"MouseMove Events Parameters"}, - {(char *)"MouseButton", T_OBJECT, offsetof(PySfEvent, MouseButton), READONLY, (char *)"MouseButton Events Parameters"}, - {(char *)"MouseWheel", T_OBJECT, offsetof(PySfEvent, MouseWheel), READONLY, (char *)"MouseWheel Events Parameters"}, - {(char *)"JoyMove", T_OBJECT, offsetof(PySfEvent, JoyMove), READONLY, (char *)"JoyMove Events Parameters"}, - {(char *)"JoyButton", T_OBJECT, offsetof(PySfEvent, JoyButton), READONLY, (char *)"JoyButton Events Parameters"}, - {(char *)"Size", T_OBJECT, offsetof(PySfEvent, Size), READONLY, (char *)"Size Events Parameters"}, - {(char *)"Type", T_UINT, offsetof(PySfEvent, Type), READONLY, (char *)"Type Events Parameters"}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfEventType = { - head_init - "Event", /*tp_name*/ - sizeof(PySfEvent), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfEvent_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "sf.Event defines a system event and its parameters", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - PySfEvent_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfEvent_new, /* tp_new */ -}; - - -void -PySfEvent_InitConst() -{ - PyObject *obj; - obj = PyLong_FromLong(sf::Event::KeyReleased); - PyDict_SetItemString(PySfEventType.tp_dict, "KeyReleased", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Event::LostFocus); - PyDict_SetItemString(PySfEventType.tp_dict, "LostFocus", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Event::GainedFocus); - PyDict_SetItemString(PySfEventType.tp_dict, "GainedFocus", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Event::KeyPressed); - PyDict_SetItemString(PySfEventType.tp_dict, "KeyPressed", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Event::MouseWheelMoved); - PyDict_SetItemString(PySfEventType.tp_dict, "MouseWheelMoved", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Event::TextEntered); - PyDict_SetItemString(PySfEventType.tp_dict, "TextEntered", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Event::MouseMoved); - PyDict_SetItemString(PySfEventType.tp_dict, "MouseMoved", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Event::JoyButtonPressed); - PyDict_SetItemString(PySfEventType.tp_dict, "JoyButtonPressed", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Event::MouseButtonReleased); - PyDict_SetItemString(PySfEventType.tp_dict, "MouseButtonReleased", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Event::Closed); - PyDict_SetItemString(PySfEventType.tp_dict, "Closed", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Event::MouseButtonPressed); - PyDict_SetItemString(PySfEventType.tp_dict, "MouseButtonPressed", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Event::JoyMoved); - PyDict_SetItemString(PySfEventType.tp_dict, "JoyMoved", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Event::JoyButtonReleased); - PyDict_SetItemString(PySfEventType.tp_dict, "JoyButtonReleased", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Event::Resized); - PyDict_SetItemString(PySfEventType.tp_dict, "Resized", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Event::MouseEntered); - PyDict_SetItemString(PySfEventType.tp_dict, "MouseEntered", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Event::MouseLeft); - PyDict_SetItemString(PySfEventType.tp_dict, "MouseLeft", obj); - Py_DECREF(obj); -} - diff --git a/bindings/python/src/Event.hpp b/bindings/python/src/Event.hpp deleted file mode 100644 index fa8f8fa4..00000000 --- a/bindings/python/src/Event.hpp +++ /dev/null @@ -1,105 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYEVENT_HPP -#define __PYEVENT_HPP - -#include - -#include - -typedef struct -{ - PyObject_HEAD - unsigned int short Unicode; -} PySfEventText; - -typedef struct -{ - PyObject_HEAD - PyObject *Alt; - PyObject *Control; - PyObject *Shift; - unsigned int Code; -} PySfEventKey; - -typedef struct -{ - PyObject_HEAD - int X; - int Y; -} PySfEventMouseMove; - -typedef struct -{ - PyObject_HEAD - unsigned int Button; - int X; - int Y; -} PySfEventMouseButton; - -typedef struct -{ - PyObject_HEAD - int Delta; -} PySfEventMouseWheel; - -typedef struct { - PyObject_HEAD - unsigned int JoystickId; - unsigned int Axis; - float Position; -} PySfEventJoyMove; - -typedef struct { - PyObject_HEAD - unsigned int JoystickId; - unsigned int Button; -} PySfEventJoyButton; - -typedef struct -{ - PyObject_HEAD - unsigned int Width; - unsigned int Height; -} PySfEventSize; - -typedef struct { - PyObject_HEAD - PySfEventText *Text; - PySfEventKey *Key; - PySfEventMouseMove *MouseMove; - PySfEventMouseButton *MouseButton; - PySfEventMouseWheel *MouseWheel; - PySfEventJoyMove *JoyMove; - PySfEventJoyButton *JoyButton; - PySfEventSize *Size; - unsigned int Type; - sf::Event *obj; -} PySfEvent; - -void -PySfEvent_InitConst(); - -#endif diff --git a/bindings/python/src/Font.cpp b/bindings/python/src/Font.cpp deleted file mode 100644 index f2475ce3..00000000 --- a/bindings/python/src/Font.cpp +++ /dev/null @@ -1,200 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Font.hpp" -#include "Glyph.hpp" -#include "Image.hpp" - -#include "compat.hpp" - - -static void -PySfFont_dealloc(PySfFont *self) -{ - if (self->Owner) - delete self->obj; - free_object(self); -} - -static PyObject * -PySfFont_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfFont *self; - self = (PySfFont *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->Owner = true; - self->obj = new sf::Font(); - } - return (PyObject *)self; -} - -static PyObject * -PySfFont_LoadFromFile( PySfFont* self, PyObject *args ) { - char* Filename; - bool result; - - if( PyArg_ParseTuple( args, "s:Font.LoadFromFile", &Filename ) ) { - result = self->obj->LoadFromFile(Filename); - } - else { - PyErr_BadArgument(); - return NULL; - } - - return PyBool_FromLong( result ); -} - -static PyObject * -PySfFont_LoadFromMemory( PySfFont* self, PyObject *args ) { - unsigned int Size; - char* Data; - bool result; - - if( PyArg_ParseTuple( args, "s#:Font.LoadFromMemory", &Data, &Size ) ) { - result = self->obj->LoadFromMemory( Data, Size ); - } - else { - PyErr_BadArgument(); - return NULL; - } - - return PyBool_FromLong( result ); -} - -static PyObject * -PySfFont_GetDefaultFont(PySfFont* self, PyObject *args) -{ - PySfFont *DefaultFont = GetNewPySfFont(); - DefaultFont->Owner = false; - DefaultFont->obj = (sf::Font *)&(sf::Font::GetDefaultFont()); - return (PyObject *)DefaultFont; -} - -static PyObject * -PySfFont_GetGlyph(PySfFont* self, PyObject *args) { - unsigned int codepoint( 0 ); - unsigned int charsize( 0 ); - bool bold( false ); - - if( !PyArg_ParseTuple( args, "IIb:Font.LoadFromFile", &codepoint, &charsize, &bold ) ) { - PyErr_BadArgument(); - return NULL; - } - - PySfGlyph* glyph( GetNewPySfGlyph() ); - - glyph->Owner = false; - glyph->Rectangle = GetNewPySfIntRect(); - glyph->Rectangle->Owner = false; - glyph->TexCoords = GetNewPySfFloatRect(); - glyph->TexCoords->Owner = false; - - glyph->obj = const_cast( &( self->obj->GetGlyph( codepoint, charsize, bold ) ) ); - glyph->Rectangle->obj = &glyph->obj->Rectangle; - glyph->TexCoords->obj = &glyph->obj->TexCoords; - - PySfGlyphUpdateSelf( glyph ); - - return reinterpret_cast( glyph ); -} - -static PyObject * -PySfFont_GetImage( PySfFont* self, PyObject* args ) { - PySfImage* image( GetNewPySfImage() ); - - image->obj = new sf::Image( self->obj->GetImage( PyLong_AsUnsignedLong( args ) ) ); - - return reinterpret_cast( image ); -} - -static PyMethodDef PySfFont_methods[] = { - {"LoadFromFile", (PyCFunction)PySfFont_LoadFromFile, METH_VARARGS, "LoadFromFile(Filename))\n\ -Load the font from a file. Returns True if loading was successful.\n\ - Filename : Font file to load"}, - {"LoadFromMemory", (PyCFunction)PySfFont_LoadFromMemory, METH_VARARGS, "LoadFromMemory(Data)\n\ -Load the font from a file in memory. Returns True if loading was successful.\n\ - Data : data to load"}, - {"GetDefaultFont", (PyCFunction)PySfFont_GetDefaultFont, METH_NOARGS | METH_STATIC, "GetDefaultFont()\n\ -Get the SFML default built-in font (Arial)."}, - {"GetImage", (PyCFunction)PySfFont_GetImage, METH_O, "GetImage(characterSize)\n\ -Get the image containing the rendered characters (glyphs).\n\ - characterSize: Character size."}, - {"GetGlyph", (PyCFunction)PySfFont_GetGlyph, METH_VARARGS, "GetGlyph(codePoint, characterSize, bold)\n\ -Get the description of a glyph (character) given by its code point, character size and boldness. Returns glyph's visual settings, or an invalid glyph if character not found.\n\ - codePoint : Unicode code point value of the character to get.\n\ - characterSize: Size of character\n\ - bold: Bold character"}, - {NULL} /* Sentinel */ -}; - - -PyTypeObject PySfFontType = { - head_init - "Font", /*tp_name*/ - sizeof(PySfFont), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfFont_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "sf.Font is the low-level class for loading and manipulating character fonts. This class is meant to be used by sf.String.\nDefault constructor : sf.Font().", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfFont_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfFont_new, /* tp_new */ -}; - -PySfFont * -GetNewPySfFont() -{ - return PyObject_New(PySfFont, &PySfFontType); -} - - diff --git a/bindings/python/src/Font.hpp b/bindings/python/src/Font.hpp deleted file mode 100644 index a8105504..00000000 --- a/bindings/python/src/Font.hpp +++ /dev/null @@ -1,42 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYFONT_HPP -#define __PYFONT_HPP - -#include - -#include - - -typedef struct { - PyObject_HEAD - bool Owner; - sf::Font *obj; -} PySfFont; - -PySfFont * -GetNewPySfFont(); - -#endif diff --git a/bindings/python/src/Glyph.cpp b/bindings/python/src/Glyph.cpp deleted file mode 100644 index d805c478..00000000 --- a/bindings/python/src/Glyph.cpp +++ /dev/null @@ -1,145 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Glyph.hpp" - -#include - -#include "offsetof.hpp" -#include "compat.hpp" - - -static PyMemberDef PySfGlyph_members[] = { - {(char *)"Advance", T_INT, offsetof(PySfGlyph, Advance), 0, (char *)"Offset to move horizontically to the next character."}, - {(char *)"Rectangle", T_OBJECT, offsetof(PySfGlyph, Rectangle), 0, (char *)"Bounding rectangle of the glyph, in relative coordinates."}, - {(char *)"TexCoords", T_OBJECT, offsetof(PySfGlyph, TexCoords), 0, (char *)"Texture coordinates of the glyph inside the bitmap font."}, - {NULL} /* Sentinel */ -}; - - -static void -PySfGlyph_dealloc(PySfGlyph *self) -{ - Py_CLEAR(self->Rectangle); - Py_CLEAR(self->TexCoords); - delete self->obj; - free_object(self); -} - -void -PySfGlyphUpdateObj(PySfGlyph *self) -{ - self->obj->Advance = self->Advance; - PySfIntRectUpdateSelf(self->Rectangle); - PySfFloatRectUpdateSelf(self->TexCoords); -} - -void -PySfGlyphUpdateSelf(PySfGlyph *self) -{ - self->Advance = self->obj->Advance; - PySfIntRectUpdateObj(self->Rectangle); - PySfFloatRectUpdateObj(self->TexCoords); -} - -static PyObject * -PySfGlyph_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfGlyph *self; - self = (PySfGlyph *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->Rectangle = GetNewPySfIntRect(); - self->Rectangle->Owner = false; - self->TexCoords = GetNewPySfFloatRect(); - self->TexCoords->Owner = false; - self->obj = new sf::Glyph(); - self->Owner = true; - self->Advance = self->obj->Advance; - self->Rectangle->obj = &(self->obj->Rectangle); - self->TexCoords->obj = &(self->obj->TexCoords); - PySfIntRectUpdateSelf(self->Rectangle); - PySfFloatRectUpdateSelf(self->TexCoords); - } - return (PyObject *)self; -} - -int -PySfGlyph_setattro(PyObject* self, PyObject *attr_name, PyObject *v) -{ - int result = PyObject_GenericSetAttr(self, attr_name, v); - PySfGlyph *Glyph = (PySfGlyph *)self; - Glyph->obj->Rectangle = *(Glyph->Rectangle->obj); - Glyph->obj->TexCoords = *(Glyph->TexCoords->obj); - Glyph->obj->Advance = Glyph->Advance; - return result; -} - -PyTypeObject PySfGlyphType = { - head_init - "Glyph", /*tp_name*/ - sizeof(PySfGlyph), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfGlyph_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "Structure describing a glyph (a visual character).", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - PySfGlyph_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfGlyph_new, /* tp_new */ -}; - -PySfGlyph * -GetNewPySfGlyph() -{ - return PyObject_New(PySfGlyph, &PySfGlyphType); -} - diff --git a/bindings/python/src/Glyph.hpp b/bindings/python/src/Glyph.hpp deleted file mode 100644 index d461b5d1..00000000 --- a/bindings/python/src/Glyph.hpp +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYGLYPH_HPP -#define __PYGLYPH_HPP - -#include - -#include - -#include "Rect.hpp" - - -typedef struct { - PyObject_HEAD - bool Owner; - int Advance; - PySfIntRect *Rectangle; - PySfFloatRect *TexCoords; - sf::Glyph *obj; -} PySfGlyph; - -PySfGlyph * -GetNewPySfGlyph(); - -void -PySfGlyphUpdateObj(PySfGlyph *self); - -void -PySfGlyphUpdateSelf(PySfGlyph *self); - -#endif diff --git a/bindings/python/src/Image.cpp b/bindings/python/src/Image.cpp deleted file mode 100644 index 8eee10e4..00000000 --- a/bindings/python/src/Image.cpp +++ /dev/null @@ -1,410 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Image.hpp" -#include "RenderWindow.hpp" -#include "Color.hpp" -#include "Rect.hpp" - -#include "compat.hpp" - -extern PyTypeObject PySfColorType; -extern PyTypeObject PySfIntRectType; -extern PyTypeObject PySfRenderWindowType; - -static void -PySfImage_dealloc(PySfImage* self) -{ - delete self->obj; - free_object(self); -} - -static PyObject * -PySfImage_new(PyTypeObject *type, PyObject *args, PyObject *kwds); - -static PyObject * -PySfImage_Create(PySfImage* self, PyObject *args, PyObject *kwds) -{ - PySfColor *ColorTmp=NULL; - sf::Color *Color; - unsigned int Width=0, Height=0; - const char *kwlist[] = {"Width", "Height", "Color", NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|IIO!:Image.Create", (char **)kwlist, &Width, &Height, &PySfColorType, &ColorTmp)) - return NULL; - - if (ColorTmp) - { - Color = ColorTmp->obj; - PySfColorUpdate(ColorTmp); - self->obj->Create(Width, Height, *Color); - } - else - self->obj->Create(Width, Height); - - Py_RETURN_NONE; -} - -static PyObject * -PySfImage_CopyScreen(PySfImage* self, PyObject *args) -{ - PySfRenderWindow *RenderWindow; - PySfIntRect *SourceRect=NULL; - bool Result; - - if (!PyArg_ParseTuple(args, "O!|O!:Image.CopyScreen", &PySfRenderWindowType, &RenderWindow, &PySfIntRectType, &SourceRect)) - return NULL; - - - if (SourceRect) - Result = self->obj->CopyScreen(*(RenderWindow->obj), *(SourceRect->obj)); - else - Result = self->obj->CopyScreen(*(RenderWindow->obj)); - if (Result) - Py_RETURN_TRUE; - else - Py_RETURN_FALSE; -} - -static PyObject * -PySfImage_SetPixel(PySfImage* self, PyObject *args, PyObject *kwds) -{ - PySfColor *ColorTmp=NULL; - sf::Color *Color; - unsigned int x=0, y=0; - const char *kwlist[] = {"x", "y", "Color", NULL}; - - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "II|O!:Image.SetPixel", (char **)kwlist, &x, &y, &PySfColorType, &ColorTmp)) - return NULL; - - - if (ColorTmp) - { - Color = ColorTmp->obj; - PySfColorUpdate(ColorTmp); - self->obj->SetPixel(x, y, *Color); - } - - Py_RETURN_NONE; -} - -static PyObject * -PySfImage_GetPixel(PySfImage* self, PyObject *args) -{ - PySfColor *Color; - unsigned int x=0, y=0; - - - if (!PyArg_ParseTuple(args, "II:Image.GetPixel", &x, &y)) - return NULL; - - - Color = GetNewPySfColor(); - Color->obj = new sf::Color(self->obj->GetPixel(x, y)); - Color->r = Color->obj->r; - Color->g = Color->obj->g; - Color->b = Color->obj->b; - Color->a = Color->obj->a; - - return (PyObject *)Color; -} - -static PyObject * -PySfImage_CreateMaskFromColor(PySfImage* self, PyObject *args) -{ - PySfColor *ColorTmp= (PySfColor *)args; - sf::Color *Color; - - if (!PyObject_TypeCheck(ColorTmp, &PySfColorType)) - { - PyErr_SetString(PyExc_TypeError, "Image.CreateMaskFromColor() Argument must be a sf.Color"); - return NULL; - } - Color = ColorTmp->obj; - PySfColorUpdate(ColorTmp); - self->obj->CreateMaskFromColor(*Color); - - Py_RETURN_NONE; -} - -static PyObject * -PySfImage_LoadFromMemory(PySfImage* self, PyObject *args) -{ - unsigned int SizeInBytes; - char *Data; - - if (!PyArg_ParseTuple(args, "s#:Image.LoadFromMemory", &Data, &SizeInBytes)) - return NULL; - - return PyBool_FromLong(self->obj->LoadFromMemory(Data, (std::size_t) SizeInBytes)); -} - -static PyObject * -PySfImage_LoadFromPixels(PySfImage* self, PyObject *args) -{ - unsigned int Width, Height, Size; - char *Data; - - if (! PyArg_ParseTuple(args, "IIs#:Image.LoadFromPixels", &Width, &Height, &Data, &Size)) - return NULL; - - self->obj->LoadFromPixels(Width, Height, (sf::Uint8*) Data); - Py_RETURN_NONE; -} - -static PyObject * -PySfImage_GetPixels(PySfImage *self) -{ -#ifdef IS_PY3K - return PyBytes_FromStringAndSize((const char *)(self->obj->GetPixelsPtr()), self->obj->GetWidth()*self->obj->GetHeight()*4); -#else - return PyString_FromStringAndSize((const char *)(self->obj->GetPixelsPtr()), self->obj->GetWidth()*self->obj->GetHeight()*4); -#endif -} - -static PyObject * -PySfImage_LoadFromFile (PySfImage *self, PyObject *args) -{ - load_from_file(self, args); -} - -static PyObject * -PySfImage_SaveToFile (PySfImage *self, PyObject *args) -{ - save_to_file(self, args); -} - -static PyObject * -PySfImage_Bind(PySfImage *self) -{ - self->obj->Bind(); - Py_RETURN_NONE; -} - -static PyObject * -PySfImage_SetSmooth (PySfImage *self, PyObject *args) -{ - self->obj->SetSmooth(PyBool_AsBool(args)); - Py_RETURN_NONE; -} - -static PyObject * -PySfImage_IsSmooth (PySfImage *self) -{ - return PyBool_FromLong(self->obj->IsSmooth()); -} - -static PyObject * -PySfImage_GetWidth(PySfImage *self) -{ - return PyLong_FromUnsignedLong(self->obj->GetWidth()); -} - -static PyObject * -PySfImage_GetHeight(PySfImage *self) -{ - return PyLong_FromUnsignedLong(self->obj->GetHeight()); -} - -static PyObject * -PySfImage_GetValidSize(PySfImage* self, PyObject *args) -{ - unsigned long S = PyLong_AsUnsignedLong(args); - return PyLong_FromUnsignedLong(sf::Image::GetValidSize(S)); -} - -static PyObject * -PySfImage_GetTexCoords(PySfImage* self, PyObject *args) -{ - PySfIntRect *RectArg = NULL; - - if (!PyArg_ParseTuple(args, "O!:Image.GetTextCoords", &PySfIntRectType, &RectArg)) - return NULL; - - PySfFloatRect *Rect; - - Rect = GetNewPySfFloatRect(); - Rect->Owner = true; - Rect->obj = new sf::FloatRect(self->obj->GetTexCoords(*(RectArg->obj))); - PySfFloatRectUpdateSelf(Rect); - - return (PyObject *)Rect; -} - -static int -PySfImage_init(PySfImage *self, PyObject *args, PyObject *kwds) -{ - int size = PyTuple_Size(args); - if (size > 0) - { - if (PySfImage_Create(self, args, kwds) == NULL) - { - if (size != 3) - return -1; - else if (PySfImage_LoadFromPixels(self, args) == NULL) - return -1; - else PyErr_Clear(); - } - } - return 0; -} - -static PyObject * -PySfImage_Copy(PySfImage* self, PyObject *args, PyObject *kwds); - -static PyMethodDef PySfImage_methods[] = { - {"Copy", (PyCFunction)PySfImage_Copy, METH_VARARGS, "Copy(Source, DestX, DestY, SourceRect = sf.IntRect(0,0,0,0))\n\ -Copy pixels from another image onto this one. This function does a slow pixel copy and should only be used at initialization time.\n\ - Source : Source image to copy\n\ - DestX : X coordinate of the destination position\n\ - DestY : Y coordinate of the destination position\n\ - SourceRect : Sub-rectangle of the source image to copy (empty by default - entire image)\n\ - ApplyAlpha : Should the copy take in account the source transparency? (false by default)"}, - {"Create", (PyCFunction)PySfImage_Create, METH_VARARGS, "Create(Width=0, Height=0, Color=sf.Color.Black)\n\ -Create an empty image.\n\ - Width : Image width\n\ - Height : Image height\n\ - Col : Image color (black by default)"}, - {"CopyScreen", (PyCFunction)PySfImage_CopyScreen, METH_VARARGS, "CopyScreen(Window, SourceRect)\n\ -Create the image from the current contents of the given window. Return True if copy was successful.\n\ - Window : Window to capture\n\ - SourceRect : Sub-rectangle of the screen to copy (empty by default - entire image)"}, - {"SetPixel", (PyCFunction)PySfImage_SetPixel, METH_VARARGS | METH_KEYWORDS, "SetPixel(X, Y, Col)\nChange the color of a pixel.\n\ - X : X coordinate of pixel in the image\n Y : Y coordinate of pixel in the image\n Col : New color for pixel (X, Y)"}, - {"GetPixel", (PyCFunction)PySfImage_GetPixel, METH_VARARGS, "GetPixel(X, Y)\nGet a pixel from the image."}, - {"LoadFromFile", (PyCFunction)PySfImage_LoadFromFile, METH_O, "LoadFromFile(Path)\nLoad the surface from a file."}, - {"SaveToFile", (PyCFunction)PySfImage_SaveToFile, METH_O, "SaveToFile(Path)\nSave the content of the image to a file."}, - {"LoadFromMemory", (PyCFunction)PySfImage_LoadFromMemory, METH_VARARGS, "LoadFromMemory(Data)\nLoad the image from a file in memory."}, - {"LoadFromPixels", (PyCFunction)PySfImage_LoadFromPixels, METH_VARARGS, "LoadFromPixels(Width, Height, Data)\nLoad the image directly from a string of pixels."}, - {"GetPixels", (PyCFunction)PySfImage_GetPixels, METH_NOARGS, "GetPixels()\nGet a string representing the array of pixels (8 bits integers RGBA). String length is GetWidth() x GetHeight() x 4. This string becomes invalid if you reload or resize the image."}, - {"CreateMaskFromColor", (PyCFunction)PySfImage_CreateMaskFromColor, METH_O, "CreateMaskFromColor(Color)\nCreate transparency mask from a specified colorkey."}, - {"Bind", (PyCFunction)PySfImage_Bind, METH_NOARGS, "Bind()\nBind the image for rendering."}, - {"SetSmooth", (PyCFunction)PySfImage_SetSmooth, METH_O, "SetSmooth(Smooth)\nEnable or disable image smooth filter."}, - {"IsSmooth", (PyCFunction)PySfImage_IsSmooth, METH_NOARGS, "IsOpened(Smooth)\nTells whether the smooth filtering is enabled or not."}, - {"GetWidth", (PyCFunction)PySfImage_GetWidth, METH_NOARGS, "GetWidth()\nReturn the width of the image."}, - {"GetHeight", (PyCFunction)PySfImage_GetHeight, METH_NOARGS, "GetHeight()\nReturn the height of the image."}, - {"GetTexCoords", (PyCFunction)PySfImage_GetTexCoords, METH_VARARGS, "GetTexCoords(Rect)\nConvert a subrect expressed in pixels, into float texture coordinates. Returns texture coordinates corresponding to the sub-rectangle (sf.FloatRect instance)\n\ - Rect : Sub-rectangle of image to convert"}, - {"GetValidSize", (PyCFunction)PySfImage_GetValidSize, METH_STATIC | METH_O, "GetValidSize(Size)\nGet a valid texture size according to hardware support. Returns valid nearest size (greater than or equal to specified size).\n\ - Size : Size to convert"}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfImageType = { - head_init - "Image", /*tp_name*/ - sizeof(PySfImage), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfImage_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "sf.Image is the low-level class for loading and manipulating images.\n\ -Default constructor : sf.Image()\n\ -Other constructors : sf.Image(Width=0, Height=0, Color=sf.Color.Black) or sf.Image(Width, Height, Data).\n\ -Copy constructor : sf.Image(Copy) where Copy is a sf.Image instance.", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfImage_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)PySfImage_init, /* tp_init */ - 0, /* tp_alloc */ - PySfImage_new, /* tp_new */ -}; - -static PyObject * -PySfImage_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfImage *self; - self = (PySfImage *)type->tp_alloc(type, 0); - if (self != NULL) - { - if (PyTuple_Size(args) == 1) - { - PySfImage *Image; - if (PyArg_ParseTuple(args, "O!", &PySfImageType, &Image)) - { - self->obj = new sf::Image(*(Image->obj)); - } - else PyErr_Clear(); - } - else self->obj = new sf::Image(); - } - return (PyObject *)self; -} - -static PyObject * -PySfImage_Copy(PySfImage* self, PyObject *args, PyObject *kwds) -{ - const char *kwlist[] = {"Source", "DestX", "DestY", "SourceRect", "ApplyAlpha", NULL}; - PySfIntRect *SourceRect = NULL; - PySfImage *Source = NULL; - unsigned int DestX, DestY; - PyObject *PyApplyAlpha = NULL; - bool ApplyAlpha = false; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!II|O!O:Image.Copy", (char **)kwlist, &PySfImageType, &Source, &DestX, &DestY, &PySfIntRectType, &SourceRect, &PyApplyAlpha)) - return NULL; - - if (PyApplyAlpha) - if (PyObject_IsTrue(PyApplyAlpha)) - ApplyAlpha = true; - - if (SourceRect) - self->obj->Copy(*(Source->obj), DestX, DestY, *(SourceRect->obj), ApplyAlpha); - else - self->obj->Copy(*(Source->obj), DestX, DestY, sf::IntRect(0, 0, 0, 0), ApplyAlpha); - - Py_RETURN_NONE; -} - -PySfImage * -GetNewPySfImage() -{ - return PyObject_New(PySfImage, &PySfImageType); -} - diff --git a/bindings/python/src/Image.hpp b/bindings/python/src/Image.hpp deleted file mode 100644 index ff195c7a..00000000 --- a/bindings/python/src/Image.hpp +++ /dev/null @@ -1,42 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYIMAGE_HPP -#define __PYIMAGE_HPP - -#include - -#include - - -typedef struct { - PyObject_HEAD - sf::Image *obj; -} PySfImage; - -PySfImage * -GetNewPySfImage(); - -#endif - diff --git a/bindings/python/src/Input.cpp b/bindings/python/src/Input.cpp deleted file mode 100644 index d3322a5b..00000000 --- a/bindings/python/src/Input.cpp +++ /dev/null @@ -1,134 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Input.hpp" - -#include "compat.hpp" - - -static PyObject * -PySfInput_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PyErr_SetString(PyExc_RuntimeError, "You can't create an Input object yourself, because an Input object must always be associated to its window.\nThe only way to get an Input is by creating a window and calling : Input = MyWindow.GetInput()."); - return NULL; -} - -static PyObject* -PySfInput_IsKeyDown(PySfInput *self, PyObject *args) -{ - return PyBool_FromLong(self->obj->IsKeyDown( (sf::Key::Code) PyLong_AsLong(args) )); -} - -static PyObject* -PySfInput_IsMouseButtonDown(PySfInput *self, PyObject *args) -{ - return PyBool_FromLong(self->obj->IsMouseButtonDown( (sf::Mouse::Button) PyLong_AsLong(args) )); -} - -static PyObject* -PySfInput_IsJoystickButtonDown(PySfInput *self, PyObject *args) -{ - unsigned int JoyId, Button; - if (! PyArg_ParseTuple (args, "II:Input.IsJoystickButtonDown", &JoyId, &Button)) - return NULL; - return PyBool_FromLong(self->obj->IsJoystickButtonDown(JoyId, Button)); -} - -static PyObject* -PySfInput_GetMouseX(PySfInput *self) -{ - return PyLong_FromLong(self->obj->GetMouseX()); -} -static PyObject* -PySfInput_GetMouseY(PySfInput *self) -{ - return PyLong_FromLong(self->obj->GetMouseY()); -} - -static PyObject* -PySfInput_GetJoystickAxis(PySfInput *self, PyObject *args) -{ - unsigned int JoyId, Axis; - if (! PyArg_ParseTuple (args, "II:Input.GetJoystickAxis", &JoyId, &Axis)) - return NULL; - return PyFloat_FromDouble(self->obj->GetJoystickAxis(JoyId, (sf::Joy::Axis) Axis)); -} - -static PyMethodDef PySfInput_methods[] = { - {"IsKeyDown", (PyCFunction)PySfInput_IsKeyDown, METH_O, "IsKeyDown(KeyCode)\nGet the state of a key. Returns True if key is down, false if key is up.\n KeyCode : Key to check"}, - {"IsMouseButtonDown", (PyCFunction)PySfInput_IsMouseButtonDown, METH_O, "IsMouseButtonDown(Button)\nGet the state of a mouse button. Returns True if button is down, false if button is up.\n Button : Button to check"}, - {"IsJoystickButtonDown", (PyCFunction)PySfInput_IsJoystickButtonDown, METH_VARARGS, "IsJoystickButtonDown(JoyId, Button)\nGet the state of a joystick button. Returns True if button is down, false if button is up.\n JoyId : Identifier of the joystick to check (0 or 1)\n Button : Button to check"}, - {"GetMouseX", (PyCFunction)PySfInput_GetMouseX, METH_NOARGS, "GetMouseX()\nGet the mouse X position."}, - {"GetMouseY", (PyCFunction)PySfInput_GetMouseY, METH_NOARGS, "GetMouseY()\nGet the mouse Y position."}, - {"GetJoystickAxis", (PyCFunction)PySfInput_GetJoystickAxis, METH_VARARGS, "GetJoystickAxis(JoyId, Axis)\nGet a joystick axis position. Returns current axis position, in the range [-100, 100] (except for POV, which is [0, 360])\n JoyId : Identifier of the joystick to check (0 or 1)\n Axis : Axis to get"}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfInputType = { - head_init - "Input", /*tp_name*/ - sizeof(PySfInput), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - 0, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "sf.Input handles real-time input from keyboard and mouse. Use it instead of events to handle continuous moves and more game-friendly inputs.", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfInput_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfInput_new, /* tp_new */ -}; - -PySfInput * -GetNewPySfInput() -{ - return PyObject_New(PySfInput, &PySfInputType); -} - diff --git a/bindings/python/src/Input.hpp b/bindings/python/src/Input.hpp deleted file mode 100644 index 73df3652..00000000 --- a/bindings/python/src/Input.hpp +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYINPUT_HPP -#define __PYINPUT_HPP - -#include - -#include - -typedef struct { - PyObject_HEAD - sf::Input *obj; -} PySfInput; - -PySfInput * -GetNewPySfInput(); - -#endif diff --git a/bindings/python/src/Joy.cpp b/bindings/python/src/Joy.cpp deleted file mode 100644 index fdce88c6..00000000 --- a/bindings/python/src/Joy.cpp +++ /dev/null @@ -1,114 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Joy.hpp" - -#include "compat.hpp" - - -static PyObject * -PySfJoy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfJoy *self; - self = (PySfJoy *)type->tp_alloc(type, 0); - return (PyObject *)self; -} - - -PyTypeObject PySfJoyType = { - head_init - "Joy", /*tp_name*/ - sizeof(PySfJoy), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - 0, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "Definition of joystick axis for joystick events.", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfJoy_new, /* tp_new */ -}; - -void PySfJoy_InitConst() -{ - PyObject *obj; - obj = PyLong_FromLong(sf::Joy::AxisX); - PyDict_SetItemString(PySfJoyType.tp_dict, "AxisX", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Joy::AxisY); - PyDict_SetItemString(PySfJoyType.tp_dict, "AxisY", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Joy::AxisZ); - PyDict_SetItemString(PySfJoyType.tp_dict, "AxisZ", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Joy::AxisR); - PyDict_SetItemString(PySfJoyType.tp_dict, "AxisR", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Joy::AxisU); - PyDict_SetItemString(PySfJoyType.tp_dict, "AxisU", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Joy::AxisV); - PyDict_SetItemString(PySfJoyType.tp_dict, "AxisV", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Joy::AxisPOV); - PyDict_SetItemString(PySfJoyType.tp_dict, "AxisPOV", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Joy::Count); - PyDict_SetItemString(PySfJoyType.tp_dict, "Count", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Joy::AxisCount); - PyDict_SetItemString(PySfJoyType.tp_dict, "AxisCount", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Joy::ButtonCount); - PyDict_SetItemString(PySfJoyType.tp_dict, "ButtonCount", obj); - Py_DECREF(obj); -} - diff --git a/bindings/python/src/Joy.hpp b/bindings/python/src/Joy.hpp deleted file mode 100644 index 6daf4bb3..00000000 --- a/bindings/python/src/Joy.hpp +++ /dev/null @@ -1,39 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYJOY_HPP -#define __PYJOY_HPP - -#include - -#include - -typedef struct { - PyObject_HEAD -} PySfJoy; - -void -PySfJoy_InitConst(); - -#endif diff --git a/bindings/python/src/Key.cpp b/bindings/python/src/Key.cpp deleted file mode 100644 index 9b807cfa..00000000 --- a/bindings/python/src/Key.cpp +++ /dev/null @@ -1,385 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Key.hpp" - -#include "compat.hpp" - -static PyObject * -PySfKey_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfKey *self; - self = (PySfKey *)type->tp_alloc(type, 0); - return (PyObject *)self; -} - -PyTypeObject PySfKeyType = { - head_init - "Key", /*tp_name*/ - sizeof(PySfKey), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - 0, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "Definition of key codes for keyboard events.", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfKey_new, /* tp_new */ -}; - -void PySfKey_InitConst() -{ - PyObject *obj; - obj = PyLong_FromLong(sf::Key::Numpad2); - PyDict_SetItemString(PySfKeyType.tp_dict, "Numpad2", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Numpad3); - PyDict_SetItemString(PySfKeyType.tp_dict, "Numpad3", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Numpad0); - PyDict_SetItemString(PySfKeyType.tp_dict, "Numpad0", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Numpad1); - PyDict_SetItemString(PySfKeyType.tp_dict, "Numpad1", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Numpad6); - PyDict_SetItemString(PySfKeyType.tp_dict, "Numpad6", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Numpad7); - PyDict_SetItemString(PySfKeyType.tp_dict, "Numpad7", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Numpad4); - PyDict_SetItemString(PySfKeyType.tp_dict, "Numpad4", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Numpad5); - PyDict_SetItemString(PySfKeyType.tp_dict, "Numpad5", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Numpad8); - PyDict_SetItemString(PySfKeyType.tp_dict, "Numpad8", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Numpad9); - PyDict_SetItemString(PySfKeyType.tp_dict, "Numpad9", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::RAlt); - PyDict_SetItemString(PySfKeyType.tp_dict, "RAlt", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::PageUp); - PyDict_SetItemString(PySfKeyType.tp_dict, "PageUp", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Multiply); - PyDict_SetItemString(PySfKeyType.tp_dict, "Multiply", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::D); - PyDict_SetItemString(PySfKeyType.tp_dict, "D", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::SemiColon); - PyDict_SetItemString(PySfKeyType.tp_dict, "SemiColon", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::H); - PyDict_SetItemString(PySfKeyType.tp_dict, "H", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::L); - PyDict_SetItemString(PySfKeyType.tp_dict, "L", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::P); - PyDict_SetItemString(PySfKeyType.tp_dict, "P", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Num7); - PyDict_SetItemString(PySfKeyType.tp_dict, "Num7", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::T); - PyDict_SetItemString(PySfKeyType.tp_dict, "T", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::X); - PyDict_SetItemString(PySfKeyType.tp_dict, "X", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::RSystem); - PyDict_SetItemString(PySfKeyType.tp_dict, "RSystem", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::F5); - PyDict_SetItemString(PySfKeyType.tp_dict, "F5", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Num4); - PyDict_SetItemString(PySfKeyType.tp_dict, "Num4", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Num5); - PyDict_SetItemString(PySfKeyType.tp_dict, "Num5", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Num6); - PyDict_SetItemString(PySfKeyType.tp_dict, "Num6", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Right); - PyDict_SetItemString(PySfKeyType.tp_dict, "Right", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Num0); - PyDict_SetItemString(PySfKeyType.tp_dict, "Num0", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Num1); - PyDict_SetItemString(PySfKeyType.tp_dict, "Num1", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Num2); - PyDict_SetItemString(PySfKeyType.tp_dict, "Num2", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Num3); - PyDict_SetItemString(PySfKeyType.tp_dict, "Num3", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::LControl); - PyDict_SetItemString(PySfKeyType.tp_dict, "LControl", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Num8); - PyDict_SetItemString(PySfKeyType.tp_dict, "Num8", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Num9); - PyDict_SetItemString(PySfKeyType.tp_dict, "Num9", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Tab); - PyDict_SetItemString(PySfKeyType.tp_dict, "Tab", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::RBracket); - PyDict_SetItemString(PySfKeyType.tp_dict, "RBracket", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::End); - PyDict_SetItemString(PySfKeyType.tp_dict, "End", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::BackSlash); - PyDict_SetItemString(PySfKeyType.tp_dict, "BackSlash", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::LShift); - PyDict_SetItemString(PySfKeyType.tp_dict, "LShift", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::E); - PyDict_SetItemString(PySfKeyType.tp_dict, "E", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::C); - PyDict_SetItemString(PySfKeyType.tp_dict, "C", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::G); - PyDict_SetItemString(PySfKeyType.tp_dict, "G", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::K); - PyDict_SetItemString(PySfKeyType.tp_dict, "K", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Up); - PyDict_SetItemString(PySfKeyType.tp_dict, "Up", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::O); - PyDict_SetItemString(PySfKeyType.tp_dict, "O", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::S); - PyDict_SetItemString(PySfKeyType.tp_dict, "S", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::W); - PyDict_SetItemString(PySfKeyType.tp_dict, "W", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::F12); - PyDict_SetItemString(PySfKeyType.tp_dict, "F12", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::F13); - PyDict_SetItemString(PySfKeyType.tp_dict, "F13", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::F10); - PyDict_SetItemString(PySfKeyType.tp_dict, "F10", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::F11); - PyDict_SetItemString(PySfKeyType.tp_dict, "F11", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::F14); - PyDict_SetItemString(PySfKeyType.tp_dict, "F14", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Delete); - PyDict_SetItemString(PySfKeyType.tp_dict, "Delete", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Back); - PyDict_SetItemString(PySfKeyType.tp_dict, "Back", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Tilde); - PyDict_SetItemString(PySfKeyType.tp_dict, "Tilde", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Home); - PyDict_SetItemString(PySfKeyType.tp_dict, "Home", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Pause); - PyDict_SetItemString(PySfKeyType.tp_dict, "Pause", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Add); - PyDict_SetItemString(PySfKeyType.tp_dict, "Add", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::F15); - PyDict_SetItemString(PySfKeyType.tp_dict, "F15", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Subtract); - PyDict_SetItemString(PySfKeyType.tp_dict, "Subtract", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::B); - PyDict_SetItemString(PySfKeyType.tp_dict, "B", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::F); - PyDict_SetItemString(PySfKeyType.tp_dict, "F", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::J); - PyDict_SetItemString(PySfKeyType.tp_dict, "J", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::N); - PyDict_SetItemString(PySfKeyType.tp_dict, "N", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::LBracket); - PyDict_SetItemString(PySfKeyType.tp_dict, "LBracket", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::R); - PyDict_SetItemString(PySfKeyType.tp_dict, "R", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::V); - PyDict_SetItemString(PySfKeyType.tp_dict, "V", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::LSystem); - PyDict_SetItemString(PySfKeyType.tp_dict, "LSystem", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Z); - PyDict_SetItemString(PySfKeyType.tp_dict, "Z", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Left); - PyDict_SetItemString(PySfKeyType.tp_dict, "Left", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::F1); - PyDict_SetItemString(PySfKeyType.tp_dict, "F1", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::F2); - PyDict_SetItemString(PySfKeyType.tp_dict, "F2", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::F3); - PyDict_SetItemString(PySfKeyType.tp_dict, "F3", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::F4); - PyDict_SetItemString(PySfKeyType.tp_dict, "F4", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Divide); - PyDict_SetItemString(PySfKeyType.tp_dict, "Divide", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::F6); - PyDict_SetItemString(PySfKeyType.tp_dict, "F6", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::F7); - PyDict_SetItemString(PySfKeyType.tp_dict, "F7", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::F8); - PyDict_SetItemString(PySfKeyType.tp_dict, "F8", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::F9); - PyDict_SetItemString(PySfKeyType.tp_dict, "F9", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Period); - PyDict_SetItemString(PySfKeyType.tp_dict, "Period", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Down); - PyDict_SetItemString(PySfKeyType.tp_dict, "Down", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::PageDown); - PyDict_SetItemString(PySfKeyType.tp_dict, "PageDown", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Space); - PyDict_SetItemString(PySfKeyType.tp_dict, "Space", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Menu); - PyDict_SetItemString(PySfKeyType.tp_dict, "Menu", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::RControl); - PyDict_SetItemString(PySfKeyType.tp_dict, "RControl", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Slash); - PyDict_SetItemString(PySfKeyType.tp_dict, "Slash", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Return); - PyDict_SetItemString(PySfKeyType.tp_dict, "Return", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Quote); - PyDict_SetItemString(PySfKeyType.tp_dict, "Quote", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::A); - PyDict_SetItemString(PySfKeyType.tp_dict, "A", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Insert); - PyDict_SetItemString(PySfKeyType.tp_dict, "Insert", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::RShift); - PyDict_SetItemString(PySfKeyType.tp_dict, "RShift", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::I); - PyDict_SetItemString(PySfKeyType.tp_dict, "I", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Escape); - PyDict_SetItemString(PySfKeyType.tp_dict, "Escape", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::M); - PyDict_SetItemString(PySfKeyType.tp_dict, "M", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Equal); - PyDict_SetItemString(PySfKeyType.tp_dict, "Equal", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Q); - PyDict_SetItemString(PySfKeyType.tp_dict, "Q", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::U); - PyDict_SetItemString(PySfKeyType.tp_dict, "U", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Y); - PyDict_SetItemString(PySfKeyType.tp_dict, "Y", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Dash); - PyDict_SetItemString(PySfKeyType.tp_dict, "Dash", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::Comma); - PyDict_SetItemString(PySfKeyType.tp_dict, "Comma", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Key::LAlt); - PyDict_SetItemString(PySfKeyType.tp_dict, "LAlt", obj); - Py_DECREF(obj); -} - diff --git a/bindings/python/src/Key.hpp b/bindings/python/src/Key.hpp deleted file mode 100644 index 1af17a21..00000000 --- a/bindings/python/src/Key.hpp +++ /dev/null @@ -1,39 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYKEY_HPP -#define __PYKEY_HPP - -#include - -#include - -typedef struct { - PyObject_HEAD -} PySfKey; - -void -PySfKey_InitConst(); - -#endif diff --git a/bindings/python/src/Listener.cpp b/bindings/python/src/Listener.cpp deleted file mode 100644 index 6ad479e8..00000000 --- a/bindings/python/src/Listener.cpp +++ /dev/null @@ -1,128 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Listener.hpp" - -#include "compat.hpp" - - -static PyObject * -PySfListener_SetGlobalVolume(PySfListener* self, PyObject *args) -{ - sf::Listener::SetGlobalVolume(PyFloat_AsDouble(args)); - Py_RETURN_NONE; -} - -static PyObject * -PySfListener_GetGlobalVolume(PySfListener* self) -{ - return PyFloat_FromDouble(sf::Listener::GetGlobalVolume()); -} - -static PyObject * -PySfListener_SetPosition(PySfListener* self, PyObject *args) -{ - float X, Y, Z; - if (!PyArg_ParseTuple(args, "fff:Listener.SetPosition", &X, &Y, &Z)) - return NULL; - sf::Listener::SetPosition(X, Y, Z); - Py_RETURN_NONE; -} - -static PyObject* -PySfListener_GetPosition(PySfListener *self) -{ - sf::Vector3f Vect = sf::Listener::GetPosition(); - return Py_BuildValue("fff", Vect.x, Vect.y, Vect.z); -} - -static PyObject * -PySfListener_SetDirection(PySfListener* self, PyObject *args) -{ - float X, Y, Z; - if (!PyArg_ParseTuple(args, "fff:Listener.SetDirection", &X, &Y, &Z)) - return NULL; - sf::Listener::SetDirection(X, Y, Z); - Py_RETURN_NONE; -} - -static PyObject* -PySfListener_GetDirection(PySfListener *self) -{ - sf::Vector3f Vect = sf::Listener::GetDirection(); - return Py_BuildValue("fff", Vect.x, Vect.y, Vect.z); -} - -static PyMethodDef PySfListener_methods[] = { - {"SetGlobalVolume", (PyCFunction)PySfListener_SetGlobalVolume, METH_STATIC | METH_O, "SetGlobalVolume(Volume)\nChange the global volume of all the sounds."}, - {"GetGlobalVolume", (PyCFunction)PySfListener_GetGlobalVolume, METH_STATIC | METH_NOARGS, "GetGlobalVolume()\nGet the current value of the global volume of all the sounds."}, - {"SetPosition", (PyCFunction)PySfListener_SetPosition, METH_STATIC | METH_VARARGS, "SetPosition(X, Y, Z)\nChange the position of the listener."}, - {"GetPosition", (PyCFunction)PySfListener_GetPosition, METH_STATIC | METH_NOARGS, "GetPosition()\nGet the current position of the listener."}, - {"SetDirection", (PyCFunction)PySfListener_SetDirection, METH_STATIC | METH_VARARGS, "SetDirection(X, Y, Z)\nChange the orientation of the listener (the point he must look at)"}, - {"GetDirection", (PyCFunction)PySfListener_GetDirection, METH_STATIC | METH_NOARGS, "GetDirection()\nGet the current orientation of the listener (the point he's looking at)"}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfListenerType = { - head_init - "Listener", /*tp_name*/ - sizeof(PySfListener), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - 0, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "Listener is a global interface for defining the audio listener properties ; the audio listener is the point in the scene from where all the sounds are heard.", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfListener_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ -}; - - diff --git a/bindings/python/src/Listener.hpp b/bindings/python/src/Listener.hpp deleted file mode 100644 index 123956b6..00000000 --- a/bindings/python/src/Listener.hpp +++ /dev/null @@ -1,37 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYLISTENER_HPP -#define __PYLISTENER_HPP - -#include - -#include - - -typedef struct { - PyObject_HEAD -} PySfListener; - -#endif diff --git a/bindings/python/src/Mouse.cpp b/bindings/python/src/Mouse.cpp deleted file mode 100644 index f2fe2097..00000000 --- a/bindings/python/src/Mouse.cpp +++ /dev/null @@ -1,102 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Mouse.hpp" - -#include "compat.hpp" - - -static PyObject * -PySfMouse_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfMouse *self; - self = (PySfMouse *)type->tp_alloc(type, 0); - return (PyObject *)self; -} - - -PyTypeObject PySfMouseType = { - head_init - "Mouse", /*tp_name*/ - sizeof(PySfMouse), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - 0, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "Definition of button codes for mouse events.", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfMouse_new, /* tp_new */ -}; - -void PySfMouse_InitConst() -{ - PyObject *obj; - obj = PyLong_FromLong(sf::Mouse::Left); - PyDict_SetItemString(PySfMouseType.tp_dict, "Left", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Mouse::Right); - PyDict_SetItemString(PySfMouseType.tp_dict, "Right", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Mouse::Middle); - PyDict_SetItemString(PySfMouseType.tp_dict, "Middle", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Mouse::XButton1); - PyDict_SetItemString(PySfMouseType.tp_dict, "XButton1", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Mouse::XButton2); - PyDict_SetItemString(PySfMouseType.tp_dict, "XButton2", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Mouse::ButtonCount); - PyDict_SetItemString(PySfMouseType.tp_dict, "ButtonCount", obj); - Py_DECREF(obj); -} - diff --git a/bindings/python/src/Mouse.hpp b/bindings/python/src/Mouse.hpp deleted file mode 100644 index 3e0ca33a..00000000 --- a/bindings/python/src/Mouse.hpp +++ /dev/null @@ -1,39 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYMOUSE_HPP -#define __PYMOUSE_HPP - -#include - -#include - -typedef struct { - PyObject_HEAD -} PySfMouse; - -void -PySfMouse_InitConst(); - -#endif diff --git a/bindings/python/src/Music.cpp b/bindings/python/src/Music.cpp deleted file mode 100644 index 14645e9b..00000000 --- a/bindings/python/src/Music.cpp +++ /dev/null @@ -1,140 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Music.hpp" - -#include "compat.hpp" - - -extern PyTypeObject PySfSoundStreamType; - - -static void -PySfMusic_dealloc(PySfMusic *self) -{ - delete self->obj; - free_object(self); -} - -static PyObject * -PySfMusic_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfMusic *self; - self = (PySfMusic *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->obj = new sf::Music(); - } - return (PyObject *)self; -} - -static PyObject* -PySfMusic_OpenFromMemory(PySfMusic *self, PyObject *args) -{ - unsigned int SizeInBytes; - char *Data; - - if (!PyArg_ParseTuple(args, "s#:Music.OpenFromMemory", &Data, &SizeInBytes)) - return NULL; - - return PyBool_FromLong(self->obj->OpenFromMemory(Data, (std::size_t) SizeInBytes)); -} - -static PyObject* -PySfMusic_OpenFromFile(PySfMusic *self, PyObject *args) -{ - char *path; -#ifdef IS_PY3K - PyObject *string = PyUnicode_AsUTF8String(args); - if (string == NULL) - return NULL; - path = PyBytes_AsString(string); -#else - path = PyString_AsString(args); -#endif - bool result = self->obj->OpenFromFile(path); -#ifdef IS_PY3K - Py_DECREF(string); -#endif - return PyBool_FromLong(result); -} - -static PyObject* -PySfMusic_GetDuration(PySfMusic *self) -{ - return PyFloat_FromDouble((double)(self->obj->GetDuration())); -} - - -static PyMethodDef PySfMusic_methods[] = { - {"OpenFromFile", (PyCFunction)PySfMusic_OpenFromFile, METH_O, "OpenFromFile(Filename)\nOpen a music file (doesn't play it -- call Play() for that). Returns True if loading has been successful.\n Filename : Path of the music file to open"}, - {"OpenFromMemory", (PyCFunction)PySfMusic_OpenFromMemory, METH_VARARGS, "OpenFromMemory(Data)\nOpen a music file (doesn't play it -- call Play() for that). Returns True if loading has been successful.\n Data : string representing the file data in memory"}, - {"GetDuration", (PyCFunction)PySfMusic_GetDuration, METH_NOARGS, "GetDuration()\nGet the sound duration."}, - {NULL} /* Sentinel */ -}; - - -PyTypeObject PySfMusicType = { - head_init - "Music", /*tp_name*/ - sizeof(PySfMusic), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfMusic_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "sf.Music defines a big sound played using streaming, so usually what we call a music :).\n\ -Constructor: sf.Music()", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfMusic_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - &PySfSoundStreamType, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfMusic_new, /* tp_new */ -}; - - diff --git a/bindings/python/src/Music.hpp b/bindings/python/src/Music.hpp deleted file mode 100644 index a69c47d1..00000000 --- a/bindings/python/src/Music.hpp +++ /dev/null @@ -1,37 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYMUSIC_HPP -#define __PYMUSIC_HPP - -#include - -#include - -typedef struct { - PyObject_HEAD - sf::Music *obj; -} PySfMusic; - -#endif diff --git a/bindings/python/src/Rect.cpp b/bindings/python/src/Rect.cpp deleted file mode 100644 index 48afffc2..00000000 --- a/bindings/python/src/Rect.cpp +++ /dev/null @@ -1,394 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Rect.hpp" - -#include - -#include "compat.hpp" -#include "offsetof.hpp" - - -static PyMemberDef PySfIntRect_members[] = { - {(char *)"Left", T_INT, offsetof(PySfIntRect, Left), 0, (char *)"Left coordinate of the rectangle."}, - {(char *)"Top", T_INT, offsetof(PySfIntRect, Top), 0, (char *)"Top coordinate of the rectangle."}, - {(char *)"Right", T_INT, offsetof(PySfIntRect, Right), 0, (char *)"Right coordinate of the rectangle."}, - {(char *)"Bottom", T_INT, offsetof(PySfIntRect, Bottom), 0, (char *)"Bottom coordinate of the rectangle."}, - {NULL} /* Sentinel */ -}; - -static PyMemberDef PySfFloatRect_members[] = { - {(char *)"Left", T_FLOAT, offsetof(PySfFloatRect, Left), 0, (char *)"Left coordinate of the rectangle."}, - {(char *)"Top", T_FLOAT, offsetof(PySfFloatRect, Top), 0, (char *)"Top coordinate of the rectangle."}, - {(char *)"Right", T_FLOAT, offsetof(PySfFloatRect, Right), 0, (char *)"Right coordinate of the rectangle."}, - {(char *)"Bottom", T_FLOAT, offsetof(PySfFloatRect, Bottom), 0, (char *)"Bottom coordinate of the rectangle."}, - {NULL} /* Sentinel */ -}; - -static void -PySfIntRect_dealloc(PySfIntRect* self) -{ - if (self->Owner) - delete self->obj; - free_object(self); -} - -static void -PySfFloatRect_dealloc(PySfFloatRect* self) -{ - if (self->Owner) - delete self->obj; - free_object(self); -} - -static PyObject * -PySfIntRect_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - const char *kwlist[] = {"Left", "Top", "Right", "Bottom", NULL}; - PySfIntRect *self; - self = (PySfIntRect *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->Owner = true; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "iiii:IntRect.__new__", (char **)kwlist, &(self->Left), &(self->Top), &(self->Right), &(self->Bottom))) - return NULL; - self->obj = new sf::IntRect(self->Left, self->Top, self->Right, self->Bottom); - } - return (PyObject *)self; -} - -static PyObject * -PySfFloatRect_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - const char *kwlist[] = {"Left", "Top", "Right", "Bottom", NULL}; - PySfFloatRect *self; - self = (PySfFloatRect *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->Owner = true; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "ffff:FloatRect.__new__", (char **)kwlist, &(self->Left), &(self->Top), &(self->Right), &(self->Bottom))) - return NULL; - self->obj = new sf::FloatRect(self->Left, self->Top, self->Right, self->Bottom); - } - return (PyObject *)self; -} - -static PyObject * -PySfIntRect_GetSize(PySfIntRect *self) -{ - sf::Vector2i size( self->obj->GetSize() ); - return Py_BuildValue( "ii", size.x, size.y ); -} - -static PyObject * -PySfIntRect_Contains(PySfIntRect* self, PyObject *args); - -static PyObject * -PySfIntRect_Intersects(PySfIntRect* self, PyObject *args); - -static PyObject * -PySfFloatRect_GetSize(PySfFloatRect *self) -{ - sf::Vector2f size( self->obj->GetSize() ); - return Py_BuildValue( "ff", size.x, size.y ); -} - -static PyObject * -PySfFloatRect_Contains(PySfFloatRect* self, PyObject *args); - -static PyObject * -PySfFloatRect_Intersects(PySfFloatRect* self, PyObject *args); - -static PyObject * -PySfIntRect_Offset(PySfIntRect* self, PyObject *args) -{ - int OffsetX, OffsetY; - - if (!PyArg_ParseTuple(args, "ii:IntRect.Offset", &OffsetX, &OffsetY)) - return NULL; - - self->obj->Offset(OffsetX, OffsetY); - PySfIntRectUpdateSelf(self); - Py_RETURN_NONE; -} - -static PyObject * -PySfFloatRect_Offset(PySfFloatRect* self, PyObject *args) -{ - float OffsetX, OffsetY; - - if (!PyArg_ParseTuple(args, "ff:FloatRect.Offset", &OffsetX, &OffsetY)) - return NULL; - - self->obj->Offset(OffsetX, OffsetY); - PySfFloatRectUpdateSelf(self); - Py_RETURN_NONE; -} - - -static PyMethodDef PySfIntRect_methods[] = { - {"Offset", (PyCFunction)PySfIntRect_Offset, METH_VARARGS, "Offset(OffsetX, OffsetY)\n\ -Move the whole rectangle by the given offset.\n\ - OffsetX : Horizontal offset\n\ - OffsetY : Vertical offset\n\ -"}, - {"GetSize", (PyCFunction)PySfIntRect_GetSize, METH_NOARGS, "GetSize()\nGet the rectangle's size."}, - {"Contains", (PyCFunction)PySfIntRect_Contains, METH_VARARGS, "Contains(X, Y)\n\ -Check if a point is inside the rectangle's area.\n\ - X : X coordinate of the point to test\n\ - Y : Y coordinate of the point to test"}, - {"Intersects", (PyCFunction)PySfIntRect_Intersects, METH_VARARGS, "Intersects(Rectangle, OverlappingRect=None)\n\ -Check intersection between two rectangles.\n\ - Rectangle : Rectangle to test\n\ - OverlappingRect : Rectangle to be filled with overlapping rect (None by default)"}, - {NULL} /* Sentinel */ -}; - - -static PyMethodDef PySfFloatRect_methods[] = { - {"Offset", (PyCFunction)PySfFloatRect_Offset, METH_VARARGS, "Offset(OffsetX, OffsetY)\n\ -Move the whole rectangle by the given offset.\n\ - OffsetX : Horizontal offset\n\ - OffsetY : Vertical offset\n\ -"}, - {"GetSize", (PyCFunction)PySfFloatRect_GetSize, METH_NOARGS, "GetSize()\nGet the rectangle's size."}, - {"Contains", (PyCFunction)PySfFloatRect_Contains, METH_VARARGS, "Contains(X, Y)\n\ -Check if a point is inside the rectangle's area.\n\ - X : X coordinate of the point to test\n\ - Y : Y coordinate of the point to test"}, - {"Intersects", (PyCFunction)PySfFloatRect_Intersects, METH_VARARGS, "Intersects(Rectangle, OverlappingRect=None)\n\ -Check intersection between two rectangles.\n\ - Rectangle : Rectangle to test\n\ - OverlappingRect : Rectangle to be filled with overlapping rect (None by default)"}, - {NULL} /* Sentinel */ -}; - -int -PySfIntRect_setattro(PyObject* self, PyObject *attr_name, PyObject *v) -{ - int result = PyObject_GenericSetAttr(self, attr_name, v); - PySfIntRect *Rect = (PySfIntRect *)self; - PySfIntRectUpdateObj(Rect); - return result; -} - -int -PySfFloatRect_setattro(PyObject* self, PyObject *attr_name, PyObject *v) -{ - int result = PyObject_GenericSetAttr(self, attr_name, v); - PySfFloatRect *Rect = (PySfFloatRect *)self; - PySfFloatRectUpdateObj(Rect); - return result; -} - -PyTypeObject PySfIntRectType = { - head_init - "IntRect", /*tp_name*/ - sizeof(PySfIntRect), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfIntRect_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - PySfIntRect_setattro, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "sf.IntRect is an utility class for manipulating rectangles.", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfIntRect_methods, /* tp_methods */ - PySfIntRect_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfIntRect_new, /* tp_new */ -}; - - -PyTypeObject PySfFloatRectType = { - head_init - "FloatRect", /*tp_name*/ - sizeof(PySfFloatRect), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfFloatRect_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - PySfFloatRect_setattro, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "sf.FloatRect is an utility class for manipulating rectangles.", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfFloatRect_methods, /* tp_methods */ - PySfFloatRect_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfFloatRect_new, /* tp_new */ -}; - - -static PyObject * -PySfFloatRect_Contains(PySfFloatRect* self, PyObject *args) -{ - float x=0, y=0; - - if (!PyArg_ParseTuple(args, "ff:FloatRect.Contains", &x, &y)) - return NULL; - - return PyBool_FromLong(self->obj->Contains(x,y)); -} - -static PyObject * -PySfFloatRect_Intersects(PySfFloatRect* self, PyObject *args) -{ - PySfFloatRect *Rect=NULL, *Intersection=NULL; - bool result; - - if (!PyArg_ParseTuple(args, "O!|O!:FloatRect.Intersects", &PySfFloatRectType, &Rect, &PySfFloatRectType, &Intersection)) - return NULL; - - if (Intersection) - result = self->obj->Intersects(*(Rect->obj), *(Intersection->obj)); - else - result = self->obj->Intersects(*(Rect->obj)); - - return PyBool_FromLong(result); -} - - -static PyObject * -PySfIntRect_Contains(PySfIntRect* self, PyObject *args) -{ - unsigned int x=0, y=0; - - if (!PyArg_ParseTuple(args, "II:IntRect.Contains", &x, &y)) - return NULL; - - return PyBool_FromLong(self->obj->Contains(x,y)); -} - -static PyObject * -PySfIntRect_Intersects(PySfIntRect* self, PyObject *args) -{ - PySfIntRect *Rect=NULL, *Intersection=NULL; - bool result; - - if (!PyArg_ParseTuple(args, "O!|O!:IntRect.Intersects", &PySfIntRectType, &Rect, &PySfIntRectType, &Intersection)) - return NULL; - - if (Intersection) - result = self->obj->Intersects(*(Rect->obj), *(Intersection->obj)); - else - result = self->obj->Intersects(*(Rect->obj)); - - return PyBool_FromLong(result); -} - -void -PySfIntRectUpdateObj(PySfIntRect *self) -{ - self->obj->Left = self->Left; - self->obj->Right = self->Right; - self->obj->Top = self->Top; - self->obj->Bottom = self->Bottom; -} - -void -PySfFloatRectUpdateObj(PySfFloatRect *self) -{ - self->obj->Left = self->Left; - self->obj->Right = self->Right; - self->obj->Top = self->Top; - self->obj->Bottom = self->Bottom; -} - -void -PySfIntRectUpdateSelf(PySfIntRect *self) -{ - self->Left = self->obj->Left; - self->Right = self->obj->Right; - self->Top = self->obj->Top; - self->Bottom = self->obj->Bottom; -} - -void -PySfFloatRectUpdateSelf(PySfFloatRect *self) -{ - self->Left = self->obj->Left; - self->Right = self->obj->Right; - self->Top = self->obj->Top; - self->Bottom = self->obj->Bottom; -} - -PySfIntRect * -GetNewPySfIntRect() -{ - return PyObject_New(PySfIntRect, &PySfIntRectType); -} - -PySfFloatRect * -GetNewPySfFloatRect() -{ - return PyObject_New(PySfFloatRect, &PySfFloatRectType); -} - - diff --git a/bindings/python/src/Rect.hpp b/bindings/python/src/Rect.hpp deleted file mode 100644 index 69385f45..00000000 --- a/bindings/python/src/Rect.hpp +++ /dev/null @@ -1,70 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYRECT_HPP -#define __PYRECT_HPP - -#include - -#include - -typedef struct { - PyObject_HEAD - bool Owner; - int Left; - int Right; - int Top; - int Bottom; - sf::IntRect *obj; -} PySfIntRect; - -typedef struct { - PyObject_HEAD - bool Owner; - float Left; - float Right; - float Top; - float Bottom; - sf::FloatRect *obj; -} PySfFloatRect; - -PySfIntRect * -GetNewPySfIntRect(); - -PySfFloatRect * -GetNewPySfFloatRect(); - -void -PySfIntRectUpdateObj(PySfIntRect *self); - -void -PySfFloatRectUpdateObj(PySfFloatRect *self); - -void -PySfIntRectUpdateSelf(PySfIntRect *self); - -void -PySfFloatRectUpdateSelf(PySfFloatRect *self); - -#endif diff --git a/bindings/python/src/RenderQueue.cpp b/bindings/python/src/RenderQueue.cpp deleted file mode 100644 index b14acae8..00000000 --- a/bindings/python/src/RenderQueue.cpp +++ /dev/null @@ -1,94 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007-2009 Rémi Koenig (remi.k2620@gmail.com) -// Stefan "Tank" Schindler -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "RenderQueue.hpp" - -#include "compat.hpp" - -static void -PySfRenderQueue_dealloc(PySfRenderQueue* self) -{ - delete self->obj; - free_object( self ); -} - -static PyObject* -PySfRenderQueue_new(PyTypeObject* type, PyObjects* args, PyObject* kwds) -{ - PySfRenderQueue* self(static_cast(type->tp_alloc(type, 0))); - - if(self != 0) - { - self->obj = new sf::RenderQueue(); - } - - return static_cast( self ) -} - -static PyMethodDef PySfImage_methods[] = { - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfImageType = { - head_init - "RenderQueue", /*tp_name*/ - sizeof(PySfRenderQueue), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfRenderQueue_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "Implements a queue of rendering commands.\n\ -Default constructor : sf.RenderQueue()" /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfRenderQueue_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfRenderQueue_new, /* tp_new */ -}; diff --git a/bindings/python/src/RenderQueue.hpp b/bindings/python/src/RenderQueue.hpp deleted file mode 100644 index ecce3cec..00000000 --- a/bindings/python/src/RenderQueue.hpp +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007-2009 Rémi Koenig (remi.k2620@gmail.com) -// Stefan "Tank" Schindler -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYRENDERQUEUE_H -#define __PYRENDERQUEUE_H - -#include - -#include - -struct PySfRenderQueue { - PyObject_HEAD - sf::RenderQueue* obj; -}; - -PySfRenderQueue* GetNewPySfRenderQueue(); - -#endif diff --git a/bindings/python/src/RenderWindow.cpp b/bindings/python/src/RenderWindow.cpp deleted file mode 100644 index d167b42d..00000000 --- a/bindings/python/src/RenderWindow.cpp +++ /dev/null @@ -1,286 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "RenderWindow.hpp" -#include "Image.hpp" -#include "Window.hpp" -#include "Color.hpp" -#include "Drawable.hpp" - -#include "compat.hpp" - -#include - - -extern PyTypeObject PySfViewType; -extern PyTypeObject PySfWindowType; -extern PyTypeObject PySfRenderWindowType; -extern PyTypeObject PySfColorType; -extern PyTypeObject PySfDrawableType; - - -static void -PySfRenderWindow_dealloc(PySfRenderWindow* self) -{ - Py_CLEAR(self->View); - delete self->obj; - free_object(self); -} - -static PyObject * -PySfRenderWindow_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfRenderWindow *self; - self = (PySfRenderWindow *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->obj = new sf::RenderWindow(); - self->View = NULL; - } - return (PyObject *)self; -} - -static PyObject * -PySfRenderWindow_ConvertCoords(PySfRenderWindow *self, PyObject *args) -{ - unsigned int WindowX, WindowY; - PySfView *PyTargetView = NULL; - sf::Vector2f Vect; - - if (!PyArg_ParseTuple(args, "II|O!:RenderWindow.ConvertCoords", &WindowX, &WindowY, &PySfViewType, &PyTargetView)) - return NULL; - - if (PyTargetView) - { - Vect = self->obj->ConvertCoords(WindowX, WindowY, *PyTargetView->obj); - } - else - { - Vect = self->obj->ConvertCoords(WindowX, WindowY); - } - - return Py_BuildValue("ff", Vect.x, Vect.y); -} - -static bool -PySfRenderWindow_DrawObject(PySfRenderWindow *RenderWindow, PySfDrawable *Obj) -{ - if (PyObject_TypeCheck((PyObject *)Obj, &PySfDrawableType)) - { - if (Obj->IsCustom) - { - Py_CLEAR(Obj->obj->RenderWindow); - Py_INCREF(RenderWindow); - Obj->obj->RenderWindow = RenderWindow; - } - RenderWindow->obj->Draw(*(Obj->obj)); - return true; - } - return false; -} - -static PyObject * -PySfRenderWindow_Draw(PySfRenderWindow *self, PyObject *args) -{ - if (args == NULL) - return NULL; - if (!PySfRenderWindow_DrawObject(self, (PySfDrawable *)args)) - { - PyObject *iterator = PyObject_GetIter(args); - PyObject *item; - PyErr_Clear(); - if (iterator == NULL) - { - PyErr_SetString(PyExc_TypeError, "Argument to Draw method is neither a Drawable nor an iterable."); - return NULL; - } - while ((item = PyIter_Next(iterator))) - { - if (!PySfRenderWindow_DrawObject(self, (PySfDrawable *)item)) - { - PyErr_SetString(PyExc_TypeError, "Object in iterable not a Drawable."); - return NULL; - } - Py_DECREF(item); - } - Py_DECREF(iterator); - } - if (PyErr_Occurred()) - return NULL; - Py_RETURN_NONE; -} - - -static PyObject * -PySfRenderWindow_Clear(PySfRenderWindow *self, PyObject *args) -{ - PySfColor *Color = NULL; - if (!PyArg_ParseTuple(args, "|O!:RenderWindow.Clear", &PySfColorType, &Color)) - return NULL; - if (Color == NULL) self->obj->Clear(sf::Color::Black); - else - { - PySfColorUpdate(Color); - self->obj->Clear(*(Color->obj)); - } - Py_RETURN_NONE; -} - -static PyObject * -PySfRenderWindow_SetActive(PySfRenderWindow *self, PyObject *args) -{ - PyObject* Active( 0 ); - - PyArg_ParseTuple( args, "|O", &Active ); - self->obj->SetActive( Active == 0 ? true : PyBool_AsBool( Active ) ); - - Py_RETURN_NONE; -} - -static PyObject * -PySfRenderWindow_GetView(PySfRenderWindow *self) -{ - if (self->View != NULL) - { - Py_INCREF(self->View); - return (PyObject *)(self->View); - } - else - { - PySfView *View; - - View = GetNewPySfView(); - View->Owner = false; - View->obj = (sf::View *)&(self->obj->GetView()); - Py_INCREF(View); - self->View = View; - return (PyObject *)View; - } -} - -static PyObject * -PySfRenderWindow_SetView(PySfRenderWindow* self, PyObject *args) -{ - PySfView *View = (PySfView *)args; - if (!PyObject_TypeCheck(View, &PySfViewType)) - { - PyErr_SetString(PyExc_TypeError, "RenderWindow.SetView() Argument is not a sf.View"); - return NULL; - } - Py_CLEAR(self->View); - Py_INCREF(View); - self->View = View; - self->obj->SetView(*(View->obj)); - Py_RETURN_NONE; -} - -static PyObject * -PySfRenderWindow_GetDefaultView(PySfRenderWindow *self) -{ - PySfView *View; - - View = GetNewPySfView(); - View->Owner = false; - - // Python doesn't know anything about 'const', so cast away. Be careful with - // not changing the default view! - View->obj = const_cast( &( self->obj->GetDefaultView() ) ); - - return (PyObject *)View; -} - -static PyMethodDef PySfRenderWindow_methods[] = { - {"SetActive", (PyCFunction)PySfRenderWindow_SetActive, METH_VARARGS, "SetActive(Active)\n\ -Activate or deactivate the window as the current target for OpenGL rendering.\n\ - Active : True to activate window. (default: True)"}, - {"Clear", (PyCFunction)PySfRenderWindow_Clear, METH_VARARGS, "Clear(FillColor)\n\ -Clear the entire target with a single color.\n\ - FillColor : Color to use to clear the render target."}, - {"GetDefaultView", (PyCFunction)PySfRenderWindow_GetDefaultView, METH_NOARGS, "GetDefaultView()\n\ -Get the default view of the window for read / write (returns a sf.View instance)."}, - {"GetView", (PyCFunction)PySfRenderWindow_GetView, METH_NOARGS, "GetView()\n\ -Get the current view rectangle (returns a sf.View instance)."}, - {"SetView", (PyCFunction)PySfRenderWindow_SetView, METH_O, "SetView(View)\n\ -Change the current active view. View must be a sf.View instance."}, - {"Draw", (PyCFunction)PySfRenderWindow_Draw, METH_O, "Draw(Drawable)\n\ -Draw something on the window. The argument can be a drawable or any object supporting the iterator protocol and containing drawables (for example a tuple of drawables)."}, - {"ConvertCoords", (PyCFunction)PySfRenderWindow_ConvertCoords, METH_VARARGS, "ConvertCoords(WindowX, WindowY, TargetView)\n\ -Convert a point in window coordinates into view coordinates. Returns a tuple of two floats.\n\ - WindowX : X coordinate of the point to convert, relative to the window\n\ - WindowY : Y coordinate of the point to convert, relative to the window\n\ - TargetView : Target view to convert the point to (NULL by default -- uses the current view)."}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfRenderWindowType = { - head_init - "RenderWindow", /*tp_name*/ - sizeof(PySfRenderWindow), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfRenderWindow_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "Simple wrapper for sf.Window that allows easy 2D rendering.\n\ -Default constructor : sf.RenderWindow()\n\ -Construct a new window : sf.RenderWindow(Mode, Title, Style::Resize|Style::Close, Params = WindowSettings())\n\ - Mode : Video mode to use\n\ - Title : Title of the window\n\ - WindowStyle : Window style (Resize | Close by default)\n\ - Params : Creation parameters (see default constructor for default values)\n\ -Construct the window from an existing control : sf.RenderWindow(Handle, Params)\n\ - Handle : handle of the control (long integer)\n\ - Params : Creation parameters (see default constructor for default values)", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfRenderWindow_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - &PySfWindowType, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfRenderWindow_new, /* tp_new */ -}; - - diff --git a/bindings/python/src/RenderWindow.hpp b/bindings/python/src/RenderWindow.hpp deleted file mode 100644 index 0a488977..00000000 --- a/bindings/python/src/RenderWindow.hpp +++ /dev/null @@ -1,41 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYRENDERWINDOW_HPP -#define __PYRENDERWINDOW_HPP - -#include - -#include - -#include "View.hpp" - -typedef struct { - PyObject_HEAD - sf::RenderWindow *obj; - PySfView *View; -} PySfRenderWindow; - - -#endif diff --git a/bindings/python/src/Shader.cpp b/bindings/python/src/Shader.cpp deleted file mode 100644 index 2a5dd383..00000000 --- a/bindings/python/src/Shader.cpp +++ /dev/null @@ -1,194 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Shader.hpp" -#include "Drawable.hpp" -#include "Image.hpp" - -#include "compat.hpp" - - -extern PyTypeObject PySfImageType; -extern PyTypeObject PySfDrawableType; - - -static void -PySfShader_dealloc(PySfShader *self) -{ - delete self->obj; - free_object(self); -} - -static PyObject * -PySfShader_new(PyTypeObject *type, PyObject *args, PyObject *kwds); - -static PyObject * -PySfShader_LoadFromFile (PySfShader *self, PyObject *args) -{ - load_from_file(self, args); -} - -static PyObject * -PySfShader_LoadFromMemory (PySfShader *self, PyObject *args) -{ - char *effect; -#ifdef IS_PY3K - PyObject *string = PyUnicode_AsUTF8String(args); - if (string == NULL) - return NULL; - effect = PyBytes_AsString(string); -#else - effect = PyString_AsString(args); -#endif - bool result = self->obj->LoadFromMemory(effect); -#ifdef IS_PY3K - Py_DECREF(string); -#endif - return PyBool_FromLong(result); -} - -static PyObject * PySfShader_SetParameter(PySfShader* self, PyObject *args) { char *Name; float X, Y, Z, W; int size = PyTuple_Size(args); if (!PyArg_ParseTuple(args, "sf|fff:Shader.SetParameter", &Name, &X, &Y, &Z, &W)) return NULL; - - switch (size) - { - case 2: - self->obj->SetParameter(Name, X); - break; - case 3: - self->obj->SetParameter(Name, X, Y); - break; - case 4: - self->obj->SetParameter(Name, X, Y, Z); - break; - case 5: - self->obj->SetParameter(Name, X, Y, Z, W); - break; - default: - break; - } - - Py_RETURN_NONE; -} - -static PyObject * -PySfShader_SetTexture(PySfShader* self, PyObject *args) -{ - PySfImage *Image = NULL; - char *Name; - if (! PyArg_ParseTuple(args, "sO", &Name, &Image)) - { - return NULL; - } - - if (!PyObject_TypeCheck(Image, &PySfImageType)) - { - PyErr_SetString(PyExc_TypeError, "Shader.SetTexture() Argument 2 must be an sf.Image instance."); - return NULL; - } - - self->obj->SetTexture(Name, *Image->obj); - - Py_RETURN_NONE; -} - -static PyObject * -PySfShader_IsAvailable(PySfShader* self, PyObject *args) -{ - return PyBool_FromLong(sf::Shader::IsAvailable()); -} - - -static PyMethodDef PySfShader_methods[] = { - {"LoadFromFile", (PyCFunction)PySfShader_LoadFromFile, METH_O, "LoadFromFile(Filename)\nLoad the effect from a file."}, - {"LoadFromMemory", (PyCFunction)PySfShader_LoadFromMemory, METH_O, "LoadFromMemory(Effect)\nLoad the effect from a text in memory."}, - {"SetParameter", (PyCFunction)PySfShader_SetParameter, METH_VARARGS, "SetParameter(X), SetParameter(X, Y), SetParameter(X, Y, Z), SetParameter(X, Y, Z, W)\nChange a parameter of the effect.\n\ - Name : Parameter name in the effect\n\ - X,Y,Z,W : Values to assign."}, - {"SetTexture", (PyCFunction)PySfShader_SetTexture, METH_VARARGS, "SetTexture(Name, Texture)\nSet a texture parameter.\n\ - Name : Texture name in the effect\n\ - Texture : Image to set (pass sf.Shader.CurrentTexture to use content of current framebuffer)"}, - {"IsAvailable", (PyCFunction)PySfShader_IsAvailable, METH_STATIC | METH_NOARGS, "IsAvailable()\nTell wether or not the system supports post-effects."}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfShaderType = { - head_init - "Shader", /*tp_name*/ - sizeof(PySfShader), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfShader_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "sf.Shader is used to apply a post effect to a window.\n\ -Default constructor : sf.Shader()\n\ -Copy constructor : sf.Shader(Copy) where Copy is a sf.Shader instance.", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfShader_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - &PySfDrawableType, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfShader_new, /* tp_new */ -}; - - -static PyObject * -PySfShader_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfShader *self; - self = (PySfShader *)type->tp_alloc(type, 0); - if (self != NULL) - { - PySfShader *Copy = NULL; - self->IsCustom = false; - if (!PyArg_ParseTuple(args, "|O!", &PySfShaderType, &Copy)) - return NULL; - if (Copy) self->obj = new sf::Shader(*(Copy->obj)); - else self->obj = new sf::Shader(); - } - return (PyObject *)self; -} diff --git a/bindings/python/src/Shader.hpp b/bindings/python/src/Shader.hpp deleted file mode 100644 index ebfcde32..00000000 --- a/bindings/python/src/Shader.hpp +++ /dev/null @@ -1,38 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYPOSTFX_HPP -#define __PYPOSTFX_HPP - -#include - -#include - -typedef struct { - PyObject_HEAD - bool IsCustom; - sf::Shader *obj; -} PySfShader; - -#endif diff --git a/bindings/python/src/Shape.cpp b/bindings/python/src/Shape.cpp deleted file mode 100644 index 6ac2dd4a..00000000 --- a/bindings/python/src/Shape.cpp +++ /dev/null @@ -1,379 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Shape.hpp" - -#include -#include "Color.hpp" - -#include "compat.hpp" - -extern PyTypeObject PySfColorType; -extern PyTypeObject PySfDrawableType; - - -static void -PySfShape_dealloc(PySfShape* self) -{ - delete self->obj; - free_object(self); -} - -static PyObject * -PySfShape_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfShape *self; - self = (PySfShape *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->obj = new sf::Shape(); - self->IsCustom = false; - } - return (PyObject *)self; -} - -// void AddPoint(float X, float Y, const Color& Col = Color(255, 255, 255), const Color& OutlineCol = Color(0, 0, 0)); -static PyObject * -PySfShape_AddPoint(PySfShape* self, PyObject *args, PyObject *kwds) -{ - const char *kwlist[] = {"X", "Y", "Col", "OutlineCol", NULL}; - float X, Y; - sf::Color *Col, *OutlineCol; - PySfColor *ColTmp=NULL, *OutlineColTmp=NULL; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "ff|O!O!:Shape.AddPoint", (char **)kwlist, &X, &Y, &PySfColorType, &ColTmp, &PySfColorType, &OutlineColTmp)) - return NULL; - - if (ColTmp) - { - PySfColorUpdate(ColTmp); - Col = ColTmp->obj; - } - else - Col = (sf::Color *)&sf::Color::White; - - if (OutlineColTmp) - { - PySfColorUpdate(OutlineColTmp); - OutlineCol = OutlineColTmp->obj; - } - else - OutlineCol = (sf::Color *)&sf::Color::Black; - - self->obj->AddPoint(X, Y, *Col, *OutlineCol); - - Py_RETURN_NONE; -} - -static PyObject * -PySfShape_SetOutlineWidth(PySfShape* self, PyObject *args) -{ - self->obj->SetOutlineWidth(PyFloat_AsDouble(args)); - Py_RETURN_NONE; -} - -static PyObject * -PySfShape_GetOutlineWidth(PySfShape* self) -{ - return PyFloat_FromDouble(self->obj->GetOutlineWidth()); -} - -// static Shape Line(float X0, float Y0, float X1, float Y1, float Thickness, const Color& Col, float Outline = 0.f, const Color& OutlineCol = sf::Color(0, 0, 0)); -static PyObject * -PySfShape_Line(PySfShape* self, PyObject *args, PyObject *kwds) -{ - const char *kwlist[] = {"X0", "Y0", "X1", "Y1", "Thickness", "Col", "Outline", "OutlineCol", NULL}; - PySfShape *Line = GetNewPySfShape(); - float X0, Y0, X1, Y1, Thickness, Outline = 0.f; - sf::Color *OutlineCol; - PySfColor *ColTmp, *OutlineColTmp=NULL; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "fffffO!|fO!:Shape.Line", (char **)kwlist, &X0, &Y0, &X1, &Y1, &Thickness, &PySfColorType, &ColTmp, &Outline, &PySfColorType, &OutlineColTmp)) - return NULL; - if (OutlineColTmp) - { - PySfColorUpdate(OutlineColTmp); - OutlineCol = OutlineColTmp->obj; - } - else - OutlineCol = (sf::Color *)&sf::Color::Black; - - PySfColorUpdate(ColTmp); - Line->obj = new sf::Shape(sf::Shape::Line(X0, Y0, X1, Y1, Thickness, *(ColTmp->obj), Outline, *OutlineCol)); - return (PyObject *)Line; -} - -// static Shape Rectangle(float X0, float Y0, float X1, float Y1, const Color& Col, float Outline = 0.f, const Color& OutlineCol = sf::Color(0, 0, 0)); -static PyObject * -PySfShape_Rectangle(PySfShape* self, PyObject *args, PyObject *kwds) -{ - const char *kwlist[] = {"X0", "Y0", "X1", "Y1", "Col", "Outline", "OutlineCol", NULL}; - PySfShape *Rectangle = GetNewPySfShape(); - float X0, Y0, X1, Y1, Outline = 0.f; - sf::Color *OutlineCol; - PySfColor *ColTmp, *OutlineColTmp=NULL; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "ffffO!|fO!:Shape.Rectangle", (char **)kwlist, &X0, &Y0, &X1, &Y1, &PySfColorType, &ColTmp, &Outline, &PySfColorType, &OutlineColTmp)) - return NULL; - if (OutlineColTmp) - { - PySfColorUpdate(OutlineColTmp); - OutlineCol = OutlineColTmp->obj; - } - else - OutlineCol = (sf::Color *)&sf::Color::Black; - - PySfColorUpdate(ColTmp); - Rectangle->obj = new sf::Shape(sf::Shape::Rectangle(X0, Y0, X1, Y1, *(ColTmp->obj), Outline, *OutlineCol)); - return (PyObject *)Rectangle; -} - -// static Shape Circle(float X, float Y, float Radius, const Color& Col, float Outline = 0.f, const Color& OutlineCol = sf::Color(0, 0, 0)); -static PyObject * -PySfShape_Circle(PySfShape* self, PyObject *args, PyObject *kwds) -{ - const char *kwlist[] = {"X", "Y", "Radius", "Col", "Outline", "OutlineCol", NULL}; - PySfShape *Circle = GetNewPySfShape(); - float X, Y, Radius, Outline = 0.f; - sf::Color *OutlineCol; - PySfColor *ColTmp, *OutlineColTmp=NULL; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "fffO!|fO!:Shape.Circle", (char **)kwlist, &X, &Y, &Radius, &PySfColorType, &ColTmp, &Outline, &PySfColorType, &OutlineColTmp)) - return NULL; - if (OutlineColTmp) - { - PySfColorUpdate(OutlineColTmp); - OutlineCol = OutlineColTmp->obj; - } - else - OutlineCol = (sf::Color *)&sf::Color::Black; - - PySfColorUpdate(ColTmp); - Circle->obj = new sf::Shape(sf::Shape::Circle(X, Y, Radius, *(ColTmp->obj), Outline, *OutlineCol)); - return (PyObject *)Circle; -} - -static PyObject * -PySfShape_GetPointPosition(PySfShape* self, PyObject *args) -{ - sf::Vector2f result = self->obj->GetPointPosition(PyLong_AsUnsignedLong(args)); - return Py_BuildValue("ff", result.x, result.y); -} - -static PyObject * -PySfShape_GetPointColor(PySfShape* self, PyObject *args) -{ - PySfColor *PyColor = GetNewPySfColor(); - PyColor->obj = new sf::Color(self->obj->GetPointColor(PyLong_AsUnsignedLong(args))); - PyColor->r = PyColor->obj->r; - PyColor->g = PyColor->obj->g; - PyColor->b = PyColor->obj->b; - PyColor->a = PyColor->obj->a; - return (PyObject *)PyColor; -} - -static PyObject * -PySfShape_GetPointOutlineColor(PySfShape* self, PyObject *args) -{ - PySfColor *PyColor = GetNewPySfColor(); - PyColor->obj = new sf::Color(self->obj->GetPointOutlineColor(PyLong_AsUnsignedLong(args))); - PyColor->r = PyColor->obj->r; - PyColor->g = PyColor->obj->g; - PyColor->b = PyColor->obj->b; - PyColor->a = PyColor->obj->a; - return (PyObject *)PyColor; -} - -static PyObject * -PySfShape_SetPointPosition(PySfShape* self, PyObject *args) -{ - unsigned int Index; - float X, Y; - if (!PyArg_ParseTuple(args, "Iff:Shape.SetPointPosition", &Index, &X, &Y)) - return NULL; - self->obj->SetPointPosition(Index, X, Y); - Py_RETURN_NONE; -} - -static PyObject * -PySfShape_SetPointColor(PySfShape* self, PyObject *args) -{ - unsigned int Index; - PySfColor *Color; - if (!PyArg_ParseTuple(args, "IO!:Shape.SetPointColor", &Index, &PySfColorType, &Color)) - return NULL; - PySfColorUpdate(Color); - self->obj->SetPointColor(Index, *(Color->obj)); - Py_RETURN_NONE; -} - -static PyObject * -PySfShape_SetPointOutlineColor(PySfShape* self, PyObject *args) -{ - unsigned int Index; - PySfColor *Color; - if (!PyArg_ParseTuple(args, "IO!:Shape.SetPointOutlineColor", &Index, &PySfColorType, &Color)) - return NULL; - PySfColorUpdate(Color); - self->obj->SetPointOutlineColor(Index, *(Color->obj)); - Py_RETURN_NONE; -} - -static PyObject * -PySfShape_GetNbPoints(PySfShape* self, PyObject *args) -{ - return PyLong_FromUnsignedLong(self->obj->GetNbPoints()); -} - -static PyObject * -PySfShape_EnableFill(PySfShape* self, PyObject *args) -{ - self->obj->EnableFill(PyBool_AsBool(args)); - Py_RETURN_NONE; -} - -static PyObject * -PySfShape_EnableOutline(PySfShape* self, PyObject *args) -{ - self->obj->EnableOutline(PyBool_AsBool(args)); - Py_RETURN_NONE; -} - -static PyMethodDef PySfShape_methods[] = { - {"GetPointPosition", (PyCFunction)PySfShape_GetPointPosition, METH_O, "GetPointPosition(Index)\n\ -Get the position of a point.\n\ - Index : Index-th point."}, - {"GetPointColor", (PyCFunction)PySfShape_GetPointColor, METH_O, "GetPointColor(Index)\n\ -Get the color of a point.\n Index : Index-th point."}, - {"GetPointOutlineColor", (PyCFunction)PySfShape_GetPointOutlineColor, METH_O, "GetPointOutlineColor(Index)\n\ -Get the outline color of a point.\n Index : Index-th point."}, - {"SetPointPosition", (PyCFunction)PySfShape_SetPointPosition, METH_VARARGS, "SetPointPosition(Index, X, Y).\n\ -Set the position of a point\n\ - Index : Index of the point, in range [0, GetNbPoints() - 1]\n\ - X : New X coordinate of the Index-th point\n\ - Y : New Y coordinate of the Index-th point."}, - {"SetPointColor", (PyCFunction)PySfShape_SetPointColor, METH_VARARGS, "SetPointColor(Index, Color).\n\ -Set the color of a point\n\ - Index : Index of the point, in range [0, GetNbPoints() - 1]\n\ - Col : New color of the Index-th point."}, - {"SetPointOutlineColor", (PyCFunction)PySfShape_SetPointOutlineColor, METH_VARARGS, "SetPointOutlineColor(Index, Color).\n\ -Set the outline color of a point\n\ - Index : Index of the point, in range [0, GetNbPoints() - 1]\n\ - Col : New color of the Index-th point."}, - {"GetNbPoints", (PyCFunction)PySfShape_GetNbPoints, METH_NOARGS, "GetNbPoints()\n\ -Get the number of points composing the shape."}, - {"EnableFill", (PyCFunction)PySfShape_EnableFill, METH_O, "EnableFill(Enable)\n\ -Enable or disable filling the shape. Fill is enabled by default.\n\ - Enable : True to enable, false to disable."}, - {"EnableOutline", (PyCFunction)PySfShape_EnableOutline, METH_O, "EnableOutline(Enable)\n\ -Enable or disable drawing the shape outline. Outline is enabled by default.\n\ - Enable : True to enable, false to disable"}, - {"AddPoint", (PyCFunction)PySfShape_AddPoint, METH_VARARGS | METH_KEYWORDS, "AddPoint(X, Y, Col=sf.Color.White, OutlineCol=sf.Color.Black)\n\ -Add a point to the shape.\n\ - X : X coordinate of the point\n\ - Y : Y coordinate of the point\n\ - Col : Color of the point (white by default)\n\ - OutlineCol : Outline color of the point (black by default)."}, - {"SetOutlineWidth", (PyCFunction)PySfShape_SetOutlineWidth, METH_O, "SetOutlineWidth(Width)\n\ -Change the width of the shape outline.\n\ - Width : New width (use 0 to remove the outline)."}, - {"GetOutlineWidth", (PyCFunction)PySfShape_GetOutlineWidth, METH_NOARGS, "GetOutlineWidth()\n\ -Get the width of the shape outline."}, - {"Line", (PyCFunction)PySfShape_Line, METH_STATIC | METH_VARARGS | METH_KEYWORDS, "Line(X0, Y0, X1, Y1, Thickness, Col, Outline = 0., OutlineCol = sf.Color(0, 0, 0))\n\ -Create a shape made of a single line.\n\ - X0 : X coordinate of the first point.\n\ - Y0 : Y coordinate of the first point.\n\ - X1 : X coordinate of the second point.\n\ - Y1 : Y coordinate of the second point.\n\ - Thickness : Line thickness.\n\ - Col : Color used to draw the line\n\ - Outline : Outline width (0 by default)\n\ - OutlineCol : Color used to draw the outline (black by default)."}, - {"Rectangle", (PyCFunction)PySfShape_Rectangle, METH_STATIC | METH_VARARGS | METH_KEYWORDS, "Rectangle(X0, Y0, X1, Y1, Col, Outline = 0., OutlineCol = sf.Color(0, 0, 0))\n\ -Create a shape made of a single rectangle.\n\ - X0 : X coordinate of the first point.\n\ - Y0 : Y coordinate of the first point.\n\ - X1 : X coordinate of the second point.\n\ - Y1 : Y coordinate of the second point.\n\ - Col : Color used to fill the rectangle.\n\ - Outline : Outline width (0 by default).\n\ - OutlineCol : Color used to draw the outline (black by default)."}, - {"Circle", (PyCFunction)PySfShape_Circle, METH_STATIC | METH_VARARGS | METH_KEYWORDS, "Circle(X, Y, Radius, Col, Outline = 0., OutlineCol = sf.Color(0, 0, 0))\n\ -Create a shape made of a single circle.\n\ - X : X coordinate of the center.\n\ - Y : Y coordinate of the center.\n\ - Radius : Radius\n\ - Col : Color used to fill the rectangle.\n\ - Outline : Outline width (0 by default).\n\ - OutlineCol : Color used to draw the outline (black by default)."}, - {NULL} /* Sentinel */ -}; - - -PyTypeObject PySfShapeType = { - head_init - "Shape", /*tp_name*/ - sizeof(PySfShape), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfShape_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "Shape defines a drawable convex shape ; it also defines helper functions to draw simple shapes like lines, rectangles, circles, etc.\nDefault constructor: Shape()", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfShape_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - &PySfDrawableType, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfShape_new, /* tp_new */ -}; - - -PySfShape * -GetNewPySfShape() -{ - PySfShape *Shape = PyObject_New(PySfShape, &PySfShapeType); - Shape->IsCustom = false; - return Shape; -} - diff --git a/bindings/python/src/Shape.hpp b/bindings/python/src/Shape.hpp deleted file mode 100644 index 7e21bfc9..00000000 --- a/bindings/python/src/Shape.hpp +++ /dev/null @@ -1,42 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYSHAPE_HPP -#define __PYSHAPE_HPP - -#include - -#include - - -typedef struct { - PyObject_HEAD - bool IsCustom; - sf::Shape *obj; -} PySfShape; - -PySfShape * -GetNewPySfShape(); - -#endif diff --git a/bindings/python/src/Sleep.cpp b/bindings/python/src/Sleep.cpp deleted file mode 100644 index 303c8856..00000000 --- a/bindings/python/src/Sleep.cpp +++ /dev/null @@ -1,33 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Sleep.hpp" - -PyObject * -PySFML_Sleep (PyObject *self, PyObject *args) -{ - sf::Sleep(PyFloat_AsDouble(args)); - Py_RETURN_NONE; -} - diff --git a/bindings/python/src/Sleep.hpp b/bindings/python/src/Sleep.hpp deleted file mode 100644 index 3c78fd73..00000000 --- a/bindings/python/src/Sleep.hpp +++ /dev/null @@ -1,35 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYSLEEP_HPP -#define __PYSLEEP_HPP - -#include - -#include - -PyObject * -PySFML_Sleep (PyObject *self, PyObject *args); - -#endif diff --git a/bindings/python/src/Sound.cpp b/bindings/python/src/Sound.cpp deleted file mode 100644 index 926d2c69..00000000 --- a/bindings/python/src/Sound.cpp +++ /dev/null @@ -1,338 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Sound.hpp" -#include "SoundBuffer.hpp" - -#include "compat.hpp" - - -extern PyTypeObject PySfSoundBufferType; - - -static void -PySfSound_dealloc(PySfSound *self) -{ - delete self->obj; - free_object(self); -} - -static PyObject * -PySfSound_new(PyTypeObject *type, PyObject *args, PyObject *kwds); - -static int -PySfSound_init(PySfSound *self, PyObject *args, PyObject *kwds) -{ - const char *kwlist[] = {"Buffer", "Loop", "Pitch", "Volume", "X", "Y", "Z", NULL}; - PySfSoundBuffer *Buffer=NULL; - PyObject *Loop=NULL; - float Pitch=1.f, Volume=100.f, X=0.f, Y=0.f, Z=0.f; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O!Offfff:Sound.__new__", (char **)kwlist, &PySfSoundBufferType, &Buffer, &Loop, &Pitch, &Volume, &X, &Y, &Z)) - return -1; - { - if (Loop) - self->obj->SetLoop(PyBool_AsBool(Loop)); - if (Buffer) - self->obj->SetBuffer(*(Buffer->obj)); - self->obj->SetPitch(Pitch); - self->obj->SetVolume(Volume); - self->obj->SetPosition(X, Y, Z); - } - return 0; -} - -static PyObject* -PySfSound_SetBuffer(PySfSound *self, PyObject *args) -{ - PySfSoundBuffer *Buffer = (PySfSoundBuffer *)args; - if (!PyObject_TypeCheck(args, &PySfSoundBufferType)) - { - PyErr_SetString(PyExc_TypeError, "Sound.SetBuffer() The argument must be a sf.SoundBuffer."); - return NULL; - } - - self->obj->SetBuffer(*(Buffer->obj)); - Py_RETURN_NONE; -} - -static PyObject* -PySfSound_SetLoop(PySfSound *self, PyObject *args) -{ - self->obj->SetLoop(PyBool_AsBool(args)); - Py_RETURN_NONE; -} - -static PyObject* -PySfSound_SetRelativeToListener(PySfSound *self, PyObject *args) -{ - self->obj->SetRelativeToListener(PyBool_AsBool(args)); - Py_RETURN_NONE; -} - -static PyObject* -PySfSound_IsRelativeToListener(PySfSound *self) -{ - return PyBool_FromLong(self->obj->IsRelativeToListener()); -} - -static PyObject* -PySfSound_SetPitch(PySfSound *self, PyObject *args) -{ - self->obj->SetPitch(PyFloat_AsDouble(args)); - Py_RETURN_NONE; -} - -static PyObject* -PySfSound_SetMinDistance(PySfSound *self, PyObject *args) -{ - self->obj->SetMinDistance(PyFloat_AsDouble(args)); - Py_RETURN_NONE; -} - -static PyObject* -PySfSound_SetAttenuation(PySfSound *self, PyObject *args) -{ - self->obj->SetAttenuation(PyFloat_AsDouble(args)); - Py_RETURN_NONE; -} - -static PyObject* -PySfSound_SetVolume(PySfSound *self, PyObject *args) -{ - self->obj->SetVolume(PyFloat_AsDouble(args)); - Py_RETURN_NONE; -} - -static PyObject* -PySfSound_GetPitch(PySfSound *self) -{ - return PyFloat_FromDouble(self->obj->GetPitch()); -} - -static PyObject* -PySfSound_GetMinDistance(PySfSound *self) -{ - return PyFloat_FromDouble(self->obj->GetMinDistance()); -} - -static PyObject* -PySfSound_GetAttenuation(PySfSound *self) -{ - return PyFloat_FromDouble(self->obj->GetAttenuation()); -} - -static PyObject* -PySfSound_GetVolume(PySfSound *self) -{ - return PyFloat_FromDouble(self->obj->GetVolume()); -} - -static PyObject* -PySfSound_GetPosition(PySfSound *self) -{ - sf::Vector3f Vect = self->obj->GetPosition(); - return Py_BuildValue("fff", Vect.x, Vect.y, Vect.z); -} - -static PyObject* -PySfSound_GetPlayingOffset(PySfSound *self) -{ - return PyFloat_FromDouble(self->obj->GetPlayingOffset()); -} - -static PyObject* -PySfSound_GetLoop(PySfSound *self) -{ - return PyBool_FromLong(self->obj->GetLoop()); -} - -static PyObject* -PySfSound_Play(PySfSound *self) -{ - self->obj->Play(); - Py_RETURN_NONE; -} - -static PyObject* -PySfSound_Pause(PySfSound *self) -{ - self->obj->Pause(); - Py_RETURN_NONE; -} - -static PyObject* -PySfSound_Stop(PySfSound *self) -{ - self->obj->Stop(); - Py_RETURN_NONE; -} - -static PyObject* -PySfSound_GetStatus(PySfSound *self) -{ - return PyLong_FromUnsignedLong(self->obj->GetStatus()); -} - -static PyObject* -PySfSound_SetPosition(PySfSound *self, PyObject *args) -{ - float X, Y, Z; - if (!PyArg_ParseTuple(args, "fff:Sound.SetPosition", &X, &Y, &Z)) - return NULL; - self->obj->SetPosition(X, Y, Z); - Py_RETURN_NONE; -} - -static PyObject * -PySfSound_GetBuffer(PySfSound *self) -{ - PySfSoundBuffer *Buffer; - - Buffer = GetNewPySfSoundBuffer(); - Buffer->obj = new sf::SoundBuffer(*(self->obj->GetBuffer())); - - return (PyObject *)Buffer; -} - -static PyObject* -PySfSound_SetPlayingOffset(PySfSound *self, PyObject *args) -{ - self->obj->SetPlayingOffset(PyFloat_AsDouble(args)); - Py_RETURN_NONE; -} - -static PyMethodDef PySfSound_methods[] = { - {"SetRelativeToListener", (PyCFunction)PySfSound_SetRelativeToListener, METH_O, "SetRelativeToListener(Relative)\nMake the sound's position relative to the listener's position, or absolute. The default value is false (absolute)\n Relative : True to set the position relative, false to set it absolute"}, - {"IsRelativeToListener", (PyCFunction)PySfSound_IsRelativeToListener, METH_NOARGS, "IsRelativeToListener()\nTell if the sound's position is relative to the listener's position, or if it's absolute."}, - {"SetPlayingOffset", (PyCFunction)PySfSound_SetPlayingOffset, METH_O, "SetPlayingOffset(TimeOffset)\nSet the current playing position of the sound.\n TimeOffset : New playing position, expressed in seconds"}, - {"SetLoop", (PyCFunction)PySfSound_SetLoop, METH_O, "SetLoop(Loop)\nSet the Sound loop state.\n Loop : True to play in loop, false to play once"}, - {"SetBuffer", (PyCFunction)PySfSound_SetBuffer, METH_O, "SetBuffer(Buffer)\nSet the source buffer.\n Buffer : New sound buffer to bind to the sound "}, - {"SetPitch", (PyCFunction)PySfSound_SetPitch, METH_O, "SetPitch(Pitch)\nSet the sound pitch. The default pitch is 1.\n Pitch : New pitch"}, - {"SetMinDistance", (PyCFunction)PySfSound_SetMinDistance, METH_O, "SetMinDistance(MinDistance)\nSet the minimum distance - closer than this distance, the listener will hear the sound at its maximum volume. The default minimum distance is 1.0.\n MinDistance : New minimum distance for the sound"}, - {"SetAttenuation", (PyCFunction)PySfSound_SetAttenuation, METH_O, "SetAttenuation(Attenuation)\nSet the attenuation factor - the higher the attenuation, the more the sound will be attenuated with distance from listener. The default attenuation factor 1.0.\n Attenuation : New attenuation factor for the sound"}, - {"SetVolume", (PyCFunction)PySfSound_SetVolume, METH_O, "SetVolume(Volume)\nSet the sound volume.\n Volume : Volume (in range [0, 100])"}, - {"SetPosition", (PyCFunction)PySfSound_SetPosition, METH_VARARGS, "SetPosition(X, Y, Z)\nSet the sound position in the world.\n X,Y,Z : Position of the sound in the world"}, - {"GetLoop", (PyCFunction)PySfSound_GetLoop, METH_NOARGS, "GetLoop()\nTell whether or not the Sound is looping."}, - {"GetBuffer", (PyCFunction)PySfSound_GetBuffer, METH_NOARGS, "GetBuffer()\nGet the source buffer. Returns a new sf.SoundBuffer object."}, - {"GetPitch", (PyCFunction)PySfSound_GetPitch, METH_NOARGS, "GetPitch()\nGet the sound pitch."}, - {"GetMinDistance", (PyCFunction)PySfSound_GetMinDistance, METH_NOARGS, "GetMinDistance()\nGet the minimum distance."}, - {"GetAttenuation", (PyCFunction)PySfSound_GetAttenuation, METH_NOARGS, "GetAttenuation()\nGet the attenuation factor."}, - {"GetVolume", (PyCFunction)PySfSound_GetVolume, METH_NOARGS, "GetVolume()\nGet the sound volume."}, - {"GetPosition", (PyCFunction)PySfSound_GetPosition, METH_NOARGS, "GetPosition()\nGet the sound position in the world. Returns a tuple."}, - {"Play", (PyCFunction)PySfSound_Play, METH_NOARGS, "Play()\nPlay the sound."}, - {"Pause", (PyCFunction)PySfSound_Pause, METH_NOARGS, "Pause()\nPause the sound."}, - {"Stop", (PyCFunction)PySfSound_Stop, METH_NOARGS, "Stop()\nStop the sound."}, - {"GetStatus", (PyCFunction)PySfSound_GetStatus, METH_NOARGS, "GetStatus()\nGet the status of the sound (stopped, paused, playing)."}, - {"GetPlayingOffset", (PyCFunction)PySfSound_GetPlayingOffset, METH_NOARGS, "GetPlayingOffset()\nGet the current playing position of the sound."}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfSoundType = { - head_init - "Sound", /*tp_name*/ - sizeof(PySfSound), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfSound_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "sf.Sound defines the properties of a sound such as position, volume, pitch, etc.\n\ -Default constructor : Sound()\n\ -Construct the sound from its parameters : Sound(Buffer, Loop = False, Pitch = 1., Volume = 100., X = 0., Y = 0., Z = 0.);\n\ - Buffer : Sound buffer to play (None by default)\n\ - Loop : Loop flag (False by default)\n\ - Pitch : Value of the pitch (1. by default)\n\ - Volume : Volume (100. by default)\n\ - X : X position (0. by default)\n\ - Y : Y position (0. by default)\n\ - Z : Z position (0. by default)\n\ -Copy constructor : Sound(Copy) where Copy is a sf.Sound instance.", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfSound_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)PySfSound_init, /* tp_init */ - 0, /* tp_alloc */ - PySfSound_new, /* tp_new */ -}; - -static PyObject * -PySfSound_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfSound *self; - self = (PySfSound *)type->tp_alloc(type, 0); - if (self != NULL) - { - if (PyTuple_Size(args) == 1) - { - PySfSound *Copy; - if (PyArg_ParseTuple(args, "O!:Sound.__new__", &PySfSoundType, &Copy)) - { - self->obj = new sf::Sound(*(Copy->obj)); - return (PyObject *)self; - } - else PyErr_Clear(); - } - self->obj = new sf::Sound(); - } - return (PyObject *)self; -} - -void -PySfSound_InitConst() -{ - PyObject *obj; - obj = PyLong_FromLong(sf::Sound::Stopped); - PyDict_SetItemString(PySfSoundType.tp_dict, "Stopped", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Sound::Paused); - PyDict_SetItemString(PySfSoundType.tp_dict, "Paused", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Sound::Playing); - PyDict_SetItemString(PySfSoundType.tp_dict, "Playing", obj); - Py_DECREF(obj); -} - diff --git a/bindings/python/src/Sound.hpp b/bindings/python/src/Sound.hpp deleted file mode 100644 index 4992a5d7..00000000 --- a/bindings/python/src/Sound.hpp +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYSOUND_HPP -#define __PYSOUND_HPP - -#include - -#include - -typedef struct { - PyObject_HEAD - sf::Sound *obj; -} PySfSound; - -void -PySfSound_InitConst(); - -#endif diff --git a/bindings/python/src/SoundBuffer.cpp b/bindings/python/src/SoundBuffer.cpp deleted file mode 100644 index bf4ac168..00000000 --- a/bindings/python/src/SoundBuffer.cpp +++ /dev/null @@ -1,194 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "SoundBuffer.hpp" - -#include "compat.hpp" - - -static void -PySfSoundBuffer_dealloc(PySfSoundBuffer *self) -{ - delete self->obj; - free_object(self); -} - -static PyObject * -PySfSoundBuffer_new(PyTypeObject *type, PyObject *args, PyObject *kwds); - -static PyObject* -PySfSoundBuffer_LoadFromFile(PySfSoundBuffer *self, PyObject *args) -{ - load_from_file(self, args); -} - -static PyObject * -PySfSoundBuffer_LoadFromMemory(PySfSoundBuffer* self, PyObject *args) -{ - unsigned int SizeInBytes; - char *Data; - - if (!PyArg_ParseTuple(args, "s#:SoundBuffer.LoadFromMemory", &Data, &SizeInBytes)) - return NULL; - - return PyBool_FromLong(self->obj->LoadFromMemory(Data, (std::size_t) SizeInBytes)); -} - -static PyObject * -PySfSoundBuffer_LoadFromSamples(PySfSoundBuffer* self, PyObject *args) -{ - unsigned int SizeInBytes, ChannelsCount, SampleRate; - char *Data; - - if (!PyArg_ParseTuple(args, "s#II:SoundBuffer.LoadFromSamples", &Data, &SizeInBytes, &ChannelsCount, &SampleRate)) - return NULL; - - return PyBool_FromLong(self->obj->LoadFromSamples((const sf::Int16*)Data, (std::size_t) SizeInBytes/2, ChannelsCount, SampleRate)); -} - -static PyObject* -PySfSoundBuffer_GetSamples(PySfSoundBuffer *self) -{ -#ifdef IS_PY3K - return PyBytes_FromStringAndSize((const char *)(self->obj->GetSamples()), self->obj->GetSamplesCount()*2); -#else - return PyString_FromStringAndSize((const char *)(self->obj->GetSamples()), self->obj->GetSamplesCount()*2); -#endif -} - -static PyObject* -PySfSoundBuffer_SaveToFile(PySfSoundBuffer *self, PyObject *args) -{ - save_to_file(self, args); -} - -static PyObject* -PySfSoundBuffer_GetDuration(PySfSoundBuffer *self) -{ - return PyFloat_FromDouble((double)(self->obj->GetDuration())); -} - -static PyObject* -PySfSoundBuffer_GetChannelsCount(PySfSoundBuffer *self) -{ - return PyLong_FromUnsignedLong(self->obj->GetChannelsCount()); -} - -static PyObject* -PySfSoundBuffer_GetSampleRate(PySfSoundBuffer *self) -{ - return PyLong_FromUnsignedLong(self->obj->GetSampleRate()); -} - -static PyObject* -PySfSoundBuffer_GetSamplesCount(PySfSoundBuffer *self) -{ - return PyLong_FromUnsignedLong(self->obj->GetSamplesCount()); -} - - -static PyMethodDef PySfSoundBuffer_methods[] = { - {"LoadFromFile", (PyCFunction)PySfSoundBuffer_LoadFromFile, METH_O, "LoadFromFile(FileName)\nLoad the sound buffer from a file. Returns True if loading has been successful.\n Filename : Path of the sound file to load"}, - {"SaveToFile", (PyCFunction)PySfSoundBuffer_SaveToFile, METH_O, "SaveToFile(Filename)\nSave the sound buffer to a file. Returns True if saving has been successful.\n Filename : Path of the sound file to write"}, - {"LoadFromMemory", (PyCFunction)PySfSoundBuffer_LoadFromMemory, METH_O, "LoadFromMemory(Data)\nLoad the sound buffer from a string in memory.\n Data : string representing the file data in memory "}, - {"LoadFromSamples", (PyCFunction)PySfSoundBuffer_LoadFromSamples, METH_VARARGS, "LoadFromSamples(Samples, ChannelsCount, SampleRate)\nLoad the sound buffer from an array of samples - assumed format for samples is 16 bits signed integer.\n\ - Samples : Pointer to the samples in memory\n\ - ChannelsCount : Number of channels (1 = mono, 2 = stereo, ...)\n\ - SampleRate : Frequency (number of samples to play per second)"}, - {"GetDuration", (PyCFunction)PySfSoundBuffer_GetDuration, METH_NOARGS, "GetDuration()\nGet the sound duration."}, - {"GetChannelsCount", (PyCFunction)PySfSoundBuffer_GetChannelsCount, METH_NOARGS, "GetChannelsCount()\nReturn the number of channels (1 = mono, 2 = stereo)."}, - {"GetSampleRate", (PyCFunction)PySfSoundBuffer_GetSampleRate, METH_NOARGS, "GetSampleRate()\nGet the sound frequency (sample rate)."}, - {"GetSamplesCount", (PyCFunction)PySfSoundBuffer_GetSamplesCount, METH_NOARGS, "GetSamplesCount()\nReturn the samples count."}, - {"GetSamples", (PyCFunction)PySfSoundBuffer_GetSamples, METH_NOARGS, "GetSamples()\nReturn the sound samples as a string."}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfSoundBufferType = { - head_init - "SoundBuffer", /*tp_name*/ - sizeof(PySfSoundBuffer), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfSoundBuffer_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "sf.SoundBuffer is the low-level for loading and manipulating sound buffers.\n\ -Default constructor : SoundBuffer()\n\ -Copy constructor : SoundBuffer(Copy) where Copy is a sf.SoundBuffer instance.", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfSoundBuffer_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfSoundBuffer_new, /* tp_new */ -}; - -static PyObject * -PySfSoundBuffer_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfSoundBuffer *self; - self = (PySfSoundBuffer *)type->tp_alloc(type, 0); - if (self != NULL) - { - PySfSoundBuffer *Copy=NULL; - if (PyArg_ParseTuple(args, "O!:SoundBuffer.__init__", &PySfSoundBufferType, &Copy)) - { - self->obj = new sf::SoundBuffer(*(Copy->obj)); - return (PyObject *)self; - } - PyErr_Clear(); - self->obj = new sf::SoundBuffer(); - } - return (PyObject *)self; -} - -PySfSoundBuffer * -GetNewPySfSoundBuffer() -{ - return PyObject_New(PySfSoundBuffer, &PySfSoundBufferType); -} - diff --git a/bindings/python/src/SoundBuffer.hpp b/bindings/python/src/SoundBuffer.hpp deleted file mode 100644 index 4a35fb3e..00000000 --- a/bindings/python/src/SoundBuffer.hpp +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYSOUNDBUFFER_HPP -#define __PYSOUNDBUFFER_HPP - -#include - -#include - -typedef struct { - PyObject_HEAD - sf::SoundBuffer *obj; -} PySfSoundBuffer; - -PySfSoundBuffer * -GetNewPySfSoundBuffer(); - -#endif diff --git a/bindings/python/src/SoundBufferRecorder.cpp b/bindings/python/src/SoundBufferRecorder.cpp deleted file mode 100644 index 05978f6f..00000000 --- a/bindings/python/src/SoundBufferRecorder.cpp +++ /dev/null @@ -1,106 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "SoundBufferRecorder.hpp" -#include "SoundBuffer.hpp" - -#include "compat.hpp" - - -extern PyTypeObject PySfSoundRecorderType; - - -static void -PySfSoundBufferRecorder_dealloc(PySfSoundBufferRecorder *self) -{ - delete self->obj; - free_object(self); -} - -static PyObject * -PySfSoundBufferRecorder_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfSoundBufferRecorder *self; - self = (PySfSoundBufferRecorder *)type->tp_alloc(type, 0); - if (self != NULL) - self->obj = new sf::SoundBufferRecorder(); - return (PyObject *)self; -} - -static PyObject * -PySfSoundBufferRecorder_GetBuffer(PySfSoundBufferRecorder* self) -{ - PySfSoundBuffer *SoundBuffer = GetNewPySfSoundBuffer(); - SoundBuffer->obj = new sf::SoundBuffer(self->obj->GetBuffer()); - return (PyObject *)SoundBuffer; -} - - -static PyMethodDef PySfSoundBufferRecorder_methods[] = { - {"GetBuffer", (PyCFunction)PySfSoundBufferRecorder_GetBuffer, METH_NOARGS, "GetBuffer()\nGet the sound buffer containing the captured audio data. Returns a SoundBuffer object. Returns a sf.SoundBuffer instance."}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfSoundBufferRecorderType = { - head_init - "SoundBufferRecorder", /*tp_name*/ - sizeof(PySfSoundBufferRecorder), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfSoundBufferRecorder_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "Specialized SoundRecorder which saves the captured audio data into a sound buffer.", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfSoundBufferRecorder_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - &PySfSoundRecorderType, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfSoundBufferRecorder_new, /* tp_new */ -}; - - diff --git a/bindings/python/src/SoundBufferRecorder.hpp b/bindings/python/src/SoundBufferRecorder.hpp deleted file mode 100644 index 4feadbe3..00000000 --- a/bindings/python/src/SoundBufferRecorder.hpp +++ /dev/null @@ -1,37 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYSOUNDBUFFERRECORDER_HPP -#define __PYSOUNDBUFFERRECORDER_HPP - -#include - -#include - -typedef struct { - PyObject_HEAD - sf::SoundBufferRecorder *obj; -} PySfSoundBufferRecorder; - -#endif diff --git a/bindings/python/src/SoundRecorder.cpp b/bindings/python/src/SoundRecorder.cpp deleted file mode 100644 index 4fc9facc..00000000 --- a/bindings/python/src/SoundRecorder.cpp +++ /dev/null @@ -1,166 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "SoundRecorder.hpp" - -#include "compat.hpp" - -bool CustomSoundRecorder::OnStart() -{ - bool result = false; - if (PyObject_HasAttrString(SoundRecorder, "OnStart")) - { - PyObject *OnStart = PyObject_GetAttrString(SoundRecorder, "OnStart"); - PyObject *Result = PyObject_CallFunction(OnStart, NULL); - result = PyBool_AsBool(Result); - Py_DECREF(OnStart); - Py_DECREF(Result); - } - return result; -} - -bool CustomSoundRecorder::OnProcessSamples(const sf::Int16* Samples, std::size_t SamplesCount) -{ - bool result = false; - if (PyObject_HasAttrString(SoundRecorder, "OnGetData")) - { - PyObject *OnGetData = PyObject_GetAttrString(SoundRecorder, "OnGetData"); - PyObject *Result = PyObject_CallFunction(OnGetData, (char *)"#s", (char *)Samples, SamplesCount*2); - result = PyBool_AsBool(Result); - Py_DECREF(OnGetData); - Py_DECREF(Result); - } - return result; -} - -void CustomSoundRecorder::OnStop() -{ - if (PyObject_HasAttrString(SoundRecorder, "OnStop")) - { - PyObject *OnStop = PyObject_GetAttrString(SoundRecorder, "OnStop"); - PyObject_CallFunction(OnStop, NULL); - Py_DECREF(OnStop); - } -} - -static void -PySfSoundRecorder_dealloc(PySfSoundRecorder* self) -{ - delete self->obj; - free_object(self); -} - -static PyObject * -PySfSoundRecorder_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfSoundRecorder *self; - self = (PySfSoundRecorder *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->obj = new CustomSoundRecorder(); - self->obj->SoundRecorder = (PyObject *)self; - } - return (PyObject *)self; -} - -static PyObject * -PySfSoundRecorder_Start(PySfSoundRecorder* self, PyObject *args) -{ - self->obj->Start(PyLong_AsLong(args)); - Py_RETURN_NONE; -} - -static PyObject * -PySfSoundRecorder_Stop(PySfSoundRecorder* self) -{ - self->obj->Stop(); - Py_RETURN_NONE; -} - -static PyObject * -PySfSoundRecorder_GetSampleRate(PySfSoundRecorder* self) -{ - return PyLong_FromLong(self->obj->GetSampleRate()); -} - -static PyObject * -PySfSoundRecorder_IsAvailable(PySfSoundRecorder* self) -{ - return PyBool_FromLong(sf::SoundRecorder::IsAvailable()); -} - - -static PyMethodDef PySfSoundRecorder_methods[] = { - {"Start", (PyCFunction)PySfSoundRecorder_Start, METH_O, "Start(SampleRate=44100)\nStart the capture. Warning : only one capture can happen at the same time.\n SampleRate : Sound frequency (the more samples, the higher the quality) (44100 by default = CD quality)."}, - {"Stop", (PyCFunction)PySfSoundRecorder_Stop, METH_NOARGS, "Stop()\nStop the capture."}, - {"GetSampleRate", (PyCFunction)PySfSoundRecorder_GetSampleRate, METH_NOARGS, "GetSampleRate()\nGet the sample rate. Returns the frequency, in samples per second."}, - {"IsAvailable", (PyCFunction)PySfSoundRecorder_IsAvailable, METH_STATIC | METH_NOARGS, "IsAvailable()\nTell if the system supports sound capture. If not, this class won't be usable. Returns True if audio capture is supported."}, - {NULL} /* Sentinel */ -}; - - -PyTypeObject PySfSoundRecorderType = { - head_init - "SoundRecorder", /*tp_name*/ - sizeof(PySfSoundRecorder), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfSoundRecorder_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "SoundRecorder is an interface for capturing sound data, it is meant to be used as a base class.\n\ -Construct the sound recorder with a callback function for processing captured samples : SoundRecorder(Callback, UserData)\n\ - Callback : Callback function for processing captured samples. This function must take two parameters: the first one is a string containing captured samples, the second one is UserData.\n\ - UserData : Data to pass to the callback function (None by default).", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfSoundRecorder_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfSoundRecorder_new, /* tp_new */ -}; - diff --git a/bindings/python/src/SoundRecorder.hpp b/bindings/python/src/SoundRecorder.hpp deleted file mode 100644 index cc360024..00000000 --- a/bindings/python/src/SoundRecorder.hpp +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYSOUNDRECORDER_HPP -#define __PYSOUNDRECORDER_HPP - -#include - -#include - -class CustomSoundRecorder : public sf::SoundRecorder -{ -public : - PyObject *SoundRecorder; - virtual bool OnStart(); - virtual bool OnProcessSamples(const sf::Int16* Samples, std::size_t SamplesCount); - virtual void OnStop(); -}; - -typedef struct { - PyObject_HEAD - CustomSoundRecorder *obj; -} PySfSoundRecorder; - -#endif diff --git a/bindings/python/src/SoundStream.cpp b/bindings/python/src/SoundStream.cpp deleted file mode 100644 index 7c73bbf4..00000000 --- a/bindings/python/src/SoundStream.cpp +++ /dev/null @@ -1,346 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "SoundStream.hpp" - -#include "compat.hpp" - - -void CustomSoundStream::OnSeek(float TimeOffset) -{ - PyGILState_STATE gstate; - gstate = PyGILState_Ensure(); - if (PyObject_HasAttrString(SoundStream, "OnSeek")) - { - PyObject *OnSeek = PyObject_GetAttrString(SoundStream, "OnSeek"); - if (OnSeek != NULL) - { - PyObject_CallFunction(OnSeek, const_cast( "f" ), TimeOffset); - Py_CLEAR(OnSeek); - } - } - if (PyErr_Occurred()) - { - PyErr_Print(); - } - PyGILState_Release(gstate); -} - -bool CustomSoundStream::OnGetData(Chunk& Data) -{ - PyGILState_STATE gstate; - bool result = false; - PyObject *Function, *PyData; - gstate = PyGILState_Ensure(); - Function = PyObject_GetAttrString(SoundStream, "OnGetData"); - if (Function != NULL) - { - PyData = PyObject_CallFunction(Function, NULL); - if (PyData != NULL) - { - if (PyArg_Parse(PyData, "s#", &(Data.Samples), &(Data.NbSamples))) - { - Data.NbSamples /= 2; - if (Data.NbSamples > 0) - result = true; - } - Py_CLEAR(PyData); - } - Py_CLEAR(Function); - } - if (PyErr_Occurred()) - { - PyErr_Print(); - result = false; - } - PyGILState_Release(gstate); - return result; -} - -void CustomSoundStream::Init(unsigned int ChannelsCount, unsigned int SampleRate) -{ - Initialize(ChannelsCount, SampleRate); -} - -static void -PySfSoundStream_dealloc(PySfSoundStream *self) -{ - delete self->obj; - free_object(self); -} - -static PyObject * -PySfSoundStream_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfSoundStream *self; - self = (PySfSoundStream *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->obj = new CustomSoundStream(); - self->obj->SoundStream = (PyObject *)self; - } - return (PyObject *)self; -} - -static PyObject * -PySfSoundStream_Initialize(PySfSoundStream *self, PyObject *args) -{ - unsigned int ChannelsCount, SampleRate; - if (!PyArg_ParseTuple(args, "II:SoundStream.Initialize", &ChannelsCount, &SampleRate)) - return NULL; - self->obj->Init(ChannelsCount, SampleRate); - Py_RETURN_NONE; -} - -static PyObject* -PySfSoundStream_Play(PySfSoundStream *self) -{ - self->obj->Play(); - Py_RETURN_NONE; -} - -static PyObject* -PySfSoundStream_Stop(PySfSoundStream *self) -{ - self->obj->Stop(); - Py_RETURN_NONE; -} - -static PyObject* -PySfSoundStream_GetChannelsCount(PySfSoundStream *self) -{ - return PyLong_FromUnsignedLong(self->obj->GetChannelsCount()); -} - -static PyObject* -PySfSoundStream_GetSampleRate(PySfSoundStream *self) -{ - return PyLong_FromUnsignedLong(self->obj->GetSampleRate()); -} - -static PyObject* -PySfSoundStream_SetPitch(PySfSoundStream *self, PyObject *args) -{ - self->obj->SetPitch(PyFloat_AsDouble(args)); - Py_RETURN_NONE; -} - -static PyObject* -PySfSoundStream_SetMinDistance(PySfSoundStream *self, PyObject *args) -{ - self->obj->SetMinDistance(PyFloat_AsDouble(args)); - Py_RETURN_NONE; -} - -static PyObject* -PySfSoundStream_SetAttenuation(PySfSoundStream *self, PyObject *args) -{ - self->obj->SetAttenuation(PyFloat_AsDouble(args)); - Py_RETURN_NONE; -} - -static PyObject* -PySfSoundStream_SetVolume(PySfSoundStream *self, PyObject *args) -{ - self->obj->SetVolume(PyFloat_AsDouble(args)); - Py_RETURN_NONE; -} - -static PyObject* -PySfSoundStream_GetPitch(PySfSoundStream *self) -{ - return PyFloat_FromDouble(self->obj->GetPitch()); -} - -static PyObject* -PySfSoundStream_GetMinDistance(PySfSoundStream *self) -{ - return PyFloat_FromDouble(self->obj->GetMinDistance()); -} - -static PyObject* -PySfSoundStream_GetAttenuation(PySfSoundStream *self) -{ - return PyFloat_FromDouble(self->obj->GetAttenuation()); -} - -static PyObject* -PySfSoundStream_GetVolume(PySfSoundStream *self) -{ - return PyFloat_FromDouble(self->obj->GetVolume()); -} - -static PyObject* -PySfSoundStream_GetPosition(PySfSoundStream *self) -{ - sf::Vector3f Vect = self->obj->GetPosition(); - return Py_BuildValue("fff", Vect.x, Vect.y, Vect.z); -} - -static PyObject* -PySfSoundStream_Pause(PySfSoundStream *self) -{ - self->obj->Pause(); - Py_RETURN_NONE; -} - -static PyObject* -PySfSoundStream_SetPosition(PySfSoundStream *self, PyObject *args) -{ - float X, Y, Z; - if (!PyArg_ParseTuple(args, "fff:SoundStream.SetPosition", &X, &Y, &Z)) - return NULL; - self->obj->SetPosition(X, Y, Z); - Py_RETURN_NONE; -} - -static PyObject* -PySfSoundStream_GetStatus(PySfSoundStream *self) -{ - return PyLong_FromUnsignedLong(self->obj->GetStatus()); -} - -static PyObject* -PySfSoundStream_SetLoop(PySfSoundStream *self, PyObject *args) -{ - self->obj->SetLoop(PyBool_AsBool(args)); - Py_RETURN_NONE; -} - -static PyObject* -PySfSoundStream_GetLoop(PySfSoundStream *self) -{ - return PyBool_FromLong(self->obj->GetLoop()); -} - -static PyObject* -PySfSoundStream_GetPlayingOffset(PySfSoundStream *self) -{ - return PyFloat_FromDouble(self->obj->GetPlayingOffset()); -} - -static PyObject* -PySfSoundStream_SetRelativeToListener(PySfSoundStream *self, PyObject *args) -{ - self->obj->SetRelativeToListener(PyBool_AsBool(args)); - Py_RETURN_NONE; -} - -static PyObject* -PySfSoundStream_IsRelativeToListener(PySfSoundStream *self) -{ - return PyBool_FromLong(self->obj->IsRelativeToListener()); -} - -static PyMethodDef PySfSoundStream_methods[] = { - {"SetRelativeToListener", (PyCFunction)PySfSoundStream_SetRelativeToListener, METH_O, "SetRelativeToListener(Relative)\nMake the sound's position relative to the listener's position, or absolute. The default value is false (absolute)\n Relative : True to set the position relative, false to set it absolute"}, - {"IsRelativeToListener", (PyCFunction)PySfSoundStream_IsRelativeToListener, METH_NOARGS, "IsRelativeToListener()\nTell if the sound's position is relative to the listener's position, or if it's absolute."}, - {"Initialize", (PyCFunction)PySfSoundStream_Initialize, METH_VARARGS, "Initialize(ChannelsCount, SampleRate)\n\ -Set the audio stream parameters, you must call it before Play()\n\ - ChannelsCount : Number of channels\n\ - SampleRate : Sample rate."}, - {"Play", (PyCFunction)PySfSoundStream_Play, METH_NOARGS, "Play()\nPlay the sound."}, - {"Stop", (PyCFunction)PySfSoundStream_Stop, METH_NOARGS, "Stop()\nStop the sound."}, - {"GetChannelsCount", (PyCFunction)PySfSoundStream_GetChannelsCount, METH_NOARGS, "GetChannelsCount()\nReturn the number of channels (1 = mono, 2 = stereo)."}, - {"GetSampleRate", (PyCFunction)PySfSoundStream_GetSampleRate, METH_NOARGS, "GetSampleRate()\nGet the sound frequency (sample rate)."}, - {"GetStatus", (PyCFunction)PySfSoundStream_GetStatus, METH_NOARGS, "GetStatus()\nGet the status of the sound (stopped, paused, playing)."}, - {"SetLoop", (PyCFunction)PySfSoundStream_SetLoop, METH_O, "SetLoop(Loop)\nSet the music loop state. This parameter is disabled by default\n Loop : True to play in loop, false to play once "}, - {"GetLoop", (PyCFunction)PySfSoundStream_GetLoop, METH_NOARGS, "GetLoop()\nTell whether or not the music is looping."}, - {"GetPlayingOffset", (PyCFunction)PySfSoundStream_GetPlayingOffset, METH_NOARGS, "GetPlayingOffset()\nGet the current playing position of the stream."}, -/* The following methods should be inherited from sf.Sound */ - {"SetPitch", (PyCFunction)PySfSoundStream_SetPitch, METH_O, "SetPitch(Pitch)\nSet the sound pitch. The default pitch is 1.\n Pitch : New pitch"}, - {"SetMinDistance", (PyCFunction)PySfSoundStream_SetMinDistance, METH_O, "SetMinDistance(MinDistance)\nSet the minimum distance - closer than this distance, the listener will hear the sound at its maximum volume. The default minimum distance is 1.0.\n MinDistance : New minimum distance for the sound"}, - {"SetAttenuation", (PyCFunction)PySfSoundStream_SetAttenuation, METH_O, "SetAttenuation(Attenuation)\nSet the attenuation factor - the higher the attenuation, the more the sound will be attenuated with distance from listener. The default attenuation factor 1.0.\n Attenuation : New attenuation factor for the sound"}, - {"SetVolume", (PyCFunction)PySfSoundStream_SetVolume, METH_O, "SetVolume(Volume)\nSet the sound volume.\n Volume : Volume (in range [0, 100])"}, - {"SetPosition", (PyCFunction)PySfSoundStream_SetPosition, METH_VARARGS, "SetPosition(X, Y, Z)\nSet the sound position in the world.\n X,Y,Z : Position of the sound in the world"}, - {"GetPitch", (PyCFunction)PySfSoundStream_GetPitch, METH_NOARGS, "GetPitch()\nGet the sound pitch."}, - {"GetMinDistance", (PyCFunction)PySfSoundStream_GetMinDistance, METH_NOARGS, "GetMinDistance()\nGet the minimum distance."}, - {"GetAttenuation", (PyCFunction)PySfSoundStream_GetAttenuation, METH_NOARGS, "GetAttenuation()\nGet the attenuation factor."}, - {"GetVolume", (PyCFunction)PySfSoundStream_GetVolume, METH_NOARGS, "GetVolume()\nGet the sound volume."}, - {"GetPosition", (PyCFunction)PySfSoundStream_GetPosition, METH_NOARGS, "GetPosition()\nGet the sound position in the world. Returns a tuple."}, - {"Pause", (PyCFunction)PySfSoundStream_Pause, METH_NOARGS, "Pause()\nPause the sound."}, - {NULL} /* Sentinel */ -}; - - -PyTypeObject PySfSoundStreamType = { - head_init - "SoundStream", /*tp_name*/ - sizeof(PySfSoundStream), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfSoundStream_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "SoundStream is a streamed sound, ie samples are acquired\ -while the sound is playing. Use it for big sounds that would\ -require hundreds of MB in memory (see Music),\ -or for streaming sound from the network", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfSoundStream_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfSoundStream_new, /* tp_new */ -}; - - -void -PySfSoundStream_InitConst() -{ - PyObject *obj; - obj = PyLong_FromLong(sf::SoundStream::Stopped); - PyDict_SetItemString(PySfSoundStreamType.tp_dict, "Stopped", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::SoundStream::Paused); - PyDict_SetItemString(PySfSoundStreamType.tp_dict, "Paused", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::SoundStream::Playing); - PyDict_SetItemString(PySfSoundStreamType.tp_dict, "Playing", obj); - Py_DECREF(obj); -} - diff --git a/bindings/python/src/SoundStream.hpp b/bindings/python/src/SoundStream.hpp deleted file mode 100644 index 055c7fba..00000000 --- a/bindings/python/src/SoundStream.hpp +++ /dev/null @@ -1,51 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYSOUNDSTREAM_HPP -#define __PYSOUNDSTREAM_HPP - -#include - -#include - -class CustomSoundStream : public sf::SoundStream -{ -public : - PyObject *SoundStream; - virtual void OnSeek(float TimeOffset); - virtual bool OnGetData(Chunk& Data); - void Init(unsigned int ChannelsCount, unsigned int SampleRate); -}; - - -typedef struct { - PyObject_HEAD - CustomSoundStream *obj; -} PySfSoundStream; - -void -PySfSoundStream_InitConst(); - -#endif - diff --git a/bindings/python/src/Sprite.cpp b/bindings/python/src/Sprite.cpp deleted file mode 100644 index 4c47a4cd..00000000 --- a/bindings/python/src/Sprite.cpp +++ /dev/null @@ -1,256 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Sprite.hpp" -#include "Drawable.hpp" -#include "Color.hpp" - -#include "compat.hpp" - - -extern PyTypeObject PySfColorType; -extern PyTypeObject PySfImageType; -extern PyTypeObject PySfIntRectType; -extern PyTypeObject PySfDrawableType; - - -static void -PySfSprite_dealloc(PySfSprite *self) -{ - Py_CLEAR(self->Image); - Py_CLEAR(self->SubRect); - delete self->obj; - free_object(self); -} - -static PyObject * -PySfSprite_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfSprite *self; - - self = (PySfSprite *)type->tp_alloc(type, 0); - - if (self != NULL) - { - self->Image = NULL; - self->SubRect = NULL; - self->IsCustom = false; - } - - return (PyObject *)self; -} - - -static int -PySfSprite_init(PySfSprite *self, PyObject *args, PyObject *kwds) -{ - const char *kwlist[] = {"Image", "X", "Y", "ScaleX", "ScaleY", "Rotation", "Color", NULL}; - float X=0, Y=0, ScaleX=1, ScaleY=1, Rotation=0; - PySfImage *Image=NULL; - PySfColor *Color=NULL; - - if (! PyArg_ParseTupleAndKeywords(args, kwds, "O!|fffffO!:Sprite.__init__", (char **)kwlist, &PySfImageType, &Image, &X, &Y, &ScaleX, &ScaleY, &Rotation, &PySfColorType, &Color)) - return -1; - - Py_INCREF(Image); - self->Image = Image; - if (Color != NULL) - self->obj = new sf::Sprite(*(Image->obj), sf::Vector2f(X, Y), sf::Vector2f(ScaleX, ScaleY), Rotation, *(Color->obj)); - else - self->obj = new sf::Sprite(*(Image->obj), sf::Vector2f(X, Y), sf::Vector2f(ScaleX, ScaleY), Rotation); - - return 0; -} - - - -static PyObject * -PySfSprite_SetImage(PySfSprite* self, PyObject *args) -{ - PySfImage *Image = (PySfImage *)args; - if (! PyObject_TypeCheck(Image, &PySfImageType)) - { - PyErr_SetString(PyExc_TypeError, "Sprite.SetImage() Argument is not a sf.Image"); - return NULL; - } - Py_CLEAR(self->Image); - Py_INCREF(Image); - self->Image = Image; - self->obj->SetImage(*(Image->obj)); - Py_RETURN_NONE; -} - -static PyObject * -PySfSprite_GetImage(PySfSprite* self) -{ - Py_INCREF(self->Image); - return (PyObject *)(self->Image); -} - -static PyObject * -PySfSprite_GetPixel(PySfSprite* self, PyObject *args) -{ - PySfColor *Color; - unsigned int x=0, y=0; - - if (!PyArg_ParseTuple(args, "II:Sprite.GetPixel", &x, &y)) - return NULL; - - Color = GetNewPySfColor(); - Color->obj = new sf::Color(self->obj->GetPixel(x, y)); - Color->r = Color->obj->r; - Color->g = Color->obj->g; - Color->b = Color->obj->b; - Color->a = Color->obj->a; - - return (PyObject *)Color; -} - -static PyObject * -PySfSprite_Resize(PySfSprite* self, PyObject *args) -{ - float W=0, H=0; - - if (! PyArg_ParseTuple(args, "ff:Sprite.Resize", &W, &H)) - return NULL; - - self->obj->Resize(W,H); - Py_RETURN_NONE; -} - -static PyObject * -PySfSprite_GetSubRect(PySfSprite* self) -{ - if (self->SubRect != NULL) - { - Py_INCREF(self->SubRect); - return (PyObject *)(self->SubRect); - } - else - { - PySfIntRect *Rect; - Rect = GetNewPySfIntRect(); - Rect->Owner = false; - Rect->obj = (sf::IntRect *) &(self->obj->GetSubRect()); - PySfIntRectUpdateSelf(Rect); - Py_INCREF(Rect); - self->SubRect = Rect; - return (PyObject *)Rect; - } -} - -static PyObject * -PySfSprite_SetSubRect(PySfSprite* self, PyObject *args) -{ - PySfIntRect *Rect = (PySfIntRect *)args; - if (!PyObject_TypeCheck(Rect, &PySfIntRectType)) - { - PyErr_SetString(PyExc_TypeError, "Sprite.SetSubRect() Argument is not a sf.IntRect instance"); - return NULL; - } - Py_CLEAR(self->SubRect); - Py_INCREF(Rect); - self->SubRect = Rect; - self->obj->SetSubRect(*(Rect->obj)); - Py_RETURN_NONE; -} - -static PyObject * -PySfSprite_FlipX(PySfSprite* self, PyObject *args) -{ - self->obj->FlipX(PyBool_AsBool(args)); - Py_RETURN_NONE; -} - -static PyObject * -PySfSprite_FlipY(PySfSprite* self, PyObject *args) -{ - self->obj->FlipY(PyBool_AsBool(args)); - Py_RETURN_NONE; -} - -static PyObject * -PySfSprite_GetSize(PySfSprite* self) -{ - sf::Vector2f Vect = self->obj->GetSize(); - return Py_BuildValue("ff", Vect.x, Vect.y); -} - -static PyMethodDef PySfSprite_methods[] = { - {"SetImage", (PyCFunction)PySfSprite_SetImage, METH_O, "SetImage(Image)\nChange the image of the sprite.\n Image : new image (sf.Image instance)"}, - {"GetImage", (PyCFunction)PySfSprite_GetImage, METH_NOARGS, "GetImage()\nGet the source image of the sprite."}, - {"GetSize", (PyCFunction)PySfSprite_GetSize, METH_NOARGS, "GetSize()\nGet the sprite's size."}, - {"GetPixel", (PyCFunction)PySfSprite_GetPixel, METH_VARARGS, "GetPixel()\nGet the color of a given pixel in the sprite."}, - {"Resize", (PyCFunction)PySfSprite_Resize, METH_VARARGS, "Resize(Width, Height)\nResize the sprite (by changing its scale factors). The default size is defined by the subrect.\n\ - Width : New width (must be strictly positive)\n\ - Height : New height (must be strictly positive)"}, - {"GetSubRect", (PyCFunction)PySfSprite_GetSubRect, METH_NOARGS, "GetSubRect()\nGet the sub-rectangle of the sprite inside the source image."}, - {"SetSubRect", (PyCFunction)PySfSprite_SetSubRect, METH_O, "SetSubRect(SubRect)\nSet the sub-rectangle of the sprite inside the source image. By default, the subrect covers the entire source image.\n SubRect : New sub-rectangle"}, - {"FlipX", (PyCFunction)PySfSprite_FlipX, METH_O, "FlipX(Flipped)\nFlip the sprite horizontally.\n Flipped : True to flip the sprite"}, - {"FlipY", (PyCFunction)PySfSprite_FlipY, METH_O, "FlipY(Flipped)\nFlip the sprite vertically.\n Flipped : True to flip the sprite"}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfSpriteType = { - head_init - "Sprite", /*tp_name*/ - sizeof(PySfSprite), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfSprite_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "sfSprite defines a sprite : texture, transformations, color, and draw on screen", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfSprite_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - &PySfDrawableType, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)PySfSprite_init, /* tp_init */ - 0, /* tp_alloc */ - PySfSprite_new, /* tp_new */ -}; - - diff --git a/bindings/python/src/Sprite.hpp b/bindings/python/src/Sprite.hpp deleted file mode 100644 index 78ae631e..00000000 --- a/bindings/python/src/Sprite.hpp +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYSPRITE_HPP -#define __PYSPRITE_HPP - -#include - -#include - -#include "Image.hpp" -#include "Rect.hpp" - -typedef struct { - PyObject_HEAD - bool IsCustom; - sf::Sprite *obj; - PySfImage *Image; - PySfIntRect *SubRect; -} PySfSprite; - -#endif diff --git a/bindings/python/src/Text.cpp b/bindings/python/src/Text.cpp deleted file mode 100644 index 84529c16..00000000 --- a/bindings/python/src/Text.cpp +++ /dev/null @@ -1,307 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Text.hpp" -#include "Font.hpp" -#include "Color.hpp" -#include "Rect.hpp" - -#include "compat.hpp" - - -extern PyTypeObject PySfDrawableType; -extern PyTypeObject PySfFontType; - - -static void -PySfText_dealloc(PySfText *self) -{ - Py_CLEAR(self->font); - delete self->obj; - free_object(self); -} - -static PyObject * -PySfText_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfText *self; - self = (PySfText *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->font = NULL; - self->IsCustom = false; - self->obj = new sf::Text(); - } - return (PyObject *)self; -} - -static PyObject * -PySfText_SetString(PySfText* self, PyObject *args) -{ - char *Text, *EncodingStr=NULL; - int Length; - std::string Encoding; - if (PyArg_ParseTuple(args, "u:Text.SetString", &Text)) - { -#if Py_UNICODE_SIZE == 4 - self->obj->SetString((sf::Uint32 *)Text); -#else - self->obj->SetString((sf::Uint16 *)Text); -#endif - } - else if (PyArg_ParseTuple(args, "s|#s:Text.SetString", &Text, &Length, &EncodingStr)) - { - PyErr_Clear(); - if (EncodingStr == NULL) - self->obj->SetString(Text); - else - { - Encoding.assign(EncodingStr); - if (Encoding == "utf8") - self->obj->SetString(Text); - else if (Encoding == "utf16") - self->obj->SetString(Text+2); - else if (Encoding == "utf32") - self->obj->SetString(Text+4); - else - { - PyErr_Format(PyExc_TypeError, "Text.SetString() Encoding %s not supported", EncodingStr); - return NULL; - } - } - } - else - { - PyErr_BadArgument(); - return NULL; - } - Py_RETURN_NONE; -} - -static PyObject * -PySfText_SetFont(PySfText* self, PyObject *args) -{ - PySfFont *Font = (PySfFont *)args; - if (!PyObject_TypeCheck(Font, &PySfFontType)) - { - PyErr_SetString(PyExc_ValueError, "Text.SetFont() Argument must be a sf.Font"); - return NULL; - } - Py_CLEAR(self->font); - Py_INCREF(args); - self->font = Font; - self->obj->SetFont(*(Font->obj)); - Py_RETURN_NONE; -} - -static PyObject * -PySfText_SetCharacterSize(PySfText* self, PyObject *args) -{ - self->obj->SetCharacterSize(PyFloat_AsDouble(args)); - Py_RETURN_NONE; -} - -static PyObject * -PySfText_GetCharacterSize(PySfText* self) -{ - return PyFloat_FromDouble(self->obj->GetCharacterSize()); -} - -static PyObject * -PySfText_SetStyle(PySfText* self, PyObject *args) -{ - self->obj->SetStyle(PyLong_AsUnsignedLong(args)); - Py_RETURN_NONE; -} - -static PyObject * -PySfText_GetStyle(PySfText* self) -{ - return PyLong_FromUnsignedLong(self->obj->GetStyle()); -} - -static PyObject * -PySfText_GetString(PySfText* self) -{ -#if Py_UNICODE_SIZE == 4 - const sf::String& Text(self->obj->GetString()); -#else - const sf::String& Text(self->obj->GetString()); -#endif - return PyUnicode_FromUnicode((const Py_UNICODE*)Text.ToAnsiString().c_str(), Text.GetSize()); -} - -static PyObject * -PySfText_GetFont(PySfText* self) -{ - if (self->font == NULL) - { - PySfFont *Font = GetNewPySfFont(); - Font->obj = (sf::Font *)&(sf::Font::GetDefaultFont()); - Font->Owner = false; - return (PyObject *)Font; - } - else - { - Py_INCREF(self->font); - return (PyObject *)(self->font); - } -} - -static PyObject * -PySfText_GetRect(PySfText* self) -{ - PySfFloatRect *Rect; - - Rect = GetNewPySfFloatRect(); - Rect->Owner = true; - Rect->obj = new sf::FloatRect (self->obj->GetRect()); - PySfFloatRectUpdateSelf(Rect); - - return (PyObject *)Rect; -} - -static PyObject * -PySfText_GetCharacterPos(PySfText* self, PyObject *args) -{ - sf::Vector2f Pos = self->obj->GetCharacterPos(PyLong_AsUnsignedLong(args)); - return Py_BuildValue("ff", Pos.x, Pos.y); -} - -static int -PySfText_init(PySfText *self, PyObject *args, PyObject *kwds) -{ - const char *kwlist[] = {"Text", "Font", "Size", NULL}; - float Size = 30.f; - PyObject *Text=NULL; - PySfFont *Font = NULL; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO!f:Text.__new__", (char **)kwlist, &Text, &PySfFontType, &Font, &Size)) - return -1; - - if (Text != NULL) - { - if (PyUnicode_Check(Text)) - { -#if Py_UNICODE_SIZE == 4 - self->obj->SetString((sf::Uint32 *)PyUnicode_AS_UNICODE(Text)); -#else - self->obj->SetString((sf::Uint16 *)PyUnicode_AS_UNICODE(Text)); -#endif - } -#ifdef IS_PY3K - else if (PyBytes_Check(Text)) - self->obj->SetString(PyBytes_AsString(Text)); -#else - else if (PyString_Check(Text)) - self->obj->SetString(PyString_AsString(Text)); -#endif - else - { - PyErr_SetString(PyExc_TypeError, "Text.__init__() first argument must be str"); - return -1; - } - } - if (Font) PySfText_SetFont(self, (PyObject *)Font); - self->obj->SetCharacterSize(Size); - return 0; -} - - -static PyMethodDef PySfText_methods[] = { - {"GetCharacterPos", (PyCFunction)PySfText_GetCharacterPos, METH_O, "GetCharacterPos(Index)\n\ -Return the visual position (a tuple of two floats) of the Index-th character of the string, in coordinates relative to the string (note : translation, center, rotation and scale are not applied)\n\ - Index : Index of the character"}, - {"SetString", (PyCFunction)PySfText_SetString, METH_VARARGS, "SetString(UnicodeText) or SetString(Text, Encoding='utf8')\nSet the text. Valid encodings are 'utf8', 'utf16' and 'utf32'.\n Text : New text"}, - {"GetString", (PyCFunction)PySfText_GetString, METH_NOARGS, "GetString()\nGet the text as an unicode string."}, - {"SetFont", (PyCFunction)PySfText_SetFont, METH_O, "SetFont(Font)\nSet the font of the string.\n Font : font to use"}, - {"GetFont", (PyCFunction)PySfText_GetFont, METH_NOARGS, "GetFont()\nGet the font used by the string."}, - {"SetCharacterSize", (PyCFunction)PySfText_SetCharacterSize, METH_O, "SetCharacterSize(Size)\nSet the size of the text.\n Size : New size, in pixels"}, - {"GetCharacterSize", (PyCFunction)PySfText_GetCharacterSize, METH_NOARGS, "GetCharacterSize()\nGet the size of the characters."}, - {"SetStyle", (PyCFunction)PySfText_SetStyle, METH_O, "SetStyle(TextSize)\nSet the style of the text. The default style is Regular.\n TextSize : New text style, (combination of Style values)"}, - {"GetStyle", (PyCFunction)PySfText_GetStyle, METH_NOARGS, "GetStyle()\nGet the style of the text."}, - {"GetRect", (PyCFunction)PySfText_GetRect, METH_NOARGS, "GetRect()\nGet the string rectangle on screen."}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfTextType = { - head_init - "Text", /*tp_name*/ - sizeof(PySfText), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfText_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "sf.Text defines a graphical 2D text, that can be drawn on screen.\n\ -Default constructor : Text ()\nConstruct the string from an unicode or an ascii string : Text(Text, Font=sf.Font.GetDefaultFont(), Size=30.)\n Text : Text assigned to the string\n Font : Font used to draw the string (SFML built-in font by default)\n Size : Characters size (30 by default)", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfText_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - &PySfDrawableType, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)PySfText_init, /* tp_init */ - 0, /* tp_alloc */ - PySfText_new, /* tp_new */ -}; - - - -void PySfText_InitConst() -{ - PyObject *obj; - obj = PyLong_FromLong(sf::Text::Regular); - PyDict_SetItemString(PySfTextType.tp_dict, "Regular", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Text::Bold); - PyDict_SetItemString(PySfTextType.tp_dict, "Bold", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Text::Italic); - PyDict_SetItemString(PySfTextType.tp_dict, "Italic", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Text::Underlined); - PyDict_SetItemString(PySfTextType.tp_dict, "Underlined", obj); - Py_DECREF(obj); -} - diff --git a/bindings/python/src/Text.hpp b/bindings/python/src/Text.hpp deleted file mode 100644 index 077f1ba0..00000000 --- a/bindings/python/src/Text.hpp +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYSTRING_HPP -#define __PYSTRING_HPP - -#include - -#include - -#include "Font.hpp" - -typedef struct { - PyObject_HEAD - bool IsCustom; - sf::Text *obj; - PySfFont *font; -} PySfText; - -void PySfText_InitConst(); - -#endif diff --git a/bindings/python/src/VideoMode.cpp b/bindings/python/src/VideoMode.cpp deleted file mode 100644 index b989cd43..00000000 --- a/bindings/python/src/VideoMode.cpp +++ /dev/null @@ -1,197 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "VideoMode.hpp" - -#include - -#include "offsetof.hpp" -#include "compat.hpp" - - -static PyMemberDef PySfVideoMode_members[] = { - {(char *)"Width", T_UINT, offsetof(PySfVideoMode, Width), 0, (char *)"Video mode width, in pixels."}, - {(char *)"Height", T_UINT, offsetof(PySfVideoMode, Height), 0, (char *)"Video mode height, in pixels."}, - {(char *)"BitsPerPixel", T_UINT, offsetof(PySfVideoMode, BitsPerPixel), 0, (char *)"Video mode pixel depth, in bits per pixels."}, - {NULL} /* Sentinel */ -}; - - -static void -PySfVideoMode_dealloc(PySfVideoMode* self) -{ - delete self->obj; - free_object(self); -} - -static PyObject * -PySfVideoMode_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - const char *kwlist[] = {"Width", "Height", "BitsPerPixel", NULL}; - PySfVideoMode *self; - self = (PySfVideoMode *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->BitsPerPixel = 32; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "II|I:VideoMode.__new__", (char **)kwlist, &self->Width, &self->Height, &self->BitsPerPixel)) - return NULL; - self->obj = new sf::VideoMode(self->Width, self->Height, self->BitsPerPixel); - } - return (PyObject *)self; -} - -static PyObject * -PySfVideoMode_IsValid(PySfVideoMode* self) -{ - return PyBool_FromLong(self->obj->IsValid()); -} - -static PyObject * -PySfVideoMode_GetDesktopMode(PySfVideoMode* self) -{ - PySfVideoMode *VideoMode; - - VideoMode = GetNewPySfVideoMode(); - VideoMode->obj = new sf::VideoMode(sf::VideoMode::GetDesktopMode()); - VideoMode->Width = VideoMode->obj->Width; - VideoMode->Height = VideoMode->obj->Height; - VideoMode->BitsPerPixel = VideoMode->obj->BitsPerPixel; - - return (PyObject *)VideoMode; -} - -static PyObject * -PySfVideoMode_GetMode(PySfVideoMode* self, PyObject *args) -{ - std::size_t index; - PySfVideoMode *VideoMode; - - index = (std::size_t)PyLong_AsLong(args); - - VideoMode = GetNewPySfVideoMode(); - VideoMode->obj = new sf::VideoMode(sf::VideoMode::GetMode(index)); - VideoMode->Width = VideoMode->obj->Width; - VideoMode->Height = VideoMode->obj->Height; - VideoMode->BitsPerPixel = VideoMode->obj->BitsPerPixel; - - return (PyObject *)VideoMode; -} - -static PyObject * -PySfVideoMode_GetModesCount(PySfVideoMode* self) -{ - return PyLong_FromLong(sf::VideoMode::GetModesCount()); -} - - -static PyMethodDef PySfVideoMode_methods[] = { - {"IsValid", (PyCFunction)PySfVideoMode_IsValid, METH_NOARGS, "IsValid()\nTell whether or not the video mode is supported."}, - {"GetDesktopMode", (PyCFunction)PySfVideoMode_GetDesktopMode, METH_STATIC | METH_NOARGS, "GetDesktopMode()\nGet the current desktop video mode."}, - {"GetMode", (PyCFunction)PySfVideoMode_GetMode, METH_STATIC | METH_O, "GetMode(Index)\nGet a valid video mode. Index must be in range [0, GetModesCount()[ Modes are sorted from best to worst.\n Index : Index of video mode to get"}, - {"GetModesCount", (PyCFunction)PySfVideoMode_GetModesCount, METH_STATIC | METH_NOARGS, "GetModesCount()\nGet valid video modes count."}, - {NULL} /* Sentinel */ -}; - -PyObject * -PySfVideoMode_richcompare(PyObject *o1, PyObject *o2, int op) -{ - if (*(((PySfVideoMode *)o1)->obj) == *(((PySfVideoMode *)o2)->obj)) - { - if (op==Py_EQ) - Py_RETURN_TRUE; - if (op==Py_NE) - Py_RETURN_FALSE; - } - else - { - if (op==Py_EQ) - Py_RETURN_FALSE; - if (op==Py_NE) - Py_RETURN_TRUE; - } - PyErr_SetString(PyExc_TypeError, "VideoMode comparison : only == and != make sens."); - return NULL; -} - -int -PySfVideoMode_setattro(PyObject* self, PyObject *attr_name, PyObject *v) -{ - int result = PyObject_GenericSetAttr(self, attr_name, v); - PySfVideoMode *Mode = (PySfVideoMode *)self; - Mode->obj->Width = Mode->Width; - Mode->obj->Height = Mode->Height; - Mode->obj->BitsPerPixel = Mode->BitsPerPixel; - return result; -} - -PyTypeObject PySfVideoModeType = { - head_init - "VideoMode", /*tp_name*/ - sizeof(PySfVideoMode), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfVideoMode_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "sf.VideoMode defines a video mode (width, height, bpp, frequency) and provides functions for getting modes supported by the display device\n\ -Default constructor : VideoMode()\n\ -Construct the video mode with its attributes : VideoMode(ModeWidth, ModeHeight, ModeBpp = 32)\n ModeWidth : Width in pixels\n ModeHeight : Height in pixels\n ModeBpp : Pixel depths in bits per pixel (32 by default)", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - PySfVideoMode_richcompare, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfVideoMode_methods, /* tp_methods */ - PySfVideoMode_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfVideoMode_new, /* tp_new */ -}; - - -PySfVideoMode * -GetNewPySfVideoMode() -{ - return PyObject_New(PySfVideoMode, &PySfVideoModeType); -} - diff --git a/bindings/python/src/VideoMode.hpp b/bindings/python/src/VideoMode.hpp deleted file mode 100644 index 3db195e8..00000000 --- a/bindings/python/src/VideoMode.hpp +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYVIDEOMODE_HPP -#define __PYVIDEOMODE_HPP - -#include - -#include - -typedef struct { - PyObject_HEAD - unsigned int Width; - unsigned int Height; - unsigned int BitsPerPixel; - sf::VideoMode *obj; -} PySfVideoMode; - -PySfVideoMode * -GetNewPySfVideoMode(); - -#endif diff --git a/bindings/python/src/View.cpp b/bindings/python/src/View.cpp deleted file mode 100644 index 922c4346..00000000 --- a/bindings/python/src/View.cpp +++ /dev/null @@ -1,168 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "View.hpp" - -#include "offsetof.hpp" -#include "compat.hpp" - - -extern PyTypeObject PySfFloatRectType; - - -static void -PySfView_dealloc(PySfView *self) -{ - if (self->Owner) - delete self->obj; - free_object(self); -} - -static PyObject * -PySfView_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfView *self; - - self = (PySfView *)type->tp_alloc(type, 0); - if (self != NULL) - { - self->Owner = true; - PySfFloatRect *Rect = NULL; - if (!PyArg_ParseTuple(args, "|O!:View.__new__", &PySfFloatRectType, &Rect)) - return NULL; - - if (Rect != NULL) - self->obj = new sf::View( (const sf::FloatRect) *(Rect->obj)); - else - self->obj = new sf::View(); - } - - return (PyObject *)self; -} - -static PyObject * -PySfView_GetCenter(PySfView* self) -{ - sf::Vector2f Vect = self->obj->GetCenter(); - return Py_BuildValue("ff", Vect.x, Vect.y); -} - -static PyObject * -PySfView_Reset(PySfView* self, PyObject *args) -{ - PySfFloatRect *Rect = (PySfFloatRect *)args; - if (!PyObject_TypeCheck(Rect, &PySfFloatRectType)) - { - PyErr_SetString(PyExc_TypeError, "View.Reset() Argument is not a sf.FloatRect instance"); - return NULL; - } - self->obj->Reset(*(Rect->obj)); - Py_RETURN_NONE; -} - -static PyObject * -PySfView_Move(PySfView* self, PyObject *args) -{ - float x, y; - if (!PyArg_ParseTuple(args, "ff:View.Move", &x, &y) ) - return NULL; - self->obj->Move(x, y); - Py_RETURN_NONE; -} - -static PyObject * -PySfView_SetCenter(PySfView* self, PyObject *args) -{ - float x, y; - if (!PyArg_ParseTuple(args, "ff:View.SetCenter", &x, &y) ) - return NULL; - self->obj->SetCenter(x, y); - Py_RETURN_NONE; -} - -static PyObject * -PySfView_Zoom(PySfView* self, PyObject *args) -{ - self->obj->Zoom(PyFloat_AsDouble(args)); - Py_RETURN_NONE; -} - -static PyMethodDef PySfView_methods[] = { - {"GetCenter", (PyCFunction)PySfView_GetCenter, METH_NOARGS, "GetCenter()\nGet the center of the view."}, - {"Move", (PyCFunction)PySfView_Move, METH_VARARGS, "Move(OffsetX, OffsetY)\nMove the view.\n\ - OffsetX : Offset to move the view, on X axis\n\ - OffsetY : Offset to move the view, on Y axis"}, - {"Reset", (PyCFunction)PySfView_Reset, METH_O, "Reset(ViewRect)\nRebuild the view from a rectangle.\n ViewRect : Rectangle defining the position and size of the view."}, - {"SetCenter", (PyCFunction)PySfView_SetCenter, METH_VARARGS, "SetCenter(X, Y)\nChange the center of the view."}, - {"Zoom", (PyCFunction)PySfView_Zoom, METH_O, "Zoom(Factor)\nResize the view rectangle to simulate a zoom / unzoom effect."}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfViewType = { - head_init - "View", /*tp_name*/ - sizeof(PySfView), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfView_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "This class defines a view (position, size, etc.) ; you can consider it as a 2D camera.", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfView_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfView_new, /* tp_new */ -}; - -PySfView * -GetNewPySfView() -{ - return PyObject_New(PySfView, &PySfViewType); -} - diff --git a/bindings/python/src/View.hpp b/bindings/python/src/View.hpp deleted file mode 100644 index 98f12527..00000000 --- a/bindings/python/src/View.hpp +++ /dev/null @@ -1,43 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYVIEW_HPP -#define __PYVIEW_HPP - -#include - -#include - -#include "Rect.hpp" - -typedef struct { - PyObject_HEAD - bool Owner; - sf::View *obj; -} PySfView; - -PySfView * -GetNewPySfView(); - -#endif diff --git a/bindings/python/src/Window.cpp b/bindings/python/src/Window.cpp deleted file mode 100644 index 542b8668..00000000 --- a/bindings/python/src/Window.cpp +++ /dev/null @@ -1,395 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "Window.hpp" - -#include "Event.hpp" -#include "VideoMode.hpp" -#include "Input.hpp" -#include "ContextSettings.hpp" - -#include - -#include "compat.hpp" - - -extern PyTypeObject PySfEventType; -extern PyTypeObject PySfContextSettingsType; -extern PyTypeObject PySfVideoModeType; - - -static void -PySfWindow_dealloc(PySfWindow* self) -{ - delete self->obj; - free_object(self); -} - -static PyObject * -PySfWindow_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - long Handle; - PySfContextSettings *Params=NULL; - PySfWindow *self; - self = (PySfWindow *)type->tp_alloc(type, 0); - if (self != NULL) - { - if (PyArg_ParseTuple(args, "l|O!:Window.__new__", &Handle, &PySfContextSettingsType, &Params)) - { - if (Params) - { - PySfContextSettingsUpdate(Params); - self->obj = new sf::Window((sf::WindowHandle)Handle, *(Params->obj)); - } - else - self->obj = new sf::Window((sf::WindowHandle)Handle); - } - else - { - PyErr_Clear(); - self->obj = new sf::Window(); - } - } - return (PyObject *)self; -} - - -static PyObject* -PySfWindow_GetEvent(PySfWindow *self, PyObject *args) -{ - PySfEvent *PyEvent = (PySfEvent *)args; - - if (! PyObject_TypeCheck(PyEvent, &PySfEventType)) - { - PyErr_SetString(PyExc_TypeError, "Window.GetEvent() Argument is not a sfEvent"); - return NULL; - } - - if (self->obj->GetEvent(*(PyEvent->obj))) - { - PyEvent->Type = PyEvent->obj->Type; - PyEvent->Text->Unicode = PyEvent->obj->Text.Unicode; - PyEvent->Key->Code = PyEvent->obj->Key.Code; - Py_DECREF(PyEvent->Key->Alt); - PyEvent->Key->Alt = PyBool_FromLong(PyEvent->obj->Key.Alt); - Py_DECREF(PyEvent->Key->Control); - PyEvent->Key->Control = PyBool_FromLong(PyEvent->obj->Key.Control); - Py_DECREF(PyEvent->Key->Shift); - PyEvent->Key->Shift = PyBool_FromLong(PyEvent->obj->Key.Shift); - PyEvent->MouseButton->Button = PyEvent->obj->MouseButton.Button; - PyEvent->MouseButton->X = PyEvent->obj->MouseButton.X; - PyEvent->MouseButton->Y = PyEvent->obj->MouseButton.Y; - PyEvent->MouseMove->X = PyEvent->obj->MouseMove.X; - PyEvent->MouseMove->Y = PyEvent->obj->MouseMove.Y; - PyEvent->JoyMove->JoystickId = PyEvent->obj->JoyMove.JoystickId; - PyEvent->JoyButton->JoystickId = PyEvent->obj->JoyButton.JoystickId; - PyEvent->JoyButton->Button = PyEvent->obj->JoyButton.Button; - PyEvent->JoyMove->Axis = PyEvent->obj->JoyMove.Axis; - PyEvent->JoyMove->Position = PyEvent->obj->JoyMove.Position; - PyEvent->Size->Width = PyEvent->obj->Size.Width; - PyEvent->Size->Height = PyEvent->obj->Size.Height; - PyEvent->MouseWheel->Delta = PyEvent->obj->MouseWheel.Delta; - Py_RETURN_TRUE; - } - else - Py_RETURN_FALSE; -} - - -PyObject* -PySfWindow_Create(PySfWindow* self, PyObject *args, PyObject *kwds) -{ - PyObject *VideoModeTmp=NULL; - sf::VideoMode *VideoMode; - char *Title=NULL; - unsigned long WindowStyle = sf::Style::Resize | sf::Style::Close; - PySfContextSettings *Params=NULL; - - const char *kwlist[] = {"VideoMode", "Title", "WindowStyle", "Params", NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!s|IO!:Window.Create", (char **)kwlist, &PySfVideoModeType, &VideoModeTmp, &Title, &WindowStyle, &PySfContextSettingsType, &Params)) - return NULL; - - VideoMode = ((PySfVideoMode *)VideoModeTmp)->obj; - - if (Params) - { - PySfContextSettingsUpdate(Params); - self->obj->Create(*VideoMode, Title, WindowStyle, *(Params->obj)); - } - else - self->obj->Create(*VideoMode, Title, WindowStyle); - - Py_RETURN_NONE; -} - -static int -PySfWindow_init(PySfWindow *self, PyObject *args, PyObject *kwds) -{ - long Handle; - PySfContextSettings *Params; - - if (args != NULL) - { - if (PyTuple_Size(args) == 0) - return 0; - if (PyArg_ParseTuple(args, "l|O!:Window.__new__", &Handle, &PySfContextSettingsType, &Params)) - return 0; - PyErr_Clear(); - if (PySfWindow_Create(self, args, kwds) == NULL) - return -1; - } - return 0; -} - -static PyObject * -PySfWindow_Close(PySfWindow *self) -{ - self->obj->Close(); - Py_RETURN_NONE; -} -static PyObject * -PySfWindow_IsOpened(PySfWindow *self) -{ - return PyBool_FromLong(self->obj->IsOpened()); -} -static PyObject * -PySfWindow_GetWidth(PySfWindow *self) -{ - return PyLong_FromUnsignedLong(self->obj->GetWidth()); -} -static PyObject * -PySfWindow_GetHeight(PySfWindow *self) -{ - return PyLong_FromUnsignedLong(self->obj->GetHeight()); -} - -static PyObject * -PySfWindow_UseVerticalSync(PySfWindow *self, PyObject *args) -{ - self->obj->UseVerticalSync(PyBool_AsBool(args)); - Py_RETURN_NONE; -} -static PyObject * -PySfWindow_ShowMouseCursor(PySfWindow *self, PyObject *args) -{ - self->obj->ShowMouseCursor(PyBool_AsBool(args)); - Py_RETURN_NONE; -} - -static PyObject * -PySfWindow_SetActive(PySfWindow *self, PyObject *args) -{ - return PyBool_FromLong(self->obj->SetActive(PyBool_AsBool(args))); -} -static PyObject * -PySfWindow_Display(PySfWindow *self) -{ - self->obj->Display(); - Py_RETURN_NONE; -} -static PyObject * -PySfWindow_GetFrameTime(PySfWindow *self) -{ - return PyFloat_FromDouble(self->obj->GetFrameTime()); -} - -static PyObject * -PySfWindow_GetInput(PySfWindow *self) -{ - PySfInput *Input; - Input = GetNewPySfInput(); - Input->obj = (sf::Input *)&self->obj->GetInput(); - return (PyObject *)Input; -} - -static PyObject * -PySfWindow_GetSettings(PySfWindow *self) -{ - PySfContextSettings *Settings; - Settings = GetNewPySfContextSettings(); - Settings->obj = new sf::ContextSettings(self->obj->GetSettings()); - Settings->DepthBits = Settings->obj->DepthBits; - Settings->StencilBits = Settings->obj->StencilBits; - Settings->AntialiasingLevel = Settings->obj->AntialiasingLevel; - return (PyObject *)Settings; -} - -static PyObject * -PySfWindow_SetPosition(PySfWindow* self, PyObject *args) -{ - int Left=0, Top=0; - if (!PyArg_ParseTuple(args, "ii:Window.SetPosition", &Left, &Top)) - return NULL; - self->obj->SetPosition(Left,Top); - Py_RETURN_NONE; -} - -static PyObject * -PySfWindow_SetFramerateLimit(PySfWindow *self, PyObject *args) -{ - self->obj->SetFramerateLimit(PyLong_AsUnsignedLong(args)); - Py_RETURN_NONE; -} - -static PyObject * -PySfWindow_Show(PySfWindow *self, PyObject *args) -{ - self->obj->Show(PyBool_AsBool(args)); - Py_RETURN_NONE; -} - -static PyObject * -PySfWindow_EnableKeyRepeat(PySfWindow *self, PyObject *args) -{ - self->obj->EnableKeyRepeat(PyBool_AsBool(args)); - Py_RETURN_NONE; -} - -static PyObject * -PySfWindow_SetCursorPosition(PySfWindow* self, PyObject *args) -{ - unsigned int Left=0, Top=0; - if (!PyArg_ParseTuple(args, "II:Window.SetCursorPosition", &Left, &Top)) - return NULL; - self->obj->SetCursorPosition(Left,Top); - Py_RETURN_NONE; -} - -static PyObject * -PySfWindow_SetSize(PySfWindow* self, PyObject *args) -{ - unsigned int Width=0, Height=0; - if (!PyArg_ParseTuple(args, "II:Window.SetSize", &Width, &Height)) - return NULL; - self->obj->SetSize(Width, Height); - Py_RETURN_NONE; -} - -static PyObject * -PySfWindow_SetJoystickThreshold(PySfWindow* self, PyObject *args) -{ - self->obj->SetJoystickThreshold(PyFloat_AsDouble(args)); - Py_RETURN_NONE; -} - -static PyObject * -PySfWindow_SetIcon(PySfWindow* self, PyObject *args) -{ - unsigned int Width, Height, Size; - char *Data; - - if (! PyArg_ParseTuple(args, "IIs#:Window.SetIcon", &Width, &Height, &Data, &Size)) - return NULL; - - self->obj->SetIcon(Width, Height, (sf::Uint8*) Data); - Py_RETURN_NONE; -} - -static PyMethodDef PySfWindow_methods[] = { - {"Close", (PyCFunction)PySfWindow_Close, METH_NOARGS, "Close()\nClose (destroy) the window. The sf.Window instance remains valid and you can call Create to recreate the window."}, - {"Create", (PyCFunction)PySfWindow_Create, METH_VARARGS | METH_KEYWORDS, "Create(Mode, Title, sf.Style.Resize | sf.Style.Close, Params = sf.ContextSettings())\n\ -Create a window.\n\ - Mode : Video mode to use (sf.VideoMode instance)\n\ - Title : Title of the window\n\ - WindowStyle : Window style (Resize | Close by default)\n\ - Params : Creation parameters (see default constructor for default values)"}, - {"Display", (PyCFunction)PySfWindow_Display, METH_NOARGS, "Display()\nDisplay the window on screen."}, - {"EnableKeyRepeat", (PyCFunction)PySfWindow_EnableKeyRepeat, METH_O, "EnableKeyRepeat(Enable)\nEnable or disable automatic key-repeat. Automatic key-repeat is enabled by default.\n Enabled : True to enable, false to disable"}, - {"GetEvent", (PyCFunction)PySfWindow_GetEvent, METH_O, "GetEvent(Event)\nGet the event on top of events stack, if any, and pop it. Returns True if an event was returned, False if events stack was empty.\n EventReceived : Event to fill, if any."}, - {"GetFrameTime", (PyCFunction)PySfWindow_GetFrameTime, METH_NOARGS, "GetFrameTime()\nGet time elapsed since last frame. Returns time elapsed, in seconds"}, - {"GetHeight", (PyCFunction)PySfWindow_GetHeight, METH_NOARGS, "GetHeight()\nGet the height of the rendering region of the window."}, - {"GetInput", (PyCFunction)PySfWindow_GetInput, METH_NOARGS, "GetInput()\nGet the input manager of the window."}, - {"GetSettings", (PyCFunction)PySfWindow_GetSettings, METH_NOARGS, "GetSettings()\nGet the creation settings of the window."}, - {"GetWidth", (PyCFunction)PySfWindow_GetWidth, METH_NOARGS, "GetWidth()\nGet the width of the rendering region of the window."}, - {"IsOpened", (PyCFunction)PySfWindow_IsOpened, METH_NOARGS, "IsOpened()\nTell whether or not the window is opened (ie. has been created). Note that a hidden window (Show(False)) will still return True."}, - {"SetActive", (PyCFunction)PySfWindow_SetActive, METH_O, "SetActive(Active)\nActivate of deactivate the window as the current target for rendering. Returns True if operation was successful, False otherwise.\n Active : True to activate, False to deactivate (True by default)"}, - {"SetCursorPosition", (PyCFunction)PySfWindow_SetCursorPosition, METH_VARARGS, "SetCursorPosition(Left, Top)\nChange the position of the mouse cursor.\n Left : Left coordinate of the cursor, relative to the window\n Top : Top coordinate of the cursor, relative to the window"}, - {"SetSize", (PyCFunction)PySfWindow_SetSize, METH_VARARGS, "SetSize(Width, Height)\nChange the size of the rendering region of the window.\n\ - Width : New width\n Height : New height"}, - {"SetFramerateLimit", (PyCFunction)PySfWindow_SetFramerateLimit, METH_O, "SetFramerateLimit(Limit)\nSet the framerate at a fixed frequency.\n Limit : Framerate limit, in frames per seconds (use 0 to disable limit)"}, - {"SetJoystickThreshold", (PyCFunction)PySfWindow_SetJoystickThreshold, METH_O, "SetJoystickThreshold(Threshold)\nChange the joystick threshold, ie. the value below which no move event will be generated.\n Threshold : New threshold, in range [0., 100.]"}, - {"SetPosition", (PyCFunction)PySfWindow_SetPosition, METH_VARARGS, "SetPosition(X, Y)\nChange the position of the window on screen. Only works for top-level windows\n Left : Left position\n Top : Top position"}, - {"Show", (PyCFunction)PySfWindow_Show, METH_O, "Show(State)\nShow or hide the window.\n State : True to show, false to hide."}, - {"ShowMouseCursor", (PyCFunction)PySfWindow_ShowMouseCursor, METH_O, "ShowMouseCursor(Show)\nShow or hide the mouse cursor.\n Show : True to show, false to hide."}, - {"UseVerticalSync", (PyCFunction)PySfWindow_UseVerticalSync, METH_O, "UseVerticalSync(Enabled)\nEnable / disable vertical synchronization.\n Enabled : True to enable v-sync, False to deactivate"}, - {"SetIcon", (PyCFunction)PySfWindow_SetIcon, METH_VARARGS, "SetIcon(Width, Height, Pixels)\n\ -Change the window's icon.\n\ - Width : Icon's width, in pixels\n\ - Height : Icon's height, in pixels\n\ - Pixels : Pointer to the pixels in memory, format must be RGBA 32 bits."}, - {NULL} /* Sentinel */ -}; - -PyTypeObject PySfWindowType = { - head_init - "Window", /*tp_name*/ - sizeof(PySfWindow), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)PySfWindow_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "sf.Window is a rendering window ; it can create a new window or connect to an existing one.\n\ -Default constructor : sf.Window()\n\ -Construct a new window : sf.Window(Mode, Title, sf.Style.Resize | sf.Style.Close, Params = sf.ContextSettings())\n\ - Mode : Video mode to use (sf.VideoMode instance)\n\ - Title : Title of the window\n\ - WindowStyle : Window style (Resize | Close by default)\n\ - Params : Creation parameters (see default constructor for default values)\n\ -Construct the window from an existing control : sf.Window(Handle, Params)\n\ - Handle : Platform-specific handle of the control\n\ - Params : Creation parameters (see default constructor for default values)", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - PySfWindow_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)PySfWindow_init, /* tp_init */ - 0, /* tp_alloc */ - PySfWindow_new, /* tp_new */ -}; - - diff --git a/bindings/python/src/Window.hpp b/bindings/python/src/Window.hpp deleted file mode 100644 index 5b26b519..00000000 --- a/bindings/python/src/Window.hpp +++ /dev/null @@ -1,41 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYWINDOW_HPP -#define __PYWINDOW_HPP - -#include - -#include - - -typedef struct { - PyObject_HEAD - sf::Window *obj; -} PySfWindow; - -PyObject* -PySfWindow_Create(PySfWindow* self, PyObject *args, PyObject *kwds); - -#endif diff --git a/bindings/python/src/WindowStyle.cpp b/bindings/python/src/WindowStyle.cpp deleted file mode 100644 index 03976e50..00000000 --- a/bindings/python/src/WindowStyle.cpp +++ /dev/null @@ -1,103 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "WindowStyle.hpp" - -#include "compat.hpp" - - -static PyObject * -PySfStyle_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PySfStyle *self; - self = (PySfStyle *)type->tp_alloc(type, 0); - return (PyObject *)self; -} - -PyTypeObject PySfStyleType = { - head_init - "Style", /*tp_name*/ - sizeof(PySfStyle), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - 0, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "Enumeration of window creation styles.\n\ -None No border / title bar (this flag and all others are mutually exclusive).\n\ -Titlebar Title bar + fixed border.\n\ -Resize Titlebar + resizable border + maximize button.\n\ -Close Titlebar + close button.\n\ -Fullscreen Fullscreen mode (this flag and all others are mutually exclusive).", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - PySfStyle_new, /* tp_new */ -}; - -void PySfStyle_InitConst() -{ - PyObject *obj; - obj = PyLong_FromLong(sf::Style::None); - PyDict_SetItemString(PySfStyleType.tp_dict, "None", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Style::Titlebar); - PyDict_SetItemString(PySfStyleType.tp_dict, "Titlebar", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Style::Resize); - PyDict_SetItemString(PySfStyleType.tp_dict, "Resize", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Style::Close); - PyDict_SetItemString(PySfStyleType.tp_dict, "Close", obj); - Py_DECREF(obj); - obj = PyLong_FromLong(sf::Style::Fullscreen); - PyDict_SetItemString(PySfStyleType.tp_dict, "Fullscreen", obj); - Py_DECREF(obj); -} - diff --git a/bindings/python/src/WindowStyle.hpp b/bindings/python/src/WindowStyle.hpp deleted file mode 100644 index d93516ef..00000000 --- a/bindings/python/src/WindowStyle.hpp +++ /dev/null @@ -1,39 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYWINDOWSTYLE_HPP -#define __PYWINDOWSTYLE_HPP - -#include - -#include - -typedef struct { - PyObject_HEAD -} PySfStyle; - -void -PySfStyle_InitConst(); - -#endif diff --git a/bindings/python/src/compat.hpp b/bindings/python/src/compat.hpp deleted file mode 100644 index 4bbdc028..00000000 --- a/bindings/python/src/compat.hpp +++ /dev/null @@ -1,72 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYCOMPAT_HPP -#define __PYCOMPAT_HPP - -#if PY_MAJOR_VERSION >= 3 - -#define IS_PY3K -#define head_init PyVarObject_HEAD_INIT(NULL, 0) - -#define save_to_file(self, args) \ - PyObject *string = PyUnicode_AsUTF8String(args); \ - if (string == NULL) return NULL; \ - char *path = PyBytes_AsString(string); \ - bool result = self->obj->SaveToFile(path); \ - Py_DECREF(string); \ - return PyBool_FromLong(result) - -#define load_from_file(self, args) \ - PyObject *string = PyUnicode_AsUTF8String(args); \ - if (string == NULL) return NULL; \ - char *path = PyBytes_AsString(string); \ - bool result = self->obj->LoadFromFile(path); \ - Py_DECREF(string); \ - return PyBool_FromLong(result) - -#else - -#define save_to_file(self, args) \ - return PyBool_FromLong(self->obj->SaveToFile(PyString_AsString(args))) -#define load_from_file(self, args) \ - return PyBool_FromLong(self->obj->LoadFromFile(PyString_AsString(args))) - -#define head_init PyObject_HEAD_INIT(NULL) 0, -#define PyBytes_FromStringAndSize PyString_FromStringAndSize - -#endif - -#ifndef Py_TYPE -#define Py_TYPE(a) a->ob_type -#endif - -#define free_object(a) Py_TYPE(a)->tp_free((PyObject*)a) - -#define PyBool_AsBool(a) ((PyObject_IsTrue(a))?true:false) - - - -#endif - diff --git a/bindings/python/src/main.cpp b/bindings/python/src/main.cpp deleted file mode 100644 index 8c531284..00000000 --- a/bindings/python/src/main.cpp +++ /dev/null @@ -1,304 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#include "main.hpp" - -#include "Color.hpp" -#include "Key.hpp" -#include "Joy.hpp" -#include "Event.hpp" -#include "Mouse.hpp" -#include "WindowStyle.hpp" -#include "ContextSettings.hpp" -#include "Blend.hpp" -#include "Sound.hpp" -#include "Text.hpp" -#include "SoundStream.hpp" - -#include "compat.hpp" - -extern PyTypeObject PySfClockType; - -extern PyTypeObject PySfEventType; -extern PyTypeObject PySfEventTextType; -extern PyTypeObject PySfEventKeyType; -extern PyTypeObject PySfEventMouseMoveType; -extern PyTypeObject PySfEventMouseButtonType; -extern PyTypeObject PySfEventMouseWheelType; -extern PyTypeObject PySfEventJoyMoveType; -extern PyTypeObject PySfEventJoyButtonType; -extern PyTypeObject PySfEventSizeType; -extern PyTypeObject PySfKeyType; -extern PyTypeObject PySfJoyType; -extern PyTypeObject PySfMouseType; - -extern PyTypeObject PySfVideoModeType; -extern PyTypeObject PySfWindowType; -extern PyTypeObject PySfStyleType; -extern PyTypeObject PySfContextSettingsType; -extern PyTypeObject PySfRenderWindowType; -extern PyTypeObject PySfViewType; -extern PyTypeObject PySfInputType; - -extern PyTypeObject PySfDrawableType; -extern PyTypeObject PySfBlendType; -extern PyTypeObject PySfSpriteType; -extern PyTypeObject PySfFontType; -extern PyTypeObject PySfGlyphType; -extern PyTypeObject PySfTextType; -//extern PyTypeObject PySfPostFXType; - -extern PyTypeObject PySfImageType; -extern PyTypeObject PySfColorType; - -extern PyTypeObject PySfShapeType; - -extern PyTypeObject PySfIntRectType; -extern PyTypeObject PySfFloatRectType; - -extern PyTypeObject PySfMusicType; -extern PyTypeObject PySfSoundType; -extern PyTypeObject PySfSoundBufferType; -extern PyTypeObject PySfSoundRecorderType; -extern PyTypeObject PySfSoundBufferRecorderType; -extern PyTypeObject PySfSoundStreamType; -extern PyTypeObject PySfListenerType; - - -static PyMethodDef module_methods[] = { - {"Sleep", (PyCFunction)PySFML_Sleep, METH_O, "Sleep(Duration)\nMake the current thread sleep for a given time.\n Duration : Time to sleep, in seconds"}, - {NULL} /* Sentinel */ -}; - -#ifdef IS_PY3K -#define INITERROR return NULL -static PyModuleDef module_def = { - PyModuleDef_HEAD_INIT, - "sf", - "Python binding for sfml (Simple Fast Media Library)", - -1, - module_methods, NULL, NULL, NULL, NULL -}; - -PyMODINIT_FUNC -PyInit_sf(void) -#else -#define INITERROR return - -#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ -#define PyMODINIT_FUNC void -#endif -PyMODINIT_FUNC -initsf(void) -#endif -{ - PyObject *m; - - if (PyType_Ready(&PySfClockType) < 0) - INITERROR; - - if (PyType_Ready(&PySfWindowType) < 0) - INITERROR; - if (PyType_Ready(&PySfStyleType) < 0) - INITERROR; - if (PyType_Ready(&PySfContextSettingsType) < 0) - INITERROR; - if (PyType_Ready(&PySfRenderWindowType) < 0) - INITERROR; - if (PyType_Ready(&PySfVideoModeType) < 0) - INITERROR; - if (PyType_Ready(&PySfViewType) < 0) - INITERROR; - if (PyType_Ready(&PySfInputType) < 0) - INITERROR; - - if (PyType_Ready(&PySfEventType) < 0) - INITERROR; - if (PyType_Ready(&PySfEventTextType) < 0) - INITERROR; - if (PyType_Ready(&PySfEventKeyType) < 0) - INITERROR; - if (PyType_Ready(&PySfEventMouseMoveType) < 0) - INITERROR; - if (PyType_Ready(&PySfEventMouseButtonType) < 0) - INITERROR; - if (PyType_Ready(&PySfEventMouseWheelType) < 0) - INITERROR; - if (PyType_Ready(&PySfEventJoyMoveType) < 0) - INITERROR; - if (PyType_Ready(&PySfEventJoyButtonType) < 0) - INITERROR; - if (PyType_Ready(&PySfEventSizeType) < 0) - INITERROR; - if (PyType_Ready(&PySfKeyType) < 0) - INITERROR; - if (PyType_Ready(&PySfJoyType) < 0) - INITERROR; - if (PyType_Ready(&PySfMouseType) < 0) - INITERROR; - - if (PyType_Ready(&PySfDrawableType) < 0) - INITERROR; - if (PyType_Ready(&PySfBlendType) < 0) - INITERROR; - if (PyType_Ready(&PySfSpriteType) < 0) - INITERROR; - if (PyType_Ready(&PySfFontType) < 0) - INITERROR; - if (PyType_Ready(&PySfGlyphType) < 0) - INITERROR; - if (PyType_Ready(&PySfTextType) < 0) - INITERROR; - /*if (PyType_Ready(&PySfPostFXType) < 0) - INITERROR; */ - - if (PyType_Ready(&PySfImageType) < 0) - INITERROR; - - if (PyType_Ready(&PySfShapeType) < 0) - INITERROR; - - if (PyType_Ready(&PySfColorType) < 0) - INITERROR; - - if (PyType_Ready(&PySfIntRectType) < 0) - INITERROR; - if (PyType_Ready(&PySfFloatRectType) < 0) - INITERROR; - - if (PyType_Ready(&PySfMusicType) < 0) - INITERROR; - if (PyType_Ready(&PySfSoundType) < 0) - INITERROR; - if (PyType_Ready(&PySfSoundBufferType) < 0) - INITERROR; - if (PyType_Ready(&PySfSoundBufferRecorderType) < 0) - INITERROR; - if (PyType_Ready(&PySfSoundRecorderType) < 0) - INITERROR; - if (PyType_Ready(&PySfSoundStreamType) < 0) - INITERROR; - if (PyType_Ready(&PySfListenerType) < 0) - INITERROR; - -#ifdef IS_PY3K - m = PyModule_Create(&module_def); -#else - m = Py_InitModule3("sf", module_methods, "Python binding for sfml (Simple Fast Media Library)"); -#endif - - if (m == NULL) - INITERROR; - - Py_INCREF(&PySfClockType); - PyModule_AddObject(m, "Clock", (PyObject *)&PySfClockType); - - Py_INCREF(&PySfWindowType); - PyModule_AddObject(m, "Window", (PyObject *)&PySfWindowType); - Py_INCREF(&PySfStyleType); - PyModule_AddObject(m, "Style", (PyObject *)&PySfStyleType); - Py_INCREF(&PySfContextSettingsType); - PyModule_AddObject(m, "ContextSettings", (PyObject *)&PySfContextSettingsType); - Py_INCREF(&PySfRenderWindowType); - PyModule_AddObject(m, "RenderWindow", (PyObject *)&PySfRenderWindowType); - Py_INCREF(&PySfVideoModeType); - PyModule_AddObject(m, "VideoMode", (PyObject *)&PySfVideoModeType); - Py_INCREF(&PySfViewType); - PyModule_AddObject(m, "View", (PyObject *)&PySfViewType); - Py_INCREF(&PySfInputType); - PyModule_AddObject(m, "Input", (PyObject *)&PySfInputType); - - Py_INCREF(&PySfDrawableType); - PyModule_AddObject(m, "Drawable", (PyObject *)&PySfDrawableType); - Py_INCREF(&PySfBlendType); - PyModule_AddObject(m, "Blend", (PyObject *)&PySfBlendType); - Py_INCREF(&PySfSpriteType); - PyModule_AddObject(m, "Sprite", (PyObject *)&PySfSpriteType); - Py_INCREF(&PySfFontType); - PyModule_AddObject(m, "Font", (PyObject *)&PySfFontType); - Py_INCREF(&PySfGlyphType); - PyModule_AddObject(m, "Glyph", (PyObject *)&PySfGlyphType); - Py_INCREF(&PySfTextType); - PyModule_AddObject(m, "Text", (PyObject *)&PySfTextType); - /*Py_INCREF(&PySfPostFXType); - PyModule_AddObject(m, "PostFX", (PyObject *)&PySfPostFXType); */ - - Py_INCREF(&PySfEventType); - PyModule_AddObject(m, "Event", (PyObject *)&PySfEventType); - Py_INCREF(&PySfKeyType); - PyModule_AddObject(m, "Key", (PyObject *)&PySfKeyType); - Py_INCREF(&PySfJoyType); - PyModule_AddObject(m, "Joy", (PyObject *)&PySfJoyType); - Py_INCREF(&PySfMouseType); - PyModule_AddObject(m, "Mouse", (PyObject *)&PySfMouseType); - - Py_INCREF(&PySfImageType); - PyModule_AddObject(m, "Image", (PyObject *)&PySfImageType); - - Py_INCREF(&PySfColorType); - PyModule_AddObject(m, "Color", (PyObject *)&PySfColorType); - - Py_INCREF(&PySfShapeType); - PyModule_AddObject(m, "Shape", (PyObject *)&PySfShapeType); - - Py_INCREF(&PySfIntRectType); - PyModule_AddObject(m, "IntRect", (PyObject *)&PySfIntRectType); - Py_INCREF(&PySfFloatRectType); - PyModule_AddObject(m, "FloatRect", (PyObject *)&PySfFloatRectType); - - Py_INCREF(&PySfMusicType); - PyModule_AddObject(m, "Music", (PyObject *)&PySfMusicType); - Py_INCREF(&PySfSoundType); - PyModule_AddObject(m, "Sound", (PyObject *)&PySfSoundType); - Py_INCREF(&PySfSoundBufferType); - PyModule_AddObject(m, "SoundBuffer", (PyObject *)&PySfSoundBufferType); - Py_INCREF(&PySfSoundRecorderType); - PyModule_AddObject(m, "SoundRecorder", (PyObject *)&PySfSoundRecorderType); - Py_INCREF(&PySfSoundBufferRecorderType); - PyModule_AddObject(m, "SoundBufferRecorder", (PyObject *)&PySfSoundBufferRecorderType); - Py_INCREF(&PySfSoundStreamType); - PyModule_AddObject(m, "SoundStream", (PyObject *)&PySfSoundStreamType); - Py_INCREF(&PySfListenerType); - PyModule_AddObject(m, "Listener", (PyObject *)&PySfListenerType); - - PyModule_AddStringConstant(m, "Version", "1.6"); - - PySfColor_InitConst(); - PySfKey_InitConst(); - PySfJoy_InitConst(); - PySfEvent_InitConst(); - PySfMouse_InitConst(); - PySfStyle_InitConst(); - PySfBlend_InitConst(); - PySfSound_InitConst(); - PySfSoundStream_InitConst(); - PySfText_InitConst(); - - PyEval_InitThreads(); - -#ifdef IS_PY3K - return m; -#endif -} - diff --git a/bindings/python/src/main.hpp b/bindings/python/src/main.hpp deleted file mode 100644 index dc4a5541..00000000 --- a/bindings/python/src/main.hpp +++ /dev/null @@ -1,37 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __PYMAIN_HPP -#define __PYMAIN_HPP - -#include -#include - -#include -#include - -#include "Event.hpp" -#include "Sleep.hpp" - -#endif diff --git a/bindings/python/src/offsetof.hpp b/bindings/python/src/offsetof.hpp deleted file mode 100644 index 73de395a..00000000 --- a/bindings/python/src/offsetof.hpp +++ /dev/null @@ -1,32 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// PySFML - Python binding for SFML (Simple and Fast Multimedia Library) -// Copyright (C) 2007, 2008 Rémi Koenig (remi.k2620@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef __OFFSETOF_H -#define __OFFSETOF_H - -#undef offsetof -#define offsetof(TYPE, MEMBER) (reinterpret_cast \ - (&reinterpret_cast (static_cast (0)->MEMBER))) - -#endif