(ren *RenderComponent, space *SpaceComponent, buffer []float32)
| 343 | } |
| 344 | |
| 345 | func (s *basicShader) generateBufferContent(ren *RenderComponent, space *SpaceComponent, buffer []float32) bool { |
| 346 | // We shouldn't use SpaceComponent to get width/height, because this usually already contains the Scale (which |
| 347 | // is being added elsewhere, so we don't want to over-do it) |
| 348 | w := ren.Drawable.Width() |
| 349 | h := ren.Drawable.Height() |
| 350 | |
| 351 | tint := colorToFloat32(ren.Color) |
| 352 | |
| 353 | u, v, u2, v2 := ren.Drawable.View() |
| 354 | |
| 355 | if ren.Repeat != NoRepeat { |
| 356 | u2 = space.Width / (ren.Drawable.Width() * ren.Scale.X) |
| 357 | w *= u2 |
| 358 | v2 = space.Width / (ren.Drawable.Height() * ren.Scale.Y) |
| 359 | h *= v2 |
| 360 | } |
| 361 | |
| 362 | var changed bool |
| 363 | |
| 364 | //setBufferValue(buffer, 0, 0, &changed) |
| 365 | //setBufferValue(buffer, 1, 0, &changed) |
| 366 | setBufferValue(buffer, 2, u, &changed) |
| 367 | setBufferValue(buffer, 3, v, &changed) |
| 368 | setBufferValue(buffer, 4, tint, &changed) |
| 369 | |
| 370 | setBufferValue(buffer, 5, w, &changed) |
| 371 | //setBufferValue(buffer, 6, 0, &changed) |
| 372 | setBufferValue(buffer, 7, u2, &changed) |
| 373 | setBufferValue(buffer, 8, v, &changed) |
| 374 | setBufferValue(buffer, 9, tint, &changed) |
| 375 | |
| 376 | setBufferValue(buffer, 10, w, &changed) |
| 377 | setBufferValue(buffer, 11, h, &changed) |
| 378 | setBufferValue(buffer, 12, u2, &changed) |
| 379 | setBufferValue(buffer, 13, v2, &changed) |
| 380 | setBufferValue(buffer, 14, tint, &changed) |
| 381 | |
| 382 | //setBufferValue(buffer, 15, 0, &changed) |
| 383 | setBufferValue(buffer, 16, h, &changed) |
| 384 | setBufferValue(buffer, 17, u, &changed) |
| 385 | setBufferValue(buffer, 18, v2, &changed) |
| 386 | setBufferValue(buffer, 19, tint, &changed) |
| 387 | |
| 388 | // Since each sprite in the batch has a different transform, we can't just send the model matrix into |
| 389 | // the shader and let the GPU take care of it. Instead, we need to multiply the current sprite's model matrix |
| 390 | // with the position component for each vertex of the current sprite on the CPU, and send the transformed |
| 391 | // positions to the shader directly. |
| 392 | modelMatrix := s.makeModelMatrix(ren, space) |
| 393 | s.multModel(modelMatrix, buffer[:2]) |
| 394 | s.multModel(modelMatrix, buffer[5:7]) |
| 395 | s.multModel(modelMatrix, buffer[10:12]) |
| 396 | s.multModel(modelMatrix, buffer[15:17]) |
| 397 | return changed |
| 398 | } |
| 399 | |
| 400 | func (s *basicShader) multModel(m *engo.Matrix, v []float32) { |
| 401 | tmp := engo.MultiplyMatrixVector(m, v) |
no test coverage detected