//---------------------------------------------------- MIntArray edgeFaceData::getNewVtxUVs(int newVtx) const //---------------------------------------------------- { //gibt nur die UVs zurück, die zu neuem Vtx passen //zuerst suchen in newVtxArray MIntArray UVs(numUVSets, -1); //in diesem Fall sind definitiv keine UVs vorhanden if(numUVSets == 0 || (numUVSets == 1 && UVRelOffsets[0] == false)) return UVs; UINT l = vtxChange.length(); UINT r = 0; for(int i = 1; i < l; i+=2) { if(vtxChange[i] == newVtx) { int l2 = --i*numUVSets + numUVSets*2; for(i = i*numUVSets+1; i < l2; i+=2) { UVs[r++] = UVChange[i]; } return UVs; } } //forbidden Path return UVs; }
int Sphere::testRay(const sf::Vector3f& origin, const sf::Vector3f& direction, sf::Vector3f& hitPosition, sf::Vector2f& UVCoordinates) { float factor = -dot((origin-transform.position), direction); sf::Vector3f x = origin + factor * direction; float distance = sqrt((transform.scale.x/2 * transform.scale.x/2) - squaredLength(x-transform.position)); if(factor > distance) { hitPosition = origin + (factor - distance) * direction; sf::Vector2f UVs(0.0f, 0.0f); if(material.texture) { sf::Vector3f yAxis(0.0f, 1.0f, 0.0f); sf::Vector3f zAxis(0.0f, 0.0f, -1.0f); sf::Vector3f normal = getNormal(hitPosition); float phi = acos( -dot( yAxis, normal )); UVs.y = phi / 3.14f; float theta = (acos( dot( normal, zAxis) / sin( phi ))) / ( 2 * 3.14f); if ( dot(cross( yAxis, zAxis), normal ) > 0 ) { UVs.x = theta; } else { UVs.x = 1 - theta; } } UVCoordinates = UVs; return 1; } else if(factor + distance > 0) { hitPosition = origin + (factor + distance) * direction; return -1; } else { return 0; } }
//---------------------------------------------------- MIntArray edgeFaceData::getEdgeVtxUVs(int thisVtx) const //---------------------------------------------------- { //UVArray muss immer numUVSets einträge haben MIntArray UVs(numUVSets, -1); //in diesem Fall sind definitiv keine UVs vorhanden if(numUVSets == 0 || (numUVSets == 1 && UVRelOffsets[0] == false)) return UVs; UINT l = faceVertices.length(); for(UINT i = 0; i < l; i++) { if(faceVertices[i] == thisVtx) { //jetzt durch die UVs parsen und UVArray schreiben UINT r = 0; for(UINT a = 0; a < numUVSets; a++) { if( UVRelOffsets[a] ) { UVs[r] = UVIndices[UVAbsOffsets[a] + i]; } r++; } return UVs; } } //forbidden Path return UVs; //dann eben -1 ausgeben, damit der aufrufer was zum vergleichen hat }
//----------------------------------------------------------- //----------------------------------------------------------- void SpriteComponent::SetUVs(f32 in_u, f32 in_v, f32 in_s, f32 in_t) { m_uvs = UVs(in_u, in_v, in_s, in_t); UpdateVertexUVs(m_uvs); }
//----------------------------------------------------------- //----------------------------------------------------------- void SpriteComponent::SetUVs(f32 in_u, f32 in_v, f32 in_s, f32 in_t) { m_uvs = UVs(in_u, in_v, in_s, in_t); }