# Grease Pencil / Geometry Nodes
Known Issues:
* Need to propagate attributes from layer:
* node_geo_instance_on_points.cc
* node_geo_curve_to_points.cc
* Radius has a scaled up factor
* node_geo_instance_on_points.cc
* node_geo_curve_to_points.cc
## Code Snipets
```cpp
/** Use multi-function to pipe fields. */
static void grease_pencil_radius_to_blender_unit(PointCloud &pointcloud)
{
MutableAttributeAccessor attributes = pointcloud.attributes_for_write();
AttributeWriter<float> radii = attributes.lookup_or_add_for_write<float>("radius",
ATTR_DOMAIN_POINT);
Field<float> radius_field = AttributeFieldInput::Create<float>("radius");
static auto fn = mf::build::SI1_SO<float, float>(
"Grease Pencil Radius",
[](float a) { return a / 2000.0f; },
mf::build::exec_presets::AllSpanOrSingle());
const bke::PointCloudFieldContext field_context{pointcloud};
fn::FieldEvaluator evaluator{field_context, pointcloud.totpoint};
fn::Field<float> grease_pencil_scale_field(fn::FieldOperation::Create(fn, {radius_field}));
evaluator.add_with_destination(grease_pencil_scale_field, radii.varray);
evaluator.evaluate();
radii.finish();
}
```
```cpp
/** Using span and parallel loop for simpler code. */
static void grease_pencil_radius_to_blender_unit(PointCloud &pointcloud)
bke::SpanAttributeWriter<float> point_radii =
attributes.lookup_or_add_for_write_only_span<float>("radius", ATTR_DOMAIN_POINT);
threading::parallel_for(point_radii.span.index_range(), 1024, [&](const IndexRange range) {
for (const int i : range) {
point_radii.span[i] /= 2000.0;
}
});
point_radii.finish();
}
```
```cpp
fn::make_constant_field<bool>(true);
```
[doodle jump](https://doodle-jump2.github.io/) is also special in that you can choose to attack or avoid monsters. The freedom to decide the direction and gameplay helps players feel like they are in control of the journey, creating its own appeal.