public Obj3DText(string txt, TextPlane plane, float size, float posX, float posY, float posZ, float dirAngle, string color, Texture fontTex) { Matrix2 rotMat = Matrix2.CreateRotation(MathHelper.DegreesToRadians(dirAngle)); float [] verts = new float[txt.Length * 4 * 5]; uint [] inds = new uint[txt.Length * 6]; int vp = 0; int ip = 0; for (int i = 0; i < txt.Length; i++) { char ch = txt[i]; uint svp = (uint)vp; // save first index // top left Vector3 v3p = GetTranslatedPoint(posX, posY, posZ, size, i, 0, rotMat, plane); // 3d vector Vector2 vtp = GetTextureCorner(ch, 0, 0); // texture vector SetVertex(verts, vp++, v3p, vtp); // top right v3p = GetTranslatedPoint(posX, posY, posZ, size, i + 1, 0, rotMat, plane); // 3d vector vtp = GetTextureCorner(ch, 1, 0); // texture vector SetVertex(verts, vp++, v3p, vtp); // bootom left v3p = GetTranslatedPoint(posX, posY, posZ, size, i, -1, rotMat, plane); // 3d vector vtp = GetTextureCorner(ch, 0, 1); // texture vector SetVertex(verts, vp++, v3p, vtp); // bootom right v3p = GetTranslatedPoint(posX, posY, posZ, size, i + 1, -1, rotMat, plane); // 3d vector vtp = GetTextureCorner(ch, 1, 1); // texture vector SetVertex(verts, vp++, v3p, vtp); // indexes, 2 triangles inds[ip++] = svp; inds[ip++] = svp + 2; inds[ip++] = svp + 1; inds[ip++] = svp + 2; inds[ip++] = svp + 3; inds[ip++] = svp + 1; } Init(Shader.ShadingType.Textured3D, verts, inds, fontTex); SetColor(color); }
Vector3 GetTranslatedPoint(float posx, float posy, float posz, float scale, int cornerx, int cornery, Matrix2 rotMat, TextPlane plane) { Vector3 vres = new OpenTK.Vector3(); Vector2 vcorner = new OpenTK.Vector2(cornerx * scale, cornery * scale * 2); Vector2 tcorner = ApplyMatrix(rotMat, vcorner); switch (plane) { case TextPlane.XY: vres.X = posx + tcorner.X; vres.Y = posy + tcorner.Y; vres.Z = posz; break; case TextPlane.XZ: vres.X = posx + tcorner.X; vres.Y = posy; vres.Z = posz + tcorner.Y; break; case TextPlane.ZY: vres.X = posx; vres.Y = posy + tcorner.Y; vres.Z = posz + tcorner.X; break; } return(vres); }