ctx->vertCount = 0;
ctx->indCount = 0;
ctx->curIndStart = 0;
+ ctx->curVertOffset = 0;
VkRect2D scissor = {{0,0},{ctx->pSurf->width,ctx->pSurf->height}};
ctx->bounds = scissor;
while (ptrPath < ctx->pathPtr){
uint ptrCurve = 0;
- VKVG_IBO_INDEX_TYPE firstIdx = (VKVG_IBO_INDEX_TYPE)ctx->vertCount;
+ VKVG_IBO_INDEX_TYPE firstIdx = (VKVG_IBO_INDEX_TYPE)(ctx->vertCount - ctx->curVertOffset);
i = ctx->pathes[ptrPath]&PATH_ELT_MASK;
LOG(LOG_INFO_PATH, "\tPATH: start = %d; ", ctx->pathes[ptrPath]&PATH_ELT_MASK, ctx->pathes[ptrPath+1]&PATH_ELT_MASK);
_add_vertexf(ctx, cosf(a) * hw + p0.x, sinf(a) * hw + p0.y);
a+=step;
}
- uint32_t p0Idx = ctx->vertCount;
+ VKVG_IBO_INDEX_TYPE p0Idx = (VKVG_IBO_INDEX_TYPE)(ctx->vertCount - ctx->curVertOffset);
for (uint p = firstIdx; p < p0Idx; p++)
_add_triangle_indices(ctx, p0Idx+1, p, p+1);
firstIdx = p0Idx;
_add_vertex(ctx, v);
if (ctx->lineCap == VKVG_LINE_CAP_ROUND){
- firstIdx = ctx->vertCount;
+ firstIdx = (VKVG_IBO_INDEX_TYPE)(ctx->vertCount - ctx->curVertOffset);
float step = M_PIF / hw;
float a = acosf(n.x)+ M_PIF_2;
if (n.y < 0)
a-=step;
}
- uint32_t p0Idx = ctx->vertCount-1;
+ VKVG_IBO_INDEX_TYPE p0Idx = (VKVG_IBO_INDEX_TYPE)(ctx->vertCount - ctx->curVertOffset - 1);
for (uint p = firstIdx-1 ; p < p0Idx; p++)
_add_triangle_indices(ctx, p+1, p, firstIdx-2);
}
void _record_draw_cmd (VkvgContext ctx){
if (ctx->indCount == ctx->curIndStart)
return;
- LOG(LOG_INFO, "RECORD DRAW CMD: ctx = %lu; vertices = %d; indices = %d\n", (ulong)ctx, ctx->vertCount - *((uint32_t*)(ctx->indices.allocInfo.pMappedData + (ctx->curIndStart * sizeof(uint32_t)))), ctx->indCount - ctx->curIndStart);
+ LOG(LOG_INFO, "RECORD DRAW CMD: ctx = %lu; vertices = %d; indices = %d\n", (ulong)ctx, ctx->vertCount - ctx->indexCache[ctx->curIndStart], ctx->indCount - ctx->curIndStart);
_check_cmd_buff_state(ctx);
- CmdDrawIndexed(ctx->cmd, ctx->indCount - ctx->curIndStart, 1, ctx->curIndStart, 0, 1);
+ CmdDrawIndexed(ctx->cmd, ctx->indCount - ctx->curIndStart, 1, ctx->curIndStart, (int32_t)ctx->curVertOffset, 0);
#ifdef VKVG_WIRED_DEBUG
CmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelineWired);
#endif
ctx->curIndStart = ctx->indCount;
+ ctx->curVertOffset = ctx->vertCount;
}
void _clear_attachment (VkvgContext ctx) {
memcpy(ctx->vertices.allocInfo.pMappedData, ctx->vertexCache, ctx->vertCount * sizeof (Vertex));
memcpy(ctx->indices.allocInfo.pMappedData, ctx->indexCache, ctx->indCount * sizeof (VKVG_IBO_INDEX_TYPE));
- ctx->vertCount = 0;
- ctx->indCount = 0;
- ctx->curIndStart = 0;
+ ctx->vertCount = ctx->indCount = ctx->curIndStart = ctx->curVertOffset = 0;
}
void _flush_cmd_buff (VkvgContext ctx){
if (!ctx->cmdStarted)
bisec = vec2_perp(bisec);
bisec = vec2_mult(bisec,lh);
- uint32_t idx = ctx->vertCount;
+ uint32_t idx = ctx->vertCount - ctx->curVertOffset;
if (ctx->lineJoin == VKVG_LINE_JOIN_MITER || isCurve){
v.pos = vec2_add(ctx->points[i], bisec);
a+=step;
}
}
- uint32_t p0Idx = ctx->vertCount;
+ uint32_t p0Idx = ctx->vertCount - ctx->curVertOffset;
_add_triangle_indices(ctx, idx, idx+2, idx+1);
if (cross<0){
for (uint p = idx+2; p < p0Idx; p++)
uint32_t firstPtIdx = ctx->pathes[ptrPath]&PATH_ELT_MASK;
uint32_t lastPtIdx = ctx->pathes[ptrPath+1]&PATH_ELT_MASK;
uint32_t pathPointCount = lastPtIdx - firstPtIdx + 1;
- uint32_t firstVertIdx = ctx->vertCount;
+ uint32_t firstVertIdx = ctx->vertCount-ctx->curVertOffset;
ear_clip_point ecps[pathPointCount];
uint32_t ecps_count = pathPointCount;
uint32_t indCount; //current indice count
uint32_t curIndStart; //last index recorded in cmd buff
+ uint32_t curVertOffset; //vertex offset in draw indexed command
vkvg_buff vertices; //vertex buffer with persistent mapped memory
size_t sizeVertices; //reserved size
pen.y - cr->bmpDiff.y + (tr->glyph_pos[i].y_offset >> 6)};
v.pos = p0;
- uint32_t firstIdx = ctx->vertCount;
+ uint32_t firstIdx = ctx->vertCount - ctx->curVertOffset;
v.uv.x = cr->bounds.x;
v.uv.y = cr->bounds.y;
void test(){
VkvgContext ctx = vkvg_create(surf);
- vkvg_set_line_width(ctx, 2);
+ vkvg_set_line_width(ctx, 1);
vkvg_set_source_rgba(ctx,1,0,0,1);
vkvg_move_to(ctx,200.5,200.5);
vkvg_line_to(ctx,400.5,200.5);
vkvg_line_to(ctx,400.5,400.5);
vkvg_line_to(ctx,200.5,400.5);
vkvg_close_path(ctx);
- vkvg_stroke_preserve(ctx);
- vkvg_set_source_rgba(ctx,0,0.2,0.35,1);
- vkvg_fill(ctx);
- vkvg_set_source_rgba(ctx,0.5,1,0,1);
+ vkvg_stroke(ctx);
+
+ vkvg_set_source_rgba(ctx,0,1,0,1);
vkvg_move_to(ctx,300.5,300.5);
vkvg_line_to(ctx,500.5,300.5);
vkvg_line_to(ctx,500.5,500.5);
vkvg_line_to(ctx,300.5,500.5);
- vkvg_close_path(ctx);
+ vkvg_stroke(ctx);
+
+ //vkvg_set_source_rgba(ctx,0,0.2,0.35,1);
+ //vkvg_fill(ctx);
+
+ vkvg_set_source_rgba(ctx,0.5,1,0,1);
+ vkvg_move_to(ctx,320.5,320.5);
+ vkvg_line_to(ctx,520.5,320.5);
+ vkvg_line_to(ctx,520.5,520.5);
+ vkvg_line_to(ctx,320.5,520.5);
+ //vkvg_close_path(ctx);
vkvg_stroke(ctx);
vkvg_set_line_width(ctx, 40);
vkvg_set_source_rgba(ctx,0.5,0.6,1,1.0);