Skip to content

Commit 5842a88

Browse files
committed
Add renderGeometryRaw
1 parent 7119228 commit 5842a88

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

src/SDL/Raw/Video.hs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ module SDL.Raw.Video (
131131
renderFillRectF,
132132
renderFillRectsF,
133133
renderGeometry,
134+
renderGeometryRaw,
134135
#endif
135136
renderGetClipRect,
136137
renderGetLogicalSize,
@@ -361,6 +362,7 @@ foreign import ccall "SDL.h SDL_RenderDrawRectsF" renderDrawRectsFFFI :: Rendere
361362
foreign import ccall "SDL.h SDL_RenderFillRectF" renderFillRectFFFI :: Renderer -> Ptr FRect -> IO CInt
362363
foreign import ccall "SDL.h SDL_RenderFillRectsF" renderFillRectsFFFI :: Renderer -> Ptr FRect -> CInt -> IO CInt
363364
foreign import ccall "SDL.h SDL_RenderGeometry" renderGeometryFFI :: Renderer -> Texture -> Ptr Vertex -> CInt -> Ptr CInt -> CInt -> IO CInt
365+
foreign import ccall "SDL.h SDL_RenderGeometryRaw" renderGeometryRawFFI :: Renderer -> Texture -> Ptr FPoint -> CInt -> Ptr Color -> CInt -> Ptr FPoint -> CInt -> CInt -> Ptr () -> CInt -> CInt -> IO CInt
364366
#endif
365367
foreign import ccall "sqlhelper.c SDLHelper_RenderFillRectEx" renderFillRectExFFI :: Renderer -> CInt -> CInt -> CInt -> CInt -> IO CInt
366368
foreign import ccall "SDL.h SDL_RenderFillRects" renderFillRectsFFI :: Renderer -> Ptr Rect -> CInt -> IO CInt
@@ -954,6 +956,10 @@ renderFillRectsF v1 v2 v3 = liftIO $ renderFillRectsFFFI v1 v2 v3
954956
renderGeometry :: MonadIO m => Renderer -> Texture -> Ptr Vertex -> CInt -> Ptr CInt -> CInt -> m CInt
955957
renderGeometry v1 v2 v3 v4 v5 v6 = liftIO $ renderGeometryFFI v1 v2 v3 v4 v5 v6
956958
{-# INLINE renderGeometry #-}
959+
960+
renderGeometryRaw :: MonadIO m => Renderer -> Texture -> Ptr FPoint -> CInt -> Ptr Color -> CInt -> Ptr FPoint -> CInt -> CInt -> Ptr () -> CInt -> CInt -> m CInt
961+
renderGeometryRaw v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 = liftIO $ renderGeometryRawFFI v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12
962+
{-# INLINE renderGeometryRaw #-}
957963
#endif
958964

959965

src/SDL/Video/Renderer.hs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ module SDL.Video.Renderer
4444
, fillRectsF
4545
, renderGeometry
4646
, Raw.Vertex(..)
47+
, renderGeometryRaw
4748
#endif
4849
, present
4950

@@ -764,6 +765,27 @@ renderGeometry (Renderer r) mtexture vertices indices = liftIO $
764765

765766
ipSize = fromIntegral (SV.length indices)
766767

768+
-- | Render a list of triangles, optionally using a texture and indices into the
769+
-- vertex array Color and alpha modulation is done per vertex
770+
-- (SDL_SetTextureColorMod and SDL_SetTextureAlphaMod are ignored).
771+
--
772+
-- This version allows storeing vertex data in arbitrary types, but you have to provide
773+
-- pointers and strides yourself.
774+
renderGeometryRaw :: forall ix m . (Storable ix, MonadIO m) => Renderer -> Maybe Texture -> Ptr Raw.FPoint -> CInt -> Ptr Raw.Color -> CInt -> Ptr Raw.FPoint -> CInt -> CInt -> SV.Vector ix -> m ()
775+
renderGeometryRaw (Renderer r) mtexture xy xyStride color colorStride uv uvStride numVertices indices = liftIO $
776+
throwIfNeg_ "SDL.Video.renderGeometryRaw" "SDL_RenderGeometryRaw" $
777+
SV.unsafeWith indices $ \ip ->
778+
Raw.renderGeometryRaw r t xy xyStride color colorStride uv uvStride numVertices (castPtr $ ipOrNull ip) ipSize sizeOfip
779+
where
780+
t = case mtexture of
781+
Just (Texture found) -> found
782+
Nothing -> nullPtr
783+
784+
ipOrNull ip = if ipSize == 0 then nullPtr else ip
785+
786+
ipSize = fromIntegral (SV.length indices)
787+
788+
sizeOfip = fromIntegral $ sizeOf (undefined :: ix)
767789
#endif
768790

769791

0 commit comments

Comments
 (0)