Skip to content

Commit

Permalink
Bonzo Network: Send FirstVisibleLine (not used right now), on a grabb…
Browse files Browse the repository at this point in the history
…er you can use F3 to follow or not the caret of the coder.

Now Bonzo will try to reconnect regularly if there is a deconnection (server closed ...)
  • Loading branch information
TheNuSan committed Mar 18, 2020
1 parent e2a4fd3 commit eaf30a0
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 66 deletions.
12 changes: 7 additions & 5 deletions src/Network.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,25 @@ namespace Network
std::string Code;
int CaretPosition;
int AnchorPosition;
int FirstVisibleLine;
bool NeedRecompile;
};

void LoadSettings(jsonxx::Object & o, NETWORK_SETTINGS* DialogSettings);
void CommandLine(int argc, const char *argv[], NETWORK_SETTINGS* DialogSettings);
void PrepareConnection();
void OpenConnection();
void BroadcastMessage(const char* msg);
void SendShader(float time, ShaderMessage NewMessage);
bool IsShaderNeedUpdate(float Time);
void SendShader(ShaderMessage NewMessage);
bool IsShaderNeedUpdate();
bool IsNetworkEnabled();
bool IsConnected();
bool IsGrabber();
bool IsLive(float time);
bool IsLive();
std::string GetNickName();
std::string GetModeString();
bool HasNewShader();
bool GetNewShader(float time, ShaderMessage& OutShader);
void Tick();
bool GetNewShader(ShaderMessage& OutShader);
void Tick(float time);
void Release();
}
43 changes: 33 additions & 10 deletions src/Network/Network_Mongoose.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,14 @@ namespace Network
bool NewShaderToGrab = false;
bool ShaderHasBeenCompiled = false;
jsonxx::Object LastGrabberShader;
float NetworkTime = 0.0;
float LastSendTime = 0.0f;
float LastShaderGrabTime = -1000.0f;
float ShaderUpdateInterval = 0.3f;

bool TryingToConnect = false;
float ReconnectionInterval = 1.0f;
float LastReconnectionAttempt = 0.0f;

enum NetMode {
NetMode_Sender,
Expand Down Expand Up @@ -43,6 +48,7 @@ namespace Network
if (status != 0) {
printf("-- Connection error: %d\n", status);
}
TryingToConnect = false;
break;
}
case MG_EV_WEBSOCKET_HANDSHAKE_DONE: {
Expand Down Expand Up @@ -75,6 +81,7 @@ namespace Network
if (s_is_connected) printf("-- Disconnected\n");
s_done = 1;
bNetworkLaunched = false;
ShaderHasBeenCompiled = false; // So we will try to recompile when connection is on again
break;
}
}
Expand Down Expand Up @@ -107,7 +114,7 @@ namespace Network
}
}

void OpenConnection()
void PrepareConnection()
{
if (!bNetworkEnabled) return;

Expand All @@ -124,6 +131,13 @@ namespace Network
Network_Break_URL(ServerURL, ServerName, RoomName, NickName);

mg_mgr_init(&mgr, NULL);
}

void OpenConnection()
{
if (!bNetworkEnabled) return;
LastReconnectionAttempt = NetworkTime;
TryingToConnect = true;

// ws://127.0.0.1:8000
printf("Try to connect to %s\n", ServerURL.c_str());
Expand All @@ -140,7 +154,7 @@ namespace Network
mg_send_websocket_frame(nc, WEBSOCKET_OP_TEXT, msg, strlen(msg)+1);
}

void SendShader(float time, ShaderMessage NewMessage) {
void SendShader(ShaderMessage NewMessage) {
if (!bNetworkLaunched) return;
if (NetworkMode != NetMode_Sender) return;

Expand All @@ -151,18 +165,19 @@ namespace Network
Data << "Compile" << NewMessage.NeedRecompile;
Data << "Caret" << NewMessage.CaretPosition;
Data << "Anchor" << NewMessage.AnchorPosition;
Data << "FirstVisibleLine" << NewMessage.FirstVisibleLine;

jsonxx::Object Message = Object("Data", Data);
std::string TextJson = Message.json();
//printf("JSON: %s\n", TextJson.c_str());
mg_send_websocket_frame(nc, WEBSOCKET_OP_TEXT, TextJson.c_str(), TextJson.length()+1);
LastSendTime = time;
LastSendTime = NetworkTime;
}

bool IsShaderNeedUpdate(float Time) {
bool IsShaderNeedUpdate() {
if (!bNetworkLaunched) return false;
if (NetworkMode != NetMode_Sender) return false;
return (Time - LastSendTime >= ShaderUpdateInterval);
return (NetworkTime - LastSendTime >= ShaderUpdateInterval);
}

void RecieveShader(size_t size, unsigned char *data) {
Expand All @@ -182,6 +197,7 @@ namespace Network
if (!Data.has<jsonxx::String>("Code")) ErrorFound = true;
if (!Data.has<jsonxx::Number>("Caret")) ErrorFound = true;
if (!Data.has<jsonxx::Number>("Anchor")) ErrorFound = true;
if (!Data.has<jsonxx::Number>("FirstVisibleLine")) ErrorFound = true;
if (!Data.has<jsonxx::Boolean>("Compile")) ErrorFound = true;
} else {
ErrorFound = true;
Expand Down Expand Up @@ -210,12 +226,12 @@ namespace Network
return NetworkMode == NetMode_Grabber;
}

bool IsLive(float time) {
bool IsLive() {
if(!bNetworkLaunched) return false;
if(NetworkMode == NetMode_Grabber) {
// if we got a shader less that 2s ago, we can say that there is someone sending
float MaxLiveStatusDuration = 2.0;
return (time-LastShaderGrabTime < MaxLiveStatusDuration);
return (NetworkTime-LastShaderGrabTime < MaxLiveStatusDuration);
}
return true;
}
Expand All @@ -233,27 +249,34 @@ namespace Network
return NewShaderToGrab;
}

bool GetNewShader(float time, ShaderMessage& OutShader) {
bool GetNewShader(ShaderMessage& OutShader) {
if (NetworkMode != NetMode_Grabber) return false;
NewShaderToGrab = false;
jsonxx::Object Data = LastGrabberShader.get<jsonxx::Object>("Data");
OutShader.Code = Data.get<jsonxx::String>("Code");
OutShader.CaretPosition = Data.get<jsonxx::Number>("Caret");
OutShader.AnchorPosition = Data.get<jsonxx::Number>("Anchor");
OutShader.FirstVisibleLine = Data.get<jsonxx::Number>("FirstVisibleLine");
bool NeedRecompile = Data.get<jsonxx::Boolean>("Compile");
// If we grab a shader for the first time, we will try to recompile it, in case it's a valid one
if(!ShaderHasBeenCompiled) {
NeedRecompile=true;
ShaderHasBeenCompiled=true;
}
OutShader.NeedRecompile = NeedRecompile;
LastShaderGrabTime = time;
LastShaderGrabTime = NetworkTime;
return true;
}

void Tick() {
void Tick(float time) {
NetworkTime = time;
if (!bNetworkEnabled) return;

if(!bNetworkLaunched && !TryingToConnect) {
if(time-LastReconnectionAttempt>=ReconnectionInterval) {
OpenConnection();
}
}
// TODO: should be in another thread?
mg_mgr_poll(&mgr, 10);
}
Expand Down
117 changes: 66 additions & 51 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ int main(int argc, const char *argv[])

Network::CommandLine(argc, argv, &netSettings);
Network::LoadSettings(options, &netSettings);
Network::PrepareConnection();
Network::OpenConnection();

std::string windowName = "";
Expand Down Expand Up @@ -446,7 +447,7 @@ int main(int argc, const char *argv[])

int nMargin = 20;

bool bTexPreviewVisible = true;
bool bTexPreviewVisible = false;

editorOptions.rect = Scintilla::PRectangle( nMargin, nMargin, settings.nWidth - nMargin - nTexPreviewWidth - nMargin, settings.nHeight - nMargin * 2 - nDebugOutputHeight );
ShaderEditor mShaderEditor( surface );
Expand All @@ -470,6 +471,7 @@ int main(int argc, const char *argv[])
static float fftDataIntegrated[FFT_SIZE];
memset(fftDataIntegrated, 0, sizeof(float) * FFT_SIZE);

bool bGrabberFollowCaret = true;
bool bShowGui = true;
Timer::Start();
float fNextTick = 0.1f;
Expand All @@ -483,24 +485,26 @@ int main(int argc, const char *argv[])
Renderer::StartFrame();

// Networking
Network::Tick();
Network::Tick(time);

if (Network::IsShaderNeedUpdate(time))
if (Network::IsShaderNeedUpdate())
{
mShaderEditor.GetText(szShader, 65535);
Network::ShaderMessage NewMessage;
NewMessage.Code = std::string(szShader);
NewMessage.NeedRecompile = false;
NewMessage.CaretPosition = mShaderEditor.WndProc(SCI_GETCURRENTPOS, 0, 0);
NewMessage.AnchorPosition = mShaderEditor.WndProc(SCI_GETANCHOR, 0, 0);
Network::SendShader(time, NewMessage);
}
Network::ShaderMessage NewMessage;
NewMessage.Code = std::string(szShader);
NewMessage.NeedRecompile = false;
NewMessage.CaretPosition = mShaderEditor.WndProc(SCI_GETCURRENTPOS, 0, 0);
NewMessage.AnchorPosition = mShaderEditor.WndProc(SCI_GETANCHOR, 0, 0);
int TopLine = mShaderEditor.WndProc(SCI_GETFIRSTVISIBLELINE, 0, 0);
NewMessage.FirstVisibleLine = mShaderEditor.WndProc(SCI_DOCLINEFROMVISIBLE, TopLine, 0);
Network::SendShader(NewMessage);
}

for(int i=0; i<Renderer::mouseEventBufferCount; i++)
{
if (bShowGui)
{
bool IsGrabber = Network::IsConnected() && Network::IsGrabber();
bool IsGrabber = Network::IsConnected() && Network::IsGrabber();
switch (Renderer::mouseEventBuffer[i].eventType)
{
case Renderer::MOUSEEVENTTYPE_MOVE:
Expand All @@ -513,53 +517,58 @@ int main(int argc, const char *argv[])
if(!IsGrabber) mShaderEditor.ButtonUp( Scintilla::Point( Renderer::mouseEventBuffer[i].x, Renderer::mouseEventBuffer[i].y ), time * 1000, false );
break;
case Renderer::MOUSEEVENTTYPE_SCROLL:
mShaderEditor.WndProc( SCI_LINESCROLL, (int)(-Renderer::mouseEventBuffer[i].x * fScrollXFactor), (int)(-Renderer::mouseEventBuffer[i].y * fScrollYFactor));
if(!IsGrabber || !bGrabberFollowCaret) mShaderEditor.WndProc( SCI_LINESCROLL, (int)(-Renderer::mouseEventBuffer[i].x * fScrollXFactor), (int)(-Renderer::mouseEventBuffer[i].y * fScrollYFactor));
break;
}
}
}
Renderer::mouseEventBufferCount = 0;

if (Network::HasNewShader()) {
Network::ShaderMessage NewMessage;
if(Network::GetNewShader(time, NewMessage)) {

int PreviousTopLine = mShaderEditor.WndProc(SCI_GETFIRSTVISIBLELINE, 0, 0);
int PreviousTopDocLine = mShaderEditor.WndProc(SCI_DOCLINEFROMVISIBLE, PreviousTopLine, 0);
//int PreviousTopLineWrapCount = mShaderEditor.WndProc(SCI_WRAPCOUNT, PreviousTopDocLine, 0) - 1;
//if(PreviousTopLineWrapCount < 0) PreviousTopLineWrapCount = 0;
//int PreviousTopLineTotal = PreviousTopDocLine + PreviousTopLineWrapCount;
int PreviousTopLineTotal = PreviousTopDocLine;

mShaderEditor.SetText(NewMessage.Code.c_str());
mShaderEditor.WndProc(SCI_SETCURRENTPOS, NewMessage.CaretPosition, 0);
mShaderEditor.WndProc(SCI_SETANCHOR, NewMessage.AnchorPosition, 0);
mShaderEditor.WndProc(SCI_SETFIRSTVISIBLELINE, PreviousTopLineTotal, 0);
Network::ShaderMessage NewMessage;
if(Network::GetNewShader(NewMessage)) {

int PreviousTopLine = mShaderEditor.WndProc(SCI_GETFIRSTVISIBLELINE, 0, 0);
int PreviousTopDocLine = mShaderEditor.WndProc(SCI_DOCLINEFROMVISIBLE, PreviousTopLine, 0);
//int PreviousTopLineWrapCount = mShaderEditor.WndProc(SCI_WRAPCOUNT, PreviousTopDocLine, 0) - 1;
//if(PreviousTopLineWrapCount < 0) PreviousTopLineWrapCount = 0;
//int PreviousTopLineTotal = PreviousTopDocLine + PreviousTopLineWrapCount;
int PreviousTopLineTotal = PreviousTopDocLine;

mShaderEditor.SetText(NewMessage.Code.c_str());
mShaderEditor.WndProc(SCI_SETCURRENTPOS, NewMessage.CaretPosition, 0);
mShaderEditor.WndProc(SCI_SETANCHOR, NewMessage.AnchorPosition, 0);
mShaderEditor.WndProc(SCI_SETFIRSTVISIBLELINE, PreviousTopLineTotal, 0);

if(bGrabberFollowCaret) {
//mShaderEditor.WndProc(SCI_SETFIRSTVISIBLELINE, NewMessage.FirstVisibleLine, 0);
mShaderEditor.WndProc(SCI_SCROLLCARET, 0, 0);
}

/*
const char* newCode = NewMessage.Code.c_str();
mShaderEditor.WndProc(SCI_SETTARGETSTART, 0, 0);
mShaderEditor.WndProc(SCI_SETTARGETEND, strlen(szShader), 0);
mShaderEditor.WndProc(SCI_REPLACETARGET, strlen(newCode), (sptr_t)newCode);
*/
//mShaderEditor.WndProc(SCI_SETCURRENTPOS, NewMessage.CaretPosition, 0);
//mShaderEditor.WndProc(SCI_SETANCHOR, NewMessage.AnchorPosition, 0);
/*
const char* newCode = NewMessage.Code.c_str();
mShaderEditor.WndProc(SCI_SETTARGETSTART, 0, 0);
mShaderEditor.WndProc(SCI_SETTARGETEND, strlen(szShader), 0);
mShaderEditor.WndProc(SCI_REPLACETARGET, strlen(newCode), (sptr_t)newCode);
*/
//mShaderEditor.WndProc(SCI_SETCURRENTPOS, NewMessage.CaretPosition, 0);
//mShaderEditor.WndProc(SCI_SETANCHOR, NewMessage.AnchorPosition, 0);


if(NewMessage.NeedRecompile) {
mShaderEditor.GetText(szShader, 65535);
if (Renderer::ReloadShader(szShader, (int)strlen(szShader), szError, 4096))
{
// Shader compilation successful; we set a flag to save if the frame render was successful
// (If there is a driver crash, don't save.)
newShader = true;
}
else
{
mDebugOutput.SetText(szError);
}
}
}
if(NewMessage.NeedRecompile) {
mShaderEditor.GetText(szShader, 65535);
if (Renderer::ReloadShader(szShader, (int)strlen(szShader), szError, 4096))
{
// Shader compilation successful; we set a flag to save if the frame render was successful
// (If there is a driver crash, don't save.)
newShader = true;
}
else
{
mDebugOutput.SetText(szError);
}
}
}
}

for(int i=0; i<Renderer::keyEventBufferCount; i++)
Expand All @@ -569,6 +578,10 @@ int main(int argc, const char *argv[])
bTexPreviewVisible = !bTexPreviewVisible;
needEditorUpdate = true;
}
else if (Renderer::keyEventBuffer[i].scanCode == 284) // F3
{
bGrabberFollowCaret = !bGrabberFollowCaret;
}
else if (Renderer::keyEventBuffer[i].scanCode == 286 || (Renderer::keyEventBuffer[i].ctrl && Renderer::keyEventBuffer[i].scanCode == 'r')) // F5
{
mShaderEditor.GetText(szShader,65535);
Expand All @@ -579,7 +592,9 @@ int main(int argc, const char *argv[])
NewMessage.NeedRecompile = true;
NewMessage.CaretPosition = mShaderEditor.WndProc(SCI_GETCURRENTPOS, 0, 0);
NewMessage.AnchorPosition = mShaderEditor.WndProc(SCI_GETANCHOR, 0, 0);
Network::SendShader(time, NewMessage);
int TopLine = mShaderEditor.WndProc(SCI_GETFIRSTVISIBLELINE, 0, 0);
NewMessage.FirstVisibleLine = mShaderEditor.WndProc(SCI_DOCLINEFROMVISIBLE, TopLine, 0);
Network::SendShader(NewMessage);
}

if (Renderer::ReloadShader( szShader, (int)strlen(szShader), szError, 4096 ))
Expand Down Expand Up @@ -728,7 +743,7 @@ int main(int argc, const char *argv[])

std::string Status = Network::GetNickName();
if(Network::IsConnected()) {
if(Network::IsLive(time)) {
if(Network::IsLive()) {
Status += " - Live";
} else {
Status += " - Offline";
Expand All @@ -746,7 +761,7 @@ int main(int argc, const char *argv[])
surface->RectangleDraw(Scintilla::PRectangle(RightPosition - WidthText - 10, BaseY, RightPosition + 25, BaseY+20), 0x00000000, 0x80000000);
surface->DrawTextNoClip(Scintilla::PRectangle(RightPosition - WidthText, BaseY, RightPosition, BaseY+20), *mShaderEditor.GetTextFont(), BaseY + 15, Status.c_str(), (int)Status.length(), 0x80FFFFFF, 0xA0FFFFFF);
surface->DrawTextNoClip(Scintilla::PRectangle(RightPosition - WidthText - WidthMode - 15, BaseY, RightPosition - WidthText, BaseY+20), *mShaderEditor.GetTextFont(), BaseY + 15, Mode.c_str(), (int)Mode.length(), 0x80FFFFFF, 0xA0FFFFFF);
surface->RectangleDraw(Scintilla::PRectangle(RightPosition + 6 , BaseY+1, RightPosition + 24, BaseY+19), 0x00000000, Network::IsLive(time) ? 0x8080FF80 : 0x80000000);
surface->RectangleDraw(Scintilla::PRectangle(RightPosition + 6 , BaseY+1, RightPosition + 24, BaseY+19), 0x00000000, Network::IsLive() ? 0x8080FF80 : 0x80000000);
}
}

Expand Down

0 comments on commit eaf30a0

Please sign in to comment.