public void Evaluate(int SpreadMax) { if (this.FInput.PluginIO.IsConnected && this.FInEnabled[0]) { if (this.RenderRequest != null) { this.RenderRequest(this, this.FHost); } if (this.AssignedContext == null) { this.FOutput.Length = 0; return; } IDX11RWStructureBuffer b = this.FInput[0][this.AssignedContext]; if (b != null) { if (this.staging != null && this.staging.ElementCount != b.ElementCount) { this.staging.Dispose(); this.staging = null; } if (this.staging == null) { staging = new DX11StagingStructuredBuffer(this.AssignedContext.Device, b.ElementCount, 4); } this.AssignedContext.CurrentDeviceContext.CopyResource(b.Buffer, staging.Buffer); this.FOutput.Length = b.ElementCount; //float DataStream ds = staging.MapForRead(this.AssignedContext.CurrentDeviceContext); double* ptr1 = this.FOutput.Data; for (int i = 0; i < b.ElementCount; i++) { //float v = ds.Read<float>(); ptr1[i] = ds.Read<float>(); // Vector3 v = ds.Read<Vector3>(); // ptr1[i*3] = v.X; // ptr1[i * 3 + 1] = v.Y; // ptr1[i * 3 + 2] = v.Z; } staging.UnMap(this.AssignedContext.CurrentDeviceContext); } else { this.FOutput.Length = 0; } } else { this.FOutput.Length = 0; } }
public void Evaluate(int SpreadMax) { if (this.FInput.IsConnected && this.FInEnabled[0]) { if (this.RenderRequest != null) { this.RenderRequest(this, this.FHost); } IDX11ReadableStructureBuffer b= this.FInput[0][this.AssignedContext]; if (b != null) { int elementcount = this.FInElementCount[0]; if (elementcount == 0) { elementcount = b.ElementCount; } DX11StagingStructuredBuffer staging = new DX11StagingStructuredBuffer(this.AssignedContext.Device , elementcount, b.Stride); ResourceRegion region = new ResourceRegion(0,0,0,this.FInElementCount[0]*b.Stride,1,1); /*this.AssignedContext.CurrentDeviceContext.CopySubresourceRegion(b.Buffer, 0, staging.Buffer, 0, */ this.AssignedContext.CurrentDeviceContext.CopySubresourceRegion(b.Buffer, 0, region,staging.Buffer, 0, 0, 0, 0); /*this.AssignedContext.CurrentDeviceContext.CopyResource(b.Buffer, staging.Buffer);*/ foreach (IIOContainer sp in this.outspreads) { ISpread s = (ISpread)sp.RawIOObject; s.SliceCount = elementcount; } DataStream ds = staging.MapForRead(this.AssignedContext.CurrentDeviceContext); for (int i = 0; i < elementcount; i++) { int cnt = 0; foreach (string lay in layout) { switch (lay) { case "float": ISpread<float> spr = (ISpread<float>)this.outspreads[cnt].RawIOObject; spr[i] = ds.Read<float>(); break; case "float2": ISpread<Vector2> spr2 = (ISpread<Vector2>)this.outspreads[cnt].RawIOObject; spr2[i] = ds.Read<Vector2>(); break; case "float3": ISpread<Vector3> spr3 = (ISpread<Vector3>)this.outspreads[cnt].RawIOObject; spr3[i] = ds.Read<Vector3>(); break; case "float4": ISpread<Vector4> spr4 = (ISpread<Vector4>)this.outspreads[cnt].RawIOObject; spr4[i] = ds.Read<Vector4>(); break; case "float4x4": ISpread<Matrix> sprm = (ISpread<Matrix>)this.outspreads[cnt].RawIOObject; sprm[i] = ds.Read<Matrix>(); break; case "int": ISpread<int> spri = (ISpread<int>)this.outspreads[cnt].RawIOObject; spri[i] = ds.Read<int>(); break; case "uint": ISpread<uint> sprui = (ISpread<uint>)this.outspreads[cnt].RawIOObject; sprui[i] = ds.Read<uint>(); break; case "uint2": ISpread<Vector2> sprui2 = (ISpread<Vector2>)this.outspreads[cnt].RawIOObject; uint ui1 = ds.Read<uint>(); uint ui2 = ds.Read<uint>(); sprui2[i] = new Vector2(ui1, ui2); break; case "uint3": ISpread<Vector3> sprui3 = (ISpread<Vector3>)this.outspreads[cnt].RawIOObject; uint ui31 = ds.Read<uint>(); uint ui32 = ds.Read<uint>(); uint ui33 = ds.Read<uint>(); sprui3[i] = new Vector3(ui31, ui32, ui33); break; } cnt++; } } staging.UnMap(this.AssignedContext.CurrentDeviceContext); staging.Dispose(); } else { foreach (IIOContainer sp in this.outspreads) { ISpread s = (ISpread)sp.RawIOObject; s.SliceCount = 0; } } } else { foreach (IIOContainer sp in this.outspreads) { ISpread s = (ISpread)sp.RawIOObject; s.SliceCount = 0; } } }