Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- vec2 CalcTexCoords()
- {
- vec2 tempTexCoords;
- switch (projector)
- {
- case PROJ_CUBE:
- {
- vec3 absVec;
- if (texEntity == TEXENT_NORMAL)
- absVec = abs(vNormal);
- else // TEXENT_POSITION
- absVec = abs(vPos);
- vec2 UV;
- // +-X
- if (absVec.x >= absVec.y && absVec.x >= absVec.z)
- {
- if (vPos.x < 0.0)
- (UV.s = vPos.z);
- else
- (UV.s = -vPos.z);
- UV.t = vPos.y;
- UV.s /= maxbox.z;
- UV.t /= maxbox.y;
- //UV.s /= absVec.x;
- //UV.t /= absVec.x;
- }
- // +-Y
- else if (absVec.y >= absVec.x && absVec.y >= absVec.z)
- {
- if (vPos.y < 0.0)
- (UV.t = vPos.z);
- else
- (UV.t = -vPos.z);
- UV.s = vPos.x;
- UV.s /= maxbox.x;
- UV.t /= maxbox.z;
- }
- // +-Z
- else
- {
- if (vPos.z < 0.0)
- (UV.s = -vPos.x);
- else
- (UV.s = vPos.x);
- UV.t = vPos.y;
- UV.s /= maxbox.x;
- UV.t /= maxbox.y;
- }
- UV = (UV + 1.f) / 2.f;
- tempTexCoords = UV;
- }
- break;
- case PROJ_SPHERE:
- {
- vec3 tpos;
- if (texEntity == TEXENT_POSITION)
- tpos = vPos - center;
- else if (texEntity == TEXENT_NORMAL)
- tpos = vNormal;
- float theta = atan(tpos.y / tpos.x);
- float Z = (tpos.z - minbox.z) / (maxbox.z - minbox.z);
- float r = length(tpos);
- float phi = acos(tpos.z / r);
- float U = theta / TWO_PI; // convert to 0-1 range
- float V = (PI - phi) / (PI);
- tempTexCoords = vec2(U, V);
- }
- break;
- case PROJ_CYLINDER:
- {
- vec3 tpos;
- if (texEntity == TEXENT_POSITION)
- tpos = vPos - center;
- else if (texEntity == TEXENT_NORMAL)
- tpos = vNormal;
- float theta = atan(tpos.y / tpos.x);
- float Z = (tpos.z - minbox.z) / (maxbox.z - minbox.z);
- float U = theta / TWO_PI; // convert to 0-1 range
- float V = Z;
- tempTexCoords = vec2(U, V);
- }
- break;
- default:
- break;
- }
- return tempTexCoords;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement