From 911deefbf543ea8d9a2516d3ecd8fae19e1410f1 Mon Sep 17 00:00:00 2001 From: zeefaad Date: Sun, 28 Dec 2025 17:04:49 +0100 Subject: [PATCH] multiple labmda --- main.c | 191 ++++++++++++++++++++++++++++++++++++++++--------- michelson | Bin 129696 -> 133840 bytes michelson.frag | 45 ++++++++---- 3 files changed, 189 insertions(+), 47 deletions(-) diff --git a/main.c b/main.c index b209605..a1ea219 100644 --- a/main.c +++ b/main.c @@ -10,10 +10,14 @@ #define COLOR_TEXT_DIM (Color){ 180, 180, 190, 255 } #define COLOR_TEXT_SEC (Color){ 160, 160, 170, 255 } +#define MAX_WAVELENGTHS 10 + typedef struct { float d1; float d2; - float lambda; + float lambdas[MAX_WAVELENGTHS]; + int lambdasCount; + int selectedLambdaIndex; float angleM1; float angleM1_Y; Vector2 center; @@ -81,7 +85,18 @@ void DrawInterferenceViewGPU(Michelson *mic, Rectangle rec, Shader shader, bool SetShaderValue(shader, GetShaderLocation(shader, "d1"), &mic->d1, SHADER_UNIFORM_FLOAT); SetShaderValue(shader, GetShaderLocation(shader, "d2"), &d2_effective, SHADER_UNIFORM_FLOAT); - SetShaderValue(shader, GetShaderLocation(shader, "lambda"), &mic->lambda, SHADER_UNIFORM_FLOAT); + + float lambdasData[MAX_WAVELENGTHS]; + for(int i = 0; i < MAX_WAVELENGTHS; i++) { + if (i < mic->lambdasCount) lambdasData[i] = mic->lambdas[i]; + else lambdasData[i] = 0.0f; + } + int locLambdas = GetShaderLocation(shader, "lambdas"); + int locCount = GetShaderLocation(shader, "lambdasCount"); + SetShaderValueV(shader, locLambdas, lambdasData, SHADER_UNIFORM_FLOAT, MAX_WAVELENGTHS); + SetShaderValue(shader, locCount, &mic->lambdasCount, SHADER_UNIFORM_INT); + + //SetShaderValue(shader, GetShaderLocation(shader, "lambda"), &mic->lambda, SHADER_UNIFORM_FLOAT); SetShaderValue(shader, GetShaderLocation(shader, "angleM1"), &mic->angleM1, SHADER_UNIFORM_FLOAT); SetShaderValue(shader, GetShaderLocation(shader, "angleM1_Y"), &mic->angleM1_Y, SHADER_UNIFORM_FLOAT); SetShaderValue(shader, GetShaderLocation(shader, "zoom"), &zoom, SHADER_UNIFORM_FLOAT); @@ -102,17 +117,28 @@ void DrawInterferenceViewGPU(Michelson *mic, Rectangle rec, Shader shader, bool void DrawMichelsonSchema (Michelson *mic) { Vector2 c = mic->center; - Color laserColor = WavelengthToColor(mic->lambda); + //Color laserColor = WavelengthToColor(mic->lambda); float thickness = 3.0f; float sourceLen = 450.0f; float screenLen = 450.0f; float mirrorSize = 140.0f; + Vector2 startSource = {c.x - sourceLen, c.y}; + Vector2 posM2 = {c.x + mic->d2, c.y}; + Vector2 posM1 = {c.x, c.y - mic->d1}; + Vector2 endPointM2 = {c.x, c.y + screenLen}; + + float angleRad = -(mic->angleM1 * 2.0f) * (PI / 180.0f); + float yScreen = c.y + screenLen; + float vertDist = yScreen - posM1.y; + float xOff = vertDist * tanf(angleRad); + Vector2 endPointRetour = { posM1.x + xOff, yScreen }; + // Laser BeginBlendMode(BLEND_ADDITIVE); + /* // Source - Vector2 startSource = {c.x - sourceLen, c.y}; DrawLaserBeam(startSource, c, laserColor, thickness); // Miroir M2 (fixe) @@ -133,6 +159,24 @@ void DrawMichelsonSchema (Michelson *mic) { Vector2 endPointM2 = {c.x, c.y + screenLen}; DrawLaserBeam(c, endPointM2, Fade(laserColor, 0.5f), thickness); + */ + float alphaFactor = 1.0f / (float)(mic->lambdasCount > 0 ? mic->lambdasCount : 1); + if(alphaFactor < 0.3f) alphaFactor = 0.3f; // Min de visibilité + + for(int i=0; ilambdasCount; i++) { + Color laserColor = WavelengthToColor(mic->lambdas[i]); + laserColor = Fade(laserColor, alphaFactor); + // Source -> Centre + DrawLaserBeam(startSource, c, laserColor, thickness); + // Centre -> Miroir M2 (fixe) + DrawLaserBeam(c, posM2, laserColor, thickness); + // Centre -> Miroir M1 (mobile) + DrawLaserBeam(c, posM1, laserColor, thickness); + // Retour M1 -> Ecran + DrawLaserBeam(posM1, endPointRetour, Fade(laserColor, 0.6f), thickness); + // Retour M2 -> Ecran + DrawLaserBeam(c, endPointM2, Fade(laserColor, 0.5f), thickness); + } EndBlendMode(); // Source @@ -213,48 +257,124 @@ void DrawControlPanel(Michelson *mic) { // Longueur d'onde startY += 80; - DrawText(TextFormat("Longueur d'onde: %.0f nm", mic->lambda), startX, startY, 20, COLOR_TEXT_SEC); + DrawText("SPECTRE (Clic Droit: +/-)", startX, startY, 20, COLOR_TEXT_SEC); - float stepLambda = speedMode ? 10.0f : 1.0f; - - if (GuiButtonRepeat((Rectangle){startX, startY + 30, btnSize, 25}, "-", shouldRepeat)) mic->lambda -= stepLambda; - - Rectangle spectrumRect = {startX + btnSize + 5, startY + 30, spectrumWidth, 25}; + int spectrumHeight = 35; + Rectangle spectrumRect = {startX, startY + 25, contentWidth, spectrumHeight}; + // spectre for (int i = 0; i < spectrumRect.width; i++) { float prog = (float)i / spectrumRect.width; float l = 380.0f + prog * (780.0f - 380.0f); - Color c = WavelengthToColor(l); - DrawLine(spectrumRect.x + i, spectrumRect.y, spectrumRect.x + i, spectrumRect.y + spectrumRect.height, c); + DrawLine(spectrumRect.x + i, spectrumRect.y, spectrumRect.x + i, spectrumRect.y + spectrumRect.height, WavelengthToColor(l)); } - DrawRectangleLinesEx(spectrumRect, 1, DARKGRAY); + DrawRectangleLinesEx(spectrumRect, 1, GRAY); - if (CheckCollisionPointRec(GetMousePosition(), spectrumRect)) { + Vector2 mousePos = GetMousePosition(); + float stepLambda = speedMode ? 10.0f : 1.0f; + + if (CheckCollisionPointRec(mousePos, spectrumRect)) { + float mouseRatio = (mousePos.x - spectrumRect.x) / spectrumRect.width; + float mouseLambda = 380.0f + mouseRatio * (780.0f - 380.0f); if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) { - float mouseX = GetMouseX() - spectrumRect.x; - float ratio = mouseX / spectrumRect.width; - mic->lambda = 380.0f + ratio * (780.0f - 380.0f); + if (mic->selectedLambdaIndex >= 0 && mic->selectedLambdaIndex < mic->lambdasCount) { + mic->lambdas[mic->selectedLambdaIndex] = mouseLambda; + } + } + if (IsMouseButtonPressed(MOUSE_RIGHT_BUTTON)) { + int foundIdx = -1; + for(int i = 0; i < mic->lambdasCount; i++) { + if (fabs(mic->lambdas[i] - mouseLambda) < 15.0f) { + foundIdx = i; break; + } + } + if (foundIdx != -1) { + if (mic->lambdasCount > 1) { + for(int k=foundIdx; k < mic->lambdasCount - 1; k++) { + mic->lambdas[k] = mic->lambdas[k+1]; + } + mic->lambdasCount--; + mic->selectedLambdaIndex = 0; + } + } else { + if (mic->lambdasCount < MAX_WAVELENGTHS) { + mic->lambdas[mic->lambdasCount] = mouseLambda; + mic->selectedLambdaIndex = mic->lambdasCount; + mic->lambdasCount++; + } + } } } - float currentRatio = (mic->lambda - 380.0f) / (780.0f - 380.0f); - if (currentRatio < 0) currentRatio = 0; - if (currentRatio > 1) currentRatio = 1; - - float cursorX = spectrumRect.x + currentRatio * spectrumRect.width; - - DrawLine(cursorX - 1, spectrumRect.y, cursorX - 1, spectrumRect.y + spectrumRect.height, BLACK); - DrawLine(cursorX + 1, spectrumRect.y, cursorX + 1, spectrumRect.y + spectrumRect.height, BLACK); - DrawLine(cursorX, spectrumRect.y, cursorX, spectrumRect.y + spectrumRect.height, WHITE); + //curseur + for (int i = 0; i < mic->lambdasCount; i++) { + if (mic->lambdas[i] < 380) mic->lambdas[i] = 380; + if (mic->lambdas[i] > 780) mic->lambdas[i] = 780; - if (GuiButtonRepeat((Rectangle){startX + btnSize + spectrumWidth + 10, startY + 30, btnSize, 25}, "+", shouldRepeat)) mic->lambda += stepLambda; + float ratio = (mic->lambdas[i] - 380.0f) / (780.0f - 380.0f); + float lineX = spectrumRect.x + ratio * spectrumRect.width; + bool isSel = (i == mic->selectedLambdaIndex); + + Color lineCol = isSel ? WHITE : GRAY; + float thick = isSel ? 3.0f : 2.0f; + + DrawLineEx((Vector2){lineX, spectrumRect.y}, (Vector2){lineX, spectrumRect.y + spectrumRect.height}, thick, lineCol); + + if(isSel) DrawTriangle((Vector2){lineX-5, spectrumRect.y-6}, (Vector2){lineX+5, spectrumRect.y-6}, (Vector2){lineX, spectrumRect.y}, WHITE); + } + + // selction labmda + startY += spectrumHeight + 35; - if (mic->lambda < 380) mic->lambda = 380; - if (mic->lambda > 780) mic->lambda = 780; + if (mic->selectedLambdaIndex >= mic->lambdasCount) + mic->selectedLambdaIndex = 0; + + float* currentVal = &mic->lambdas[mic->selectedLambdaIndex]; + + if (GuiButtonRepeat((Rectangle){startX, startY, 40, 30}, "-", shouldRepeat)) + *currentVal -= stepLambda; + + DrawRectangle(startX + 45, startY, contentWidth - 90, 30, COLOR_PANEL); + DrawRectangleLines(startX + 45, startY, contentWidth - 90, 30, GRAY); + + Color activeCol = WavelengthToColor(*currentVal); + DrawRectangle(startX + 50, startY + 5, 20, 20, activeCol); + DrawText(TextFormat("%.1f nm", *currentVal), startX + 80, startY + 5, 20, WHITE); + + if (GuiButtonRepeat((Rectangle){startX + contentWidth - 40, startY, 40, 30}, "+", shouldRepeat)) + *currentVal += stepLambda; + + // lambda acrifs + startY += 45; + DrawText("Longueurs d'onde actives :", startX, startY, 20, GRAY); + startY += 25; + + int cols = 5; + int btnW = (contentWidth - (cols - 1) * 5) / cols; + int btnH = 30; + + for(int i = 0; i < mic->lambdasCount; i++) { + int r = i / cols; + int c = i % cols; + Rectangle rectBtn = {startX + c * (btnW + 5), startY + r * (btnH + 5), btnW, btnH}; + + bool isSel = (i == mic->selectedLambdaIndex); + Color cVal = WavelengthToColor(mic->lambdas[i]); + + if (GuiButton(rectBtn, TextFormat("%.0f", mic->lambdas[i]))) + mic->selectedLambdaIndex = i; + + if (isSel) + DrawRectangleLinesEx(rectBtn, 2, WHITE); + DrawRectangle(rectBtn.x + 2, rectBtn.y + 2, 5, rectBtn.height - 4, cVal); + } + + int rows = (mic->lambdasCount + cols - 1) / cols; + startY += (rows * (btnH + 5)) + 20; // Pos M1 - startY += 90; + startY += 0; DrawText(TextFormat("Position M1 : %.2f um", mic->d1), startX, startY, 20, ORANGE); // Pas des + et - @@ -316,8 +436,9 @@ void DrawControlPanel(Michelson *mic) { float delta = 2 * (mic->d1 - mic->d2); DrawText(TextFormat("Delta = %.2f um", delta), startX, startY + 35, 20, WHITE); - float p = (delta * 1000.0f) / mic->lambda; - DrawText(TextFormat("Ordre p = %.2f", p), startX, startY + 65, 20, WHITE); + float refLambda = mic->lambdas[mic->selectedLambdaIndex]; + float p = (delta * 1000.0f) / refLambda; + DrawText(TextFormat("Ordre p (sel) = %.2f", p), startX, startY + 65, 20, WHITE); // Bas int bottomY = GetScreenHeight() - 40; @@ -331,7 +452,7 @@ void DrawControlPanel(Michelson *mic) { int main () { SetConfigFlags(FLAG_MSAA_4X_HINT); InitWindow(1920, 1080, "Interferometre de Michelson"); - SetTargetFPS(144); + SetTargetFPS(10044); Shader shader = LoadShader(0, "michelson.frag"); @@ -339,7 +460,9 @@ int main () { mic.center = (Vector2){ UI_WIDTH + (1920 - UI_WIDTH) / 2.0f - 100, 1080 / 2.0f }; mic.d1 = 250.0f; mic.d2 = 250.0f; - mic.lambda = 550.0f; + mic.lambdas[0] = 550.0f; + mic.lambdasCount = 1; + mic.selectedLambdaIndex = 0; mic.angleM1 = 0.0f; mic.angleM1_Y = 0.0f; mic.nGaz = 1.0f; diff --git a/michelson b/michelson index 11f75cb0a9972d4cb8b9e37b13407e9187fa3681..796dee7fb0a0e6303cb133dfe1cd3f8ce1aaf4bb 100755 GIT binary patch delta 33773 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±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�sy z_3GWhc8)HKjvt6qwA?h{w!T-M);L_R>6SIp@vrH(cX7#}2x%vU*D_t4CUH|ux&J}H zBw}vDQBzbhR3;J6>00*UCk^TPQMYogWVcnjcTH1V)0c{USQZqf&-FA(MzyU8-sm#jULuHBPZ->Fn$J z(3X)iM6x8i?dv)_ThE=U=UxMxCbkDhieB%&Ht0IKJ@Rf<2Ys!GEJyN%XwB9n+ty43SalrkBRL-0}27E%#O zI(ue6mH87TW$LSxj8MsQg-dU<$>zeKd-$!2fL`Ngs{eLdSige(!uHnI=J*xn`e|0i zQpK(+TAL8NKBalnhT>$v&HM0dO8k2%b~Ri^u{0KmWxT% zv`&F{@sBd-y1P6S6I%nc$JuA%7bO0lt1Jsd+d# cos(i) ~ 1 - i^2/2 mais i ~ r/f et r^2 = x^2 + y^2 - float ringFactor = radiusSq * 0.065; + float ringFactorBase = radiusSq * 0.065; // Diff de marche du au coin d'air - float wDelta = (relX * angleM1 + relY * angleM1_Y) * 200.0f; + float wDelta = (relX * angleM1 + relY * angleM1_Y) * 200.0; - float currDelta = deltaLnm - ringFactor + wDelta; + float currDeltaBase = deltaLnm + wDelta; - // Formule de Fresnel : I = I_0 * cos^2(phi) - float K = PI / lambda; - float phase = currDelta * K; - float intensity = cos(phase); - intensity = intensity * intensity; + float currDelta = deltaLnm - ringFactorBase + wDelta; - vec3 finalVec = baseColorVec * intensity; + vec3 accumColor = vec3(0.0); - finalColor = vec4(finalVec, 1.0); + for(int i = 0; i < 10; i++) { + if (i >= lambdasCount) break; + float l = lambdas[i]; + vec3 baseColorVec = WavelengthToRGB(l); + float currDelta = currDeltaBase - ringFactorBase; + float K = PI / l; + float phase = currDelta * K; + float intensity = cos(phase); + intensity = intensity * intensity; + accumColor += baseColorVec * intensity; + } + + // finalColor = vec4(accumColor, 1.0); + +// float K = PI / lambda; +// float phase = currDelta * K; +// float intensity = cos(phase); +// intensity = intensity * intensity; + +// vec3 finalVec = baseColorVec * intensity; + + //finalColor = vec4(finalVec, 1.0); + finalColor = vec4(accumColor, 1.0); }