source: SHVCSoftware/branches/SHM-dev/source/Lib/TLibCommon/TCom3DAsymLUT.cpp @ 873

Last change on this file since 873 was 852, checked in by qualcomm, 10 years ago

Bug fix for R0164

File size: 15.4 KB
Line 
1#include <cstdio>
2#include <cstdlib>
3#include <cstring>
4#include <cmath>
5#include <algorithm>
6
7#include "TypeDef.h"
8#include "TCom3DAsymLUT.h"
9#include "TComPicYuv.h"
10
11#if Q0048_CGS_3D_ASYMLUT
12
13const Int TCom3DAsymLUT::m_nVertexIdxOffset[4][3] = { { 0 , 0 , 0 } , { 0 , 1 , 0 } , { 0 , 1 , 1 } , { 1 , 1 , 1 } };
14
15TCom3DAsymLUT::TCom3DAsymLUT()
16{
17  m_pCuboid = NULL;
18  m_nResQuanBit = 0;
19#if R0164_CGS_LUT_BUGFIX_CHECK
20  m_pCuboidExplicit = NULL;
21  m_pCuboidFilled = NULL;
22#endif
23}
24
25TCom3DAsymLUT::~TCom3DAsymLUT()
26{
27  destroy();
28}
29
30Void TCom3DAsymLUT::create( Int nMaxOctantDepth , Int nInputBitDepth , Int nInputBitDepthC , Int nOutputBitDepth , Int nOutputBitDepthC , Int nMaxYPartNumLog2
31#if R0151_CGS_3D_ASYMLUT_IMPROVE
32  , Int nAdaptCThresholdU , Int nAdaptCThresholdV
33#endif
34  )
35{
36  m_nMaxOctantDepth = nMaxOctantDepth;
37  m_nInputBitDepthY = nInputBitDepth;
38  m_nOutputBitDepthY = nOutputBitDepth;
39  m_nInputBitDepthC = nInputBitDepthC;
40  m_nOutputBitDepthC = nOutputBitDepthC;
41  m_nDeltaBitDepthC = m_nOutputBitDepthC - m_nInputBitDepthC;
42  m_nDeltaBitDepth = m_nOutputBitDepthY - m_nInputBitDepthY;
43  m_nMaxYPartNumLog2 = nMaxYPartNumLog2;
44  m_nMaxPartNumLog2 = 3 * m_nMaxOctantDepth + m_nMaxYPartNumLog2;
45
46  xUpdatePartitioning( nMaxOctantDepth , nMaxYPartNumLog2
47#if R0151_CGS_3D_ASYMLUT_IMPROVE
48    , nAdaptCThresholdU , nAdaptCThresholdV
49#endif
50    );
51
52  m_nYSize = 1 << ( m_nMaxOctantDepth + m_nMaxYPartNumLog2 );
53  m_nUSize = 1 << m_nMaxOctantDepth;
54  m_nVSize = 1 << m_nMaxOctantDepth;
55  assert( m_nYSize > 0 && m_nUSize > 0 && m_nVSize > 0 );
56
57  if( m_pCuboid != NULL )
58  {
59    destroy();
60  }
61  xAllocate3DArray( m_pCuboid , m_nYSize , m_nUSize , m_nVSize );
62
63#if R0164_CGS_LUT_BUGFIX_CHECK
64  xAllocate3DArray( m_pCuboidExplicit , m_nYSize , m_nUSize , m_nVSize );
65  xAllocate3DArray( m_pCuboidFilled   , m_nYSize , m_nUSize , m_nVSize );
66#endif
67}
68
69Void TCom3DAsymLUT::destroy()
70{
71  xFree3DArray( m_pCuboid );
72#if R0164_CGS_LUT_BUGFIX_CHECK
73  xFree3DArray( m_pCuboidExplicit );
74  xFree3DArray( m_pCuboidFilled   );
75#endif
76}
77
78Void TCom3DAsymLUT::xUpdatePartitioning( Int nCurOctantDepth , Int nCurYPartNumLog2
79#if R0151_CGS_3D_ASYMLUT_IMPROVE
80  , Int nAdaptCThresholdU , Int nAdaptCThresholdV
81#endif
82  )
83{
84  assert( nCurOctantDepth <= m_nMaxOctantDepth );
85#if R0179_CGS_SIZE_8x1x1
86  assert( nCurYPartNumLog2 + nCurOctantDepth <= m_nMaxYPartNumLog2 + m_nMaxOctantDepth );
87#else
88  assert( nCurYPartNumLog2 <= m_nMaxYPartNumLog2 );
89#endif
90
91  m_nCurOctantDepth = nCurOctantDepth;
92  m_nCurYPartNumLog2 = nCurYPartNumLog2;
93  m_nYShift2Idx = m_nInputBitDepthY - m_nCurOctantDepth - m_nCurYPartNumLog2;
94  m_nUShift2Idx = m_nVShift2Idx = m_nInputBitDepthC - m_nCurOctantDepth;
95#if R0151_CGS_3D_ASYMLUT_IMPROVE
96  m_nMappingShift = 10 + m_nInputBitDepthY - m_nOutputBitDepthY; 
97  m_nAdaptCThresholdU = nAdaptCThresholdU;
98  m_nAdaptCThresholdV = nAdaptCThresholdV;
99#else
100  m_nMappingShift = m_nYShift2Idx + m_nUShift2Idx;
101#endif
102  m_nMappingOffset = 1 << ( m_nMappingShift - 1 );
103}
104
105Void TCom3DAsymLUT::colorMapping( TComPicYuv * pcPic, TComPicYuv * pcPicDst )
106{
107  Int nWidth = pcPic->getWidth();
108  Int nHeight = pcPic->getHeight();
109  Int nStrideY = pcPic->getStride();
110  Int nStrideC = pcPic->getCStride();
111  Pel * pY = pcPic->getLumaAddr();
112  Pel * pU = pcPic->getCbAddr();
113  Pel * pV = pcPic->getCrAddr();
114
115  Int nDstStrideY = pcPicDst->getStride();
116  Int nDstStrideC = pcPicDst->getCStride();
117  Pel * pYDst = pcPicDst->getLumaAddr();
118  Pel * pUDst = pcPicDst->getCbAddr();
119  Pel * pVDst = pcPicDst->getCrAddr();
120
121  Pel *pUPrev = pU;
122  Pel *pVPrev = pV;
123  Pel *pUNext = pU+nStrideC;
124  Pel *pVNext = pV+nStrideC;
125
126  // alignment padding
127  pcPic->setBorderExtension( false );
128  pcPic->extendPicBorder();
129
130  Pel iMaxValY = (1<<getOutputBitDepthY())-1;
131  Pel iMaxValC = (1<<getOutputBitDepthC())-1;
132  for( Int y = 0 ; y < nHeight ; y += 2 )
133  {
134    for( Int xY = 0 , xC = 0 ; xY < nWidth ; xY += 2 , xC++ )
135    {
136      Pel srcY00 = pY[xY];
137      Pel srcY01 = pY[xY+1];
138      Pel srcY10 = pY[xY+nStrideY];
139      Pel srcY11 = pY[xY+nStrideY+1];
140      Pel srcYaver;
141      Pel srcU = pU[xC];
142      Pel srcV = pV[xC];
143      Pel dstY00, dstY01, dstY10, dstY11;
144
145      // alignment
146      srcYaver =  (srcY00 + srcY10 + 1 ) >> 1;
147      Pel srcUP0 = pUPrev[xC];
148      Pel srcVP0 = pVPrev[xC];       
149      Pel tmpU =  (srcUP0 + srcU + (srcU<<1) + 2 ) >> 2;
150      Pel tmpV =  (srcVP0 + srcV + (srcV<<1) + 2 ) >> 2;
151      dstY00 = xMapY( srcY00 , tmpU , tmpV );
152      Pel a = pU[xC+1] + srcU;
153      tmpU =  ((a<<1) + a + srcUP0 + pUPrev[xC+1] + 4 ) >> 3;
154      Pel b = pV[xC+1] + srcV;
155      tmpV =  ((b<<1) + b + srcVP0 + pVPrev[xC+1] + 4 ) >> 3;
156      dstY01 = xMapY( srcY01 , tmpU , tmpV );
157
158      srcUP0 = pUNext[xC];
159      srcVP0 = pVNext[xC];
160      tmpU =  (srcUP0 + srcU + (srcU<<1) + 2 ) >> 2;
161      tmpV =  (srcVP0 + srcV + (srcV<<1) + 2 ) >> 2;
162      dstY10 = xMapY( srcY10 , tmpU , tmpV );
163      tmpU =  ((a<<1) + a + srcUP0 + pUNext[xC+1] + 4 ) >> 3;
164      tmpV =  ((b<<1) + b + srcVP0 + pVNext[xC+1] + 4 ) >> 3;
165      dstY11 = xMapY( srcY11 , tmpU , tmpV );
166
167      SYUVP dstUV = xMapUV( srcYaver , srcU , srcV );
168      pYDst[xY] = Clip3((Pel)0, iMaxValY, dstY00 );
169      pYDst[xY+1] = Clip3((Pel)0, iMaxValY, dstY01 );
170      pYDst[xY+nDstStrideY] = Clip3((Pel)0, iMaxValY, dstY10 );
171      pYDst[xY+nDstStrideY+1] = Clip3((Pel)0, iMaxValY, dstY11 );
172      pUDst[xC] = Clip3((Pel)0, iMaxValC, dstUV.U );
173      pVDst[xC] = Clip3((Pel)0, iMaxValC, dstUV.V );
174    }
175    pY += nStrideY + nStrideY;
176
177    // alignment
178    pUPrev = pU;
179    pVPrev = pV;
180    pU = pUNext;
181    pV = pVNext;
182    pUNext += nStrideC;
183    pVNext += nStrideC;
184
185    pYDst += nDstStrideY + nDstStrideY;
186    pUDst += nDstStrideC;
187    pVDst += nDstStrideC;
188  }
189}
190
191SYUVP TCom3DAsymLUT::xGetCuboidVertexPredA( Int yIdx , Int uIdx , Int vIdx , Int nVertexIdx )
192{
193  assert( nVertexIdx < 4 );
194 
195  SYUVP sPred;
196#if R0151_CGS_3D_ASYMLUT_IMPROVE
197  sPred.Y = sPred.U = sPred.V = 0;
198  if( nVertexIdx == 0 )
199    sPred.Y = xGetNormCoeffOne() << ( m_nOutputBitDepthY - m_nInputBitDepthY );
200  else if( nVertexIdx == 1 )
201    sPred.U = xGetNormCoeffOne() << ( m_nOutputBitDepthY - m_nInputBitDepthY );
202  else if( nVertexIdx == 2 )
203    sPred.V = xGetNormCoeffOne() << ( m_nOutputBitDepthY - m_nInputBitDepthY );
204#else
205  sPred.Y = ( yIdx + m_nVertexIdxOffset[nVertexIdx][0] ) << ( m_nYShift2Idx + m_nDeltaBitDepth );
206  sPred.U = ( uIdx + m_nVertexIdxOffset[nVertexIdx][1] ) << ( m_nUShift2Idx + m_nDeltaBitDepthC );
207  sPred.V = ( vIdx + m_nVertexIdxOffset[nVertexIdx][2] ) << ( m_nVShift2Idx + m_nDeltaBitDepthC );
208#endif
209  return( sPred );
210}
211
212SYUVP  TCom3DAsymLUT::xGetCuboidVertexPredAll( Int yIdx , Int uIdx , Int vIdx , Int nVertexIdx , SCuboid *** pCurCuboid )
213{
214  SCuboid***  pCuboid = pCurCuboid ? pCurCuboid : m_pCuboid ;
215
216#if R0151_CGS_3D_ASYMLUT_IMPROVE
217  SYUVP sPred;
218  if( yIdx == 0 )
219  {
220    sPred.Y = nVertexIdx == 0 ? 1024 : 0;
221    sPred.U = nVertexIdx == 1 ? 1024 : 0;
222    sPred.V = nVertexIdx == 2 ? 1024 : 0;
223  }
224  else
225  {
226    sPred = pCuboid[yIdx-1][uIdx][vIdx].P[nVertexIdx];
227  }
228#else
229  // PredA
230  SYUVP sPredA = xGetCuboidVertexPredA( yIdx , uIdx , vIdx , nVertexIdx );
231
232  // PredB
233  SYUVP sPredB; 
234  memset( &sPredB , 0 , sizeof( sPredB ) );
235  if( yIdx > 0 )
236  {
237    SYUVP & recNeighborP = pCuboid[yIdx-1][uIdx][vIdx].P[nVertexIdx];
238    SYUVP sPredNeighbor = xGetCuboidVertexPredA( yIdx - 1 , uIdx , vIdx , nVertexIdx );
239    sPredB.Y += recNeighborP.Y - sPredNeighbor.Y ;
240    sPredB.U += recNeighborP.U - sPredNeighbor.U ;
241    sPredB.V += recNeighborP.V - sPredNeighbor.V ;
242
243    Pel min = - ( 1 << ( getOutputBitDepthY() - 2 ) );
244    Pel max =  - min;
245    sPredB.Y = Clip3( min , max , sPredB.Y );
246    min = - ( 1 << ( getOutputBitDepthC() - 2 ) );
247    max =  - min;
248    sPredB.U = Clip3( min , max , sPredB.U );
249    sPredB.V = Clip3( min , max , sPredB.V );
250  }
251
252  SYUVP sPred;
253  sPred.Y = sPredA.Y + sPredB.Y;
254  sPred.U = sPredA.U + sPredB.U;
255  sPred.V = sPredA.V + sPredB.V;
256#endif
257  return sPred ;
258}
259
260SYUVP TCom3DAsymLUT::getCuboidVertexResTree( Int yIdx , Int uIdx , Int vIdx , Int nVertexIdx )
261{
262  const SYUVP & rYUVP = m_pCuboid[yIdx][uIdx][vIdx].P[nVertexIdx];
263  SYUVP sPred = xGetCuboidVertexPredAll( yIdx , uIdx , vIdx , nVertexIdx );
264
265  SYUVP sResidue;
266  sResidue.Y = ( rYUVP.Y - sPred.Y ) >> m_nResQuanBit;
267  sResidue.U = ( rYUVP.U - sPred.U ) >> m_nResQuanBit;
268  sResidue.V = ( rYUVP.V - sPred.V ) >> m_nResQuanBit;
269  return( sResidue );
270}
271
272Void TCom3DAsymLUT::setCuboidVertexResTree( Int yIdx , Int uIdx , Int vIdx , Int nVertexIdx , Int deltaY , Int deltaU , Int deltaV )
273{
274  SYUVP & rYUVP = m_pCuboid[yIdx][uIdx][vIdx].P[nVertexIdx];
275  SYUVP sPred = xGetCuboidVertexPredAll( yIdx , uIdx , vIdx , nVertexIdx );
276
277  rYUVP.Y = sPred.Y + ( deltaY << m_nResQuanBit );
278  rYUVP.U = sPred.U + ( deltaU << m_nResQuanBit );
279  rYUVP.V = sPred.V + ( deltaV << m_nResQuanBit );
280#if R0150_CGS_SIGNAL_CONSTRAINTS
281  // LUT coefficients are less than 12-bit
282  assert( -2048 <= rYUVP.Y && rYUVP.Y <= 2047 );
283  assert( -2048 <= rYUVP.U && rYUVP.U <= 2047 );
284  assert( -2048 <= rYUVP.V && rYUVP.V <= 2047 );
285#endif
286}
287
288Pel TCom3DAsymLUT::xMapY( Pel y , Pel u , Pel v )
289{
290#if R0151_CGS_3D_ASYMLUT_IMPROVE
291  const SCuboid & rCuboid = m_pCuboid[xGetYIdx(y)][xGetUIdx(u)][xGetVIdx(v)];
292  Pel dstY = ( ( rCuboid.P[0].Y * y + rCuboid.P[1].Y * u + rCuboid.P[2].Y * v + m_nMappingOffset ) >> m_nMappingShift ) + rCuboid.P[3].Y;
293#else
294  const SCuboid & rCuboid = m_pCuboid[y>>m_nYShift2Idx][u>>m_nUShift2Idx][v>>m_nVShift2Idx];
295  Pel dstY = rCuboid.P[0].Y;
296  Int deltaY = y - ( y >> m_nYShift2Idx << m_nYShift2Idx );
297  Int deltaU = u - ( u >> m_nUShift2Idx << m_nUShift2Idx );
298  Int deltaV = v - ( v >> m_nVShift2Idx << m_nVShift2Idx );
299  dstY += ( Pel )( ( ( ( deltaY * ( rCuboid.P[3].Y - rCuboid.P[2].Y ) ) << m_nUShift2Idx ) 
300                   + ( ( deltaU * ( rCuboid.P[1].Y - rCuboid.P[0].Y ) ) << m_nYShift2Idx )
301                   + ( ( deltaV * ( rCuboid.P[2].Y - rCuboid.P[1].Y ) ) << m_nYShift2Idx ) 
302                   + m_nMappingOffset ) >> m_nMappingShift );
303#endif
304  return( dstY );
305}
306
307SYUVP TCom3DAsymLUT::xMapUV( Pel y , Pel u , Pel v )
308{
309#if R0151_CGS_3D_ASYMLUT_IMPROVE
310  const SCuboid & rCuboid = m_pCuboid[xGetYIdx(y)][xGetUIdx(u)][xGetVIdx(v)];
311  SYUVP dst;
312  dst.Y = 0;
313  dst.U = ( ( rCuboid.P[0].U * y + rCuboid.P[1].U * u + rCuboid.P[2].U * v + m_nMappingOffset ) >> m_nMappingShift ) + rCuboid.P[3].U;
314  dst.V = ( ( rCuboid.P[0].V * y + rCuboid.P[1].V * u + rCuboid.P[2].V * v + m_nMappingOffset ) >> m_nMappingShift ) + rCuboid.P[3].V;
315#else
316  const SCuboid & rCuboid = m_pCuboid[y>>m_nYShift2Idx][u>>m_nUShift2Idx][v>>m_nVShift2Idx];
317  SYUVP dst = rCuboid.P[0];
318  Int deltaY = y - ( y >> m_nYShift2Idx << m_nYShift2Idx );
319  Int deltaU = u - ( u >> m_nUShift2Idx << m_nUShift2Idx );
320  Int deltaV = v - ( v >> m_nVShift2Idx << m_nVShift2Idx );
321  dst.U += ( Pel )( ( ( ( deltaY * ( rCuboid.P[3].U - rCuboid.P[2].U ) ) << m_nUShift2Idx ) 
322                    + ( ( deltaU * ( rCuboid.P[1].U - rCuboid.P[0].U ) ) << m_nYShift2Idx )
323                    + ( ( deltaV * ( rCuboid.P[2].U - rCuboid.P[1].U ) ) << m_nYShift2Idx ) 
324                    + m_nMappingOffset ) >> m_nMappingShift );
325  dst.V += ( Pel )( ( ( ( deltaY * ( rCuboid.P[3].V - rCuboid.P[2].V ) ) << m_nUShift2Idx ) 
326                    + ( ( deltaU * ( rCuboid.P[1].V - rCuboid.P[0].V ) ) << m_nYShift2Idx )
327                    + ( ( deltaV * ( rCuboid.P[2].V - rCuboid.P[1].V ) ) << m_nYShift2Idx ) 
328                    + m_nMappingOffset ) >> m_nMappingShift );
329#endif
330  return( dst );
331}
332
333Void TCom3DAsymLUT::xSaveCuboids( SCuboid *** pSrcCuboid )
334{
335  memcpy( m_pCuboid[0][0] , pSrcCuboid[0][0] , sizeof( SCuboid ) * m_nYSize * m_nUSize * m_nVSize );
336}
337
338Void TCom3DAsymLUT::copy3DAsymLUT( TCom3DAsymLUT * pSrc )
339{
340  assert( pSrc->getMaxOctantDepth() == getMaxOctantDepth() && pSrc->getMaxYPartNumLog2() == getMaxYPartNumLog2() );
341  xUpdatePartitioning( pSrc->getCurOctantDepth() , pSrc->getCurYPartNumLog2() 
342#if R0151_CGS_3D_ASYMLUT_IMPROVE
343    , pSrc->getAdaptChromaThresholdU() , pSrc->getAdaptChromaThresholdV()
344#endif
345    );
346  setResQuantBit( pSrc->getResQuantBit() );
347  xSaveCuboids( pSrc->m_pCuboid );
348}
349
350#if R0164_CGS_LUT_BUGFIX_CHECK
351Void TCom3DAsymLUT::xInitCuboids( )
352{
353  // All vertices are initialized as non-exlicitly-encoded
354  for( Int yIdx = 0 ; yIdx < m_nYSize ; yIdx++ )
355  {
356    for( Int uIdx = 0 ; uIdx < m_nUSize ; uIdx++ )
357    {
358      for( Int vIdx = 0 ; vIdx < m_nVSize ; vIdx++ )
359      { 
360        m_pCuboidExplicit[yIdx][uIdx][vIdx] = false;
361        m_pCuboidFilled[yIdx][uIdx][vIdx]   = false;
362      }
363    }
364  }
365}
366
367Void TCom3DAsymLUT::xCuboidsFilledCheck( Int yIdx , Int uIdx , Int vIdx )
368{
369  if ( m_pCuboidFilled[yIdx][uIdx][vIdx] == false )
370  {
371    if( yIdx > 0) 
372      assert ( m_pCuboidFilled[yIdx-1][uIdx][vIdx] );
373
374    for ( Int nVertexIdx=0 ; nVertexIdx<4 ; nVertexIdx++ )
375      m_pCuboid[yIdx][uIdx][vIdx].P[nVertexIdx] = yIdx == 0 ? xGetCuboidVertexPredA( yIdx , uIdx , vIdx , nVertexIdx ): xGetCuboidVertexPredAll( yIdx , uIdx , vIdx , nVertexIdx );
376
377    m_pCuboidFilled[yIdx][uIdx][vIdx] = true ;
378  }
379}
380
381
382Void TCom3DAsymLUT::xCuboidsFilledCheck( Bool bDecode )
383{
384  Int ySize = 1 << ( getCurOctantDepth() + getCurYPartNumLog2() );
385  Int uSize = 1 << getCurOctantDepth();
386  Int vSize = 1 << getCurOctantDepth();
387  for( Int yIdx = 0 ; yIdx < ySize ; yIdx++ )
388  {
389    for( Int uIdx = 0 ; uIdx < uSize ; uIdx++ )
390    {
391      for( Int vIdx = 0 ; vIdx < vSize ; vIdx++ )
392      { 
393        if ( bDecode )
394          xCuboidsFilledCheck( yIdx , uIdx , vIdx );
395
396        assert( m_pCuboidFilled[yIdx][uIdx][vIdx] );
397      }
398    }
399  }
400
401}
402#endif
403
404#if R0150_CGS_SIGNAL_CONSTRAINTS
405Bool TCom3DAsymLUT::isRefLayer( UInt uiRefLayerId )
406{
407  Bool bIsRefLayer = false;
408  for( UInt i = 0 ; i < m_vRefLayerId.size() ; i++ )
409  {
410    if( m_vRefLayerId[i] == uiRefLayerId )
411    {
412      bIsRefLayer = true;
413      break;
414    }
415  }
416
417  return( bIsRefLayer );
418}
419#endif
420
421#if R0164_CGS_LUT_BUGFIX_CHECK
422Void  TCom3DAsymLUT::display( Bool bFilled )
423{
424  Int ySize = 1 << ( getCurOctantDepth() + getCurYPartNumLog2() );
425  Int uSize = 1 << getCurOctantDepth();
426  Int vSize = 1 << getCurOctantDepth();
427  Int vIdx=0;
428
429  printf("\n");
430  printf("3DLut Explicit flag:\n");
431  for( Int uIdx = 0 ; uIdx < uSize ; uIdx++ )
432  {
433    for( Int yIdx = 0 ; yIdx < ySize ; yIdx++ )
434    {
435      printf("%d\t", m_pCuboidExplicit[yIdx][uIdx][vIdx] );
436    }
437    printf("\n");
438  }
439
440  printf("3DLut values (explicit):\n");
441  for( Int uIdx = 0 ; uIdx < uSize ; uIdx++ )
442  {
443    for( Int yIdx = 0 ; yIdx < ySize ; yIdx++ )
444    {
445      if ( m_pCuboidExplicit[yIdx][uIdx][vIdx] )  printf("%d\t", m_pCuboid[yIdx][uIdx][vIdx].P[0].Y );
446      else                                        printf("?\t", m_pCuboid[yIdx][uIdx][vIdx].P[0].Y );
447    }
448    printf("\n");
449  }
450
451  printf("3DLut values (all):\n");
452  for( Int uIdx = 0 ; uIdx < uSize ; uIdx++ )
453  {
454    for( Int yIdx = 0 ; yIdx < ySize ; yIdx++ )
455    {
456      if ( bFilled ) {
457        if ( m_pCuboidFilled[yIdx][uIdx][vIdx] )  printf("%d\t"  , m_pCuboid[yIdx][uIdx][vIdx].P[0].Y );
458        else                                      printf("unk\t" , m_pCuboid[yIdx][uIdx][vIdx].P[0].Y );
459      }
460      else
461        printf("%d\t"  , m_pCuboid[yIdx][uIdx][vIdx].P[0].Y );
462    }
463    printf("\n");
464  }
465
466}
467#endif
468
469#endif
470
Note: See TracBrowser for help on using the repository browser.