diff --git a/scripts/md5 b/scripts/md5 deleted file mode 100644 index 42c4a60..0000000 --- a/scripts/md5 +++ /dev/null @@ -1 +0,0 @@ -1aaed43b1f90e8ca1926f79f20d836e9 - diff --git a/src/sig/JavaProjectTemplate.java b/src/sig/JavaProjectTemplate.java index 1becba2..ac5ae34 100644 --- a/src/sig/JavaProjectTemplate.java +++ b/src/sig/JavaProjectTemplate.java @@ -1 +1,21 @@ -404: Not Found \ No newline at end of file +package sig; + +import javax.swing.JFrame; +import sig.engine.Panel; + +public class JavaProjectTemplate { + public static final String PROGRAM_NAME="Sig's Java Project Template"; + public static void main(String[] args) { + JFrame f = new JFrame(PROGRAM_NAME); + Panel p = new Panel(f); + + p.init(); + + f.add(p); + f.setSize(1280,720); + f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + f.setVisible(true); + + p.render(); + } +} diff --git a/src/sig/engine/Color.java b/src/sig/engine/Color.java index 1becba2..3a6bde7 100644 --- a/src/sig/engine/Color.java +++ b/src/sig/engine/Color.java @@ -1 +1,38 @@ -404: Not Found \ No newline at end of file +package sig.engine; + +public class Color { + int r,g,b,a; + + final static public Color BLACK = new Color(0,0,0); + final static public Color RED = new Color(204,0,0); + final static public Color GREEN = new Color(78,154,6); + final static public Color YELLOW = new Color(196,160,0); + final static public Color BLUE = new Color(114,159,207); + final static public Color MAGENTA = new Color(117,80,123); + final static public Color CYAN = new Color(6,152,154); + final static public Color WHITE = new Color(211,215,207); + final static public Color BRIGHT_BLACK = new Color(85,87,83); + final static public Color BRIGHT_RED = new Color(239,41,41); + final static public Color BRIGHT_GREEN = new Color(138,226,52); + final static public Color BRIGHT_YELLOW = new Color(252,233,79); + final static public Color BRIGHT_BLUE = new Color(50,175,255); + final static public Color BRIGHT_MAGENTA = new Color(173,127,168); + final static public Color BRIGHT_CYAN = new Color(52,226,226); + final static public Color BRIGHT_WHITE = new Color(255,255,255); + + public Color(int r, int g, int b) { + this(r,g,b,255); + } + + public Color(int r, int g, int b,int a) { + super(); + this.r = r; + this.g = g; + this.b = b; + this.a = a; + } + + public int getColor() { + return (a<<24)+(r<<16)+(g<<8)+b; + } +} diff --git a/src/sig/engine/Edge.java b/src/sig/engine/Edge.java index 1becba2..867937e 100644 --- a/src/sig/engine/Edge.java +++ b/src/sig/engine/Edge.java @@ -1 +1,33 @@ -404: Not Found \ No newline at end of file +package sig.engine; + +public class Edge { + Point a,b; + int min_y; + int max_y; + int min_x; + int max_x; + double x_of_min_y; + double inverse_slope; + public Edge(Point a, Point b) { + super(); + this.a = a; + this.b = b; + min_y=Math.min(a.y, b.y); + max_y=Math.max(a.y, b.y); + min_x=Math.min(a.x, b.x); + max_x=Math.max(a.x, b.x); + if (a.y==min_y) { + x_of_min_y=a.x; + } else { + x_of_min_y=b.x; + } + + inverse_slope=(double)(a.x-b.x)/(a.y-b.y); + } + @Override + public String toString() { + return "Edge [a=" + a + ", b=" + b + ", min_y=" + min_y + ", max_y=" + max_y + ", min_x=" + min_x + ", max_x=" + + max_x + ", x_of_min_y=" + x_of_min_y + ", inverse_slope=" + inverse_slope + "]"; + } + +} diff --git a/src/sig/engine/Panel.java b/src/sig/engine/Panel.java index 1becba2..2f558f7 100644 --- a/src/sig/engine/Panel.java +++ b/src/sig/engine/Panel.java @@ -1 +1,314 @@ -404: Not Found \ No newline at end of file +package sig.engine; +import java.awt.Graphics; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsEnvironment; +import java.awt.Image; +import java.awt.Toolkit; +import java.awt.image.ColorModel; +import java.awt.image.MemoryImageSource; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JFrame; +import javax.swing.JPanel; + +import sig.JavaProjectTemplate; + +public class Panel extends JPanel implements Runnable { + JFrame window; + public int pixel[]; + public int width=1280; + public int height=720; + final int CIRCLE_PRECISION=32; + final int OUTLINE_COL=Color.BRIGHT_WHITE.getColor(); + private Thread thread; + private Image imageBuffer; + private MemoryImageSource mImageProducer; + private ColorModel cm; + int scanLine=0; + int nextScanLine=0; + double x_offset=0; + double y_offset=0; + int frameCount=0; + long lastSecond=0; + int lastFrameCount=0; + + public Panel(JFrame f) { + super(true); + this.window=f; + thread = new Thread(this, "MyPanel Thread"); + } + + /** + * Get Best Color model available for current screen. + * @return color model + */ + protected static ColorModel getCompatibleColorModel(){ + GraphicsConfiguration gfx_config = GraphicsEnvironment. + getLocalGraphicsEnvironment().getDefaultScreenDevice(). + getDefaultConfiguration(); + return gfx_config.getColorModel(); + } + + /** + * Call it after been visible and after resizes. + */ + public void init(){ + cm = getCompatibleColorModel(); + int screenSize = width * height; + if(pixel == null || pixel.length < screenSize){ + pixel = new int[screenSize]; + } + if(thread.isInterrupted() || !thread.isAlive()){ + thread.start(); + } + mImageProducer = new MemoryImageSource(width, height, cm, pixel,0, width); + mImageProducer.setAnimated(true); + mImageProducer.setFullBufferUpdates(true); + imageBuffer = Toolkit.getDefaultToolkit().createImage(mImageProducer); + } + + @Override + public void paintComponent(Graphics g) { + super.paintComponent(g); + // perform draws on pixels + render(); + // ask ImageProducer to update image + mImageProducer.newPixels(); + // draw it on panel + g.drawImage(this.imageBuffer, 0, 0, this); + + + if (window!=null&&System.currentTimeMillis()-lastSecond>=1000) { + window.setTitle(JavaProjectTemplate.PROGRAM_NAME+" - FPS: "+(frameCount-lastFrameCount)); + lastFrameCount=frameCount; + lastSecond=System.currentTimeMillis(); + } + frameCount++; + } + + /** + * Overrides ImageObserver.imageUpdate. + * Always return true, assuming that imageBuffer is ready to go when called + */ + @Override + public boolean imageUpdate(Image image, int a, int b, int c, int d, int e) { + return true; + } + /** + * Do your draws in here !! + * pixel is your canvas! + */ + public /* abstract */ void render(){ + int[] p = pixel; // this avoid crash when resizing + //a=h/w + + for (int x=0;x edges_sorted = new ArrayList(); + for (int i=0;i=edges[i].min_y) { + edges_sorted.add(j,edges[i]); + inserted=true; + break; + } + } + if (!inserted) { + edges_sorted.add(edges[i]); + } + } + } + } + //System.out.println(edges_sorted); + List active_edges = new ArrayList(); + scanLine = edges_sorted.get(0).min_y-1; + nextScanLine = scanLine+1; + do { + for (int i=0;i=0) { + Draw(p,index,col.getColor()); + } + } + } + List new_active_edges = new ArrayList(); + for (int i=0;ie.x_of_min_y) { + new_active_edges.add(j,e); + inserted=true; + break; + } + } + if (!inserted) { + new_active_edges.add(e); + } + } + active_edges=new_active_edges; + GetNextScanLineEdges(edges_sorted, active_edges); + } + while (active_edges.size()>0); + } + + private void GetNextScanLineEdges(List edges_sorted, List active_edges) { + if (scanLine==nextScanLine) { + for (int i=0;iscanLine) { + nextScanLine=e.min_y; + break; + } + } + } + } + + public void Draw(int[] canvas,int index, int col) { + int alpha = col>>>24; + if (alpha==0) { + return;} + else + if (alpha==255) { + canvas[index]=col; + } else { + float ratio=alpha/255f; + int prev_col=canvas[index]; + int prev_r=(prev_col&0xFF); + int prev_g=(prev_col&0xFF00)>>>8; + int prev_b=(prev_col&0xFF0000)>>>16; + int r=(col&0xFF); + int g=(col&0xFF00)>>>8; + int b=(col&0xFF0000)>>>16; + + int new_r=(int)(ratio*r+(1-ratio)*prev_r); + int new_g=(int)(ratio*g+(1-ratio)*prev_g); + int new_b=(int)(ratio*b+(1-ratio)*prev_b); + + canvas[index]=new_r+(new_g<<8)+(new_b<<16)+(col&0xFF000000); + } + } + + @Override + public void run() { + while (true) { + // request a JPanel re-drawing + repaint(); + //System.out.println("Repaint "+frameCount++); + //try {Thread.sleep(1);} catch (InterruptedException e) {} + } + } +} \ No newline at end of file diff --git a/src/sig/engine/Point.java b/src/sig/engine/Point.java index 1becba2..b848018 100644 --- a/src/sig/engine/Point.java +++ b/src/sig/engine/Point.java @@ -1 +1,32 @@ -404: Not Found \ No newline at end of file +package sig.engine; + +public class Point { + int x,y; + + public Point(int x, int y) { + super(); + this.x = x; + this.y = y; + } + + public int getX() { + return x; + } + + public void setX(int x) { + this.x = x; + } + + public int getY() { + return y; + } + + public void setY(int y) { + this.y = y; + } + + @Override + public String toString() { + return "Point(" + x + "," + y + ")"; + } +} diff --git a/src/sig/engine/md5 b/src/sig/engine/md5 deleted file mode 100644 index 1becba2..0000000 --- a/src/sig/engine/md5 +++ /dev/null @@ -1 +0,0 @@ -404: Not Found \ No newline at end of file diff --git a/src/sig/md5 b/src/sig/md5 deleted file mode 100644 index 1becba2..0000000 --- a/src/sig/md5 +++ /dev/null @@ -1 +0,0 @@ -404: Not Found \ No newline at end of file diff --git a/utils/.updateDirectories b/utils/.updateDirectories new file mode 100644 index 0000000..9b9cc28 --- /dev/null +++ b/utils/.updateDirectories @@ -0,0 +1,3 @@ +Java +scripts +utils \ No newline at end of file diff --git a/utils/define.sh b/utils/define.sh index eba9bcd..b082051 100755 --- a/utils/define.sh +++ b/utils/define.sh @@ -12,7 +12,7 @@ if [[ $(pwd) != *"SigScript" ]]; then find . -type f -name md5 -delete #Check for hashes - FILES=$(ls -d */) + FILES=$(cat utils/.updateDirectories) for f in $FILES do search $f diff --git a/utils/md5 b/utils/md5 deleted file mode 100644 index 08004ff..0000000 --- a/utils/md5 +++ /dev/null @@ -1,3 +0,0 @@ -5e7a21b710475f173906085c01bd2205 - -548480c89fb8d6668a83ee9e534eb2dd - -03061acd7af07b0d1295509234ff99b7 - diff --git a/utils/search.sh b/utils/search.sh index 668df87..0028a6f 100644 --- a/utils/search.sh +++ b/utils/search.sh @@ -20,7 +20,6 @@ function search() { function check() { echo "Check $1" FILES2=$(ls $1) - REDOWNLOAD=false if [ -f "$1/md5" ]; then echo " md5: https://raw.githubusercontent.com/sigonasr2/SigScript/main/$1md5" @@ -29,7 +28,25 @@ function check() { if [ "$DIFF" != "" ] then echo " Differences detected!" - REDOWNLOAD=true + for g in $FILES2 + do + if [ -f $1$g ]; + then + echo "++Redownload $1$g..." + if [ -f "$1$g" ]; then + #Read the 2nd line and see if it has a special directory. + CHECKLINE=$(sed -n '2{p;q;}' $1$g) + if [ "${CHECKLINE:0:1}" = "#" ]; then + curl https://raw.githubusercontent.com/sigonasr2/SigScript/main/${CHECKLINE:1}/$1$g --output $1$g + else + curl https://raw.githubusercontent.com/sigonasr2/SigScript/main/$1$g --output $1$g + fi + else + echo "===Could not find directory, assuming regular scripts directory exists." + curl https://raw.githubusercontent.com/sigonasr2/SigScript/main/$1$g --output scripts/$g + fi + fi + done fi fi for g in $FILES2 @@ -38,22 +55,6 @@ function check() { then echo "$1$g is a directory" check $1$g/ - else - if [ "$REDOWNLOAD" = "true" ]; then - echo "++Redownload $1$g..." - if [ -f "$1$g" ]; then - #Read the 2nd line and see if it has a special directory. - CHECKLINE=$(sed -n '2{p;q;}' $1$g) - if [ "${CHECKLINE:0:1}" = "#" ]; then - curl https://raw.githubusercontent.com/sigonasr2/SigScript/main/${CHECKLINE:1}/$1$g --output $1$g - else - curl https://raw.githubusercontent.com/sigonasr2/SigScript/main/$1$g --output $1$g - fi - else - echo "===Could not find directory, assuming regular scripts directory exists." - curl https://raw.githubusercontent.com/sigonasr2/SigScript/main/$1$g --output scripts/$g - fi - fi fi done } \ No newline at end of file