-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRendererSoftware.java
132 lines (112 loc) · 3.59 KB
/
RendererSoftware.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.MemoryImageSource;
import java.util.Map;
public class RendererSoftware implements SIRDSRenderer{
private Component mParent;
private SceneManager mScene;
private Image mBackBuffer;
private ZDraw mZBuffer, mColorBuffer;//, mZBuffer2;
private IntArrayImage mSIRDPixels;
private MemoryImageSource mSIRDImage;
private boolean mInvert, mRandomFlicker;
private final boolean USE_COLOR_BUFFER = false;
int mDrawMode;
int sis1[];
int sis2[];
int sisTemp[];
private int mFrameNumber;
public void init(Component parent, SceneManager sceneManager){
mInvert=false;
mRandomFlicker=true;
mDrawMode=1;
mScene=sceneManager;
mParent=parent;
mSIRDPixels = new IntArrayImage(mScene.width, mScene.height);
mSIRDImage = new MemoryImageSource(mScene.width, mScene.height, mSIRDPixels.data, 0, mScene.width);
mSIRDImage.setAnimated(true);
mSIRDImage.setFullBufferUpdates(true);
mBackBuffer = parent.createImage(mSIRDImage);
mZBuffer = new ZDraw(mScene.width, mScene.height);
mZBuffer.clear();
if (USE_COLOR_BUFFER) {
mColorBuffer = new ZDraw(mScene.width, mScene.height);
mColorBuffer.clear();
}
mFrameNumber=0;
}
public int[] enlarge(int old[], int copies){
int len = old.length;
int[] result = new int[len*copies];
for (int c=0;c<copies;c++)
for (int i=0;i<len;i++)
result[c*len + i] = old[i];
return result;
}
public void setSISData(int f1[], int f2[], int w, int h){
if (w!=ZDraw.SIRDW || h<ZDraw.SIRDdefH)
throw new IllegalArgumentException("wrong sis data size");
if (f1 == null) return;
sis1=f1;
sis2=(f2==null)?f1:f2;
if (USE_COLOR_BUFFER) {
if (h < mScene.height) {
sis1 = enlarge(sis1, (mScene.height + h-1) / h);
sis2 = enlarge(sis2, (mScene.height + h-1) / h);
}
sisTemp = new int[Math.max(sis1.length, sis2.length)];
}
}
public void setRandomMode(boolean randomFlicker){
mRandomFlicker=randomFlicker;
}
public void setInversion(boolean invert){
mInvert=invert;
}
public void setDrawMode(int drawMode){
mDrawMode=drawMode;
}
public int getDrawMode(){
return mDrawMode;
}
public void renderFrame(){
boolean drawSIRDS=(mDrawMode == 1) && sis1!=null && sis2!=null;
mZBuffer.clear();
if (USE_COLOR_BUFFER) {
mColorBuffer.clear();
mScene.drawTo(mZBuffer, mColorBuffer, -mScene.cameraX, -mScene.cameraY);
} else
mScene.drawTo(mZBuffer, -mScene.cameraX, -mScene.cameraY);
if (!drawSIRDS){
if (mDrawMode == 0) mZBuffer.drawHeightMapTo(mSIRDPixels.data, mInvert);
else if (mDrawMode == 3) mZBuffer.drawRainbowMapTo(mSIRDPixels.data, mInvert);
else mZBuffer.drawAnaglyph(mSIRDPixels.data, mInvert);
} else if (USE_COLOR_BUFFER){
if ((mFrameNumber &1)!=0) mZBuffer.DrawColoredSIRD(mSIRDPixels.data, mColorBuffer.data, sis2, sisTemp, mRandomFlicker, mInvert);
else mZBuffer.DrawColoredSIRD(mSIRDPixels.data, mColorBuffer.data, sis1, sisTemp, mRandomFlicker, mInvert);
} else {
if ((mFrameNumber &1)!=0) mZBuffer.DrawSIRD(mSIRDPixels.data, sis2, mRandomFlicker, mInvert);
else mZBuffer.DrawSIRD(mSIRDPixels.data, sis1, mRandomFlicker, mInvert);
}
/*
if (mUseZBuffer2) {
mZBuffer.forceCopyDataFrom(0,0,mZBuffer2,0,0,mZBuffer2.w,mZBuffer2.h);
}*/
if (drawSIRDS) mScene.floaters.draw(mSIRDPixels);
else mScene.floaters.drawSimple(mSIRDPixels);
mSIRDImage.newPixels();
mFrameNumber++;
}
public void paint(Graphics g){
g.drawImage(mBackBuffer, 0, 0, mParent);
}
public Image getBackBuffer(){
return mBackBuffer;
}
public void finit(){
}
ZDraw getDirectZBufferAccess(){
return mZBuffer;
}
}