This repository was archived by the owner on Feb 25, 2025. It is now read-only.
File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -522,6 +522,25 @@ constexpr impeller::CullMode ToImpellerCullMode(int value) {
522522 return ToImpellerCullMode (static_cast <FlutterGPUCullMode>(value));
523523}
524524
525+ enum class FlutterGPUWindingOrder {
526+ kClockwise ,
527+ kCounterClockwise ,
528+ };
529+
530+ constexpr impeller::WindingOrder ToImpellerWindingOrder (
531+ FlutterGPUWindingOrder value) {
532+ switch (value) {
533+ case FlutterGPUWindingOrder::kClockwise :
534+ return impeller::WindingOrder::kClockwise ;
535+ case FlutterGPUWindingOrder::kCounterClockwise :
536+ return impeller::WindingOrder::kCounterClockwise ;
537+ }
538+ }
539+
540+ constexpr impeller::WindingOrder ToImpellerWindingOrder (int value) {
541+ return ToImpellerWindingOrder (static_cast <FlutterGPUWindingOrder>(value));
542+ }
543+
525544} // namespace gpu
526545} // namespace flutter
527546
Original file line number Diff line number Diff line change @@ -141,6 +141,11 @@ enum CullMode {
141141 backFace,
142142}
143143
144+ enum WindingOrder {
145+ clockwise,
146+ counterClockwise,
147+ }
148+
144149enum CompareFunction {
145150 /// Comparison test never passes.
146151 never,
Original file line number Diff line number Diff line change @@ -262,6 +262,10 @@ base class RenderPass extends NativeFieldWrapperClass1 {
262262 _setCullMode (cullMode.index);
263263 }
264264
265+ void setWindingOrder (WindingOrder windingOrder) {
266+ _setWindingOrder (windingOrder.index);
267+ }
268+
265269 void draw () {
266270 if (! _draw ()) {
267271 throw Exception ("Failed to append draw" );
@@ -416,6 +420,10 @@ base class RenderPass extends NativeFieldWrapperClass1 {
416420 symbol: 'InternalFlutterGpu_RenderPass_SetCullMode' )
417421 external void _setCullMode (int cullMode);
418422
423+ @Native < Void Function (Pointer <Void >, Int )> (
424+ symbol: 'InternalFlutterGpu_RenderPass_SetWindingOrder' )
425+ external void _setWindingOrder (int windingOrder);
426+
419427 @Native < Bool Function (Pointer <Void >)> (
420428 symbol: 'InternalFlutterGpu_RenderPass_Draw' )
421429 external bool _draw ();
Original file line number Diff line number Diff line change @@ -567,6 +567,15 @@ void InternalFlutterGpu_RenderPass_SetCullMode(
567567 pipeline_descriptor.SetCullMode (flutter::gpu::ToImpellerCullMode (cull_mode));
568568}
569569
570+ void InternalFlutterGpu_RenderPass_SetWindingOrder (
571+ flutter::gpu::RenderPass* wrapper,
572+ int winding_order) {
573+ impeller::PipelineDescriptor& pipeline_descriptor =
574+ wrapper->GetPipelineDescriptor ();
575+ pipeline_descriptor.SetWindingOrder (
576+ flutter::gpu::ToImpellerWindingOrder (winding_order));
577+ }
578+
570579bool InternalFlutterGpu_RenderPass_Draw (flutter::gpu::RenderPass* wrapper) {
571580 return wrapper->Draw ();
572581}
Original file line number Diff line number Diff line change @@ -251,6 +251,11 @@ extern void InternalFlutterGpu_RenderPass_SetCullMode(
251251 flutter::gpu::RenderPass* wrapper,
252252 int cull_mode);
253253
254+ FLUTTER_GPU_EXPORT
255+ extern void InternalFlutterGpu_RenderPass_SetWindingOrder (
256+ flutter::gpu::RenderPass* wrapper,
257+ int winding_order);
258+
254259FLUTTER_GPU_EXPORT
255260extern bool InternalFlutterGpu_RenderPass_Draw (
256261 flutter::gpu::RenderPass* wrapper);
Original file line number Diff line number Diff line change @@ -479,11 +479,21 @@ void main() async {
479479 state.renderPass.draw ();
480480 }
481481
482+ // Draw the green rectangle.
483+ // Defaults to clockwise winding order. So frontface culling should not
484+ // impact the green triangle.
482485 state.renderPass.setCullMode (gpu.CullMode .frontFace);
483486 drawTriangle (Colors .lime);
487+
488+ // Backface cull a red triangle.
484489 state.renderPass.setCullMode (gpu.CullMode .backFace);
485490 drawTriangle (Colors .red);
486491
492+ // Invert the winding mode and frontface cull a red rectangle.
493+ state.renderPass.setWindingOrder (gpu.WindingOrder .counterClockwise);
494+ state.renderPass.setCullMode (gpu.CullMode .frontFace);
495+ drawTriangle (Colors .red);
496+
487497 state.commandBuffer.submit ();
488498
489499 final ui.Image image = state.renderTexture.asImage ();
You can’t perform that action at this time.
0 commit comments