This commit is contained in:
Andrew Golovashevich 2025-03-28 07:35:51 +03:00
parent 6d2a0e4d04
commit 072593bb22
4 changed files with 70 additions and 92 deletions

View File

@ -4,11 +4,9 @@ import kotlinx.browser.document
import kotlinx.browser.window import kotlinx.browser.window
import org.khronos.webgl.Float32Array import org.khronos.webgl.Float32Array
import org.khronos.webgl.Int32Array import org.khronos.webgl.Int32Array
import org.khronos.webgl.WebGLRenderingContext
import org.w3c.dom.HTMLCanvasElement import org.w3c.dom.HTMLCanvasElement
import ru.landgrafhomyak.bgtu.computer_graphics1.model_builder.Matrix4x4 import ru.landgrafhomyak.bgtu.computer_graphics1.model_builder.Matrix4x4
import ru.landgrafhomyak.bgtu.computer_graphics1.model_builder.Point2F import ru.landgrafhomyak.bgtu.computer_graphics1.model_builder.Point2F
import ru.landgrafhomyak.bgtu.computer_graphics1.model_builder.Point3F
import ru.landgrafhomyak.bgtu.computer_graphics1.model_builder.Point4F import ru.landgrafhomyak.bgtu.computer_graphics1.model_builder.Point4F
fun main() { fun main() {
@ -63,7 +61,7 @@ fun main() {
gl.STATIC_DRAW gl.STATIC_DRAW
) )
val tpa = gl.getAttribLocation(shaderProgram, "texture_pos") val tpa = gl.getAttribLocation(shaderProgram, "texture_pos")
gl.vertexAttribPointer(tpa, 2, gl.FLOAT, false, 2 * 4, 0) gl.vertexAttribPointer(tpa, 2, gl.FLOAT, false, 0, 0)
gl.enableVertexAttribArray(tpa) gl.enableVertexAttribArray(tpa)
gl.bindBuffer(gl.ARRAY_BUFFER, textureTypesBuffer) gl.bindBuffer(gl.ARRAY_BUFFER, textureTypesBuffer)
@ -73,11 +71,14 @@ fun main() {
gl.STATIC_DRAW gl.STATIC_DRAW
) )
val tta = gl.getAttribLocation(shaderProgram, "texture_type") val tta = gl.getAttribLocation(shaderProgram, "texture_type")
gl.vertexAttribIPointer(tta, 2, gl.INT, false, 1 * 4, 0) gl.vertexAttribIPointer(tta, 1, gl.INT, false, 0, 0)
gl.enableVertexAttribArray(tta) gl.enableVertexAttribArray(tta)
gl.enable(gl.DEPTH_TEST) gl.enable(gl.DEPTH_TEST)
gl.enable(gl.BLEND);
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
var xAngle = 0.0f var xAngle = 0.0f
var yAngle = 0.0f var yAngle = 0.0f
var distance = 0.0f var distance = 0.0f
@ -87,13 +88,12 @@ fun main() {
val redraw = { val redraw = {
val radius = ((if (canvas.width < canvas.height) canvas.width else canvas.height) * 7f / 16f);
gl.viewport(0, 0, canvas.width, canvas.height); gl.viewport(0, 0, canvas.width, canvas.height);
gl.clearColor(0f, 0f, 0f, 1f); gl.clearColor(0f, 0f, 0f, 1f);
gl.clear(gl.COLOR_BUFFER_BIT or gl.DEPTH_BUFFER_BIT); gl.clear(gl.COLOR_BUFFER_BIT or gl.DEPTH_BUFFER_BIT);
val t = Matrix4x4.shift(0f, 0f, distance) * Matrix4x4.rotateY(yAngle) * Matrix4x4.rotateX(xAngle) val t = Matrix4x4.shift(0f, 0f, distance) * Matrix4x4.rotateY(yAngle) * Matrix4x4.rotateX(xAngle)
val po = Matrix4x4.projectionOrtho(-2f, 2f, -2f, 2f, -2f, 2f); val po = Matrix4x4.projectionOrtho(-2f, 2f, -2f, 2f, -2f, 2f);
val pc = Matrix4x4.projectionCentralInfinite(-2f, 2f, -2f, 2f, 1f) * Matrix4x4.shift(0f, 0f, -3f) * Matrix4x4.scale(3f, 3f, -1f); val pc = Matrix4x4.projectionCentralInfinite(-2f, 2f, -2f, 2f, 1f) * Matrix4x4.shift(0f, 0f, -3.3f) * Matrix4x4.scale(3f, 3f, -1f);
val s: Point2F val s: Point2F
if (canvas.width > canvas.height) { if (canvas.width > canvas.height) {
s = Point2F(canvas.height.toFloat() / canvas.width.toFloat(), 1f) s = Point2F(canvas.height.toFloat() / canvas.width.toFloat(), 1f)

View File

@ -3,12 +3,13 @@ package ru.landgrafhomyak.bgtu.computer_graphics1
import kotlin.math.PI import kotlin.math.PI
import kotlin.math.cos import kotlin.math.cos
import kotlin.math.sin import kotlin.math.sin
import kotlin.math.sqrt
import ru.landgrafhomyak.bgtu.computer_graphics1.model_builder.ModelTriangles import ru.landgrafhomyak.bgtu.computer_graphics1.model_builder.ModelTriangles
import ru.landgrafhomyak.bgtu.computer_graphics1.model_builder.Point2F import ru.landgrafhomyak.bgtu.computer_graphics1.model_builder.Point2F
import ru.landgrafhomyak.bgtu.computer_graphics1.model_builder.Polygon import ru.landgrafhomyak.bgtu.computer_graphics1.model_builder.Polygon
import ru.landgrafhomyak.bgtu.computer_graphics1.model_builder.TextureType import ru.landgrafhomyak.bgtu.computer_graphics1.model_builder.TextureType
private fun rot_n(degrees: Int, length: Int): Point2F { private fun rot_n(degrees: Int, length: Float): Point2F {
val radians = degrees.toLong().toDouble() * PI / 180; val radians = degrees.toLong().toDouble() * PI / 180;
return Point2F( return Point2F(
x = cos(radians).times(length).toFloat(), x = cos(radians).times(length).toFloat(),
@ -20,106 +21,53 @@ private fun rot_n(degrees: Int, length: Int): Point2F {
val model = ModelTriangles.fromPolygons( val model = ModelTriangles.fromPolygons(
Polygon( Polygon(
TextureType.HSV, TextureType.HSV,
Polygon.PolygonVertex(0f, 1f, 1f, rot_n(0, 1)), Polygon.PolygonVertex(0f, 1f, 1f, rot_n(0, 1f)),
Polygon.PolygonVertex(1f, 1f, 0f, rot_n(240, 1)), Polygon.PolygonVertex(-1f, 1f, 1f, rot_n(0, 2f)),
Polygon.PolygonVertex(1f, 0f, 1f, rot_n(120, 1)) Polygon.PolygonVertex(-1f, -1f, 1f, rot_n(300, 2f * sqrt(2f))),
Polygon.PolygonVertex(1f, -1f, 1f, rot_n(240, 2f)),
Polygon.PolygonVertex(1f, 0f, 1f, rot_n(240, 1f)),
), ),
Polygon( Polygon(
TextureType.HSV, TextureType.HSV,
Polygon.PolygonVertex(-1f, -1f, 1f, rot_n(60, 2)), Polygon.PolygonVertex(0f, 1f, 1f, rot_n(0, 1f)),
Polygon.PolygonVertex(-1f, 1f, 1f, rot_n(0, 2)), Polygon.PolygonVertex(-1f, 1f, 1f, rot_n(0, 2f)),
Polygon.PolygonVertex(0f, 1f, 1f, rot_n(0, 1)) Polygon.PolygonVertex(-1f, 1f, -1f, rot_n(60, 2f * sqrt(2f))),
Polygon.PolygonVertex(1f, 1f, -1f, rot_n(120, 2f)),
Polygon.PolygonVertex(1f, 1f, 0f, rot_n(120, 1f))
), ),
Polygon( Polygon(
TextureType.HSV, TextureType.HSV,
Polygon.PolygonVertex(-1f, -1f, 1f, rot_n(60, 2)), Polygon.PolygonVertex(1f, 0f, 1f, rot_n(240, 1f)),
Polygon.PolygonVertex(1f, 0f, 1f, rot_n(120, 1)), Polygon.PolygonVertex(1f, -1f, 1f, rot_n(240, 2f)),
Polygon.PolygonVertex(0f, 1f, 1f, rot_n(0, 1)) Polygon.PolygonVertex(1f, -1f, -1f, rot_n(180, 2f * sqrt(2f))),
), Polygon.PolygonVertex(1f, 1f, -1f, rot_n(120, 2f)),
Polygon.PolygonVertex(1f, 1f, 0f, rot_n(120, 1f))
Polygon(
TextureType.HSV,
Polygon.PolygonVertex(-1f, -1f, 1f, rot_n(60, 2)),
Polygon.PolygonVertex(1f, 0f, 1f, rot_n(120, 1)),
Polygon.PolygonVertex(1f, -1f, 1f, rot_n(120, 1))
), ),
Polygon( Polygon(
TextureType.HSV, TextureType.HSV,
Polygon.PolygonVertex(1f, -1f, -1f, rot_n(180, 2)), Polygon.PolygonVertex(1f, 0f, 1f, rot_n(240, 1f)),
Polygon.PolygonVertex(1f, 1f, -1f, rot_n(240, 2)), Polygon.PolygonVertex(1f, 1f, 0f, rot_n(120, 1f)),
Polygon.PolygonVertex(1f, 1f, 0f, rot_n(240, 1)) Polygon.PolygonVertex(0f, 1f, 1f, rot_n(0, 1f))
), ),
Polygon( Polygon(
TextureType.HSV, TextureType.GRADIENT_CHESS,
Polygon.PolygonVertex(1f, -1f, -1f, rot_n(180, 2)),
Polygon.PolygonVertex(1f, 0f, 1f, rot_n(120, 1)),
Polygon.PolygonVertex(1f, 1f, 0f, rot_n(240, 1))
),
Polygon(
TextureType.HSV,
Polygon.PolygonVertex(1f, -1f, -1f, rot_n(180, 2)),
Polygon.PolygonVertex(1f, 0f, 1f, rot_n(120, 1)),
Polygon.PolygonVertex(1f, -1f, 1f, rot_n(120, 2))
),
Polygon(
TextureType.HSV,
Polygon.PolygonVertex(-1f, 1f, -1f, rot_n(300, 2)),
Polygon.PolygonVertex(1f, 1f, -1f, rot_n(240, 2)),
Polygon.PolygonVertex(1f, 1f, 0f, rot_n(240, 1))
),
Polygon(
TextureType.HSV,
Polygon.PolygonVertex(-1f, 1f, -1f, rot_n(300, 2)),
Polygon.PolygonVertex(0f, 1f, 1f, rot_n(0, 1)),
Polygon.PolygonVertex(1f, 1f, 0f, rot_n(240, 1))
),
Polygon(
TextureType.HSV,
Polygon.PolygonVertex(-1f, 1f, -1f, rot_n(300, 2)),
Polygon.PolygonVertex(0f, 1f, 1f, rot_n(0, 1)),
Polygon.PolygonVertex(-1f, 1f, 1f, rot_n(0, 2))
),
Polygon(
TextureType.WHITE_TRANSPARENCY,
Polygon.PolygonVertex(-1f, -1f, 1f, 0f, 0f), Polygon.PolygonVertex(-1f, -1f, 1f, 0f, 0f),
Polygon.PolygonVertex(-1f, -1f, -1f, 0f, 1f), Polygon.PolygonVertex(-1f, -1f, -1f, 0f, 1f),
Polygon.PolygonVertex(-1f, 1f, 1f, 1f, 0f)
),
Polygon(
TextureType.WHITE_TRANSPARENCY,
Polygon.PolygonVertex(-1f, 1f, -1f, 1f, 1f), Polygon.PolygonVertex(-1f, 1f, -1f, 1f, 1f),
Polygon.PolygonVertex(-1f, -1f, -1f, 0f, 1f), Polygon.PolygonVertex(-1f, 1f, 1f, 1f, 0f),
Polygon.PolygonVertex(-1f, 1f, 1f, 1f, 0f) ),
Polygon(
TextureType.CHESS,
Polygon.PolygonVertex(1f, -1f, -1f, 0f, 1f),
Polygon.PolygonVertex(-1f, -1f, -1f, 0f, 0f),
Polygon.PolygonVertex(-1f, 1f, -1f, 1f, 0f),
Polygon.PolygonVertex(1f, 1f, -1f, 1f, 1f),
), ),
Polygon( Polygon(
TextureType.WHITE_TRANSPARENCY, TextureType.WHITE_TRANSPARENCY,
Polygon.PolygonVertex(-1f, -1f, -1f, 0f, 0f), Polygon.PolygonVertex(-1f, -1f, 1f, 0f, 1f),
Polygon.PolygonVertex(-1f, 1f, -1f, 0f, 1f), Polygon.PolygonVertex(1f, -1f, 1f, 1f, 1f),
Polygon.PolygonVertex(1f, 1f, -1f, 1f, 1f)
),
Polygon(
TextureType.WHITE_TRANSPARENCY,
Polygon.PolygonVertex(-1f, -1f, -1f, 0f, 0f),
Polygon.PolygonVertex(1f, -1f, -1f, 1f, 0f), Polygon.PolygonVertex(1f, -1f, -1f, 1f, 0f),
Polygon.PolygonVertex(1f, 1f, -1f, 1f, 1f) Polygon.PolygonVertex(-1f, -1f, -1f, 0f, 0f),
),
Polygon(
TextureType.CHESS,
Polygon.PolygonVertex(1f, -1f, 1f, 0f, 0f),
Polygon.PolygonVertex(-1f, -1f, 1f, 0f, 1f),
Polygon.PolygonVertex(1f, -1f, -1f, 1f, 0f)
),
Polygon(
TextureType.CHESS,
Polygon.PolygonVertex(-1f, -1f, -1f, 1f, 1f),
Polygon.PolygonVertex(-1f, -1f, 1f, 0f, 1f),
Polygon.PolygonVertex(1f, -1f, -1f, 1f, 0f)
) )
) )

View File

@ -1,7 +1,9 @@
package ru.landgrafhomyak.bgtu.computer_graphics1.model_builder package ru.landgrafhomyak.bgtu.computer_graphics1.model_builder
enum class TextureType { enum class TextureType {
CHESS, NULL,
HSV,
WHITE_TRANSPARENCY, WHITE_TRANSPARENCY,
HSV,
CHESS,
GRADIENT_CHESS,
} }

View File

@ -35,6 +35,8 @@ internal val fragmentShaderSource = """
vec3 hsv2rgb(float, float, float); vec3 hsv2rgb(float, float, float);
vec3 hsv_texture(float, float); vec3 hsv_texture(float, float);
float atan_gradient(float k, float radius, float lo, float hi);
float linear_gradient(float k, float lo, float hi);
void main() { void main() {
switch (texture_type_v2f) { switch (texture_type_v2f) {
@ -51,6 +53,26 @@ internal val fragmentShaderSource = """
case ${TextureType.HSV.ordinal}: case ${TextureType.HSV.ordinal}:
FragColor = vec4(hsv_texture(texture_pos_v2f.x, texture_pos_v2f.y), 1.0); FragColor = vec4(hsv_texture(texture_pos_v2f.x, texture_pos_v2f.y), 1.0);
break; break;
case ${TextureType.GRADIENT_CHESS.ordinal}:
{
float radius = 0.2;
if (int( round(floor((texture_pos_v2f.x - 0.5) / 0.033)) + round(floor((texture_pos_v2f.y - 0.5) / 0.033)) ) % 2 == 0) {
FragColor = vec4(
0.0 + linear_gradient(texture_pos_v2f.x, 0.0, 0.5),
0.0 + linear_gradient(texture_pos_v2f.y, 0.0, 0.5),
0.5 - min(linear_gradient(texture_pos_v2f.x, 0.0, 0.35) + linear_gradient(texture_pos_v2f.y, 0.0, 0.35), 0.5),
1.0
);
} else {
FragColor = vec4(
0.0 + linear_gradient(texture_pos_v2f.x, 0.0, 1.0),
0.0 + linear_gradient(texture_pos_v2f.y, 0.0, 1.0),
1.0 - min(linear_gradient(texture_pos_v2f.x, 0.0, 0.8) + linear_gradient(texture_pos_v2f.y, 0.0, 0.8), 1.0),
1.0
);
}
break;
}
default: default:
FragColor = vec4(0.0, 0.0, 0.0, 0.0); FragColor = vec4(0.0, 0.0, 0.0, 0.0);
} }
@ -61,6 +83,12 @@ internal val fragmentShaderSource = """
return hsv2rgb(mod(mod(angle / PI * 180.0, 360.0) + 360.0, 360.0), 1.0, 1.0); return hsv2rgb(mod(mod(angle / PI * 180.0, 360.0) + 360.0, 360.0), 1.0, 1.0);
} }
float atan_gradient(float k, float radius, float lo, float hi) {
return ((atan((k - 0.5) * 2.0 * radius) / atan(radius)) + 0.5) * (hi - lo) + lo;
}
float linear_gradient(float k, float lo, float hi) {
return k * (hi - lo) + lo;
}
vec3 hsv2rgb(float hue, float saturation, float value) { vec3 hsv2rgb(float hue, float saturation, float value) {
int hi = int(floor(hue / 60.0)) % 6; int hi = int(floor(hue / 60.0)) % 6;
float f = hue / 60.0 - floor(hue / 60.0); float f = hue / 60.0 - floor(hue / 60.0);