View difference between Paste ID: DMcYDcA1 and SNws5fgb
SHOW: | | - or go back to the newest paste.
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
using System.ComponentModel.Composition;
6
7
using SlimDX;
8
using SlimDX.Direct3D11;
9
10
using VVVV.PluginInterfaces.V2;
11
using VVVV.PluginInterfaces.V1;
12
using VVVV.Utils;
13
using VVVV.Utils.VMath;
14
using FeralTic.DX11;
15
using FeralTic.DX11.Resources;
16
17
using Microsoft.Kinect;
18
19
namespace VVVV.DX11.Nodes.MSKinect
20
{
21
    [PluginInfo(Name = "RGBDepth",
22
                Category = "Kinect",
23
                Version = "Microsoft",
24-
                Author = "vux",
24+
                Author = "tmp",
25
                Tags = "DX11, texture",
26-
                Help = "Returns a static G32R32F formatted texture whose pixels represent a UV map mapping pixels from depth to color space.")]
26+
                Help = "Returns a G32R32F formatted texture whose pixels represent a UV map mapping pixels from depth to color space. Enable Relative Lookup to use it as displacement texture.")]
27
    public unsafe class KinectColorDepthTextureNode : KinectBaseTextureNode
28
    {
29
        private DepthImagePixel[] depthpixels;
30
        private ColorImagePoint[] colpoints;
31
        private float[] colorimage;
32
        private DepthImageFormat currentformat = DepthImageFormat.Resolution320x240Fps30;
33
        private int width;
34
        private int height;
35
36
        [Input("Relative Lookup", IsSingle = true, IsToggle = true, DefaultBoolean = false)]
37
        protected Pin<bool> FRelativeLookup;
38
39
        public KinectColorDepthTextureNode()
40
        {
41
            this.RebuildBuffer(DepthImageFormat.Resolution320x240Fps30, true);
42
        }
43
44
        private void RebuildBuffer(DepthImageFormat format, bool force)
45
        {
46
            if (format != this.currentformat || force)
47
            {
48
49
                this.Resized = true;
50
                this.currentformat = format;
51
                if (this.currentformat == DepthImageFormat.Resolution320x240Fps30)
52
                {
53
                    this.colpoints = new ColorImagePoint[320 * 240];
54
                    this.colorimage = new float[320 * 240 * 2];
55
                    this.depthpixels = new DepthImagePixel[320 * 240];
56
                    this.width = 320;
57
                    this.height = 240;
58
                }
59
                else if (this.currentformat == DepthImageFormat.Resolution640x480Fps30)
60
                {
61
                    this.colpoints = new ColorImagePoint[640 * 480];
62
                    this.colorimage = new float[640 * 480 * 2];
63
                    this.depthpixels = new DepthImagePixel[640 * 480];
64
                    this.width = 640;
65
                    this.height = 480;
66
                }
67
            }
68
69
        }
70
71
        private void AllFrameReady(object sender, AllFramesReadyEventArgs e)
72
        {
73
            DepthImageFrame frame = e.OpenDepthImageFrame();
74
75
            if (frame != null)
76
            {
77
                if (frame.FrameNumber != this.frameindex)
78
                {
79
                    this.FInvalidate = true;
80
                    this.RebuildBuffer(frame.Format, false);
81
82
                    this.frameindex = frame.FrameNumber;
83
                    frame.CopyDepthImagePixelDataTo(this.depthpixels);
84
85
                    lock (m_lock)
86
                    {
87
                        this.runtime.Runtime.CoordinateMapper.MapDepthFrameToColorFrame(frame.Format, this.depthpixels, ColorImageFormat.RgbResolution640x480Fps30, this.colpoints);
88
                    }
89
                    frame.Dispose();
90
                }
91
            }
92
        }
93
94
        protected override int Width
95
        {
96
            get { return this.width; }
97
        }
98
99
        protected override int Height
100
        {
101
            get { return this.height; }
102
        }
103
104
        protected override SlimDX.DXGI.Format Format
105
        {
106
            get { return SlimDX.DXGI.Format.R32G32_Float;}
107
        }
108
109
        protected override void CopyData(DX11DynamicTexture2D texture)
110
        {
111
            
112
            lock (m_lock)
113
            {
114
                for (int i = 0; i < this.colpoints.Length; i++)
115
                {
116
                    if (FRelativeLookup[0])
117
                    {
118
                        this.colorimage[i * 2] = (float)VMath.Map(colpoints[i].X - i % 640, 0, 640, 0, 1, TMapMode.Float);
119
                        this.colorimage[i * 2 + 1] = (float)VMath.Map(colpoints[i].Y - VMath.Abs(i / 640), 0, 480, 0, 1, TMapMode.Float);
120
                    }
121
                    else
122
                    {
123
                        this.colorimage[i * 2] = (float)VMath.Map(colpoints[i].X, 0, 640, 0, 1, TMapMode.Clamp);
124
                        this.colorimage[i * 2 + 1] = (float)VMath.Map(colpoints[i].Y, 0, 480, 0, 1, TMapMode.Clamp);
125
                    }
126
                }
127
128
                fixed (float* f = &this.colorimage[0])
129
                {
130
                    IntPtr ptr = new IntPtr(f);
131
                    texture.WriteData(ptr, this.width * this.height * 8);
132
                }
133
            }
134
        }
135
136
        protected override void OnRuntimeConnected()
137
        {
138
            this.runtime.AllFrameReady += AllFrameReady;
139
        }
140
141
        protected override void OnRuntimeDisconnected()
142
        {
143
            this.runtime.AllFrameReady -= AllFrameReady;
144
        }
145
    }
146
}