Use generated ImDraw* structs

This commit is contained in:
Joonas Javanainen 2019-06-27 09:02:31 +03:00
parent 043fe3a42f
commit c1f48896e4
No known key found for this signature in database
GPG Key ID: D39CCA5CB19B9179
6 changed files with 55 additions and 353 deletions

View File

@ -304,21 +304,21 @@ impl<R: Resources> Renderer<R> {
self.bundle.slice.start = 0;
for cmd in draw_list.cmd_buffer {
let texture_id = cmd.texture_id.into();
let texture_id = cmd.TextureId.into();
let tex = self
.textures
.get(texture_id)
.ok_or_else(|| RendererError::BadTexture(texture_id))?;
self.bundle.slice.end = self.bundle.slice.start + cmd.elem_count;
self.bundle.slice.end = self.bundle.slice.start + cmd.ElemCount;
let scissor = Rect {
x: cmd.clip_rect.x.max(0.0).min(fb_width).round() as u16,
y: cmd.clip_rect.y.max(0.0).min(fb_height).round() as u16,
w: (cmd.clip_rect.z - cmd.clip_rect.x)
x: cmd.ClipRect.x.max(0.0).min(fb_width).round() as u16,
y: cmd.ClipRect.y.max(0.0).min(fb_height).round() as u16,
w: (cmd.ClipRect.z - cmd.ClipRect.x)
.abs()
.min(fb_width)
.round() as u16,
h: (cmd.clip_rect.w - cmd.clip_rect.y)
h: (cmd.ClipRect.w - cmd.ClipRect.y)
.abs()
.min(fb_height)
.round() as u16,

View File

@ -134,14 +134,14 @@ impl Renderer {
let mut idx_start = 0;
for cmd in draw_list.cmd_buffer {
let texture_id = cmd.texture_id.into();
let texture_id = cmd.TextureId.into();
let texture = self
.device_objects
.textures
.get(texture_id)
.ok_or_else(|| RendererError::BadTexture(texture_id))?;
let idx_end = idx_start + cmd.elem_count as usize;
let idx_end = idx_start + cmd.ElemCount as usize;
surface.draw(
&vtx_buffer,
@ -156,13 +156,13 @@ impl Renderer {
&DrawParameters {
blend: Blend::alpha_blending(),
scissor: Some(Rect {
left: cmd.clip_rect.x.max(0.0).min(fb_width).round() as u32,
bottom: (fb_height - cmd.clip_rect.w).max(0.0).min(fb_width).round() as u32,
width: (cmd.clip_rect.z - cmd.clip_rect.x)
left: cmd.ClipRect.x.max(0.0).min(fb_width).round() as u32,
bottom: (fb_height - cmd.ClipRect.w).max(0.0).min(fb_width).round() as u32,
width: (cmd.ClipRect.z - cmd.ClipRect.x)
.abs()
.min(fb_width)
.round() as u32,
height: (cmd.clip_rect.w - cmd.clip_rect.y)
height: (cmd.ClipRect.w - cmd.ClipRect.y)
.abs()
.min(fb_height)
.round() as u32,

View File

@ -13,9 +13,26 @@ mod legacy;
mod structs;
pub use bindings::{
igGetIO, CustomRect, ImDrawCallback, ImDrawIdx, ImDrawListSharedData, ImDrawListSplitter,
ImDrawVert, ImFont, ImFontAtlas, ImFontAtlas_AddFont, ImFontAtlas_AddFontDefault,
ImFontAtlas_Clear, ImFontAtlas_GetGlyphRangesChineseFull,
igGetIO, CustomRect, ImDrawCallback, ImDrawChannel, ImDrawCmd, ImDrawData, ImDrawData_Clear,
ImDrawData_DeIndexAllBuffers, ImDrawData_ScaleClipRects, ImDrawIdx, ImDrawList,
ImDrawListSharedData, ImDrawListSplitter, ImDrawList_AddBezierCurve, ImDrawList_AddCallback,
ImDrawList_AddCircle, ImDrawList_AddCircleFilled, ImDrawList_AddConvexPolyFilled,
ImDrawList_AddDrawCmd, ImDrawList_AddImage, ImDrawList_AddImageQuad,
ImDrawList_AddImageRounded, ImDrawList_AddLine, ImDrawList_AddPolyline, ImDrawList_AddQuad,
ImDrawList_AddQuadFilled, ImDrawList_AddRect, ImDrawList_AddRectFilled,
ImDrawList_AddRectFilledMultiColor, ImDrawList_AddText, ImDrawList_AddTextFontPtr,
ImDrawList_AddTriangle, ImDrawList_AddTriangleFilled, ImDrawList_ChannelsMerge,
ImDrawList_ChannelsSetCurrent, ImDrawList_ChannelsSplit, ImDrawList_Clear,
ImDrawList_ClearFreeMemory, ImDrawList_CloneOutput, ImDrawList_ImDrawList,
ImDrawList_PathArcTo, ImDrawList_PathArcToFast, ImDrawList_PathBezierCurveTo,
ImDrawList_PathClear, ImDrawList_PathFillConvex, ImDrawList_PathLineTo,
ImDrawList_PathLineToMergeDuplicate, ImDrawList_PathRect, ImDrawList_PathStroke,
ImDrawList_PopClipRect, ImDrawList_PopTextureID, ImDrawList_PrimQuadUV, ImDrawList_PrimRect,
ImDrawList_PrimRectUV, ImDrawList_PrimReserve, ImDrawList_PrimVtx, ImDrawList_PrimWriteIdx,
ImDrawList_PrimWriteVtx, ImDrawList_PushClipRect, ImDrawList_PushClipRectFullScreen,
ImDrawList_PushTextureID, ImDrawList_UpdateClipRect, ImDrawList_UpdateTextureID,
ImDrawList_destroy, ImDrawVert, ImFont, ImFontAtlas, ImFontAtlas_AddFont,
ImFontAtlas_AddFontDefault, ImFontAtlas_Clear, ImFontAtlas_GetGlyphRangesChineseFull,
ImFontAtlas_GetGlyphRangesChineseSimplifiedCommon, ImFontAtlas_GetGlyphRangesCyrillic,
ImFontAtlas_GetGlyphRangesDefault, ImFontAtlas_GetGlyphRangesJapanese,
ImFontAtlas_GetGlyphRangesKorean, ImFontAtlas_GetGlyphRangesThai,

View File

@ -1,71 +1,8 @@
use std::os::raw::{c_char, c_float, c_int, c_uint, c_void};
use std::os::raw::{c_char, c_float, c_int, c_void};
use std::slice;
use crate::enums::{ImGuiCol, ImGuiDir, ImGuiKey, ImGuiMouseCursor, ImGuiNavInput};
use crate::flags::{ImDrawCornerFlags, ImDrawListFlags};
use crate::{
ImDrawCallback, ImDrawIdx, ImDrawListSharedData, ImDrawListSplitter, ImDrawVert, ImFont,
ImGuiID, ImGuiStorage, ImTextureID, ImU32, ImVec2, ImVec4,
};
/// Temporary storage for outputting drawing commands out of order
#[repr(C)]
pub struct ImDrawChannel {
pub cmd_buffer: ImVector<ImDrawCmd>,
pub idx_buffer: ImVector<ImDrawIdx>,
}
/// A single draw command within a parent ImDrawList (generally maps to 1 GPU draw call)
#[repr(C)]
pub struct ImDrawCmd {
pub elem_count: c_uint,
pub clip_rect: ImVec4,
pub texture_id: ImTextureID,
pub vtx_offset: c_uint,
pub idx_offset: c_uint,
pub user_callback: ImDrawCallback,
pub user_callback_data: *mut c_void,
}
/// All draw command lists required to render the frame
#[repr(C)]
pub struct ImDrawData {
pub valid: bool,
pub cmd_lists: *mut *mut ImDrawList,
pub cmd_lists_count: c_int,
pub total_idx_count: c_int,
pub total_vtx_count: c_int,
pub display_pos: ImVec2,
pub display_size: ImVec2,
pub framebuffer_scale: ImVec2,
}
impl ImDrawData {
pub unsafe fn cmd_lists(&self) -> &[*const ImDrawList] {
let cmd_lists = self.cmd_lists as *const *const ImDrawList;
slice::from_raw_parts(cmd_lists, self.cmd_lists_count as usize)
}
}
/// A single draw command list (generally one per window)
#[repr(C)]
pub struct ImDrawList {
pub cmd_buffer: ImVector<ImDrawCmd>,
pub idx_buffer: ImVector<ImDrawIdx>,
pub vtx_buffer: ImVector<ImDrawVert>,
pub flags: ImDrawListFlags,
data: *const ImDrawListSharedData,
owner_name: *const c_char,
vtx_current_offset: c_uint,
vtx_current_idx: c_uint,
vtx_write_ptr: *mut ImDrawVert,
idx_write_ptr: *mut ImDrawIdx,
clip_rect_stack: ImVector<ImVec4>,
texture_id_stack: ImVector<ImTextureID>,
path: ImVector<ImVec2>,
splitter: ImDrawListSplitter,
}
use crate::enums::{ImGuiCol, ImGuiDir};
use crate::{ImGuiID, ImGuiStorage, ImVec2, ImVec4};
/// Data payload for Drag and Drop operations
#[repr(C)]
@ -323,265 +260,3 @@ extern "C" {
pub fn ImGuiPayload_IsPreview(this: *mut ImGuiPayload) -> bool;
pub fn ImGuiPayload_IsDelivery(this: *mut ImGuiPayload) -> bool;
}
// ImDrawList
extern "C" {
pub fn ImDrawList_PushClipRect(
this: *mut ImDrawList,
clip_rect_min: ImVec2,
clip_rect_max: ImVec2,
intersect_with_current_clip_rect: bool,
);
pub fn ImDrawList_PushClipRectFullScreen(this: *mut ImDrawList);
pub fn ImDrawList_PopClipRect(this: *mut ImDrawList);
pub fn ImDrawList_PushTextureID(this: *mut ImDrawList, texture_id: ImTextureID);
pub fn ImDrawList_PopTextureID(this: *mut ImDrawList);
pub fn ImDrawList_GetClipRectMin_nonUDT2(this: *mut ImDrawList) -> ImVec2;
pub fn ImDrawList_GetClipRectMax_nonUDT2(this: *mut ImDrawList) -> ImVec2;
pub fn ImDrawList_AddLine(
this: *mut ImDrawList,
a: ImVec2,
b: ImVec2,
col: ImU32,
thickness: c_float,
);
pub fn ImDrawList_AddRect(
this: *mut ImDrawList,
a: ImVec2,
b: ImVec2,
col: ImU32,
rounding: c_float,
rounding_corners_flags: ImDrawCornerFlags,
thickness: c_float,
);
pub fn ImDrawList_AddRectFilled(
this: *mut ImDrawList,
a: ImVec2,
b: ImVec2,
col: ImU32,
rounding: c_float,
rounding_corners_flags: ImDrawCornerFlags,
);
pub fn ImDrawList_AddRectFilledMultiColor(
this: *mut ImDrawList,
a: ImVec2,
b: ImVec2,
col_upr_left: ImU32,
col_upr_right: ImU32,
col_bot_right: ImU32,
col_bot_left: ImU32,
);
pub fn ImDrawList_AddQuad(
this: *mut ImDrawList,
a: ImVec2,
b: ImVec2,
c: ImVec2,
d: ImVec2,
col: ImU32,
thickness: c_float,
);
pub fn ImDrawList_AddQuadFilled(
this: *mut ImDrawList,
a: ImVec2,
b: ImVec2,
c: ImVec2,
d: ImVec2,
col: ImU32,
);
pub fn ImDrawList_AddTriangle(
this: *mut ImDrawList,
a: ImVec2,
b: ImVec2,
c: ImVec2,
col: ImU32,
thickness: c_float,
);
pub fn ImDrawList_AddTriangleFilled(
this: *mut ImDrawList,
a: ImVec2,
b: ImVec2,
c: ImVec2,
col: ImU32,
);
pub fn ImDrawList_AddCircle(
this: *mut ImDrawList,
centre: ImVec2,
radius: c_float,
col: ImU32,
num_segments: c_int,
thickness: c_float,
);
pub fn ImDrawList_AddCircleFilled(
this: *mut ImDrawList,
centre: ImVec2,
radius: c_float,
col: ImU32,
num_segments: c_int,
);
pub fn ImDrawList_AddText(
this: *mut ImDrawList,
pos: ImVec2,
col: ImU32,
text_begin: *const c_char,
text_end: *const c_char,
);
pub fn ImDrawList_AddTextFontPtr(
this: *mut ImDrawList,
font: *const ImFont,
font_size: c_float,
pos: ImVec2,
col: ImU32,
text_begin: *const c_char,
text_end: *const c_char,
wrap_width: c_float,
cpu_fine_clip_rect: *const ImVec4,
);
pub fn ImDrawList_AddImage(
this: *mut ImDrawList,
user_texture_id: ImTextureID,
a: ImVec2,
b: ImVec2,
uv_a: ImVec2,
uv_b: ImVec2,
col: ImU32,
);
pub fn ImDrawList_AddImageQuad(
this: *mut ImDrawList,
user_texture_id: ImTextureID,
a: ImVec2,
b: ImVec2,
c: ImVec2,
d: ImVec2,
uv_a: ImVec2,
uv_b: ImVec2,
uv_c: ImVec2,
uv_d: ImVec2,
col: ImU32,
);
pub fn ImDrawList_AddImageRounded(
this: *mut ImDrawList,
user_texture_id: ImTextureID,
a: ImVec2,
b: ImVec2,
uv_a: ImVec2,
uv_b: ImVec2,
col: ImU32,
rounding: c_float,
rounding_corners: ImDrawCornerFlags,
);
pub fn ImDrawList_AddPolyLine(
this: *mut ImDrawList,
points: *const ImVec2,
num_points: c_int,
col: ImU32,
closed: bool,
thickness: c_float,
);
pub fn ImDrawList_AddConvexPolyFilled(
this: *mut ImDrawList,
points: *const ImVec2,
num_points: c_int,
col: ImU32,
);
pub fn ImDrawList_AddBezierCurve(
this: *mut ImDrawList,
pos0: ImVec2,
cp0: ImVec2,
cp1: ImVec2,
pos1: ImVec2,
col: ImU32,
thickness: c_float,
num_segments: c_int,
);
pub fn ImDrawList_PathClear(this: *mut ImDrawList);
pub fn ImDrawList_PathLineTo(this: *mut ImDrawList, pos: ImVec2);
pub fn ImDrawList_PathLineToMergeDuplicate(this: *mut ImDrawList, pos: ImVec2);
pub fn ImDrawList_PathFillConvex(this: *mut ImDrawList, col: ImU32);
pub fn ImDrawList_PathStroke(
this: *mut ImDrawList,
col: ImU32,
closed: bool,
thickness: c_float,
);
pub fn ImDrawList_PathArcTo(
this: *mut ImDrawList,
centre: ImVec2,
radius: c_float,
a_min: c_float,
a_max: c_float,
num_segments: c_int,
);
pub fn ImDrawList_PathArcToFast(
this: *mut ImDrawList,
centre: ImVec2,
radius: c_float,
a_min_of_12: c_int,
a_max_of_12: c_int,
);
pub fn ImDrawList_PathBezierCurveTo(
this: *mut ImDrawList,
p1: ImVec2,
p2: ImVec2,
p3: ImVec2,
num_segments: c_int,
);
pub fn ImDrawList_PathRect(
this: *mut ImDrawList,
rect_min: ImVec2,
rect_max: ImVec2,
rounding: c_float,
rounding_corners_flags: c_int,
);
pub fn ImDrawList_ChannelsSplit(this: *mut ImDrawList, channels_count: c_int);
pub fn ImDrawList_ChannelsMerge(this: *mut ImDrawList);
pub fn ImDrawList_ChannelsSetCurrent(this: *mut ImDrawList, channel_index: c_int);
pub fn ImDrawList_AddCallback(
this: *mut ImDrawList,
callback: ImDrawCallback,
callback_data: *mut c_void,
);
pub fn ImDrawList_AddDrawCmd(this: *mut ImDrawList);
pub fn ImDrawList_CloneOutput(this: *mut ImDrawList) -> *mut ImDrawList;
pub fn ImDrawList_Clear(this: *mut ImDrawList);
pub fn ImDrawList_ClearFreeMemory(this: *mut ImDrawList);
pub fn ImDrawList_PrimReserve(this: *mut ImDrawList, idx_count: c_int, vtx_count: c_int);
pub fn ImDrawList_PrimRect(this: *mut ImDrawList, a: ImVec2, b: ImVec2, col: ImU32);
pub fn ImDrawList_PrimRectUV(
this: *mut ImDrawList,
a: ImVec2,
b: ImVec2,
uv_a: ImVec2,
uv_b: ImVec2,
col: ImU32,
);
pub fn ImDrawList_PrimQuadUV(
this: *mut ImDrawList,
a: ImVec2,
b: ImVec2,
c: ImVec2,
d: ImVec2,
uv_a: ImVec2,
uv_b: ImVec2,
uv_c: ImVec2,
uv_d: ImVec2,
col: ImU32,
);
pub fn ImDrawList_PrimWriteVtx(this: *mut ImDrawList, pos: ImVec2, uv: ImVec2, col: ImU32);
pub fn ImDrawList_PrimWriteIdx(this: *mut ImDrawList, idx: ImDrawIdx);
pub fn ImDrawList_PrimVtx(this: *mut ImDrawList, pos: ImVec2, uv: ImVec2, col: ImU32);
pub fn ImDrawList_UpdateClipRect(this: *mut ImDrawList);
pub fn ImDrawList_UpdateTextureID(this: *mut ImDrawList);
}
// ImDrawData
extern "C" {
pub fn ImDrawData_Clear(this: *mut ImDrawData);
pub fn ImDrawData_DeIndexAllBuffers(this: *mut ImDrawData);
pub fn ImDrawData_ScaleClipRects(this: *mut ImDrawData, sc: ImVec2);
}

View File

@ -444,16 +444,16 @@ pub struct DrawData<'a> {
impl<'a> DrawData<'a> {
pub fn is_valid(&self) -> bool {
self.raw.valid
self.raw.Valid
}
pub fn draw_list_count(&self) -> usize {
self.raw.cmd_lists_count as usize
self.raw.CmdListsCount as usize
}
pub fn total_vtx_count(&self) -> usize {
self.raw.total_vtx_count as usize
self.raw.TotalVtxCount as usize
}
pub fn total_idx_count(&self) -> usize {
self.raw.total_idx_count as usize
self.raw.TotalIdxCount as usize
}
pub fn deindex_all_buffers(&mut self) {
unsafe {
@ -473,8 +473,12 @@ impl<'a> IntoIterator for &'a DrawData<'a> {
fn into_iter(self) -> Self::IntoIter {
unsafe {
let cmd_lists = slice::from_raw_parts(
self.raw.CmdLists as *const *const sys::ImDrawList,
self.raw.CmdListsCount as usize,
);
DrawListIterator {
iter: self.raw.cmd_lists().iter(),
iter: cmd_lists.iter(),
}
}
}
@ -489,10 +493,16 @@ impl<'a> Iterator for DrawListIterator<'a> {
fn next(&mut self) -> Option<Self::Item> {
self.iter.next().map(|&ptr| unsafe {
let cmd_buffer =
slice::from_raw_parts((*ptr).CmdBuffer.Data, (*ptr).CmdBuffer.Size as usize);
let idx_buffer =
slice::from_raw_parts((*ptr).IdxBuffer.Data, (*ptr).IdxBuffer.Size as usize);
let vtx_buffer =
slice::from_raw_parts((*ptr).VtxBuffer.Data, (*ptr).VtxBuffer.Size as usize);
DrawList {
cmd_buffer: (*ptr).cmd_buffer.as_slice(),
idx_buffer: (*ptr).idx_buffer.as_slice(),
vtx_buffer: (*ptr).vtx_buffer.as_slice(),
cmd_buffer,
idx_buffer,
vtx_buffer,
}
})
}

View File

@ -423,7 +423,7 @@ impl<'ui> Rect<'ui> {
self.p2,
self.color.into(),
self.rounding,
self.flags,
self.flags.bits(),
);
}
} else {
@ -434,7 +434,7 @@ impl<'ui> Rect<'ui> {
self.p2,
self.color.into(),
self.rounding,
self.flags,
self.flags.bits(),
self.thickness,
);
}