FTE + WEB browsing = libCEF or Berkelium

Discuss CSQC related programming.
toneddu2000
Posts: 1395
Joined: Tue Feb 24, 2009 4:39 pm
Location: Italy

FTE + WEB browsing = libCEF or Berkelium

Post by toneddu2000 »

I noticed this post on gb's great blog (I always take a peek about Scout's Journey and all the study he makes about it, very interesting, I suggest everyone the lecture) and I said:"Wow!That would be cool..useless, but cool!" Then I tried some information and I noticed that fteqw added Berkelium support and then libCEF (Chromium Embedded Framework).
I tried first with libcef
  1. Downloaded cefplugin here, which *should* contains everything (plugin and DLLS). Infact it's 35MB(!!)download
    Image
  2. Enabled plugin via the COOOL interface Spike invented for FTE
  3. Downloaded latest fteqw debug version for win32 and type

    Code: Select all

    playfilm http://google.com
  4. fteqw crashes with this dump

    Code: Select all

    Build: Debug Win GL: FTE SVN 5133
    
    cef_string_multimap_key+0xa59b (C:\game\fte\ftecef\libcef.DLL)
    
    cef_time_to_timet   +0x7f1 (C:\game\fte\ftecef\libcef.DLL)
    
    TerminateProcessWithoutDump+0x92d476 (C:\game\fte\ftecef\libcef.DLL)
    
    TerminateProcessWithoutDump+0x92d6d2 (C:\game\fte\ftecef\libcef.DLL)
    
    cef_string_list_value+0x7019 (C:\game\fte\ftecef\libcef.DLL)
    
    cef_string_list_value+0x6c34 (C:\game\fte\ftecef\libcef.DLL)
    
    cef_initialize      +0x7e (C:\game\fte\ftecef\libcef.DLL)
    
    0x6BBC4D26 (C:\game\fte\ftecef\fteplug_cef_x86.dll)
    
    0x0304B2A0 ()
    
    0x0304B2E8 ()
    
  5. Same story if I use the gecko_ builtin functions

    Code: Select all

    void Gecko_Init()
    {[code]
    gckSuccess = gecko_create("foogecko");
    if(!gckSuccess){
    error("No gecko initialized.");
    }
    }
    [/code]
    And then launch Gecko_Init() either in CSQC_Init or bind it to a input key, it crashes with same dump of above
Then I tried berkelium
  1. Downloaded berkelium lib from here
  2. Downloaded berkelium fte plugin from here
  3. This time fte DOESN't recognise the plugin
  4. Typing

    Code: Select all

    playfilm berkelium:http://google.com
    doens't do anything
As far as I remember, Spike told me once that libCEF was cool because it could be used for UI too, so..
Is it still an usable feature or is it deprecated?

Thanks in advance for any suggestion
Meadow Fun!! - my first commercial game, made with FTEQW game engine
Spike
Posts: 2914
Joined: Fri Nov 05, 2004 3:12 am
Location: UK
Contact:

Re: FTE + WEB browsing = libCEF or Berkelium

Post by Spike »

ignore berkelium. its unmaintained, you don't want that security risk.
(you may need to use the plug_load command to explicitly load it. if nothing else it should say if there were missing libraries or not).

try http://triptohell.info/moodles/win32/de ... ef_x86.dll

I ought to try updating libcef but iiuc they only 'fixed' offscreen rendering by disabling all gpu stuff like webgl, so what's the point with new builds? security? hah, yeah, right...
getting cef compiling isn't straight forward, the build system doesn't really understand it, so I've not even bothered trying to automate that stuff.
it'll probably suck for UIs on account of lag and jerks due to no vsync etc. so its useless on the internet because of the security risk, and useless off the internet because it'll feel worse than the equivalent ui made in csqc (and is a pain to get the two talking, too). hence why maintaining/fixing cef isn't one of my highest priorities.
</rant>
toneddu2000
Posts: 1395
Joined: Tue Feb 24, 2009 4:39 pm
Location: Italy

Re: FTE + WEB browsing = libCEF or Berkelium

Post by toneddu2000 »

nope. After loading the plugin you posted (via plug_load, otherwise it won't loaded automatically) it says:

Code: Select all

libcef 3.1397: chrome 49.0 (2623)
libcef outdated. Please install libcef version 3.2526.1373.gb660893
Then I downloaded latest lib(3.3112.1658.g3d5ae83) from here but it keeps saying that message. Unfortunately the lib version 3.2526.1373.gb660893 is not more downloadable online

But, I agree with you, it's kinda pointless put effort on things that would be ditched anyway for security reasons, it's just that, once I tried a technology, I want to make it work, it's like an obsession! :twisted:
Meadow Fun!! - my first commercial game, made with FTEQW game engine
Spike
Posts: 2914
Joined: Fri Nov 05, 2004 3:12 am
Location: UK
Contact:

Re: FTE + WEB browsing = libCEF or Berkelium

Post by Spike »

http://triptohell.info/moodles/win32/ft ... 2.1658.zip
I updated my code to work with the latest version of libcef.
It *should* work... it might also blow up. such is life.

Extract to your quake dir.
You can use the menu_downloads thing to enable the plugin (there should also be a prompt to load it up if you've not acknowledged it yet or something. 'c' means that its present but not enabled. you want it checked).
You can then use the 'cef' command to load up a new browser window thing.

Or you can create a shader with a "videomap http://foo" term and then put it on walls. You can use the gecko qc extension if you want to send input/commands to a videomap shader controlled by csqc/menuqc (a location prefixed with 'cmd:' allows you to focus,unfocus, refresh, stop, back, forward, undo, redo, cut, copy, paste, del, selectall, or you can javascript:alert("zomg");, raw:<RAW HTML TEXT> also works, if you want to force it to show a custom page from qc, or http[s]://foo will of course just change the page's current site).
If you're showing it as a 2d page, you'll probably want to gecko_resize your browser to give it a 1:1 physical:virtual ratio so that there's no bluring/scaling (or just set vid_conautoscale 1).
I did create an 'fte' scheme, so fte://data/* reads files from quake's filesystem, fte://ssqc/* fte://csqc/* fte://menu/* will invoke the Cef_GeneratePage qc function to generate page requests (make requests to your qc if you feel like doing so, maybe in conjunction with uri_unescape).
You should also be able to call window.fte_query("getstats", function(req,ret){alert(ret);}); and get a list of stats. getseats, getserverinfo, getplayers should also work. note the delay.
I didn't bother testing most of this stuff so probably half of it is broken. Enjoy.
toneddu2000
Posts: 1395
Joined: Tue Feb 24, 2009 4:39 pm
Location: Italy

Re: FTE + WEB browsing = libCEF or Berkelium

Post by toneddu2000 »

Thanks a lot Spike, it worked! I'm so sorry you had to ruin your Sunday for this, but I really appreciate it! :biggrin:
It works with videomap, it works with playfilm command, unfortunately it doesn't work the gecko_create+gecko_navigate+drawpic stuff

This is what I did

Code: Select all

const 	string GECKO_SHD = "gckgoshd";
const	string	GECKO_URL = "https://www.google.com";
float	gckSuccess;
void Gecko_Init()
{
	gckSuccess = gecko_create(GECKO_SHD);
	if(!gckSuccess){
		error("No gecko initialized.");
	}
}

void Gecko_Draw()
{
	if(gckSuccess){
		drawpic([0,0,0],GECKO_SHD,[256,256,0],[1,1,1],1,1);
		gecko_navigate(GECKO_SHD,GECKO_URL);
	}
}

void CSQC_Init(float apilevel, string enginename, float engineversion)
{
	Gecko_Init();
}

void CSQC_UpdateView(float vwidth, float vheight, float notmenu)
{
	clearscene();
	setviewprop(VF_DRAWWORLD, TRUE);
	setviewprop(VF_ORIGIN,[-300,0,0]);
	setviewprop(VF_ANGLES,input_angles);
	addentities(MASK_ENGINE);
	renderscene();
	Gecko_Draw();
}
But the browser is not displayed on screen (screen portion is occupied by drawpic call but only color is drawn)

I'll test again in next days but, right now, a huge thanks to Spike for this very interesting feature!
Meadow Fun!! - my first commercial game, made with FTEQW game engine
Spike
Posts: 2914
Joined: Fri Nov 05, 2004 3:12 am
Location: UK
Contact:

Re: FTE + WEB browsing = libCEF or Berkelium

Post by Spike »

gecko_navigate(GECKO_SHD,GECKO_URL);

you're doing that every single frame... equivelent to hitting refresh every single frame... so yeah, you get white (default background colour) because its too busy re-requesting the page.
call it just once, straight after gecko_create, or read the next paragraph.

gecko_create optionally takes two args. the second being the initial url (which won't change anything if the shader already exists).
basically it just registers a shader with a videomap line - gecko_create is actually just the same builtin as cin_open... webbrowsers, cinematics, the x11server plugin all implement the same internal video-decoding API, just that browsers provide input functions while media decoding provides stuff to seek.
toneddu2000
Posts: 1395
Joined: Tue Feb 24, 2009 4:39 pm
Location: Italy

Re: FTE + WEB browsing = libCEF or Berkelium

Post by toneddu2000 »

Thanks Spike, I forgot to say that yesterday that I tried to put gecko_navigate() in CSQC_Init() and CSQC_UpdateView(), but without success in both cases.
I managed to make it work but there's a misunderstanding in defs file (generated with pr_dumpplatform command)

Code: Select all

float(string name) gecko_create = #487; /* Part of DP_GECKO_SUPPORT
		Create a new 'browser tab' shader with the specified name that can then be drawn via drawpic (shader should not already exist - including from map/model textures or disk).
It's incorrect. Shader MUST exist in your scripts folder and shader should be like this

Code: Select all

webpage2d
{
	//remember inner curly braces or videmap will not be initialized!
	{
		videomap https://google.com
	}
}
Then, you can use gecko_navigate(), for example triggered by input, to change url

Code: Select all

float CSQC_InputEvent(float evtype, float scanx, float chary, float devid)
{
	switch(evtype){
		case IE_KEYUP:
		if (scanx == K_MOUSE2){
			gecko_navigate(GECKO_SHD,"http://www.blender.org");
		}
		break;
	}
	return 0;
}
Spike wrote:gecko_create optionally takes two args. the second being the initial url (which won't change anything if the shader already exists).
fteqcc gives me warning that gecko_create() takes only 1 argument and I downloaded latest version of fteqccgui (2017-08-10). Probably should i put second argument directly in shader name, followed by : ?
Meadow Fun!! - my first commercial game, made with FTEQW game engine
toneddu2000
Posts: 1395
Joined: Tue Feb 24, 2009 4:39 pm
Location: Italy

Re: FTE + WEB browsing = libCEF or Berkelium

Post by toneddu2000 »

Ok, now I'm trying to click on the webpage displayed via drawpic.
I put this in CSQC_InputEvent()

Code: Select all

switch(evtype){
		case IE_KEYUP:
		if (scanx == K_MOUSE1){
			cefKey = gecko_keyevent(GECKO_SHD,scanx,evtype);
		}
		if (scanx == K_MOUSE2){
			setcursormode(TRUE,"textures/cef/cursor.tga");
			gecko_navigate(GECKO_SHD,"cmd:focus");
		}
		break;
		case IE_MOUSEABS:
			inputCursorOrg_x = scanx;
			inputCursorOrg_y = chary;
			//gecko_mousemove accepts only values between 0 and 1 so cursor coords must be normalized
			cefCursorOrg = normalize(inputCursorOrg);
			//avoid -coords
			if(cefCursorOrg_x < 0){
				cefCursorOrg_x = 0;
			}
			if(cefCursorOrg_y < 0){
				cefCursorOrg_y = 0;
			}
			
		return TRUE;
	}
gecko_mousemove () needs 0-1 values range so I had to normalize input coords and infact it works, but mouse coords don't correspond to webpage coords.
I used as webpage this js demo that displays an eye following mouse coords. When I move the mouse, it only shows right and bottom directions. It's impossible to center the eye or go up or left.
This is Gecko_Draw()

Code: Select all

void Gecko_Draw(float w,float h)
{
	if(gckSuccess){
		gecko_resize(GECKO_SHD,w,h);
		gecko_mousemove(GECKO_SHD, cefCursorOrg_x, cefCursorOrg_y);
		cefProp = gecko_getproperty(GECKO_SHD,"title");
		cefKey = gecko_keyevent(GECKO_SHD,0,0);
		cefSize = gecko_get_texture_extent(GECKO_SHD);
		drawpic([0,0,0],GECKO_SHD,[w,h,0],[0,0,0],1,0);
		drawstring([15,15,0],vtos(cefCursorOrg),[10,10,0],[1,0,0],1,0);
		drawstring([15,35,0],cefProp,[10,10,0],[1,0,0],1,0);
		drawstring([15,55,0],ftos(cefKey),[10,10,0],[1,0,0],1,0);
		drawstring([15,75,0],vtos(cefSize),[10,10,0],[1,0,0],1,0);
	}
}
The drawstring() call prints cefKey but it shows a iterative counter like -0.0000000000000000000000000001246 which reaches 0 every 2 secs or whatever and it's not even related to click event.

I tried also

Code: Select all

case IE_KEYUP:
		if (scanx == K_MOUSE1){
			cefKey = gecko_keyevent(GECKO_SHD,K_MOUSE1,IE_KEYUP);
		}
But with no success.
No I don't understand how to link mouse click event in fte to something web-related. For example click->get div id or click->click that button
Should i use something like

Code: Select all

traceline(project([inputCursorOrg_x ,inputCursorOrg_y,0]),project([inputCursorOrg_x ,inputCursorOrg_y,10000]),0,player);
string texname = getsurfacetexture(trace_ent, getsurfacenearpoint(trace_ent, trace_endpos));
but I already now the shader name (because it's drawn via drawpic())!

I noticed that gecko_resize() does the resize of the web page but it didn't set proportions correctly. Only vid_conautoscale did the trick but, honestly I don't like this solution because for some game I'd like to set it to 0, eventually..
Spike wrote:I did create an 'fte' scheme, so fte://data/* reads files from quake's filesystem
Well, I tried to put a index.html file in my gamedata folder but when I try to load it with

Code: Select all

gecko_navigate(GECKO_SHD,"fte://data/example.html");
it says "File not found within game filesystem". My data folder name is "data", but would it work for different games except Quake?
Spike wrote: fte://ssqc/* fte://csqc/* fte://menu/* will invoke the Cef_GeneratePage qc function to generate page requests (make requests to your qc if you feel like doing so, maybe in conjunction with uri_unescape).
These ones I didn't even understand what they do..

****EDIT****
I noticed that showing webpages via playfilm in the console, will make click function enabled by default and it's possible to click on web links and scroll without doing anything!
Meadow Fun!! - my first commercial game, made with FTEQW game engine
Spike
Posts: 2914
Joined: Fri Nov 05, 2004 3:12 am
Location: UK
Contact:

Re: FTE + WEB browsing = libCEF or Berkelium

Post by Spike »

normalised texture coords isn't the same as a normalised/unit vector.
really it just means you want:
//simplied IE_MOUSEABS
inputCursorOrg = [scanx, chary];

//drawing
void Gecko_Draw(vector gpos, vector gsize)
{
vector psize = (vector)getviewprop(VF_SCREENPSIZE); //query the current physical screen size
vector vsize = (vector)getviewprop(VF_SCREENVSIZE); //query the current virtual screen size
gecko_resize(GECKO_SHD, gsize_x * psize_x / vsize_x, gsize_y * psize_y / vsize_y); //tell the media decoder the actual size in pixels (or rather, texels) instead of virtual sizes (those come from the size arg of drawpic).
gecko_mousemove(GECKO_SHD, (inputCursorOrg_x-gpos_x)/gsize_x, (inputCursorOrg_y-gpos_y)/gsize_y); //report the mouse coords in terms of 0-1, instead of pixels or anything.
drawpic(gpos, GECKO_SHD, gsize, [1,1,1],1, 0); //draw the shader.
};


gecko_keyevent's return value isn't useful. don't bother with it (apparently fte doesn't even set it. hurrah for undefined values).

tracelines/getsurfacetexture only apply when it comes to shaders that are drawn on walls. note that mouse coords using 0-1 makes that part slightly simpler...

fte://data/index.html opens eg: id1/data/index.html
fte://somethingelse/whatever is not accepted. sandboxing or something.

Cef_GeneratePage allows you to dynamically generate html/whatever directly from QC. Useful for menus like showing available maps or other dynamic content.

Use the cef console command if you want a simple web browser. You get a url bar etc that way.
toneddu2000
Posts: 1395
Joined: Tue Feb 24, 2009 4:39 pm
Location: Italy

Re: FTE + WEB browsing = libCEF or Berkelium

Post by toneddu2000 »

Spike wrote: normalised texture coords isn't the same as a normalised/unit vector.
really it just means you want:
//simplied IE_MOUSEABS
inputCursorOrg = [scanx, chary];

//drawing
void Gecko_Draw(vector gpos, vector gsize)
{
vector psize = (vector)getviewprop(VF_SCREENPSIZE); //query the current physical screen size
vector vsize = (vector)getviewprop(VF_SCREENVSIZE); //query the current virtual screen size
gecko_resize(GECKO_SHD, gsize_x * psize_x / vsize_x, gsize_y * psize_y / vsize_y); //tell the media decoder the actual size in pixels (or rather, texels) instead of virtual sizes (those come from the size arg of drawpic).
gecko_mousemove(GECKO_SHD, (inputCursorOrg_x-gpos_x)/gsize_x, (inputCursorOrg_y-gpos_y)/gsize_y); //report the mouse coords in terms of 0-1, instead of pixels or anything.
drawpic(gpos, GECKO_SHD, gsize, [1,1,1],1, 0); //draw the shader.
};
Thanks a lot Spike, it worked. I always forget the physical screen vs virtual screen debate!
Spike wrote: fte://data/index.html opens eg: id1/data/index.html
fte://somethingelse/whatever is not accepted. sandboxing or something.
Yeah that worked too, thanks. I thought that data was gamedata folder. I forget that data in fteqw is the subdata folder for everything custom(fopen,fwrite,etc.)
For everyone:correct path is yourdatafolder(id1,data,gamedata,whatever you put in default.fmf)/data (the cool thing is that subfolder is permitted, so you can do something like yourdatafolder/data/web)
Spike wrote:Cef_GeneratePage allows you to dynamically generate html/whatever directly from QC. Useful for menus like showing available maps or other dynamic content.
What the..eh..do you mean I can list all the servers in a shiny new web page? WhooHoo! Let's do it! There's some kind of documentation for Cef_GeneratePage() (probably looking at engine code)?
Spike wrote:Use the cef console command if you want a simple web browser. You get a url bar etc that way.
Wow! For everyone: cef + Enter -> fteqw main page. cef + http://blah.com goes to blah.com. Supercool!
Spike wrote:gecko_keyevent's return value isn't useful. don't bother with it (apparently fte doesn't even set it. hurrah for undefined values).
Whaat? So there's no way to click on a link posted on a browser shader applied to a mesh? And there's no way to retrieve informations from webpage too? For example: click on a link -> graphics appears and after 2 secs returns a value (maybe a doorOpen = TRUE). Can I read that value back to FTE? Please Spike, help me complete the last piece of the puzzle! :biggrin:
If you help me doing this last step, I promise I'll release a demo (I've already some ideas..)
Meadow Fun!! - my first commercial game, made with FTEQW game engine
Spike
Posts: 2914
Joined: Fri Nov 05, 2004 3:12 am
Location: UK
Contact:

Re: FTE + WEB browsing = libCEF or Berkelium

Post by Spike »

toneddu2000 wrote:
Spike wrote:gecko_keyevent's return value isn't useful. don't bother with it (apparently fte doesn't even set it. hurrah for undefined values).
Whaat? So there's no way to click on a link posted on a browser shader applied to a mesh? And there's no way to retrieve informations from webpage too? For example: click on a link -> graphics appears and after 2 secs returns a value (maybe a doorOpen = TRUE). Can I read that value back to FTE? Please Spike, help me complete the last piece of the puzzle! :biggrin:
If you help me doing this last step, I promise I'll release a demo (I've already some ideas..)
The browser actually runs inside another system process. Many of the requests you make are thus asynchronous, and thus there's no real return values other than whether it looked valid at the time. This has a few undesirable side effects like no proper vsync and delays between making requests and getting responses, but they don't affect the QC itself.

Cef stuff is running in a browser. This means that you can make XMLHttpRequest requests from javascript.
This means that you can set up your javascript to make a request to fte://csqc/dosomething?arg=value and then read whatever the QC generated as a result of that. You can generate such requests inside onclick events or whatever. failing that you could make an iframe that shows html generated by your QC for your serverlist (do note that you'll need to refresh it occasionally, somehow).
toneddu2000
Posts: 1395
Joined: Tue Feb 24, 2009 4:39 pm
Location: Italy

Re: FTE + WEB browsing = libCEF or Berkelium

Post by toneddu2000 »

Thanks Spike for all the support
Spike wrote: The browser actually runs inside another system process. Many of the requests you make are thus asynchronous, and thus there's no real return values other than whether it looked valid at the time. This has a few undesirable side effects like no proper vsync and delays between making requests and getting responses, but they don't affect the QC itself.
Yeah, I imagined that asynchronous calls were involved
Spike wrote: Cef stuff is running in a browser. This means that you can make XMLHttpRequest requests from javascript.
This means that you can set up your javascript to make a request to fte://csqc/dosomething?arg=value and then read whatever the QC generated as a result of that. You can generate such requests inside onclick events or whatever. failing that you could make an iframe that shows html generated by your QC for your serverlist (do note that you'll need to refresh it occasionally, somehow).
Ok, so, when you do in console cef http://google.com, engine is completely ignored and cef takes control? So, when you click in google search bar and it takes focus it's cef that handles the click, not fte?

In that case I need to create a request from fte to javascript and somehow read it back in fte... well, I guess I'm skilled enough at least to try
Did you make by yourself an example request with fte://csqc stuff that I could stole(to just not reinvent the wheel)?
Meadow Fun!! - my first commercial game, made with FTEQW game engine
toneddu2000
Posts: 1395
Joined: Tue Feb 24, 2009 4:39 pm
Location: Italy

Re: FTE + WEB browsing = libCEF or Berkelium

Post by toneddu2000 »

Just a little question: when you say

Code: Select all

fte://csqc/dosomething?arg=value
You mean that in csqc there's a function called dosomething that has an argument which is value?
Because, usually, when I do XMLHttpRequest, I use json or xml file that I point with open command like so

Code: Select all

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
	//xml is read
	if (this.readyState == 4 && this.status == 200) {
		document.getElementById("placeholder").innerHTML = "OK";
	}
	//this in case xml is not read
	else{
		document.getElementById("placeholder").innerHTML = "Nope";
	}
};
//establish connection with asynchronous call
xhttp.open("GET", "myxmlfile.xml", true);
//send
xhttp.send();
Meadow Fun!! - my first commercial game, made with FTEQW game engine
toneddu2000
Posts: 1395
Joined: Tue Feb 24, 2009 4:39 pm
Location: Italy

Re: FTE + WEB browsing = libCEF or Berkelium

Post by toneddu2000 »

Plus, Spike, you should add in the engine this line to cef loading (if it works..)

Code: Select all

--allow-file-access-from-files
As mentioned here, otherwise Chromium will block cross origin requests even if they are on the same local drive (It's impossible to ask developers to put their UI files on a web server, plus players with no internet connection couldn't see it :shock: ).

##EDIT##
*Probably* this could help
Meadow Fun!! - my first commercial game, made with FTEQW game engine
toneddu2000
Posts: 1395
Joined: Tue Feb 24, 2009 4:39 pm
Location: Italy

Re: FTE + WEB browsing = libCEF or Berkelium

Post by toneddu2000 »

Ok, little step forward. For those who want to know how to do this:
Spike wrote: I did create an 'fte' scheme, so fte://data/* reads files from quake's filesystem, fte://ssqc/* fte://csqc/* fte://menu/* will invoke the Cef_GeneratePage qc function to generate page requests (make requests to your qc if you feel like doing so, maybe in conjunction with uri_unescape).
You should also be able to call window.fte_query("getstats", function(req,ret){alert(ret);}); and get a list of stats. getseats, getserverinfo, getplayers should also work. note the delay.
In your csqc project add a Cef_GeneratePage() function like this:

Code: Select all

string Cef_GeneratePage()
{
	local string htmlheader = "<html><head><title>CSQC startpoint</title></head>";
	local string htmlbodyopen = "<body>";
	local string htmlbodyclose = "</body></html>";
	local string htmlmsg = strcat("Player health: <span style='font-size:12pt;color:red;font-weight:bold;'>",ftos(player.health),"</span>");
	
	return strcat(htmlheader,htmlbodyopen,htmlmsg,htmlbodyclose);
}
Then you can access it through
  1. commandline via cef fte://csqc/index.html or just cef fte://csqc and then click in the browser window on the sign "Or try here"
  2. via shader will make FTE crash, so try by yourself but on my pc it's a no-go
  3. via gecko_navigate() call like gecko_navigate(yourshadername,"fte://csqc/index.html");
The cool thing is that you can use CSS to decorate your page!

Yay for reading engine code! :biggrin:
Meadow Fun!! - my first commercial game, made with FTEQW game engine
Post Reply