Removed the D and Python bindings
@ -1,2 +0,0 @@
|
||||
SirJulio (Dagorn Julien) => sirjulio13@gmail.com
|
||||
Insomniak => insomniak.fr@gmail.com
|
@ -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.
|
@ -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;
|
@ -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");
|
||||
}
|
||||
}
|
@ -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"));
|
||||
}
|
@ -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");
|
||||
}
|
||||
}
|
@ -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"));
|
||||
}
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
@ -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"));
|
||||
}
|
@ -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");
|
||||
}
|
||||
}
|
@ -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;
|
@ -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
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
@ -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");
|
||||
}
|
||||
}
|
@ -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"));
|
||||
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
@ -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"));
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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;
|
@ -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"));
|
||||
|
||||
}
|
@ -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()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
@ -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"));
|
||||
}
|
||||
}
|
@ -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"));
|
||||
}
|
@ -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"));
|
||||
}
|
@ -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"));
|
||||
}
|
@ -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"));
|
||||
}
|
||||
}
|
@ -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 ;
|
@ -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");
|
||||
}
|
||||
}
|
@ -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");
|
||||
}
|
||||
}
|
@ -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"));
|
@ -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");
|
||||
}
|
||||
}
|
@ -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"));
|
||||
}
|
@ -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 ///
|
||||
}
|
@ -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"));
|
||||
}
|
@ -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");
|
||||
}
|
||||
}
|
@ -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");
|
||||
}
|
||||
}
|
@ -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;
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
@ -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;
|
@ -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"));
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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"));
|
||||
}
|
@ -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"));
|
@ -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"));
|
||||
}
|
@ -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;
|
||||
}
|
@ -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"
|
||||
}
|
Before Width: | Height: | Size: 154 KiB |
Before Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 27 KiB |
@ -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;
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
texture framebuffer
|
||||
vec3 color
|
||||
|
||||
effect
|
||||
{
|
||||
vec4 pixel = framebuffer(_in);
|
||||
float gray = pixel.r * 0.39 + pixel.g * 0.50 + pixel.b * 0.11;
|
||||
|
||||
_out = vec4(gray * color, 1.0) * 0.6 + pixel * 0.4;
|
||||
}
|
Before Width: | Height: | Size: 3.1 KiB |
@ -1,12 +0,0 @@
|
||||
texture framebuffer
|
||||
vec2 mouse
|
||||
|
||||
effect
|
||||
{
|
||||
float len = distance(_in, mouse) * 7.0;
|
||||
|
||||
if (len < 1.0)
|
||||
_out = framebuffer(_in + (_in - mouse) * len);
|
||||
else
|
||||
_out = framebuffer(_in);
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
texture framebuffer
|
||||
|
||||
effect
|
||||
{
|
||||
_out = framebuffer(_in);
|
||||
}
|
Before Width: | Height: | Size: 140 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 23 KiB |
@ -1,12 +0,0 @@
|
||||
texture framebuffer
|
||||
texture wave
|
||||
vec2 offset
|
||||
|
||||
effect
|
||||
{
|
||||
vec2 texoffset = wave(_in * offset).xy;
|
||||
texoffset -= vec2(0.5, 0.5);
|
||||
texoffset *= 0.05;
|
||||
|
||||
_out = framebuffer(_in + texoffset);
|
||||
}
|
@ -1,230 +0,0 @@
|
||||
module dflsample;
|
||||
|
||||
import dsfml.system.all;
|
||||
import dsfml.window.all;
|
||||
|
||||
// DFL and Derelict must be present.
|
||||
import dfl.all;
|
||||
|
||||
import Derelict.opengl.gl;
|
||||
import Derelict.opengl.glu;
|
||||
|
||||
|
||||
// An enum for each controls methods
|
||||
enum ControlMethod
|
||||
{
|
||||
MOUSE,
|
||||
KEYBOARD
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
DerelictGL.load();
|
||||
DerelictGLU.load();
|
||||
//Start the message loop
|
||||
Application.run(new MyForm());
|
||||
}
|
||||
|
||||
//A simple form with a groupbox to choose input method and the openGL control
|
||||
class MyForm : Form
|
||||
{
|
||||
GLControl m_gl;
|
||||
GroupBox m_gbx;
|
||||
RadioButton m_rb1;
|
||||
RadioButton m_rb2;
|
||||
|
||||
this()
|
||||
{
|
||||
m_gbx = new GroupBox();
|
||||
m_gbx.dock = DockStyle.TOP;
|
||||
m_gbx.height = 40;
|
||||
m_gbx.text = "Choose your input";
|
||||
this.controls.add(m_gbx);
|
||||
|
||||
m_rb1 = new RadioButton();
|
||||
m_rb1.text = "Mouse";
|
||||
m_rb1.location = Point(10, 15);
|
||||
m_rb1.checked = true;
|
||||
m_rb1.click ~= &radioButtonClick;
|
||||
m_gbx.controls.add(m_rb1);
|
||||
|
||||
m_rb2 = new RadioButton();
|
||||
m_rb2.text = "Keyboard";
|
||||
m_rb2.location = Point(m_rb1.width + 10, 15);
|
||||
m_rb2.click ~= &radioButtonClick;
|
||||
m_gbx.controls.add(m_rb2);
|
||||
|
||||
m_gl = new GLControl();
|
||||
m_gl.dock = DockStyle.FILL;
|
||||
m_gl.controlMethod = ControlMethod.MOUSE;
|
||||
this.controls.add(m_gl);
|
||||
|
||||
this.text = "DFL Opengl Integration Sample";
|
||||
}
|
||||
|
||||
private void radioButtonClick(Control c, EventArgs ea)
|
||||
{
|
||||
m_gl.controlMethod(c.text == "Mouse" ? ControlMethod.MOUSE : ControlMethod.KEYBOARD);
|
||||
m_gl.focus();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//Our OpenGL control
|
||||
class GLControl : Control
|
||||
{
|
||||
Window m_win;
|
||||
Input i;
|
||||
Timer m_timer;
|
||||
GLfloat rotx = 0.f, roty = 0.f;
|
||||
ControlMethod m_method = ControlMethod.MOUSE;
|
||||
|
||||
this ()
|
||||
{
|
||||
super();
|
||||
this.setStyle(ControlStyles.SELECTABLE | ControlStyles.ALL_PAINTING_IN_WM_PAINT | ControlStyles.WANT_ALL_KEYS, true);
|
||||
|
||||
//We set a timer to ensure periodic refresh of the window
|
||||
m_timer = new Timer();
|
||||
m_timer.interval(10);
|
||||
m_timer.tick ~= &this.onTick;
|
||||
|
||||
}
|
||||
|
||||
public void controlMethod(ControlMethod m)
|
||||
{
|
||||
m_method = m;
|
||||
}
|
||||
|
||||
//Override of the onHandleCreated method of Control
|
||||
//integration of DSFML window in a control need a valid handle
|
||||
protected void onHandleCreated(EventArgs ea)
|
||||
{
|
||||
super.onHandleCreated(ea);
|
||||
|
||||
//Construction of the window
|
||||
m_win = new Window(cast(WindowHandle)this.handle);
|
||||
|
||||
//Get the input for further use
|
||||
i = m_win.getInput();
|
||||
|
||||
//Now that the Window is instanciated, we can start the timer.
|
||||
m_timer.start();
|
||||
|
||||
//Some opengl initializations functions
|
||||
glClearDepth(1.f);
|
||||
glClearColor(0.f, 0.f, 0.f, 0.f);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glDepthMask(GL_TRUE);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
gluPerspective(90.f, 1.f, 1.f, 500.f);
|
||||
}
|
||||
|
||||
//We handle Mouse leaving and entering the control to hide or show the cursor
|
||||
protected void onMouseEnter(MouseEventArgs mea)
|
||||
{
|
||||
super.onMouseEnter(mea);
|
||||
Cursor.current.hide();
|
||||
}
|
||||
|
||||
protected void onMouseLeave(MouseEventArgs mea)
|
||||
{
|
||||
super.onMouseLeave(mea);
|
||||
Cursor.current.show();
|
||||
}
|
||||
|
||||
//If the window is resize, we need to modify openGL view
|
||||
protected void onResize(EventArgs ea)
|
||||
{
|
||||
super.onResize(ea);
|
||||
glViewport(0, 0, this.width, this.height);
|
||||
}
|
||||
|
||||
protected void onTick(Timer t, EventArgs ea)
|
||||
{
|
||||
draw();
|
||||
}
|
||||
|
||||
protected void onPaint(PaintEventArgs pea)
|
||||
{
|
||||
super.onPaint(pea);
|
||||
draw();
|
||||
}
|
||||
|
||||
private void handleKeys()
|
||||
{
|
||||
if (i.isKeyDown(KeyCode.UP))
|
||||
rotx += 1.f;
|
||||
if (i.isKeyDown(KeyCode.DOWN))
|
||||
rotx += -1.f;
|
||||
if (i.isKeyDown(KeyCode.LEFT))
|
||||
roty += -1.f;
|
||||
if (i.isKeyDown(KeyCode.RIGHT))
|
||||
roty += 1.f;
|
||||
|
||||
}
|
||||
private void handleMousePos()
|
||||
{
|
||||
rotx = i.getMouseY() - (this.height / 2.0);
|
||||
roty = i.getMouseX() - (this.width / 2.0);
|
||||
}
|
||||
|
||||
private void draw()
|
||||
{
|
||||
if (m_method == ControlMethod.KEYBOARD)
|
||||
handleKeys();
|
||||
else
|
||||
handleMousePos();
|
||||
|
||||
m_win.setActive(true);
|
||||
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
glTranslatef(0.f, 0.f, -200.f);
|
||||
glRotatef(rotx, 1.f, 0.f, 0.f);
|
||||
glRotatef(roty, 0.f, 1.f, 0.f);
|
||||
|
||||
glBegin(GL_QUADS);
|
||||
glColor3f(1.f, 0.f, 0.f);
|
||||
glVertex3f(-50.f, -50.f, -50.f);
|
||||
glVertex3f(-50.f, 50.f, -50.f);
|
||||
glVertex3f( 50.f, 50.f, -50.f);
|
||||
glVertex3f( 50.f, -50.f, -50.f);
|
||||
|
||||
glColor3f(0.f, 1.f, 0.f);
|
||||
glVertex3f(-50.f, -50.f, 50.f);
|
||||
glVertex3f(-50.f, 50.f, 50.f);
|
||||
glVertex3f( 50.f, 50.f, 50.f);
|
||||
glVertex3f( 50.f, -50.f, 50.f);
|
||||
|
||||
glColor3f(0.f, 0.f, 1.f);
|
||||
glVertex3f(-50.f, -50.f, -50.f);
|
||||
glVertex3f(-50.f, 50.f, -50.f);
|
||||
glVertex3f(-50.f, 50.f, 50.f);
|
||||
glVertex3f(-50.f, -50.f, 50.f);
|
||||
|
||||
glColor3f(1.f, 1.f, 0.f);
|
||||
glVertex3f(50.f, -50.f, -50.f);
|
||||
glVertex3f(50.f, 50.f, -50.f);
|
||||
glVertex3f(50.f, 50.f, 50.f);
|
||||
glVertex3f(50.f, -50.f, 50.f);
|
||||
|
||||
glColor3f(1.f, 0.f, 1.f);
|
||||
glVertex3f(-50.f, -50.f, 50.f);
|
||||
glVertex3f(-50.f, -50.f, -50.f);
|
||||
glVertex3f( 50.f, -50.f, -50.f);
|
||||
glVertex3f( 50.f, -50.f, 50.f);
|
||||
|
||||
glColor3f(0.f, 1.f, 1.f);
|
||||
glVertex3f(-50.f, 50.f, 50.f);
|
||||
glVertex3f(-50.f, 50.f, -50.f);
|
||||
glVertex3f( 50.f, 50.f, -50.f);
|
||||
glVertex3f( 50.f, 50.f, 50.f);
|
||||
glEnd();
|
||||
|
||||
m_win.display();
|
||||
}
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
[*]
|
||||
buildflags += -I../../import -Ivoip
|
||||
|
||||
[pong/pong.d]
|
||||
target = bin/pong
|
||||
|
||||
[postFX/postFX.d]
|
||||
target = bin/postFX
|
||||
|
||||
[socket/socketclient.d]
|
||||
target = bin/client
|
||||
|
||||
[socket/socketserver.d]
|
||||
target = bin/server
|
||||
|
||||
[sound3d/sound3d.d]
|
||||
target = bin/sound3d
|
||||
|
||||
[soundstream/soundstream.d]
|
||||
target = bin/soundstream
|
||||
|
||||
[view/view.d]
|
||||
target = bin/view
|
||||
|
||||
[voip/entry.d]
|
||||
target = bin/voip
|
||||
|
||||
version (Windows){
|
||||
version (DFL){
|
||||
[dfl/dflsample.d]
|
||||
target = bin/dflSample
|
||||
}
|
||||
}
|
@ -1,155 +0,0 @@
|
||||
module opengl;
|
||||
|
||||
import dsfml.system.all;
|
||||
import dsfml.audio.all;
|
||||
import dsfml.window.all;
|
||||
import dsfml.graphics.all;
|
||||
|
||||
import std.perf;
|
||||
|
||||
import derelict.opengl.gl;
|
||||
import derelict.opengl.glu;
|
||||
|
||||
void main()
|
||||
{
|
||||
// Create the main window
|
||||
auto window = new RenderWindow(VideoMode(800, 600), "DSFML OpenGL", Style.Default, ContextSettings(24,8,0,3,1));
|
||||
|
||||
DerelictGL.load();
|
||||
DerelictGLU.load();
|
||||
|
||||
// Create a sprite for the background
|
||||
auto backgroundImage = new Image("Data/opengl/background.jpg");
|
||||
auto background = new Sprite(backgroundImage);
|
||||
|
||||
// Load an OpenGL texture.
|
||||
// We could directly use an 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 from the image pixels
|
||||
GLuint texture = 0;
|
||||
{
|
||||
auto image = new Image("Data/opengl/texture.jpg");
|
||||
|
||||
glGenTextures(1, &texture);
|
||||
glBindTexture(GL_TEXTURE_2D, texture);
|
||||
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, image.width, image.height, GL_RGBA, GL_UNSIGNED_BYTE, image.getPixelsArray().ptr);
|
||||
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.f);
|
||||
|
||||
// Setup a perspective projection
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
gluPerspective(90.f, 1.f, 1.f, 500.f);
|
||||
|
||||
// Bind our texture
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glBindTexture(GL_TEXTURE_2D, texture);
|
||||
glColor4f(1.f, 1.f, 1.f, 1.f);
|
||||
|
||||
// Create a clock for measuring the time elapsed
|
||||
auto clock = new PerformanceCounter();
|
||||
clock.start();
|
||||
|
||||
// Start game loop
|
||||
while (window.isOpened())
|
||||
{
|
||||
// Process events
|
||||
Event event;
|
||||
while (window.getEvent(event))
|
||||
{
|
||||
// Close window : exit
|
||||
if (event.Type == EventType.Closed)
|
||||
window.close();
|
||||
|
||||
// Escape key : exit
|
||||
if ((event.Type == EventType.KeyPressed) && (event.Key.Code == KeyCode.Escape))
|
||||
window.close();
|
||||
|
||||
// Adjust the viewport when the window is resized
|
||||
if (event.Type == EventType.Resized)
|
||||
glViewport(0, 0, event.Size.Width, event.Size.Height);
|
||||
}
|
||||
|
||||
// Draw the background
|
||||
window.saveGLStates();
|
||||
window.draw(background);
|
||||
window.restoreGLStates();
|
||||
|
||||
// Activate the window before using OpenGL commands.
|
||||
// This is useless here because we have only one window which is
|
||||
// always the active one, but don't forget it if you use multiple windows
|
||||
window.active = true;
|
||||
|
||||
// Clear the depth buffer
|
||||
glClear(GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
// We get the position of the mouse cursor, so that we can move the box accordingly
|
||||
float x = window.input.mouseX * 200.f / window.width - 100.f;
|
||||
float y = -window.input.mouseY * 200.f / window.height + 100.f;
|
||||
|
||||
// Apply some transformations
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
glTranslatef(x, y, -100.f);
|
||||
|
||||
clock.stop();
|
||||
glRotatef(clock.microseconds() * 0.000001 * 50, 1.f, 0.f, 0.f);
|
||||
glRotatef(clock.microseconds() * 0.000001 * 30, 0.f, 1.f, 0.f);
|
||||
glRotatef(clock.microseconds() * 0.000001 * 90, 0.f, 0.f, 1.f);
|
||||
|
||||
// Draw a cube
|
||||
float size = 20.f;
|
||||
glBegin(GL_QUADS);
|
||||
|
||||
glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
|
||||
glTexCoord2f(0, 1); glVertex3f(-size, size, -size);
|
||||
glTexCoord2f(1, 1); glVertex3f( size, size, -size);
|
||||
glTexCoord2f(1, 0); glVertex3f( size, -size, -size);
|
||||
|
||||
glTexCoord2f(0, 0); glVertex3f(-size, -size, size);
|
||||
glTexCoord2f(0, 1); glVertex3f(-size, size, size);
|
||||
glTexCoord2f(1, 1); glVertex3f( size, size, size);
|
||||
glTexCoord2f(1, 0); glVertex3f( size, -size, size);
|
||||
|
||||
glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
|
||||
glTexCoord2f(0, 1); glVertex3f(-size, size, -size);
|
||||
glTexCoord2f(1, 1); glVertex3f(-size, size, size);
|
||||
glTexCoord2f(1, 0); glVertex3f(-size, -size, size);
|
||||
|
||||
glTexCoord2f(0, 0); glVertex3f(size, -size, -size);
|
||||
glTexCoord2f(0, 1); glVertex3f(size, size, -size);
|
||||
glTexCoord2f(1, 1); glVertex3f(size, size, size);
|
||||
glTexCoord2f(1, 0); glVertex3f(size, -size, size);
|
||||
|
||||
glTexCoord2f(0, 1); glVertex3f(-size, -size, size);
|
||||
glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
|
||||
glTexCoord2f(1, 0); glVertex3f( size, -size, -size);
|
||||
glTexCoord2f(1, 1); glVertex3f( size, -size, size);
|
||||
|
||||
glTexCoord2f(0, 1); glVertex3f(-size, size, size);
|
||||
glTexCoord2f(0, 0); glVertex3f(-size, size, -size);
|
||||
glTexCoord2f(1, 0); glVertex3f( size, size, -size);
|
||||
glTexCoord2f(1, 1); glVertex3f( size, size, size);
|
||||
|
||||
glEnd();
|
||||
|
||||
// Draw some text on top of our OpenGL object
|
||||
window.saveGLStates();
|
||||
Text text = new Text("DSFML / OpenGL demo"c);
|
||||
text.position = Vector2f(250.f, 450.f);
|
||||
text.color = Color(255, 255, 255, 170);
|
||||
window.draw(text);
|
||||
window.restoreGLStates();
|
||||
|
||||
// Finally, display the rendered frame on screen
|
||||
window.display();
|
||||
}
|
||||
|
||||
// Don't forget to destroy our texture
|
||||
glDeleteTextures(1, &texture);
|
||||
}
|
@ -1,202 +0,0 @@
|
||||
module pong;
|
||||
|
||||
import dsfml.system.all;
|
||||
import dsfml.audio.all;
|
||||
import dsfml.window.all;
|
||||
import dsfml.graphics.all;
|
||||
|
||||
version (Tango)
|
||||
{
|
||||
import tango.io.Stdout;
|
||||
import tango.math.Math;
|
||||
}
|
||||
else
|
||||
{
|
||||
import std.math;
|
||||
import std.perf;
|
||||
import std.random;
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
// Defines PI
|
||||
const float PI = 3.14159f;
|
||||
|
||||
// Create the window of the application
|
||||
RenderWindow app = new RenderWindow(VideoMode(800, 600, 32), "SFML Pong");
|
||||
|
||||
app.useVerticalSync(false);
|
||||
|
||||
Input i = app.input;
|
||||
|
||||
// Load the sounds used in the game
|
||||
Sound BallSound = new Sound(new SoundBuffer("Data/ball.wav"));
|
||||
|
||||
// Load the images used in the game
|
||||
Image PaddleImage = new Image("Data/paddle.tga");
|
||||
Image BallImage = new Image("Data/ball.tga");
|
||||
|
||||
|
||||
// Initialize the end text
|
||||
Text End = new Text(""c);
|
||||
Font font = new Font("Data/cheeseburger.ttf");
|
||||
End.font = font;
|
||||
End.characterSize = 60;
|
||||
End.move(150.f, 200.f);
|
||||
End.color = Color(50, 50, 250);
|
||||
|
||||
Text fps = new Text(""c, font, 30);
|
||||
fps.move(50.f, 50.f);
|
||||
fps.color = Color.BLACK;
|
||||
|
||||
// Create the sprites of the background, the paddles and the ball
|
||||
Sprite LeftPaddle = new Sprite(PaddleImage);
|
||||
Sprite RightPaddle = new Sprite(PaddleImage);
|
||||
Sprite Ball = new Sprite(BallImage);
|
||||
|
||||
LeftPaddle.move(10, (app.view.getHeight() - LeftPaddle.size.y) / 2);
|
||||
RightPaddle.move(app.view.getWidth() - RightPaddle.size.x - 10, (app.view.getHeight() - RightPaddle.size.y) / 2);
|
||||
Ball.move((app.view.getWidth() - Ball.size.x) / 2, (app.view.getHeight() - Ball.size.y) / 2);
|
||||
|
||||
// Define the paddles properties
|
||||
auto AITimer = new PerformanceCounter();
|
||||
const long AITime = 100; // 100 ms
|
||||
float LeftPaddleSpeed = 400.f;
|
||||
float RightPaddleSpeed = 400.f;
|
||||
|
||||
// Define the ball properties
|
||||
float BallSpeed = 400.f;
|
||||
float BallAngle = 0.f;
|
||||
do
|
||||
{
|
||||
// Make sure the ball initial angle is not too much vertical
|
||||
BallAngle = uniform(0.f, 2 * PI);
|
||||
} while (abs(cos(BallAngle)) < 0.7f);
|
||||
|
||||
bool IsPlaying = true;
|
||||
|
||||
Event evt;
|
||||
uint iFps = 0;
|
||||
auto fpsClock = new PerformanceCounter();
|
||||
|
||||
while (app.isOpened())
|
||||
{
|
||||
app.clear(Color(255, 255, 255, 255));
|
||||
|
||||
// Handle events
|
||||
while (app.getEvent(evt))
|
||||
{
|
||||
// Window closed or escape key pressed : exit
|
||||
if ((evt.Type == EventType.Closed) ||
|
||||
((evt.Type == EventType.KeyPressed) && (evt.Key.Code == KeyCode.Escape)))
|
||||
{
|
||||
app.close();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (IsPlaying)
|
||||
{
|
||||
// Move the player's paddle
|
||||
if (i.isKeyDown(KeyCode.Up) && (LeftPaddle.position.y > 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();
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
@ -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;
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
@ -1,5 +0,0 @@
|
||||
graft src
|
||||
graft scripts
|
||||
graft doc
|
||||
graft samples
|
||||
|
@ -1,2 +0,0 @@
|
||||
__all__ = ['sf']
|
||||
|
@ -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%;
|
||||
}
|
||||
|
Before Width: | Height: | Size: 868 B |
Before Width: | Height: | Size: 1.1 KiB |
@ -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)
|
@ -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()
|
||||
|
@ -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()
|
||||
|
@ -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()
|
@ -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()
|