@@ -5,21 +5,31 @@ open Aardvark.Data
5
5
open System
6
6
open System.Collections .Immutable
7
7
open System.Collections .Generic
8
- open System.Diagnostics
9
8
10
9
#nowarn " 44"
11
10
12
11
type ILayer =
12
+
13
13
abstract member Def : Durable.Def
14
+
14
15
abstract member Mapping : DataMapping
16
+
15
17
/// Returns this layer with new window w (Some), or None if new window is not inside the current layer window.
16
18
abstract member WithWindow : Box2l -> ILayer option
19
+
17
20
abstract member MapSingleCenteredSampleTo : Cell2d -> ILayer
21
+
18
22
abstract member WithSemantic : Durable.Def -> ILayer
23
+
19
24
abstract member Materialize : unit -> ILayer
25
+
20
26
abstract member ToDurableMap : unit -> seq < KeyValuePair < Durable.Def , obj >>
27
+
21
28
abstract member Mask : byte [] option
22
29
30
+ /// Resamples this layer to specified sample exponent.
31
+ abstract member Resample : int -> ILayer
32
+
23
33
[<AutoOpen>]
24
34
module ILayerExtensions =
25
35
type ILayer with
@@ -77,36 +87,6 @@ type Layer<'a when 'a : equality>(def : Durable.Def, data : 'a[], mapping : Data
77
87
member this.WithSemantic ( newSemantic : Durable.Def ) =
78
88
Layer( newSemantic, data, mapping, mask) :> ILayer
79
89
80
- member this.Materialize () =
81
- if mapping.Window.Min = V2l.OO && mapping.WindowSize = mapping.BufferSize then
82
- this :> ILayer
83
- else
84
- let size = V2i( mapping.WindowSize)
85
- let newArrayLength = int mapping.Window.Area
86
- let newdata = Array.zeroCreate< 'a> newArrayLength
87
- let mutable i = 0
88
- for y = 0 to size.Y - 1 do
89
- for x = 0 to size.X - 1 do
90
- let c = Cell2d( mapping.Window.Min.X + int64 x, mapping.Window.Min.Y + int64 y, mapping.BufferOrigin.Exponent)
91
- let s = this.GetSample( Fail, c)
92
- newdata[ i] <- s
93
- i <- i + 1
94
-
95
- let newmask =
96
- match mask with
97
- | None -> None
98
- | Some mask ->
99
- let mutable i = 0
100
- let newmask = Array.zeroCreate< byte> newArrayLength
101
- for y = 0 to size.Y - 1 do
102
- for x = 0 to size.X - 1 do
103
- newmask[ i] <- mask[ mapping.GetBufferIndex( mapping.BufferOrigin.X + int64 x, mapping.BufferOrigin.Y + int64 y)]
104
- i <- i + 1
105
- Some newmask
106
-
107
- let m = DataMapping( Cell2d( mapping.Window.Min, mapping.BufferOrigin.Exponent), size)
108
- Layer< 'a>( def, newdata, m, newmask) :> ILayer
109
-
110
90
member this.ToDurableMap () = seq {
111
91
yield kvp Defs.Layer.DefId def.Id
112
92
yield kvp Defs.Layer.BufferOrigin mapping.BufferOrigin
@@ -116,6 +96,10 @@ type Layer<'a when 'a : equality>(def : Durable.Def, data : 'a[], mapping : Data
116
96
match mask with | Some x -> yield kvp Defs.Mask1b x | None -> ()
117
97
}
118
98
99
+ member this.Materialize () = this.Materialize () :> ILayer
100
+
101
+ member this.Resample ( e : int ) = this.Resample( e) :> ILayer
102
+
119
103
member this.Def with get() = def
120
104
member this.Mapping with get() = mapping
121
105
member this.Data with get() = data
@@ -165,6 +149,98 @@ type Layer<'a when 'a : equality>(def : Durable.Def, data : 'a[], mapping : Data
165
149
let s = mapping.GetSampleCell globalPos
166
150
this.GetSample( mode, s)
167
151
152
+ member this.Materialize () : Layer < 'a > =
153
+ if mapping.Window.Min = V2l.OO && mapping.WindowSize = mapping.BufferSize then
154
+ this
155
+ else
156
+ let size = V2i( mapping.WindowSize)
157
+ let newArrayLength = int mapping.Window.Area
158
+ let newdata = Array.zeroCreate< 'a> newArrayLength
159
+ let mutable i = 0
160
+ for y = 0 to size.Y - 1 do
161
+ for x = 0 to size.X - 1 do
162
+ let c = Cell2d( mapping.Window.Min.X + int64 x, mapping.Window.Min.Y + int64 y, mapping.BufferOrigin.Exponent)
163
+ let s = this.GetSample( Fail, c)
164
+ newdata[ i] <- s
165
+ i <- i + 1
166
+
167
+ let newmask =
168
+ match mask with
169
+ | None -> None
170
+ | Some mask ->
171
+ let mutable i = 0
172
+ let newmask = Array.zeroCreate< byte> newArrayLength
173
+ for y = 0 to size.Y - 1 do
174
+ for x = 0 to size.X - 1 do
175
+ newmask[ i] <- mask[ mapping.GetBufferIndex( mapping.BufferOrigin.X + int64 x, mapping.BufferOrigin.Y + int64 y)]
176
+ i <- i + 1
177
+ Some newmask
178
+
179
+ let m = DataMapping( Cell2d( mapping.Window.Min, mapping.BufferOrigin.Exponent), size)
180
+ Layer< 'a>( def, newdata, m, newmask)
181
+
182
+ member this.Resample ( targetSampleExponent : int ) =
183
+
184
+ if ( targetSampleExponent = this.SampleExponent) then
185
+ // nothing to do, this layer already has desired sample exponent
186
+ this
187
+ else
188
+ if this.SampleExponent > targetSampleExponent then
189
+
190
+ if this.Mapping.BufferOrigin.IsCenteredAtOrigin then
191
+ failwith " Resampling of layer with centered cell origin is not supported. Error 4f3d2ef0-9d9e-499d-baef-eeaa12e9ade9."
192
+
193
+ if ( this :> ILayer) .Mask.IsSome then
194
+ failwith " Resampling layer with mask is not supported. Error e29241e5-ef53-45fb-8aee-0f8116231e8f."
195
+
196
+ let mutable e = this.SampleExponent
197
+ let mutable w = this.SampleWindow
198
+
199
+ let mutable buffer = this.Materialize() .Data
200
+
201
+ invariantm ( int64 buffer.Length = this.SampleWindow.Area)
202
+ ( fun () -> sprintf " Expected materialized buffer of length %d , but found length %d ." this.SampleWindow.Area buffer.Length)
203
+ " 7b2df0b0-4feb-4907-bd1e-ed68b93b62b3"
204
+
205
+ /// xs contains size.Y rows of size.X values (row major)
206
+ let supersample ( size : V2i ) ( xs : 'a []) : 'a [] =
207
+ let rs = Array.zeroCreate ( xs.Length * 4 )
208
+ let mutable j = 0 // next index to write in rs array
209
+
210
+ // write each input row twice to output buffer with each value written twice
211
+ //
212
+ // xs: a b c ---> rs: a a b b c c
213
+ // d e f a a b b c c
214
+ // d d e e f f
215
+ // d d e e f f
216
+
217
+ let rowLength = size.X
218
+
219
+ for y = 0 to size.Y - 1 do
220
+
221
+ let yStart = y * rowLength
222
+ let writeRow y =
223
+ for i = yStart to yStart + rowLength - 1 do
224
+ rs[ j] <- xs[ i]; j <- j + 1
225
+ rs[ j] <- xs[ i]; j <- j + 1 // write i-th value twice
226
+
227
+ writeRow y
228
+ writeRow y // write y-th row twice
229
+
230
+ ()
231
+
232
+ rs
233
+
234
+ while e > targetSampleExponent do
235
+ buffer <- supersample ( V2i( w.Size)) buffer
236
+ w <- Box2l( w.Min * 2 L, w.Max * 2 L)
237
+ e <- e - 1
238
+
239
+ failwith " TODO supersample"
240
+ else
241
+ failwith " Subsampling layers not supported. Error 88e63cb7-7be7-4136-976f-d81bd12e3246."
242
+
243
+
168
244
module Layer =
169
245
170
246
let private verbose = false
@@ -259,7 +335,6 @@ module Layer =
259
335
| :? ( C4f[]) -> Layer< C4f> ( def, data :?> C4f[] , mapping, mask) :> ILayer
260
336
| _ -> failwith <| sprintf " Unknown type %A . Invariant 4e797062-04a2-445f-9725-79f66823aff8." ( data.GetType())
261
337
262
-
263
338
let BoundingBox ( layer : ILayer ) = layer.Mapping.BoundingBox
264
339
265
340
let Window ( layer : ILayer ) = layer.Mapping.Window
@@ -351,31 +426,51 @@ module Layer =
351
426
printfn " [DEBUG][Layer.mergeTyped] debugCollisionSamples.Count = %d " debugCollisionSamples.Count
352
427
printfn " [DEBUG][Layer.mergeTyped] debugCountOccupied.Count = %d / %d ... %5.2f " coundOccupiedSamples finalMask.Length ( float coundOccupiedSamples / float finalMask.Length)
353
428
429
+ let countOccupied = finalMask |> Array.filter ( fun x -> x <> 255 uy) |> Array.length
430
+ let countUndefined = finalMask |> Array.filter ( fun x -> x = 255 uy) |> Array.length
431
+ printfn " [DEBUG][Layer.mergeTyped][OCCUPANCY][e = %d ][%A ][%A ] countOccupied = %d , countUndefined = %d " e finalWindow finalWindow.Size countOccupied countUndefined
432
+
354
433
// rewrite mask (1 ... occupied, 0 ... undefined)
355
-
356
- let countOccupied = finalMask |> Array.filter ( fun x -> x <> 255 uy) |> Array.length
357
- let countUndefined = finalMask |> Array.filter ( fun x -> x = 255 uy) |> Array.length
358
- printfn " [OCCUPANCY][e = %d ][%A ][%A ] countOccupied = %d , countUndefined = %d " e finalWindow finalWindow.Size countOccupied countUndefined
359
-
360
434
for i = 0 to finalMask.Length-1 do
361
435
finalMask[ i] <- if finalMask[ i] = 255 uy then 0 uy else 1 uy
362
436
363
437
Layer( def, finalData, finalMapping, if coundOccupiedSamples > 0 then Some finalMask else None)
364
438
365
- let private flattenTyped < 'a when 'a : equality > ( undefinedValue : 'a ) ( layers : Layer < 'a >[]) : Layer < 'a > =
366
- let def = ensureSameDef layers
367
- if verbose then
368
- printfn " [Layer.flattenTyped] .... def = %s " def.Name
439
+ /// Input layers may have different resolutions (sample sizes).
440
+ /// The result layer will have the smallest sample size of all input layers.
441
+ /// Input layers will be "painted" into the result layer, potentially overdrawing previous layers.
442
+ /// The drawing order is by descending sample exponent (coarse to fine resultion).
443
+ /// Coarser input layers will be super-sampled to the result layer sample size.
444
+ /// Remaining holes (places where no input layers were "painted") are identified via the result layer's mask property.
445
+ let private flattenTyped < 'a when 'a : equality > ( verbose : bool ) ( undefinedValue : 'a ) ( layers : Layer < 'a >[]) : Layer < 'a > =
369
446
370
- failwith " TODO"
447
+ let def = ensureSameDef layers
448
+ let sampleSizeRange = new Range1i( layers |> Seq.map( fun x -> x.SampleExponent))
371
449
372
- let e = layers.[ 0 ]. SampleExponent
373
- if not ( layers |> Array.forall ( fun l -> l.SampleExponent = e)) then
374
- failwith " Cannot flatten layers with different resolutions."
450
+ // order input layers by descending sample size (from coarse to fine)
451
+ let layersOrdered = layers |> Array.sortByDescending ( fun x -> x.SampleExponent)
375
452
376
453
if verbose then
377
- printfn " [Layer.flattenTyped] .... e = %d " e
454
+ printfn " [Layer.flattenTyped] ******** BEGIN ******** %d layers; def = %s ; sampleSizeRange = %A " layers.Length def.Name sampleSizeRange
455
+
456
+ /// result sample exponent
457
+ let e = sampleSizeRange.Min
378
458
459
+
460
+ let mutable i = 0
461
+ for l in layersOrdered do
462
+
463
+ if verbose then
464
+ printfn " [Layer.flattenTyped] | layersOrdered[%d ] : e=%d origin=%A size=%A " i l.SampleExponent l.SampleWindow.Min l.SampleWindow.Size
465
+
466
+ if l.SampleExponent <> e then
467
+ let resampledLayer = ( l :> ILayer) .Resample e
468
+ failwith " TODO"
469
+
470
+ i <- i + 1
471
+
472
+ failwith " TODO"
473
+
379
474
let finalWindow = layers |> Seq.map ( fun l -> l.SampleWindow) |> Box2l
380
475
let finalOrigin = Cell2d( finalWindow.Min, e)
381
476
let finalMapping = DataMapping( finalOrigin, V2i finalWindow.Size, finalWindow)
@@ -454,15 +549,14 @@ module Layer =
454
549
455
550
Layer( def, finalData, finalMapping, if coundOccupiedSamples > 0 then Some finalMask else None)
456
551
457
-
458
552
let private toTyped < 'a when 'a : equality > ( layers : ILayer []) : Layer < 'a >[] =
459
553
layers |> Array.map ( fun x -> x :?> Layer< 'a>)
460
554
461
555
let private mergeUntyped_ < 'a when 'a : equality > ( undefinedValue : 'a ) xs : ILayer =
462
556
xs |> toTyped< 'a> |> ( mergeTyped undefinedValue) :> ILayer
463
557
464
- let private flattenUntyped_ < 'a when 'a : equality > ( undefinedValue : 'a ) xs : ILayer =
465
- xs |> toTyped< 'a> |> ( flattenTyped undefinedValue) :> ILayer
558
+ let private flattenUntyped_ < 'a when 'a : equality > verbose ( undefinedValue : 'a ) xs : ILayer =
559
+ xs |> toTyped< 'a> |> ( flattenTyped verbose undefinedValue) :> ILayer
466
560
467
561
/// Merge layers of same type (def).
468
562
let Merge ( layers : ILayer seq ) =
@@ -499,7 +593,7 @@ module Layer =
499
593
Some mergedLayers
500
594
501
595
/// Flatten layers of same type (def).
502
- let Flatten ( layers : ILayer seq ) =
596
+ let Flatten ( verbose : bool ) ( layers : ILayer seq ) =
503
597
let ls = layers |> Array.ofSeq
504
598
match ls.Length with
505
599
| 0 ->
@@ -514,20 +608,20 @@ module Layer =
514
608
if verbose then printfn " [Layer.Flatten] %d layers" n
515
609
let mergedLayers =
516
610
match ls.[ 0 ] with
517
- | :? Layer< int> -> ls |> flattenUntyped_< int> Int32.MinValue
518
- | :? Layer< int64> -> ls |> flattenUntyped_< int64> Int64.MinValue
519
- | :? Layer< float> -> ls |> flattenUntyped_< float> nan
520
- | :? Layer< float32> -> ls |> flattenUntyped_< float32> nanf
521
- | :? Layer< V2f> -> ls |> flattenUntyped_< V2f> V2f.NaN
522
- | :? Layer< V2d> -> ls |> flattenUntyped_< V2d> V2d.NaN
523
- | :? Layer< V3f> -> ls |> flattenUntyped_< V3f> V3f.NaN
524
- | :? Layer< V3d> -> ls |> flattenUntyped_< V3d> V3d.NaN
525
- | :? Layer< V4f> -> ls |> flattenUntyped_< V4f> V4f.NaN
526
- | :? Layer< V4d> -> ls |> flattenUntyped_< V4d> V4d.NaN
527
- | :? Layer< C3b> -> ls |> flattenUntyped_< C3b> ( C3b( 0 , 0 , 0 ))
528
- | :? Layer< C4b> -> ls |> flattenUntyped_< C4b> ( C4b( 0 , 0 , 0 , 0 ))
529
- | :? Layer< C3f> -> ls |> flattenUntyped_< C3f> ( C3f( 0 , 0 , 0 ))
530
- | :? Layer< C4f> -> ls |> flattenUntyped_< C4f> ( C4f( 0 , 0 , 0 , 0 ))
611
+ | :? Layer< int> -> ls |> flattenUntyped_< int> verbose Int32.MinValue
612
+ | :? Layer< int64> -> ls |> flattenUntyped_< int64> verbose Int64.MinValue
613
+ | :? Layer< float> -> ls |> flattenUntyped_< float> verbose nan
614
+ | :? Layer< float32> -> ls |> flattenUntyped_< float32> verbose nanf
615
+ | :? Layer< V2f> -> ls |> flattenUntyped_< V2f> verbose V2f.NaN
616
+ | :? Layer< V2d> -> ls |> flattenUntyped_< V2d> verbose V2d.NaN
617
+ | :? Layer< V3f> -> ls |> flattenUntyped_< V3f> verbose V3f.NaN
618
+ | :? Layer< V3d> -> ls |> flattenUntyped_< V3d> verbose V3d.NaN
619
+ | :? Layer< V4f> -> ls |> flattenUntyped_< V4f> verbose V4f.NaN
620
+ | :? Layer< V4d> -> ls |> flattenUntyped_< V4d> verbose V4d.NaN
621
+ | :? Layer< C3b> -> ls |> flattenUntyped_< C3b> verbose ( C3b( 0 , 0 , 0 ))
622
+ | :? Layer< C4b> -> ls |> flattenUntyped_< C4b> verbose ( C4b( 0 , 0 , 0 , 0 ))
623
+ | :? Layer< C3f> -> ls |> flattenUntyped_< C3f> verbose ( C3f( 0 , 0 , 0 ))
624
+ | :? Layer< C4f> -> ls |> flattenUntyped_< C4f> verbose ( C4f( 0 , 0 , 0 , 0 ))
531
625
| _ -> failwith <| sprintf " Unsupported layer type %A . Invariant 0d379726-27dd-4063-9175-8f13ac44ad83." ls.[ 0 ]
532
626
533
627
Some mergedLayers
@@ -631,7 +725,7 @@ module LayerSet =
631
725
/// Flattens multiple layer sets (different resolutions are allowed) down to a single layer set.
632
726
/// Holes (which were not covered by any source layerset) are marked by an optional mask.
633
727
/// All layer sets must have identical layers (same number, same semantics, same order).
634
- let Flatten ( layerSets : LayerSet seq ) : LayerSet =
728
+ let Flatten ( verbose : bool ) ( layerSets : LayerSet seq ) : LayerSet =
635
729
636
730
let layerSets = layerSets |> Array.ofSeq
637
731
let layersPerLayerSet = layerSets[ 0 ]. Layers.Length
@@ -642,7 +736,7 @@ module LayerSet =
642
736
indices
643
737
|> List.choose ( fun i ->
644
738
// merge the i-th layers from all layer sets
645
- layerSets |> Array.map ( fun x -> x.Layers[ i]) |> Layer.Flatten
739
+ layerSets |> Array.map ( fun x -> x.Layers[ i]) |> Layer.Flatten verbose
646
740
)
647
741
|> Array.ofList
648
742
0 commit comments