diff --git a/README.md b/README.md index 8b47ef5..fd3403d 100644 --- a/README.md +++ b/README.md @@ -96,8 +96,8 @@ Below you'll find the list of things to be developed in this project. - [x] `void EndDrawing(void)` - [x] `void BeginMode2D(Camera2D camera)` - [x] `void EndMode2D(void)` -- [ ] `void BeginMode3D(Camera3D camera)` -- [ ] `void EndMode3D(void)` +- [x] `void BeginMode3D(Camera3D camera)` +- [x] `void EndMode3D(void)` - [ ] `void BeginTextureMode(RenderTexture2D target)` - [ ] `void EndTextureMode(void)` - [ ] `void BeginScissorMode(int x, int y, int width, int height)` @@ -109,7 +109,7 @@ Below you'll find the list of things to be developed in this project. - [ ] `Vector2 GetWorldToScreenEx(Vector3 position, Camera camera, int width, int height)` - [x] `Vector2 GetWorldToScreen2D(Vector2 position, Camera2D camera)` - [x] `Vector2 GetScreenToWorld2D(Vector2 position, Camera2D camera)` -- [x] `void SetTargetFPS(int fps)` +- [ ] `void SetTargetFPS(int fps)` - [ ] `int GetFPS(void)` - [x] `float GetFrameTime(void)` - [ ] `double GetTime(void)` @@ -182,12 +182,347 @@ Below you'll find the list of things to be developed in this project. - [ ] `int GetTouchX(void)` - [ ] `int GetTouchY(void)` - [ ] `Vector2 GetTouchPosition(int index)` +- [ ] `void SetGesturesEnabled(unsigned int gestureFlags)` +- [ ] `bool IsGestureDetected(int gesture)` +- [ ] `int GetGestureDetected(void)` +- [ ] `int GetTouchPointsCount(void)` +- [ ] `float GetGestureHoldDuration(void)` +- [ ] `Vector2 GetGestureDragVector(void)` +- [ ] `float GetGestureDragAngle(void)` +- [ ] `Vector2 GetGesturePinchVector(void)` +- [ ] `float GetGesturePinchAngle(void)` +- [x] `void SetCameraMode(Camera camera, int mode)` +- [x] `void UpdateCamera(Camera *camera)` +- [ ] `void SetCameraPanControl(int keyPan)` +- [ ] `void SetCameraAltControl(int keyAlt)` +- [ ] `void SetCameraSmoothZoomControl(int keySmoothZoom)` +- [ ] `void SetCameraMoveControls(int keyFront, int keyBack, int keyRight, int keyLeft, int keyUp, int keyDown)` +- [ ] `void DrawPixel(int posX, int posY, Color color)` +- [ ] `void DrawPixelV(Vector2 position, Color color)` - [x] `void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, Color color)` +- [ ] `void DrawLineV(Vector2 startPos, Vector2 endPos, Color color)` +- [ ] `void DrawLineEx(Vector2 startPos, Vector2 endPos, float thick, Color color)` +- [ ] `void DrawLineBezier(Vector2 startPos, Vector2 endPos, float thick, Color color)` +- [ ] `void DrawLineStrip(Vector2 *points, int pointsCount, Color color)` +- [ ] `void DrawCircle(int centerX, int centerY, float radius, Color color)` +- [ ] `void DrawCircleSector(Vector2 center, float radius, int startAngle, int endAngle, int segments, Color color)` +- [ ] `void DrawCircleSectorLines(Vector2 center, float radius, int startAngle, int endAngle, int segments, Color color)` +- [ ] `void DrawCircleGradient(int centerX, int centerY, float radius, Color color1, Color color2)` +- [ ] `void DrawCircleV(Vector2 center, float radius, Color color)` +- [ ] `void DrawCircleLines(int centerX, int centerY, float radius, Color color)` +- [ ] `void DrawEllipse(int centerX, int centerY, float radiusH, float radiusV, Color color)` +- [ ] `void DrawEllipseLines(int centerX, int centerY, float radiusH, float radiusV, Color color)` +- [ ] `void DrawRing(Vector2 center, float innerRadius, float outerRadius, int startAngle, int endAngle, int segments, Color color)` +- [ ] `void DrawRingLines(Vector2 center, float innerRadius, float outerRadius, int startAngle, int endAngle, int segments, Color color)` - [x] `void DrawRectangle(int posX, int posY, int width, int height, Color color)` +- [ ] `void DrawRectangleV(Vector2 position, Vector2 size, Color color)` +- [ ] `void DrawRectangleRec(Rectangle rec, Color color)` +- [ ] `void DrawRectanglePro(Rectangle rec, Vector2 origin, float rotation, Color color)` +- [ ] `void DrawRectangleGradientV(int posX, int posY, int width, int height, Color color1, Color color2)` +- [ ] `void DrawRectangleGradientH(int posX, int posY, int width, int height, Color color1, Color color2)` +- [ ] `void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3, Color col4)` - [x] `void DrawRectangleLines(int posX, int posY, int width, int height, Color color)` -- [x] `void DrawRectangleRec(Rectangle rec, Color color)` -- [x] `void DrawText(const char *text, int posX, int posY, int fontSize, Color color)` +- [ ] `void DrawRectangleLinesEx(Rectangle rec, int lineThick, Color color)` +- [ ] `void DrawRectangleRounded(Rectangle rec, float roundness, int segments, Color color)` +- [ ] `void DrawRectangleRoundedLines(Rectangle rec, float roundness, int segments, int lineThick, Color color)` +- [ ] `void DrawTriangle(Vector2 v1, Vector2 v2, Vector2 v3, Color color)` +- [ ] `void DrawTriangleLines(Vector2 v1, Vector2 v2, Vector2 v3, Color color)` +- [ ] `void DrawTriangleFan(Vector2 *points, int pointsCount, Color color)` +- [ ] `void DrawTriangleStrip(Vector2 *points, int pointsCount, Color color)` +- [ ] `void DrawPoly(Vector2 center, int sides, float radius, float rotation, Color color)` +- [ ] `void DrawPolyLines(Vector2 center, int sides, float radius, float rotation, Color color)` +- [ ] `bool CheckCollisionRecs(Rectangle rec1, Rectangle rec2)` +- [ ] `bool CheckCollisionCircles(Vector2 center1, float radius1, Vector2 center2, float radius2)` +- [ ] `bool CheckCollisionCircleRec(Vector2 center, float radius, Rectangle rec)` +- [ ] `bool CheckCollisionPointRec(Vector2 point, Rectangle rec)` +- [ ] `bool CheckCollisionPointCircle(Vector2 point, Vector2 center, float radius)` +- [ ] `bool CheckCollisionPointTriangle(Vector2 point, Vector2 p1, Vector2 p2, Vector2 p3)` +- [ ] `bool CheckCollisionLines(Vector2 startPos1, Vector2 endPos1, Vector2 startPos2, Vector2 endPos2, Vector2 *collisionPoint)` +- [ ] `Rectangle GetCollisionRec(Rectangle rec1, Rectangle rec2)` +- [ ] `Image LoadImage(const char *fileName)` +- [ ] `Image LoadImageRaw(const char *fileName, int width, int height, int format, int headerSize)` +- [ ] `Image LoadImageAnim(const char *fileName, int *frames)` +- [ ] `Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, int dataSize)` +- [ ] `void UnloadImage(Image image)` +- [ ] `bool ExportImage(Image image, const char *fileName)` +- [ ] `bool ExportImageAsCode(Image image, const char *fileName)` +- [ ] `Image GenImageColor(int width, int height, Color color)` +- [ ] `Image GenImageGradientV(int width, int height, Color top, Color bottom)` +- [ ] `Image GenImageGradientH(int width, int height, Color left, Color right)` +- [ ] `Image GenImageGradientRadial(int width, int height, float density, Color inner, Color outer)` +- [ ] `Image GenImageChecked(int width, int height, int checksX, int checksY, Color col1, Color col2)` +- [ ] `Image GenImageWhiteNoise(int width, int height, float factor)` +- [ ] `Image GenImagePerlinNoise(int width, int height, int offsetX, int offsetY, float scale)` +- [ ] `Image GenImageCellular(int width, int height, int tileSize)` +- [ ] `Image ImageCopy(Image image)` +- [ ] `Image ImageFromImage(Image image, Rectangle rec)` +- [ ] `Image ImageText(const char *text, int fontSize, Color color)` +- [ ] `Image ImageTextEx(Font font, const char *text, float fontSize, float spacing, Color tint)` +- [ ] `void ImageFormat(Image *image, int newFormat)` +- [ ] `void ImageToPOT(Image *image, Color fill)` +- [ ] `void ImageCrop(Image *image, Rectangle crop)` +- [ ] `void ImageAlphaCrop(Image *image, float threshold)` +- [ ] `void ImageAlphaClear(Image *image, Color color, float threshold)` +- [ ] `void ImageAlphaMask(Image *image, Image alphaMask)` +- [ ] `void ImageAlphaPremultiply(Image *image)` +- [ ] `void ImageResize(Image *image, int newWidth, int newHeight)` +- [ ] `void ImageResizeNN(Image *image, int newWidth,int newHeight)` +- [ ] `void ImageResizeCanvas(Image *image, int newWidth, int newHeight, int offsetX, int offsetY, Color fill)` +- [ ] `void ImageMipmaps(Image *image)` +- [ ] `void ImageDither(Image *image, int rBpp, int gBpp, int bBpp, int aBpp)` +- [ ] `void ImageFlipVertical(Image *image)` +- [ ] `void ImageFlipHorizontal(Image *image)` +- [ ] `void ImageRotateCW(Image *image)` +- [ ] `void ImageRotateCCW(Image *image)` +- [ ] `void ImageColorTint(Image *image, Color color)` +- [ ] `void ImageColorInvert(Image *image)` +- [ ] `void ImageColorGrayscale(Image *image)` +- [ ] `void ImageColorContrast(Image *image, float contrast)` +- [ ] `void ImageColorBrightness(Image *image, int brightness)` +- [ ] `void ImageColorReplace(Image *image, Color color, Color replace)` +- [ ] `Color *LoadImageColors(Image image)` +- [ ] `Color *LoadImagePalette(Image image, int maxPaletteSize, int *colorsCount)` +- [ ] `void UnloadImageColors(Color *colors)` +- [ ] `void UnloadImagePalette(Color *colors)` +- [ ] `Rectangle GetImageAlphaBorder(Image image, float threshold)` +- [ ] `void ImageClearBackground(Image *dst, Color color)` +- [ ] `void ImageDrawPixel(Image *dst, int posX, int posY, Color color)` +- [ ] `void ImageDrawPixelV(Image *dst, Vector2 position, Color color)` +- [ ] `void ImageDrawLine(Image *dst, int startPosX, int startPosY, int endPosX, int endPosY, Color color)` +- [ ] `void ImageDrawLineV(Image *dst, Vector2 start, Vector2 end, Color color)` +- [ ] `void ImageDrawCircle(Image *dst, int centerX, int centerY, int radius, Color color)` +- [ ] `void ImageDrawCircleV(Image *dst, Vector2 center, int radius, Color color)` +- [ ] `void ImageDrawRectangle(Image *dst, int posX, int posY, int width, int height, Color color)` +- [ ] `void ImageDrawRectangleV(Image *dst, Vector2 position, Vector2 size, Color color)` +- [x] `void ImageDrawRectangleRec(Image *dst, Rectangle rec, Color color)` +- [ ] `void ImageDrawRectangleLines(Image *dst, Rectangle rec, int thick, Color color)` +- [ ] `void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec, Color tint)` +- [x] `void ImageDrawText(Image *dst, const char *text, int posX, int posY, int fontSize, Color color)` +- [ ] `void ImageDrawTextEx(Image *dst, Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint)` +- [ ] `Texture2D LoadTexture(const char *fileName)` +- [ ] `Texture2D LoadTextureFromImage(Image image)` +- [ ] `TextureCubemap LoadTextureCubemap(Image image, int layoutType)` +- [ ] `RenderTexture2D LoadRenderTexture(int width, int height)` +- [ ] `void UnloadTexture(Texture2D texture)` +- [ ] `void UnloadRenderTexture(RenderTexture2D target)` +- [ ] `void UpdateTexture(Texture2D texture, const void *pixels)` +- [ ] `void UpdateTextureRec(Texture2D texture, Rectangle rec, const void *pixels)` +- [ ] `Image GetTextureData(Texture2D texture)` +- [ ] `Image GetScreenData(void)` +- [ ] `void GenTextureMipmaps(Texture2D *texture)` +- [ ] `void SetTextureFilter(Texture2D texture, int filterMode)` +- [ ] `void SetTextureWrap(Texture2D texture, int wrapMode)` +- [ ] `void DrawTexture(Texture2D texture, int posX, int posY, Color tint)` +- [ ] `void DrawTextureV(Texture2D texture, Vector2 position, Color tint)` +- [ ] `void DrawTextureEx(Texture2D texture, Vector2 position, float rotation, float scale, Color tint)` +- [ ] `void DrawTextureRec(Texture2D texture, Rectangle source, Vector2 position, Color tint)` +- [ ] `void DrawTextureQuad(Texture2D texture, Vector2 tiling, Vector2 offset, Rectangle quad, Color tint)` +- [ ] `void DrawTextureTiled(Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, float scale, Color tint)` +- [ ] `void DrawTexturePro(Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, Color tint)` +- [ ] `void DrawTextureNPatch(Texture2D texture, NPatchInfo nPatchInfo, Rectangle dest, Vector2 origin, float rotation, Color tint)` - [x] `Color Fade(Color color, float alpha)` +- [ ] `int ColorToInt(Color color)` +- [ ] `Vector4 ColorNormalize(Color color)` +- [ ] `Color ColorFromNormalized(Vector4 normalized)` +- [ ] `Vector3 ColorToHSV(Color color)` +- [ ] `Color ColorFromHSV(float hue, float saturation, float value)` +- [ ] `Color ColorAlpha(Color color, float alpha)` +- [ ] `Color ColorAlphaBlend(Color dst, Color src, Color tint)` +- [ ] `Color GetColor(int hexValue)` +- [ ] `Color GetPixelColor(void *srcPtr, int format)` +- [ ] `void SetPixelColor(void *dstPtr, Color color, int format)` +- [ ] `int GetPixelDataSize(int width, int height, int format)` +- [ ] `Font GetFontDefault(void)` +- [ ] `Font LoadFont(const char *fileName)` +- [ ] `Font LoadFontEx(const char *fileName, int fontSize, int *fontChars, int charsCount)` +- [ ] `Font LoadFontFromImage(Image image, Color key, int firstChar)` +- [ ] `Font LoadFontFromMemory(const char *fileType, const unsigned char *fileData, int dataSize, int fontSize, int *fontChars, int charsCount)` +- [ ] `CharInfo *LoadFontData(const unsigned char *fileData, int dataSize, int fontSize, int *fontChars, int charsCount, int type)` +- [ ] `Image GenImageFontAtlas(const CharInfo *chars, Rectangle **recs, int charsCount, int fontSize, int padding, int packMethod)` +- [ ] `void UnloadFontData(CharInfo *chars, int charsCount)` +- [ ] `void UnloadFont(Font font)` +- [ ] `void DrawFPS(int posX, int posY)` +- [ ] `void DrawText(const char *text, int posX, int posY, int fontSize, Color color)` +- [ ] `void DrawTextEx(Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint)` +- [ ] `void DrawTextRec(Font font, const char *text, Rectangle rec, float fontSize, float spacing, bool wordWrap, Color tint)` +- [ ] `void DrawTextRecEx(Font font, const char *text, Rectangle rec, float fontSize, float spacing, bool wordWrap, Color tint,` +- [ ] `int selectStart, int selectLength, Color selectTint, Color selectBackTint)` +- [ ] `void DrawTextCodepoint(Font font, int codepoint, Vector2 position, float fontSize, Color tint)` +- [ ] `int MeasureText(const char *text, int fontSize)` +- [ ] `Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing)` +- [ ] `int GetGlyphIndex(Font font, int codepoint)` +- [ ] `int TextCopy(char *dst, const char *src)` +- [ ] `bool TextIsEqual(const char *text1, const char *text2)` +- [ ] `unsigned int TextLength(const char *text)` +- [ ] `const char *TextFormat(const char *text, ...)` +- [ ] `const char *TextSubtext(const char *text, int position, int length)` +- [ ] `char *TextReplace(char *text, const char *replace, const char *by)` +- [ ] `char *TextInsert(const char *text, const char *insert, int position)` +- [ ] `const char *TextJoin(const char **textList, int count, const char *delimiter)` +- [ ] `const char **TextSplit(const char *text, char delimiter, int *count)` +- [ ] `void TextAppend(char *text, const char *append, int *position)` +- [ ] `int TextFindIndex(const char *text, const char *find)` +- [ ] `const char *TextToUpper(const char *text)` +- [ ] `const char *TextToLower(const char *text)` +- [ ] `const char *TextToPascal(const char *text)` +- [ ] `int TextToInteger(const char *text)` +- [ ] `char *TextToUtf8(int *codepoints, int length)` +- [ ] `int *GetCodepoints(const char *text, int *count)` +- [ ] `int GetCodepointsCount(const char *text)` +- [ ] `int GetNextCodepoint(const char *text, int *bytesProcessed)` +- [ ] `const char *CodepointToUtf8(int codepoint, int *byteLength)` +- [ ] `void DrawLine3D(Vector3 startPos, Vector3 endPos, Color color)` +- [ ] `void DrawPoint3D(Vector3 position, Color color)` +- [ ] `void DrawCircle3D(Vector3 center, float radius, Vector3 rotationAxis, float rotationAngle, Color color)` +- [ ] `void DrawTriangle3D(Vector3 v1, Vector3 v2, Vector3 v3, Color color)` +- [ ] `void DrawTriangleStrip3D(Vector3 *points, int pointsCount, Color color)` +- [x] `void DrawCube(Vector3 position, float width, float height, float length, Color color)` +- [ ] `void DrawCubeV(Vector3 position, Vector3 size, Color color)` +- [x] `void DrawCubeWires(Vector3 position, float width, float height, float length, Color color)` +- [ ] `void DrawCubeWiresV(Vector3 position, Vector3 size, Color color)` +- [ ] `void DrawCubeTexture(Texture2D texture, Vector3 position, float width, float height, float length, Color color)` +- [ ] `void DrawSphere(Vector3 centerPos, float radius, Color color)` +- [ ] `void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color color)` +- [ ] `void DrawSphereWires(Vector3 centerPos, float radius, int rings, int slices, Color color)` +- [ ] `void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color)` +- [ ] `void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color)` +- [x] `void DrawPlane(Vector3 centerPos, Vector2 size, Color color)` +- [ ] `void DrawRay(Ray ray, Color color)` +- [ ] `void DrawGrid(int slices, float spacing)` +- [ ] `void DrawGizmo(Vector3 position)` +- [ ] `Model LoadModel(const char *fileName)` +- [ ] `Model LoadModelFromMesh(Mesh mesh)` +- [ ] `void UnloadModel(Model model)` +- [ ] `void UnloadModelKeepMeshes(Model model)` +- [ ] `Mesh *LoadMeshes(const char *fileName, int *meshCount)` +- [ ] `void UnloadMesh(Mesh mesh)` +- [ ] `bool ExportMesh(Mesh mesh, const char *fileName)` +- [ ] `Material *LoadMaterials(const char *fileName, int *materialCount)` +- [ ] `Material LoadMaterialDefault(void)` +- [ ] `void UnloadMaterial(Material material)` +- [ ] `void SetMaterialTexture(Material *material, int mapType, Texture2D texture)` +- [ ] `void SetModelMeshMaterial(Model *model, int meshId, int materialId)` +- [ ] `ModelAnimation *LoadModelAnimations(const char *fileName, int *animsCount)` +- [ ] `void UpdateModelAnimation(Model model, ModelAnimation anim, int frame)` +- [ ] `void UnloadModelAnimation(ModelAnimation anim)` +- [ ] `bool IsModelAnimationValid(Model model, ModelAnimation anim)` +- [ ] `Mesh GenMeshPoly(int sides, float radius)` +- [ ] `Mesh GenMeshPlane(float width, float length, int resX, int resZ)` +- [ ] `Mesh GenMeshCube(float width, float height, float length)` +- [ ] `Mesh GenMeshSphere(float radius, int rings, int slices)` +- [ ] `Mesh GenMeshHemiSphere(float radius, int rings, int slices)` +- [ ] `Mesh GenMeshCylinder(float radius, float height, int slices)` +- [ ] `Mesh GenMeshTorus(float radius, float size, int radSeg, int sides)` +- [ ] `Mesh GenMeshKnot(float radius, float size, int radSeg, int sides)` +- [ ] `Mesh GenMeshHeightmap(Image heightmap, Vector3 size)` +- [ ] `Mesh GenMeshCubicmap(Image cubicmap, Vector3 cubeSize)` +- [ ] `BoundingBox MeshBoundingBox(Mesh mesh)` +- [ ] `void MeshTangents(Mesh *mesh)` +- [ ] `void MeshBinormals(Mesh *mesh)` +- [ ] `void MeshNormalsSmooth(Mesh *mesh)` +- [ ] `void DrawModel(Model model, Vector3 position, float scale, Color tint)` +- [ ] `void DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint)` +- [ ] `void DrawModelWires(Model model, Vector3 position, float scale, Color tint)` +- [ ] `void DrawModelWiresEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint)` +- [ ] `void DrawBoundingBox(BoundingBox box, Color color)` +- [ ] `void DrawBillboard(Camera camera, Texture2D texture, Vector3 center, float size, Color tint)` +- [ ] `void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle source, Vector3 center, float size, Color tint)` +- [ ] `bool CheckCollisionSpheres(Vector3 center1, float radius1, Vector3 center2, float radius2)` +- [ ] `bool CheckCollisionBoxes(BoundingBox box1, BoundingBox box2)` +- [ ] `bool CheckCollisionBoxSphere(BoundingBox box, Vector3 center, float radius)` +- [ ] `bool CheckCollisionRaySphere(Ray ray, Vector3 center, float radius)` +- [ ] `bool CheckCollisionRaySphereEx(Ray ray, Vector3 center, float radius, Vector3 *collisionPoint)` +- [ ] `bool CheckCollisionRayBox(Ray ray, BoundingBox box)` +- [ ] `RayHitInfo GetCollisionRayMesh(Ray ray, Mesh mesh, Matrix transform)` +- [ ] `RayHitInfo GetCollisionRayModel(Ray ray, Model model)` +- [ ] `RayHitInfo GetCollisionRayTriangle(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3)` +- [ ] `RayHitInfo GetCollisionRayGround(Ray ray, float groundHeight)` +- [ ] `Shader LoadShader(const char *vsFileName, const char *fsFileName)` +- [ ] `Shader LoadShaderCode(const char *vsCode, const char *fsCode)` +- [ ] `void UnloadShader(Shader shader)` +- [ ] `Shader GetShaderDefault(void)` +- [ ] `Texture2D GetTextureDefault(void)` +- [ ] `Texture2D GetShapesTexture(void)` +- [ ] `Rectangle GetShapesTextureRec(void)` +- [ ] `void SetShapesTexture(Texture2D texture, Rectangle source)` +- [ ] `int GetShaderLocation(Shader shader, const char *uniformName)` +- [ ] `int GetShaderLocationAttrib(Shader shader, const char *attribName)` +- [ ] `void SetShaderValue(Shader shader, int uniformLoc, const void *value, int uniformType)` +- [ ] `void SetShaderValueV(Shader shader, int uniformLoc, const void *value, int uniformType, int count)` +- [ ] `void SetShaderValueMatrix(Shader shader, int uniformLoc, Matrix mat)` +- [ ] `void SetShaderValueTexture(Shader shader, int uniformLoc, Texture2D texture)` +- [ ] `void SetMatrixProjection(Matrix proj)` +- [ ] `void SetMatrixModelview(Matrix view)` +- [ ] `Matrix GetMatrixModelview(void)` +- [ ] `Matrix GetMatrixProjection(void)` +- [ ] `TextureCubemap GenTextureCubemap(Shader shader, Texture2D panorama, int size, int format)` +- [ ] `TextureCubemap GenTextureIrradiance(Shader shader, TextureCubemap cubemap, int size)` +- [ ] `TextureCubemap GenTexturePrefilter(Shader shader, TextureCubemap cubemap, int size)` +- [ ] `Texture2D GenTextureBRDF(Shader shader, int size)` +- [ ] `void BeginShaderMode(Shader shader)` +- [ ] `void EndShaderMode(void)` +- [ ] `void BeginBlendMode(int mode)` +- [ ] `void EndBlendMode(void)` +- [ ] `void InitVrSimulator(void)` +- [ ] `void CloseVrSimulator(void)` +- [ ] `void UpdateVrTracking(Camera *camera)` +- [ ] `void SetVrConfiguration(VrDeviceInfo info, Shader distortion)` +- [ ] `bool IsVrSimulatorReady(void)` +- [ ] `void ToggleVrMode(void)` +- [ ] `void BeginVrDrawing(void)` +- [ ] `void EndVrDrawing(void)` +- [ ] `void InitAudioDevice(void)` +- [ ] `void CloseAudioDevice(void)` +- [ ] `bool IsAudioDeviceReady(void)` +- [ ] `void SetMasterVolume(float volume)` +- [ ] `Wave LoadWave(const char *fileName)` +- [ ] `Wave LoadWaveFromMemory(const char *fileType, const unsigned char *fileData, int dataSize)` +- [ ] `Sound LoadSound(const char *fileName)` +- [ ] `Sound LoadSoundFromWave(Wave wave)` +- [ ] `void UpdateSound(Sound sound, const void *data, int samplesCount)` +- [ ] `void UnloadWave(Wave wave)` +- [ ] `void UnloadSound(Sound sound)` +- [ ] `bool ExportWave(Wave wave, const char *fileName)` +- [ ] `bool ExportWaveAsCode(Wave wave, const char *fileName)` +- [ ] `void PlaySound(Sound sound)` +- [ ] `void StopSound(Sound sound)` +- [ ] `void PauseSound(Sound sound)` +- [ ] `void ResumeSound(Sound sound)` +- [ ] `void PlaySoundMulti(Sound sound)` +- [ ] `void StopSoundMulti(void)` +- [ ] `int GetSoundsPlaying(void)` +- [ ] `bool IsSoundPlaying(Sound sound)` +- [ ] `void SetSoundVolume(Sound sound, float volume)` +- [ ] `void SetSoundPitch(Sound sound, float pitch)` +- [ ] `void WaveFormat(Wave *wave, int sampleRate, int sampleSize, int channels)` +- [ ] `Wave WaveCopy(Wave wave)` +- [ ] `void WaveCrop(Wave *wave, int initSample, int finalSample)` +- [ ] `float *LoadWaveSamples(Wave wave)` +- [ ] `void UnloadWaveSamples(float *samples)` +- [ ] `Music LoadMusicStream(const char *fileName)` +- [ ] `void UnloadMusicStream(Music music)` +- [ ] `void PlayMusicStream(Music music)` +- [ ] `void UpdateMusicStream(Music music)` +- [ ] `void StopMusicStream(Music music)` +- [ ] `void PauseMusicStream(Music music)` +- [ ] `void ResumeMusicStream(Music music)` +- [ ] `bool IsMusicPlaying(Music music)` +- [ ] `void SetMusicVolume(Music music, float volume)` +- [ ] `void SetMusicPitch(Music music, float pitch)` +- [ ] `float GetMusicTimeLength(Music music)` +- [ ] `float GetMusicTimePlayed(Music music)` +- [ ] `AudioStream InitAudioStream(unsigned int sampleRate, unsigned int sampleSize, unsigned int channels)` +- [ ] `void UpdateAudioStream(AudioStream stream, const void *data, int samplesCount)` +- [ ] `void CloseAudioStream(AudioStream stream)` +- [ ] `bool IsAudioStreamProcessed(AudioStream stream)` +- [ ] `void PlayAudioStream(AudioStream stream)` +- [ ] `void PauseAudioStream(AudioStream stream)` +- [ ] `void ResumeAudioStream(AudioStream stream)` +- [ ] `bool IsAudioStreamPlaying(AudioStream stream)` +- [ ] `void StopAudioStream(AudioStream stream)` +- [ ] `void SetAudioStreamVolume(AudioStream stream, float volume)` +- [ ] `void SetAudioStreamPitch(AudioStream stream, float pitch)` +- [ ] `void SetAudioStreamBufferSizeDefault(int size)` ### Ray Math diff --git a/examples/core/core_3d_camera_first_person.php b/examples/core/core_3d_camera_first_person.php new file mode 100644 index 0000000..66467c2 --- /dev/null +++ b/examples/core/core_3d_camera_first_person.php @@ -0,0 +1,105 @@ +newInstance(); + +const MAX_COLUMNS = 20; + +// Initialization +//-------------------------------------------------------------------------------------- +$screenWidth = 800; +$screenHeight = 450; + +$raylib->initWindow($screenWidth, $screenHeight, "raylib [core] example - 3d camera first person"); + +// Define the camera to look into our 3d world (position, target, up vector) +$camera = new Camera3D( + new Vector3(4.0, 2.0, 4.0), + new Vector3(0.0, 1.8, 0.0), + new Vector3(0.0, 1.0, 0.0), + 60.0, + Camera3D::PROJECTION_PERSPECTIVE, +); + +// Generates some random columns +$heights = []; +$positions = []; +$colors = []; + +for ($i = 0; $i < MAX_COLUMNS; $i++) { + $heights[$i] = (float) $raylib->getRandomValue(1, 12); + $positions[$i] = new Vector3( + $raylib->getRandomValue(-15, 15), + $heights[$i] / 2.0, + $raylib->getRandomValue(-15, 15), + ); + + $colors[$i] = new Color($raylib->getRandomValue(20, 255), $raylib->getRandomValue(10, 55), 30, 255); +} + +$raylib->setCameraMode($camera, Camera3D::MODE_FIRST_PERSON); // Set a first person camera mode + +$raylib->setTargetFPS(60); // Set our game to run at 60 frames-per-second +//-------------------------------------------------------------------------------------- + +// Main game loop +while (!$raylib->windowShouldClose()) { // Detect window close button or ESC key + // Update + //---------------------------------------------------------------------------------- + $raylib->updateCamera($camera); // Update camera + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + $raylib->beginDrawing(); + + $raylib->clearBackground(Color::rayWhite()); + + // phpcs:disable Generic.WhiteSpace.ScopeIndent.IncorrectExact + $raylib->beginMode3D($camera); + + $raylib->drawPlane( + new Vector3(0.0, 0.0, 0.0), + new Vector2(32.0, 32.0), + Color::lightGray() + ); // Draw ground + $raylib->drawCube(new Vector3(-16.0, 2.5, 0.0), 1.0, 5.0, 32.0, Color::blue()); // Draw a blue wall + $raylib->drawCube(new Vector3(16.0, 2.5, 0.0), 1.0, 5.0, 32.0, Color::lime()); // Draw a green wall + $raylib->drawCube(new Vector3(0.0, 2.5, 16.0), 32.0, 5.0, 1.0, Color::gold()); // Draw a yellow wall + + // Draw some cubes around + for ($i = 0; $i < MAX_COLUMNS; $i++) { + $raylib->drawCube($positions[$i], 2.0, $heights[$i], 2.0, $colors[$i]); + $raylib->drawCubeWires($positions[$i], 2.0, $heights[$i], 2.0, Color::maroon()); + } + + $raylib->endMode3D(); + // phpcs:enable Generic.WhiteSpace.ScopeIndent.IncorrectExact + + $raylib->drawRectangle(10, 10, 220, 70, $raylib->fade(Color::skyBlue(), 0.5)); + $raylib->drawRectangleLines(10, 10, 220, 70, Color::blue()); + + $raylib->drawText("First person camera default controls:", 20, 20, 10, Color::black()); + $raylib->drawText("- Move with keys: W, A, S, D", 40, 40, 10, Color::darkGray()); + $raylib->drawText("- Mouse move to look around", 40, 60, 10, Color::darkGray()); + + $raylib->endDrawing(); + //---------------------------------------------------------------------------------- +} + +// De-Initialization +//-------------------------------------------------------------------------------------- +$raylib->closeWindow(); // Close window and OpenGL context +//-------------------------------------------------------------------------------------- diff --git a/resources/raylib.h b/resources/raylib.h index 13b31ed..6668b73 100644 --- a/resources/raylib.h +++ b/resources/raylib.h @@ -1,17 +1,19 @@ #define FFI_LIB "libraylib.dylib" +// Vector2 type typedef struct Vector2 { float x; float y; } Vector2; +// Vector3 type typedef struct Vector3 { float x; float y; float z; } Vector3; - +// Vector4 type typedef struct Vector4 { float x; float y; @@ -19,15 +21,18 @@ typedef struct Vector4 { float w; } Vector4; +// Quaternion type, same as Vector4 typedef Vector4 Quaternion; +// Matrix type (OpenGL style 4x4 - right handed, column major) typedef struct Matrix { float m0, m4, m8, m12; - float m1,m5, m9, m13; + float m1, m5, m9, m13; float m2, m6, m10, m14; float m3, m7, m11, m15; } Matrix; +// Color type, RGBA (32bit) typedef struct Color { unsigned char r; unsigned char g; @@ -35,6 +40,7 @@ typedef struct Color { unsigned char a; } Color; +// Rectangle type typedef struct Rectangle { float x; float y; @@ -42,734 +48,855 @@ typedef struct Rectangle { float height; } Rectangle; +// Image type, bpp always RGBA (32bit) +// NOTE: Data stored in CPU memory (RAM) typedef struct Image { - void *data; - int width; - int height; - int mipmaps; - int format; + void *data; // Image raw data + int width; // Image base width + int height; // Image base height + int mipmaps; // Mipmap levels, 1 by default + int format; // Data format (PixelFormat type) } Image; +// Texture type +// NOTE: Data stored in GPU memory typedef struct Texture { - unsigned int id; - int width; - int height; - int mipmaps; - int format; + unsigned int id; // OpenGL texture id + int width; // Texture base width + int height; // Texture base height + int mipmaps; // Mipmap levels, 1 by default + int format; // Data format (PixelFormat type) } Texture; +// Texture2D type, same as Texture typedef Texture Texture2D; +// TextureCubemap type, actually, same as Texture typedef Texture TextureCubemap; +// RenderTexture type, for texture rendering typedef struct RenderTexture { - unsigned int id; - Texture texture; - Texture depth; + unsigned int id; // OpenGL Framebuffer Object (FBO) id + Texture texture; // Color buffer attachment texture + Texture depth; // Depth buffer attachment texture } RenderTexture; +// RenderTexture2D type, same as RenderTexture typedef RenderTexture RenderTexture2D; +// N-Patch layout info typedef struct NPatchInfo { - Rectangle source; - int left; - int top; - int right; - int bottom; - int type; + Rectangle source; // Region in the texture + int left; // left border offset + int top; // top border offset + int right; // right border offset + int bottom; // bottom border offset + int type; // layout of the n-patch: 3x3, 1x3 or 3x1 } NPatchInfo; +// Font character info typedef struct CharInfo { - int value; - int offsetX; - int offsetY; - int advanceX; - Image image; + int value; // Character value (Unicode) + int offsetX; // Character offset X when drawing + int offsetY; // Character offset Y when drawing + int advanceX; // Character advance position X + Image image; // Character image data } CharInfo; +// Font type, includes texture and charSet array data typedef struct Font { - int baseSize; - int charsCount; - int charsPadding; - Texture2D texture; - Rectangle *recs; - CharInfo *chars; + int baseSize; // Base size (default chars height) + int charsCount; // Number of characters + int charsPadding; // Padding around the chars + Texture2D texture; // Characters texture atlas + Rectangle *recs; // Characters rectangles in texture + CharInfo *chars; // Characters info data } Font; -#define SpriteFont Font +#define SpriteFont Font // SpriteFont type fallback, defaults to Font +// Camera type, defines a camera position/orientation in 3d space typedef struct Camera3D { - Vector3 position; - Vector3 target; - Vector3 up; - float fovy; - int type; + Vector3 position; // Camera position + Vector3 target; // Camera target it looks-at + Vector3 up; // Camera up vector (rotation over its axis) + float fovy; // Camera field-of-view apperture in Y (degrees) in perspective, used as near plane width in orthographic + int type; // Camera type, defines projection type: CAMERA_PERSPECTIVE or CAMERA_ORTHOGRAPHIC } Camera3D; -typedef Camera3D Camera; +typedef Camera3D Camera; // Camera type fallback, defaults to Camera3D +// Camera2D type, defines a 2d camera typedef struct Camera2D { - Vector2 offset; - Vector2 target; - float rotation; - float zoom; + Vector2 offset; // Camera offset (displacement from target) + Vector2 target; // Camera target (rotation and zoom origin) + float rotation; // Camera rotation in degrees + float zoom; // Camera zoom (scaling), should be 1.0f by default } Camera2D; +// Vertex data definning a mesh +// NOTE: Data stored in CPU memory (and GPU) typedef struct Mesh { - int vertexCount; - int triangleCount; - float *vertices; - float *texcoords; - float *texcoords2; - float *normals; - float *tangents; - unsigned char *colors; - unsigned short *indices; - float *animVertices; - float *animNormals; - int *boneIds; - float *boneWeights; - unsigned int vaoId; - unsigned int *vboId; + int vertexCount; // Number of vertices stored in arrays + int triangleCount; // Number of triangles stored (indexed or not) + + // Default vertex data + float *vertices; // Vertex position (XYZ - 3 components per vertex) (shader-location = 0) + float *texcoords; // Vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1) + float *texcoords2; // Vertex second texture coordinates (useful for lightmaps) (shader-location = 5) + float *normals; // Vertex normals (XYZ - 3 components per vertex) (shader-location = 2) + float *tangents; // Vertex tangents (XYZW - 4 components per vertex) (shader-location = 4) + unsigned char *colors; // Vertex colors (RGBA - 4 components per vertex) (shader-location = 3) + unsigned short *indices;// Vertex indices (in case vertex data comes indexed) + + // Animation vertex data + float *animVertices; // Animated vertex positions (after bones transformations) + float *animNormals; // Animated normals (after bones transformations) + int *boneIds; // Vertex bone ids, up to 4 bones influence by vertex (skinning) + float *boneWeights; // Vertex bone weight, up to 4 bones influence by vertex (skinning) + + // OpenGL identifiers + unsigned int vaoId; // OpenGL Vertex Array Object id + unsigned int *vboId; // OpenGL Vertex Buffer Objects id (default vertex data) } Mesh; +// Shader type (generic) typedef struct Shader { - unsigned int id; - int *locs; + unsigned int id; // Shader program id + int *locs; // Shader locations array (MAX_SHADER_LOCATIONS) } Shader; +// Material texture map typedef struct MaterialMap { - Texture2D texture; - Color color; - float value; + Texture2D texture; // Material map texture + Color color; // Material map color + float value; // Material map value } MaterialMap; +// Material type (generic) typedef struct Material { - Shader shader; - MaterialMap *maps; - float *params; + Shader shader; // Material shader + MaterialMap *maps; // Material maps array (MAX_MATERIAL_MAPS) + float *params; // Material generic parameters (if required) } Material; +// Transformation properties typedef struct Transform { - Vector3 translation; - Quaternion rotation; - Vector3 scale; + Vector3 translation; // Translation + Quaternion rotation; // Rotation + Vector3 scale; // Scale } Transform; +// Bone information typedef struct BoneInfo { - char name[32]; - int parent; + char name[32]; // Bone name + int parent; // Bone parent } BoneInfo; +// Model type typedef struct Model { - Matrix transform; - int meshCount; - int materialCount; - Mesh *meshes; - Material *materials; - int *meshMaterial; - int boneCount; - BoneInfo *bones; - Transform *bindPose; + Matrix transform; // Local transform matrix + + int meshCount; // Number of meshes + int materialCount; // Number of materials + Mesh *meshes; // Meshes array + Material *materials; // Materials array + int *meshMaterial; // Mesh material number + + // Animation data + int boneCount; // Number of bones + BoneInfo *bones; // Bones information (skeleton) + Transform *bindPose; // Bones base transformation (pose) } Model; +// Model animation typedef struct ModelAnimation { - int boneCount; - int frameCount; - BoneInfo *bones; - Transform **framePoses; + int boneCount; // Number of bones + int frameCount; // Number of animation frames + BoneInfo *bones; // Bones information (skeleton) + Transform **framePoses; // Poses array by frame } ModelAnimation; +// Ray type (useful for raycast) typedef struct Ray { - Vector3 position; - Vector3 direction; + Vector3 position; // Ray position (origin) + Vector3 direction; // Ray direction } Ray; +// Raycast hit information typedef struct RayHitInfo { - bool hit; - float distance; - Vector3 position; - Vector3 normal; + bool hit; // Did the ray hit something? + float distance; // Distance to nearest hit + Vector3 position; // Position of nearest hit + Vector3 normal; // Surface normal of hit } RayHitInfo; +// Bounding box type typedef struct BoundingBox { - Vector3 min; - Vector3 max; + Vector3 min; // Minimum vertex box-corner + Vector3 max; // Maximum vertex box-corner } BoundingBox; +// Wave type, defines audio wave data typedef struct Wave { - unsigned int sampleCount; - unsigned int sampleRate; - unsigned int sampleSize; - unsigned int channels; - void *data; + unsigned int sampleCount; // Total number of samples + unsigned int sampleRate; // Frequency (samples per second) + unsigned int sampleSize; // Bit depth (bits per sample): 8, 16, 32 (24 not supported) + unsigned int channels; // Number of channels (1-mono, 2-stereo) + void *data; // Buffer data pointer } Wave; typedef struct rAudioBuffer rAudioBuffer; +// Audio stream type +// NOTE: Useful to create custom audio streams not bound to a specific file typedef struct AudioStream { - rAudioBuffer *buffer; - unsigned int sampleRate; - unsigned int sampleSize; - unsigned int channels; + rAudioBuffer *buffer; // Pointer to internal data used by the audio system + + unsigned int sampleRate; // Frequency (samples per second) + unsigned int sampleSize; // Bit depth (bits per sample): 8, 16, 32 (24 not supported) + unsigned int channels; // Number of channels (1-mono, 2-stereo) } AudioStream; +// Sound source type typedef struct Sound { - AudioStream stream; - unsigned int sampleCount; + AudioStream stream; // Audio stream + unsigned int sampleCount; // Total number of samples } Sound; +// Music stream type (audio file streaming from memory) +// NOTE: Anything longer than ~10 seconds should be streamed typedef struct Music { - AudioStream stream; - unsigned int sampleCount; - bool looping; - int ctxType; - void *ctxData; + AudioStream stream; // Audio stream + unsigned int sampleCount; // Total number of samples + bool looping; // Music looping enable + + int ctxType; // Type of music context (audio filetype) + void *ctxData; // Audio context data, depends on type } Music; +// Head-Mounted-Display device parameters typedef struct VrDeviceInfo { - int hResolution; - int vResolution; - float hScreenSize; - float vScreenSize; - float eyeToScreenDistance; - float interpupillaryDistance; - float lensDistortionValues[4]; - float chromaAbCorrection[4]; + int hResolution; // HMD horizontal resolution in pixels + int vResolution; // HMD vertical resolution in pixels + float hScreenSize; // HMD horizontal size in meters + float vScreenSize; // HMD vertical size in meters + float vScreenCenter; // HMD screen center in meters + float eyeToScreenDistance; // HMD distance between eye and display in meters + float lensSeparationDistance; // HMD lens separation distance in meters + float interpupillaryDistance; // HMD IPD (distance between pupils) in meters + float lensDistortionValues[4]; // HMD lens distortion constant parameters + float chromaAbCorrection[4]; // HMD chromatic aberration correction parameters } VrDeviceInfo; -typedef enum { - FLAG_VSYNC_HINT = 0x00000040, - FLAG_FULLSCREEN_MODE = 0x00000002, - FLAG_WINDOW_RESIZABLE = 0x00000004, - FLAG_WINDOW_UNDECORATED = 0x00000008, - FLAG_WINDOW_HIDDEN = 0x00000080, - FLAG_WINDOW_MINIMIZED = 0x00000200, - FLAG_WINDOW_MAXIMIZED = 0x00000400, - FLAG_WINDOW_UNFOCUSED = 0x00000800, - FLAG_WINDOW_TOPMOST = 0x00001000, - FLAG_WINDOW_ALWAYS_RUN = 0x00000100, - FLAG_WINDOW_TRANSPARENT = 0x00000010, - FLAG_WINDOW_HIGHDPI = 0x00002000, - FLAG_MSAA_4X_HINT = 0x00000020, - FLAG_INTERLACED_HINT = 0x00010000 -} ConfigFlag; - -typedef enum { - LOG_ALL = 0, - LOG_TRACE, - LOG_DEBUG, - LOG_INFO, - LOG_WARNING, - LOG_ERROR, - LOG_FATAL, - LOG_NONE -} TraceLogType; - -typedef enum { - KEY_APOSTROPHE = 39, - KEY_COMMA = 44, - KEY_MINUS = 45, - KEY_PERIOD = 46, - KEY_SLASH = 47, - KEY_ZERO = 48, - KEY_ONE = 49, - KEY_TWO = 50, - KEY_THREE = 51, - KEY_FOUR = 52, - KEY_FIVE = 53, - KEY_SIX = 54, - KEY_SEVEN = 55, - KEY_EIGHT = 56, - KEY_NINE = 57, - KEY_SEMICOLON = 59, - KEY_EQUAL = 61, - KEY_A = 65, - KEY_B = 66, - KEY_C = 67, - KEY_D = 68, - KEY_E = 69, - KEY_F = 70, - KEY_G = 71, - KEY_H = 72, - KEY_I = 73, - KEY_J = 74, - KEY_K = 75, - KEY_L = 76, - KEY_M = 77, - KEY_N = 78, - KEY_O = 79, - KEY_P = 80, - KEY_Q = 81, - KEY_R = 82, - KEY_S = 83, - KEY_T = 84, - KEY_U = 85, - KEY_V = 86, - KEY_W = 87, - KEY_X = 88, - KEY_Y = 89, - KEY_Z = 90, - KEY_SPACE = 32, - KEY_ESCAPE = 256, - KEY_ENTER = 257, - KEY_TAB = 258, - KEY_BACKSPACE = 259, - KEY_INSERT = 260, - KEY_DELETE = 261, - KEY_RIGHT = 262, - KEY_LEFT = 263, - KEY_DOWN = 264, - KEY_UP = 265, - KEY_PAGE_UP = 266, - KEY_PAGE_DOWN = 267, - KEY_HOME = 268, - KEY_END = 269, - KEY_CAPS_LOCK = 280, - KEY_SCROLL_LOCK = 281, - KEY_NUM_LOCK = 282, - KEY_PRINT_SCREEN = 283, - KEY_PAUSE = 284, - KEY_F1 = 290, - KEY_F2 = 291, - KEY_F3 = 292, - KEY_F4 = 293, - KEY_F5 = 294, - KEY_F6 = 295, - KEY_F7 = 296, - KEY_F8 = 297, - KEY_F9 = 298, - KEY_F10 = 299, - KEY_F11 = 300, - KEY_F12 = 301, - KEY_LEFT_SHIFT = 340, - KEY_LEFT_CONTROL = 341, - KEY_LEFT_ALT = 342, - KEY_LEFT_SUPER = 343, - KEY_RIGHT_SHIFT = 344, - KEY_RIGHT_CONTROL = 345, - KEY_RIGHT_ALT = 346, - KEY_RIGHT_SUPER = 347, - KEY_KB_MENU = 348, - KEY_LEFT_BRACKET = 91, - KEY_BACKSLASH = 92, - KEY_RIGHT_BRACKET = 93, - KEY_GRAVE = 96, - KEY_KP_0 = 320, - KEY_KP_1 = 321, - KEY_KP_2 = 322, - KEY_KP_3 = 323, - KEY_KP_4 = 324, - KEY_KP_5 = 325, - KEY_KP_6 = 326, - KEY_KP_7 = 327, - KEY_KP_8 = 328, - KEY_KP_9 = 329, - KEY_KP_DECIMAL = 330, - KEY_KP_DIVIDE = 331, - KEY_KP_MULTIPLY = 332, - KEY_KP_SUBTRACT = 333, - KEY_KP_ADD = 334, - KEY_KP_ENTER = 335, - KEY_KP_EQUAL = 336 -} KeyboardKey; - -typedef enum { - KEY_BACK = 4, - KEY_MENU = 82, - KEY_VOLUME_UP = 24, - KEY_VOLUME_DOWN = 25 -} AndroidButton; - -typedef enum { - MOUSE_LEFT_BUTTON = 0, - MOUSE_RIGHT_BUTTON = 1, - MOUSE_MIDDLE_BUTTON = 2 -} MouseButton; - -typedef enum { - MOUSE_CURSOR_DEFAULT = 0, - MOUSE_CURSOR_ARROW = 1, - MOUSE_CURSOR_IBEAM = 2, - MOUSE_CURSOR_CROSSHAIR = 3, - MOUSE_CURSOR_POINTING_HAND = 4, - MOUSE_CURSOR_RESIZE_EW = 5, - MOUSE_CURSOR_RESIZE_NS = 6, - MOUSE_CURSOR_RESIZE_NWSE = 7, - MOUSE_CURSOR_RESIZE_NESW = 8, - MOUSE_CURSOR_RESIZE_ALL = 9, - MOUSE_CURSOR_NOT_ALLOWED = 10 -} MouseCursor; - -typedef enum { - GAMEPAD_PLAYER1 = 0, - GAMEPAD_PLAYER2 = 1, - GAMEPAD_PLAYER3 = 2, - GAMEPAD_PLAYER4 = 3 -} GamepadNumber; - -typedef enum { - GAMEPAD_BUTTON_UNKNOWN = 0, - GAMEPAD_BUTTON_LEFT_FACE_UP, - GAMEPAD_BUTTON_LEFT_FACE_RIGHT, - GAMEPAD_BUTTON_LEFT_FACE_DOWN, - GAMEPAD_BUTTON_LEFT_FACE_LEFT, - GAMEPAD_BUTTON_RIGHT_FACE_UP, - GAMEPAD_BUTTON_RIGHT_FACE_RIGHT, - GAMEPAD_BUTTON_RIGHT_FACE_DOWN, - GAMEPAD_BUTTON_RIGHT_FACE_LEFT, - GAMEPAD_BUTTON_LEFT_TRIGGER_1, - GAMEPAD_BUTTON_LEFT_TRIGGER_2, - GAMEPAD_BUTTON_RIGHT_TRIGGER_1, - GAMEPAD_BUTTON_RIGHT_TRIGGER_2, - GAMEPAD_BUTTON_MIDDLE_LEFT, - GAMEPAD_BUTTON_MIDDLE, - GAMEPAD_BUTTON_MIDDLE_RIGHT, - GAMEPAD_BUTTON_LEFT_THUMB, - GAMEPAD_BUTTON_RIGHT_THUMB -} GamepadButton; - -typedef enum { - GAMEPAD_AXIS_LEFT_X = 0, - GAMEPAD_AXIS_LEFT_Y = 1, - GAMEPAD_AXIS_RIGHT_X = 2, - GAMEPAD_AXIS_RIGHT_Y = 3, - GAMEPAD_AXIS_LEFT_TRIGGER = 4, - GAMEPAD_AXIS_RIGHT_TRIGGER = 5 -} GamepadAxis; - -typedef enum { - LOC_VERTEX_POSITION = 0, - LOC_VERTEX_TEXCOORD01, - LOC_VERTEX_TEXCOORD02, - LOC_VERTEX_NORMAL, - LOC_VERTEX_TANGENT, - LOC_VERTEX_COLOR, - LOC_MATRIX_MVP, - LOC_MATRIX_MODEL, - LOC_MATRIX_VIEW, - LOC_MATRIX_PROJECTION, - LOC_VECTOR_VIEW, - LOC_COLOR_DIFFUSE, - LOC_COLOR_SPECULAR, - LOC_COLOR_AMBIENT, - LOC_MAP_ALBEDO, - LOC_MAP_METALNESS, - LOC_MAP_NORMAL, - LOC_MAP_ROUGHNESS, - LOC_MAP_OCCLUSION, - LOC_MAP_EMISSION, - LOC_MAP_HEIGHT, - LOC_MAP_CUBEMAP, - LOC_MAP_IRRADIANCE, - LOC_MAP_PREFILTER, - LOC_MAP_BRDF -} ShaderLocationIndex; - -#define LOC_MAP_DIFFUSE LOC_MAP_ALBEDO -#define LOC_MAP_SPECULAR LOC_MAP_MATALNESS - -typedef enum { - UNIFORM_FLOAT = 0, - UNIFORM_VEC2, - UNIFORM_VEC3, - UNIFORM_VEC4, - UNIFORM_INT, - UNIFORM_IVEC2, - UNIFORM_IVEC3, - UNIFORM_IVEC4, - UNIFORM_SAMPLER2D -} ShaderUniformDataType; - -typedef enum { - MAP_ALBEDO = 0, - MAP_METALNESS = 1, - MAP_NORMAL = 2, - MAP_ROUGHNESS = 3, - MAP_OCCLUSION, - MAP_EMISSION, - MAP_HEIGHT, - MAP_CUBEMAP, - MAP_IRRADIANCE, - MAP_PREFILTER, - MAP_BRDF -} MaterialMapType; - -#define MAP_DIFFUSE MAP_ALBEDO -#define MAP_SPECULAR MAP_METALNESS - -typedef enum { - UNCOMPRESSED_GRAYSCALE = 1, - UNCOMPRESSED_GRAY_ALPHA, - UNCOMPRESSED_R5G6B5, - UNCOMPRESSED_R8G8B8, - UNCOMPRESSED_R5G5B5A1, - UNCOMPRESSED_R4G4B4A4, - UNCOMPRESSED_R8G8B8A8, - UNCOMPRESSED_R32, - UNCOMPRESSED_R32G32B32, - UNCOMPRESSED_R32G32B32A32, - COMPRESSED_DXT1_RGB, - COMPRESSED_DXT1_RGBA, - COMPRESSED_DXT3_RGBA, - COMPRESSED_DXT5_RGBA, - COMPRESSED_ETC1_RGB, - COMPRESSED_ETC2_RGB, - COMPRESSED_ETC2_EAC_RGBA, - COMPRESSED_PVRT_RGB, - COMPRESSED_PVRT_RGBA, - COMPRESSED_ASTC_4x4_RGBA, - COMPRESSED_ASTC_8x8_RGBA -} PixelFormat; - -typedef enum { - TEXTURE_FILTER_POINT = 0, - TEXTURE_FILTER_BILINEAR, - TEXTURE_FILTER_TRILINEAR, - TEXTURE_FILTER_ANISOTROPIC_4X, - TEXTURE_FILTER_ANISOTROPIC_8X, - TEXTURE_FILTER_ANISOTROPIC_16X, -} TextureFilterMode; - -typedef enum { - TEXTURE_WRAP_REPEAT = 0, - TEXTURE_WRAP_CLAMP, - TEXTURE_WRAP_MIRROR_REPEAT, - TEXTURE_WRAP_MIRROR_CLAMP -} TextureWrapMode; -typedef enum { - CUBEMAP_LAYOUT_AUTO_DETECT = 0, - CUBEMAP_LAYOUT_LINE_VERTICAL, - CUBEMAP_LAYOUT_LINE_HORIZONTAL, - CUBEMAP_LAYOUT_CROSS_THREE_BY_FOUR, - CUBEMAP_LAYOUT_CROSS_FOUR_BY_THREE, - CUBEMAP_LAYOUT_PANORAMA -} CubemapLayoutType; - -typedef enum { - FONT_DEFAULT = 0, - FONT_BITMAP, - FONT_SDF -} FontType; - -typedef enum { - BLEND_ALPHA = 0, - BLEND_ADDITIVE, - BLEND_MULTIPLIED, - BLEND_ADD_COLORS, - BLEND_SUBTRACT_COLORS, - BLEND_CUSTOM -} BlendMode; - -typedef enum { - GESTURE_NONE = 0, - GESTURE_TAP = 1, - GESTURE_DOUBLETAP = 2, - GESTURE_HOLD = 4, - GESTURE_DRAG = 8, - GESTURE_SWIPE_RIGHT = 16, - GESTURE_SWIPE_LEFT = 32, - GESTURE_SWIPE_UP = 64, - GESTURE_SWIPE_DOWN = 128, - GESTURE_PINCH_IN = 256, - GESTURE_PINCH_OUT = 512 -} GestureType; - -typedef enum { - CAMERA_CUSTOM = 0, - CAMERA_FREE, - CAMERA_ORBITAL, - CAMERA_FIRST_PERSON, - CAMERA_THIRD_PERSON -} CameraMode; - -typedef enum { - CAMERA_PERSPECTIVE = 0, - CAMERA_ORTHOGRAPHIC -} CameraType; - -typedef enum { - NPATCH_NINE_PATCH = 0, - NPATCH_THREE_PATCH_VERTICAL, - NPATCH_THREE_PATCH_HORIZONTAL -} NPatchType; - typedef void (*TraceLogCallback)(int logType, const char *text, va_list args); -typedef void *(*MemAllocCallback)(int size); -typedef void *(*MemReallocCallback)(void *ptr, int size); -typedef void (*MemFreeCallback)(void *ptr); -typedef unsigned char* (*LoadFileDataCallback)(const char* fileName, unsigned int* bytesRead); -typedef void (*SaveFileDataCallback)(const char *fileName, void *data, unsigned int bytesToWrite); -typedef char *(*LoadFileTextCallback)(const char* fileName); -typedef void (*SaveFileTextCallback)(const char *fileName, char *text); - -// Module: core -// Window functions -void InitWindow(int width, int height, const char *title); -bool WindowShouldClose(void); -void CloseWindow(void); -bool IsWindowReady(void); -bool IsWindowFullscreen(void); -bool IsWindowHidden(void); -bool IsWindowMinimized(void); -bool IsWindowMaximized(void); -bool IsWindowFocused(void); -bool IsWindowResized(void); -bool IsWindowState(unsigned int flag); -void SetWindowState(unsigned int flags); -void ClearWindowState(unsigned int flags); -void ToggleFullscreen(void); -void MaximizeWindow(void); -void MinimizeWindow(void); -void RestoreWindow(void); -void SetWindowIcon(Image image); -void SetWindowTitle(const char *title); -void SetWindowPosition(int x, int y); -void SetWindowMonitor(int monitor); -void SetWindowMinSize(int width, int height); -void SetWindowSize(int width, int height); -void *GetWindowHandle(void); -int GetScreenWidth(void); -int GetScreenHeight(void); -int GetMonitorCount(void); -Vector2 GetMonitorPosition(int monitor); -int GetMonitorWidth(int monitor); -int GetMonitorHeight(int monitor); -int GetMonitorPhysicalWidth(int monitor); -int GetMonitorPhysicalHeight(int monitor); -int GetMonitorRefreshRate(int monitor); -Vector2 GetWindowPosition(void); -Vector2 GetWindowScaleDPI(void); -const char *GetMonitorName(int monitor); -void SetClipboardText(const char *text); -const char *GetClipboardText(void); - -// Cursor functions -void ShowCursor(void); -void HideCursor(void); -bool IsCursorHidden(void); -void EnableCursor(void); -void DisableCursor(void); -bool IsCursorOnScreen(void); - -// Drawing functions -void ClearBackground(Color color); -void BeginDrawing(void); -void EndDrawing(void); -void BeginMode2D(Camera2D camera); -void EndMode2D(void); -void BeginMode3D(Camera3D camera); -void EndMode3D(void); -void BeginTextureMode(RenderTexture2D target); -void EndTextureMode(void); -void BeginScissorMode(int x, int y, int width, int height); -void EndScissorMode(void); - -// Screen-space functions -Ray GetMouseRay(Vector2 mousePosition, Camera camera); -Matrix GetCameraMatrix(Camera camera); -Matrix GetCameraMatrix2D(Camera2D camera); -Vector2 GetWorldToScreen(Vector3 position, Camera camera); -Vector2 GetWorldToScreenEx(Vector3 position, Camera camera, int width, int height); -Vector2 GetWorldToScreen2D(Vector2 position, Camera2D camera); -Vector2 GetScreenToWorld2D(Vector2 position, Camera2D camera); - -// Timing functions -void SetTargetFPS(int fps); -int GetFPS(void); -float GetFrameTime(void); -double GetTime(void); - -// Misc functions -void SetConfigFlags(unsigned int flags); - -void SetTraceLogLevel(int logType); -void SetTraceLogExit(int logType); -void SetTraceLogCallback(TraceLogCallback callback); -void TraceLog(int logType, const char *text, ...); - -void *MemAlloc(int size); -void MemFree(void *ptr); -void TakeScreenshot(const char *fileName); -int GetRandomValue(int min, int max); - -// Files management -unsigned char *LoadFileData(const char *fileName, unsigned int *bytesRead); -void UnloadFileData(unsigned char *data); -bool SaveFileData(const char *fileName, void *data, unsigned int bytesToWrite); -char *LoadFileText(const char *fileName); -void UnloadFileText(unsigned char *text); -bool SaveFileText(const char *fileName, char *text); -bool FileExists(const char *fileName); -bool DirectoryExists(const char *dirPath); -bool IsFileExtension(const char *fileName, const char *ext); -const char *GetFileExtension(const char *fileName); -const char *GetFileName(const char *filePath); -const char *GetFileNameWithoutExt(const char *filePath); -const char *GetDirectoryPath(const char *filePath); -const char *GetPrevDirectoryPath(const char *dirPath); -const char *GetWorkingDirectory(void); -char **GetDirectoryFiles(const char *dirPath, int *count); -void ClearDirectoryFiles(void); -bool ChangeDirectory(const char *dir); -bool IsFileDropped(void); -char **GetDroppedFiles(int *count); -void ClearDroppedFiles(void); -long GetFileModTime(const char *fileName); - -unsigned char *CompressData(unsigned char *data, int dataLength, int *compDataLength); -unsigned char *DecompressData(unsigned char *compData, int compDataLength, int *dataLength); + +//------------------------------------------------------------------------------------ +// Window and Graphics Device Functions (Module: core) +//------------------------------------------------------------------------------------ + +// Window-related functions +void InitWindow(int width, int height, const char *title); // Initialize window and OpenGL context +bool WindowShouldClose(void); // Check if KEY_ESCAPE pressed or Close icon pressed +void CloseWindow(void); // Close window and unload OpenGL context +bool IsWindowReady(void); // Check if window has been initialized successfully +bool IsWindowFullscreen(void); // Check if window is currently fullscreen +bool IsWindowHidden(void); // Check if window is currently hidden (only PLATFORM_DESKTOP) +bool IsWindowMinimized(void); // Check if window is currently minimized (only PLATFORM_DESKTOP) +bool IsWindowMaximized(void); // Check if window is currently maximized (only PLATFORM_DESKTOP) +bool IsWindowFocused(void); // Check if window is currently focused (only PLATFORM_DESKTOP) +bool IsWindowResized(void); // Check if window has been resized last frame +bool IsWindowState(unsigned int flag); // Check if one specific window flag is enabled +void SetWindowState(unsigned int flags); // Set window configuration state using flags +void ClearWindowState(unsigned int flags); // Clear window configuration state flags +void ToggleFullscreen(void); // Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP) +void MaximizeWindow(void); // Set window state: maximized, if resizable (only PLATFORM_DESKTOP) +void MinimizeWindow(void); // Set window state: minimized, if resizable (only PLATFORM_DESKTOP) +void RestoreWindow(void); // Set window state: not minimized/maximized (only PLATFORM_DESKTOP) +void SetWindowIcon(Image image); // Set icon for window (only PLATFORM_DESKTOP) +void SetWindowTitle(const char *title); // Set title for window (only PLATFORM_DESKTOP) +void SetWindowPosition(int x, int y); // Set window position on screen (only PLATFORM_DESKTOP) +void SetWindowMonitor(int monitor); // Set monitor for the current window (fullscreen mode) +void SetWindowMinSize(int width, int height); // Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE) +void SetWindowSize(int width, int height); // Set window dimensions +void *GetWindowHandle(void); // Get native window handle +int GetScreenWidth(void); // Get current screen width +int GetScreenHeight(void); // Get current screen height +int GetMonitorCount(void); // Get number of connected monitors +Vector2 GetMonitorPosition(int monitor); // Get specified monitor position +int GetMonitorWidth(int monitor); // Get specified monitor width +int GetMonitorHeight(int monitor); // Get specified monitor height +int GetMonitorPhysicalWidth(int monitor); // Get specified monitor physical width in millimetres +int GetMonitorPhysicalHeight(int monitor); // Get specified monitor physical height in millimetres +int GetMonitorRefreshRate(int monitor); // Get specified monitor refresh rate +Vector2 GetWindowPosition(void); // Get window position XY on monitor +Vector2 GetWindowScaleDPI(void); // Get window scale DPI factor +const char *GetMonitorName(int monitor); // Get the human-readable, UTF-8 encoded name of the primary monitor +void SetClipboardText(const char *text); // Set clipboard text content +const char *GetClipboardText(void); // Get clipboard text content + +// Cursor-related functions +void ShowCursor(void); // Shows cursor +void HideCursor(void); // Hides cursor +bool IsCursorHidden(void); // Check if cursor is not visible +void EnableCursor(void); // Enables cursor (unlock cursor) +void DisableCursor(void); // Disables cursor (lock cursor) +bool IsCursorOnScreen(void); // Check if cursor is on the current screen. + +// Drawing-related functions +void ClearBackground(Color color); // Set background color (framebuffer clear color) +void BeginDrawing(void); // Setup canvas (framebuffer) to start drawing +void EndDrawing(void); // End canvas drawing and swap buffers (double buffering) +void BeginMode2D(Camera2D camera); // Initialize 2D mode with custom camera (2D) +void EndMode2D(void); // Ends 2D mode with custom camera +void BeginMode3D(Camera3D camera); // Initializes 3D mode with custom camera (3D) +void EndMode3D(void); // Ends 3D mode and returns to default 2D orthographic mode +void BeginTextureMode(RenderTexture2D target); // Initializes render texture for drawing +void EndTextureMode(void); // Ends drawing to render texture +void BeginScissorMode(int x, int y, int width, int height); // Begin scissor mode (define screen area for following drawing) +void EndScissorMode(void); // End scissor mode + +// Screen-space-related functions +Ray GetMouseRay(Vector2 mousePosition, Camera camera); // Returns a ray trace from mouse position +Matrix GetCameraMatrix(Camera camera); // Returns camera transform matrix (view matrix) +Matrix GetCameraMatrix2D(Camera2D camera); // Returns camera 2d transform matrix +Vector2 GetWorldToScreen(Vector3 position, Camera camera); // Returns the screen space position for a 3d world space position +Vector2 GetWorldToScreenEx(Vector3 position, Camera camera, int width, int height); // Returns size position for a 3d world space position +Vector2 GetWorldToScreen2D(Vector2 position, Camera2D camera); // Returns the screen space position for a 2d camera world space position +Vector2 GetScreenToWorld2D(Vector2 position, Camera2D camera); // Returns the world space position for a 2d camera screen space position + +// Timing-related functions +void SetTargetFPS(int fps); // Set target FPS (maximum) +int GetFPS(void); // Returns current FPS +float GetFrameTime(void); // Returns time in seconds for last frame drawn +double GetTime(void); // Returns elapsed time in seconds since InitWindow() + +// Misc. functions +void SetConfigFlags(unsigned int flags); // Setup init configuration flags (view FLAGS) + +void SetTraceLogLevel(int logType); // Set the current threshold (minimum) log level +void SetTraceLogExit(int logType); // Set the exit threshold (minimum) log level +void SetTraceLogCallback(TraceLogCallback callback); // Set a trace log callback to enable custom logging +void TraceLog(int logType, const char *text, ...); // Show trace log messages (LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERROR) + +void *MemAlloc(int size); // Internal memory allocator +void MemFree(void *ptr); // Internal memory free +void TakeScreenshot(const char *fileName); // Takes a screenshot of current screen (saved a .png) +int GetRandomValue(int min, int max); // Returns a random value between min and max (both included) + +// Files management functions +unsigned char *LoadFileData(const char *fileName, unsigned int *bytesRead); // Load file data as byte array (read) +void UnloadFileData(unsigned char *data); // Unload file data allocated by LoadFileData() +bool SaveFileData(const char *fileName, void *data, unsigned int bytesToWrite); // Save data to file from byte array (write), returns true on success +char *LoadFileText(const char *fileName); // Load text data from file (read), returns a '\0' terminated string +void UnloadFileText(unsigned char *text); // Unload file text data allocated by LoadFileText() +bool SaveFileText(const char *fileName, char *text); // Save text data to file (write), string must be '\0' terminated, returns true on success +bool FileExists(const char *fileName); // Check if file exists +bool DirectoryExists(const char *dirPath); // Check if a directory path exists +bool IsFileExtension(const char *fileName, const char *ext);// Check file extension (including point: .png, .wav) +const char *GetFileExtension(const char *fileName); // Get pointer to extension for a filename string (including point: ".png") +const char *GetFileName(const char *filePath); // Get pointer to filename for a path string +const char *GetFileNameWithoutExt(const char *filePath); // Get filename string without extension (uses static string) +const char *GetDirectoryPath(const char *filePath); // Get full path for a given fileName with path (uses static string) +const char *GetPrevDirectoryPath(const char *dirPath); // Get previous directory path for a given path (uses static string) +const char *GetWorkingDirectory(void); // Get current working directory (uses static string) +char **GetDirectoryFiles(const char *dirPath, int *count); // Get filenames in a directory path (memory should be freed) +void ClearDirectoryFiles(void); // Clear directory files paths buffers (free memory) +bool ChangeDirectory(const char *dir); // Change working directory, return true on success +bool IsFileDropped(void); // Check if a file has been dropped into window +char **GetDroppedFiles(int *count); // Get dropped files names (memory should be freed) +void ClearDroppedFiles(void); // Clear dropped files paths buffer (free memory) +long GetFileModTime(const char *fileName); // Get file modification time (last write time) + +unsigned char *CompressData(unsigned char *data, int dataLength, int *compDataLength); // Compress data (DEFLATE algorithm) +unsigned char *DecompressData(unsigned char *compData, int compDataLength, int *dataLength); // Decompress data (DEFLATE algorithm) // Persistent storage management -bool SaveStorageValue(unsigned int position, int value); -int LoadStorageValue(unsigned int position); - -void OpenURL(const char *url); - -// Keyboard Input functions -bool IsKeyPressed(int key); -bool IsKeyDown(int key); -bool IsKeyReleased(int key); -bool IsKeyUp(int key); -void SetExitKey(int key); -int GetKeyPressed(void); -int GetCharPressed(void); - -// Gamepad Input functions -bool IsGamepadAvailable(int gamepad); -bool IsGamepadName(int gamepad, const char *name); -const char *GetGamepadName(int gamepad); -bool IsGamepadButtonPressed(int gamepad, int button); -bool IsGamepadButtonDown(int gamepad, int button); -bool IsGamepadButtonReleased(int gamepad, int button); -bool IsGamepadButtonUp(int gamepad, int button); -int GetGamepadButtonPressed(void); -int GetGamepadAxisCount(int gamepad); -float GetGamepadAxisMovement(int gamepad, int axis); - -// Mouse Input functions -bool IsMouseButtonPressed(int button); -bool IsMouseButtonDown(int button); -bool IsMouseButtonReleased(int button); -bool IsMouseButtonUp(int button); -int GetMouseX(void); -int GetMouseY(void); -Vector2 GetMousePosition(void); -void SetMousePosition(int x, int y); -void SetMouseOffset(int offsetX, int offsetY); -void SetMouseScale(float scaleX, float scaleY); -float GetMouseWheelMove(void); -int GetMouseCursor(void); -void SetMouseCursor(int cursor); - -// Touch Input functions -int GetTouchX(void); -int GetTouchY(void); -Vector2 GetTouchPosition(int index); - -void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, Color color); -void DrawRectangle(int posX, int posY, int width, int height, Color color); -void DrawRectangleLines(int posX, int posY, int width, int height, Color color); -void DrawRectangleRec(Rectangle rec, Color color); -void DrawText(const char *text, int posX, int posY, int fontSize, Color color); -Color Fade(Color color, float alpha); +bool SaveStorageValue(unsigned int position, int value); // Save integer value to storage file (to defined position), returns true on success +int LoadStorageValue(unsigned int position); // Load integer value from storage file (from defined position) + +void OpenURL(const char *url); // Open URL with default system browser (if available) + +//------------------------------------------------------------------------------------ +// Input Handling Functions (Module: core) +//------------------------------------------------------------------------------------ + +// Input-related functions: keyboard +bool IsKeyPressed(int key); // Detect if a key has been pressed once +bool IsKeyDown(int key); // Detect if a key is being pressed +bool IsKeyReleased(int key); // Detect if a key has been released once +bool IsKeyUp(int key); // Detect if a key is NOT being pressed +void SetExitKey(int key); // Set a custom key to exit program (default is ESC) +int GetKeyPressed(void); // Get key pressed (keycode), call it multiple times for keys queued +int GetCharPressed(void); // Get char pressed (unicode), call it multiple times for chars queued + +// Input-related functions: gamepads +bool IsGamepadAvailable(int gamepad); // Detect if a gamepad is available +bool IsGamepadName(int gamepad, const char *name); // Check gamepad name (if available) +const char *GetGamepadName(int gamepad); // Return gamepad internal name id +bool IsGamepadButtonPressed(int gamepad, int button); // Detect if a gamepad button has been pressed once +bool IsGamepadButtonDown(int gamepad, int button); // Detect if a gamepad button is being pressed +bool IsGamepadButtonReleased(int gamepad, int button); // Detect if a gamepad button has been released once +bool IsGamepadButtonUp(int gamepad, int button); // Detect if a gamepad button is NOT being pressed +int GetGamepadButtonPressed(void); // Get the last gamepad button pressed +int GetGamepadAxisCount(int gamepad); // Return gamepad axis count for a gamepad +float GetGamepadAxisMovement(int gamepad, int axis); // Return axis movement value for a gamepad axis + +// Input-related functions: mouse +bool IsMouseButtonPressed(int button); // Detect if a mouse button has been pressed once +bool IsMouseButtonDown(int button); // Detect if a mouse button is being pressed +bool IsMouseButtonReleased(int button); // Detect if a mouse button has been released once +bool IsMouseButtonUp(int button); // Detect if a mouse button is NOT being pressed +int GetMouseX(void); // Returns mouse position X +int GetMouseY(void); // Returns mouse position Y +Vector2 GetMousePosition(void); // Returns mouse position XY +void SetMousePosition(int x, int y); // Set mouse position XY +void SetMouseOffset(int offsetX, int offsetY); // Set mouse offset +void SetMouseScale(float scaleX, float scaleY); // Set mouse scaling +float GetMouseWheelMove(void); // Returns mouse wheel movement Y +int GetMouseCursor(void); // Returns mouse cursor if (MouseCursor enum) +void SetMouseCursor(int cursor); // Set mouse cursor + +// Input-related functions: touch +int GetTouchX(void); // Returns touch position X for touch point 0 (relative to screen size) +int GetTouchY(void); // Returns touch position Y for touch point 0 (relative to screen size) +Vector2 GetTouchPosition(int index); // Returns touch position XY for a touch point index (relative to screen size) + +//------------------------------------------------------------------------------------ +// Gestures and Touch Handling Functions (Module: gestures) +//------------------------------------------------------------------------------------ +void SetGesturesEnabled(unsigned int gestureFlags); // Enable a set of gestures using flags +bool IsGestureDetected(int gesture); // Check if a gesture have been detected +int GetGestureDetected(void); // Get latest detected gesture +int GetTouchPointsCount(void); // Get touch points count +float GetGestureHoldDuration(void); // Get gesture hold time in milliseconds +Vector2 GetGestureDragVector(void); // Get gesture drag vector +float GetGestureDragAngle(void); // Get gesture drag angle +Vector2 GetGesturePinchVector(void); // Get gesture pinch delta +float GetGesturePinchAngle(void); // Get gesture pinch angle + +//------------------------------------------------------------------------------------ +// Camera System Functions (Module: camera) +//------------------------------------------------------------------------------------ +void SetCameraMode(Camera camera, int mode); // Set camera mode (multiple camera modes available) +void UpdateCamera(Camera *camera); // Update camera position for selected mode + +void SetCameraPanControl(int keyPan); // Set camera pan key to combine with mouse movement (free camera) +void SetCameraAltControl(int keyAlt); // Set camera alt key to combine with mouse movement (free camera) +void SetCameraSmoothZoomControl(int keySmoothZoom); // Set camera smooth zoom key to combine with mouse (free camera) +void SetCameraMoveControls(int keyFront, int keyBack, int keyRight, int keyLeft, int keyUp, int keyDown); // Set camera move controls (1st person and 3rd person cameras) + +//------------------------------------------------------------------------------------ +// Basic Shapes Drawing Functions (Module: shapes) +//------------------------------------------------------------------------------------ + +// Basic shapes drawing functions +void DrawPixel(int posX, int posY, Color color); // Draw a pixel +void DrawPixelV(Vector2 position, Color color); // Draw a pixel (Vector version) +void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, Color color); // Draw a line +void DrawLineV(Vector2 startPos, Vector2 endPos, Color color); // Draw a line (Vector version) +void DrawLineEx(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw a line defining thickness +void DrawLineBezier(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw a line using cubic-bezier curves in-out +void DrawLineStrip(Vector2 *points, int pointsCount, Color color); // Draw lines sequence +void DrawCircle(int centerX, int centerY, float radius, Color color); // Draw a color-filled circle +void DrawCircleSector(Vector2 center, float radius, int startAngle, int endAngle, int segments, Color color); // Draw a piece of a circle +void DrawCircleSectorLines(Vector2 center, float radius, int startAngle, int endAngle, int segments, Color color); // Draw circle sector outline +void DrawCircleGradient(int centerX, int centerY, float radius, Color color1, Color color2); // Draw a gradient-filled circle +void DrawCircleV(Vector2 center, float radius, Color color); // Draw a color-filled circle (Vector version) +void DrawCircleLines(int centerX, int centerY, float radius, Color color); // Draw circle outline +void DrawEllipse(int centerX, int centerY, float radiusH, float radiusV, Color color); // Draw ellipse +void DrawEllipseLines(int centerX, int centerY, float radiusH, float radiusV, Color color); // Draw ellipse outline +void DrawRing(Vector2 center, float innerRadius, float outerRadius, int startAngle, int endAngle, int segments, Color color); // Draw ring +void DrawRingLines(Vector2 center, float innerRadius, float outerRadius, int startAngle, int endAngle, int segments, Color color); // Draw ring outline +void DrawRectangle(int posX, int posY, int width, int height, Color color); // Draw a color-filled rectangle +void DrawRectangleV(Vector2 position, Vector2 size, Color color); // Draw a color-filled rectangle (Vector version) +void DrawRectangleRec(Rectangle rec, Color color); // Draw a color-filled rectangle +void DrawRectanglePro(Rectangle rec, Vector2 origin, float rotation, Color color); // Draw a color-filled rectangle with pro parameters +void DrawRectangleGradientV(int posX, int posY, int width, int height, Color color1, Color color2);// Draw a vertical-gradient-filled rectangle +void DrawRectangleGradientH(int posX, int posY, int width, int height, Color color1, Color color2);// Draw a horizontal-gradient-filled rectangle +void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3, Color col4); // Draw a gradient-filled rectangle with custom vertex colors +void DrawRectangleLines(int posX, int posY, int width, int height, Color color); // Draw rectangle outline +void DrawRectangleLinesEx(Rectangle rec, int lineThick, Color color); // Draw rectangle outline with extended parameters +void DrawRectangleRounded(Rectangle rec, float roundness, int segments, Color color); // Draw rectangle with rounded edges +void DrawRectangleRoundedLines(Rectangle rec, float roundness, int segments, int lineThick, Color color); // Draw rectangle with rounded edges outline +void DrawTriangle(Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw a color-filled triangle (vertex in counter-clockwise order!) +void DrawTriangleLines(Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw triangle outline (vertex in counter-clockwise order!) +void DrawTriangleFan(Vector2 *points, int pointsCount, Color color); // Draw a triangle fan defined by points (first vertex is the center) +void DrawTriangleStrip(Vector2 *points, int pointsCount, Color color); // Draw a triangle strip defined by points +void DrawPoly(Vector2 center, int sides, float radius, float rotation, Color color); // Draw a regular polygon (Vector version) +void DrawPolyLines(Vector2 center, int sides, float radius, float rotation, Color color); // Draw a polygon outline of n sides + +// Basic shapes collision detection functions +bool CheckCollisionRecs(Rectangle rec1, Rectangle rec2); // Check collision between two rectangles +bool CheckCollisionCircles(Vector2 center1, float radius1, Vector2 center2, float radius2); // Check collision between two circles +bool CheckCollisionCircleRec(Vector2 center, float radius, Rectangle rec); // Check collision between circle and rectangle +bool CheckCollisionPointRec(Vector2 point, Rectangle rec); // Check if point is inside rectangle +bool CheckCollisionPointCircle(Vector2 point, Vector2 center, float radius); // Check if point is inside circle +bool CheckCollisionPointTriangle(Vector2 point, Vector2 p1, Vector2 p2, Vector2 p3); // Check if point is inside a triangle +bool CheckCollisionLines(Vector2 startPos1, Vector2 endPos1, Vector2 startPos2, Vector2 endPos2, Vector2 *collisionPoint); // Check the collision between two lines defined by two points each, returns collision point by reference +Rectangle GetCollisionRec(Rectangle rec1, Rectangle rec2); // Get collision rectangle for two rectangles collision + +//------------------------------------------------------------------------------------ +// Texture Loading and Drawing Functions (Module: textures) +//------------------------------------------------------------------------------------ + +// Image loading functions +// NOTE: This functions do not require GPU access +Image LoadImage(const char *fileName); // Load image from file into CPU memory (RAM) +Image LoadImageRaw(const char *fileName, int width, int height, int format, int headerSize); // Load image from RAW file data +Image LoadImageAnim(const char *fileName, int *frames); // Load image sequence from file (frames appended to image.data) +Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, int dataSize); // Load image from memory buffer, fileType refers to extension: i.e. "png" +void UnloadImage(Image image); // Unload image from CPU memory (RAM) +bool ExportImage(Image image, const char *fileName); // Export image data to file, returns true on success +bool ExportImageAsCode(Image image, const char *fileName); // Export image as code file defining an array of bytes, returns true on success + +// Image generation functions +Image GenImageColor(int width, int height, Color color); // Generate image: plain color +Image GenImageGradientV(int width, int height, Color top, Color bottom); // Generate image: vertical gradient +Image GenImageGradientH(int width, int height, Color left, Color right); // Generate image: horizontal gradient +Image GenImageGradientRadial(int width, int height, float density, Color inner, Color outer); // Generate image: radial gradient +Image GenImageChecked(int width, int height, int checksX, int checksY, Color col1, Color col2); // Generate image: checked +Image GenImageWhiteNoise(int width, int height, float factor); // Generate image: white noise +Image GenImagePerlinNoise(int width, int height, int offsetX, int offsetY, float scale); // Generate image: perlin noise +Image GenImageCellular(int width, int height, int tileSize); // Generate image: cellular algorithm. Bigger tileSize means bigger cells + +// Image manipulation functions +Image ImageCopy(Image image); // Create an image duplicate (useful for transformations) +Image ImageFromImage(Image image, Rectangle rec); // Create an image from another image piece +Image ImageText(const char *text, int fontSize, Color color); // Create an image from text (default font) +Image ImageTextEx(Font font, const char *text, float fontSize, float spacing, Color tint); // Create an image from text (custom sprite font) +void ImageFormat(Image *image, int newFormat); // Convert image data to desired format +void ImageToPOT(Image *image, Color fill); // Convert image to POT (power-of-two) +void ImageCrop(Image *image, Rectangle crop); // Crop an image to a defined rectangle +void ImageAlphaCrop(Image *image, float threshold); // Crop image depending on alpha value +void ImageAlphaClear(Image *image, Color color, float threshold); // Clear alpha channel to desired color +void ImageAlphaMask(Image *image, Image alphaMask); // Apply alpha mask to image +void ImageAlphaPremultiply(Image *image); // Premultiply alpha channel +void ImageResize(Image *image, int newWidth, int newHeight); // Resize image (Bicubic scaling algorithm) +void ImageResizeNN(Image *image, int newWidth,int newHeight); // Resize image (Nearest-Neighbor scaling algorithm) +void ImageResizeCanvas(Image *image, int newWidth, int newHeight, int offsetX, int offsetY, Color fill); // Resize canvas and fill with color +void ImageMipmaps(Image *image); // Generate all mipmap levels for a provided image +void ImageDither(Image *image, int rBpp, int gBpp, int bBpp, int aBpp); // Dither image data to 16bpp or lower (Floyd-Steinberg dithering) +void ImageFlipVertical(Image *image); // Flip image vertically +void ImageFlipHorizontal(Image *image); // Flip image horizontally +void ImageRotateCW(Image *image); // Rotate image clockwise 90deg +void ImageRotateCCW(Image *image); // Rotate image counter-clockwise 90deg +void ImageColorTint(Image *image, Color color); // Modify image color: tint +void ImageColorInvert(Image *image); // Modify image color: invert +void ImageColorGrayscale(Image *image); // Modify image color: grayscale +void ImageColorContrast(Image *image, float contrast); // Modify image color: contrast (-100 to 100) +void ImageColorBrightness(Image *image, int brightness); // Modify image color: brightness (-255 to 255) +void ImageColorReplace(Image *image, Color color, Color replace); // Modify image color: replace color +Color *LoadImageColors(Image image); // Load color data from image as a Color array (RGBA - 32bit) +Color *LoadImagePalette(Image image, int maxPaletteSize, int *colorsCount); // Load colors palette from image as a Color array (RGBA - 32bit) +void UnloadImageColors(Color *colors); // Unload color data loaded with LoadImageColors() +void UnloadImagePalette(Color *colors); // Unload colors palette loaded with LoadImagePalette() +Rectangle GetImageAlphaBorder(Image image, float threshold); // Get image alpha border rectangle + +// Image drawing functions +// NOTE: Image software-rendering functions (CPU) +void ImageClearBackground(Image *dst, Color color); // Clear image background with given color +void ImageDrawPixel(Image *dst, int posX, int posY, Color color); // Draw pixel within an image +void ImageDrawPixelV(Image *dst, Vector2 position, Color color); // Draw pixel within an image (Vector version) +void ImageDrawLine(Image *dst, int startPosX, int startPosY, int endPosX, int endPosY, Color color); // Draw line within an image +void ImageDrawLineV(Image *dst, Vector2 start, Vector2 end, Color color); // Draw line within an image (Vector version) +void ImageDrawCircle(Image *dst, int centerX, int centerY, int radius, Color color); // Draw circle within an image +void ImageDrawCircleV(Image *dst, Vector2 center, int radius, Color color); // Draw circle within an image (Vector version) +void ImageDrawRectangle(Image *dst, int posX, int posY, int width, int height, Color color); // Draw rectangle within an image +void ImageDrawRectangleV(Image *dst, Vector2 position, Vector2 size, Color color); // Draw rectangle within an image (Vector version) +void ImageDrawRectangleRec(Image *dst, Rectangle rec, Color color); // Draw rectangle within an image +void ImageDrawRectangleLines(Image *dst, Rectangle rec, int thick, Color color); // Draw rectangle lines within an image +void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec, Color tint); // Draw a source image within a destination image (tint applied to source) +void ImageDrawText(Image *dst, const char *text, int posX, int posY, int fontSize, Color color); // Draw text (using default font) within an image (destination) +void ImageDrawTextEx(Image *dst, Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint); // Draw text (custom sprite font) within an image (destination) + +// Texture loading functions +// NOTE: These functions require GPU access +Texture2D LoadTexture(const char *fileName); // Load texture from file into GPU memory (VRAM) +Texture2D LoadTextureFromImage(Image image); // Load texture from image data +TextureCubemap LoadTextureCubemap(Image image, int layoutType); // Load cubemap from image, multiple image cubemap layouts supported +RenderTexture2D LoadRenderTexture(int width, int height); // Load texture for rendering (framebuffer) +void UnloadTexture(Texture2D texture); // Unload texture from GPU memory (VRAM) +void UnloadRenderTexture(RenderTexture2D target); // Unload render texture from GPU memory (VRAM) +void UpdateTexture(Texture2D texture, const void *pixels); // Update GPU texture with new data +void UpdateTextureRec(Texture2D texture, Rectangle rec, const void *pixels); // Update GPU texture rectangle with new data +Image GetTextureData(Texture2D texture); // Get pixel data from GPU texture and return an Image +Image GetScreenData(void); // Get pixel data from screen buffer and return an Image (screenshot) + +// Texture configuration functions +void GenTextureMipmaps(Texture2D *texture); // Generate GPU mipmaps for a texture +void SetTextureFilter(Texture2D texture, int filterMode); // Set texture scaling filter mode +void SetTextureWrap(Texture2D texture, int wrapMode); // Set texture wrapping mode + +// Texture drawing functions +void DrawTexture(Texture2D texture, int posX, int posY, Color tint); // Draw a Texture2D +void DrawTextureV(Texture2D texture, Vector2 position, Color tint); // Draw a Texture2D with position defined as Vector2 +void DrawTextureEx(Texture2D texture, Vector2 position, float rotation, float scale, Color tint); // Draw a Texture2D with extended parameters +void DrawTextureRec(Texture2D texture, Rectangle source, Vector2 position, Color tint); // Draw a part of a texture defined by a rectangle +void DrawTextureQuad(Texture2D texture, Vector2 tiling, Vector2 offset, Rectangle quad, Color tint); // Draw texture quad with tiling and offset parameters +void DrawTextureTiled(Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, float scale, Color tint); // Draw part of a texture (defined by a rectangle) with rotation and scale tiled into dest. +void DrawTexturePro(Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, Color tint); // Draw a part of a texture defined by a rectangle with 'pro' parameters +void DrawTextureNPatch(Texture2D texture, NPatchInfo nPatchInfo, Rectangle dest, Vector2 origin, float rotation, Color tint); // Draws a texture (or part of it) that stretches or shrinks nicely + +// Color/pixel related functions +Color Fade(Color color, float alpha); // Returns color with alpha applied, alpha goes from 0.0f to 1.0f +int ColorToInt(Color color); // Returns hexadecimal value for a Color +Vector4 ColorNormalize(Color color); // Returns Color normalized as float [0..1] +Color ColorFromNormalized(Vector4 normalized); // Returns Color from normalized values [0..1] +Vector3 ColorToHSV(Color color); // Returns HSV values for a Color +Color ColorFromHSV(float hue, float saturation, float value); // Returns a Color from HSV values +Color ColorAlpha(Color color, float alpha); // Returns color with alpha applied, alpha goes from 0.0f to 1.0f +Color ColorAlphaBlend(Color dst, Color src, Color tint); // Returns src alpha-blended into dst color with tint +Color GetColor(int hexValue); // Get Color structure from hexadecimal value +Color GetPixelColor(void *srcPtr, int format); // Get Color from a source pixel pointer of certain format +void SetPixelColor(void *dstPtr, Color color, int format); // Set color formatted into destination pixel pointer +int GetPixelDataSize(int width, int height, int format); // Get pixel data size in bytes for certain format + +//------------------------------------------------------------------------------------ +// Font Loading and Text Drawing Functions (Module: text) +//------------------------------------------------------------------------------------ + +// Font loading/unloading functions +Font GetFontDefault(void); // Get the default Font +Font LoadFont(const char *fileName); // Load font from file into GPU memory (VRAM) +Font LoadFontEx(const char *fileName, int fontSize, int *fontChars, int charsCount); // Load font from file with extended parameters +Font LoadFontFromImage(Image image, Color key, int firstChar); // Load font from Image (XNA style) +Font LoadFontFromMemory(const char *fileType, const unsigned char *fileData, int dataSize, int fontSize, int *fontChars, int charsCount); // Load font from memory buffer, fileType refers to extension: i.e. "ttf" +CharInfo *LoadFontData(const unsigned char *fileData, int dataSize, int fontSize, int *fontChars, int charsCount, int type); // Load font data for further use +Image GenImageFontAtlas(const CharInfo *chars, Rectangle **recs, int charsCount, int fontSize, int padding, int packMethod); // Generate image font atlas using chars info +void UnloadFontData(CharInfo *chars, int charsCount); // Unload font chars info data (RAM) +void UnloadFont(Font font); // Unload Font from GPU memory (VRAM) + +// Text drawing functions +void DrawFPS(int posX, int posY); // Shows current FPS +void DrawText(const char *text, int posX, int posY, int fontSize, Color color); // Draw text (using default font) +void DrawTextEx(Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint); // Draw text using font and additional parameters +void DrawTextRec(Font font, const char *text, Rectangle rec, float fontSize, float spacing, bool wordWrap, Color tint); // Draw text using font inside rectangle limits +void DrawTextRecEx(Font font, const char *text, Rectangle rec, float fontSize, float spacing, bool wordWrap, Color tint, + int selectStart, int selectLength, Color selectTint, Color selectBackTint); // Draw text using font inside rectangle limits with support for text selection +void DrawTextCodepoint(Font font, int codepoint, Vector2 position, float fontSize, Color tint); // Draw one character (codepoint) + +// Text misc. functions +int MeasureText(const char *text, int fontSize); // Measure string width for default font +Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing); // Measure string size for Font +int GetGlyphIndex(Font font, int codepoint); // Get index position for a unicode character on font + +// Text strings management functions (no utf8 strings, only byte chars) +// NOTE: Some strings allocate memory internally for returned strings, just be careful! +int TextCopy(char *dst, const char *src); // Copy one string to another, returns bytes copied +bool TextIsEqual(const char *text1, const char *text2); // Check if two text string are equal +unsigned int TextLength(const char *text); // Get text length, checks for '\0' ending +const char *TextFormat(const char *text, ...); // Text formatting with variables (sprintf style) +const char *TextSubtext(const char *text, int position, int length); // Get a piece of a text string +char *TextReplace(char *text, const char *replace, const char *by); // Replace text string (memory must be freed!) +char *TextInsert(const char *text, const char *insert, int position); // Insert text in a position (memory must be freed!) +const char *TextJoin(const char **textList, int count, const char *delimiter); // Join text strings with delimiter +const char **TextSplit(const char *text, char delimiter, int *count); // Split text into multiple strings +void TextAppend(char *text, const char *append, int *position); // Append text at specific position and move cursor! +int TextFindIndex(const char *text, const char *find); // Find first text occurrence within a string +const char *TextToUpper(const char *text); // Get upper case version of provided string +const char *TextToLower(const char *text); // Get lower case version of provided string +const char *TextToPascal(const char *text); // Get Pascal case notation version of provided string +int TextToInteger(const char *text); // Get integer value from text (negative values not supported) +char *TextToUtf8(int *codepoints, int length); // Encode text codepoint into utf8 text (memory must be freed!) + +// UTF8 text strings management functions +int *GetCodepoints(const char *text, int *count); // Get all codepoints in a string, codepoints count returned by parameters +int GetCodepointsCount(const char *text); // Get total number of characters (codepoints) in a UTF8 encoded string +int GetNextCodepoint(const char *text, int *bytesProcessed); // Returns next codepoint in a UTF8 encoded string; 0x3f('?') is returned on failure +const char *CodepointToUtf8(int codepoint, int *byteLength); // Encode codepoint into utf8 text (char array length returned as parameter) + +//------------------------------------------------------------------------------------ +// Basic 3d Shapes Drawing Functions (Module: models) +//------------------------------------------------------------------------------------ + +// Basic geometric 3D shapes drawing functions +void DrawLine3D(Vector3 startPos, Vector3 endPos, Color color); // Draw a line in 3D world space +void DrawPoint3D(Vector3 position, Color color); // Draw a point in 3D space, actually a small line +void DrawCircle3D(Vector3 center, float radius, Vector3 rotationAxis, float rotationAngle, Color color); // Draw a circle in 3D world space +void DrawTriangle3D(Vector3 v1, Vector3 v2, Vector3 v3, Color color); // Draw a color-filled triangle (vertex in counter-clockwise order!) +void DrawTriangleStrip3D(Vector3 *points, int pointsCount, Color color); // Draw a triangle strip defined by points +void DrawCube(Vector3 position, float width, float height, float length, Color color); // Draw cube +void DrawCubeV(Vector3 position, Vector3 size, Color color); // Draw cube (Vector version) +void DrawCubeWires(Vector3 position, float width, float height, float length, Color color); // Draw cube wires +void DrawCubeWiresV(Vector3 position, Vector3 size, Color color); // Draw cube wires (Vector version) +void DrawCubeTexture(Texture2D texture, Vector3 position, float width, float height, float length, Color color); // Draw cube textured +void DrawSphere(Vector3 centerPos, float radius, Color color); // Draw sphere +void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere with extended parameters +void DrawSphereWires(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere wires +void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone +void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone wires +void DrawPlane(Vector3 centerPos, Vector2 size, Color color); // Draw a plane XZ +void DrawRay(Ray ray, Color color); // Draw a ray line +void DrawGrid(int slices, float spacing); // Draw a grid (centered at (0, 0, 0)) +void DrawGizmo(Vector3 position); // Draw simple gizmo + +//------------------------------------------------------------------------------------ +// Model 3d Loading and Drawing Functions (Module: models) +//------------------------------------------------------------------------------------ + +// Model loading/unloading functions +Model LoadModel(const char *fileName); // Load model from files (meshes and materials) +Model LoadModelFromMesh(Mesh mesh); // Load model from generated mesh (default material) +void UnloadModel(Model model); // Unload model (including meshes) from memory (RAM and/or VRAM) +void UnloadModelKeepMeshes(Model model); // Unload model (but not meshes) from memory (RAM and/or VRAM) + +// Mesh loading/unloading functions +Mesh *LoadMeshes(const char *fileName, int *meshCount); // Load meshes from model file +void UnloadMesh(Mesh mesh); // Unload mesh from memory (RAM and/or VRAM) +bool ExportMesh(Mesh mesh, const char *fileName); // Export mesh data to file, returns true on success + +// Material loading/unloading functions +Material *LoadMaterials(const char *fileName, int *materialCount); // Load materials from model file +Material LoadMaterialDefault(void); // Load default material (Supports: DIFFUSE, SPECULAR, NORMAL maps) +void UnloadMaterial(Material material); // Unload material from GPU memory (VRAM) +void SetMaterialTexture(Material *material, int mapType, Texture2D texture); // Set texture for a material map type (MAP_DIFFUSE, MAP_SPECULAR...) +void SetModelMeshMaterial(Model *model, int meshId, int materialId); // Set material for a mesh + +// Model animations loading/unloading functions +ModelAnimation *LoadModelAnimations(const char *fileName, int *animsCount); // Load model animations from file +void UpdateModelAnimation(Model model, ModelAnimation anim, int frame); // Update model animation pose +void UnloadModelAnimation(ModelAnimation anim); // Unload animation data +bool IsModelAnimationValid(Model model, ModelAnimation anim); // Check model animation skeleton match + +// Mesh generation functions +Mesh GenMeshPoly(int sides, float radius); // Generate polygonal mesh +Mesh GenMeshPlane(float width, float length, int resX, int resZ); // Generate plane mesh (with subdivisions) +Mesh GenMeshCube(float width, float height, float length); // Generate cuboid mesh +Mesh GenMeshSphere(float radius, int rings, int slices); // Generate sphere mesh (standard sphere) +Mesh GenMeshHemiSphere(float radius, int rings, int slices); // Generate half-sphere mesh (no bottom cap) +Mesh GenMeshCylinder(float radius, float height, int slices); // Generate cylinder mesh +Mesh GenMeshTorus(float radius, float size, int radSeg, int sides); // Generate torus mesh +Mesh GenMeshKnot(float radius, float size, int radSeg, int sides); // Generate trefoil knot mesh +Mesh GenMeshHeightmap(Image heightmap, Vector3 size); // Generate heightmap mesh from image data +Mesh GenMeshCubicmap(Image cubicmap, Vector3 cubeSize); // Generate cubes-based map mesh from image data + +// Mesh manipulation functions +BoundingBox MeshBoundingBox(Mesh mesh); // Compute mesh bounding box limits +void MeshTangents(Mesh *mesh); // Compute mesh tangents +void MeshBinormals(Mesh *mesh); // Compute mesh binormals +void MeshNormalsSmooth(Mesh *mesh); // Smooth (average) vertex normals + +// Model drawing functions +void DrawModel(Model model, Vector3 position, float scale, Color tint); // Draw a model (with texture if set) +void DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model with extended parameters +void DrawModelWires(Model model, Vector3 position, float scale, Color tint); // Draw a model wires (with texture if set) +void DrawModelWiresEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model wires (with texture if set) with extended parameters +void DrawBoundingBox(BoundingBox box, Color color); // Draw bounding box (wires) +void DrawBillboard(Camera camera, Texture2D texture, Vector3 center, float size, Color tint); // Draw a billboard texture +void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle source, Vector3 center, float size, Color tint); // Draw a billboard texture defined by source + +// Collision detection functions +bool CheckCollisionSpheres(Vector3 center1, float radius1, Vector3 center2, float radius2); // Detect collision between two spheres +bool CheckCollisionBoxes(BoundingBox box1, BoundingBox box2); // Detect collision between two bounding boxes +bool CheckCollisionBoxSphere(BoundingBox box, Vector3 center, float radius); // Detect collision between box and sphere +bool CheckCollisionRaySphere(Ray ray, Vector3 center, float radius); // Detect collision between ray and sphere +bool CheckCollisionRaySphereEx(Ray ray, Vector3 center, float radius, Vector3 *collisionPoint); // Detect collision between ray and sphere, returns collision point +bool CheckCollisionRayBox(Ray ray, BoundingBox box); // Detect collision between ray and box +RayHitInfo GetCollisionRayMesh(Ray ray, Mesh mesh, Matrix transform); // Get collision info between ray and mesh +RayHitInfo GetCollisionRayModel(Ray ray, Model model); // Get collision info between ray and model +RayHitInfo GetCollisionRayTriangle(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3); // Get collision info between ray and triangle +RayHitInfo GetCollisionRayGround(Ray ray, float groundHeight); // Get collision info between ray and ground plane (Y-normal plane) + +//------------------------------------------------------------------------------------ +// Shaders System Functions (Module: rlgl) +// NOTE: This functions are useless when using OpenGL 1.1 +//------------------------------------------------------------------------------------ + +// Shader loading/unloading functions +Shader LoadShader(const char *vsFileName, const char *fsFileName); // Load shader from files and bind default locations +Shader LoadShaderCode(const char *vsCode, const char *fsCode); // Load shader from code strings and bind default locations +void UnloadShader(Shader shader); // Unload shader from GPU memory (VRAM) + +Shader GetShaderDefault(void); // Get default shader +Texture2D GetTextureDefault(void); // Get default texture +Texture2D GetShapesTexture(void); // Get texture to draw shapes +Rectangle GetShapesTextureRec(void); // Get texture rectangle to draw shapes +void SetShapesTexture(Texture2D texture, Rectangle source); // Define default texture used to draw shapes + +// Shader configuration functions +int GetShaderLocation(Shader shader, const char *uniformName); // Get shader uniform location +int GetShaderLocationAttrib(Shader shader, const char *attribName); // Get shader attribute location +void SetShaderValue(Shader shader, int uniformLoc, const void *value, int uniformType); // Set shader uniform value +void SetShaderValueV(Shader shader, int uniformLoc, const void *value, int uniformType, int count); // Set shader uniform value vector +void SetShaderValueMatrix(Shader shader, int uniformLoc, Matrix mat); // Set shader uniform value (matrix 4x4) +void SetShaderValueTexture(Shader shader, int uniformLoc, Texture2D texture); // Set shader uniform value for texture +void SetMatrixProjection(Matrix proj); // Set a custom projection matrix (replaces internal projection matrix) +void SetMatrixModelview(Matrix view); // Set a custom modelview matrix (replaces internal modelview matrix) +Matrix GetMatrixModelview(void); // Get internal modelview matrix +Matrix GetMatrixProjection(void); // Get internal projection matrix + +// Texture maps generation (PBR) +// NOTE: Required shaders should be provided +TextureCubemap GenTextureCubemap(Shader shader, Texture2D panorama, int size, int format); // Generate cubemap texture from 2D panorama texture +TextureCubemap GenTextureIrradiance(Shader shader, TextureCubemap cubemap, int size); // Generate irradiance texture using cubemap data +TextureCubemap GenTexturePrefilter(Shader shader, TextureCubemap cubemap, int size); // Generate prefilter texture using cubemap data +Texture2D GenTextureBRDF(Shader shader, int size); // Generate BRDF texture + +// Shading begin/end functions +void BeginShaderMode(Shader shader); // Begin custom shader drawing +void EndShaderMode(void); // End custom shader drawing (use default shader) +void BeginBlendMode(int mode); // Begin blending mode (alpha, additive, multiplied) +void EndBlendMode(void); // End blending mode (reset to default: alpha blending) + +// VR control functions +void InitVrSimulator(void); // Init VR simulator for selected device parameters +void CloseVrSimulator(void); // Close VR simulator for current device +void UpdateVrTracking(Camera *camera); // Update VR tracking (position and orientation) and camera +void SetVrConfiguration(VrDeviceInfo info, Shader distortion); // Set stereo rendering configuration parameters +bool IsVrSimulatorReady(void); // Detect if VR simulator is ready +void ToggleVrMode(void); // Enable/Disable VR experience +void BeginVrDrawing(void); // Begin VR simulator stereo rendering +void EndVrDrawing(void); // End VR simulator stereo rendering + +//------------------------------------------------------------------------------------ +// Audio Loading and Playing Functions (Module: audio) +//------------------------------------------------------------------------------------ + +// Audio device management functions +void InitAudioDevice(void); // Initialize audio device and context +void CloseAudioDevice(void); // Close the audio device and context +bool IsAudioDeviceReady(void); // Check if audio device has been initialized successfully +void SetMasterVolume(float volume); // Set master volume (listener) + +// Wave/Sound loading/unloading functions +Wave LoadWave(const char *fileName); // Load wave data from file +Wave LoadWaveFromMemory(const char *fileType, const unsigned char *fileData, int dataSize); // Load wave from memory buffer, fileType refers to extension: i.e. "wav" +Sound LoadSound(const char *fileName); // Load sound from file +Sound LoadSoundFromWave(Wave wave); // Load sound from wave data +void UpdateSound(Sound sound, const void *data, int samplesCount);// Update sound buffer with new data +void UnloadWave(Wave wave); // Unload wave data +void UnloadSound(Sound sound); // Unload sound +bool ExportWave(Wave wave, const char *fileName); // Export wave data to file, returns true on success +bool ExportWaveAsCode(Wave wave, const char *fileName); // Export wave sample data to code (.h), returns true on success + +// Wave/Sound management functions +void PlaySound(Sound sound); // Play a sound +void StopSound(Sound sound); // Stop playing a sound +void PauseSound(Sound sound); // Pause a sound +void ResumeSound(Sound sound); // Resume a paused sound +void PlaySoundMulti(Sound sound); // Play a sound (using multichannel buffer pool) +void StopSoundMulti(void); // Stop any sound playing (using multichannel buffer pool) +int GetSoundsPlaying(void); // Get number of sounds playing in the multichannel +bool IsSoundPlaying(Sound sound); // Check if a sound is currently playing +void SetSoundVolume(Sound sound, float volume); // Set volume for a sound (1.0 is max level) +void SetSoundPitch(Sound sound, float pitch); // Set pitch for a sound (1.0 is base level) +void WaveFormat(Wave *wave, int sampleRate, int sampleSize, int channels); // Convert wave data to desired format +Wave WaveCopy(Wave wave); // Copy a wave to a new wave +void WaveCrop(Wave *wave, int initSample, int finalSample); // Crop a wave to defined samples range +float *LoadWaveSamples(Wave wave); // Load samples data from wave as a floats array +void UnloadWaveSamples(float *samples); // Unload samples data loaded with LoadWaveSamples() + +// Music management functions +Music LoadMusicStream(const char *fileName); // Load music stream from file +void UnloadMusicStream(Music music); // Unload music stream +void PlayMusicStream(Music music); // Start music playing +void UpdateMusicStream(Music music); // Updates buffers for music streaming +void StopMusicStream(Music music); // Stop music playing +void PauseMusicStream(Music music); // Pause music playing +void ResumeMusicStream(Music music); // Resume playing paused music +bool IsMusicPlaying(Music music); // Check if music is playing +void SetMusicVolume(Music music, float volume); // Set volume for music (1.0 is max level) +void SetMusicPitch(Music music, float pitch); // Set pitch for a music (1.0 is base level) +float GetMusicTimeLength(Music music); // Get music time length (in seconds) +float GetMusicTimePlayed(Music music); // Get current music time played (in seconds) diff --git a/src/Raylib.php b/src/Raylib.php index 1bb2f4f..5b09246 100644 --- a/src/Raylib.php +++ b/src/Raylib.php @@ -4,8 +4,7 @@ namespace Nawarian\Raylib; -use Nawarian\Raylib\Types\Camera2D; -use Nawarian\Raylib\Types\Vector2; +use FFI; final class Raylib implements HasRaylibKeysConstants { @@ -26,6 +25,11 @@ public function beginMode2D(Types\Camera2D $camera): void $this->ffi->BeginMode2D($camera->toCData($this->ffi)); } + public function beginMode3D(Types\Camera3D $camera): void + { + $this->ffi->BeginMode3D($camera->toCData($this->ffi)); + } + public function clearBackground(Types\Color $color): void { $this->ffi->ClearBackground($color->toCData($this->ffi)); @@ -36,11 +40,46 @@ public function closeWindow(): void $this->ffi->CloseWindow(); } + public function drawCube( + Types\Vector3 $position, + float $width, + float $height, + float $length, + Types\Color $color + ): void { + $this->ffi->DrawCube($position->toCData($this->ffi), $width, $height, $length, $color->toCData($this->ffi)); + } + + public function drawCubeWires( + Types\Vector3 $position, + float $width, + float $height, + float $length, + Types\Color $color + ): void { + $this->ffi->DrawCubeWires( + $position->toCData($this->ffi), + $width, + $height, + $length, + $color->toCData($this->ffi) + ); + } + public function drawLine(int $x0, int $y0, int $x1, int $y1, Types\Color $color): void { $this->ffi->DrawLine($x0, $y0, $x1, $y1, $color->toCData($this->ffi)); } + public function drawPlane(Types\Vector3 $center, Types\Vector2 $size, Types\Color $color): void + { + $this->ffi->DrawPlane( + $center->toCData($this->ffi), + $size->toCData($this->ffi), + $color->toCData($this->ffi), + ); + } + public function drawRectangle(float $x, float $y, float $width, float $height, Types\Color $color): void { $this->ffi->DrawRectangle($x, $y, $width, $height, $color->toCData($this->ffi)); @@ -71,6 +110,11 @@ public function endMode2D(): void $this->ffi->EndMode2D(); } + public function endMode3D(): void + { + $this->ffi->EndMode3D(); + } + /** * @psalm-suppress UndefinedPropertyFetch * @psalm-suppress MixedArgument @@ -101,22 +145,22 @@ public function getRandomValue(int $min, int $max): int * @psalm-suppress UndefinedPropertyFetch * @psalm-suppress MixedArgument */ - public function getScreenToWorld2D(Vector2 $position, Camera2D $camera): Vector2 + public function getScreenToWorld2D(Types\Vector2 $position, Types\Camera2D $camera): Types\Vector2 { $vec = $this->ffi->GetScreenToWorld2D($position->toCData($this->ffi), $camera->toCData($this->ffi)); - return new Vector2($vec->x, $vec->y); + return new Types\Vector2($vec->x, $vec->y); } /** * @psalm-suppress UndefinedPropertyFetch * @psalm-suppress MixedArgument */ - public function getWorldToScreen2D(Vector2 $position, Camera2D $camera): Vector2 + public function getWorldToScreen2D(Types\Vector2 $position, Types\Camera2D $camera): Types\Vector2 { $vec = $this->ffi->GetWorldToScreen2D($position->toCData($this->ffi), $camera->toCData($this->ffi)); - return new Vector2($vec->x, $vec->y); + return new Types\Vector2($vec->x, $vec->y); } public function initWindow(int $width, int $height, string $title): void @@ -134,32 +178,67 @@ public function isKeyPressed(int $key): bool return $this->ffi->IsKeyPressed($key); } + public function setCameraMode(Types\Camera3D $camera, int $mode): void + { + $this->ffi->SetCameraMode($camera->toCData($this->ffi), $mode); + } + public function setTargetFPS(int $fps): void { $this->ffi->SetTargetFPS($fps); } + /** + * @psalm-suppress InvalidPassByReference + * @psalm-suppress MixedArgument + * @psalm-suppress MixedAssignment + * @psalm-suppress MixedPropertyFetch + */ + public function updateCamera(Types\Camera3D $camera): void + { + // Raylib's UpdateCamera() expects a struct *Camera3D + // So we pass by ref here. Given it will write to the + // camera object, we need to update on PHP side as well. + $cdata = FFI::addr($camera->toCData($this->ffi)); + $this->ffi->UpdateCamera($cdata); + + $camera->position->x = $cdata->position->x; + $camera->position->y = $cdata->position->y; + $camera->position->z = $cdata->position->z; + + $camera->target->x = $cdata->target->x; + $camera->target->y = $cdata->target->y; + $camera->target->z = $cdata->target->z; + + $camera->up->x = $cdata->up->x; + $camera->up->y = $cdata->up->y; + $camera->up->z = $cdata->up->z; + + $camera->fovy = $cdata->fovy; + $camera->projection = $cdata->type; + } + public function windowShouldClose(): bool { return $this->ffi->WindowShouldClose(); } - public function vector2Add(Vector2 $v1, Vector2 $v2): Vector2 + public function vector2Add(Types\Vector2 $v1, Types\Vector2 $v2): Types\Vector2 { return $v1->add($v2); } - public function vector2Length(Vector2 $vec): float + public function vector2Length(Types\Vector2 $vec): float { return $vec->length(); } - public function vector2Scale(Vector2 $vec, float $scale): Vector2 + public function vector2Scale(Types\Vector2 $vec, float $scale): Types\Vector2 { return $vec->scale($scale); } - public function vector2Subtract(Vector2 $v1, Vector2 $v2): Vector2 + public function vector2Subtract(Types\Vector2 $v1, Types\Vector2 $v2): Types\Vector2 { return $v1->subtract($v2); } diff --git a/src/RaylibFFIProxy.php b/src/RaylibFFIProxy.php index f41f484..7fe7d7a 100644 --- a/src/RaylibFFIProxy.php +++ b/src/RaylibFFIProxy.php @@ -5,21 +5,25 @@ namespace Nawarian\Raylib; use FFI; -use Nawarian\Raylib\Types\Vector2; /** * @method FFI\CData new(string $type) * @method void BeginDrawing() * @method void BeginMode2D(FFI\CData $camera2D) - * @method void ClearBackground(FFI\CData $camera2D) + * @method void BeginMode3D(FFI\CData $camera3D) + * @method void ClearBackground(FFI\CData $color) * @method void CloseWindow() + * @method void DrawCube(FFI\CData $position, float $width, float $height, float $length, FFI\CData $color) + * @method void DrawCubeWires(FFI\CData $position, float $width, float $height, float $length, FFI\CData $color) * @method void DrawLine(int $x0, int $y0, int $x1, int $y1, FFI\CData $color) + * @method void DrawPlane(FFI\CData $center, FFI\CData $size, FFI\CData $color) * @method void DrawRectangle(float $x, float $y, float $width, float $height, FFI\CData $color) * @method void DrawRectangleLines(float $x, float $y, float $width, float $height, FFI\CData $color) * @method void DrawRectangleRec(FFI\CData $rectangle, FFI\CData $color) * @method void DrawText(string $text, int $x, int $y, int $fontSize, FFI\CData $color) * @method void EndDrawing() * @method void EndMode2D() + * @method void EndMode3D() * @method FFI\CData Fade(FFI\CData $color, float $alpha) * @method float GetFrameTime() * @method float GetMouseWheelMove() @@ -29,7 +33,9 @@ * @method void InitWindow(int $width, int $height, string $title) * @method bool IsKeyDown(int $key) * @method bool IsKeyPressed(int $key) + * @method void SetCameraMode(FFI\CData $camera, int $mode) * @method void SetTargetFPS(int $fps) + * @method void UpdateCamera(FFI\CData $camera) * @method bool WindowShouldClose() */ class RaylibFFIProxy diff --git a/src/Types/Camera3D.php b/src/Types/Camera3D.php new file mode 100644 index 0000000..3de039c --- /dev/null +++ b/src/Types/Camera3D.php @@ -0,0 +1,61 @@ +position = $position; + $this->target = $target; + $this->up = $up; + $this->fovy = $fovy; + $this->projection = $projection; + } + + /** + * @psalm-suppress MixedPropertyAssignment + * @psalm-suppress UndefinedPropertyAssignment + */ + public function toCData(RaylibFFIProxy $ffi): CData + { + try { + /** @var CData $camera */ + $camera = $ffi->new('Camera3D'); + } catch (FFI\ParserException $e) { + throw new InvalidArgumentException( + 'Object $ffi does not provide the type "struct Camera3D"' + ); + } + + $camera->position = $this->position->toCData($ffi); + $camera->target = $this->target->toCData($ffi); + $camera->up = $this->up->toCData($ffi); + $camera->fovy = $this->fovy; + $camera->type = $this->projection; + + return $camera; + } +} diff --git a/src/Types/Color.php b/src/Types/Color.php index 6103c75..fdcbd7a 100644 --- a/src/Types/Color.php +++ b/src/Types/Color.php @@ -39,6 +39,31 @@ public static function darkGray(): Color return new self(80, 80, 80, 255); } + public static function blue(): Color + { + return new self(0, 121, 241, 255); + } + + public static function gold(): Color + { + return new self(255, 203, 0, 255); + } + + public static function lime(): Color + { + return new self(0, 158, 47, 255); + } + + public static function maroon(): Color + { + return new self(190, 33, 55, 255); + } + + public static function skyBlue(): Color + { + return new self(102, 191, 255, 255); + } + public static function red(): Color { return new self(230, 41, 55, 255); @@ -49,6 +74,11 @@ public static function black(): Color return new self(0, 0, 0, 255); } + public static function rayWhite(): Color + { + return new self(245, 245, 245, 255); + } + /** * @psalm-suppress MixedPropertyAssignment * @psalm-suppress UndefinedPropertyAssignment diff --git a/src/Types/Vector3.php b/src/Types/Vector3.php new file mode 100644 index 0000000..566b280 --- /dev/null +++ b/src/Types/Vector3.php @@ -0,0 +1,46 @@ +x = $x; + $this->y = $y; + $this->z = $z; + } + + /** + * @psalm-suppress MixedPropertyAssignment + * @psalm-suppress UndefinedPropertyAssignment + */ + public function toCData(RaylibFFIProxy $ffi): CData + { + try { + /** @var CData $vec */ + $vec = $ffi->new('Vector3'); + } catch (FFI\ParserException $e) { + throw new InvalidArgumentException( + 'Object $ffi does not provide the type "struct Vector3"' + ); + } + + $vec->x = $this->x; + $vec->y = $this->y; + $vec->z = $this->z; + + return $vec; + } +} diff --git a/tests/RaylibTest.php b/tests/RaylibTest.php index d52ca46..4214097 100644 --- a/tests/RaylibTest.php +++ b/tests/RaylibTest.php @@ -9,9 +9,11 @@ use Nawarian\Raylib\Raylib; use Nawarian\Raylib\RaylibFFIProxy; use Nawarian\Raylib\Types\Camera2D; +use Nawarian\Raylib\Types\Camera3D; use Nawarian\Raylib\Types\Color; use Nawarian\Raylib\Types\Rectangle; use Nawarian\Raylib\Types\Vector2; +use Nawarian\Raylib\Types\Vector3; use PHPUnit\Framework\TestCase; use Prophecy\Argument; use Prophecy\PhpUnit\ProphecyTrait; @@ -60,6 +62,33 @@ public function test_beginMode2D_convertsCamera2DToCData(): void $this->raylib->beginMode2D($camera); } + public function test_beginMode3D_convertsCamera3DToCData(): void + { + $camera = new Camera3D( + new Vector3(0, 0, 0), + new Vector3(1, 1, 1), + new Vector3(2, 2, 2), + 10.0, + 5, + ); + + $expectedStruct = $this->ffi->new('Camera3D'); + $expectedStruct->target->x = 1; + $expectedStruct->target->y = 1; + $expectedStruct->target->z = 1; + $expectedStruct->up->x = 2; + $expectedStruct->up->y = 2; + $expectedStruct->up->z = 2; + $expectedStruct->fovy = 10.0; + $expectedStruct->type = 5; + + $this->ffiProxy->BeginMode3D( + $this->sameCDataCamera3DArgument($expectedStruct) + )->shouldBeCalledOnce(); + + $this->raylib->beginMode3D($camera); + } + public function test_clearBackground_convertsColorToCData(): void { $color = new Color(0, 0, 0, 0); @@ -71,6 +100,58 @@ public function test_clearBackground_convertsColorToCData(): void $this->raylib->clearBackground($color); } + public function test_closeWindow(): void + { + $this->ffiProxy->CloseWindow() + ->shouldBeCalledOnce(); + + $this->raylib->closeWindow(); + } + + public function test_drawCube_respectsParameterOrderAndConvertsObjectsToCData(): void + { + $position = new Vector3(5, 10, 15); + $color = new Color(0, 0, 0, 0); + + $expectedColorStruct = $this->ffi->new('Color'); + $expectedVector3Struct = $this->ffi->new('Vector3'); + $expectedVector3Struct->x = 5; + $expectedVector3Struct->y = 10; + $expectedVector3Struct->z = 15; + + $this->ffiProxy->DrawCube( + $this->sameCDataVector3Argument($expectedVector3Struct), + 10, + 20, + 30, + $this->sameCDataColorArgument($expectedColorStruct), + )->shouldBeCalledOnce(); + + $this->raylib->drawCube($position, 10, 20, 30, $color); + } + + public function test_drawCubeWires_respectsParameterOrderAndConvertsObjectsToCData(): void + { + $position = new Vector3(5, 10, 15); + $color = new Color(0, 0, 0, 0); + + $expectedColorStruct = $this->ffi->new('Color'); + $expectedVector3Struct = $this->ffi->new('Vector3'); + $expectedVector3Struct->x = 5; + $expectedVector3Struct->y = 10; + $expectedVector3Struct->z = 15; + + $this->ffiProxy->DrawCubeWires( + $this->sameCDataVector3Argument($expectedVector3Struct), + 10, + 20, + 30, + $this->sameCDataColorArgument($expectedColorStruct), + )->shouldBeCalledOnce(); + + $this->raylib->drawCubeWires($position, 10, 20, 30, $color); + } + public function test_drawLine_respectsParameterOrderAndConvertsColorToCData(): void { $color = new Color(0, 0, 0, 0); @@ -82,12 +163,28 @@ public function test_drawLine_respectsParameterOrderAndConvertsColorToCData(): v $this->raylib->drawLine(10, 20, 30 ,40, $color); } - public function test_closeWindow(): void + public function test_drawPlane_respectsParameterOrderAndConvertsColorToCData(): void { - $this->ffiProxy->CloseWindow() - ->shouldBeCalledOnce(); + $center = new Vector3(5, 10, 15); + $size = new Vector2(20, 40); + $color = new Color(0, 0, 0, 0); - $this->raylib->closeWindow(); + $expectedCenterStruct = $this->ffi->new('Vector3'); + $expectedCenterStruct->x = 5; + $expectedCenterStruct->y = 10; + $expectedCenterStruct->z = 15; + $expectedSizeStruct = $this->ffi->new('Vector2'); + $expectedSizeStruct->x = 20; + $expectedSizeStruct->y = 40; + $expectedColorStruct = $this->ffi->new('Color'); + + $this->ffiProxy->DrawPlane( + $this->sameCDataVector3Argument($expectedCenterStruct), + $this->sameCDataVector2Argument($expectedSizeStruct), + $this->sameCDataColorArgument($expectedColorStruct), + )->shouldBeCalledOnce(); + + $this->raylib->drawPlane($center, $size, $color); } public function test_drawRectangle_respectsParameterOrderAndConvertsColorToCData(): void @@ -154,6 +251,14 @@ public function test_endMode2D(): void $this->raylib->endMode2D(); } + public function test_endMode3D(): void + { + $this->ffiProxy->EndMode3D() + ->shouldBeCalledOnce(); + + $this->raylib->endMode3D(); + } + public function test_fade_respectsParameterOrderAndConvertsObjectsToCData(): void { $color = new Color(255, 0, 0, 155); @@ -265,6 +370,28 @@ public function test_isKeyPressed(): void self::assertTrue($this->raylib->isKeyPressed(10)); } + public function test_setCameraMode_respectsParameterOrderAndConvertsObjectsToCData(): void + { + $camera = new Camera3D( + new Vector3(0, 0, 0), + new Vector3(0, 0, 0), + new Vector3(0, 0, 0), + 15.0, + 5, + ); + + $expectedStruct = $this->ffi->new('Camera3D'); + $expectedStruct->fovy = 15.0; + $expectedStruct->type = 5; + + $this->ffiProxy->SetCameraMode( + $this->sameCDataCamera3DArgument($expectedStruct), + Camera3D::MODE_FIRST_PERSON, + )->shouldBeCalledOnce(); + + $this->raylib->setCameraMode($camera, Camera3D::MODE_FIRST_PERSON); + } + public function test_setTargetFPS_respectsParameterOrder(): void { $this->ffiProxy->SetTargetFPS(45) @@ -273,6 +400,40 @@ public function test_setTargetFPS_respectsParameterOrder(): void $this->raylib->setTargetFPS(45); } + public function test_updateCamera_respectsParameterOrderAndConvertsObjectsToCDataAndUpdatesOriginalObject(): void + { + $camera = new Camera3D( + new Vector3(0, 0, 0), + new Vector3(0, 0, 0), + new Vector3(0, 0, 0), + 15.0, + 5, + ); + + $expectedStruct = $this->ffi->new('Camera3D'); + $expectedStruct->fovy = 15.0; + $expectedStruct->type = 5; + + $this->ffiProxy->UpdateCamera( + $this->sameCDataCamera3DArgument($expectedStruct) + )->will(function (array $args) { + /** @var CData $cdata */ + [$cdata] = $args; + + $cdata->position->x = 10; + $cdata->target->x = 15; + $cdata->up->x = 20; + $cdata->fovy = 30.0; + })->shouldBeCalledOnce(); + + $this->raylib->updateCamera($camera); + + self::assertEquals(10, $camera->position->x); + self::assertEquals(15, $camera->target->x); + self::assertEquals(20, $camera->up->x); + self::assertEquals(30.0, $camera->fovy); + } + public function test_windowShouldClose(): void { $this->ffiProxy->WindowShouldClose() @@ -282,6 +443,17 @@ public function test_windowShouldClose(): void self::assertTrue($this->raylib->windowShouldClose()); } + private function sameCDataVector3Argument(CData $expectedStruct): Argument\Token\CallbackToken + { + return Argument::that(function (CData $vector3) use ($expectedStruct) { + self::assertEquals($expectedStruct->x, $vector3->x); + self::assertEquals($expectedStruct->y, $vector3->y); + self::assertEquals($expectedStruct->z, $vector3->z); + + return true; + }); + } + private function sameCDataVector2Argument(CData $expectedStruct): Argument\Token\CallbackToken { return Argument::that(function (CData $vector2) use ($expectedStruct) { @@ -292,6 +464,25 @@ private function sameCDataVector2Argument(CData $expectedStruct): Argument\Token }); } + private function sameCDataCamera3DArgument(CData $expectedStruct): Argument\Token\CallbackToken + { + return Argument::that(function (CData $camera) use ($expectedStruct) { + self::assertEquals($expectedStruct->position->x, $camera->position->x); + self::assertEquals($expectedStruct->position->y, $camera->position->y); + self::assertEquals($expectedStruct->position->z, $camera->position->z); + self::assertEquals($expectedStruct->target->x, $camera->target->x); + self::assertEquals($expectedStruct->target->y, $camera->target->y); + self::assertEquals($expectedStruct->target->z, $camera->target->z); + self::assertEquals($expectedStruct->up->x, $camera->up->x); + self::assertEquals($expectedStruct->up->y, $camera->up->y); + self::assertEquals($expectedStruct->up->z, $camera->up->z); + self::assertEquals($expectedStruct->fovy, $camera->fovy); + self::assertEquals($expectedStruct->type, $camera->type); + + return true; + }); + } + private function sameCDataCamera2DArgument(CData $expectedStruct): Argument\Token\CallbackToken { return Argument::that(function (CData $camera) use ($expectedStruct) {