MCPcopy Create free account
hub / github.com/ErrorAtLine0/infinipaint / draw

Method draw

src/WorldGrid.cpp:245–365  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

243}
244
245void WorldGrid::draw(GridManager& gMan, SkCanvas* canvas, const DrawData& drawData) {
246 coordinatesAxisOnBounds = false;
247 coordinatesWillBeDrawn = false;
248
249 if(!visible || (bounds.has_value() && !SCollision::collide(drawData.cam.viewingAreaGenerousCollider, bounds.value())))
250 return;
251
252 if(!circlePointEffect) {
253 circlePointEffect = compile_effect_shader_init("Circle Point", circlePointShaderCode);
254 squarePointEffect = compile_effect_shader_init("Square Point", squarePointShaderCode);
255 squareLinesEffect = compile_effect_shader_init("Square Lines", squareLinesShaderCode);
256 horizontalLinesEffect = compile_effect_shader_init("Horizontal Lines", horizontalLinesShaderCode);
257 }
258
259 WorldScalar sizeDetermineSubdivisionsToRemove = (drawData.cam.c.inverseScale / size) * WorldScalar(GRID_UNIT_PIXEL_SIZE);
260
261 SkPaint linePaint;
262
263 WorldScalar divSize;
264 WorldScalar gridCoordDivSize;
265
266 float gridPointSizeDefault = 4.0f;
267
268 if(sizeDetermineSubdivisionsToRemove > WorldScalar(1)) {
269 double divLogDouble, divLogFraction;
270 divLogFraction = std::modf(static_cast<double>(FixedPoint::log(sizeDetermineSubdivisionsToRemove, WorldScalar(subdivisions == 1 ? 2 : subdivisions))), &divLogDouble);
271 uint64_t divLog = divLogDouble;
272 if(divLog >= 1 && !removeDivisionsOutwards)
273 return;
274
275 WorldScalar logMultiplier = FixedPoint::exp_int_accurate<WorldScalar>(divLog, subdivisions);
276
277 WorldScalar subDivSize = size * logMultiplier;
278 divSize = subDivSize * WorldScalar(subdivisions);
279 WorldScalar subDivWorldSize = subDivSize / drawData.cam.c.inverseScale;
280 WorldScalar divWorldSize = divSize / drawData.cam.c.inverseScale;
281
282 float floatDivWorldSize = static_cast<float>(divWorldSize);
283 float floatSubDivWorldSize = static_cast<float>(subDivWorldSize);
284
285 Vector2f closestGridPointScreenPos = get_closest_grid_point(offset, divSize, drawData);
286 Vector2f subClosestGridPointScreenPos = get_closest_grid_point(offset, subDivSize, drawData);
287
288 SkColor4f pointColor = convert_vec4<SkColor4f>(color);
289
290 float finalDivMultiplierValue = 1.0 - divLogFraction;
291 float finalDivMultiplierSqrt = std::sqrt(finalDivMultiplierValue);
292 float finalDivMultiplierSqrd = std::pow(finalDivMultiplierValue, 2);
293
294 if(!removeDivisionsOutwards)
295 pointColor.fA *= finalDivMultiplierSqrt;
296 linePaint.setShader(get_shader(gridType, {
297 .gridColor = pointColor,
298 .mainGridScale = floatDivWorldSize,
299 .mainGridClosestPoint = closestGridPointScreenPos,
300 .mainGridPointSize = gridPointSizeDefault * finalDivMultiplierSqrt,
301
302 .divGridAlphaFrac = 0.3f,

Callers

nothing calls this directly

Calls 15

collideFunction · 0.85
top_rightMethod · 0.80
bottom_leftMethod · 0.80
restoreMethod · 0.80
dir_from_spaceMethod · 0.80
fully_contains_aabbMethod · 0.80
closeMethod · 0.65
logFunction · 0.50
sqrtFunction · 0.50
powFunction · 0.50
valueMethod · 0.45
saveMethod · 0.45

Tested by

no test coverage detected