I know the solution is simple to calculate, I just dislike the current solution because of lack of proof behind it(who gives a damn if it works? It has to be proven in the realm of mathematics before it's useful).
I had to revisit this issue because I have to make a 3D networked game for my assignment and wanted to re-invent the wheel, with solid proof.
If you don't care about this then don't read it. I only did this as a proof for my assignment and thought maybe someone might benefit from my proof.
lambda = texture dimension size (either width or height)
alpha = some unknown integer value that is the power
This statement is assuming that the current dimension is PO2 but since I don't know this, I thought I'd try and find the power while converting the base from PO2 into something more common (base e).
lambda = 2^alpha
Convert base 2 to base e.
ln(lambda) = ln(2^alpha)
ln(lambda) = alpha*ln(2)
alpha = ln(lambda) / ln(2)
How to get this to work?
1 2 3 4 5
| private static boolean isPowerOf2(final int width, final int height) { currentImageScaledWidth = (int) Math.pow(2, Math.ceil(Math.log(width) / Math.log(2))); currentImageScaledHeight = (int) Math.pow(2, Math.ceil(Math.log(height) / Math.log(2))); return ((width == currentImageScaledWidth) && (height == currentImageScaledHeight)); } |
If it's already a PO2 texture then nothing happens. If a dimension isn't PO2, then it converts to the nearest higher PO2 dimension.
1 2 3 4 5 6 7
| Texture tex = TextureLoader.load("C:\\Documents and Settings\\Kruno\\Desktop\\newOOP2Ass\\res\\Title.BMP"); double curTexBaseX = Math.log(tex.width) / Math.log(2); double curTexBaseY = Math.log(tex.height) / Math.log(2); System.out.println(tex); System.out.print("PO2 Width: " + Math.pow(2, Math.ceil(curTexBaseX))); System.out.print("\t PO2 Height: " + Math.pow(2, Math.ceil(curTexBaseY))); |
Output:
BPP: 3 Width: 453 Height: 239 Scaled Width: 512 Scaled Height: 256
PO2 Width: 512.0 PO2 Height: 256.0