Forráskód Böngészése

Create Xtexture.c

Rudy Boudewijn van Etten 4 éve
szülő
commit
2f842796e8
1 módosított fájl, 260 hozzáadás és 0 törlés
  1. 260 0
      ProcGen/Xtexture.c

+ 260 - 0
ProcGen/Xtexture.c

@@ -0,0 +1,260 @@
+#include "raylib.h"
+#include <math.h>
+
+float direction(float x, float y);
+// Return the angle from - to in float
+float getangledeg(float x1,float y1,float x2,float y2);
+void createXtexture();
+
+RenderTexture2D target;
+
+int tw = 320;
+int th = 240;
+
+int main(void)
+{
+    // Initialization
+    //--------------------------------------------------------------------------------------
+    const int screenWidth = 800;
+    const int screenHeight = 600;
+    //tw=screenWidth;
+    //th=screenHeight;
+    InitWindow(screenWidth, screenHeight, "raylib example.");
+ 
+    createXtexture();
+    SetTargetFPS(60);               // Set our game to run at 60 frames-per-second
+    //--------------------------------------------------------------------------------------
+    int x1=200;
+    int y1=200;
+    int x2=0;
+    int y2=0;
+    float an=0;
+    int val=0;
+    // Main game loop
+    while (!WindowShouldClose())    // Detect window close button or ESC key
+    {
+        // Update
+        //----------------------------------------------------------------------------------
+        an+=.01;
+        x2 = x1+cos(an)*64;
+        y2 = y1+sin(an)*64;
+        if(an>PI*2.0f)an=0;
+        
+        val++;
+        if(val>200){
+            val=0;
+            createXtexture();
+        }
+        
+        //----------------------------------------------------------------------------------
+        // Draw
+        //----------------------------------------------------------------------------------
+        BeginDrawing();
+
+            ClearBackground(RAYWHITE);
+
+            // NOTE: Render texture must be y-flipped due to default OpenGL coordinates (left-bottom)
+            //void DrawTexturePro(Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, Color tint);  
+            DrawTexturePro(target.texture,  (Rectangle){ 0, 0,tw,-th },
+                                            (Rectangle){ 0,0,screenWidth,screenHeight}, (Vector2){ 0,0 },0, WHITE);
+
+            float n = direction(cos(an),sin(an));//getangledeg(x1,y1,x2,y2); //*(180/PI));//direction(0.0f,0.0f); 
+            //float n = direction(0,-1);
+            DrawText(FormatText("%f",n),10,10,20,RED);
+            DrawLine(x1,y1,x2,y2,RED);
+
+        EndDrawing();
+        //----------------------------------------------------------------------------------
+    }
+
+    // De-Initialization
+    //--------------------------------------------------------------------------------------
+    UnloadRenderTexture(target);    // Unload render texture 
+    CloseWindow();        // Close window and OpenGL context
+    //--------------------------------------------------------------------------------------
+
+    return 0;
+
+
+}
+
+
+void createXtexture(){
+    // A map array for getting the tiny spots on the canvas
+    int map[tw][th];
+    for(int y=0;y<th;y++){
+    for(int x=0;x<tw;x++){
+        map[x][y]=0;
+    }}
+    
+    // Create some small line parts on the map
+    for(int i=0;i<tw*2;i++){
+        float x1 = GetRandomValue(0,tw);
+        float y1 = GetRandomValue(0,th);
+        float x = x1;
+        float y = y1;
+        float an=PI*2.0f/2;//GetRandomValue(0,360)*DEG2RAD;
+        int len=GetRandomValue(1,3);
+        if(GetRandomValue(0,10)<2)len*=4;
+        for(int j=0;j<len;j++){
+            x+=cos(an)*2;
+            y+=sin(an)*2;
+            //an=GetRandomValue(0,360)*DEG2RAD;
+            an+=.5;
+            if(x>=0 && y>=0 && x<tw && y<th)
+                map[(int)x][(int)y]=1;
+        }
+        // here we add some lighter line parts nearby
+        if(GetRandomValue(0,10)<8){
+        x = x1+1;
+        y = y1+1;
+        an=PI*2.0f/2;
+        len/=2;
+        for(int j=0;j<len;j++){
+            x+=cos(an)*1;
+            y+=sin(an)*1;
+            //an=GetRandomValue(0,360)*DEG2RAD;
+            an+=.5;
+            if(x>=0 && y>=0 && x<tw && y<th)
+                map[(int)x][(int)y]=2;
+        }
+        }
+
+
+    }
+    // grow the spots on the map
+    for(int i=0;i<tw*th;i++){
+        int x=GetRandomValue(1,tw-2);
+        int y=GetRandomValue(1,th-2);
+        if(map[x][y]>0){
+            int nx=GetRandomValue(-1,1);
+            int ny=GetRandomValue(-1,1);
+            map[x+nx][y+ny]=map[x][y];
+        }
+    }
+ 
+    // add some light dots with shadow
+    for(int i=0;i<tw/2;i++){
+        int x = GetRandomValue(2,tw-2);
+        int y = GetRandomValue(2,th-2);
+        map[x][y]=3;
+        map[x+1][y+1]=2;
+    }
+ 
+    // our rendertexture
+    
+    target = LoadRenderTexture(tw,th);
+    // Clear our texture(image) before entering the game loop
+    BeginTextureMode(target);    
+
+
+    //ClearBackground(DARKPURPLE);
+    //DrawCircle(0,0, 100, YELLOW);
+    
+    // These are the colors we use
+    Color back=(Color){75,50,80,255};
+    Color high=(Color){80,75,99,255};
+    Color low=(Color){30,50,70,255};
+    ClearBackground(back);
+
+    // Here we draw the data we created in the mapp[][]
+    for(int y=0;y<th;y++){
+    for(int x=0;x<tw;x++){
+        // This is the noise
+        if(GetRandomValue(0,10)<5){
+            Color tc;
+            int val = GetRandomValue(-50,40);
+            if(GetRandomValue(0,10)<8)val/=4;
+            tc.r = back.r+val;
+            tc.g = back.g+val;
+            tc.b = back.b+val;
+            tc.a = 255;
+            if(tc.r<0)tc.r=0;
+            if(tc.g<0)tc.g=0;
+            if(tc.b<0)tc.b=0;
+            if(tc.r>255)tc.r=255;
+            if(tc.g>255)tc.g=255;
+            if(tc.b>255)tc.b=255;
+
+            DrawPixel(x,y,tc);
+        }
+        if(map[x][y]==1)
+            DrawPixel(x,y,low);
+        if(map[x][y]==2)
+            DrawPixel(x,y,high);
+        if(map[x][y]==3)
+            DrawPixel(x,y,BLACK);    
+        
+
+    }}
+
+    // here we create the cracks!!
+    for(int j=0;j<tw/3;j++){
+        int len=GetRandomValue(5,tw/2);
+        if(GetRandomValue(0,20)<10)len=GetRandomValue(5,10);
+        float angle=(float)(GetRandomValue(0,360)*DEG2RAD);
+        float x=GetRandomValue(0,tw);
+        float y=GetRandomValue(0,th);    
+        for(int i=0 ;i<len;i++){
+            DrawPixel(x,y,BLACK);
+            if(GetRandomValue(0,10)<5)DrawPixel(x,y,low);
+            int d=direction(cos(angle),sin(angle));
+            if(d==0)// || d==3 || d==4 || d==5 || d==7)
+                if(GetRandomValue(0,10)<2)DrawPixel(x,y+1,high);
+            if(d==1)
+                if(GetRandomValue(0,10)<2)DrawPixel(x+1,y,high);
+            if(d==2)
+                DrawPixel(x+1,y,high);
+            if(d==3)
+                DrawPixel(x+1,y,high);
+                
+            if(d==4)
+                DrawPixel(x,y+1,high);
+                if(GetRandomValue(0,10)<2)DrawPixel(x,y-1,BLACK);
+
+            //if(d==5)
+            //    DrawPixel(x,y,YELLOW);
+            if(d==6)
+                DrawPixel(x+1,y,high);
+            if(d==7)
+                DrawPixel(x,y+1,high);
+            x+=cos(angle)*1;
+            y+=sin(angle)*1;
+            if(GetRandomValue(0,20)<2)
+                angle+=(float)(GetRandomValue(-90,90)*DEG2RAD);
+            //angle+=.05;
+        }
+    }
+    
+    
+    // Draw something on it.
+    
+
+    EndTextureMode();               // This needs to be called after every different draw command used. Do not forget to use begintexture also..
+}
+//
+// Takes two float numbers x and y -,+
+// Returns right=0;rightdown1;down=2....
+float direction(float x, float y){
+    
+    float angle = (float)atan2(y-0.0f, x-0.0f);
+    
+    angle*=RAD2DEG;
+    if (angle < 0)
+    {
+        angle+=360;
+    }
+    int i = (angle + 22.50)/45;
+    
+    return i % 8;        
+}
+// Return the angle from - to in float
+float getangledeg(float x1,float y1,float x2,float y2){
+    float angle = (float)atan2(y2-y1, x2-x1);
+    angle*=RAD2DEG;
+    if (angle < 0)
+    {
+        angle+=360;
+    }
+    return angle;    
+}