|
@@ -1,81 +1,68 @@
|
|
#include "client/rendering/Renderer.h"
|
|
#include "client/rendering/Renderer.h"
|
|
|
|
+#include "gaming-core/rendering/Attributes.h"
|
|
|
|
+#include "gaming-core/utils/Buffer.h"
|
|
|
|
|
|
-Renderer::Renderer(Shader& shader, MatrixStack<16>& stack, Matrix& view) : shader(shader), stack(stack), view(view) {
|
|
+Renderer::Renderer() : buffer(16), font("resources/font8x8.png") {
|
|
|
|
+ vertexBuffer.setAttributes(
|
|
|
|
+ Attributes().addFloat(2).addFloat(2).addColor4());
|
|
|
|
+ vertexBuffer.setStreamData(1024 * 1024);
|
|
}
|
|
}
|
|
|
|
|
|
-void Renderer::pop() {
|
|
+void Renderer::drawString(float x, float y, const char* text) {
|
|
- stack.pop();
|
|
+ buffer.clear();
|
|
|
|
+ int index = 0;
|
|
|
|
+ int vertices = 0;
|
|
|
|
+ Color4 color(0xFF, 0xFF, 0xFF, 0x00);
|
|
|
|
+ while(text[index] != '\0') {
|
|
|
|
+ char32_t c = text[index];
|
|
|
|
+ if(c > 128 && text[index + 1] != '\0') {
|
|
|
|
+ index++;
|
|
|
|
+ c = (text[index] & 0x3F) | ((c & 0x1F) << 6);
|
|
|
|
+ }
|
|
|
|
+ if(c == '&') {
|
|
|
|
+ if(text[index + 1] == '\0' || text[index + 2] == '\0' ||
|
|
|
|
+ text[index + 3] == '\0') {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ color[0] = ((text[index + 1] - '0') * 255) / 9;
|
|
|
|
+ color[1] = ((text[index + 2] - '0') * 255) / 9;
|
|
|
|
+ color[2] = ((text[index + 3] - '0') * 255) / 9;
|
|
|
|
+ index += 4;
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ float minX = (c & 0xF) * (1.0f / 16.0f) + 1.0f / 128.0f;
|
|
|
|
+ float minY = (c >> 4) * (1.0f / 16.0f);
|
|
|
|
+ float maxX = minX + (1.0f / 16.0f) - 2.0f / 128.0f;
|
|
|
|
+ float maxY = minY + (1.0f / 16.0f);
|
|
|
|
+
|
|
|
|
+ buffer.add(x).add(y).add(minX).add(minY).add(color);
|
|
|
|
+ buffer.add(x).add(y + 8).add(minX).add(maxY).add(color);
|
|
|
|
+ buffer.add(x + 6).add(y).add(maxX).add(minY).add(color);
|
|
|
|
+ buffer.add(x + 6).add(y + 8).add(maxX).add(maxY).add(color);
|
|
|
|
+
|
|
|
|
+ x += 6;
|
|
|
|
+ index++;
|
|
|
|
+ vertices += 4;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ font.bindTo(0);
|
|
|
|
+ update();
|
|
|
|
+ vertexBuffer.drawStrip(vertices);
|
|
}
|
|
}
|
|
|
|
|
|
-void Renderer::push() {
|
|
+void Renderer::drawRectangle(float x, float y, float width, float height,
|
|
- stack.push();
|
|
+ Color4 c) {
|
|
|
|
+ buffer.clear();
|
|
|
|
+ buffer.add(x).add(y).add(0.0f).add(0.0f).add(c);
|
|
|
|
+ buffer.add(x).add(y + height).add(0.0f).add(0.0f).add(c);
|
|
|
|
+ buffer.add(x + width).add(y).add(0.0f).add(0.0f).add(c);
|
|
|
|
+ buffer.add(x + width).add(y + height).add(0.0f).add(0.0f).add(c);
|
|
|
|
+ update();
|
|
|
|
+ vertexBuffer.drawStrip(4);
|
|
}
|
|
}
|
|
|
|
|
|
-Renderer& Renderer::update() {
|
|
+void Renderer::update() {
|
|
- shader.setMatrix("model", stack.peek().getValues());
|
|
+ vertexBuffer.updateData(
|
|
- return *this;
|
|
+ 0, std::min(buffer.getLength(), vertexBuffer.getSize()), buffer);
|
|
-}
|
|
|
|
-
|
|
|
|
-Renderer& Renderer::update(const Vector3& pos, const Quaternion& rotation) {
|
|
|
|
- Vector3 right = rotation * Vector3(1.0f, 0.0f, 0.0f);
|
|
|
|
- Vector3 up = rotation * Vector3(0.0f, 1.0f, 0.0f);
|
|
|
|
- Vector3 back = rotation * Vector3(0.0f, 0.0f, -1.0f);
|
|
|
|
-
|
|
|
|
- view.set(0, Vector4(right[0], right[1], right[2], right.dot(-pos)));
|
|
|
|
- view.set(1, Vector4(up[0], up[1], up[2], up.dot(-pos)));
|
|
|
|
- view.set(2, Vector4(back[0], back[1], back[2], back.dot(-pos)));
|
|
|
|
- view.set(3, Vector4(0.0f, 0.0f, 0.0f, 1.0f));
|
|
|
|
-
|
|
|
|
- shader.setMatrix("view", view.getValues());
|
|
|
|
- return *this;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-Renderer& Renderer::scale(float sx, float sy, float sz) {
|
|
|
|
- stack.peek().scale(Vector3(sx, sy, sz));
|
|
|
|
- return *this;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-Renderer& Renderer::scale(float s) {
|
|
|
|
- stack.peek().scale(s);
|
|
|
|
- return *this;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-Renderer& Renderer::translate(float tx, float ty, float tz) {
|
|
|
|
- stack.peek().translate(Vector3(tx, ty, tz));
|
|
|
|
- return *this;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-Renderer& Renderer::translateX(float tx) {
|
|
|
|
- stack.peek().translateX(tx);
|
|
|
|
- return *this;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-Renderer& Renderer::translateY(float ty) {
|
|
|
|
- stack.peek().translateY(ty);
|
|
|
|
- return *this;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-Renderer& Renderer::translateZ(float tz) {
|
|
|
|
- stack.peek().translateZ(tz);
|
|
|
|
- return *this;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-Renderer& Renderer::translateTo(float tx, float ty, float tz) {
|
|
|
|
- stack.peek().translateTo(Vector3(tx, ty, tz));
|
|
|
|
- return *this;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-Renderer& Renderer::rotateX(float degrees) {
|
|
|
|
- stack.peek().rotateX(degrees);
|
|
|
|
- return *this;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-Renderer& Renderer::rotateY(float degrees) {
|
|
|
|
- stack.peek().rotateY(degrees);
|
|
|
|
- return *this;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-Renderer& Renderer::rotateZ(float degrees) {
|
|
|
|
- stack.peek().rotateZ(degrees);
|
|
|
|
- return *this;
|
|
|
|
}
|
|
}
|