// Copyright 2009 Dolphin Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include #include "Common/CommonTypes.h" #include "Common/MathUtil.h" #include "Common/Matrix.h" struct InputVertexData { u8 posMtx; std::array texMtx; Common::Vec3 position; std::array normal; std::array, 2> color; std::array texCoords; }; struct OutputVertexData { // components in color channels enum { RED_C, GRN_C, BLU_C, ALP_C }; Common::Vec3 mvPosition = {}; Common::Vec4 projectedPosition = {}; Common::Vec3 screenPosition = {}; std::array normal{}; std::array, 2> color{}; std::array texCoords{}; void Lerp(float t, const OutputVertexData* a, const OutputVertexData* b) { mvPosition = MathUtil::Lerp(a->mvPosition, b->mvPosition, t); projectedPosition.x = MathUtil::Lerp(a->projectedPosition.x, b->projectedPosition.x, t); projectedPosition.y = MathUtil::Lerp(a->projectedPosition.y, b->projectedPosition.y, t); projectedPosition.z = MathUtil::Lerp(a->projectedPosition.z, b->projectedPosition.z, t); projectedPosition.w = MathUtil::Lerp(a->projectedPosition.w, b->projectedPosition.w, t); for (std::size_t i = 0; i < normal.size(); ++i) { normal[i] = MathUtil::Lerp(a->normal[i], b->normal[i], t); } for (std::size_t i = 0; i < color[0].size(); ++i) { color[0][i] = static_cast(MathUtil::Lerp(a->color[0][i], b->color[0][i], t)); color[1][i] = static_cast(MathUtil::Lerp(a->color[1][i], b->color[1][i], t)); } for (std::size_t i = 0; i < texCoords.size(); ++i) { texCoords[i] = MathUtil::Lerp(a->texCoords[i], b->texCoords[i], t); } } };