mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 18:18:12 +00:00
LibGL+LibSoftGPU: Support generation of multiple texture coordinates
This commit is contained in:
parent
bc17a87450
commit
12f63df329
4 changed files with 101 additions and 93 deletions
|
@ -612,16 +612,16 @@ DeviceInfo Device::info() const
|
|||
|
||||
static void generate_texture_coordinates(Vertex& vertex, RasterizerOptions const& options)
|
||||
{
|
||||
auto generate_coordinate = [&](size_t config_index) -> float {
|
||||
auto mode = options.texcoord_generation_config[config_index].mode;
|
||||
auto generate_coordinate = [&](size_t texcoord_index, size_t config_index) -> float {
|
||||
auto mode = options.texcoord_generation_config[texcoord_index][config_index].mode;
|
||||
|
||||
switch (mode) {
|
||||
case TexCoordGenerationMode::ObjectLinear: {
|
||||
auto coefficients = options.texcoord_generation_config[config_index].coefficients;
|
||||
auto coefficients = options.texcoord_generation_config[texcoord_index][config_index].coefficients;
|
||||
return coefficients.dot(vertex.position);
|
||||
}
|
||||
case TexCoordGenerationMode::EyeLinear: {
|
||||
auto coefficients = options.texcoord_generation_config[config_index].coefficients;
|
||||
auto coefficients = options.texcoord_generation_config[texcoord_index][config_index].coefficients;
|
||||
return coefficients.dot(vertex.eye_coordinates);
|
||||
}
|
||||
case TexCoordGenerationMode::SphereMap: {
|
||||
|
@ -667,13 +667,16 @@ static void generate_texture_coordinates(Vertex& vertex, RasterizerOptions const
|
|||
}
|
||||
};
|
||||
|
||||
auto const enabled_coords = options.texcoord_generation_enabled_coordinates;
|
||||
vertex.tex_coords[0] = {
|
||||
((enabled_coords & TexCoordGenerationCoordinate::S) > 0) ? generate_coordinate(0) : vertex.tex_coords[0].x(),
|
||||
((enabled_coords & TexCoordGenerationCoordinate::T) > 0) ? generate_coordinate(1) : vertex.tex_coords[0].y(),
|
||||
((enabled_coords & TexCoordGenerationCoordinate::R) > 0) ? generate_coordinate(2) : vertex.tex_coords[0].z(),
|
||||
((enabled_coords & TexCoordGenerationCoordinate::Q) > 0) ? generate_coordinate(3) : vertex.tex_coords[0].w(),
|
||||
};
|
||||
for (size_t i = 0; i < vertex.tex_coords.size(); ++i) {
|
||||
auto& tex_coord = vertex.tex_coords[i];
|
||||
auto const enabled_coords = options.texcoord_generation_enabled_coordinates[i];
|
||||
tex_coord = {
|
||||
((enabled_coords & TexCoordGenerationCoordinate::S) > 0) ? generate_coordinate(i, 0) : tex_coord.x(),
|
||||
((enabled_coords & TexCoordGenerationCoordinate::T) > 0) ? generate_coordinate(i, 1) : tex_coord.y(),
|
||||
((enabled_coords & TexCoordGenerationCoordinate::R) > 0) ? generate_coordinate(i, 2) : tex_coord.z(),
|
||||
((enabled_coords & TexCoordGenerationCoordinate::Q) > 0) ? generate_coordinate(i, 3) : tex_coord.w(),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
void Device::draw_primitives(PrimitiveType primitive_type, FloatMatrix4x4 const& model_view_transform, FloatMatrix3x3 const& normal_transform,
|
||||
|
@ -952,6 +955,15 @@ void Device::draw_primitives(PrimitiveType primitive_type, FloatMatrix4x4 const&
|
|||
}
|
||||
}
|
||||
|
||||
// Generate texture coordinates if at least one coordinate is enabled
|
||||
bool texture_coordinate_generation_enabled = false;
|
||||
for (auto const coordinates_enabled : m_options.texcoord_generation_enabled_coordinates) {
|
||||
if (coordinates_enabled != TexCoordGenerationCoordinate::None) {
|
||||
texture_coordinate_generation_enabled = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (auto& triangle : m_processed_triangles) {
|
||||
// Let's calculate the (signed) area of the triangle
|
||||
// https://cp-algorithms.com/geometry/oriented-triangle-area.html
|
||||
|
@ -987,8 +999,7 @@ void Device::draw_primitives(PrimitiveType primitive_type, FloatMatrix4x4 const&
|
|||
triangle.vertices[2].normal.normalize();
|
||||
}
|
||||
|
||||
// Generate texture coordinates if at least one coordinate is enabled
|
||||
if (m_options.texcoord_generation_enabled_coordinates != TexCoordGenerationCoordinate::None) {
|
||||
if (texture_coordinate_generation_enabled) {
|
||||
generate_texture_coordinates(triangle.vertices[0], m_options);
|
||||
generate_texture_coordinates(triangle.vertices[1], m_options);
|
||||
generate_texture_coordinates(triangle.vertices[2], m_options);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue