Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2008 VMware, Inc.
  4.  * All Rights Reserved.
  5.  * Copyright 2008 VMware, Inc.  All rights reserved.
  6.  * Copyright 2009 Marek Olšák <maraeo@gmail.com>
  7.  *
  8.  * Permission is hereby granted, free of charge, to any person obtaining a
  9.  * copy of this software and associated documentation files (the
  10.  * "Software"), to deal in the Software without restriction, including
  11.  * without limitation the rights to use, copy, modify, merge, publish,
  12.  * distribute, sub license, and/or sell copies of the Software, and to
  13.  * permit persons to whom the Software is furnished to do so, subject to
  14.  * the following conditions:
  15.  *
  16.  * The above copyright notice and this permission notice (including the
  17.  * next paragraph) shall be included in all copies or substantial portions
  18.  * of the Software.
  19.  *
  20.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  21.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  23.  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
  24.  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  25.  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  26.  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  27.  *
  28.  **************************************************************************/
  29.  
  30. /**
  31.  * @file
  32.  * Texture mapping utility functions.
  33.  *
  34.  * @author Brian Paul
  35.  *         Marek Olšák
  36.  */
  37.  
  38. #include "pipe/p_defines.h"
  39.  
  40. #include "util/u_debug.h"
  41. #include "util/u_texture.h"
  42.  
  43. void util_map_texcoords2d_onto_cubemap(unsigned face,
  44.                                        const float *in_st, unsigned in_stride,
  45.                                        float *out_str, unsigned out_stride,
  46.                                        boolean allow_scale)
  47. {
  48.    int i;
  49.    float rx, ry, rz;
  50.  
  51.    /* loop over quad verts */
  52.    for (i = 0; i < 4; i++) {
  53.       /* Compute sc = +/-scale and tc = +/-scale.
  54.        * Not +/-1 to avoid cube face selection ambiguity near the edges,
  55.        * though that can still sometimes happen with this scale factor...
  56.        *
  57.        * XXX: Yep, there is no safe scale factor that will prevent sampling
  58.        * the neighbouring face when stretching out.  A more reliable solution
  59.        * would be to clamp (sc, tc) against +/- 1.0-1.0/mipsize, in the shader.
  60.        *
  61.        * Also, this is not necessary when minifying, or 1:1 blits.
  62.        */
  63.       const float scale = allow_scale ? 0.9999f : 1.0f;
  64.       const float sc = (2 * in_st[0] - 1) * scale;
  65.       const float tc = (2 * in_st[1] - 1) * scale;
  66.  
  67.       switch (face) {
  68.          case PIPE_TEX_FACE_POS_X:
  69.             rx = 1;
  70.             ry = -tc;
  71.             rz = -sc;
  72.             break;
  73.          case PIPE_TEX_FACE_NEG_X:
  74.             rx = -1;
  75.             ry = -tc;
  76.             rz = sc;
  77.             break;
  78.          case PIPE_TEX_FACE_POS_Y:
  79.             rx = sc;
  80.             ry = 1;
  81.             rz = tc;
  82.             break;
  83.          case PIPE_TEX_FACE_NEG_Y:
  84.             rx = sc;
  85.             ry = -1;
  86.             rz = -tc;
  87.             break;
  88.          case PIPE_TEX_FACE_POS_Z:
  89.             rx = sc;
  90.             ry = -tc;
  91.             rz = 1;
  92.             break;
  93.          case PIPE_TEX_FACE_NEG_Z:
  94.             rx = -sc;
  95.             ry = -tc;
  96.             rz = -1;
  97.             break;
  98.          default:
  99.             rx = ry = rz = 0;
  100.             assert(0);
  101.       }
  102.  
  103.       out_str[0] = rx; /*s*/
  104.       out_str[1] = ry; /*t*/
  105.       out_str[2] = rz; /*r*/
  106.  
  107.       in_st += in_stride;
  108.       out_str += out_stride;
  109.    }
  110. }
  111.